Give – Donation Plugin and Fundraising Platform - Version 2.9.7

Version Description

Download this release

Release Info

Developer jason_the_adams
Plugin Icon 128x128 Give – Donation Plugin and Fundraising Platform
Version 2.9.7
Comparing to
See all releases

Code changes from version 2.9.6 to 2.9.7

Files changed (97) hide show
  1. give.php +2 -2
  2. includes/forms/template.php +22 -21
  3. languages/give.pot +97 -101
  4. readme.txt +7 -1
  5. src/MultiFormGoals/MultiFormGoal/Shortcode.php +4 -6
  6. src/Onboarding/Setup/PageView.php +1 -1
  7. src/Onboarding/Setup/templates/index.html.php +2 -0
  8. src/PaymentGateways/PayPalCommerce/PayPalCommerce.php +1 -1
  9. src/PaymentGateways/PayPalStandard/PayPalStandard.php +1 -1
  10. vendor/autoload.php +1 -1
  11. vendor/composer/ClassLoader.php +32 -0
  12. vendor/composer/InstalledVersions.php +122 -34
  13. vendor/composer/autoload_psr4.php +1 -0
  14. vendor/composer/autoload_real.php +5 -5
  15. vendor/composer/autoload_static.php +12 -4
  16. vendor/composer/installed.json +74 -11
  17. vendor/composer/installed.php +32 -9
  18. vendor/fakerphp/faker/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  19. vendor/fakerphp/faker/.github/workflows/continuous-integration.yml +144 -0
  20. vendor/fakerphp/faker/LICENSE +22 -0
  21. vendor/fakerphp/faker/src/Faker/Calculator/Ean.php +55 -0
  22. vendor/fakerphp/faker/src/Faker/Calculator/Iban.php +73 -0
  23. vendor/fakerphp/faker/src/Faker/Calculator/Inn.php +34 -0
  24. vendor/fakerphp/faker/src/Faker/Calculator/Luhn.php +75 -0
  25. vendor/fakerphp/faker/src/Faker/Calculator/TCNo.php +52 -0
  26. vendor/fakerphp/faker/src/Faker/DefaultGenerator.php +38 -0
  27. vendor/fakerphp/faker/src/Faker/Documentor.php +66 -0
  28. vendor/fakerphp/faker/src/Faker/Factory.php +61 -0
  29. vendor/fakerphp/faker/src/Faker/Generator.php +297 -0
  30. vendor/fakerphp/faker/src/Faker/Guesser/Name.php +156 -0
  31. vendor/fakerphp/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php +71 -0
  32. vendor/fakerphp/faker/src/Faker/ORM/CakePHP/EntityPopulator.php +166 -0
  33. vendor/fakerphp/faker/src/Faker/ORM/CakePHP/Populator.php +109 -0
  34. vendor/fakerphp/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php +81 -0
  35. vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php +251 -0
  36. vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php +110 -0
  37. vendor/fakerphp/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php +49 -0
  38. vendor/fakerphp/faker/src/Faker/ORM/Mandango/EntityPopulator.php +122 -0
  39. vendor/fakerphp/faker/src/Faker/ORM/Mandango/Populator.php +65 -0
  40. vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php +107 -0
  41. vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php +191 -0
  42. vendor/fakerphp/faker/src/Faker/ORM/Propel/Populator.php +89 -0
  43. vendor/fakerphp/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php +107 -0
  44. vendor/fakerphp/faker/src/Faker/ORM/Propel2/EntityPopulator.php +192 -0
  45. vendor/fakerphp/faker/src/Faker/ORM/Propel2/Populator.php +92 -0
  46. vendor/fakerphp/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php +77 -0
  47. vendor/fakerphp/faker/src/Faker/ORM/Spot/EntityPopulator.php +219 -0
  48. vendor/fakerphp/faker/src/Faker/ORM/Spot/Populator.php +88 -0
  49. vendor/fakerphp/faker/src/Faker/Provider/Address.php +139 -0
  50. vendor/fakerphp/faker/src/Faker/Provider/Barcode.php +114 -0
  51. vendor/fakerphp/faker/src/Faker/Provider/Base.php +612 -0
  52. vendor/fakerphp/faker/src/Faker/Provider/Biased.php +64 -0
  53. vendor/fakerphp/faker/src/Faker/Provider/Color.php +143 -0
  54. vendor/fakerphp/faker/src/Faker/Provider/Company.php +50 -0
  55. vendor/fakerphp/faker/src/Faker/Provider/DateTime.php +340 -0
  56. vendor/fakerphp/faker/src/Faker/Provider/File.php +606 -0
  57. vendor/fakerphp/faker/src/Faker/Provider/HtmlLorem.php +276 -0
  58. vendor/fakerphp/faker/src/Faker/Provider/Image.php +105 -0
  59. vendor/fakerphp/faker/src/Faker/Provider/Internet.php +362 -0
  60. vendor/fakerphp/faker/src/Faker/Provider/Lorem.php +203 -0
  61. vendor/fakerphp/faker/src/Faker/Provider/Miscellaneous.php +323 -0
  62. vendor/fakerphp/faker/src/Faker/Provider/Payment.php +286 -0
  63. vendor/fakerphp/faker/src/Faker/Provider/Person.php +126 -0
  64. vendor/fakerphp/faker/src/Faker/Provider/PhoneNumber.php +43 -0
  65. vendor/fakerphp/faker/src/Faker/Provider/Text.php +141 -0
  66. vendor/fakerphp/faker/src/Faker/Provider/UserAgent.php +165 -0
  67. vendor/fakerphp/faker/src/Faker/Provider/Uuid.php +58 -0
  68. vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Address.php +152 -0
  69. vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Company.php +63 -0
  70. vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Internet.php +55 -0
  71. vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Person.php +108 -0
  72. vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Text.php +271 -0
  73. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Address.php +146 -0
  74. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Color.php +81 -0
  75. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Company.php +74 -0
  76. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Internet.php +55 -0
  77. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Payment.php +19 -0
  78. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Person.php +118 -0
  79. vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Text.php +271 -0
  80. vendor/fakerphp/faker/src/Faker/Provider/at_AT/Payment.php +44 -0
  81. vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Internet.php +9 -0
  82. vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Payment.php +43 -0
  83. vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Person.php +114 -0
  84. vendor/fakerphp/faker/src/Faker/Provider/bg_BG/PhoneNumber.php +20 -0
  85. vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Address.php +310 -0
  86. vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Company.php +28 -0
  87. vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Person.php +36 -0
  88. vendor/fakerphp/faker/src/Faker/Provider/bn_BD/PhoneNumber.php +14 -0
  89. vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Utils.php +14 -0
  90. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Address.php +149 -0
  91. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Company.php +120 -0
  92. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/DateTime.php +61 -0
  93. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Internet.php +9 -0
  94. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Payment.php +19 -0
  95. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Person.php +533 -0
  96. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php +14 -0
  97. vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Text.php +2374 -0
give.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: The most robust, flexible, and intuitive way to accept donations on WordPress.
6
  * Author: GiveWP
7
  * Author URI: https://givewp.com/
8
- * Version: 2.9.6
9
  * Text Domain: give
10
  * Domain Path: /languages
11
  *
@@ -252,7 +252,7 @@ final class Give {
252
  private function setup_constants() {
253
  // Plugin version.
254
  if ( ! defined( 'GIVE_VERSION' ) ) {
255
- define( 'GIVE_VERSION', '2.9.6' );
256
  }
257
 
258
  // Plugin Root File.
5
  * Description: The most robust, flexible, and intuitive way to accept donations on WordPress.
6
  * Author: GiveWP
7
  * Author URI: https://givewp.com/
8
+ * Version: 2.9.7
9
  * Text Domain: give
10
  * Domain Path: /languages
11
  *
252
  private function setup_constants() {
253
  // Plugin version.
254
  if ( ! defined( 'GIVE_VERSION' ) ) {
255
+ define( 'GIVE_VERSION', '2.9.7' );
256
  }
257
 
258
  // Plugin Root File.
includes/forms/template.php CHANGED
@@ -1377,36 +1377,37 @@ function give_get_register_fields( $form_id ) {
1377
  // Add attributes to checkbox, if Guest Checkout is disabled.
1378
  $is_guest_checkout = give_is_setting_enabled( give_get_meta( $form_id, '_give_logged_in_only', true ) );
1379
  ?>
 
 
 
 
 
 
 
 
 
1380
  <div id="give-create-account-wrap-<?php echo $form_id; ?>" class="form-row <?php echo esc_attr( $class ); ?> form-row-responsive">
1381
- <label for="give-create-account-<?php echo $form_id; ?>" class="<?php echo ! $is_guest_checkout ? 'checked' : ''; ?>">
 
 
 
 
 
1382
  <?php
1383
- $id = 'give-create-account-' . $form_id;
1384
- if ( ! $is_guest_checkout ) {
1385
- echo Give()->tooltips->render(
1386
- [
1387
- 'tag_content' => sprintf(
1388
- '<input type="checkbox" name="give_create_account" value="on" id="%s" class="give-input give-disabled" checked />',
1389
- $id
1390
- ),
1391
- 'label' => __( 'Registration is required to donate.', 'give' ),
1392
- ]
1393
- );
1394
- } else {
1395
- ?>
1396
- <input type="checkbox" name="give_create_account" value="on" id="<?php echo $id; ?>"
1397
- class="give-input"/>
1398
- <?php
1399
- }
1400
-
1401
  _e( 'Create an account', 'give' );
1402
  echo Give()->tooltips->render_help( __( 'Create an account on the site to see and manage donation history.', 'give' ) );
 
 
 
 
 
 
1403
  echo str_replace(
1404
  '/>',
1405
  'data-time="' . time() . '" data-nonce-life="' . give_get_nonce_life() . '"/>',
1406
  give_get_nonce_field( "give_form_create_user_nonce_{$form_id}", 'give-form-user-register-hash', false )
1407
  );
1408
- ?>
1409
- </label>
1410
  </div>
1411
 
1412
  <?php if ( 'both' === $show_register_form ) { ?>
1377
  // Add attributes to checkbox, if Guest Checkout is disabled.
1378
  $is_guest_checkout = give_is_setting_enabled( give_get_meta( $form_id, '_give_logged_in_only', true ) );
1379
  ?>
1380
+
1381
+ <?php
1382
+ /**
1383
+ * If Guest Checkout is enabled, display label and checkbox - unchecked.
1384
+ * If Guest Checkout it disabled, display hidden checkbox - checked.
1385
+ * @since 2.9.6
1386
+ * @since 2.9.7 Create account checkbox is hidden when guest registration is disabled.
1387
+ */
1388
+ ?>
1389
  <div id="give-create-account-wrap-<?php echo $form_id; ?>" class="form-row <?php echo esc_attr( $class ); ?> form-row-responsive">
1390
+ <?php
1391
+ $is_guest_checkout = give_get_meta( $form_id, '_give_logged_in_only', true );
1392
+ if ( give_is_setting_enabled( $is_guest_checkout ) ) {
1393
+ ?>
1394
+ <label for="give-create-account-<?php echo $form_id; ?>">
1395
+ <input type="checkbox" id="give-create-account-<?php echo $form_id; ?>" name="give_create_account" class="give-input" value="on" />
1396
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1397
  _e( 'Create an account', 'give' );
1398
  echo Give()->tooltips->render_help( __( 'Create an account on the site to see and manage donation history.', 'give' ) );
1399
+ ?>
1400
+ </label>
1401
+ <?php } else { ?>
1402
+ <input type="hidden" id="give-create-account-<?php echo $form_id; ?>" name="give_create_account" class="give-input" value="on" checked />
1403
+ <?php } ?>
1404
+ <?php
1405
  echo str_replace(
1406
  '/>',
1407
  'data-time="' . time() . '" data-nonce-life="' . give_get_nonce_life() . '"/>',
1408
  give_get_nonce_field( "give_form_create_user_nonce_{$form_id}", 'give-form-user-register-hash', false )
1409
  );
1410
+ ?>
 
1411
  </div>
1412
 
1413
  <?php if ( 'both' === $show_register_form ) { ?>
languages/give.pot CHANGED
@@ -493,7 +493,7 @@ msgstr ""
493
  msgid "The add-on did not activate successfully."
494
  msgstr ""
495
 
496
- #: includes/class-give-scripts.php:239, includes/class-give-scripts.php:288, includes/forms/template.php:1557, includes/admin/donors/class-donor-table.php:598, includes/admin/donors/donors.php:504, includes/admin/donors/donors.php:743, includes/admin/donors/donors.php:1161, includes/admin/payments/view-payment-details.php:688, includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:795
497
  msgid "Cancel"
498
  msgstr ""
499
 
@@ -5593,7 +5593,7 @@ msgstr ""
5593
  msgid "We're unable to recognize your session. Please refresh the screen to try again; otherwise contact your website administrator for assistance."
5594
  msgstr ""
5595
 
5596
- #: includes/install.php:367, includes/forms/template.php:1762, includes/forms/template.php:1757, includes/admin/forms/class-metabox-form-data.php:562, includes/admin/settings/class-settings-display.php:284, tests/unit-tests/tests-install.php:97
5597
  msgid "Agree to Terms?"
5598
  msgstr ""
5599
 
@@ -6094,7 +6094,7 @@ msgstr ""
6094
  msgid "Please enter your username or email to log in."
6095
  msgstr ""
6096
 
6097
- #: includes/process-donation.php:966, includes/forms/template.php:1562, templates/shortcode-login.php:52
6098
  msgid "Reset Password"
6099
  msgstr ""
6100
 
@@ -6159,7 +6159,7 @@ msgstr ""
6159
  msgid "Hey! We've raised {total} of the {total_goal} we are trying to raise for this campaign!"
6160
  msgstr ""
6161
 
6162
- #: includes/shortcodes.php:595, includes/forms/template.php:689, includes/forms/template.php:719, includes/forms/template.php:1936, includes/forms/widget.php:172, includes/gateways/stripe/includes/give-stripe-scripts.php:54, includes/gateways/stripe/includes/payment-methods/class-give-stripe-checkout.php:556, src/Form/Template.php:230, src/Form/Template.php:240, src/Onboarding/DefaultFormFactory.php:39, src/Onboarding/DefaultFormFactory.php:43, src/Onboarding/DefaultFormFactory.php:119, src/Form/Template/Options.php:56, src/Form/Template/Options.php:58, src/Form/Template/Options.php:131, src/Views/Form/Templates/Sequoia/Actions.php:214, src/Views/Form/Templates/Sequoia/Actions.php:259, src/Views/Form/Templates/Sequoia/optionConfig.php:68, src/Views/Form/Templates/Sequoia/optionConfig.php:70, src/Views/Form/Templates/Sequoia/Sequoia.php:67
6163
  msgid "Donate Now"
6164
  msgstr ""
6165
 
@@ -6489,7 +6489,7 @@ msgstr ""
6489
  msgid "Tools"
6490
  msgstr ""
6491
 
6492
- #: includes/admin/admin-pages.php:104, includes/admin/plugins.php:83, includes/admin/settings/class-settings-addon.php:29, src/Onboarding/Setup/templates/index.html.php:251
6493
  msgid "Add-ons"
6494
  msgstr ""
6495
 
@@ -7528,95 +7528,91 @@ msgstr ""
7528
  msgid "The zip or postal code for your billing address."
7529
  msgstr ""
7530
 
7531
- #: includes/forms/template.php:1391
7532
- msgid "Registration is required to donate."
7533
- msgstr ""
7534
-
7535
- #: includes/forms/template.php:1401
7536
  msgid "Create an account"
7537
  msgstr ""
7538
 
7539
- #: includes/forms/template.php:1402
7540
  msgid "Create an account on the site to see and manage donation history."
7541
  msgstr ""
7542
 
7543
- #: includes/forms/template.php:1414
7544
  msgid "Already have an account?"
7545
  msgstr ""
7546
 
7547
- #: includes/forms/template.php:1416, includes/forms/template.php:1553, includes/admin/forms/class-metabox-form-data.php:399, includes/admin/shortcodes/shortcode-give-login.php:24, includes/admin/shortcodes/shortcode-give-login.php:25
7548
  msgid "Login"
7549
  msgstr ""
7550
 
7551
- #: includes/forms/template.php:1485
7552
  msgid "Log In to Your Account"
7553
  msgstr ""
7554
 
7555
- #: includes/forms/template.php:1487
7556
  msgid "(optional)"
7557
  msgstr ""
7558
 
7559
- #: includes/forms/template.php:1493
7560
  msgid "Don't have an account?"
7561
  msgstr ""
7562
 
7563
- #: includes/forms/template.php:1500
7564
  msgid "Register or donate as a guest &raquo;"
7565
  msgstr ""
7566
 
7567
- #: includes/forms/template.php:1498
7568
  msgid "Register as a part of your donation &raquo;"
7569
  msgstr ""
7570
 
7571
- #: includes/forms/template.php:1522, templates/shortcode-login.php:34
7572
  msgid "Username or Email Address"
7573
  msgstr ""
7574
 
7575
- #: includes/forms/template.php:1531
7576
  msgid "Your username or email"
7577
  msgstr ""
7578
 
7579
- #: includes/forms/template.php:1537, templates/shortcode-login.php:39, templates/shortcode-register.php:44
7580
  msgid "Password"
7581
  msgstr ""
7582
 
7583
- #: includes/forms/template.php:1544
7584
  msgid "Your password"
7585
  msgstr ""
7586
 
7587
- #: includes/forms/template.php:1629
7588
  msgid "Select Payment Method"
7589
  msgstr ""
7590
 
7591
- #: includes/forms/template.php:1773
7592
  msgid "Please enter valid terms and conditions in <a href=\"%s\">this form's settings</a>."
7593
  msgstr ""
7594
 
7595
- #: includes/forms/template.php:1788
7596
  msgid "Terms"
7597
  msgstr ""
7598
 
7599
- #: includes/forms/template.php:1809
7600
  msgid "Show Terms"
7601
  msgstr ""
7602
 
7603
- #: includes/forms/template.php:1811
7604
  msgid "Hide Terms"
7605
  msgstr ""
7606
 
7607
- #: includes/forms/template.php:1855, includes/admin/shortcodes/shortcode-give-donor-wall.php:154
7608
  msgid "Donation Total:"
7609
  msgstr ""
7610
 
7611
- #: includes/forms/template.php:2205, includes/gateways/stripe/includes/class-give-stripe-gateway.php:142, includes/gateways/stripe/includes/class-give-stripe-gateway.php:131, includes/gateways/stripe/includes/class-give-stripe-gateway.php:120
7612
  msgid "Notice:"
7613
  msgstr ""
7614
 
7615
- #: includes/forms/template.php:2205
7616
  msgid "Test mode is enabled. While in test mode no live donations are processed."
7617
  msgstr ""
7618
 
7619
- #: includes/forms/template.php:2234
7620
  msgid "Please log in in order to complete your donation."
7621
  msgstr ""
7622
 
@@ -8300,7 +8296,7 @@ msgstr ""
8300
  msgid "You can not edit notification status from here."
8301
  msgstr ""
8302
 
8303
- #: includes/admin/emails/abstract-email-notification.php:897, src/PaymentGateways/PaypalSettingPage.php:64, src/PaymentGateways/PayPalStandard/PayPalStandard.php:26, src/Onboarding/Setup/templates/index.html.php:60
8304
  msgid "PayPal"
8305
  msgstr ""
8306
 
@@ -10818,7 +10814,7 @@ msgstr ""
10818
  #. translators: %s: Paypal transaction ID
10819
  #. translators: %s: Paypal transaction id
10820
  #. translators: %s: Paypal transaction id
10821
- #: includes/gateways/paypal/paypal-standard.php:400, tests/unit-tests/tests-payment-class.php:30, tests/unit-tests/tests-payments.php:48, tests/framework/helpers/class-helper-payment.php:202
10822
  msgid "PayPal Transaction ID: %s"
10823
  msgstr ""
10824
 
@@ -12960,7 +12956,7 @@ msgstr ""
12960
  msgid "Stripe Connect"
12961
  msgstr ""
12962
 
12963
- #: includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:67, includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:96, includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:134, includes/gateways/stripe/includes/admin/class-give-stripe-logs.php:101, src/Onboarding/Setup/templates/index.html.php:86
12964
  msgid "Stripe"
12965
  msgstr ""
12966
 
@@ -14161,7 +14157,7 @@ msgstr ""
14161
  msgid "GiveWP Setup Guide"
14162
  msgstr ""
14163
 
14164
- #: src/Onboarding/Setup/templates/index.html.php:20, src/Onboarding/Setup/templates/index.html.php:51, src/Onboarding/Setup/templates/index.html.php:130
14165
  msgid "Step"
14166
  msgstr ""
14167
 
@@ -14181,139 +14177,139 @@ msgstr ""
14181
  msgid "Connect a payment gateway"
14182
  msgstr ""
14183
 
14184
- #: src/Onboarding/Setup/templates/index.html.php:61, src/Onboarding/Setup/templates/index.html.php:75
14185
  msgid "Connect to PayPal"
14186
  msgstr ""
14187
 
14188
- #: src/Onboarding/Setup/templates/index.html.php:62
14189
  msgid "PayPal is synonymous with nonprofits and online charitable gifts. It's been the go-to payment merchant for many of the world's top NGOs. Accept PayPal, credit and debit cards without any added platform fees."
14190
  msgstr ""
14191
 
14192
- #: src/Onboarding/Setup/templates/index.html.php:75
14193
  msgid "PayPal Settings"
14194
  msgstr ""
14195
 
14196
- #: src/Onboarding/Setup/templates/index.html.php:87
14197
  msgid "Connect to Stripe"
14198
  msgstr ""
14199
 
14200
- #: src/Onboarding/Setup/templates/index.html.php:88
14201
  msgid "Stripe is one of the most popular payment gateways, and for good reason! Receive one-time and Recurring Donations (add-on) using many of the most popular payment methods. Note: the FREE version of Stripe includes an additional 2% fee for processing one-time donations. Remove the fee by installing and activating the premium Stripe add-on."
14202
  msgstr ""
14203
 
14204
- #: src/Onboarding/Setup/templates/index.html.php:112
14205
  msgid "Want to use a different gateway? GiveWP has support for many others including Authorize.net, Square, Razorpay and more! %s"
14206
  msgstr ""
14207
 
14208
- #: src/Onboarding/Setup/templates/index.html.php:116
14209
  msgid "View all gateways"
14210
  msgstr ""
14211
 
14212
- #: src/Onboarding/Setup/templates/index.html.php:130
14213
  msgid "Level up your fundraising"
14214
  msgstr ""
14215
 
14216
- #: src/Onboarding/Setup/templates/index.html.php:143, src/Onboarding/Setup/templates/index.html.php:144
14217
  msgid "Recurring Donations"
14218
  msgstr ""
14219
 
14220
- #: src/Onboarding/Setup/templates/index.html.php:145
14221
  msgid "The Recurring Donations add-on for GiveWP brings you more dependable payments by allowing your donors to give regularly at different time intervals. Let your donors choose how often they give and how much. Manage your subscriptions, view specialized reports, and connect more strategically with your recurring donors."
14222
  msgstr ""
14223
 
14224
- #: src/Onboarding/Setup/templates/index.html.php:151
14225
  msgid "Learn more about Recurring Donations"
14226
  msgstr ""
14227
 
14228
- #: src/Onboarding/Setup/templates/index.html.php:161, src/Onboarding/Setup/templates/index.html.php:162
14229
  msgid "Fee Recovery"
14230
  msgstr ""
14231
 
14232
- #: src/Onboarding/Setup/templates/index.html.php:163
14233
  msgid "Credit Card processing fees can take away a big chunk of your donations. This means less money goes to your cause. Why not ask your donors to further help your cause by asking them to take care of the payment processing fees? That’s where the Fee Recovery add-on comes into play."
14234
  msgstr ""
14235
 
14236
- #: src/Onboarding/Setup/templates/index.html.php:169
14237
  msgid "Learn more about Fee Recovery"
14238
  msgstr ""
14239
 
14240
- #: src/Onboarding/Setup/templates/index.html.php:179, src/Onboarding/Setup/templates/index.html.php:180
14241
  msgid "PDF Receipts"
14242
  msgstr ""
14243
 
14244
- #: src/Onboarding/Setup/templates/index.html.php:181
14245
  msgid "PDF Receipts makes it easy for your donors to print their tax deductible receipts by making PDF downloadable copies of them easily available. Donors can get a link to their receipt provided to them in the confirmation email, there is also a link in the donation confirmation screen, and a link in their Donation History page."
14246
  msgstr ""
14247
 
14248
- #: src/Onboarding/Setup/templates/index.html.php:187
14249
  msgid "Learn more about PDF Receipts"
14250
  msgstr ""
14251
 
14252
- #: src/Onboarding/Setup/templates/index.html.php:197, src/Onboarding/Setup/templates/index.html.php:198
14253
  msgid "Form Field Manager"
14254
  msgstr ""
14255
 
14256
- #: src/Onboarding/Setup/templates/index.html.php:199
14257
  msgid "Form Field Manager (FFM) allows you to add and manage additional fields for your GiveWP donation forms using an intuitive drag-and-drop interface. Form fields include simple fields such as checkboxes, dropdowns, radios, and more. The more complex form fields that you can add are file upload fields, Rich text editors (TinyMCE), and the powerful Repeater field."
14258
  msgstr ""
14259
 
14260
- #: src/Onboarding/Setup/templates/index.html.php:205
14261
  msgid "Learn more about Form Field Manager"
14262
  msgstr ""
14263
 
14264
- #: src/Onboarding/Setup/templates/index.html.php:215, src/Onboarding/Setup/templates/index.html.php:216
14265
  msgid "Currency Switcher"
14266
  msgstr ""
14267
 
14268
- #: src/Onboarding/Setup/templates/index.html.php:217
14269
  msgid "Allow your donors to switch to their currency of choice and increase your overall giving with the GiveWP Currency Switcher add-on. Select from an extensive list of currencies, set the currency based on your donor's location, pull from live exchange rates and more!"
14270
  msgstr ""
14271
 
14272
- #: src/Onboarding/Setup/templates/index.html.php:223
14273
  msgid "Learn more about Currency Switcher"
14274
  msgstr ""
14275
 
14276
- #: src/Onboarding/Setup/templates/index.html.php:233, src/Onboarding/Setup/templates/index.html.php:234
14277
  msgid "Tributes"
14278
  msgstr ""
14279
 
14280
- #: src/Onboarding/Setup/templates/index.html.php:235
14281
  msgid "Allow donors to give to your cause via customizable tributes like “In honor of,” “In memory of,” or any dedication you prefer. Send eCards and produce customizable mailable cards that your donors and their honorees will love."
14282
  msgstr ""
14283
 
14284
- #: src/Onboarding/Setup/templates/index.html.php:241
14285
  msgid "Learn more about Tributes"
14286
  msgstr ""
14287
 
14288
- #: src/Onboarding/Setup/templates/index.html.php:252
14289
  msgid "GiveWP Add-ons"
14290
  msgstr ""
14291
 
14292
- #: src/Onboarding/Setup/templates/index.html.php:253
14293
  msgid "Make your fundraising even more effective with powerful add-ons like Recurring Donations, Fee Recovery, Google Analytics Donation Tracking, MailChimp, and much more. View our growing library of 35+ add-ons and extend your fundraising now."
14294
  msgstr ""
14295
 
14296
- #: src/Onboarding/Setup/templates/index.html.php:259
14297
  msgid "View Add-ons for GiveWP"
14298
  msgstr ""
14299
 
14300
- #: src/Onboarding/Setup/templates/index.html.php:273
14301
  msgid "Get the most out of GiveWP"
14302
  msgstr ""
14303
 
14304
- #: src/Onboarding/Setup/templates/index.html.php:280, src/Onboarding/Setup/templates/index.html.php:281
14305
  msgid "GiveWP Getting Started Guide"
14306
  msgstr ""
14307
 
14308
- #: src/Onboarding/Setup/templates/index.html.php:282
14309
  msgid "Start off on the right foot by learning the basics of the plugin and how to get the most out of it to further your online fundraising efforts."
14310
  msgstr ""
14311
 
14312
- #: src/Onboarding/Setup/templates/index.html.php:288
14313
  msgid "Learn more about GiveWP"
14314
  msgstr ""
14315
 
14316
- #: src/Onboarding/Setup/templates/index.html.php:304
14317
  msgid "Dismiss Setup Screen"
14318
  msgstr ""
14319
 
@@ -14789,130 +14785,130 @@ msgstr ""
14789
  msgid "Placeholder"
14790
  msgstr ""
14791
 
14792
- #: tests/unit-tests/tests-misc-functions.php:56
14793
  msgid "US Dollars"
14794
  msgstr ""
14795
 
14796
- #: tests/unit-tests/tests-misc-functions.php:57
14797
  msgid "Euros"
14798
  msgstr ""
14799
 
14800
- #: tests/unit-tests/tests-misc-functions.php:58
14801
  msgid "Pounds Sterling"
14802
  msgstr ""
14803
 
14804
- #: tests/unit-tests/tests-misc-functions.php:59
14805
  msgid "Australian Dollars"
14806
  msgstr ""
14807
 
14808
- #: tests/unit-tests/tests-misc-functions.php:60
14809
  msgid "Brazilian Real"
14810
  msgstr ""
14811
 
14812
- #: tests/unit-tests/tests-misc-functions.php:61
14813
  msgid "Canadian Dollars"
14814
  msgstr ""
14815
 
14816
- #: tests/unit-tests/tests-misc-functions.php:62
14817
  msgid "Czech Koruna"
14818
  msgstr ""
14819
 
14820
- #: tests/unit-tests/tests-misc-functions.php:63
14821
  msgid "Danish Krone"
14822
  msgstr ""
14823
 
14824
- #: tests/unit-tests/tests-misc-functions.php:64
14825
  msgid "Hong Kong Dollar"
14826
  msgstr ""
14827
 
14828
- #: tests/unit-tests/tests-misc-functions.php:65
14829
  msgid "Hungarian Forint"
14830
  msgstr ""
14831
 
14832
- #: tests/unit-tests/tests-misc-functions.php:66
14833
  msgid "Israeli Shekel"
14834
  msgstr ""
14835
 
14836
- #: tests/unit-tests/tests-misc-functions.php:67
14837
  msgid "Japanese Yen"
14838
  msgstr ""
14839
 
14840
- #: tests/unit-tests/tests-misc-functions.php:68
14841
  msgid "Malaysian Ringgits"
14842
  msgstr ""
14843
 
14844
- #: tests/unit-tests/tests-misc-functions.php:69
14845
  msgid "Mexican Peso"
14846
  msgstr ""
14847
 
14848
- #: tests/unit-tests/tests-misc-functions.php:70
14849
  msgid "Moroccan Dirham"
14850
  msgstr ""
14851
 
14852
- #: tests/unit-tests/tests-misc-functions.php:71
14853
  msgid "New Zealand Dollar"
14854
  msgstr ""
14855
 
14856
- #: tests/unit-tests/tests-misc-functions.php:72
14857
  msgid "Norwegian Krone"
14858
  msgstr ""
14859
 
14860
- #: tests/unit-tests/tests-misc-functions.php:73
14861
  msgid "Philippine Pesos"
14862
  msgstr ""
14863
 
14864
- #: tests/unit-tests/tests-misc-functions.php:74
14865
  msgid "Polish Zloty"
14866
  msgstr ""
14867
 
14868
- #: tests/unit-tests/tests-misc-functions.php:75
14869
  msgid "Singapore Dollar"
14870
  msgstr ""
14871
 
14872
- #: tests/unit-tests/tests-misc-functions.php:76
14873
  msgid "South Korean Won"
14874
  msgstr ""
14875
 
14876
- #: tests/unit-tests/tests-misc-functions.php:77
14877
  msgid "South African Rand"
14878
  msgstr ""
14879
 
14880
- #: tests/unit-tests/tests-misc-functions.php:78
14881
  msgid "Swedish Krona"
14882
  msgstr ""
14883
 
14884
- #: tests/unit-tests/tests-misc-functions.php:79
14885
  msgid "Swiss Franc"
14886
  msgstr ""
14887
 
14888
- #: tests/unit-tests/tests-misc-functions.php:80
14889
  msgid "Taiwan New Dollars"
14890
  msgstr ""
14891
 
14892
- #: tests/unit-tests/tests-misc-functions.php:81
14893
  msgid "Thai Baht"
14894
  msgstr ""
14895
 
14896
- #: tests/unit-tests/tests-misc-functions.php:82
14897
  msgid "Indian Rupee"
14898
  msgstr ""
14899
 
14900
- #: tests/unit-tests/tests-misc-functions.php:83
14901
  msgid "Turkish Lira"
14902
  msgstr ""
14903
 
14904
- #: tests/unit-tests/tests-misc-functions.php:84
14905
  msgid "Iranian Rial"
14906
  msgstr ""
14907
 
14908
- #: tests/unit-tests/tests-misc-functions.php:85
14909
  msgid "Russian Rubles"
14910
  msgstr ""
14911
 
14912
- #: tests/framework/helpers/class-helper-form.php:166
14913
  msgid "Empty form argument is not valid to setup donation form."
14914
  msgstr ""
14915
 
14916
- #: tests/framework/helpers/class-helper-payment.php:181
14917
  msgid "Empty donation argument is not valid to setup donation."
14918
  msgstr ""
493
  msgid "The add-on did not activate successfully."
494
  msgstr ""
495
 
496
+ #: includes/class-give-scripts.php:239, includes/class-give-scripts.php:288, includes/forms/template.php:1558, includes/admin/donors/class-donor-table.php:598, includes/admin/donors/donors.php:504, includes/admin/donors/donors.php:743, includes/admin/donors/donors.php:1161, includes/admin/payments/view-payment-details.php:688, includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:795
497
  msgid "Cancel"
498
  msgstr ""
499
 
5593
  msgid "We're unable to recognize your session. Please refresh the screen to try again; otherwise contact your website administrator for assistance."
5594
  msgstr ""
5595
 
5596
+ #: includes/install.php:367, includes/forms/template.php:1763, includes/forms/template.php:1758, includes/admin/forms/class-metabox-form-data.php:562, includes/admin/settings/class-settings-display.php:284, tests/unit/legacy/tests-install.php:97
5597
  msgid "Agree to Terms?"
5598
  msgstr ""
5599
 
6094
  msgid "Please enter your username or email to log in."
6095
  msgstr ""
6096
 
6097
+ #: includes/process-donation.php:966, includes/forms/template.php:1563, templates/shortcode-login.php:52
6098
  msgid "Reset Password"
6099
  msgstr ""
6100
 
6159
  msgid "Hey! We've raised {total} of the {total_goal} we are trying to raise for this campaign!"
6160
  msgstr ""
6161
 
6162
+ #: includes/shortcodes.php:595, includes/forms/template.php:689, includes/forms/template.php:719, includes/forms/template.php:1937, includes/forms/widget.php:172, includes/gateways/stripe/includes/give-stripe-scripts.php:54, includes/gateways/stripe/includes/payment-methods/class-give-stripe-checkout.php:556, src/Form/Template.php:230, src/Form/Template.php:240, src/Onboarding/DefaultFormFactory.php:39, src/Onboarding/DefaultFormFactory.php:43, src/Onboarding/DefaultFormFactory.php:119, src/Form/Template/Options.php:56, src/Form/Template/Options.php:58, src/Form/Template/Options.php:131, src/Views/Form/Templates/Sequoia/Actions.php:214, src/Views/Form/Templates/Sequoia/Actions.php:259, src/Views/Form/Templates/Sequoia/optionConfig.php:68, src/Views/Form/Templates/Sequoia/optionConfig.php:70, src/Views/Form/Templates/Sequoia/Sequoia.php:67
6163
  msgid "Donate Now"
6164
  msgstr ""
6165
 
6489
  msgid "Tools"
6490
  msgstr ""
6491
 
6492
+ #: includes/admin/admin-pages.php:104, includes/admin/plugins.php:83, includes/admin/settings/class-settings-addon.php:29, src/Onboarding/Setup/templates/index.html.php:253
6493
  msgid "Add-ons"
6494
  msgstr ""
6495
 
7528
  msgid "The zip or postal code for your billing address."
7529
  msgstr ""
7530
 
7531
+ #: includes/forms/template.php:1397
 
 
 
 
7532
  msgid "Create an account"
7533
  msgstr ""
7534
 
7535
+ #: includes/forms/template.php:1398
7536
  msgid "Create an account on the site to see and manage donation history."
7537
  msgstr ""
7538
 
7539
+ #: includes/forms/template.php:1415
7540
  msgid "Already have an account?"
7541
  msgstr ""
7542
 
7543
+ #: includes/forms/template.php:1417, includes/forms/template.php:1554, includes/admin/forms/class-metabox-form-data.php:399, includes/admin/shortcodes/shortcode-give-login.php:24, includes/admin/shortcodes/shortcode-give-login.php:25
7544
  msgid "Login"
7545
  msgstr ""
7546
 
7547
+ #: includes/forms/template.php:1486
7548
  msgid "Log In to Your Account"
7549
  msgstr ""
7550
 
7551
+ #: includes/forms/template.php:1488
7552
  msgid "(optional)"
7553
  msgstr ""
7554
 
7555
+ #: includes/forms/template.php:1494
7556
  msgid "Don't have an account?"
7557
  msgstr ""
7558
 
7559
+ #: includes/forms/template.php:1501
7560
  msgid "Register or donate as a guest &raquo;"
7561
  msgstr ""
7562
 
7563
+ #: includes/forms/template.php:1499
7564
  msgid "Register as a part of your donation &raquo;"
7565
  msgstr ""
7566
 
7567
+ #: includes/forms/template.php:1523, templates/shortcode-login.php:34
7568
  msgid "Username or Email Address"
7569
  msgstr ""
7570
 
7571
+ #: includes/forms/template.php:1532
7572
  msgid "Your username or email"
7573
  msgstr ""
7574
 
7575
+ #: includes/forms/template.php:1538, templates/shortcode-login.php:39, templates/shortcode-register.php:44
7576
  msgid "Password"
7577
  msgstr ""
7578
 
7579
+ #: includes/forms/template.php:1545
7580
  msgid "Your password"
7581
  msgstr ""
7582
 
7583
+ #: includes/forms/template.php:1630
7584
  msgid "Select Payment Method"
7585
  msgstr ""
7586
 
7587
+ #: includes/forms/template.php:1774
7588
  msgid "Please enter valid terms and conditions in <a href=\"%s\">this form's settings</a>."
7589
  msgstr ""
7590
 
7591
+ #: includes/forms/template.php:1789
7592
  msgid "Terms"
7593
  msgstr ""
7594
 
7595
+ #: includes/forms/template.php:1810
7596
  msgid "Show Terms"
7597
  msgstr ""
7598
 
7599
+ #: includes/forms/template.php:1812
7600
  msgid "Hide Terms"
7601
  msgstr ""
7602
 
7603
+ #: includes/forms/template.php:1856, includes/admin/shortcodes/shortcode-give-donor-wall.php:154
7604
  msgid "Donation Total:"
7605
  msgstr ""
7606
 
7607
+ #: includes/forms/template.php:2206, includes/gateways/stripe/includes/class-give-stripe-gateway.php:142, includes/gateways/stripe/includes/class-give-stripe-gateway.php:131, includes/gateways/stripe/includes/class-give-stripe-gateway.php:120
7608
  msgid "Notice:"
7609
  msgstr ""
7610
 
7611
+ #: includes/forms/template.php:2206
7612
  msgid "Test mode is enabled. While in test mode no live donations are processed."
7613
  msgstr ""
7614
 
7615
+ #: includes/forms/template.php:2235
7616
  msgid "Please log in in order to complete your donation."
7617
  msgstr ""
7618
 
8296
  msgid "You can not edit notification status from here."
8297
  msgstr ""
8298
 
8299
+ #: includes/admin/emails/abstract-email-notification.php:897, src/PaymentGateways/PaypalSettingPage.php:64, src/PaymentGateways/PayPalStandard/PayPalStandard.php:26, src/Onboarding/Setup/templates/index.html.php:61
8300
  msgid "PayPal"
8301
  msgstr ""
8302
 
10814
  #. translators: %s: Paypal transaction ID
10815
  #. translators: %s: Paypal transaction id
10816
  #. translators: %s: Paypal transaction id
10817
+ #: includes/gateways/paypal/paypal-standard.php:400, tests/unit/legacy/tests-payment-class.php:30, tests/unit/legacy/tests-payments.php:48, tests/unit/framework/helpers/class-helper-payment.php:202
10818
  msgid "PayPal Transaction ID: %s"
10819
  msgstr ""
10820
 
12956
  msgid "Stripe Connect"
12957
  msgstr ""
12958
 
12959
+ #: includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:67, includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:96, includes/gateways/stripe/includes/admin/class-give-stripe-admin-settings.php:134, includes/gateways/stripe/includes/admin/class-give-stripe-logs.php:101, src/Onboarding/Setup/templates/index.html.php:88
12960
  msgid "Stripe"
12961
  msgstr ""
12962
 
14157
  msgid "GiveWP Setup Guide"
14158
  msgstr ""
14159
 
14160
+ #: src/Onboarding/Setup/templates/index.html.php:20, src/Onboarding/Setup/templates/index.html.php:51, src/Onboarding/Setup/templates/index.html.php:132
14161
  msgid "Step"
14162
  msgstr ""
14163
 
14177
  msgid "Connect a payment gateway"
14178
  msgstr ""
14179
 
14180
+ #: src/Onboarding/Setup/templates/index.html.php:62, src/Onboarding/Setup/templates/index.html.php:76
14181
  msgid "Connect to PayPal"
14182
  msgstr ""
14183
 
14184
+ #: src/Onboarding/Setup/templates/index.html.php:63
14185
  msgid "PayPal is synonymous with nonprofits and online charitable gifts. It's been the go-to payment merchant for many of the world's top NGOs. Accept PayPal, credit and debit cards without any added platform fees."
14186
  msgstr ""
14187
 
14188
+ #: src/Onboarding/Setup/templates/index.html.php:76
14189
  msgid "PayPal Settings"
14190
  msgstr ""
14191
 
14192
+ #: src/Onboarding/Setup/templates/index.html.php:89
14193
  msgid "Connect to Stripe"
14194
  msgstr ""
14195
 
14196
+ #: src/Onboarding/Setup/templates/index.html.php:90
14197
  msgid "Stripe is one of the most popular payment gateways, and for good reason! Receive one-time and Recurring Donations (add-on) using many of the most popular payment methods. Note: the FREE version of Stripe includes an additional 2% fee for processing one-time donations. Remove the fee by installing and activating the premium Stripe add-on."
14198
  msgstr ""
14199
 
14200
+ #: src/Onboarding/Setup/templates/index.html.php:114
14201
  msgid "Want to use a different gateway? GiveWP has support for many others including Authorize.net, Square, Razorpay and more! %s"
14202
  msgstr ""
14203
 
14204
+ #: src/Onboarding/Setup/templates/index.html.php:118
14205
  msgid "View all gateways"
14206
  msgstr ""
14207
 
14208
+ #: src/Onboarding/Setup/templates/index.html.php:132
14209
  msgid "Level up your fundraising"
14210
  msgstr ""
14211
 
14212
+ #: src/Onboarding/Setup/templates/index.html.php:145, src/Onboarding/Setup/templates/index.html.php:146
14213
  msgid "Recurring Donations"
14214
  msgstr ""
14215
 
14216
+ #: src/Onboarding/Setup/templates/index.html.php:147
14217
  msgid "The Recurring Donations add-on for GiveWP brings you more dependable payments by allowing your donors to give regularly at different time intervals. Let your donors choose how often they give and how much. Manage your subscriptions, view specialized reports, and connect more strategically with your recurring donors."
14218
  msgstr ""
14219
 
14220
+ #: src/Onboarding/Setup/templates/index.html.php:153
14221
  msgid "Learn more about Recurring Donations"
14222
  msgstr ""
14223
 
14224
+ #: src/Onboarding/Setup/templates/index.html.php:163, src/Onboarding/Setup/templates/index.html.php:164
14225
  msgid "Fee Recovery"
14226
  msgstr ""
14227
 
14228
+ #: src/Onboarding/Setup/templates/index.html.php:165
14229
  msgid "Credit Card processing fees can take away a big chunk of your donations. This means less money goes to your cause. Why not ask your donors to further help your cause by asking them to take care of the payment processing fees? That’s where the Fee Recovery add-on comes into play."
14230
  msgstr ""
14231
 
14232
+ #: src/Onboarding/Setup/templates/index.html.php:171
14233
  msgid "Learn more about Fee Recovery"
14234
  msgstr ""
14235
 
14236
+ #: src/Onboarding/Setup/templates/index.html.php:181, src/Onboarding/Setup/templates/index.html.php:182
14237
  msgid "PDF Receipts"
14238
  msgstr ""
14239
 
14240
+ #: src/Onboarding/Setup/templates/index.html.php:183
14241
  msgid "PDF Receipts makes it easy for your donors to print their tax deductible receipts by making PDF downloadable copies of them easily available. Donors can get a link to their receipt provided to them in the confirmation email, there is also a link in the donation confirmation screen, and a link in their Donation History page."
14242
  msgstr ""
14243
 
14244
+ #: src/Onboarding/Setup/templates/index.html.php:189
14245
  msgid "Learn more about PDF Receipts"
14246
  msgstr ""
14247
 
14248
+ #: src/Onboarding/Setup/templates/index.html.php:199, src/Onboarding/Setup/templates/index.html.php:200
14249
  msgid "Form Field Manager"
14250
  msgstr ""
14251
 
14252
+ #: src/Onboarding/Setup/templates/index.html.php:201
14253
  msgid "Form Field Manager (FFM) allows you to add and manage additional fields for your GiveWP donation forms using an intuitive drag-and-drop interface. Form fields include simple fields such as checkboxes, dropdowns, radios, and more. The more complex form fields that you can add are file upload fields, Rich text editors (TinyMCE), and the powerful Repeater field."
14254
  msgstr ""
14255
 
14256
+ #: src/Onboarding/Setup/templates/index.html.php:207
14257
  msgid "Learn more about Form Field Manager"
14258
  msgstr ""
14259
 
14260
+ #: src/Onboarding/Setup/templates/index.html.php:217, src/Onboarding/Setup/templates/index.html.php:218
14261
  msgid "Currency Switcher"
14262
  msgstr ""
14263
 
14264
+ #: src/Onboarding/Setup/templates/index.html.php:219
14265
  msgid "Allow your donors to switch to their currency of choice and increase your overall giving with the GiveWP Currency Switcher add-on. Select from an extensive list of currencies, set the currency based on your donor's location, pull from live exchange rates and more!"
14266
  msgstr ""
14267
 
14268
+ #: src/Onboarding/Setup/templates/index.html.php:225
14269
  msgid "Learn more about Currency Switcher"
14270
  msgstr ""
14271
 
14272
+ #: src/Onboarding/Setup/templates/index.html.php:235, src/Onboarding/Setup/templates/index.html.php:236
14273
  msgid "Tributes"
14274
  msgstr ""
14275
 
14276
+ #: src/Onboarding/Setup/templates/index.html.php:237
14277
  msgid "Allow donors to give to your cause via customizable tributes like “In honor of,” “In memory of,” or any dedication you prefer. Send eCards and produce customizable mailable cards that your donors and their honorees will love."
14278
  msgstr ""
14279
 
14280
+ #: src/Onboarding/Setup/templates/index.html.php:243
14281
  msgid "Learn more about Tributes"
14282
  msgstr ""
14283
 
14284
+ #: src/Onboarding/Setup/templates/index.html.php:254
14285
  msgid "GiveWP Add-ons"
14286
  msgstr ""
14287
 
14288
+ #: src/Onboarding/Setup/templates/index.html.php:255
14289
  msgid "Make your fundraising even more effective with powerful add-ons like Recurring Donations, Fee Recovery, Google Analytics Donation Tracking, MailChimp, and much more. View our growing library of 35+ add-ons and extend your fundraising now."
14290
  msgstr ""
14291
 
14292
+ #: src/Onboarding/Setup/templates/index.html.php:261
14293
  msgid "View Add-ons for GiveWP"
14294
  msgstr ""
14295
 
14296
+ #: src/Onboarding/Setup/templates/index.html.php:275
14297
  msgid "Get the most out of GiveWP"
14298
  msgstr ""
14299
 
14300
+ #: src/Onboarding/Setup/templates/index.html.php:282, src/Onboarding/Setup/templates/index.html.php:283
14301
  msgid "GiveWP Getting Started Guide"
14302
  msgstr ""
14303
 
14304
+ #: src/Onboarding/Setup/templates/index.html.php:284
14305
  msgid "Start off on the right foot by learning the basics of the plugin and how to get the most out of it to further your online fundraising efforts."
14306
  msgstr ""
14307
 
14308
+ #: src/Onboarding/Setup/templates/index.html.php:290
14309
  msgid "Learn more about GiveWP"
14310
  msgstr ""
14311
 
14312
+ #: src/Onboarding/Setup/templates/index.html.php:306
14313
  msgid "Dismiss Setup Screen"
14314
  msgstr ""
14315
 
14785
  msgid "Placeholder"
14786
  msgstr ""
14787
 
14788
+ #: tests/unit/legacy/tests-misc-functions.php:56
14789
  msgid "US Dollars"
14790
  msgstr ""
14791
 
14792
+ #: tests/unit/legacy/tests-misc-functions.php:57
14793
  msgid "Euros"
14794
  msgstr ""
14795
 
14796
+ #: tests/unit/legacy/tests-misc-functions.php:58
14797
  msgid "Pounds Sterling"
14798
  msgstr ""
14799
 
14800
+ #: tests/unit/legacy/tests-misc-functions.php:59
14801
  msgid "Australian Dollars"
14802
  msgstr ""
14803
 
14804
+ #: tests/unit/legacy/tests-misc-functions.php:60
14805
  msgid "Brazilian Real"
14806
  msgstr ""
14807
 
14808
+ #: tests/unit/legacy/tests-misc-functions.php:61
14809
  msgid "Canadian Dollars"
14810
  msgstr ""
14811
 
14812
+ #: tests/unit/legacy/tests-misc-functions.php:62
14813
  msgid "Czech Koruna"
14814
  msgstr ""
14815
 
14816
+ #: tests/unit/legacy/tests-misc-functions.php:63
14817
  msgid "Danish Krone"
14818
  msgstr ""
14819
 
14820
+ #: tests/unit/legacy/tests-misc-functions.php:64
14821
  msgid "Hong Kong Dollar"
14822
  msgstr ""
14823
 
14824
+ #: tests/unit/legacy/tests-misc-functions.php:65
14825
  msgid "Hungarian Forint"
14826
  msgstr ""
14827
 
14828
+ #: tests/unit/legacy/tests-misc-functions.php:66
14829
  msgid "Israeli Shekel"
14830
  msgstr ""
14831
 
14832
+ #: tests/unit/legacy/tests-misc-functions.php:67
14833
  msgid "Japanese Yen"
14834
  msgstr ""
14835
 
14836
+ #: tests/unit/legacy/tests-misc-functions.php:68
14837
  msgid "Malaysian Ringgits"
14838
  msgstr ""
14839
 
14840
+ #: tests/unit/legacy/tests-misc-functions.php:69
14841
  msgid "Mexican Peso"
14842
  msgstr ""
14843
 
14844
+ #: tests/unit/legacy/tests-misc-functions.php:70
14845
  msgid "Moroccan Dirham"
14846
  msgstr ""
14847
 
14848
+ #: tests/unit/legacy/tests-misc-functions.php:71
14849
  msgid "New Zealand Dollar"
14850
  msgstr ""
14851
 
14852
+ #: tests/unit/legacy/tests-misc-functions.php:72
14853
  msgid "Norwegian Krone"
14854
  msgstr ""
14855
 
14856
+ #: tests/unit/legacy/tests-misc-functions.php:73
14857
  msgid "Philippine Pesos"
14858
  msgstr ""
14859
 
14860
+ #: tests/unit/legacy/tests-misc-functions.php:74
14861
  msgid "Polish Zloty"
14862
  msgstr ""
14863
 
14864
+ #: tests/unit/legacy/tests-misc-functions.php:75
14865
  msgid "Singapore Dollar"
14866
  msgstr ""
14867
 
14868
+ #: tests/unit/legacy/tests-misc-functions.php:76
14869
  msgid "South Korean Won"
14870
  msgstr ""
14871
 
14872
+ #: tests/unit/legacy/tests-misc-functions.php:77
14873
  msgid "South African Rand"
14874
  msgstr ""
14875
 
14876
+ #: tests/unit/legacy/tests-misc-functions.php:78
14877
  msgid "Swedish Krona"
14878
  msgstr ""
14879
 
14880
+ #: tests/unit/legacy/tests-misc-functions.php:79
14881
  msgid "Swiss Franc"
14882
  msgstr ""
14883
 
14884
+ #: tests/unit/legacy/tests-misc-functions.php:80
14885
  msgid "Taiwan New Dollars"
14886
  msgstr ""
14887
 
14888
+ #: tests/unit/legacy/tests-misc-functions.php:81
14889
  msgid "Thai Baht"
14890
  msgstr ""
14891
 
14892
+ #: tests/unit/legacy/tests-misc-functions.php:82
14893
  msgid "Indian Rupee"
14894
  msgstr ""
14895
 
14896
+ #: tests/unit/legacy/tests-misc-functions.php:83
14897
  msgid "Turkish Lira"
14898
  msgstr ""
14899
 
14900
+ #: tests/unit/legacy/tests-misc-functions.php:84
14901
  msgid "Iranian Rial"
14902
  msgstr ""
14903
 
14904
+ #: tests/unit/legacy/tests-misc-functions.php:85
14905
  msgid "Russian Rubles"
14906
  msgstr ""
14907
 
14908
+ #: tests/unit/framework/helpers/class-helper-form.php:166
14909
  msgid "Empty form argument is not valid to setup donation form."
14910
  msgstr ""
14911
 
14912
+ #: tests/unit/framework/helpers/class-helper-payment.php:181
14913
  msgid "Empty donation argument is not valid to setup donation."
14914
  msgstr ""
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: donation, fundraising, crowdfunding, givewp, give
5
  Requires at least: 4.9
6
  Tested up to: 5.6
7
  Requires PHP: 5.6
8
- Stable tag: 2.9.6
9
  License: GPLv3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -231,6 +231,12 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri
231
 
232
  == Changelog ==
233
 
 
 
 
 
 
 
234
  = 2.9.6: January 13th, 2021 =
235
  * New: Additional logging and improved messaging for PayPal Donations onboarding
236
  * New: Added ability to adjust gravatar size for the Donor Wall block
5
  Requires at least: 4.9
6
  Tested up to: 5.6
7
  Requires PHP: 5.6
8
+ Stable tag: 2.9.7
9
  License: GPLv3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
231
 
232
  == Changelog ==
233
 
234
+ = 2.9.7: February 9th, 2021 =
235
+ * Fixed: Using CLI commands no longer throws a fatal error due to a missing dev package
236
+ * Fixed: When guest registration is disabled the checkbox to create an account is hidden
237
+ * Fixed: Multi Form Goal component no longer throws an error when used in Divi
238
+ * Fixed: Corrected some styles in the Setup Page for gateway links
239
+
240
  = 2.9.6: January 13th, 2021 =
241
  * New: Additional logging and improved messaging for PayPal Donations onboarding
242
  * New: Added ability to adjust gravatar size for the Donor Wall block
src/MultiFormGoals/MultiFormGoal/Shortcode.php CHANGED
@@ -7,7 +7,7 @@ use Give\MultiFormGoals\MultiFormGoal\Model as MultiFormGoal;
7
  class Shortcode {
8
 
9
  /**
10
- * @since 2.10.0 Extracted from harded-coded value in `addShortcode()`.
11
  * @var string Shortcode tag to be searched in post content.
12
  * */
13
  protected $tag = 'give_multi_form_goal';
@@ -27,8 +27,6 @@ class Shortcode {
27
  * @since 2.9.0
28
  **/
29
  public function renderCallback( $attributes ) {
30
- error_log( serialize( $attributes ) );
31
-
32
  $attributes = $this->parseAttributes(
33
  [
34
  'ids' => [],
@@ -64,7 +62,7 @@ class Shortcode {
64
  /**
65
  * Parse multiple attributes with defualt values and types (infered from the default values).
66
  * @link https://developer.wordpress.org/reference/functions/shortcode_atts/
67
- * @since 2.10.0
68
  * @param array $pairs Entire list of supported attributes and their defaults.
69
  * @param array $attributes User defined attributes.
70
  * @reutrn array
@@ -73,7 +71,7 @@ class Shortcode {
73
 
74
  if ( $attributes ) {
75
  foreach ( $attributes as $key => &$attribute ) {
76
- if ( is_array( $pairs[ $key ] ) ) {
77
  $attribute = $this->parseAttributeArray( $attribute );
78
  }
79
  }
@@ -84,7 +82,7 @@ class Shortcode {
84
 
85
  /**
86
  * Parses an individual attributes as an array (or from a comma-separated string).
87
- * @since 2.10.0
88
  * @param string|array $value
89
  * @return array
90
  */
7
  class Shortcode {
8
 
9
  /**
10
+ * @since 2.9.6 Extracted from harded-coded value in `addShortcode()`.
11
  * @var string Shortcode tag to be searched in post content.
12
  * */
13
  protected $tag = 'give_multi_form_goal';
27
  * @since 2.9.0
28
  **/
29
  public function renderCallback( $attributes ) {
 
 
30
  $attributes = $this->parseAttributes(
31
  [
32
  'ids' => [],
62
  /**
63
  * Parse multiple attributes with defualt values and types (infered from the default values).
64
  * @link https://developer.wordpress.org/reference/functions/shortcode_atts/
65
+ * @since 2.9.6
66
  * @param array $pairs Entire list of supported attributes and their defaults.
67
  * @param array $attributes User defined attributes.
68
  * @reutrn array
71
 
72
  if ( $attributes ) {
73
  foreach ( $attributes as $key => &$attribute ) {
74
+ if ( isset( $pairs[ $key ] ) && is_array( $pairs[ $key ] ) ) {
75
  $attribute = $this->parseAttributeArray( $attribute );
76
  }
77
  }
82
 
83
  /**
84
  * Parses an individual attributes as an array (or from a comma-separated string).
85
+ * @since 2.9.6
86
  * @param string|array $value
87
  * @return array
88
  */
src/Onboarding/Setup/PageView.php CHANGED
@@ -64,7 +64,7 @@ class PageView {
64
  }
65
 
66
  // Stripe unmerged tags.
67
- $output = preg_replace( '/{{\s*.*\s*}}/', '', $output );
68
 
69
  return $output;
70
  }
64
  }
65
 
66
  // Stripe unmerged tags.
67
+ $output = preg_replace( '/{{\s*\w*\s*}}/', '', $output );
68
 
69
  return $output;
70
  }
src/Onboarding/Setup/templates/index.html.php CHANGED
@@ -53,6 +53,7 @@
53
  ! $this->isStripeSetup() ? $this->render_template(
54
  'row-item',
55
  [
 
56
  'class' => ( $this->isPayPalSetup() ) ? 'paypal setup-item-completed' : 'paypal',
57
  'icon' => ( $this->isPayPalSetup() )
58
  ? $this->image( 'check-circle.min.png' )
@@ -79,6 +80,7 @@
79
  ! $this->isPayPalSetup() ? $this->render_template(
80
  'row-item',
81
  [
 
82
  'class' => ( $this->isStripeSetup() ) ? 'stripe setup-item-completed' : 'stripe',
83
  'icon' => ( $this->isStripeSetup() )
84
  ? $this->image( 'check-circle.min.png' )
53
  ! $this->isStripeSetup() ? $this->render_template(
54
  'row-item',
55
  [
56
+ 'testId' => 'paypal',
57
  'class' => ( $this->isPayPalSetup() ) ? 'paypal setup-item-completed' : 'paypal',
58
  'icon' => ( $this->isPayPalSetup() )
59
  ? $this->image( 'check-circle.min.png' )
80
  ! $this->isPayPalSetup() ? $this->render_template(
81
  'row-item',
82
  [
83
+ 'testId' => 'stripe',
84
  'class' => ( $this->isStripeSetup() ) ? 'stripe setup-item-completed' : 'stripe',
85
  'icon' => ( $this->isStripeSetup() )
86
  ? $this->image( 'check-circle.min.png' )
src/PaymentGateways/PayPalCommerce/PayPalCommerce.php CHANGED
@@ -86,7 +86,7 @@ class PayPalCommerce implements PaymentGateway {
86
  /**
87
  * filter the settings
88
  *
89
- * @since 2.10.0
90
  */
91
  return apply_filters( 'give_get_settings_paypal_commerce', $settings );
92
  }
86
  /**
87
  * filter the settings
88
  *
89
+ * @since 2.9.6
90
  */
91
  return apply_filters( 'give_get_settings_paypal_commerce', $settings );
92
  }
src/PaymentGateways/PayPalStandard/PayPalStandard.php CHANGED
@@ -104,7 +104,7 @@ class PayPalStandard implements PaymentGateway {
104
  /**
105
  * filter the settings.
106
  *
107
- * @since 2.10.0
108
  */
109
  return apply_filters( 'give_get_settings_paypal_standard', $setting );
110
  }
104
  /**
105
  * filter the settings.
106
  *
107
+ * @since 2.9.6
108
  */
109
  return apply_filters( 'give_get_settings_paypal_standard', $setting );
110
  }
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit784b6868813ae81544221ba255ec208c::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit411cec03f82b7f6f4e2b3041d95ad647::getLoader();
vendor/composer/ClassLoader.php CHANGED
@@ -42,6 +42,8 @@ namespace Composer\Autoload;
42
  */
43
  class ClassLoader
44
  {
 
 
45
  // PSR-4
46
  private $prefixLengthsPsr4 = array();
47
  private $prefixDirsPsr4 = array();
@@ -57,6 +59,13 @@ class ClassLoader
57
  private $missingClasses = array();
58
  private $apcuPrefix;
59
 
 
 
 
 
 
 
 
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
@@ -300,6 +309,15 @@ class ClassLoader
300
  public function register($prepend = false)
301
  {
302
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
 
 
 
 
 
 
 
 
303
  }
304
 
305
  /**
@@ -308,6 +326,10 @@ class ClassLoader
308
  public function unregister()
309
  {
310
  spl_autoload_unregister(array($this, 'loadClass'));
 
 
 
 
311
  }
312
 
313
  /**
@@ -367,6 +389,16 @@ class ClassLoader
367
  return $file;
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
370
  private function findFileWithExtension($class, $ext)
371
  {
372
  // PSR-4 lookup
42
  */
43
  class ClassLoader
44
  {
45
+ private $vendorDir;
46
+
47
  // PSR-4
48
  private $prefixLengthsPsr4 = array();
49
  private $prefixDirsPsr4 = array();
59
  private $missingClasses = array();
60
  private $apcuPrefix;
61
 
62
+ private static $registeredLoaders = array();
63
+
64
+ public function __construct($vendorDir = null)
65
+ {
66
+ $this->vendorDir = $vendorDir;
67
+ }
68
+
69
  public function getPrefixes()
70
  {
71
  if (!empty($this->prefixesPsr0)) {
309
  public function register($prepend = false)
310
  {
311
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
312
+
313
+ if (null === $this->vendorDir) {
314
+ //no-op
315
+ } elseif ($prepend) {
316
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
317
+ } else {
318
+ unset(self::$registeredLoaders[$this->vendorDir]);
319
+ self::$registeredLoaders[$this->vendorDir] = $this;
320
+ }
321
  }
322
 
323
  /**
326
  public function unregister()
327
  {
328
  spl_autoload_unregister(array($this, 'loadClass'));
329
+
330
+ if (null !== $this->vendorDir) {
331
+ unset(self::$registeredLoaders[$this->vendorDir]);
332
+ }
333
  }
334
 
335
  /**
389
  return $file;
390
  }
391
 
392
+ /**
393
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
394
+ *
395
+ * @return self[]
396
+ */
397
+ public static function getRegisteredLoaders()
398
+ {
399
+ return self::$registeredLoaders;
400
+ }
401
+
402
  private function findFileWithExtension($class, $ext)
403
  {
404
  // PSR-4 lookup
vendor/composer/InstalledVersions.php CHANGED
@@ -12,6 +12,7 @@
12
 
13
  namespace Composer;
14
 
 
15
  use Composer\Semver\VersionParser;
16
 
17
 
@@ -24,33 +25,56 @@ class InstalledVersions
24
  private static $installed = array (
25
  'root' =>
26
  array (
27
- 'pretty_version' => '2.9.6',
28
- 'version' => '2.9.6.0',
29
  'aliases' =>
30
  array (
31
  ),
32
- 'reference' => '69c36170dc5980da07c9ff50eeb6e5b2c931954b',
33
  'name' => 'impress-org/give',
34
  ),
35
  'versions' =>
36
  array (
37
  'composer/installers' =>
38
  array (
39
- 'pretty_version' => 'v1.9.0',
40
- 'version' => '1.9.0.0',
41
  'aliases' =>
42
  array (
43
  ),
44
- 'reference' => 'b93bcf0fa1fccb0b7d176b0967d969691cd74cca',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  ),
46
  'impress-org/give' =>
47
  array (
48
- 'pretty_version' => '2.9.6',
49
- 'version' => '2.9.6.0',
50
  'aliases' =>
51
  array (
52
  ),
53
- 'reference' => '69c36170dc5980da07c9ff50eeb6e5b2c931954b',
54
  ),
55
  'paypal/paypal-checkout-sdk' =>
56
  array (
@@ -104,6 +128,8 @@ private static $installed = array (
104
  ),
105
  ),
106
  );
 
 
107
 
108
 
109
 
@@ -113,7 +139,17 @@ private static $installed = array (
113
 
114
  public static function getInstalledPackages()
115
  {
116
- return array_keys(self::$installed['versions']);
 
 
 
 
 
 
 
 
 
 
117
  }
118
 
119
 
@@ -126,7 +162,13 @@ return array_keys(self::$installed['versions']);
126
 
127
  public static function isInstalled($packageName)
128
  {
129
- return isset(self::$installed['versions'][$packageName]);
 
 
 
 
 
 
130
  }
131
 
132
 
@@ -161,42 +203,50 @@ return $provided->matches($constraint);
161
 
162
  public static function getVersionRanges($packageName)
163
  {
164
- if (!isset(self::$installed['versions'][$packageName])) {
165
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
 
166
  }
167
 
168
  $ranges = array();
169
- if (isset(self::$installed['versions'][$packageName]['pretty_version'])) {
170
- $ranges[] = self::$installed['versions'][$packageName]['pretty_version'];
171
  }
172
- if (array_key_exists('aliases', self::$installed['versions'][$packageName])) {
173
- $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']);
174
  }
175
- if (array_key_exists('replaced', self::$installed['versions'][$packageName])) {
176
- $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']);
177
  }
178
- if (array_key_exists('provided', self::$installed['versions'][$packageName])) {
179
- $ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']);
180
  }
181
 
182
  return implode(' || ', $ranges);
183
  }
184
 
 
 
 
185
 
186
 
187
 
188
 
189
  public static function getVersion($packageName)
190
  {
191
- if (!isset(self::$installed['versions'][$packageName])) {
192
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
 
193
  }
194
 
195
- if (!isset(self::$installed['versions'][$packageName]['version'])) {
196
  return null;
197
  }
198
 
199
- return self::$installed['versions'][$packageName]['version'];
 
 
 
200
  }
201
 
202
 
@@ -205,15 +255,19 @@ return self::$installed['versions'][$packageName]['version'];
205
 
206
  public static function getPrettyVersion($packageName)
207
  {
208
- if (!isset(self::$installed['versions'][$packageName])) {
209
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
 
210
  }
211
 
212
- if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) {
213
  return null;
214
  }
215
 
216
- return self::$installed['versions'][$packageName]['pretty_version'];
 
 
 
217
  }
218
 
219
 
@@ -222,15 +276,19 @@ return self::$installed['versions'][$packageName]['pretty_version'];
222
 
223
  public static function getReference($packageName)
224
  {
225
- if (!isset(self::$installed['versions'][$packageName])) {
226
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
 
227
  }
228
 
229
- if (!isset(self::$installed['versions'][$packageName]['reference'])) {
230
  return null;
231
  }
232
 
233
- return self::$installed['versions'][$packageName]['reference'];
 
 
 
234
  }
235
 
236
 
@@ -239,7 +297,9 @@ return self::$installed['versions'][$packageName]['reference'];
239
 
240
  public static function getRootPackage()
241
  {
242
- return self::$installed['root'];
 
 
243
  }
244
 
245
 
@@ -274,5 +334,33 @@ return self::$installed;
274
  public static function reload($data)
275
  {
276
  self::$installed = $data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
  }
278
  }
12
 
13
  namespace Composer;
14
 
15
+ use Composer\Autoload\ClassLoader;
16
  use Composer\Semver\VersionParser;
17
 
18
 
25
  private static $installed = array (
26
  'root' =>
27
  array (
28
+ 'pretty_version' => '2.9.7',
29
+ 'version' => '2.9.7.0',
30
  'aliases' =>
31
  array (
32
  ),
33
+ 'reference' => '8a1ba3bdba15dbb9574fa8b0866667be25cacb58',
34
  'name' => 'impress-org/give',
35
  ),
36
  'versions' =>
37
  array (
38
  'composer/installers' =>
39
  array (
40
+ 'pretty_version' => 'v1.10.0',
41
+ 'version' => '1.10.0.0',
42
  'aliases' =>
43
  array (
44
  ),
45
+ 'reference' => '1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d',
46
+ ),
47
+ 'ergebnis/faker' =>
48
+ array (
49
+ 'replaced' =>
50
+ array (
51
+ 0 => '1.9.2',
52
+ ),
53
+ ),
54
+ 'fakerphp/faker' =>
55
+ array (
56
+ 'pretty_version' => 'v1.9.2',
57
+ 'version' => '1.9.2.0',
58
+ 'aliases' =>
59
+ array (
60
+ ),
61
+ 'reference' => '84220cf137a9344acffb10374e781fed785ff307',
62
+ ),
63
+ 'fzaninotto/faker' =>
64
+ array (
65
+ 'replaced' =>
66
+ array (
67
+ 0 => '1.9.2',
68
+ ),
69
  ),
70
  'impress-org/give' =>
71
  array (
72
+ 'pretty_version' => '2.9.7',
73
+ 'version' => '2.9.7.0',
74
  'aliases' =>
75
  array (
76
  ),
77
+ 'reference' => '8a1ba3bdba15dbb9574fa8b0866667be25cacb58',
78
  ),
79
  'paypal/paypal-checkout-sdk' =>
80
  array (
128
  ),
129
  ),
130
  );
131
+ private static $canGetVendors;
132
+ private static $installedByVendor = array();
133
 
134
 
135
 
139
 
140
  public static function getInstalledPackages()
141
  {
142
+ $packages = array();
143
+ foreach (self::getInstalled() as $installed) {
144
+ $packages[] = array_keys($installed['versions']);
145
+ }
146
+
147
+
148
+ if (1 === \count($packages)) {
149
+ return $packages[0];
150
+ }
151
+
152
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
153
  }
154
 
155
 
162
 
163
  public static function isInstalled($packageName)
164
  {
165
+ foreach (self::getInstalled() as $installed) {
166
+ if (isset($installed['versions'][$packageName])) {
167
+ return true;
168
+ }
169
+ }
170
+
171
+ return false;
172
  }
173
 
174
 
203
 
204
  public static function getVersionRanges($packageName)
205
  {
206
+ foreach (self::getInstalled() as $installed) {
207
+ if (!isset($installed['versions'][$packageName])) {
208
+ continue;
209
  }
210
 
211
  $ranges = array();
212
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
213
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
214
  }
215
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
216
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
217
  }
218
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
219
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
220
  }
221
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
222
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
223
  }
224
 
225
  return implode(' || ', $ranges);
226
  }
227
 
228
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
229
+ }
230
+
231
 
232
 
233
 
234
 
235
  public static function getVersion($packageName)
236
  {
237
+ foreach (self::getInstalled() as $installed) {
238
+ if (!isset($installed['versions'][$packageName])) {
239
+ continue;
240
  }
241
 
242
+ if (!isset($installed['versions'][$packageName]['version'])) {
243
  return null;
244
  }
245
 
246
+ return $installed['versions'][$packageName]['version'];
247
+ }
248
+
249
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
250
  }
251
 
252
 
255
 
256
  public static function getPrettyVersion($packageName)
257
  {
258
+ foreach (self::getInstalled() as $installed) {
259
+ if (!isset($installed['versions'][$packageName])) {
260
+ continue;
261
  }
262
 
263
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
264
  return null;
265
  }
266
 
267
+ return $installed['versions'][$packageName]['pretty_version'];
268
+ }
269
+
270
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
271
  }
272
 
273
 
276
 
277
  public static function getReference($packageName)
278
  {
279
+ foreach (self::getInstalled() as $installed) {
280
+ if (!isset($installed['versions'][$packageName])) {
281
+ continue;
282
  }
283
 
284
+ if (!isset($installed['versions'][$packageName]['reference'])) {
285
  return null;
286
  }
287
 
288
+ return $installed['versions'][$packageName]['reference'];
289
+ }
290
+
291
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
292
  }
293
 
294
 
297
 
298
  public static function getRootPackage()
299
  {
300
+ $installed = self::getInstalled();
301
+
302
+ return $installed[0]['root'];
303
  }
304
 
305
 
334
  public static function reload($data)
335
  {
336
  self::$installed = $data;
337
+ self::$installedByVendor = array();
338
+ }
339
+
340
+
341
+
342
+
343
+ private static function getInstalled()
344
+ {
345
+ if (null === self::$canGetVendors) {
346
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
347
+ }
348
+
349
+ $installed = array();
350
+
351
+ if (self::$canGetVendors) {
352
+
353
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
354
+ if (isset(self::$installedByVendor[$vendorDir])) {
355
+ $installed[] = self::$installedByVendor[$vendorDir];
356
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
357
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
358
+ }
359
+ }
360
+ }
361
+
362
+ $installed[] = self::$installed;
363
+
364
+ return $installed;
365
  }
366
  }
vendor/composer/autoload_psr4.php CHANGED
@@ -11,5 +11,6 @@ return array(
11
  'PayPalHttp\\' => array($vendorDir . '/paypal/paypalhttp/lib/PayPalHttp'),
12
  'PayPalCheckoutSdk\\' => array($vendorDir . '/paypal/paypal-checkout-sdk/lib/PayPalCheckoutSdk'),
13
  'Give\\' => array($baseDir . '/src'),
 
14
  'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'),
15
  );
11
  'PayPalHttp\\' => array($vendorDir . '/paypal/paypalhttp/lib/PayPalHttp'),
12
  'PayPalCheckoutSdk\\' => array($vendorDir . '/paypal/paypal-checkout-sdk/lib/PayPalCheckoutSdk'),
13
  'Give\\' => array($baseDir . '/src'),
14
+ 'Faker\\' => array($vendorDir . '/fakerphp/faker/src/Faker'),
15
  'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'),
16
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit784b6868813ae81544221ba255ec208c
6
  {
7
  private static $loader;
8
 
@@ -24,15 +24,15 @@ class ComposerAutoloaderInit784b6868813ae81544221ba255ec208c
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
- spl_autoload_register(array('ComposerAutoloaderInit784b6868813ae81544221ba255ec208c', 'loadClassLoader'), true, true);
28
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
29
- spl_autoload_unregister(array('ComposerAutoloaderInit784b6868813ae81544221ba255ec208c', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
  require __DIR__ . '/autoload_static.php';
34
 
35
- call_user_func(\Composer\Autoload\ComposerStaticInit784b6868813ae81544221ba255ec208c::getInitializer($loader));
36
  } else {
37
  $map = require __DIR__ . '/autoload_namespaces.php';
38
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit411cec03f82b7f6f4e2b3041d95ad647
6
  {
7
  private static $loader;
8
 
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
+ spl_autoload_register(array('ComposerAutoloaderInit411cec03f82b7f6f4e2b3041d95ad647', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInit411cec03f82b7f6f4e2b3041d95ad647', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
  require __DIR__ . '/autoload_static.php';
34
 
35
+ call_user_func(\Composer\Autoload\ComposerStaticInit411cec03f82b7f6f4e2b3041d95ad647::getInitializer($loader));
36
  } else {
37
  $map = require __DIR__ . '/autoload_namespaces.php';
38
  foreach ($map as $namespace => $path) {
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit784b6868813ae81544221ba255ec208c
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'S' =>
@@ -21,6 +21,10 @@ class ComposerStaticInit784b6868813ae81544221ba255ec208c
21
  array (
22
  'Give\\' => 5,
23
  ),
 
 
 
 
24
  'C' =>
25
  array (
26
  'Composer\\Installers\\' => 20,
@@ -48,6 +52,10 @@ class ComposerStaticInit784b6868813ae81544221ba255ec208c
48
  array (
49
  0 => __DIR__ . '/../..' . '/src',
50
  ),
 
 
 
 
51
  'Composer\\Installers\\' =>
52
  array (
53
  0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers',
@@ -75,9 +83,9 @@ class ComposerStaticInit784b6868813ae81544221ba255ec208c
75
  public static function getInitializer(ClassLoader $loader)
76
  {
77
  return \Closure::bind(function () use ($loader) {
78
- $loader->prefixLengthsPsr4 = ComposerStaticInit784b6868813ae81544221ba255ec208c::$prefixLengthsPsr4;
79
- $loader->prefixDirsPsr4 = ComposerStaticInit784b6868813ae81544221ba255ec208c::$prefixDirsPsr4;
80
- $loader->classMap = ComposerStaticInit784b6868813ae81544221ba255ec208c::$classMap;
81
 
82
  }, null, ClassLoader::class);
83
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit411cec03f82b7f6f4e2b3041d95ad647
8
  {
9
  public static $prefixLengthsPsr4 = array (
10
  'S' =>
21
  array (
22
  'Give\\' => 5,
23
  ),
24
+ 'F' =>
25
+ array (
26
+ 'Faker\\' => 6,
27
+ ),
28
  'C' =>
29
  array (
30
  'Composer\\Installers\\' => 20,
52
  array (
53
  0 => __DIR__ . '/../..' . '/src',
54
  ),
55
+ 'Faker\\' =>
56
+ array (
57
+ 0 => __DIR__ . '/..' . '/fakerphp/faker/src/Faker',
58
+ ),
59
  'Composer\\Installers\\' =>
60
  array (
61
  0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers',
83
  public static function getInitializer(ClassLoader $loader)
84
  {
85
  return \Closure::bind(function () use ($loader) {
86
+ $loader->prefixLengthsPsr4 = ComposerStaticInit411cec03f82b7f6f4e2b3041d95ad647::$prefixLengthsPsr4;
87
+ $loader->prefixDirsPsr4 = ComposerStaticInit411cec03f82b7f6f4e2b3041d95ad647::$prefixDirsPsr4;
88
+ $loader->classMap = ComposerStaticInit411cec03f82b7f6f4e2b3041d95ad647::$classMap;
89
 
90
  }, null, ClassLoader::class);
91
  }
vendor/composer/installed.json CHANGED
@@ -2,17 +2,17 @@
2
  "packages": [
3
  {
4
  "name": "composer/installers",
5
- "version": "v1.9.0",
6
- "version_normalized": "1.9.0.0",
7
  "source": {
8
  "type": "git",
9
  "url": "https://github.com/composer/installers.git",
10
- "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca"
11
  },
12
  "dist": {
13
  "type": "zip",
14
- "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca",
15
- "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca",
16
  "shasum": ""
17
  },
18
  "require": {
@@ -23,18 +23,19 @@
23
  "shama/baton": "*"
24
  },
25
  "require-dev": {
26
- "composer/composer": "1.6.* || 2.0.*@dev",
27
- "composer/semver": "1.0.* || 2.0.*@dev",
28
- "phpunit/phpunit": "^4.8.36",
29
- "sebastian/comparator": "^1.2.4",
 
30
  "symfony/process": "^2.3"
31
  },
32
- "time": "2020-04-07T06:57:05+00:00",
33
  "type": "composer-plugin",
34
  "extra": {
35
  "class": "Composer\\Installers\\Plugin",
36
  "branch-alias": {
37
- "dev-master": "1.0-dev"
38
  }
39
  },
40
  "installation-source": "dist",
@@ -73,6 +74,7 @@
73
  "Porto",
74
  "RadPHP",
75
  "SMF",
 
76
  "Thelia",
77
  "Whmcs",
78
  "WolfCMS",
@@ -113,6 +115,7 @@
113
  "phpbb",
114
  "piwik",
115
  "ppi",
 
116
  "puppet",
117
  "pxcms",
118
  "reindex",
@@ -133,6 +136,10 @@
133
  "url": "https://packagist.com",
134
  "type": "custom"
135
  },
 
 
 
 
136
  {
137
  "url": "https://tidelift.com/funding/github/packagist/composer/composer",
138
  "type": "tidelift"
@@ -140,6 +147,62 @@
140
  ],
141
  "install-path": "./installers"
142
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  {
144
  "name": "paypal/paypal-checkout-sdk",
145
  "version": "1.0.1",
2
  "packages": [
3
  {
4
  "name": "composer/installers",
5
+ "version": "v1.10.0",
6
+ "version_normalized": "1.10.0.0",
7
  "source": {
8
  "type": "git",
9
  "url": "https://github.com/composer/installers.git",
10
+ "reference": "1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d"
11
  },
12
  "dist": {
13
  "type": "zip",
14
+ "url": "https://api.github.com/repos/composer/installers/zipball/1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d",
15
+ "reference": "1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d",
16
  "shasum": ""
17
  },
18
  "require": {
23
  "shama/baton": "*"
24
  },
25
  "require-dev": {
26
+ "composer/composer": "1.6.* || ^2.0",
27
+ "composer/semver": "^1 || ^3",
28
+ "phpstan/phpstan": "^0.12.55",
29
+ "phpstan/phpstan-phpunit": "^0.12.16",
30
+ "symfony/phpunit-bridge": "^4.2 || ^5",
31
  "symfony/process": "^2.3"
32
  },
33
+ "time": "2021-01-14T11:07:16+00:00",
34
  "type": "composer-plugin",
35
  "extra": {
36
  "class": "Composer\\Installers\\Plugin",
37
  "branch-alias": {
38
+ "dev-main": "1.x-dev"
39
  }
40
  },
41
  "installation-source": "dist",
74
  "Porto",
75
  "RadPHP",
76
  "SMF",
77
+ "Starbug",
78
  "Thelia",
79
  "Whmcs",
80
  "WolfCMS",
115
  "phpbb",
116
  "piwik",
117
  "ppi",
118
+ "processwire",
119
  "puppet",
120
  "pxcms",
121
  "reindex",
136
  "url": "https://packagist.com",
137
  "type": "custom"
138
  },
139
+ {
140
+ "url": "https://github.com/composer",
141
+ "type": "github"
142
+ },
143
  {
144
  "url": "https://tidelift.com/funding/github/packagist/composer/composer",
145
  "type": "tidelift"
147
  ],
148
  "install-path": "./installers"
149
  },
150
+ {
151
+ "name": "fakerphp/faker",
152
+ "version": "v1.9.2",
153
+ "version_normalized": "1.9.2.0",
154
+ "source": {
155
+ "type": "git",
156
+ "url": "https://github.com/FakerPHP/Faker.git",
157
+ "reference": "84220cf137a9344acffb10374e781fed785ff307"
158
+ },
159
+ "dist": {
160
+ "type": "zip",
161
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/84220cf137a9344acffb10374e781fed785ff307",
162
+ "reference": "84220cf137a9344acffb10374e781fed785ff307",
163
+ "shasum": ""
164
+ },
165
+ "require": {
166
+ "php": "^5.3.3 || ^7.0"
167
+ },
168
+ "conflict": {
169
+ "ergebnis/faker": "!=1.9.2",
170
+ "fzaninotto/faker": "!=1.9.2"
171
+ },
172
+ "replace": {
173
+ "ergebnis/faker": "1.9.2",
174
+ "fzaninotto/faker": "1.9.2"
175
+ },
176
+ "require-dev": {
177
+ "ext-intl": "*",
178
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
179
+ "squizlabs/php_codesniffer": "^2.9.2"
180
+ },
181
+ "time": "2020-12-11T14:32:13+00:00",
182
+ "type": "library",
183
+ "installation-source": "dist",
184
+ "autoload": {
185
+ "psr-4": {
186
+ "Faker\\": "src/Faker/"
187
+ }
188
+ },
189
+ "notification-url": "https://packagist.org/downloads/",
190
+ "license": [
191
+ "MIT"
192
+ ],
193
+ "authors": [
194
+ {
195
+ "name": "François Zaninotto"
196
+ }
197
+ ],
198
+ "description": "Faker is a PHP library that generates fake data for you.",
199
+ "keywords": [
200
+ "data",
201
+ "faker",
202
+ "fixtures"
203
+ ],
204
+ "install-path": "../fakerphp/faker"
205
+ },
206
  {
207
  "name": "paypal/paypal-checkout-sdk",
208
  "version": "1.0.1",
vendor/composer/installed.php CHANGED
@@ -1,33 +1,56 @@
1
  <?php return array (
2
  'root' =>
3
  array (
4
- 'pretty_version' => '2.9.6',
5
- 'version' => '2.9.6.0',
6
  'aliases' =>
7
  array (
8
  ),
9
- 'reference' => '69c36170dc5980da07c9ff50eeb6e5b2c931954b',
10
  'name' => 'impress-org/give',
11
  ),
12
  'versions' =>
13
  array (
14
  'composer/installers' =>
15
  array (
16
- 'pretty_version' => 'v1.9.0',
17
- 'version' => '1.9.0.0',
18
  'aliases' =>
19
  array (
20
  ),
21
- 'reference' => 'b93bcf0fa1fccb0b7d176b0967d969691cd74cca',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  ),
23
  'impress-org/give' =>
24
  array (
25
- 'pretty_version' => '2.9.6',
26
- 'version' => '2.9.6.0',
27
  'aliases' =>
28
  array (
29
  ),
30
- 'reference' => '69c36170dc5980da07c9ff50eeb6e5b2c931954b',
31
  ),
32
  'paypal/paypal-checkout-sdk' =>
33
  array (
1
  <?php return array (
2
  'root' =>
3
  array (
4
+ 'pretty_version' => '2.9.7',
5
+ 'version' => '2.9.7.0',
6
  'aliases' =>
7
  array (
8
  ),
9
+ 'reference' => '8a1ba3bdba15dbb9574fa8b0866667be25cacb58',
10
  'name' => 'impress-org/give',
11
  ),
12
  'versions' =>
13
  array (
14
  'composer/installers' =>
15
  array (
16
+ 'pretty_version' => 'v1.10.0',
17
+ 'version' => '1.10.0.0',
18
  'aliases' =>
19
  array (
20
  ),
21
+ 'reference' => '1a0357fccad9d1cc1ea0c9a05b8847fbccccb78d',
22
+ ),
23
+ 'ergebnis/faker' =>
24
+ array (
25
+ 'replaced' =>
26
+ array (
27
+ 0 => '1.9.2',
28
+ ),
29
+ ),
30
+ 'fakerphp/faker' =>
31
+ array (
32
+ 'pretty_version' => 'v1.9.2',
33
+ 'version' => '1.9.2.0',
34
+ 'aliases' =>
35
+ array (
36
+ ),
37
+ 'reference' => '84220cf137a9344acffb10374e781fed785ff307',
38
+ ),
39
+ 'fzaninotto/faker' =>
40
+ array (
41
+ 'replaced' =>
42
+ array (
43
+ 0 => '1.9.2',
44
+ ),
45
  ),
46
  'impress-org/give' =>
47
  array (
48
+ 'pretty_version' => '2.9.7',
49
+ 'version' => '2.9.7.0',
50
  'aliases' =>
51
  array (
52
  ),
53
+ 'reference' => '8a1ba3bdba15dbb9574fa8b0866667be25cacb58',
54
  ),
55
  'paypal/paypal-checkout-sdk' =>
56
  array (
vendor/fakerphp/faker/.github/ISSUE_TEMPLATE/bug_report.md ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ ### Summary
11
+
12
+ <!-- provide a summary here -->
13
+
14
+ ### Versions
15
+
16
+ <!-- Please provide the versions of PHP as well as `fakerphp/faker` on which the issue has been observed -->
17
+
18
+ | | Version |
19
+ |:---------------|:--------|
20
+ | PHP | x.y.z |
21
+ | `fakerphp/faker` | x.y.z |
22
+
23
+ ### Self-enclosed code snippet for reproduction
24
+
25
+ ```php
26
+ <!-- please replace this with a self-enclosed usage example -->
27
+ ```
28
+
29
+ ### Expected output
30
+
31
+ ```txt
32
+ <!-- please replace this with the expected output of your self-enclosed example -->
33
+ ```
34
+
35
+ ### Actual output
36
+
37
+ ```txt
38
+ <!-- please replace this with the actual output of your self-enclosed example -->
39
+ ```
vendor/fakerphp/faker/.github/workflows/continuous-integration.yml ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # https://help.github.com/en/categories/automating-your-workflow-with-github-actions
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - "master"
8
+ tags:
9
+ - "**"
10
+
11
+ name: "Continuous Integration"
12
+
13
+ jobs:
14
+ coding-standards:
15
+ name: "Coding Standards"
16
+
17
+ runs-on: "ubuntu-latest"
18
+
19
+ strategy:
20
+ matrix:
21
+ php-version:
22
+ - "5.3"
23
+
24
+ steps:
25
+ - name: "Checkout"
26
+ uses: "actions/checkout@v2"
27
+
28
+ - name: "Install PHP with extensions"
29
+ uses: "shivammathur/setup-php@v2"
30
+ with:
31
+ coverage: "none"
32
+ extensions: "intl"
33
+ php-version: "${{ matrix.php-version }}"
34
+
35
+ - name: "Determine composer cache directory"
36
+ id: "determine-composer-cache-directory"
37
+ run: "echo \"::set-output name=directory::$(composer config cache-dir)\""
38
+
39
+ - name: "Cache dependencies installed with composer"
40
+ uses: "actions/cache@v1"
41
+ with:
42
+ path: "${{ steps.determine-composer-cache-directory.outputs.directory }}"
43
+ key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
44
+ restore-keys: "php-${{ matrix.php-version }}-composer-"
45
+
46
+ - name: "Install dependencies with composer"
47
+ run: "composer install --no-interaction --no-progress --no-suggest"
48
+
49
+ - name: "Run squizlabs/php_codesniffer"
50
+ run: "vendor/bin/phpcs --standard=PSR2 src -n"
51
+
52
+ tests:
53
+ name: "Tests"
54
+
55
+ runs-on: "ubuntu-latest"
56
+
57
+ strategy:
58
+ matrix:
59
+ php-version:
60
+ - "5.3"
61
+ - "5.4"
62
+ - "5.5"
63
+ - "5.6"
64
+ - "7.0"
65
+ - "7.1"
66
+ - "7.2"
67
+ - "7.3"
68
+ - "7.4"
69
+
70
+ steps:
71
+ - name: "Checkout"
72
+ uses: "actions/checkout@v2"
73
+
74
+ - name: "Install PHP with extensions"
75
+ uses: "shivammathur/setup-php@v2"
76
+ with:
77
+ coverage: "none"
78
+ extensions: "intl"
79
+ ini-values: "memory_limit=-1"
80
+ php-version: "${{ matrix.php-version }}"
81
+
82
+ - name: "Determine composer cache directory"
83
+ id: "determine-composer-cache-directory"
84
+ run: "echo \"::set-output name=directory::$(composer config cache-dir)\""
85
+
86
+ - name: "Cache dependencies installed with composer"
87
+ uses: "actions/cache@v1"
88
+ with:
89
+ path: "${{ steps.determine-composer-cache-directory.outputs.directory }}"
90
+ key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
91
+ restore-keys: "php-${{ matrix.php-version }}-composer-"
92
+
93
+ - name: "Install dependencies with composer"
94
+ run: "composer install --no-interaction --no-progress --no-suggest"
95
+
96
+ - name: "Run tests with phpunit/phpunit"
97
+ run: "vendor/bin/phpunit"
98
+
99
+ code-coverage:
100
+ name: "Code Coverage"
101
+
102
+ runs-on: "ubuntu-latest"
103
+
104
+ strategy:
105
+ matrix:
106
+ php-version:
107
+ - "7.4"
108
+
109
+ steps:
110
+ - name: "Checkout"
111
+ uses: "actions/checkout@v2"
112
+
113
+ - name: "Install PHP with extensions"
114
+ uses: "shivammathur/setup-php@v2"
115
+ with:
116
+ coverage: "xdebug"
117
+ extensions: "intl"
118
+ ini-values: "memory_limit=-1"
119
+ php-version: "${{ matrix.php-version }}"
120
+
121
+ - name: "Determine composer cache directory"
122
+ id: "determine-composer-cache-directory"
123
+ run: "echo \"::set-output name=directory::$(composer config cache-dir)\""
124
+
125
+ - name: "Cache dependencies installed with composer"
126
+ uses: "actions/cache@v1"
127
+ with:
128
+ path: "${{ steps.determine-composer-cache-directory.outputs.directory }}"
129
+ key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
130
+ restore-keys: "php-${{ matrix.php-version }}-composer-"
131
+
132
+ - name: "Install dependencies with composer"
133
+ run: "composer install --no-interaction --no-progress --no-suggest"
134
+
135
+ - name: "Create build directory"
136
+ run: "mkdir -p .build/logs"
137
+
138
+ - name: "Collect code coverage with Xdebug and phpunit/phpunit"
139
+ run: "vendor/bin/phpunit --coverage-clover=.build/logs/clover.xml"
140
+
141
+ - name: "Send code coverage report to Codecov.io"
142
+ env:
143
+ CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
144
+ run: "bash <(curl -s https://codecov.io/bash)"
vendor/fakerphp/faker/LICENSE ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2011 François Zaninotto
2
+ Portions Copyright (c) 2008 Caius Durling
3
+ Portions Copyright (c) 2008 Adam Royle
4
+ Portions Copyright (c) 2008 Fiona Burrows
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
vendor/fakerphp/faker/src/Faker/Calculator/Ean.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Calculator;
4
+
5
+ /**
6
+ * Utility class for validating EAN-8 and EAN-13 numbers
7
+ *
8
+ * @package Faker\Calculator
9
+ */
10
+ class Ean
11
+ {
12
+ /** @var string EAN validation pattern */
13
+ const PATTERN = '/^(?:\d{8}|\d{13})$/';
14
+
15
+ /**
16
+ * Computes the checksum of an EAN number.
17
+ *
18
+ * @see https://en.wikipedia.org/wiki/International_Article_Number
19
+ *
20
+ * @param string $digits
21
+ * @return int
22
+ */
23
+ public static function checksum($digits)
24
+ {
25
+ $length = strlen($digits);
26
+
27
+ $even = 0;
28
+ for ($i = $length - 1; $i >= 0; $i -= 2) {
29
+ $even += $digits[$i];
30
+ }
31
+
32
+ $odd = 0;
33
+ for ($i = $length - 2; $i >= 0; $i -= 2) {
34
+ $odd += $digits[$i];
35
+ }
36
+
37
+ return (10 - ((3 * $even + $odd) % 10)) % 10;
38
+ }
39
+
40
+ /**
41
+ * Checks whether the provided number is an EAN compliant number and that
42
+ * the checksum is correct.
43
+ *
44
+ * @param string $ean An EAN number
45
+ * @return boolean
46
+ */
47
+ public static function isValid($ean)
48
+ {
49
+ if (!preg_match(self::PATTERN, $ean)) {
50
+ return false;
51
+ }
52
+
53
+ return self::checksum(substr($ean, 0, -1)) === intval(substr($ean, -1));
54
+ }
55
+ }
vendor/fakerphp/faker/src/Faker/Calculator/Iban.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Calculator;
4
+
5
+ class Iban
6
+ {
7
+ /**
8
+ * Generates IBAN Checksum
9
+ *
10
+ * @param string $iban
11
+ * @return string Checksum (numeric string)
12
+ */
13
+ public static function checksum($iban)
14
+ {
15
+ // Move first four digits to end and set checksum to '00'
16
+ $checkString = substr($iban, 4) . substr($iban, 0, 2) . '00';
17
+
18
+ // Replace all letters with their number equivalents
19
+ $checkString = preg_replace_callback('/[A-Z]/', array('self','alphaToNumberCallback'), $checkString);
20
+
21
+ // Perform mod 97 and subtract from 98
22
+ $checksum = 98 - self::mod97($checkString);
23
+
24
+ return str_pad($checksum, 2, '0', STR_PAD_LEFT);
25
+ }
26
+
27
+ /**
28
+ * @param string $match
29
+ *
30
+ * @return int
31
+ */
32
+ private static function alphaToNumberCallback($match)
33
+ {
34
+ return self::alphaToNumber($match[0]);
35
+ }
36
+
37
+ /**
38
+ * Converts letter to number
39
+ *
40
+ * @param string $char
41
+ * @return int
42
+ */
43
+ public static function alphaToNumber($char)
44
+ {
45
+ return ord($char) - 55;
46
+ }
47
+
48
+ /**
49
+ * Calculates mod97 on a numeric string
50
+ *
51
+ * @param string $number Numeric string
52
+ * @return int
53
+ */
54
+ public static function mod97($number)
55
+ {
56
+ $checksum = (int)$number[0];
57
+ for ($i = 1, $size = strlen($number); $i < $size; $i++) {
58
+ $checksum = (10 * $checksum + (int) $number[$i]) % 97;
59
+ }
60
+ return $checksum;
61
+ }
62
+
63
+ /**
64
+ * Checks whether an IBAN has a valid checksum
65
+ *
66
+ * @param string $iban
67
+ * @return boolean
68
+ */
69
+ public static function isValid($iban)
70
+ {
71
+ return self::checksum($iban) === substr($iban, 2, 2);
72
+ }
73
+ }
vendor/fakerphp/faker/src/Faker/Calculator/Inn.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Faker\Calculator;
3
+
4
+ class Inn
5
+ {
6
+ /**
7
+ * Generates INN Checksum
8
+ *
9
+ * https://ru.wikipedia.org/wiki/%D0%98%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_%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%89%D0%B8%D0%BA%D0%B0
10
+ *
11
+ * @param string $inn
12
+ * @return string Checksum (one digit)
13
+ */
14
+ public static function checksum($inn)
15
+ {
16
+ $multipliers = array(1 => 2, 2 => 4, 3 => 10, 4 => 3, 5 => 5, 6 => 9, 7 => 4, 8 => 6, 9 => 8);
17
+ $sum = 0;
18
+ for ($i = 1; $i <= 9; $i++) {
19
+ $sum += intval(substr($inn, $i-1, 1)) * $multipliers[$i];
20
+ }
21
+ return strval(($sum % 11) % 10);
22
+ }
23
+
24
+ /**
25
+ * Checks whether an INN has a valid checksum
26
+ *
27
+ * @param string $inn
28
+ * @return boolean
29
+ */
30
+ public static function isValid($inn)
31
+ {
32
+ return self::checksum(substr($inn, 0, -1)) === substr($inn, -1, 1);
33
+ }
34
+ }
vendor/fakerphp/faker/src/Faker/Calculator/Luhn.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Calculator;
4
+
5
+ use InvalidArgumentException;
6
+
7
+ /**
8
+ * Utility class for generating and validating Luhn numbers.
9
+ *
10
+ * Luhn algorithm is used to validate credit card numbers, IMEI numbers, and
11
+ * National Provider Identifier numbers.
12
+ *
13
+ * @see http://en.wikipedia.org/wiki/Luhn_algorithm
14
+ */
15
+ class Luhn
16
+ {
17
+ /**
18
+ * @param string $number
19
+ * @return int
20
+ */
21
+ private static function checksum($number)
22
+ {
23
+ $number = (string) $number;
24
+ $length = strlen($number);
25
+ $sum = 0;
26
+ for ($i = $length - 1; $i >= 0; $i -= 2) {
27
+ $sum += $number[$i];
28
+ }
29
+ for ($i = $length - 2; $i >= 0; $i -= 2) {
30
+ $sum += array_sum(str_split($number[$i] * 2));
31
+ }
32
+
33
+ return $sum % 10;
34
+ }
35
+
36
+ /**
37
+ * @param $partialNumber
38
+ * @return string
39
+ */
40
+ public static function computeCheckDigit($partialNumber)
41
+ {
42
+ $checkDigit = self::checksum($partialNumber . '0');
43
+ if ($checkDigit === 0) {
44
+ return 0;
45
+ }
46
+
47
+ return (string) (10 - $checkDigit);
48
+ }
49
+
50
+ /**
51
+ * Checks whether a number (partial number + check digit) is Luhn compliant
52
+ *
53
+ * @param string $number
54
+ * @return bool
55
+ */
56
+ public static function isValid($number)
57
+ {
58
+ return self::checksum($number) === 0;
59
+ }
60
+
61
+ /**
62
+ * Generate a Luhn compliant number.
63
+ *
64
+ * @param string $partialValue
65
+ *
66
+ * @return string
67
+ */
68
+ public static function generateLuhnNumber($partialValue)
69
+ {
70
+ if (!preg_match('/^\d+$/', $partialValue)) {
71
+ throw new InvalidArgumentException('Argument should be an integer.');
72
+ }
73
+ return $partialValue . Luhn::computeCheckDigit($partialValue);
74
+ }
75
+ }
vendor/fakerphp/faker/src/Faker/Calculator/TCNo.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Calculator;
4
+
5
+ use InvalidArgumentException;
6
+
7
+ class TCNo
8
+ {
9
+ /**
10
+ * Generates Turkish Identity Number Checksum
11
+ * Gets first 9 digit as prefix and calculates checksum
12
+ *
13
+ * https://en.wikipedia.org/wiki/Turkish_Identification_Number
14
+ *
15
+ * @param string $identityPrefix
16
+ * @return string Checksum (two digit)
17
+ */
18
+ public static function checksum($identityPrefix)
19
+ {
20
+ if (strlen((string)$identityPrefix) !== 9) {
21
+ throw new InvalidArgumentException('Argument should be an integer and should be 9 digits.');
22
+ }
23
+
24
+ $oddSum = 0;
25
+ $evenSum = 0;
26
+
27
+ $identityArray = array_map('intval', str_split($identityPrefix)); // Creates array from int
28
+ foreach ($identityArray as $index => $digit) {
29
+ if ($index % 2 == 0) {
30
+ $evenSum += $digit;
31
+ } else {
32
+ $oddSum += $digit;
33
+ }
34
+ }
35
+
36
+ $tenthDigit = (7 * $evenSum - $oddSum) % 10;
37
+ $eleventhDigit = ($evenSum + $oddSum + $tenthDigit) % 10;
38
+
39
+ return $tenthDigit . $eleventhDigit;
40
+ }
41
+
42
+ /**
43
+ * Checks whether a TCNo has a valid checksum
44
+ *
45
+ * @param string $tcNo
46
+ * @return boolean
47
+ */
48
+ public static function isValid($tcNo)
49
+ {
50
+ return self::checksum(substr($tcNo, 0, -2)) === substr($tcNo, -2, 2);
51
+ }
52
+ }
vendor/fakerphp/faker/src/Faker/DefaultGenerator.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker;
4
+
5
+ /**
6
+ * This generator returns a default value for all called properties
7
+ * and methods. It works with Faker\Generator\Base->optional().
8
+ */
9
+ class DefaultGenerator
10
+ {
11
+ protected $default;
12
+
13
+ public function __construct($default = null)
14
+ {
15
+ $this->default = $default;
16
+ }
17
+
18
+ /**
19
+ * @param string $attribute
20
+ *
21
+ * @return mixed
22
+ */
23
+ public function __get($attribute)
24
+ {
25
+ return $this->default;
26
+ }
27
+
28
+ /**
29
+ * @param string $method
30
+ * @param array $attributes
31
+ *
32
+ * @return mixed
33
+ */
34
+ public function __call($method, $attributes)
35
+ {
36
+ return $this->default;
37
+ }
38
+ }
vendor/fakerphp/faker/src/Faker/Documentor.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker;
4
+
5
+ class Documentor
6
+ {
7
+ protected $generator;
8
+
9
+ /**
10
+ * @param Generator $generator
11
+ */
12
+ public function __construct(Generator $generator)
13
+ {
14
+ $this->generator = $generator;
15
+ }
16
+
17
+ /**
18
+ * @return array
19
+ */
20
+ public function getFormatters()
21
+ {
22
+ $formatters = array();
23
+ $providers = array_reverse($this->generator->getProviders());
24
+ $providers[]= new Provider\Base($this->generator);
25
+ foreach ($providers as $provider) {
26
+ $providerClass = get_class($provider);
27
+ $formatters[$providerClass] = array();
28
+ $refl = new \ReflectionObject($provider);
29
+ foreach ($refl->getMethods(\ReflectionMethod::IS_PUBLIC) as $reflmethod) {
30
+ if ($reflmethod->getDeclaringClass()->getName() == 'Faker\Provider\Base' && $providerClass != 'Faker\Provider\Base') {
31
+ continue;
32
+ }
33
+ $methodName = $reflmethod->name;
34
+ if ($reflmethod->isConstructor()) {
35
+ continue;
36
+ }
37
+ $parameters = array();
38
+ foreach ($reflmethod->getParameters() as $reflparameter) {
39
+ $parameter = '$'. $reflparameter->getName();
40
+ if ($reflparameter->isDefaultValueAvailable()) {
41
+ $parameter .= ' = ' . var_export($reflparameter->getDefaultValue(), true);
42
+ }
43
+ $parameters []= $parameter;
44
+ }
45
+ $parameters = $parameters ? '('. join(', ', $parameters) . ')' : '';
46
+ try {
47
+ $example = $this->generator->format($methodName);
48
+ } catch (\InvalidArgumentException $e) {
49
+ $example = '';
50
+ }
51
+ if (is_array($example)) {
52
+ $example = "array('". join("', '", $example) . "')";
53
+ } elseif ($example instanceof \DateTime) {
54
+ $example = "DateTime('" . $example->format('Y-m-d H:i:s') . "')";
55
+ } elseif ($example instanceof Generator || $example instanceof UniqueGenerator) { // modifier
56
+ $example = '';
57
+ } else {
58
+ $example = var_export($example, true);
59
+ }
60
+ $formatters[$providerClass][$methodName . $parameters] = $example;
61
+ }
62
+ }
63
+
64
+ return $formatters;
65
+ }
66
+ }
vendor/fakerphp/faker/src/Faker/Factory.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker;
4
+
5
+ class Factory
6
+ {
7
+ const DEFAULT_LOCALE = 'en_US';
8
+
9
+ protected static $defaultProviders = array('Address', 'Barcode', 'Biased', 'Color', 'Company', 'DateTime', 'File', 'HtmlLorem', 'Image', 'Internet', 'Lorem', 'Miscellaneous', 'Payment', 'Person', 'PhoneNumber', 'Text', 'UserAgent', 'Uuid');
10
+
11
+ /**
12
+ * Create a new generator
13
+ *
14
+ * @param string $locale
15
+ * @return Generator
16
+ */
17
+ public static function create($locale = self::DEFAULT_LOCALE)
18
+ {
19
+ $generator = new Generator();
20
+ foreach (static::$defaultProviders as $provider) {
21
+ $providerClassName = self::getProviderClassname($provider, $locale);
22
+ $generator->addProvider(new $providerClassName($generator));
23
+ }
24
+
25
+ return $generator;
26
+ }
27
+
28
+ /**
29
+ * @param string $provider
30
+ * @param string $locale
31
+ * @return string
32
+ */
33
+ protected static function getProviderClassname($provider, $locale = '')
34
+ {
35
+ if ($providerClass = self::findProviderClassname($provider, $locale)) {
36
+ return $providerClass;
37
+ }
38
+ // fallback to default locale
39
+ if ($providerClass = self::findProviderClassname($provider, static::DEFAULT_LOCALE)) {
40
+ return $providerClass;
41
+ }
42
+ // fallback to no locale
43
+ if ($providerClass = self::findProviderClassname($provider)) {
44
+ return $providerClass;
45
+ }
46
+ throw new \InvalidArgumentException(sprintf('Unable to find provider "%s" with locale "%s"', $provider, $locale));
47
+ }
48
+
49
+ /**
50
+ * @param string $provider
51
+ * @param string $locale
52
+ * @return string
53
+ */
54
+ protected static function findProviderClassname($provider, $locale = '')
55
+ {
56
+ $providerClass = 'Faker\\' . ($locale ? sprintf('Provider\%s\%s', $locale, $provider) : sprintf('Provider\%s', $provider));
57
+ if (class_exists($providerClass, true)) {
58
+ return $providerClass;
59
+ }
60
+ }
61
+ }
vendor/fakerphp/faker/src/Faker/Generator.php ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker;
4
+
5
+ /**
6
+ * @property string $name
7
+ * @method string name(string $gender = null)
8
+ * @property string $firstName
9
+ * @method string firstName(string $gender = null)
10
+ * @property string $firstNameMale
11
+ * @property string $firstNameFemale
12
+ * @property string $lastName
13
+ * @property string $title
14
+ * @method string title(string $gender = null)
15
+ * @property string $titleMale
16
+ * @property string $titleFemale
17
+ *
18
+ * @property string $citySuffix
19
+ * @property string $streetSuffix
20
+ * @property string $buildingNumber
21
+ * @property string $city
22
+ * @property string $streetName
23
+ * @property string $streetAddress
24
+ * @property string $secondaryAddress
25
+ * @property string $postcode
26
+ * @property string $address
27
+ * @property string $state
28
+ * @property string $country
29
+ * @property float $latitude
30
+ * @property float $longitude
31
+ *
32
+ * @property string $ean13
33
+ * @property string $ean8
34
+ * @property string $isbn13
35
+ * @property string $isbn10
36
+ *
37
+ * @property string $phoneNumber
38
+ * @property string $e164PhoneNumber
39
+ *
40
+ * @property string $company
41
+ * @property string $companySuffix
42
+ * @property string $jobTitle
43
+ *
44
+ * @property string $creditCardType
45
+ * @property string $creditCardNumber
46
+ * @method string creditCardNumber($type = null, $formatted = false, $separator = '-')
47
+ * @property \DateTime $creditCardExpirationDate
48
+ * @property string $creditCardExpirationDateString
49
+ * @property array $creditCardDetails
50
+ * @property string $bankAccountNumber
51
+ * @method string iban($countryCode = null, $prefix = '', $length = null)
52
+ * @property string $swiftBicNumber
53
+ * @property string $vat
54
+ *
55
+ * @property string $word
56
+ * @property string|array $words
57
+ * @method string|array words($nb = 3, $asText = false)
58
+ * @method string word()
59
+ * @property string $sentence
60
+ * @method string sentence($nbWords = 6, $variableNbWords = true)
61
+ * @property string|array $sentences
62
+ * @method string|array sentences($nb = 3, $asText = false)
63
+ * @property string $paragraph
64
+ * @method string paragraph($nbSentences = 3, $variableNbSentences = true)
65
+ * @property string|array $paragraphs
66
+ * @method string|array paragraphs($nb = 3, $asText = false)
67
+ * @property string $text
68
+ * @method string text($maxNbChars = 200)
69
+ *
70
+ * @method string realText($maxNbChars = 200, $indexSize = 2)
71
+ *
72
+ * @property string $email
73
+ * @property string $safeEmail
74
+ * @property string $freeEmail
75
+ * @property string $companyEmail
76
+ * @property string $freeEmailDomain
77
+ * @property string $safeEmailDomain
78
+ * @property string $userName
79
+ * @property string $password
80
+ * @method string password($minLength = 6, $maxLength = 20)
81
+ * @property string $domainName
82
+ * @property string $domainWord
83
+ * @property string $tld
84
+ * @property string $url
85
+ * @property string $slug
86
+ * @method string slug($nbWords = 6, $variableNbWords = true)
87
+ * @property string $ipv4
88
+ * @property string $ipv6
89
+ * @property string $localIpv4
90
+ * @property string $macAddress
91
+ *
92
+ * @property int $unixTime
93
+ * @property \DateTime $dateTime
94
+ * @property \DateTime $dateTimeAD
95
+ * @property string $iso8601
96
+ * @property \DateTime $dateTimeThisCentury
97
+ * @property \DateTime $dateTimeThisDecade
98
+ * @property \DateTime $dateTimeThisYear
99
+ * @property \DateTime $dateTimeThisMonth
100
+ * @property string $amPm
101
+ * @property string $dayOfMonth
102
+ * @property string $dayOfWeek
103
+ * @property string $month
104
+ * @property string $monthName
105
+ * @property string $year
106
+ * @property string $century
107
+ * @property string $timezone
108
+ * @method string amPm($max = 'now')
109
+ * @method string date($format = 'Y-m-d', $max = 'now')
110
+ * @method string dayOfMonth($max = 'now')
111
+ * @method string dayOfWeek($max = 'now')
112
+ * @method string iso8601($max = 'now')
113
+ * @method string month($max = 'now')
114
+ * @method string monthName($max = 'now')
115
+ * @method string time($format = 'H:i:s', $max = 'now')
116
+ * @method int unixTime($max = 'now')
117
+ * @method string year($max = 'now')
118
+ * @method \DateTime dateTime($max = 'now', $timezone = null)
119
+ * @method \DateTime dateTimeAd($max = 'now', $timezone = null)
120
+ * @method \DateTime dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null)
121
+ * @method \DateTime dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null)
122
+ * @method \DateTime dateTimeThisCentury($max = 'now', $timezone = null)
123
+ * @method \DateTime dateTimeThisDecade($max = 'now', $timezone = null)
124
+ * @method \DateTime dateTimeThisYear($max = 'now', $timezone = null)
125
+ * @method \DateTime dateTimeThisMonth($max = 'now', $timezone = null)
126
+ *
127
+ * @property string $md5
128
+ * @property string $sha1
129
+ * @property string $sha256
130
+ * @property string $locale
131
+ * @property string $countryCode
132
+ * @property string $countryISOAlpha3
133
+ * @property string $languageCode
134
+ * @property string $currencyCode
135
+ * @property boolean $boolean
136
+ * @method boolean boolean($chanceOfGettingTrue = 50)
137
+ *
138
+ * @property int $randomDigit
139
+ * @property int $randomDigitNot
140
+ * @property int $randomDigitNotNull
141
+ * @property string $randomLetter
142
+ * @property string $randomAscii
143
+ * @method int randomNumber($nbDigits = null, $strict = false)
144
+ * @method int|string|null randomKey(array $array = array())
145
+ * @method int numberBetween($min = 0, $max = 2147483647)
146
+ * @method float randomFloat($nbMaxDecimals = null, $min = 0, $max = null)
147
+ * @method mixed randomElement(array $array = array('a', 'b', 'c'))
148
+ * @method array randomElements(array $array = array('a', 'b', 'c'), $count = 1, $allowDuplicates = false)
149
+ * @method array|string shuffle($arg = '')
150
+ * @method array shuffleArray(array $array = array())
151
+ * @method string shuffleString($string = '', $encoding = 'UTF-8')
152
+ * @method string numerify($string = '###')
153
+ * @method string lexify($string = '????')
154
+ * @method string bothify($string = '## ??')
155
+ * @method string asciify($string = '****')
156
+ * @method string regexify($regex = '')
157
+ * @method string toLower($string = '')
158
+ * @method string toUpper($string = '')
159
+ * @method Generator optional($weight = 0.5, $default = null)
160
+ * @method Generator unique($reset = false, $maxRetries = 10000)
161
+ * @method Generator valid($validator = null, $maxRetries = 10000)
162
+ * @method mixed passthrough($passthrough)
163
+ *
164
+ * @method integer biasedNumberBetween($min = 0, $max = 100, $function = 'sqrt')
165
+ *
166
+ * @property string $macProcessor
167
+ * @property string $linuxProcessor
168
+ * @property string $userAgent
169
+ * @property string $chrome
170
+ * @property string $firefox
171
+ * @property string $safari
172
+ * @property string $opera
173
+ * @property string $internetExplorer
174
+ * @property string $windowsPlatformToken
175
+ * @property string $macPlatformToken
176
+ * @property string $linuxPlatformToken
177
+ *
178
+ * @property string $uuid
179
+ *
180
+ * @property string $mimeType
181
+ * @property string $fileExtension
182
+ * @method string file($sourceDirectory = '/tmp', $targetDirectory = '/tmp', $fullPath = true)
183
+ *
184
+ * @method string imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false)
185
+ * @method string image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null)
186
+ *
187
+ * @property string $hexColor
188
+ * @property string $safeHexColor
189
+ * @property string $rgbColor
190
+ * @property array $rgbColorAsArray
191
+ * @property string $rgbCssColor
192
+ * @property string $safeColorName
193
+ * @property string $colorName
194
+ *
195
+ * @method string randomHtml($maxDepth = 4, $maxWidth = 4)
196
+ *
197
+ */
198
+ class Generator
199
+ {
200
+ protected $providers = array();
201
+ protected $formatters = array();
202
+
203
+ public function addProvider($provider)
204
+ {
205
+ array_unshift($this->providers, $provider);
206
+ }
207
+
208
+ public function getProviders()
209
+ {
210
+ return $this->providers;
211
+ }
212
+
213
+ public function seed($seed = null)
214
+ {
215
+ if ($seed === null) {
216
+ mt_srand();
217
+ } else {
218
+ if (PHP_VERSION_ID < 70100) {
219
+ mt_srand((int) $seed);
220
+ } else {
221
+ mt_srand((int) $seed, MT_RAND_PHP);
222
+ }
223
+ }
224
+ }
225
+
226
+ public function format($formatter, $arguments = array())
227
+ {
228
+ return call_user_func_array($this->getFormatter($formatter), $arguments);
229
+ }
230
+
231
+ /**
232
+ * @param string $formatter
233
+ *
234
+ * @return Callable
235
+ */
236
+ public function getFormatter($formatter)
237
+ {
238
+ if (isset($this->formatters[$formatter])) {
239
+ return $this->formatters[$formatter];
240
+ }
241
+ foreach ($this->providers as $provider) {
242
+ if (method_exists($provider, $formatter)) {
243
+ $this->formatters[$formatter] = array($provider, $formatter);
244
+
245
+ return $this->formatters[$formatter];
246
+ }
247
+ }
248
+ throw new \InvalidArgumentException(sprintf('Unknown formatter "%s"', $formatter));
249
+ }
250
+
251
+ /**
252
+ * Replaces tokens ('{{ tokenName }}') with the result from the token method call
253
+ *
254
+ * @param string $string String that needs to bet parsed
255
+ * @return string
256
+ */
257
+ public function parse($string)
258
+ {
259
+ return preg_replace_callback('/\{\{\s?(\w+)\s?\}\}/u', array($this, 'callFormatWithMatches'), $string);
260
+ }
261
+
262
+ protected function callFormatWithMatches($matches)
263
+ {
264
+ return $this->format($matches[1]);
265
+ }
266
+
267
+ /**
268
+ * @param string $attribute
269
+ *
270
+ * @return mixed
271
+ */
272
+ public function __get($attribute)
273
+ {
274
+ return $this->format($attribute);
275
+ }
276
+
277
+ /**
278
+ * @param string $method
279
+ * @param array $attributes
280
+ *
281
+ * @return mixed
282
+ */
283
+ public function __call($method, $attributes)
284
+ {
285
+ return $this->format($method, $attributes);
286
+ }
287
+
288
+ public function __destruct()
289
+ {
290
+ $this->seed();
291
+ }
292
+
293
+ public function __wakeup()
294
+ {
295
+ $this->formatters = array();
296
+ }
297
+ }
vendor/fakerphp/faker/src/Faker/Guesser/Name.php ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Guesser;
4
+
5
+ use \Faker\Provider\Base;
6
+
7
+ class Name
8
+ {
9
+ protected $generator;
10
+
11
+ /**
12
+ * @param \Faker\Generator $generator
13
+ */
14
+ public function __construct(\Faker\Generator $generator)
15
+ {
16
+ $this->generator = $generator;
17
+ }
18
+
19
+ /**
20
+ * @param string $name
21
+ * @param int|null $size Length of field, if known
22
+ * @return callable
23
+ */
24
+ public function guessFormat($name, $size = null)
25
+ {
26
+ $name = Base::toLower($name);
27
+ $generator = $this->generator;
28
+ if (preg_match('/^is[_A-Z]/', $name)) {
29
+ return function () use ($generator) {
30
+ return $generator->boolean;
31
+ };
32
+ }
33
+ if (preg_match('/(_a|A)t$/', $name)) {
34
+ return function () use ($generator) {
35
+ return $generator->dateTime;
36
+ };
37
+ }
38
+ switch (str_replace('_', '', $name)) {
39
+ case 'firstname':
40
+ return function () use ($generator) {
41
+ return $generator->firstName;
42
+ };
43
+ case 'lastname':
44
+ return function () use ($generator) {
45
+ return $generator->lastName;
46
+ };
47
+ case 'username':
48
+ case 'login':
49
+ return function () use ($generator) {
50
+ return $generator->userName;
51
+ };
52
+ case 'email':
53
+ case 'emailaddress':
54
+ return function () use ($generator) {
55
+ return $generator->email;
56
+ };
57
+ case 'phonenumber':
58
+ case 'phone':
59
+ case 'telephone':
60
+ case 'telnumber':
61
+ return function () use ($generator) {
62
+ return $generator->phoneNumber;
63
+ };
64
+ case 'address':
65
+ return function () use ($generator) {
66
+ return $generator->address;
67
+ };
68
+ case 'city':
69
+ case 'town':
70
+ return function () use ($generator) {
71
+ return $generator->city;
72
+ };
73
+ case 'streetaddress':
74
+ return function () use ($generator) {
75
+ return $generator->streetAddress;
76
+ };
77
+ case 'postcode':
78
+ case 'zipcode':
79
+ return function () use ($generator) {
80
+ return $generator->postcode;
81
+ };
82
+ case 'state':
83
+ return function () use ($generator) {
84
+ return $generator->state;
85
+ };
86
+ case 'county':
87
+ if ($this->generator->locale == 'en_US') {
88
+ return function () use ($generator) {
89
+ return sprintf('%s County', $generator->city);
90
+ };
91
+ }
92
+
93
+ return function () use ($generator) {
94
+ return $generator->state;
95
+ };
96
+ case 'country':
97
+ switch ($size) {
98
+ case 2:
99
+ return function () use ($generator) {
100
+ return $generator->countryCode;
101
+ };
102
+ case 3:
103
+ return function () use ($generator) {
104
+ return $generator->countryISOAlpha3;
105
+ };
106
+ case 5:
107
+ case 6:
108
+ return function () use ($generator) {
109
+ return $generator->locale;
110
+ };
111
+ default:
112
+ return function () use ($generator) {
113
+ return $generator->country;
114
+ };
115
+ }
116
+ break;
117
+ case 'locale':
118
+ return function () use ($generator) {
119
+ return $generator->locale;
120
+ };
121
+ case 'currency':
122
+ case 'currencycode':
123
+ return function () use ($generator) {
124
+ return $generator->currencyCode;
125
+ };
126
+ case 'url':
127
+ case 'website':
128
+ return function () use ($generator) {
129
+ return $generator->url;
130
+ };
131
+ case 'company':
132
+ case 'companyname':
133
+ case 'employer':
134
+ return function () use ($generator) {
135
+ return $generator->company;
136
+ };
137
+ case 'title':
138
+ if ($size !== null && $size <= 10) {
139
+ return function () use ($generator) {
140
+ return $generator->title;
141
+ };
142
+ }
143
+
144
+ return function () use ($generator) {
145
+ return $generator->sentence;
146
+ };
147
+ case 'body':
148
+ case 'summary':
149
+ case 'article':
150
+ case 'description':
151
+ return function () use ($generator) {
152
+ return $generator->text;
153
+ };
154
+ }
155
+ }
156
+ }
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/ColumnTypeGuesser.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\CakePHP;
4
+
5
+ class ColumnTypeGuesser
6
+ {
7
+ protected $generator;
8
+
9
+ public function __construct(\Faker\Generator $generator)
10
+ {
11
+ $this->generator = $generator;
12
+ }
13
+
14
+ /**
15
+ * @return \Closure|null
16
+ */
17
+ public function guessFormat($column, $table)
18
+ {
19
+ $generator = $this->generator;
20
+ $schema = $table->schema();
21
+
22
+ switch ($schema->columnType($column)) {
23
+ case 'boolean':
24
+ return function () use ($generator) {
25
+ return $generator->boolean;
26
+ };
27
+ case 'integer':
28
+ return function () {
29
+ return mt_rand(0, intval('2147483647'));
30
+ };
31
+ case 'biginteger':
32
+ return function () {
33
+ return mt_rand(0, intval('9223372036854775807'));
34
+ };
35
+ case 'decimal':
36
+ case 'float':
37
+ return function () use ($generator) {
38
+ return $generator->randomFloat();
39
+ };
40
+ case 'uuid':
41
+ return function () use ($generator) {
42
+ return $generator->uuid();
43
+ };
44
+ case 'string':
45
+ if (method_exists($schema, 'getColumn')) {
46
+ $columnData = $schema->getColumn($column);
47
+ } else {
48
+ $columnData = $schema->column($column);
49
+ }
50
+ $length = $columnData['length'];
51
+ return function () use ($generator, $length) {
52
+ return $generator->text($length);
53
+ };
54
+ case 'text':
55
+ return function () use ($generator) {
56
+ return $generator->text();
57
+ };
58
+ case 'date':
59
+ case 'datetime':
60
+ case 'timestamp':
61
+ case 'time':
62
+ return function () use ($generator) {
63
+ return $generator->datetime();
64
+ };
65
+
66
+ case 'binary':
67
+ default:
68
+ return null;
69
+ }
70
+ }
71
+ }
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/EntityPopulator.php ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\CakePHP;
4
+
5
+ use Cake\ORM\TableRegistry;
6
+
7
+ class EntityPopulator
8
+ {
9
+ protected $class;
10
+ protected $connectionName;
11
+ protected $columnFormatters = [];
12
+ protected $modifiers = [];
13
+
14
+ public function __construct($class)
15
+ {
16
+ $this->class = $class;
17
+ }
18
+
19
+ /**
20
+ * @param string $name
21
+ */
22
+ public function __get($name)
23
+ {
24
+ return $this->{$name};
25
+ }
26
+
27
+ /**
28
+ * @param string $name
29
+ */
30
+ public function __set($name, $value)
31
+ {
32
+ $this->{$name} = $value;
33
+ }
34
+
35
+ public function mergeColumnFormattersWith($columnFormatters)
36
+ {
37
+ $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
38
+ }
39
+
40
+ public function mergeModifiersWith($modifiers)
41
+ {
42
+ $this->modifiers = array_merge($this->modifiers, $modifiers);
43
+ }
44
+
45
+ /**
46
+ * @return array
47
+ */
48
+ public function guessColumnFormatters($populator)
49
+ {
50
+ $formatters = [];
51
+ $class = $this->class;
52
+ $table = $this->getTable($class);
53
+ $schema = $table->schema();
54
+ $pk = $schema->primaryKey();
55
+ $guessers = $populator->getGuessers() + ['ColumnTypeGuesser' => new ColumnTypeGuesser($populator->getGenerator())];
56
+ $isForeignKey = function ($column) use ($table) {
57
+ foreach ($table->associations()->type('BelongsTo') as $assoc) {
58
+ if ($column == $assoc->foreignKey()) {
59
+ return true;
60
+ }
61
+ }
62
+ return false;
63
+ };
64
+
65
+
66
+ foreach ($schema->columns() as $column) {
67
+ if ($column == $pk[0] || $isForeignKey($column)) {
68
+ continue;
69
+ }
70
+
71
+ foreach ($guessers as $guesser) {
72
+ if ($formatter = $guesser->guessFormat($column, $table)) {
73
+ $formatters[$column] = $formatter;
74
+ break;
75
+ }
76
+ }
77
+ }
78
+
79
+ return $formatters;
80
+ }
81
+
82
+ /**
83
+ * @return array
84
+ */
85
+ public function guessModifiers()
86
+ {
87
+ $modifiers = [];
88
+ $table = $this->getTable($this->class);
89
+
90
+ $belongsTo = $table->associations()->type('BelongsTo');
91
+ foreach ($belongsTo as $assoc) {
92
+ $modifiers['belongsTo' . $assoc->name()] = function ($data, $insertedEntities) use ($assoc) {
93
+ $table = $assoc->target();
94
+ $foreignModel = $table->alias();
95
+
96
+ $foreignKeys = [];
97
+ if (!empty($insertedEntities[$foreignModel])) {
98
+ $foreignKeys = $insertedEntities[$foreignModel];
99
+ } else {
100
+ $foreignKeys = $table->find('all')
101
+ ->select(['id'])
102
+ ->map(function ($row) {
103
+ return $row->id;
104
+ })
105
+ ->toArray();
106
+ }
107
+
108
+ if (empty($foreignKeys)) {
109
+ throw new \Exception(sprintf('%s belongsTo %s, which seems empty at this point.', $this->getTable($this->class)->table(), $assoc->table()));
110
+ }
111
+
112
+ $foreignKey = $foreignKeys[array_rand($foreignKeys)];
113
+ $data[$assoc->foreignKey()] = $foreignKey;
114
+ return $data;
115
+ };
116
+ }
117
+
118
+ // TODO check if TreeBehavior attached to modify lft/rgt cols
119
+
120
+ return $modifiers;
121
+ }
122
+
123
+ /**
124
+ * @param array $options
125
+ */
126
+ public function execute($class, $insertedEntities, $options = [])
127
+ {
128
+ $table = $this->getTable($class);
129
+ $entity = $table->newEntity();
130
+
131
+ foreach ($this->columnFormatters as $column => $format) {
132
+ if (!is_null($format)) {
133
+ $entity->{$column} = is_callable($format) ? $format($insertedEntities, $table) : $format;
134
+ }
135
+ }
136
+
137
+ foreach ($this->modifiers as $modifier) {
138
+ $entity = $modifier($entity, $insertedEntities);
139
+ }
140
+
141
+ if (!$entity = $table->save($entity, $options)) {
142
+ throw new \RuntimeException("Failed saving $class record");
143
+ }
144
+
145
+ $pk = $table->primaryKey();
146
+ if (is_string($pk)) {
147
+ return $entity->{$pk};
148
+ }
149
+
150
+ return $entity->{$pk[0]};
151
+ }
152
+
153
+ public function setConnection($name)
154
+ {
155
+ $this->connectionName = $name;
156
+ }
157
+
158
+ protected function getTable($class)
159
+ {
160
+ $options = [];
161
+ if (!empty($this->connectionName)) {
162
+ $options['connection'] = $this->connectionName;
163
+ }
164
+ return TableRegistry::get($class, $options);
165
+ }
166
+ }
vendor/fakerphp/faker/src/Faker/ORM/CakePHP/Populator.php ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\CakePHP;
4
+
5
+ class Populator
6
+ {
7
+
8
+ protected $generator;
9
+ protected $entities = [];
10
+ protected $quantities = [];
11
+ protected $guessers = [];
12
+
13
+ /**
14
+ * @param \Faker\Generator $generator
15
+ */
16
+ public function __construct(\Faker\Generator $generator)
17
+ {
18
+ $this->generator = $generator;
19
+ }
20
+
21
+ /**
22
+ * @return \Faker\Generator
23
+ */
24
+ public function getGenerator()
25
+ {
26
+ return $this->generator;
27
+ }
28
+
29
+ /**
30
+ * @return array
31
+ */
32
+ public function getGuessers()
33
+ {
34
+ return $this->guessers;
35
+ }
36
+
37
+ /**
38
+ * @return $this
39
+ */
40
+ public function removeGuesser($name)
41
+ {
42
+ if ($this->guessers[$name]) {
43
+ unset($this->guessers[$name]);
44
+ }
45
+ return $this;
46
+ }
47
+
48
+ /**
49
+ * @return $this
50
+ * @throws \Exception
51
+ */
52
+ public function addGuesser($class)
53
+ {
54
+ if (!is_object($class)) {
55
+ $class = new $class($this->generator);
56
+ }
57
+
58
+ if (!method_exists($class, 'guessFormat')) {
59
+ throw new \Exception('Missing required custom guesser method: ' . get_class($class) . '::guessFormat()');
60
+ }
61
+
62
+ $this->guessers[get_class($class)] = $class;
63
+ return $this;
64
+ }
65
+
66
+ /**
67
+ * @param array $customColumnFormatters
68
+ * @param array $customModifiers
69
+ * @return $this
70
+ */
71
+ public function addEntity($entity, $number, $customColumnFormatters = [], $customModifiers = [])
72
+ {
73
+ if (!$entity instanceof EntityPopulator) {
74
+ $entity = new EntityPopulator($entity);
75
+ }
76
+
77
+ $entity->columnFormatters = $entity->guessColumnFormatters($this);
78
+ if ($customColumnFormatters) {
79
+ $entity->mergeColumnFormattersWith($customColumnFormatters);
80
+ }
81
+
82
+ $entity->modifiers = $entity->guessModifiers($this);
83
+ if ($customModifiers) {
84
+ $entity->mergeModifiersWith($customModifiers);
85
+ }
86
+
87
+ $class = $entity->class;
88
+ $this->entities[$class] = $entity;
89
+ $this->quantities[$class] = $number;
90
+ return $this;
91
+ }
92
+
93
+ /**
94
+ * @param array $options
95
+ * @return array
96
+ */
97
+ public function execute($options = [])
98
+ {
99
+ $insertedEntities = [];
100
+
101
+ foreach ($this->quantities as $class => $number) {
102
+ for ($i = 0; $i < $number; $i++) {
103
+ $insertedEntities[$class][] = $this->entities[$class]->execute($class, $insertedEntities, $options);
104
+ }
105
+ }
106
+
107
+ return $insertedEntities;
108
+ }
109
+ }
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/ColumnTypeGuesser.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Doctrine;
4
+
5
+ use Doctrine\Common\Persistence\Mapping\ClassMetadata;
6
+
7
+ class ColumnTypeGuesser
8
+ {
9
+ protected $generator;
10
+
11
+ /**
12
+ * @param \Faker\Generator $generator
13
+ */
14
+ public function __construct(\Faker\Generator $generator)
15
+ {
16
+ $this->generator = $generator;
17
+ }
18
+
19
+ /**
20
+ * @param ClassMetadata $class
21
+ * @return \Closure|null
22
+ */
23
+ public function guessFormat($fieldName, ClassMetadata $class)
24
+ {
25
+ $generator = $this->generator;
26
+ $type = $class->getTypeOfField($fieldName);
27
+ switch ($type) {
28
+ case 'boolean':
29
+ return function () use ($generator) {
30
+ return $generator->boolean;
31
+ };
32
+ case 'decimal':
33
+ $size = isset($class->fieldMappings[$fieldName]['precision']) ? $class->fieldMappings[$fieldName]['precision'] : 2;
34
+
35
+ return function () use ($generator, $size) {
36
+ return $generator->randomNumber($size + 2) / 100;
37
+ };
38
+ case 'smallint':
39
+ return function () {
40
+ return mt_rand(0, 65535);
41
+ };
42
+ case 'integer':
43
+ return function () {
44
+ return mt_rand(0, intval('2147483647'));
45
+ };
46
+ case 'bigint':
47
+ return function () {
48
+ return mt_rand(0, intval('18446744073709551615'));
49
+ };
50
+ case 'float':
51
+ return function () {
52
+ return mt_rand(0, intval('4294967295'))/mt_rand(1, intval('4294967295'));
53
+ };
54
+ case 'string':
55
+ $size = isset($class->fieldMappings[$fieldName]['length']) ? $class->fieldMappings[$fieldName]['length'] : 255;
56
+
57
+ return function () use ($generator, $size) {
58
+ return $generator->text($size);
59
+ };
60
+ case 'text':
61
+ return function () use ($generator) {
62
+ return $generator->text;
63
+ };
64
+ case 'datetime':
65
+ case 'date':
66
+ case 'time':
67
+ return function () use ($generator) {
68
+ return $generator->datetime;
69
+ };
70
+ case 'datetime_immutable':
71
+ case 'date_immutable':
72
+ case 'time_immutable':
73
+ return function () use ($generator) {
74
+ return \DateTimeImmutable::createFromMutable($generator->datetime);
75
+ };
76
+ default:
77
+ // no smart way to guess what the user expects here
78
+ return null;
79
+ }
80
+ }
81
+ }
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/EntityPopulator.php ADDED
@@ -0,0 +1,251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Doctrine;
4
+
5
+ use Doctrine\Common\Persistence\ObjectManager;
6
+ use Doctrine\Common\Persistence\Mapping\ClassMetadata;
7
+
8
+ /**
9
+ * Service class for populating a table through a Doctrine Entity class.
10
+ */
11
+ class EntityPopulator
12
+ {
13
+ /**
14
+ * @var ClassMetadata
15
+ */
16
+ protected $class;
17
+ /**
18
+ * @var array
19
+ */
20
+ protected $columnFormatters = array();
21
+ /**
22
+ * @var array
23
+ */
24
+ protected $modifiers = array();
25
+
26
+ /**
27
+ * Class constructor.
28
+ *
29
+ * @param ClassMetadata $class
30
+ */
31
+ public function __construct(ClassMetadata $class)
32
+ {
33
+ $this->class = $class;
34
+ }
35
+
36
+ /**
37
+ * @return string
38
+ */
39
+ public function getClass()
40
+ {
41
+ return $this->class->getName();
42
+ }
43
+
44
+ /**
45
+ * @param $columnFormatters
46
+ */
47
+ public function setColumnFormatters($columnFormatters)
48
+ {
49
+ $this->columnFormatters = $columnFormatters;
50
+ }
51
+
52
+ /**
53
+ * @return array
54
+ */
55
+ public function getColumnFormatters()
56
+ {
57
+ return $this->columnFormatters;
58
+ }
59
+
60
+ public function mergeColumnFormattersWith($columnFormatters)
61
+ {
62
+ $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
63
+ }
64
+
65
+ /**
66
+ * @param array $modifiers
67
+ */
68
+ public function setModifiers(array $modifiers)
69
+ {
70
+ $this->modifiers = $modifiers;
71
+ }
72
+
73
+ /**
74
+ * @return array
75
+ */
76
+ public function getModifiers()
77
+ {
78
+ return $this->modifiers;
79
+ }
80
+
81
+ /**
82
+ * @param array $modifiers
83
+ */
84
+ public function mergeModifiersWith(array $modifiers)
85
+ {
86
+ $this->modifiers = array_merge($this->modifiers, $modifiers);
87
+ }
88
+
89
+ /**
90
+ * @param \Faker\Generator $generator
91
+ * @return array
92
+ */
93
+ public function guessColumnFormatters(\Faker\Generator $generator)
94
+ {
95
+ $formatters = array();
96
+ $nameGuesser = new \Faker\Guesser\Name($generator);
97
+ $columnTypeGuesser = new ColumnTypeGuesser($generator);
98
+ foreach ($this->class->getFieldNames() as $fieldName) {
99
+ if ($this->class->isIdentifier($fieldName) || !$this->class->hasField($fieldName)) {
100
+ continue;
101
+ }
102
+
103
+ $size = isset($this->class->fieldMappings[$fieldName]['length']) ? $this->class->fieldMappings[$fieldName]['length'] : null;
104
+ if ($formatter = $nameGuesser->guessFormat($fieldName, $size)) {
105
+ $formatters[$fieldName] = $formatter;
106
+ continue;
107
+ }
108
+ if ($formatter = $columnTypeGuesser->guessFormat($fieldName, $this->class)) {
109
+ $formatters[$fieldName] = $formatter;
110
+ continue;
111
+ }
112
+ }
113
+
114
+ foreach ($this->class->getAssociationNames() as $assocName) {
115
+ if ($this->class->isCollectionValuedAssociation($assocName)) {
116
+ continue;
117
+ }
118
+
119
+ $relatedClass = $this->class->getAssociationTargetClass($assocName);
120
+
121
+ $unique = $optional = false;
122
+ if ($this->class instanceof \Doctrine\ORM\Mapping\ClassMetadata) {
123
+ $mappings = $this->class->getAssociationMappings();
124
+ foreach ($mappings as $mapping) {
125
+ if ($mapping['targetEntity'] == $relatedClass) {
126
+ if ($mapping['type'] == \Doctrine\ORM\Mapping\ClassMetadata::ONE_TO_ONE) {
127
+ $unique = true;
128
+ $optional = isset($mapping['joinColumns'][0]['nullable']) ? $mapping['joinColumns'][0]['nullable'] : false;
129
+ break;
130
+ }
131
+ }
132
+ }
133
+ } elseif ($this->class instanceof \Doctrine\ODM\MongoDB\Mapping\ClassMetadata) {
134
+ $mappings = $this->class->associationMappings;
135
+ foreach ($mappings as $mapping) {
136
+ if ($mapping['targetDocument'] == $relatedClass) {
137
+ if ($mapping['type'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::ONE && $mapping['association'] == \Doctrine\ODM\MongoDB\Mapping\ClassMetadata::REFERENCE_ONE) {
138
+ $unique = true;
139
+ $optional = isset($mapping['nullable']) ? $mapping['nullable'] : false;
140
+ break;
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ $index = 0;
147
+ $formatters[$assocName] = function ($inserted) use ($relatedClass, &$index, $unique, $optional) {
148
+
149
+ if (isset($inserted[$relatedClass])) {
150
+ if ($unique) {
151
+ $related = null;
152
+ if (isset($inserted[$relatedClass][$index]) || !$optional) {
153
+ $related = $inserted[$relatedClass][$index];
154
+ }
155
+
156
+ $index++;
157
+
158
+ return $related;
159
+ }
160
+
161
+ return $inserted[$relatedClass][mt_rand(0, count($inserted[$relatedClass]) - 1)];
162
+ }
163
+
164
+ return null;
165
+ };
166
+ }
167
+
168
+ return $formatters;
169
+ }
170
+
171
+ /**
172
+ * Insert one new record using the Entity class.
173
+ * @param ObjectManager $manager
174
+ * @param bool $generateId
175
+ * @return EntityPopulator
176
+ */
177
+ public function execute(ObjectManager $manager, $insertedEntities, $generateId = false)
178
+ {
179
+ $obj = $this->class->newInstance();
180
+
181
+ $this->fillColumns($obj, $insertedEntities);
182
+ $this->callMethods($obj, $insertedEntities);
183
+
184
+ if ($generateId) {
185
+ $idsName = $this->class->getIdentifier();
186
+ foreach ($idsName as $idName) {
187
+ $id = $this->generateId($obj, $idName, $manager);
188
+ $this->class->reflFields[$idName]->setValue($obj, $id);
189
+ }
190
+ }
191
+
192
+ $manager->persist($obj);
193
+
194
+ return $obj;
195
+ }
196
+
197
+ private function fillColumns($obj, $insertedEntities)
198
+ {
199
+ foreach ($this->columnFormatters as $field => $format) {
200
+ if (null !== $format) {
201
+ // Add some extended debugging information to any errors thrown by the formatter
202
+ try {
203
+ $value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
204
+ } catch (\InvalidArgumentException $ex) {
205
+ throw new \InvalidArgumentException(sprintf(
206
+ "Failed to generate a value for %s::%s: %s",
207
+ get_class($obj),
208
+ $field,
209
+ $ex->getMessage()
210
+ ));
211
+ }
212
+ // Try a standard setter if it's available, otherwise fall back on reflection
213
+ $setter = sprintf("set%s", ucfirst($field));
214
+ if (is_callable(array($obj, $setter))) {
215
+ $obj->$setter($value);
216
+ } else {
217
+ $this->class->reflFields[$field]->setValue($obj, $value);
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ private function callMethods($obj, $insertedEntities)
224
+ {
225
+ foreach ($this->getModifiers() as $modifier) {
226
+ $modifier($obj, $insertedEntities);
227
+ }
228
+ }
229
+
230
+ /**
231
+ * @param ObjectManager $manager
232
+ * @return int|null
233
+ */
234
+ private function generateId($obj, $column, ObjectManager $manager)
235
+ {
236
+ /* @var $repository \Doctrine\Common\Persistence\ObjectRepository */
237
+ $repository = $manager->getRepository(get_class($obj));
238
+ $result = $repository->createQueryBuilder('e')
239
+ ->select(sprintf('e.%s', $column))
240
+ ->getQuery()
241
+ ->execute();
242
+ $ids = array_map('current', $result->toArray());
243
+
244
+ $id = null;
245
+ do {
246
+ $id = mt_rand();
247
+ } while (in_array($id, $ids));
248
+
249
+ return $id;
250
+ }
251
+ }
vendor/fakerphp/faker/src/Faker/ORM/Doctrine/Populator.php ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Doctrine;
4
+
5
+ use Doctrine\Common\Persistence\ObjectManager;
6
+ use Faker\Generator;
7
+
8
+ /**
9
+ * Service class for populating a database using the Doctrine ORM or ODM.
10
+ * A Populator can populate several tables using ActiveRecord classes.
11
+ */
12
+ class Populator
13
+ {
14
+ /** @var int */
15
+ protected $batchSize;
16
+
17
+ /** @var Generator */
18
+ protected $generator;
19
+
20
+ /** @var ObjectManager|null */
21
+ protected $manager;
22
+
23
+ /** @var array */
24
+ protected $entities = array();
25
+
26
+ /** @var array */
27
+ protected $quantities = array();
28
+
29
+ /** @var array */
30
+ protected $generateId = array();
31
+
32
+ /**
33
+ * Populator constructor.
34
+ * @param Generator $generator
35
+ * @param ObjectManager|null $manager
36
+ * @param int $batchSize
37
+ */
38
+ public function __construct(Generator $generator, ObjectManager $manager = null, $batchSize = 1000)
39
+ {
40
+ $this->generator = $generator;
41
+ $this->manager = $manager;
42
+ $this->batchSize = $batchSize;
43
+ }
44
+
45
+ /**
46
+ * Add an order for the generation of $number records for $entity.
47
+ *
48
+ * @param mixed $entity A Doctrine classname, or a \Faker\ORM\Doctrine\EntityPopulator instance
49
+ * @param int $number The number of entities to populate
50
+ */
51
+ public function addEntity($entity, $number, $customColumnFormatters = array(), $customModifiers = array(), $generateId = false)
52
+ {
53
+ if (!$entity instanceof \Faker\ORM\Doctrine\EntityPopulator) {
54
+ if (null === $this->manager) {
55
+ throw new \InvalidArgumentException("No entity manager passed to Doctrine Populator.");
56
+ }
57
+ $entity = new \Faker\ORM\Doctrine\EntityPopulator($this->manager->getClassMetadata($entity));
58
+ }
59
+ $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator));
60
+ if ($customColumnFormatters) {
61
+ $entity->mergeColumnFormattersWith($customColumnFormatters);
62
+ }
63
+ $entity->mergeModifiersWith($customModifiers);
64
+ $this->generateId[$entity->getClass()] = $generateId;
65
+
66
+ $class = $entity->getClass();
67
+ $this->entities[$class] = $entity;
68
+ $this->quantities[$class] = $number;
69
+ }
70
+
71
+ /**
72
+ * Populate the database using all the Entity classes previously added.
73
+ *
74
+ * Please note that large amounts of data will result in more memory usage since the the Populator will return
75
+ * all newly created primary keys after executing.
76
+ *
77
+ * @param null|EntityManager $entityManager A Doctrine connection object
78
+ *
79
+ * @return array A list of the inserted PKs
80
+ */
81
+ public function execute($entityManager = null)
82
+ {
83
+ if (null === $entityManager) {
84
+ $entityManager = $this->manager;
85
+ }
86
+ if (null === $entityManager) {
87
+ throw new \InvalidArgumentException("No entity manager passed to Doctrine Populator.");
88
+ }
89
+
90
+ $insertedEntities = array();
91
+ foreach ($this->quantities as $class => $number) {
92
+ $generateId = $this->generateId[$class];
93
+ for ($i=0; $i < $number; $i++) {
94
+ $insertedEntities[$class][]= $this->entities[$class]->execute(
95
+ $entityManager,
96
+ $insertedEntities,
97
+ $generateId
98
+ );
99
+ if (count($insertedEntities) % $this->batchSize === 0) {
100
+ $entityManager->flush();
101
+ $entityManager->clear($class);
102
+ }
103
+ }
104
+ $entityManager->flush();
105
+ $entityManager->clear($class);
106
+ }
107
+
108
+ return $insertedEntities;
109
+ }
110
+ }
vendor/fakerphp/faker/src/Faker/ORM/Mandango/ColumnTypeGuesser.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Mandango;
4
+
5
+ class ColumnTypeGuesser
6
+ {
7
+ protected $generator;
8
+
9
+ /**
10
+ * @param \Faker\Generator $generator
11
+ */
12
+ public function __construct(\Faker\Generator $generator)
13
+ {
14
+ $this->generator = $generator;
15
+ }
16
+
17
+ /**
18
+ * @return \Closure|null
19
+ */
20
+ public function guessFormat($field)
21
+ {
22
+ $generator = $this->generator;
23
+ switch ($field['type']) {
24
+ case 'boolean':
25
+ return function () use ($generator) {
26
+ return $generator->boolean;
27
+ };
28
+ case 'integer':
29
+ return function () {
30
+ return mt_rand(0, intval('4294967295'));
31
+ };
32
+ case 'float':
33
+ return function () {
34
+ return mt_rand(0, intval('4294967295'))/mt_rand(1, intval('4294967295'));
35
+ };
36
+ case 'string':
37
+ return function () use ($generator) {
38
+ return $generator->text(255);
39
+ };
40
+ case 'date':
41
+ return function () use ($generator) {
42
+ return $generator->datetime;
43
+ };
44
+ default:
45
+ // no smart way to guess what the user expects here
46
+ return null;
47
+ }
48
+ }
49
+ }
vendor/fakerphp/faker/src/Faker/ORM/Mandango/EntityPopulator.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Mandango;
4
+
5
+ use Mandango\Mandango;
6
+ use Faker\Provider\Base;
7
+
8
+ /**
9
+ * Service class for populating a table through a Mandango ActiveRecord class.
10
+ */
11
+ class EntityPopulator
12
+ {
13
+ protected $class;
14
+ protected $columnFormatters = array();
15
+
16
+ /**
17
+ * Class constructor.
18
+ *
19
+ * @param string $class A Mandango ActiveRecord classname
20
+ */
21
+ public function __construct($class)
22
+ {
23
+ $this->class = $class;
24
+ }
25
+
26
+ /**
27
+ * @return string
28
+ */
29
+ public function getClass()
30
+ {
31
+ return $this->class;
32
+ }
33
+
34
+ public function setColumnFormatters($columnFormatters)
35
+ {
36
+ $this->columnFormatters = $columnFormatters;
37
+ }
38
+
39
+ /**
40
+ * @return array
41
+ */
42
+ public function getColumnFormatters()
43
+ {
44
+ return $this->columnFormatters;
45
+ }
46
+
47
+ public function mergeColumnFormattersWith($columnFormatters)
48
+ {
49
+ $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
50
+ }
51
+
52
+ /**
53
+ * @param \Faker\Generator $generator
54
+ * @param Mandango $mandango
55
+ * @return array
56
+ */
57
+ public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango)
58
+ {
59
+ $formatters = array();
60
+ $nameGuesser = new \Faker\Guesser\Name($generator);
61
+ $columnTypeGuesser = new \Faker\ORM\Mandango\ColumnTypeGuesser($generator);
62
+
63
+ $metadata = $mandango->getMetadata($this->class);
64
+
65
+ // fields
66
+ foreach ($metadata['fields'] as $fieldName => $field) {
67
+ if ($formatter = $nameGuesser->guessFormat($fieldName)) {
68
+ $formatters[$fieldName] = $formatter;
69
+ continue;
70
+ }
71
+ if ($formatter = $columnTypeGuesser->guessFormat($field)) {
72
+ $formatters[$fieldName] = $formatter;
73
+ continue;
74
+ }
75
+ }
76
+
77
+ // references
78
+ foreach (array_merge($metadata['referencesOne'], $metadata['referencesMany']) as $referenceName => $reference) {
79
+ if (!isset($reference['class'])) {
80
+ continue;
81
+ }
82
+ $referenceClass = $reference['class'];
83
+
84
+ $formatters[$referenceName] = function ($insertedEntities) use ($referenceClass) {
85
+ if (isset($insertedEntities[$referenceClass])) {
86
+ return Base::randomElement($insertedEntities[$referenceClass]);
87
+ }
88
+ };
89
+ }
90
+
91
+ return $formatters;
92
+ }
93
+
94
+ /**
95
+ * Insert one new record using the Entity class.
96
+ * @param Mandango $mandango
97
+ */
98
+ public function execute(Mandango $mandango, $insertedEntities)
99
+ {
100
+ $metadata = $mandango->getMetadata($this->class);
101
+
102
+ $obj = $mandango->create($this->class);
103
+ foreach ($this->columnFormatters as $column => $format) {
104
+ if (null !== $format) {
105
+ $value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
106
+
107
+ if (isset($metadata['fields'][$column]) ||
108
+ isset($metadata['referencesOne'][$column])) {
109
+ $obj->set($column, $value);
110
+ }
111
+
112
+ if (isset($metadata['referencesMany'][$column])) {
113
+ $adder = 'add'.ucfirst($column);
114
+ $obj->$adder($value);
115
+ }
116
+ }
117
+ }
118
+ $mandango->persist($obj);
119
+
120
+ return $obj;
121
+ }
122
+ }
vendor/fakerphp/faker/src/Faker/ORM/Mandango/Populator.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Mandango;
4
+
5
+ use Mandango\Mandango;
6
+
7
+ /**
8
+ * Service class for populating a database using Mandango.
9
+ * A Populator can populate several tables using ActiveRecord classes.
10
+ */
11
+ class Populator
12
+ {
13
+ protected $generator;
14
+ protected $mandango;
15
+ protected $entities = array();
16
+ protected $quantities = array();
17
+
18
+ /**
19
+ * @param \Faker\Generator $generator
20
+ * @param Mandango $mandango
21
+ */
22
+ public function __construct(\Faker\Generator $generator, Mandango $mandango)
23
+ {
24
+ $this->generator = $generator;
25
+ $this->mandango = $mandango;
26
+ }
27
+
28
+ /**
29
+ * Add an order for the generation of $number records for $entity.
30
+ *
31
+ * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel\EntityPopulator instance
32
+ * @param int $number The number of entities to populate
33
+ */
34
+ public function addEntity($entity, $number, $customColumnFormatters = array())
35
+ {
36
+ if (!$entity instanceof \Faker\ORM\Mandango\EntityPopulator) {
37
+ $entity = new \Faker\ORM\Mandango\EntityPopulator($entity);
38
+ }
39
+ $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator, $this->mandango));
40
+ if ($customColumnFormatters) {
41
+ $entity->mergeColumnFormattersWith($customColumnFormatters);
42
+ }
43
+ $class = $entity->getClass();
44
+ $this->entities[$class] = $entity;
45
+ $this->quantities[$class] = $number;
46
+ }
47
+
48
+ /**
49
+ * Populate the database using all the Entity classes previously added.
50
+ *
51
+ * @return array A list of the inserted entities.
52
+ */
53
+ public function execute()
54
+ {
55
+ $insertedEntities = array();
56
+ foreach ($this->quantities as $class => $number) {
57
+ for ($i=0; $i < $number; $i++) {
58
+ $insertedEntities[$class][]= $this->entities[$class]->execute($this->mandango, $insertedEntities);
59
+ }
60
+ }
61
+ $this->mandango->flush();
62
+
63
+ return $insertedEntities;
64
+ }
65
+ }
vendor/fakerphp/faker/src/Faker/ORM/Propel/ColumnTypeGuesser.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Propel;
4
+
5
+ use \PropelColumnTypes;
6
+ use \ColumnMap;
7
+
8
+ class ColumnTypeGuesser
9
+ {
10
+ protected $generator;
11
+
12
+ /**
13
+ * @param \Faker\Generator $generator
14
+ */
15
+ public function __construct(\Faker\Generator $generator)
16
+ {
17
+ $this->generator = $generator;
18
+ }
19
+
20
+ /**
21
+ * @param ColumnMap $column
22
+ * @return \Closure|null
23
+ */
24
+ public function guessFormat(ColumnMap $column)
25
+ {
26
+ $generator = $this->generator;
27
+ if ($column->isTemporal()) {
28
+ if ($column->isEpochTemporal()) {
29
+ return function () use ($generator) {
30
+ return $generator->dateTime;
31
+ };
32
+ }
33
+
34
+ return function () use ($generator) {
35
+ return $generator->dateTimeAD;
36
+ };
37
+ }
38
+ $type = $column->getType();
39
+ switch ($type) {
40
+ case PropelColumnTypes::BOOLEAN:
41
+ case PropelColumnTypes::BOOLEAN_EMU:
42
+ return function () use ($generator) {
43
+ return $generator->boolean;
44
+ };
45
+ case PropelColumnTypes::NUMERIC:
46
+ case PropelColumnTypes::DECIMAL:
47
+ $size = $column->getSize();
48
+
49
+ return function () use ($generator, $size) {
50
+ return $generator->randomNumber($size + 2) / 100;
51
+ };
52
+ case PropelColumnTypes::TINYINT:
53
+ return function () {
54
+ return mt_rand(0, 127);
55
+ };
56
+ case PropelColumnTypes::SMALLINT:
57
+ return function () {
58
+ return mt_rand(0, 32767);
59
+ };
60
+ case PropelColumnTypes::INTEGER:
61
+ return function () {
62
+ return mt_rand(0, intval('2147483647'));
63
+ };
64
+ case PropelColumnTypes::BIGINT:
65
+ return function () {
66
+ return mt_rand(0, intval('9223372036854775807'));
67
+ };
68
+ case PropelColumnTypes::FLOAT:
69
+ return function () {
70
+ return mt_rand(0, intval('2147483647'))/mt_rand(1, intval('2147483647'));
71
+ };
72
+ case PropelColumnTypes::DOUBLE:
73
+ case PropelColumnTypes::REAL:
74
+ return function () {
75
+ return mt_rand(0, intval('9223372036854775807'))/mt_rand(1, intval('9223372036854775807'));
76
+ };
77
+ case PropelColumnTypes::CHAR:
78
+ case PropelColumnTypes::VARCHAR:
79
+ case PropelColumnTypes::BINARY:
80
+ case PropelColumnTypes::VARBINARY:
81
+ $size = $column->getSize();
82
+
83
+ return function () use ($generator, $size) {
84
+ return $generator->text($size);
85
+ };
86
+ case PropelColumnTypes::LONGVARCHAR:
87
+ case PropelColumnTypes::LONGVARBINARY:
88
+ case PropelColumnTypes::CLOB:
89
+ case PropelColumnTypes::CLOB_EMU:
90
+ case PropelColumnTypes::BLOB:
91
+ return function () use ($generator) {
92
+ return $generator->text;
93
+ };
94
+ case PropelColumnTypes::ENUM:
95
+ $valueSet = $column->getValueSet();
96
+
97
+ return function () use ($generator, $valueSet) {
98
+ return $generator->randomElement($valueSet);
99
+ };
100
+ case PropelColumnTypes::OBJECT:
101
+ case PropelColumnTypes::PHP_ARRAY:
102
+ default:
103
+ // no smart way to guess what the user expects here
104
+ return null;
105
+ }
106
+ }
107
+ }
vendor/fakerphp/faker/src/Faker/ORM/Propel/EntityPopulator.php ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Propel;
4
+
5
+ use \Faker\Provider\Base;
6
+ use \ColumnMap;
7
+
8
+ /**
9
+ * Service class for populating a table through a Propel ActiveRecord class.
10
+ */
11
+ class EntityPopulator
12
+ {
13
+ protected $class;
14
+ protected $columnFormatters = array();
15
+ protected $modifiers = array();
16
+
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @param string $class A Propel ActiveRecord classname
21
+ */
22
+ public function __construct($class)
23
+ {
24
+ $this->class = $class;
25
+ }
26
+
27
+ /**
28
+ * @return string
29
+ */
30
+ public function getClass()
31
+ {
32
+ return $this->class;
33
+ }
34
+
35
+ public function setColumnFormatters($columnFormatters)
36
+ {
37
+ $this->columnFormatters = $columnFormatters;
38
+ }
39
+
40
+ /**
41
+ * @return array
42
+ */
43
+ public function getColumnFormatters()
44
+ {
45
+ return $this->columnFormatters;
46
+ }
47
+
48
+ public function mergeColumnFormattersWith($columnFormatters)
49
+ {
50
+ $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
51
+ }
52
+
53
+ /**
54
+ * @param \Faker\Generator $generator
55
+ * @return array
56
+ */
57
+ public function guessColumnFormatters(\Faker\Generator $generator)
58
+ {
59
+ $formatters = array();
60
+ $class = $this->class;
61
+ $peerClass = $class::PEER;
62
+ $tableMap = $peerClass::getTableMap();
63
+ $nameGuesser = new \Faker\Guesser\Name($generator);
64
+ $columnTypeGuesser = new \Faker\ORM\Propel\ColumnTypeGuesser($generator);
65
+ foreach ($tableMap->getColumns() as $columnMap) {
66
+ // skip behavior columns, handled by modifiers
67
+ if ($this->isColumnBehavior($columnMap)) {
68
+ continue;
69
+ }
70
+ if ($columnMap->isForeignKey()) {
71
+ $relatedClass = $columnMap->getRelation()->getForeignTable()->getClassname();
72
+ $formatters[$columnMap->getPhpName()] = function ($inserted) use ($relatedClass) {
73
+ return isset($inserted[$relatedClass]) ? $inserted[$relatedClass][mt_rand(0, count($inserted[$relatedClass]) - 1)] : null;
74
+ };
75
+ continue;
76
+ }
77
+ if ($columnMap->isPrimaryKey()) {
78
+ continue;
79
+ }
80
+ if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) {
81
+ $formatters[$columnMap->getPhpName()] = $formatter;
82
+ continue;
83
+ }
84
+ if ($formatter = $columnTypeGuesser->guessFormat($columnMap)) {
85
+ $formatters[$columnMap->getPhpName()] = $formatter;
86
+ continue;
87
+ }
88
+ }
89
+
90
+ return $formatters;
91
+ }
92
+
93
+ /**
94
+ * @param ColumnMap $columnMap
95
+ * @return bool
96
+ */
97
+ protected function isColumnBehavior(ColumnMap $columnMap)
98
+ {
99
+ foreach ($columnMap->getTable()->getBehaviors() as $name => $params) {
100
+ $columnName = Base::toLower($columnMap->getName());
101
+ switch ($name) {
102
+ case 'nested_set':
103
+ $columnNames = array($params['left_column'], $params['right_column'], $params['level_column']);
104
+ if (in_array($columnName, $columnNames)) {
105
+ return true;
106
+ }
107
+ break;
108
+ case 'timestampable':
109
+ $columnNames = array($params['create_column'], $params['update_column']);
110
+ if (in_array($columnName, $columnNames)) {
111
+ return true;
112
+ }
113
+ break;
114
+ }
115
+ }
116
+
117
+ return false;
118
+ }
119
+
120
+ public function setModifiers($modifiers)
121
+ {
122
+ $this->modifiers = $modifiers;
123
+ }
124
+
125
+ /**
126
+ * @return array
127
+ */
128
+ public function getModifiers()
129
+ {
130
+ return $this->modifiers;
131
+ }
132
+
133
+ public function mergeModifiersWith($modifiers)
134
+ {
135
+ $this->modifiers = array_merge($this->modifiers, $modifiers);
136
+ }
137
+
138
+ /**
139
+ * @param \Faker\Generator $generator
140
+ * @return array
141
+ */
142
+ public function guessModifiers(\Faker\Generator $generator)
143
+ {
144
+ $modifiers = array();
145
+ $class = $this->class;
146
+ $peerClass = $class::PEER;
147
+ $tableMap = $peerClass::getTableMap();
148
+ foreach ($tableMap->getBehaviors() as $name => $params) {
149
+ switch ($name) {
150
+ case 'nested_set':
151
+ $modifiers['nested_set'] = function ($obj, $inserted) use ($class, $generator) {
152
+ if (isset($inserted[$class])) {
153
+ $queryClass = $class . 'Query';
154
+ $parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class]));
155
+ $obj->insertAsLastChildOf($parent);
156
+ } else {
157
+ $obj->makeRoot();
158
+ }
159
+ };
160
+ break;
161
+ case 'sortable':
162
+ $modifiers['sortable'] = function ($obj, $inserted) use ($class) {
163
+ $maxRank = isset($inserted[$class]) ? count($inserted[$class]) : 0;
164
+ $obj->insertAtRank(mt_rand(1, $maxRank + 1));
165
+ };
166
+ break;
167
+ }
168
+ }
169
+
170
+ return $modifiers;
171
+ }
172
+
173
+ /**
174
+ * Insert one new record using the Entity class.
175
+ */
176
+ public function execute($con, $insertedEntities)
177
+ {
178
+ $obj = new $this->class();
179
+ foreach ($this->getColumnFormatters() as $column => $format) {
180
+ if (null !== $format) {
181
+ $obj->setByName($column, is_callable($format) ? $format($insertedEntities, $obj) : $format);
182
+ }
183
+ }
184
+ foreach ($this->getModifiers() as $modifier) {
185
+ $modifier($obj, $insertedEntities);
186
+ }
187
+ $obj->save($con);
188
+
189
+ return $obj->getPrimaryKey();
190
+ }
191
+ }
vendor/fakerphp/faker/src/Faker/ORM/Propel/Populator.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Propel;
4
+
5
+ /**
6
+ * Service class for populating a database using the Propel ORM.
7
+ * A Populator can populate several tables using ActiveRecord classes.
8
+ */
9
+ class Populator
10
+ {
11
+ protected $generator;
12
+ protected $entities = array();
13
+ protected $quantities = array();
14
+
15
+ /**
16
+ * @param \Faker\Generator $generator
17
+ */
18
+ public function __construct(\Faker\Generator $generator)
19
+ {
20
+ $this->generator = $generator;
21
+ }
22
+
23
+ /**
24
+ * Add an order for the generation of $number records for $entity.
25
+ *
26
+ * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel\EntityPopulator instance
27
+ * @param int $number The number of entities to populate
28
+ */
29
+ public function addEntity($entity, $number, $customColumnFormatters = array(), $customModifiers = array())
30
+ {
31
+ if (!$entity instanceof \Faker\ORM\Propel\EntityPopulator) {
32
+ $entity = new \Faker\ORM\Propel\EntityPopulator($entity);
33
+ }
34
+ $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator));
35
+ if ($customColumnFormatters) {
36
+ $entity->mergeColumnFormattersWith($customColumnFormatters);
37
+ }
38
+ $entity->setModifiers($entity->guessModifiers($this->generator));
39
+ if ($customModifiers) {
40
+ $entity->mergeModifiersWith($customModifiers);
41
+ }
42
+ $class = $entity->getClass();
43
+ $this->entities[$class] = $entity;
44
+ $this->quantities[$class] = $number;
45
+ }
46
+
47
+ /**
48
+ * Populate the database using all the Entity classes previously added.
49
+ *
50
+ * @param PropelPDO $con A Propel connection object
51
+ *
52
+ * @return array A list of the inserted PKs
53
+ */
54
+ public function execute($con = null)
55
+ {
56
+ if (null === $con) {
57
+ $con = $this->getConnection();
58
+ }
59
+ $isInstancePoolingEnabled = \Propel::isInstancePoolingEnabled();
60
+ \Propel::disableInstancePooling();
61
+ $insertedEntities = array();
62
+ $con->beginTransaction();
63
+ foreach ($this->quantities as $class => $number) {
64
+ for ($i=0; $i < $number; $i++) {
65
+ $insertedEntities[$class][]= $this->entities[$class]->execute($con, $insertedEntities);
66
+ }
67
+ }
68
+ $con->commit();
69
+ if ($isInstancePoolingEnabled) {
70
+ \Propel::enableInstancePooling();
71
+ }
72
+
73
+ return $insertedEntities;
74
+ }
75
+
76
+ protected function getConnection()
77
+ {
78
+ // use the first connection available
79
+ $class = key($this->entities);
80
+
81
+ if (!$class) {
82
+ throw new \RuntimeException('No class found from entities. Did you add entities to the Populator ?');
83
+ }
84
+
85
+ $peer = $class::PEER;
86
+
87
+ return \Propel::getConnection($peer::DATABASE_NAME, \Propel::CONNECTION_WRITE);
88
+ }
89
+ }
vendor/fakerphp/faker/src/Faker/ORM/Propel2/ColumnTypeGuesser.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Propel2;
4
+
5
+ use \Propel\Generator\Model\PropelTypes;
6
+ use \Propel\Runtime\Map\ColumnMap;
7
+
8
+ class ColumnTypeGuesser
9
+ {
10
+ protected $generator;
11
+
12
+ /**
13
+ * @param \Faker\Generator $generator
14
+ */
15
+ public function __construct(\Faker\Generator $generator)
16
+ {
17
+ $this->generator = $generator;
18
+ }
19
+
20
+ /**
21
+ * @param ColumnMap $column
22
+ * @return \Closure|null
23
+ */
24
+ public function guessFormat(ColumnMap $column)
25
+ {
26
+ $generator = $this->generator;
27
+ if ($column->isTemporal()) {
28
+ if ($column->getType() == PropelTypes::BU_DATE || $column->getType() == PropelTypes::BU_TIMESTAMP) {
29
+ return function () use ($generator) {
30
+ return $generator->dateTime;
31
+ };
32
+ }
33
+
34
+ return function () use ($generator) {
35
+ return $generator->dateTimeAD;
36
+ };
37
+ }
38
+ $type = $column->getType();
39
+ switch ($type) {
40
+ case PropelTypes::BOOLEAN:
41
+ case PropelTypes::BOOLEAN_EMU:
42
+ return function () use ($generator) {
43
+ return $generator->boolean;
44
+ };
45
+ case PropelTypes::NUMERIC:
46
+ case PropelTypes::DECIMAL:
47
+ $size = $column->getSize();
48
+
49
+ return function () use ($generator, $size) {
50
+ return $generator->randomNumber($size + 2) / 100;
51
+ };
52
+ case PropelTypes::TINYINT:
53
+ return function () {
54
+ return mt_rand(0, 127);
55
+ };
56
+ case PropelTypes::SMALLINT:
57
+ return function () {
58
+ return mt_rand(0, 32767);
59
+ };
60
+ case PropelTypes::INTEGER:
61
+ return function () {
62
+ return mt_rand(0, intval('2147483647'));
63
+ };
64
+ case PropelTypes::BIGINT:
65
+ return function () {
66
+ return mt_rand(0, intval('9223372036854775807'));
67
+ };
68
+ case PropelTypes::FLOAT:
69
+ return function () {
70
+ return mt_rand(0, intval('2147483647'))/mt_rand(1, intval('2147483647'));
71
+ };
72
+ case PropelTypes::DOUBLE:
73
+ case PropelTypes::REAL:
74
+ return function () {
75
+ return mt_rand(0, intval('9223372036854775807'))/mt_rand(1, intval('9223372036854775807'));
76
+ };
77
+ case PropelTypes::CHAR:
78
+ case PropelTypes::VARCHAR:
79
+ case PropelTypes::BINARY:
80
+ case PropelTypes::VARBINARY:
81
+ $size = $column->getSize();
82
+
83
+ return function () use ($generator, $size) {
84
+ return $generator->text($size);
85
+ };
86
+ case PropelTypes::LONGVARCHAR:
87
+ case PropelTypes::LONGVARBINARY:
88
+ case PropelTypes::CLOB:
89
+ case PropelTypes::CLOB_EMU:
90
+ case PropelTypes::BLOB:
91
+ return function () use ($generator) {
92
+ return $generator->text;
93
+ };
94
+ case PropelTypes::ENUM:
95
+ $valueSet = $column->getValueSet();
96
+
97
+ return function () use ($generator, $valueSet) {
98
+ return $generator->randomElement($valueSet);
99
+ };
100
+ case PropelTypes::OBJECT:
101
+ case PropelTypes::PHP_ARRAY:
102
+ default:
103
+ // no smart way to guess what the user expects here
104
+ return null;
105
+ }
106
+ }
107
+ }
vendor/fakerphp/faker/src/Faker/ORM/Propel2/EntityPopulator.php ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Propel2;
4
+
5
+ use \Faker\Provider\Base;
6
+ use \Propel\Runtime\Map\ColumnMap;
7
+
8
+ /**
9
+ * Service class for populating a table through a Propel ActiveRecord class.
10
+ */
11
+ class EntityPopulator
12
+ {
13
+ protected $class;
14
+ protected $columnFormatters = array();
15
+ protected $modifiers = array();
16
+
17
+ /**
18
+ * Class constructor.
19
+ *
20
+ * @param string $class A Propel ActiveRecord classname
21
+ */
22
+ public function __construct($class)
23
+ {
24
+ $this->class = $class;
25
+ }
26
+
27
+ /**
28
+ * @return string
29
+ */
30
+ public function getClass()
31
+ {
32
+ return $this->class;
33
+ }
34
+
35
+ public function setColumnFormatters($columnFormatters)
36
+ {
37
+ $this->columnFormatters = $columnFormatters;
38
+ }
39
+
40
+ /**
41
+ * @return array
42
+ */
43
+ public function getColumnFormatters()
44
+ {
45
+ return $this->columnFormatters;
46
+ }
47
+
48
+ public function mergeColumnFormattersWith($columnFormatters)
49
+ {
50
+ $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
51
+ }
52
+
53
+ /**
54
+ * @param \Faker\Generator $generator
55
+ * @return array
56
+ */
57
+ public function guessColumnFormatters(\Faker\Generator $generator)
58
+ {
59
+ $formatters = array();
60
+ $class = $this->class;
61
+ $peerClass = $class::TABLE_MAP;
62
+ $tableMap = $peerClass::getTableMap();
63
+ $nameGuesser = new \Faker\Guesser\Name($generator);
64
+ $columnTypeGuesser = new \Faker\ORM\Propel2\ColumnTypeGuesser($generator);
65
+ foreach ($tableMap->getColumns() as $columnMap) {
66
+ // skip behavior columns, handled by modifiers
67
+ if ($this->isColumnBehavior($columnMap)) {
68
+ continue;
69
+ }
70
+ if ($columnMap->isForeignKey()) {
71
+ $relatedClass = $columnMap->getRelation()->getForeignTable()->getClassname();
72
+ $formatters[$columnMap->getPhpName()] = function ($inserted) use ($relatedClass) {
73
+ $relatedClass = trim($relatedClass, "\\");
74
+ return isset($inserted[$relatedClass]) ? $inserted[$relatedClass][mt_rand(0, count($inserted[$relatedClass]) - 1)] : null;
75
+ };
76
+ continue;
77
+ }
78
+ if ($columnMap->isPrimaryKey()) {
79
+ continue;
80
+ }
81
+ if ($formatter = $nameGuesser->guessFormat($columnMap->getPhpName(), $columnMap->getSize())) {
82
+ $formatters[$columnMap->getPhpName()] = $formatter;
83
+ continue;
84
+ }
85
+ if ($formatter = $columnTypeGuesser->guessFormat($columnMap)) {
86
+ $formatters[$columnMap->getPhpName()] = $formatter;
87
+ continue;
88
+ }
89
+ }
90
+
91
+ return $formatters;
92
+ }
93
+
94
+ /**
95
+ * @param ColumnMap $columnMap
96
+ * @return bool
97
+ */
98
+ protected function isColumnBehavior(ColumnMap $columnMap)
99
+ {
100
+ foreach ($columnMap->getTable()->getBehaviors() as $name => $params) {
101
+ $columnName = Base::toLower($columnMap->getName());
102
+ switch ($name) {
103
+ case 'nested_set':
104
+ $columnNames = array($params['left_column'], $params['right_column'], $params['level_column']);
105
+ if (in_array($columnName, $columnNames)) {
106
+ return true;
107
+ }
108
+ break;
109
+ case 'timestampable':
110
+ $columnNames = array($params['create_column'], $params['update_column']);
111
+ if (in_array($columnName, $columnNames)) {
112
+ return true;
113
+ }
114
+ break;
115
+ }
116
+ }
117
+
118
+ return false;
119
+ }
120
+
121
+ public function setModifiers($modifiers)
122
+ {
123
+ $this->modifiers = $modifiers;
124
+ }
125
+
126
+ /**
127
+ * @return array
128
+ */
129
+ public function getModifiers()
130
+ {
131
+ return $this->modifiers;
132
+ }
133
+
134
+ public function mergeModifiersWith($modifiers)
135
+ {
136
+ $this->modifiers = array_merge($this->modifiers, $modifiers);
137
+ }
138
+
139
+ /**
140
+ * @param \Faker\Generator $generator
141
+ * @return array
142
+ */
143
+ public function guessModifiers(\Faker\Generator $generator)
144
+ {
145
+ $modifiers = array();
146
+ $class = $this->class;
147
+ $peerClass = $class::TABLE_MAP;
148
+ $tableMap = $peerClass::getTableMap();
149
+ foreach ($tableMap->getBehaviors() as $name => $params) {
150
+ switch ($name) {
151
+ case 'nested_set':
152
+ $modifiers['nested_set'] = function ($obj, $inserted) use ($class, $generator) {
153
+ if (isset($inserted[$class])) {
154
+ $queryClass = $class . 'Query';
155
+ $parent = $queryClass::create()->findPk($generator->randomElement($inserted[$class]));
156
+ $obj->insertAsLastChildOf($parent);
157
+ } else {
158
+ $obj->makeRoot();
159
+ }
160
+ };
161
+ break;
162
+ case 'sortable':
163
+ $modifiers['sortable'] = function ($obj, $inserted) use ($class) {
164
+ $maxRank = isset($inserted[$class]) ? count($inserted[$class]) : 0;
165
+ $obj->insertAtRank(mt_rand(1, $maxRank + 1));
166
+ };
167
+ break;
168
+ }
169
+ }
170
+
171
+ return $modifiers;
172
+ }
173
+
174
+ /**
175
+ * Insert one new record using the Entity class.
176
+ */
177
+ public function execute($con, $insertedEntities)
178
+ {
179
+ $obj = new $this->class();
180
+ foreach ($this->getColumnFormatters() as $column => $format) {
181
+ if (null !== $format) {
182
+ $obj->setByName($column, is_callable($format) ? $format($insertedEntities, $obj) : $format);
183
+ }
184
+ }
185
+ foreach ($this->getModifiers() as $modifier) {
186
+ $modifier($obj, $insertedEntities);
187
+ }
188
+ $obj->save($con);
189
+
190
+ return $obj->getPrimaryKey();
191
+ }
192
+ }
vendor/fakerphp/faker/src/Faker/ORM/Propel2/Populator.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Propel2;
4
+
5
+ use Propel\Runtime\Propel;
6
+ use Propel\Runtime\ServiceContainer\ServiceContainerInterface;
7
+
8
+ /**
9
+ * Service class for populating a database using the Propel ORM.
10
+ * A Populator can populate several tables using ActiveRecord classes.
11
+ */
12
+ class Populator
13
+ {
14
+ protected $generator;
15
+ protected $entities = array();
16
+ protected $quantities = array();
17
+
18
+ /**
19
+ * @param \Faker\Generator $generator
20
+ */
21
+ public function __construct(\Faker\Generator $generator)
22
+ {
23
+ $this->generator = $generator;
24
+ }
25
+
26
+ /**
27
+ * Add an order for the generation of $number records for $entity.
28
+ *
29
+ * @param mixed $entity A Propel ActiveRecord classname, or a \Faker\ORM\Propel2\EntityPopulator instance
30
+ * @param int $number The number of entities to populate
31
+ */
32
+ public function addEntity($entity, $number, $customColumnFormatters = array(), $customModifiers = array())
33
+ {
34
+ if (!$entity instanceof \Faker\ORM\Propel2\EntityPopulator) {
35
+ $entity = new \Faker\ORM\Propel2\EntityPopulator($entity);
36
+ }
37
+ $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator));
38
+ if ($customColumnFormatters) {
39
+ $entity->mergeColumnFormattersWith($customColumnFormatters);
40
+ }
41
+ $entity->setModifiers($entity->guessModifiers($this->generator));
42
+ if ($customModifiers) {
43
+ $entity->mergeModifiersWith($customModifiers);
44
+ }
45
+ $class = $entity->getClass();
46
+ $this->entities[$class] = $entity;
47
+ $this->quantities[$class] = $number;
48
+ }
49
+
50
+ /**
51
+ * Populate the database using all the Entity classes previously added.
52
+ *
53
+ * @param PropelPDO $con A Propel connection object
54
+ *
55
+ * @return array A list of the inserted PKs
56
+ */
57
+ public function execute($con = null)
58
+ {
59
+ if (null === $con) {
60
+ $con = $this->getConnection();
61
+ }
62
+ $isInstancePoolingEnabled = Propel::isInstancePoolingEnabled();
63
+ Propel::disableInstancePooling();
64
+ $insertedEntities = array();
65
+ $con->beginTransaction();
66
+ foreach ($this->quantities as $class => $number) {
67
+ for ($i=0; $i < $number; $i++) {
68
+ $insertedEntities[$class][]= $this->entities[$class]->execute($con, $insertedEntities);
69
+ }
70
+ }
71
+ $con->commit();
72
+ if ($isInstancePoolingEnabled) {
73
+ Propel::enableInstancePooling();
74
+ }
75
+
76
+ return $insertedEntities;
77
+ }
78
+
79
+ protected function getConnection()
80
+ {
81
+ // use the first connection available
82
+ $class = key($this->entities);
83
+
84
+ if (!$class) {
85
+ throw new \RuntimeException('No class found from entities. Did you add entities to the Populator ?');
86
+ }
87
+
88
+ $peer = $class::TABLE_MAP;
89
+
90
+ return Propel::getConnection($peer::DATABASE_NAME, ServiceContainerInterface::CONNECTION_WRITE);
91
+ }
92
+ }
vendor/fakerphp/faker/src/Faker/ORM/Spot/ColumnTypeGuesser.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Spot;
4
+
5
+ use Faker\Generator;
6
+
7
+ class ColumnTypeGuesser
8
+ {
9
+ protected $generator;
10
+
11
+
12
+ /**
13
+ * ColumnTypeGuesser constructor.
14
+ * @param Generator $generator
15
+ */
16
+ public function __construct(Generator $generator)
17
+ {
18
+ $this->generator = $generator;
19
+ }
20
+
21
+ /**
22
+ * @param array $field
23
+ * @return \Closure|null
24
+ */
25
+ public function guessFormat(array $field)
26
+ {
27
+ $generator = $this->generator;
28
+ $type = $field['type'];
29
+ switch ($type) {
30
+ case 'boolean':
31
+ return function () use ($generator) {
32
+ return $generator->boolean;
33
+ };
34
+ case 'decimal':
35
+ $size = isset($field['precision']) ? $field['precision'] : 2;
36
+
37
+ return function () use ($generator, $size) {
38
+ return $generator->randomNumber($size + 2) / 100;
39
+ };
40
+ case 'smallint':
41
+ return function () use ($generator) {
42
+ return $generator->numberBetween(0, 65535);
43
+ };
44
+ case 'integer':
45
+ return function () use ($generator) {
46
+ return $generator->numberBetween(0, intval('2147483647'));
47
+ };
48
+ case 'bigint':
49
+ return function () use ($generator) {
50
+ return $generator->numberBetween(0, intval('18446744073709551615'));
51
+ };
52
+ case 'float':
53
+ return function () use ($generator) {
54
+ return $generator->randomFloat(null, 0, intval('4294967295'));
55
+ };
56
+ case 'string':
57
+ $size = isset($field['length']) ? $field['length'] : 255;
58
+
59
+ return function () use ($generator, $size) {
60
+ return $generator->text($size);
61
+ };
62
+ case 'text':
63
+ return function () use ($generator) {
64
+ return $generator->text;
65
+ };
66
+ case 'datetime':
67
+ case 'date':
68
+ case 'time':
69
+ return function () use ($generator) {
70
+ return $generator->datetime;
71
+ };
72
+ default:
73
+ // no smart way to guess what the user expects here
74
+ return null;
75
+ }
76
+ }
77
+ }
vendor/fakerphp/faker/src/Faker/ORM/Spot/EntityPopulator.php ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\ORM\Spot;
4
+
5
+ use Faker\Generator;
6
+ use Faker\Guesser\Name;
7
+ use Spot\Locator;
8
+ use Spot\Mapper;
9
+ use Spot\Relation\BelongsTo;
10
+
11
+ /**
12
+ * Service class for populating a table through a Spot Entity class.
13
+ */
14
+ class EntityPopulator
15
+ {
16
+ /**
17
+ * When fetching existing data - fetch only few first rows.
18
+ */
19
+ const RELATED_FETCH_COUNT = 10;
20
+
21
+ /**
22
+ * @var Mapper
23
+ */
24
+ protected $mapper;
25
+
26
+ /**
27
+ * @var Locator
28
+ */
29
+ protected $locator;
30
+
31
+ /**
32
+ * @var array
33
+ */
34
+ protected $columnFormatters = array();
35
+ /**
36
+ * @var array
37
+ */
38
+ protected $modifiers = array();
39
+
40
+ /**
41
+ * @var bool
42
+ */
43
+ protected $useExistingData = false;
44
+
45
+ /**
46
+ * Class constructor.
47
+ *
48
+ * @param Mapper $mapper
49
+ * @param Locator $locator
50
+ * @param $useExistingData
51
+ */
52
+ public function __construct(Mapper $mapper, Locator $locator, $useExistingData = false)
53
+ {
54
+ $this->mapper = $mapper;
55
+ $this->locator = $locator;
56
+ $this->useExistingData = $useExistingData;
57
+ }
58
+
59
+ /**
60
+ * @return string
61
+ */
62
+ public function getMapper()
63
+ {
64
+ return $this->mapper;
65
+ }
66
+
67
+ /**
68
+ * @param $columnFormatters
69
+ */
70
+ public function setColumnFormatters($columnFormatters)
71
+ {
72
+ $this->columnFormatters = $columnFormatters;
73
+ }
74
+
75
+ /**
76
+ * @return array
77
+ */
78
+ public function getColumnFormatters()
79
+ {
80
+ return $this->columnFormatters;
81
+ }
82
+
83
+ /**
84
+ * @param $columnFormatters
85
+ */
86
+ public function mergeColumnFormattersWith($columnFormatters)
87
+ {
88
+ $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
89
+ }
90
+
91
+ /**
92
+ * @param array $modifiers
93
+ */
94
+ public function setModifiers(array $modifiers)
95
+ {
96
+ $this->modifiers = $modifiers;
97
+ }
98
+
99
+ /**
100
+ * @return array
101
+ */
102
+ public function getModifiers()
103
+ {
104
+ return $this->modifiers;
105
+ }
106
+
107
+ /**
108
+ * @param array $modifiers
109
+ */
110
+ public function mergeModifiersWith(array $modifiers)
111
+ {
112
+ $this->modifiers = array_merge($this->modifiers, $modifiers);
113
+ }
114
+
115
+ /**
116
+ * @param Generator $generator
117
+ * @return array
118
+ */
119
+ public function guessColumnFormatters(Generator $generator)
120
+ {
121
+ $formatters = array();
122
+ $nameGuesser = new Name($generator);
123
+ $columnTypeGuesser = new ColumnTypeGuesser($generator);
124
+ $fields = $this->mapper->fields();
125
+ foreach ($fields as $fieldName => $field) {
126
+ if ($field['primary'] === true) {
127
+ continue;
128
+ }
129
+ if ($formatter = $nameGuesser->guessFormat($fieldName)) {
130
+ $formatters[$fieldName] = $formatter;
131
+ continue;
132
+ }
133
+ if ($formatter = $columnTypeGuesser->guessFormat($field)) {
134
+ $formatters[$fieldName] = $formatter;
135
+ continue;
136
+ }
137
+ }
138
+ $entityName = $this->mapper->entity();
139
+ $entity = $this->mapper->build([]);
140
+ $relations = $entityName::relations($this->mapper, $entity);
141
+ foreach ($relations as $relation) {
142
+ // We don't need any other relation here.
143
+ if ($relation instanceof BelongsTo) {
144
+ $fieldName = $relation->localKey();
145
+ $entityName = $relation->entityName();
146
+ $field = $fields[$fieldName];
147
+ $required = $field['required'];
148
+
149
+ $locator = $this->locator;
150
+
151
+ $formatters[$fieldName] = function ($inserted) use ($required, $entityName, $locator) {
152
+ if (!empty($inserted[$entityName])) {
153
+ return $inserted[$entityName][mt_rand(0, count($inserted[$entityName]) - 1)]->get('id');
154
+ }
155
+
156
+ if ($required && $this->useExistingData) {
157
+ // We did not add anything like this, but it's required,
158
+ // So let's find something existing in DB.
159
+ $mapper = $locator->mapper($entityName);
160
+ $records = $mapper->all()->limit(self::RELATED_FETCH_COUNT)->toArray();
161
+ if (empty($records)) {
162
+ return null;
163
+ }
164
+
165
+ return $records[mt_rand(0, count($records) - 1)]['id'];
166
+ }
167
+
168
+ return null;
169
+ };
170
+ }
171
+ }
172
+
173
+ return $formatters;
174
+ }
175
+
176
+ /**
177
+ * Insert one new record using the Entity class.
178
+ *
179
+ * @param $insertedEntities
180
+ * @return string
181
+ */
182
+ public function execute($insertedEntities)
183
+ {
184
+ $obj = $this->mapper->build([]);
185
+
186
+ $this->fillColumns($obj, $insertedEntities);
187
+ $this->callMethods($obj, $insertedEntities);
188
+
189
+ $this->mapper->insert($obj);
190
+
191
+
192
+ return $obj;
193
+ }
194
+
195
+ /**
196
+ * @param $obj
197
+ * @param $insertedEntities
198
+ */
199
+ private function fillColumns($obj, $insertedEntities)
200
+ {
201
+ foreach ($this->columnFormatters as $field => $format) {
202
+ if (null !== $format) {
203
+ $value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
204
+ $obj->set($field, $value);
205
+ }
206
+ }
207
+ }
208
+
209
+ /**
210
+ * @param $obj
211
+ * @param $insertedEntities
212
+ */
213
+ private function callMethods($obj, $insertedEntities)
214
+ {
215
+ foreach ($this->getModifiers() as $modifier) {
216
+ $modifier($obj, $insertedEntities);
217
+ }
218
+ }
219
+ }
vendor/fakerphp/faker/src/Faker/ORM/Spot/Populator.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ namespace Faker\ORM\Spot;
5
+
6
+ use Spot\Locator;
7
+
8
+ /**
9
+ * Service class for populating a database using the Spot ORM.
10
+ */
11
+ class Populator
12
+ {
13
+ protected $generator;
14
+ protected $locator;
15
+ protected $entities = array();
16
+ protected $quantities = array();
17
+
18
+ /**
19
+ * Populator constructor.
20
+ * @param \Faker\Generator $generator
21
+ * @param Locator|null $locator
22
+ */
23
+ public function __construct(\Faker\Generator $generator, Locator $locator = null)
24
+ {
25
+ $this->generator = $generator;
26
+ $this->locator = $locator;
27
+ }
28
+
29
+ /**
30
+ * Add an order for the generation of $number records for $entity.
31
+ *
32
+ * @param $entityName string Name of Entity object to generate
33
+ * @param $number int The number of entities to populate
34
+ * @param $customColumnFormatters array
35
+ * @param $customModifiers array
36
+ * @param $useExistingData bool Should we use existing rows (e.g. roles) to populate relations?
37
+ */
38
+ public function addEntity(
39
+ $entityName,
40
+ $number,
41
+ $customColumnFormatters = array(),
42
+ $customModifiers = array(),
43
+ $useExistingData = false
44
+ ) {
45
+ $mapper = $this->locator->mapper($entityName);
46
+ if (null === $mapper) {
47
+ throw new \InvalidArgumentException("No mapper can be found for entity " . $entityName);
48
+ }
49
+ $entity = new EntityPopulator($mapper, $this->locator, $useExistingData);
50
+
51
+ $entity->setColumnFormatters($entity->guessColumnFormatters($this->generator));
52
+ if ($customColumnFormatters) {
53
+ $entity->mergeColumnFormattersWith($customColumnFormatters);
54
+ }
55
+ $entity->mergeModifiersWith($customModifiers);
56
+
57
+ $this->entities[$entityName] = $entity;
58
+ $this->quantities[$entityName] = $number;
59
+ }
60
+
61
+ /**
62
+ * Populate the database using all the Entity classes previously added.
63
+ *
64
+ * @param Locator $locator A Spot locator
65
+ *
66
+ * @return array A list of the inserted PKs
67
+ */
68
+ public function execute($locator = null)
69
+ {
70
+ if (null === $locator) {
71
+ $locator = $this->locator;
72
+ }
73
+ if (null === $locator) {
74
+ throw new \InvalidArgumentException("No entity manager passed to Spot Populator.");
75
+ }
76
+
77
+ $insertedEntities = array();
78
+ foreach ($this->quantities as $entityName => $number) {
79
+ for ($i = 0; $i < $number; $i++) {
80
+ $insertedEntities[$entityName][] = $this->entities[$entityName]->execute(
81
+ $insertedEntities
82
+ );
83
+ }
84
+ }
85
+
86
+ return $insertedEntities;
87
+ }
88
+ }
vendor/fakerphp/faker/src/Faker/Provider/Address.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Address extends Base
6
+ {
7
+ protected static $citySuffix = array('Ville');
8
+ protected static $streetSuffix = array('Street');
9
+ protected static $cityFormats = array(
10
+ '{{firstName}}{{citySuffix}}',
11
+ );
12
+ protected static $streetNameFormats = array(
13
+ '{{lastName}} {{streetSuffix}}'
14
+ );
15
+ protected static $streetAddressFormats = array(
16
+ '{{buildingNumber}} {{streetName}}'
17
+ );
18
+ protected static $addressFormats = array(
19
+ '{{streetAddress}} {{postcode}} {{city}}',
20
+ );
21
+
22
+ protected static $buildingNumber = array('%#');
23
+ protected static $postcode = array('#####');
24
+ protected static $country = array();
25
+
26
+ /**
27
+ * @example 'town'
28
+ */
29
+ public static function citySuffix()
30
+ {
31
+ return static::randomElement(static::$citySuffix);
32
+ }
33
+
34
+ /**
35
+ * @example 'Avenue'
36
+ */
37
+ public static function streetSuffix()
38
+ {
39
+ return static::randomElement(static::$streetSuffix);
40
+ }
41
+
42
+ /**
43
+ * @example '791'
44
+ */
45
+ public static function buildingNumber()
46
+ {
47
+ return static::numerify(static::randomElement(static::$buildingNumber));
48
+ }
49
+
50
+ /**
51
+ * @example 'Sashabury'
52
+ */
53
+ public function city()
54
+ {
55
+ $format = static::randomElement(static::$cityFormats);
56
+
57
+ return $this->generator->parse($format);
58
+ }
59
+
60
+ /**
61
+ * @example 'Crist Parks'
62
+ */
63
+ public function streetName()
64
+ {
65
+ $format = static::randomElement(static::$streetNameFormats);
66
+
67
+ return $this->generator->parse($format);
68
+ }
69
+
70
+ /**
71
+ * @example '791 Crist Parks'
72
+ */
73
+ public function streetAddress()
74
+ {
75
+ $format = static::randomElement(static::$streetAddressFormats);
76
+
77
+ return $this->generator->parse($format);
78
+ }
79
+
80
+ /**
81
+ * @example 86039-9874
82
+ */
83
+ public static function postcode()
84
+ {
85
+ return static::toUpper(static::bothify(static::randomElement(static::$postcode)));
86
+ }
87
+
88
+ /**
89
+ * @example '791 Crist Parks, Sashabury, IL 86039-9874'
90
+ */
91
+ public function address()
92
+ {
93
+ $format = static::randomElement(static::$addressFormats);
94
+
95
+ return $this->generator->parse($format);
96
+ }
97
+
98
+ /**
99
+ * @example 'Japan'
100
+ */
101
+ public static function country()
102
+ {
103
+ return static::randomElement(static::$country);
104
+ }
105
+
106
+ /**
107
+ * @example '77.147489'
108
+ * @param float|int $min
109
+ * @param float|int $max
110
+ * @return float Uses signed degrees format (returns a float number between -90 and 90)
111
+ */
112
+ public static function latitude($min = -90, $max = 90)
113
+ {
114
+ return static::randomFloat(6, $min, $max);
115
+ }
116
+
117
+ /**
118
+ * @example '86.211205'
119
+ * @param float|int $min
120
+ * @param float|int $max
121
+ * @return float Uses signed degrees format (returns a float number between -180 and 180)
122
+ */
123
+ public static function longitude($min = -180, $max = 180)
124
+ {
125
+ return static::randomFloat(6, $min, $max);
126
+ }
127
+
128
+ /**
129
+ * @example array('77.147489', '86.211205')
130
+ * @return array | latitude, longitude
131
+ */
132
+ public static function localCoordinates()
133
+ {
134
+ return array(
135
+ 'latitude' => static::latitude(),
136
+ 'longitude' => static::longitude()
137
+ );
138
+ }
139
+ }
vendor/fakerphp/faker/src/Faker/Provider/Barcode.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ /**
6
+ * @see http://en.wikipedia.org/wiki/EAN-13
7
+ * @see http://en.wikipedia.org/wiki/ISBN
8
+ */
9
+ class Barcode extends Base
10
+ {
11
+ private function ean($length = 13)
12
+ {
13
+ $code = static::numerify(str_repeat('#', $length - 1));
14
+
15
+ return $code . static::eanChecksum($code);
16
+ }
17
+
18
+ /**
19
+ * Utility function for computing EAN checksums
20
+ *
21
+ * @param string $input
22
+ *
23
+ * @return integer
24
+ */
25
+ protected static function eanChecksum($input)
26
+ {
27
+ $sequence = (strlen($input) + 1) === 8 ? array(3, 1) : array(1, 3);
28
+ $sums = 0;
29
+ foreach (str_split($input) as $n => $digit) {
30
+ $sums += $digit * $sequence[$n % 2];
31
+ }
32
+ return (10 - $sums % 10) % 10;
33
+ }
34
+
35
+ /**
36
+ * ISBN-10 check digit
37
+ * @link http://en.wikipedia.org/wiki/International_Standard_Book_Number#ISBN-10_check_digits
38
+ *
39
+ * @param string $input ISBN without check-digit
40
+ * @throws \LengthException When wrong input length passed
41
+ *
42
+ * @return integer Check digit
43
+ */
44
+ protected static function isbnChecksum($input)
45
+ {
46
+ // We're calculating check digit for ISBN-10
47
+ // so, the length of the input should be 9
48
+ $length = 9;
49
+
50
+ if (strlen($input) !== $length) {
51
+ throw new \LengthException(sprintf('Input length should be equal to %d', $length));
52
+ }
53
+
54
+ $digits = str_split($input);
55
+ array_walk(
56
+ $digits,
57
+ function (&$digit, $position) {
58
+ $digit = (10 - $position) * $digit;
59
+ }
60
+ );
61
+ $result = (11 - array_sum($digits) % 11) % 11;
62
+
63
+ // 10 is replaced by X
64
+ return ($result < 10)?$result:'X';
65
+ }
66
+
67
+ /**
68
+ * Get a random EAN13 barcode.
69
+ * @return string
70
+ * @example '4006381333931'
71
+ */
72
+ public function ean13()
73
+ {
74
+ return $this->ean(13);
75
+ }
76
+
77
+ /**
78
+ * Get a random EAN8 barcode.
79
+ * @return string
80
+ * @example '73513537'
81
+ */
82
+ public function ean8()
83
+ {
84
+ return $this->ean(8);
85
+ }
86
+
87
+ /**
88
+ * Get a random ISBN-10 code
89
+ * @link http://en.wikipedia.org/wiki/International_Standard_Book_Number
90
+ *
91
+ * @return string
92
+ * @example '4881416324'
93
+ */
94
+ public function isbn10()
95
+ {
96
+ $code = static::numerify(str_repeat('#', 9));
97
+
98
+ return $code . static::isbnChecksum($code);
99
+ }
100
+
101
+ /**
102
+ * Get a random ISBN-13 code
103
+ * @link http://en.wikipedia.org/wiki/International_Standard_Book_Number
104
+ *
105
+ * @return string
106
+ * @example '9790404436093'
107
+ */
108
+ public function isbn13()
109
+ {
110
+ $code = '97' . static::numberBetween(8, 9) . static::numerify(str_repeat('#', 9));
111
+
112
+ return $code . static::eanChecksum($code);
113
+ }
114
+ }
vendor/fakerphp/faker/src/Faker/Provider/Base.php ADDED
@@ -0,0 +1,612 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ use Faker\Generator;
6
+ use Faker\DefaultGenerator;
7
+ use Faker\UniqueGenerator;
8
+ use Faker\ValidGenerator;
9
+
10
+ class Base
11
+ {
12
+ /**
13
+ * @var \Faker\Generator
14
+ */
15
+ protected $generator;
16
+
17
+ /**
18
+ * @var \Faker\UniqueGenerator
19
+ */
20
+ protected $unique;
21
+
22
+ /**
23
+ * @param \Faker\Generator $generator
24
+ */
25
+ public function __construct(Generator $generator)
26
+ {
27
+ $this->generator = $generator;
28
+ }
29
+
30
+ /**
31
+ * Returns a random number between 0 and 9
32
+ *
33
+ * @return integer
34
+ */
35
+ public static function randomDigit()
36
+ {
37
+ return mt_rand(0, 9);
38
+ }
39
+
40
+ /**
41
+ * Returns a random number between 1 and 9
42
+ *
43
+ * @return integer
44
+ */
45
+ public static function randomDigitNotNull()
46
+ {
47
+ return mt_rand(1, 9);
48
+ }
49
+
50
+ /**
51
+ * Generates a random digit, which cannot be $except
52
+ *
53
+ * @param int $except
54
+ * @return int
55
+ */
56
+ public static function randomDigitNot($except)
57
+ {
58
+ $result = self::numberBetween(0, 8);
59
+ if ($result >= $except) {
60
+ $result++;
61
+ }
62
+ return $result;
63
+ }
64
+
65
+ /**
66
+ * Returns a random integer with 0 to $nbDigits digits.
67
+ *
68
+ * The maximum value returned is mt_getrandmax()
69
+ *
70
+ * @param integer $nbDigits Defaults to a random number between 1 and 9
71
+ * @param boolean $strict Whether the returned number should have exactly $nbDigits
72
+ * @example 79907610
73
+ *
74
+ * @return integer
75
+ */
76
+ public static function randomNumber($nbDigits = null, $strict = false)
77
+ {
78
+ if (!is_bool($strict)) {
79
+ throw new \InvalidArgumentException('randomNumber() generates numbers of fixed width. To generate numbers between two boundaries, use numberBetween() instead.');
80
+ }
81
+ if (null === $nbDigits) {
82
+ $nbDigits = static::randomDigitNotNull();
83
+ }
84
+ $max = pow(10, $nbDigits) - 1;
85
+ if ($max > mt_getrandmax()) {
86
+ throw new \InvalidArgumentException('randomNumber() can only generate numbers up to mt_getrandmax()');
87
+ }
88
+ if ($strict) {
89
+ return mt_rand(pow(10, $nbDigits - 1), $max);
90
+ }
91
+
92
+ return mt_rand(0, $max);
93
+ }
94
+
95
+ /**
96
+ * Return a random float number
97
+ *
98
+ * @param int $nbMaxDecimals
99
+ * @param int|float $min
100
+ * @param int|float $max
101
+ * @example 48.8932
102
+ *
103
+ * @return float
104
+ */
105
+ public static function randomFloat($nbMaxDecimals = null, $min = 0, $max = null)
106
+ {
107
+ if (null === $nbMaxDecimals) {
108
+ $nbMaxDecimals = static::randomDigit();
109
+ }
110
+
111
+ if (null === $max) {
112
+ $max = static::randomNumber();
113
+ if ($min > $max) {
114
+ $max = $min;
115
+ }
116
+ }
117
+
118
+ if ($min > $max) {
119
+ $tmp = $min;
120
+ $min = $max;
121
+ $max = $tmp;
122
+ }
123
+
124
+ return round($min + mt_rand() / mt_getrandmax() * ($max - $min), $nbMaxDecimals);
125
+ }
126
+
127
+ /**
128
+ * Returns a random number between $int1 and $int2 (any order)
129
+ *
130
+ * @param integer $int1 default to 0
131
+ * @param integer $int2 defaults to 32 bit max integer, ie 2147483647
132
+ * @example 79907610
133
+ *
134
+ * @return integer
135
+ */
136
+ public static function numberBetween($int1 = 0, $int2 = 2147483647)
137
+ {
138
+ $min = $int1 < $int2 ? $int1 : $int2;
139
+ $max = $int1 < $int2 ? $int2 : $int1;
140
+ return mt_rand($min, $max);
141
+ }
142
+
143
+ /**
144
+ * Returns the passed value
145
+ *
146
+ * @param mixed $value
147
+ *
148
+ * @return mixed
149
+ */
150
+ public static function passthrough($value)
151
+ {
152
+ return $value;
153
+ }
154
+
155
+ /**
156
+ * Returns a random letter from a to z
157
+ *
158
+ * @return string
159
+ */
160
+ public static function randomLetter()
161
+ {
162
+ return chr(mt_rand(97, 122));
163
+ }
164
+
165
+ /**
166
+ * Returns a random ASCII character (excluding accents and special chars)
167
+ */
168
+ public static function randomAscii()
169
+ {
170
+ return chr(mt_rand(33, 126));
171
+ }
172
+
173
+ /**
174
+ * Returns randomly ordered subsequence of $count elements from a provided array
175
+ *
176
+ * @param array $array Array to take elements from. Defaults to a-c
177
+ * @param integer $count Number of elements to take.
178
+ * @param boolean $allowDuplicates Allow elements to be picked several times. Defaults to false
179
+ * @throws \LengthException When requesting more elements than provided
180
+ *
181
+ * @return array New array with $count elements from $array
182
+ */
183
+ public static function randomElements($array = array('a', 'b', 'c'), $count = 1, $allowDuplicates = false)
184
+ {
185
+ $traversables = array();
186
+
187
+ if ($array instanceof \Traversable) {
188
+ foreach ($array as $element) {
189
+ $traversables[] = $element;
190
+ }
191
+ }
192
+
193
+ $arr = count($traversables) ? $traversables : $array;
194
+
195
+ $allKeys = array_keys($arr);
196
+ $numKeys = count($allKeys);
197
+
198
+ if (!$allowDuplicates && $numKeys < $count) {
199
+ throw new \LengthException(sprintf('Cannot get %d elements, only %d in array', $count, $numKeys));
200
+ }
201
+
202
+ $highKey = $numKeys - 1;
203
+ $keys = $elements = array();
204
+ $numElements = 0;
205
+
206
+ while ($numElements < $count) {
207
+ $num = mt_rand(0, $highKey);
208
+
209
+ if (!$allowDuplicates) {
210
+ if (isset($keys[$num])) {
211
+ continue;
212
+ }
213
+ $keys[$num] = true;
214
+ }
215
+
216
+ $elements[] = $arr[$allKeys[$num]];
217
+ $numElements++;
218
+ }
219
+
220
+ return $elements;
221
+ }
222
+
223
+ /**
224
+ * Returns a random element from a passed array
225
+ *
226
+ * @param array $array
227
+ * @return mixed
228
+ */
229
+ public static function randomElement($array = array('a', 'b', 'c'))
230
+ {
231
+ if (!$array || ($array instanceof \Traversable && !count($array))) {
232
+ return null;
233
+ }
234
+ $elements = static::randomElements($array, 1);
235
+
236
+ return $elements[0];
237
+ }
238
+
239
+ /**
240
+ * Returns a random key from a passed associative array
241
+ *
242
+ * @param array $array
243
+ * @return int|string|null
244
+ */
245
+ public static function randomKey($array = array())
246
+ {
247
+ if (!$array) {
248
+ return null;
249
+ }
250
+ $keys = array_keys($array);
251
+ $key = $keys[mt_rand(0, count($keys) - 1)];
252
+
253
+ return $key;
254
+ }
255
+
256
+ /**
257
+ * Returns a shuffled version of the argument.
258
+ *
259
+ * This function accepts either an array, or a string.
260
+ *
261
+ * @example $faker->shuffle([1, 2, 3]); // [2, 1, 3]
262
+ * @example $faker->shuffle('hello, world'); // 'rlo,h eold!lw'
263
+ *
264
+ * @see shuffleArray()
265
+ * @see shuffleString()
266
+ *
267
+ * @param array|string $arg The set to shuffle
268
+ * @return array|string The shuffled set
269
+ */
270
+ public static function shuffle($arg = '')
271
+ {
272
+ if (is_array($arg)) {
273
+ return static::shuffleArray($arg);
274
+ }
275
+ if (is_string($arg)) {
276
+ return static::shuffleString($arg);
277
+ }
278
+ throw new \InvalidArgumentException('shuffle() only supports strings or arrays');
279
+ }
280
+
281
+ /**
282
+ * Returns a shuffled version of the array.
283
+ *
284
+ * This function does not mutate the original array. It uses the
285
+ * Fisher–Yates algorithm, which is unbiased, together with a Mersenne
286
+ * twister random generator. This function is therefore more random than
287
+ * PHP's shuffle() function, and it is seedable.
288
+ *
289
+ * @link http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
290
+ *
291
+ * @example $faker->shuffleArray([1, 2, 3]); // [2, 1, 3]
292
+ *
293
+ * @param array $array The set to shuffle
294
+ * @return array The shuffled set
295
+ */
296
+ public static function shuffleArray($array = array())
297
+ {
298
+ $shuffledArray = array();
299
+ $i = 0;
300
+ reset($array);
301
+ foreach ($array as $key => $value) {
302
+ if ($i == 0) {
303
+ $j = 0;
304
+ } else {
305
+ $j = mt_rand(0, $i);
306
+ }
307
+ if ($j == $i) {
308
+ $shuffledArray[]= $value;
309
+ } else {
310
+ $shuffledArray[]= $shuffledArray[$j];
311
+ $shuffledArray[$j] = $value;
312
+ }
313
+ $i++;
314
+ }
315
+ return $shuffledArray;
316
+ }
317
+
318
+ /**
319
+ * Returns a shuffled version of the string.
320
+ *
321
+ * This function does not mutate the original string. It uses the
322
+ * Fisher–Yates algorithm, which is unbiased, together with a Mersenne
323
+ * twister random generator. This function is therefore more random than
324
+ * PHP's shuffle() function, and it is seedable. Additionally, it is
325
+ * UTF8 safe if the mb extension is available.
326
+ *
327
+ * @link http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
328
+ *
329
+ * @example $faker->shuffleString('hello, world'); // 'rlo,h eold!lw'
330
+ *
331
+ * @param string $string The set to shuffle
332
+ * @param string $encoding The string encoding (defaults to UTF-8)
333
+ * @return string The shuffled set
334
+ */
335
+ public static function shuffleString($string = '', $encoding = 'UTF-8')
336
+ {
337
+ if (function_exists('mb_strlen')) {
338
+ // UTF8-safe str_split()
339
+ $array = array();
340
+ $strlen = mb_strlen($string, $encoding);
341
+ for ($i = 0; $i < $strlen; $i++) {
342
+ $array []= mb_substr($string, $i, 1, $encoding);
343
+ }
344
+ } else {
345
+ $array = str_split($string, 1);
346
+ }
347
+ return implode('', static::shuffleArray($array));
348
+ }
349
+
350
+ private static function replaceWildcard($string, $wildcard = '#', $callback = 'static::randomDigit')
351
+ {
352
+ if (($pos = strpos($string, $wildcard)) === false) {
353
+ return $string;
354
+ }
355
+ for ($i = $pos, $last = strrpos($string, $wildcard, $pos) + 1; $i < $last; $i++) {
356
+ if ($string[$i] === $wildcard) {
357
+ $string[$i] = call_user_func($callback);
358
+ }
359
+ }
360
+ return $string;
361
+ }
362
+
363
+ /**
364
+ * Replaces all hash sign ('#') occurrences with a random number
365
+ * Replaces all percentage sign ('%') occurrences with a not null number
366
+ *
367
+ * @param string $string String that needs to bet parsed
368
+ * @return string
369
+ */
370
+ public static function numerify($string = '###')
371
+ {
372
+ // instead of using randomDigit() several times, which is slow,
373
+ // count the number of hashes and generate once a large number
374
+ $toReplace = array();
375
+ if (($pos = strpos($string, '#')) !== false) {
376
+ for ($i = $pos, $last = strrpos($string, '#', $pos) + 1; $i < $last; $i++) {
377
+ if ($string[$i] === '#') {
378
+ $toReplace[] = $i;
379
+ }
380
+ }
381
+ }
382
+ if ($nbReplacements = count($toReplace)) {
383
+ $maxAtOnce = strlen((string) mt_getrandmax()) - 1;
384
+ $numbers = '';
385
+ $i = 0;
386
+ while ($i < $nbReplacements) {
387
+ $size = min($nbReplacements - $i, $maxAtOnce);
388
+ $numbers .= str_pad(static::randomNumber($size), $size, '0', STR_PAD_LEFT);
389
+ $i += $size;
390
+ }
391
+ for ($i = 0; $i < $nbReplacements; $i++) {
392
+ $string[$toReplace[$i]] = $numbers[$i];
393
+ }
394
+ }
395
+ $string = self::replaceWildcard($string, '%', 'static::randomDigitNotNull');
396
+
397
+ return $string;
398
+ }
399
+
400
+ /**
401
+ * Replaces all question mark ('?') occurrences with a random letter
402
+ *
403
+ * @param string $string String that needs to bet parsed
404
+ * @return string
405
+ */
406
+ public static function lexify($string = '????')
407
+ {
408
+ return self::replaceWildcard($string, '?', 'static::randomLetter');
409
+ }
410
+
411
+ /**
412
+ * Replaces hash signs ('#') and question marks ('?') with random numbers and letters
413
+ * An asterisk ('*') is replaced with either a random number or a random letter
414
+ *
415
+ * @param string $string String that needs to bet parsed
416
+ * @return string
417
+ */
418
+ public static function bothify($string = '## ??')
419
+ {
420
+ $string = self::replaceWildcard($string, '*', function () {
421
+ return mt_rand(0, 1) ? '#' : '?';
422
+ });
423
+ return static::lexify(static::numerify($string));
424
+ }
425
+
426
+ /**
427
+ * Replaces * signs with random numbers and letters and special characters
428
+ *
429
+ * @example $faker->asciify(''********'); // "s5'G!uC3"
430
+ *
431
+ * @param string $string String that needs to bet parsed
432
+ * @return string
433
+ */
434
+ public static function asciify($string = '****')
435
+ {
436
+ return preg_replace_callback('/\*/u', 'static::randomAscii', $string);
437
+ }
438
+
439
+ /**
440
+ * Transforms a basic regular expression into a random string satisfying the expression.
441
+ *
442
+ * @example $faker->regexify('[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'); // sm0@y8k96a.ej
443
+ *
444
+ * Regex delimiters '/.../' and begin/end markers '^...$' are ignored.
445
+ *
446
+ * Only supports a small subset of the regex syntax. For instance,
447
+ * unicode, negated classes, unbounded ranges, subpatterns, back references,
448
+ * assertions, recursive patterns, and comments are not supported. Escaping
449
+ * support is extremely fragile.
450
+ *
451
+ * This method is also VERY slow. Use it only when no other formatter
452
+ * can generate the fake data you want. For instance, prefer calling
453
+ * `$faker->email` rather than `regexify` with the previous regular
454
+ * expression.
455
+ *
456
+ * Also note than `bothify` can probably do most of what this method does,
457
+ * but much faster. For instance, for a dummy email generation, try
458
+ * `$faker->bothify('?????????@???.???')`.
459
+ *
460
+ * @see https://github.com/icomefromthenet/ReverseRegex for a more robust implementation
461
+ *
462
+ * @param string $regex A regular expression (delimiters are optional)
463
+ * @return string
464
+ */
465
+ public static function regexify($regex = '')
466
+ {
467
+ // ditch the anchors
468
+ $regex = preg_replace('/^\/?\^?/', '', $regex);
469
+ $regex = preg_replace('/\$?\/?$/', '', $regex);
470
+ // All {2} become {2,2}
471
+ $regex = preg_replace('/\{(\d+)\}/', '{\1,\1}', $regex);
472
+ // Single-letter quantifiers (?, *, +) become bracket quantifiers ({0,1}, {0,rand}, {1, rand})
473
+ $regex = preg_replace('/(?<!\\\)\?/', '{0,1}', $regex);
474
+ $regex = preg_replace('/(?<!\\\)\*/', '{0,' . static::randomDigitNotNull() . '}', $regex);
475
+ $regex = preg_replace('/(?<!\\\)\+/', '{1,' . static::randomDigitNotNull() . '}', $regex);
476
+ // [12]{1,2} becomes [12] or [12][12]
477
+ $regex = preg_replace_callback('/(\[[^\]]+\])\{(\d+),(\d+)\}/', function ($matches) {
478
+ return str_repeat($matches[1], Base::randomElement(range($matches[2], $matches[3])));
479
+ }, $regex);
480
+ // (12|34){1,2} becomes (12|34) or (12|34)(12|34)
481
+ $regex = preg_replace_callback('/(\([^\)]+\))\{(\d+),(\d+)\}/', function ($matches) {
482
+ return str_repeat($matches[1], Base::randomElement(range($matches[2], $matches[3])));
483
+ }, $regex);
484
+ // A{1,2} becomes A or AA or \d{3} becomes \d\d\d
485
+ $regex = preg_replace_callback('/(\\\?.)\{(\d+),(\d+)\}/', function ($matches) {
486
+ return str_repeat($matches[1], Base::randomElement(range($matches[2], $matches[3])));
487
+ }, $regex);
488
+ // (this|that) becomes 'this' or 'that'
489
+ $regex = preg_replace_callback('/\((.*?)\)/', function ($matches) {
490
+ return Base::randomElement(explode('|', str_replace(array('(', ')'), '', $matches[1])));
491
+ }, $regex);
492
+ // All A-F inside of [] become ABCDEF
493
+ $regex = preg_replace_callback('/\[([^\]]+)\]/', function ($matches) {
494
+ return '[' . preg_replace_callback('/(\w|\d)\-(\w|\d)/', function ($range) {
495
+ return implode('', range($range[1], $range[2]));
496
+ }, $matches[1]) . ']';
497
+ }, $regex);
498
+ // All [ABC] become B (or A or C)
499
+ $regex = preg_replace_callback('/\[([^\]]+)\]/', function ($matches) {
500
+ return Base::randomElement(str_split($matches[1]));
501
+ }, $regex);
502
+ // replace \d with number and \w with letter and . with ascii
503
+ $regex = preg_replace_callback('/\\\w/', 'static::randomLetter', $regex);
504
+ $regex = preg_replace_callback('/\\\d/', 'static::randomDigit', $regex);
505
+ $regex = preg_replace_callback('/(?<!\\\)\./', 'static::randomAscii', $regex);
506
+ // remove remaining backslashes
507
+ $regex = str_replace('\\', '', $regex);
508
+ // phew
509
+ return $regex;
510
+ }
511
+
512
+ /**
513
+ * Converts string to lowercase.
514
+ * Uses mb_string extension if available.
515
+ *
516
+ * @param string $string String that should be converted to lowercase
517
+ * @return string
518
+ */
519
+ public static function toLower($string = '')
520
+ {
521
+ return extension_loaded('mbstring') ? mb_strtolower($string, 'UTF-8') : strtolower($string);
522
+ }
523
+
524
+ /**
525
+ * Converts string to uppercase.
526
+ * Uses mb_string extension if available.
527
+ *
528
+ * @param string $string String that should be converted to uppercase
529
+ * @return string
530
+ */
531
+ public static function toUpper($string = '')
532
+ {
533
+ return extension_loaded('mbstring') ? mb_strtoupper($string, 'UTF-8') : strtoupper($string);
534
+ }
535
+
536
+ /**
537
+ * Chainable method for making any formatter optional.
538
+ *
539
+ * @param float|integer $weight Set the probability of receiving a null value.
540
+ * "0" will always return null, "1" will always return the generator.
541
+ * If $weight is an integer value, then the same system works
542
+ * between 0 (always get false) and 100 (always get true).
543
+ * @return mixed|null
544
+ */
545
+ public function optional($weight = 0.5, $default = null)
546
+ {
547
+ // old system based on 0.1 <= $weight <= 0.9
548
+ // TODO: remove in v2
549
+ if ($weight > 0 && $weight < 1 && mt_rand() / mt_getrandmax() <= $weight) {
550
+ return $this->generator;
551
+ }
552
+
553
+ // new system with percentage
554
+ if (is_int($weight) && mt_rand(1, 100) <= $weight) {
555
+ return $this->generator;
556
+ }
557
+
558
+ return new DefaultGenerator($default);
559
+ }
560
+
561
+ /**
562
+ * Chainable method for making any formatter unique.
563
+ *
564
+ * <code>
565
+ * // will never return twice the same value
566
+ * $faker->unique()->randomElement(array(1, 2, 3));
567
+ * </code>
568
+ *
569
+ * @param boolean $reset If set to true, resets the list of existing values
570
+ * @param integer $maxRetries Maximum number of retries to find a unique value,
571
+ * After which an OverflowException is thrown.
572
+ * @throws \OverflowException When no unique value can be found by iterating $maxRetries times
573
+ *
574
+ * @return UniqueGenerator A proxy class returning only non-existing values
575
+ */
576
+ public function unique($reset = false, $maxRetries = 10000)
577
+ {
578
+ if ($reset || !$this->unique) {
579
+ $this->unique = new UniqueGenerator($this->generator, $maxRetries);
580
+ }
581
+
582
+ return $this->unique;
583
+ }
584
+
585
+ /**
586
+ * Chainable method for forcing any formatter to return only valid values.
587
+ *
588
+ * The value validity is determined by a function passed as first argument.
589
+ *
590
+ * <code>
591
+ * $values = array();
592
+ * $evenValidator = function ($digit) {
593
+ * return $digit % 2 === 0;
594
+ * };
595
+ * for ($i=0; $i < 10; $i++) {
596
+ * $values []= $faker->valid($evenValidator)->randomDigit;
597
+ * }
598
+ * print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6]
599
+ * </code>
600
+ *
601
+ * @param Closure $validator A function returning true for valid values
602
+ * @param integer $maxRetries Maximum number of retries to find a unique value,
603
+ * After which an OverflowException is thrown.
604
+ * @throws \OverflowException When no valid value can be found by iterating $maxRetries times
605
+ *
606
+ * @return ValidGenerator A proxy class returning only valid values
607
+ */
608
+ public function valid($validator = null, $maxRetries = 10000)
609
+ {
610
+ return new ValidGenerator($this->generator, $validator, $maxRetries);
611
+ }
612
+ }
vendor/fakerphp/faker/src/Faker/Provider/Biased.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Biased extends Base
6
+ {
7
+ /**
8
+ * Returns a biased integer between $min and $max (both inclusive).
9
+ * The distribution depends on $function.
10
+ *
11
+ * The algorithm creates two doubles, x ∈ [0, 1], y ∈ [0, 1) and checks whether the
12
+ * return value of $function for x is greater than or equal to y. If this is
13
+ * the case the number is accepted and x is mapped to the appropriate integer
14
+ * between $min and $max. Otherwise two new doubles are created until the pair
15
+ * is accepted.
16
+ *
17
+ * @param integer $min Minimum value of the generated integers.
18
+ * @param integer $max Maximum value of the generated integers.
19
+ * @param callable $function A function mapping x ∈ [0, 1] onto a double ∈ [0, 1]
20
+ * @return integer An integer between $min and $max.
21
+ */
22
+ public function biasedNumberBetween($min = 0, $max = 100, $function = 'sqrt')
23
+ {
24
+ do {
25
+ $x = mt_rand() / mt_getrandmax();
26
+ $y = mt_rand() / (mt_getrandmax() + 1);
27
+ } while (call_user_func($function, $x) < $y);
28
+
29
+ return (int) floor($x * ($max - $min + 1) + $min);
30
+ }
31
+
32
+ /**
33
+ * 'unbiased' creates an unbiased distribution by giving
34
+ * each value the same value of one.
35
+ *
36
+ * @return integer
37
+ */
38
+ protected static function unbiased()
39
+ {
40
+ return 1;
41
+ }
42
+
43
+ /**
44
+ * 'linearLow' favors lower numbers. The probability decreases
45
+ * in a linear fashion.
46
+ *
47
+ * @return integer
48
+ */
49
+ protected static function linearLow($x)
50
+ {
51
+ return 1 - $x;
52
+ }
53
+
54
+ /**
55
+ * 'linearHigh' favors higher numbers. The probability increases
56
+ * in a linear fashion.
57
+ *
58
+ * @return integer
59
+ */
60
+ protected static function linearHigh($x)
61
+ {
62
+ return $x;
63
+ }
64
+ }
vendor/fakerphp/faker/src/Faker/Provider/Color.php ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ /**
6
+ * @author lsv
7
+ */
8
+ class Color extends Base
9
+ {
10
+ protected static $safeColorNames = array(
11
+ 'black', 'maroon', 'green', 'navy', 'olive',
12
+ 'purple', 'teal', 'lime', 'blue', 'silver',
13
+ 'gray', 'yellow', 'fuchsia', 'aqua', 'white'
14
+ );
15
+
16
+ protected static $allColorNames = array(
17
+ 'AliceBlue', 'AntiqueWhite', 'Aqua', 'Aquamarine',
18
+ 'Azure', 'Beige', 'Bisque', 'Black', 'BlanchedAlmond',
19
+ 'Blue', 'BlueViolet', 'Brown', 'BurlyWood', 'CadetBlue',
20
+ 'Chartreuse', 'Chocolate', 'Coral', 'CornflowerBlue',
21
+ 'Cornsilk', 'Crimson', 'Cyan', 'DarkBlue', 'DarkCyan',
22
+ 'DarkGoldenRod', 'DarkGray', 'DarkGreen', 'DarkKhaki',
23
+ 'DarkMagenta', 'DarkOliveGreen', 'Darkorange', 'DarkOrchid',
24
+ 'DarkRed', 'DarkSalmon', 'DarkSeaGreen', 'DarkSlateBlue',
25
+ 'DarkSlateGray', 'DarkTurquoise', 'DarkViolet', 'DeepPink',
26
+ 'DeepSkyBlue', 'DimGray', 'DimGrey', 'DodgerBlue', 'FireBrick',
27
+ 'FloralWhite', 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite',
28
+ 'Gold', 'GoldenRod', 'Gray', 'Green', 'GreenYellow', 'HoneyDew',
29
+ 'HotPink', 'IndianRed', 'Indigo', 'Ivory', 'Khaki', 'Lavender',
30
+ 'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', 'LightCoral',
31
+ 'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGreen', 'LightPink',
32
+ 'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', 'LightSlateGray', 'LightSteelBlue',
33
+ 'LightYellow', 'Lime', 'LimeGreen', 'Linen', 'Magenta', 'Maroon', 'MediumAquaMarine',
34
+ 'MediumBlue', 'MediumOrchid', 'MediumPurple', 'MediumSeaGreen', 'MediumSlateBlue',
35
+ 'MediumSpringGreen', 'MediumTurquoise', 'MediumVioletRed', 'MidnightBlue',
36
+ 'MintCream', 'MistyRose', 'Moccasin', 'NavajoWhite', 'Navy', 'OldLace', 'Olive',
37
+ 'OliveDrab', 'Orange', 'OrangeRed', 'Orchid', 'PaleGoldenRod', 'PaleGreen',
38
+ 'PaleTurquoise', 'PaleVioletRed', 'PapayaWhip', 'PeachPuff', 'Peru', 'Pink', 'Plum',
39
+ 'PowderBlue', 'Purple', 'Red', 'RosyBrown', 'RoyalBlue', 'SaddleBrown', 'Salmon',
40
+ 'SandyBrown', 'SeaGreen', 'SeaShell', 'Sienna', 'Silver', 'SkyBlue', 'SlateBlue',
41
+ 'SlateGray', 'Snow', 'SpringGreen', 'SteelBlue', 'Tan', 'Teal', 'Thistle', 'Tomato',
42
+ 'Turquoise', 'Violet', 'Wheat', 'White', 'WhiteSmoke', 'Yellow', 'YellowGreen'
43
+ );
44
+
45
+ /**
46
+ * @example '#fa3cc2'
47
+ */
48
+ public static function hexColor()
49
+ {
50
+ return '#' . str_pad(dechex(mt_rand(1, 16777215)), 6, '0', STR_PAD_LEFT);
51
+ }
52
+
53
+ /**
54
+ * @example '#ff0044'
55
+ */
56
+ public static function safeHexColor()
57
+ {
58
+ $color = str_pad(dechex(mt_rand(0, 255)), 3, '0', STR_PAD_LEFT);
59
+
60
+ return '#' . $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2];
61
+ }
62
+
63
+ /**
64
+ * @example 'array(0,255,122)'
65
+ */
66
+ public static function rgbColorAsArray()
67
+ {
68
+ $color = static::hexColor();
69
+
70
+ return array(
71
+ hexdec(substr($color, 1, 2)),
72
+ hexdec(substr($color, 3, 2)),
73
+ hexdec(substr($color, 5, 2))
74
+ );
75
+ }
76
+
77
+ /**
78
+ * @example '0,255,122'
79
+ */
80
+ public static function rgbColor()
81
+ {
82
+ return implode(',', static::rgbColorAsArray());
83
+ }
84
+
85
+ /**
86
+ * @example 'rgb(0,255,122)'
87
+ */
88
+ public static function rgbCssColor()
89
+ {
90
+ return 'rgb(' . static::rgbColor() . ')';
91
+ }
92
+
93
+ /**
94
+ * @example 'rgba(0,255,122,0.8)'
95
+ */
96
+ public static function rgbaCssColor()
97
+ {
98
+ return 'rgba(' . static::rgbColor() . ',' . static::randomFloat(1, 0, 1) . ')';
99
+ }
100
+
101
+ /**
102
+ * @example 'blue'
103
+ */
104
+ public static function safeColorName()
105
+ {
106
+ return static::randomElement(static::$safeColorNames);
107
+ }
108
+
109
+ /**
110
+ * @example 'NavajoWhite'
111
+ */
112
+ public static function colorName()
113
+ {
114
+ return static::randomElement(static::$allColorNames);
115
+ }
116
+
117
+ /**
118
+ * @example '340,50,20'
119
+ * @return string
120
+ */
121
+ public static function hslColor()
122
+ {
123
+ return sprintf(
124
+ '%s,%s,%s',
125
+ static::numberBetween(0, 360),
126
+ static::numberBetween(0, 100),
127
+ static::numberBetween(0, 100)
128
+ );
129
+ }
130
+
131
+ /**
132
+ * @example array(340, 50, 20)
133
+ * @return array
134
+ */
135
+ public static function hslColorAsArray()
136
+ {
137
+ return array(
138
+ static::numberBetween(0, 360),
139
+ static::numberBetween(0, 100),
140
+ static::numberBetween(0, 100)
141
+ );
142
+ }
143
+ }
vendor/fakerphp/faker/src/Faker/Provider/Company.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Company extends Base
6
+ {
7
+ protected static $formats = array(
8
+ '{{lastName}} {{companySuffix}}',
9
+ );
10
+
11
+ protected static $companySuffix = array('Ltd');
12
+
13
+ protected static $jobTitleFormat = array(
14
+ '{{word}}',
15
+ );
16
+
17
+ /**
18
+ * @example 'Acme Ltd'
19
+ *
20
+ * @return string
21
+ */
22
+ public function company()
23
+ {
24
+ $format = static::randomElement(static::$formats);
25
+
26
+ return $this->generator->parse($format);
27
+ }
28
+
29
+ /**
30
+ * @example 'Ltd'
31
+ *
32
+ * @return string
33
+ */
34
+ public static function companySuffix()
35
+ {
36
+ return static::randomElement(static::$companySuffix);
37
+ }
38
+
39
+ /**
40
+ * @example 'Job'
41
+ *
42
+ * @return string
43
+ */
44
+ public function jobTitle()
45
+ {
46
+ $format = static::randomElement(static::$jobTitleFormat);
47
+
48
+ return $this->generator->parse($format);
49
+ }
50
+ }
vendor/fakerphp/faker/src/Faker/Provider/DateTime.php ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class DateTime extends Base
6
+ {
7
+ 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');
8
+
9
+ protected static $defaultTimezone = null;
10
+
11
+ /**
12
+ * @param \DateTime|string|float|int $max
13
+ * @return int|false
14
+ */
15
+ protected static function getMaxTimestamp($max = 'now')
16
+ {
17
+ if (is_numeric($max)) {
18
+ return (int) $max;
19
+ }
20
+
21
+ if ($max instanceof \DateTime) {
22
+ return $max->getTimestamp();
23
+ }
24
+
25
+ return strtotime(empty($max) ? 'now' : $max);
26
+ }
27
+
28
+ /**
29
+ * Get a timestamp between January 1, 1970 and now
30
+ *
31
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
32
+ * @return int
33
+ *
34
+ * @example 1061306726
35
+ */
36
+ public static function unixTime($max = 'now')
37
+ {
38
+ return mt_rand(0, static::getMaxTimestamp($max));
39
+ }
40
+
41
+ /**
42
+ * Get a datetime object for a date between January 1, 1970 and now
43
+ *
44
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
45
+ * @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`
46
+ * @example DateTime('2005-08-16 20:39:21')
47
+ * @return \DateTime
48
+ * @see http://php.net/manual/en/timezones.php
49
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
50
+ */
51
+ public static function dateTime($max = 'now', $timezone = null)
52
+ {
53
+ return static::setTimezone(
54
+ new \DateTime('@' . static::unixTime($max)),
55
+ $timezone
56
+ );
57
+ }
58
+
59
+ /**
60
+ * Get a datetime object for a date between January 1, 001 and now
61
+ *
62
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
63
+ * @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`
64
+ * @example DateTime('1265-03-22 21:15:52')
65
+ * @return \DateTime
66
+ * @see http://php.net/manual/en/timezones.php
67
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
68
+ */
69
+ public static function dateTimeAD($max = 'now', $timezone = null)
70
+ {
71
+ $min = (PHP_INT_SIZE>4 ? -62135597361 : -PHP_INT_MAX);
72
+ return static::setTimezone(
73
+ new \DateTime('@' . mt_rand($min, static::getMaxTimestamp($max))),
74
+ $timezone
75
+ );
76
+ }
77
+
78
+ /**
79
+ * get a date string formatted with ISO8601
80
+ *
81
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
82
+ * @return string
83
+ * @example '2003-10-21T16:05:52+0000'
84
+ */
85
+ public static function iso8601($max = 'now')
86
+ {
87
+ return static::date(\DateTime::ISO8601, $max);
88
+ }
89
+
90
+ /**
91
+ * Get a date string between January 1, 1970 and now
92
+ *
93
+ * @param string $format
94
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
95
+ * @return string
96
+ * @example '2008-11-27'
97
+ */
98
+ public static function date($format = 'Y-m-d', $max = 'now')
99
+ {
100
+ return static::dateTime($max)->format($format);
101
+ }
102
+
103
+ /**
104
+ * Get a time string (24h format by default)
105
+ *
106
+ * @param string $format
107
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
108
+ * @return string
109
+ * @example '15:02:34'
110
+ */
111
+ public static function time($format = 'H:i:s', $max = 'now')
112
+ {
113
+ return static::dateTime($max)->format($format);
114
+ }
115
+
116
+ /**
117
+ * Get a DateTime object based on a random date between two given dates.
118
+ * Accepts date strings that can be recognized by strtotime().
119
+ *
120
+ * @param \DateTime|string $startDate Defaults to 30 years ago
121
+ * @param \DateTime|string $endDate Defaults to "now"
122
+ * @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`
123
+ * @example DateTime('1999-02-02 11:42:52')
124
+ * @return \DateTime
125
+ * @see http://php.net/manual/en/timezones.php
126
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
127
+ */
128
+ public static function dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null)
129
+ {
130
+ $startTimestamp = $startDate instanceof \DateTime ? $startDate->getTimestamp() : strtotime($startDate);
131
+ $endTimestamp = static::getMaxTimestamp($endDate);
132
+
133
+ if ($startTimestamp > $endTimestamp) {
134
+ throw new \InvalidArgumentException('Start date must be anterior to end date.');
135
+ }
136
+
137
+ $timestamp = mt_rand($startTimestamp, $endTimestamp);
138
+
139
+ return static::setTimezone(
140
+ new \DateTime('@' . $timestamp),
141
+ $timezone
142
+ );
143
+ }
144
+
145
+ /**
146
+ * Get a DateTime object based on a random date between one given date and
147
+ * an interval
148
+ * Accepts date string that can be recognized by strtotime().
149
+ *
150
+ * @param \DateTime|string $date Defaults to 30 years ago
151
+ * @param string $interval Defaults to 5 days after
152
+ * @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`
153
+ * @example dateTimeInInterval('1999-02-02 11:42:52', '+ 5 days')
154
+ * @return \DateTime
155
+ * @see http://php.net/manual/en/timezones.php
156
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
157
+ */
158
+ public static function dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null)
159
+ {
160
+ $intervalObject = \DateInterval::createFromDateString($interval);
161
+ $datetime = $date instanceof \DateTime ? $date : new \DateTime($date);
162
+ $otherDatetime = clone $datetime;
163
+ $otherDatetime->add($intervalObject);
164
+
165
+ $begin = $datetime > $otherDatetime ? $otherDatetime : $datetime;
166
+ $end = $datetime===$begin ? $otherDatetime : $datetime;
167
+
168
+ return static::dateTimeBetween(
169
+ $begin,
170
+ $end,
171
+ $timezone
172
+ );
173
+ }
174
+
175
+ /**
176
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
177
+ * @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`
178
+ * @example DateTime('1964-04-04 11:02:02')
179
+ * @return \DateTime
180
+ */
181
+ public static function dateTimeThisCentury($max = 'now', $timezone = null)
182
+ {
183
+ return static::dateTimeBetween('-100 year', $max, $timezone);
184
+ }
185
+
186
+ /**
187
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
188
+ * @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`
189
+ * @example DateTime('2010-03-10 05:18:58')
190
+ * @return \DateTime
191
+ */
192
+ public static function dateTimeThisDecade($max = 'now', $timezone = null)
193
+ {
194
+ return static::dateTimeBetween('-10 year', $max, $timezone);
195
+ }
196
+
197
+ /**
198
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
199
+ * @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`
200
+ * @example DateTime('2011-09-19 09:24:37')
201
+ * @return \DateTime
202
+ */
203
+ public static function dateTimeThisYear($max = 'now', $timezone = null)
204
+ {
205
+ return static::dateTimeBetween('-1 year', $max, $timezone);
206
+ }
207
+
208
+ /**
209
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
210
+ * @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`
211
+ * @example DateTime('2011-10-05 12:51:46')
212
+ * @return \DateTime
213
+ */
214
+ public static function dateTimeThisMonth($max = 'now', $timezone = null)
215
+ {
216
+ return static::dateTimeBetween('-1 month', $max, $timezone);
217
+ }
218
+
219
+ /**
220
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
221
+ * @return string
222
+ * @example 'am'
223
+ */
224
+ public static function amPm($max = 'now')
225
+ {
226
+ return static::dateTime($max)->format('a');
227
+ }
228
+
229
+ /**
230
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
231
+ * @return string
232
+ * @example '22'
233
+ */
234
+ public static function dayOfMonth($max = 'now')
235
+ {
236
+ return static::dateTime($max)->format('d');
237
+ }
238
+
239
+ /**
240
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
241
+ * @return string
242
+ * @example 'Tuesday'
243
+ */
244
+ public static function dayOfWeek($max = 'now')
245
+ {
246
+ return static::dateTime($max)->format('l');
247
+ }
248
+
249
+ /**
250
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
251
+ * @return string
252
+ * @example '7'
253
+ */
254
+ public static function month($max = 'now')
255
+ {
256
+ return static::dateTime($max)->format('m');
257
+ }
258
+
259
+ /**
260
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
261
+ * @return string
262
+ * @example 'September'
263
+ */
264
+ public static function monthName($max = 'now')
265
+ {
266
+ return static::dateTime($max)->format('F');
267
+ }
268
+
269
+ /**
270
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
271
+ * @return string
272
+ * @example '1673'
273
+ */
274
+ public static function year($max = 'now')
275
+ {
276
+ return static::dateTime($max)->format('Y');
277
+ }
278
+
279
+ /**
280
+ * @return string
281
+ * @example 'XVII'
282
+ */
283
+ public static function century()
284
+ {
285
+ return static::randomElement(static::$century);
286
+ }
287
+
288
+ /**
289
+ * @return string
290
+ * @example 'Europe/Paris'
291
+ */
292
+ public static function timezone()
293
+ {
294
+ return static::randomElement(\DateTimeZone::listIdentifiers());
295
+ }
296
+
297
+ /**
298
+ * Internal method to set the time zone on a DateTime.
299
+ *
300
+ * @param \DateTime $dt
301
+ * @param string|null $timezone
302
+ *
303
+ * @return \DateTime
304
+ */
305
+ private static function setTimezone(\DateTime $dt, $timezone)
306
+ {
307
+ return $dt->setTimezone(new \DateTimeZone(static::resolveTimezone($timezone)));
308
+ }
309
+
310
+ /**
311
+ * Sets default time zone.
312
+ *
313
+ * @param string $timezone
314
+ *
315
+ * @return void
316
+ */
317
+ public static function setDefaultTimezone($timezone = null)
318
+ {
319
+ static::$defaultTimezone = $timezone;
320
+ }
321
+
322
+ /**
323
+ * Gets default time zone.
324
+ *
325
+ * @return string|null
326
+ */
327
+ public static function getDefaultTimezone()
328
+ {
329
+ return static::$defaultTimezone;
330
+ }
331
+
332
+ /**
333
+ * @param string|null $timezone
334
+ * @return null|string
335
+ */
336
+ private static function resolveTimezone($timezone)
337
+ {
338
+ return ((null === $timezone) ? ((null === static::$defaultTimezone) ? date_default_timezone_get() : static::$defaultTimezone) : $timezone);
339
+ }
340
+ }
vendor/fakerphp/faker/src/Faker/Provider/File.php ADDED
@@ -0,0 +1,606 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Faker\Provider;
3
+
4
+ class File extends Base
5
+ {
6
+
7
+ /**
8
+ * MIME types from the apache.org file. Some types are truncated.
9
+ *
10
+ * @var array Map of MIME types => file extension(s)
11
+ * @link http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
12
+ */
13
+ protected static $mimeTypes = array(
14
+ 'application/atom+xml' => 'atom',
15
+ 'application/ecmascript' => 'ecma',
16
+ 'application/emma+xml' => 'emma',
17
+ 'application/epub+zip' => 'epub',
18
+ 'application/java-archive' => 'jar',
19
+ 'application/java-vm' => 'class',
20
+ 'application/javascript' => 'js',
21
+ 'application/json' => 'json',
22
+ 'application/jsonml+json' => 'jsonml',
23
+ 'application/lost+xml' => 'lostxml',
24
+ 'application/mathml+xml' => 'mathml',
25
+ 'application/mets+xml' => 'mets',
26
+ 'application/mods+xml' => 'mods',
27
+ 'application/mp4' => 'mp4s',
28
+ 'application/msword' => array('doc', 'dot'),
29
+ 'application/octet-stream' => array(
30
+ 'bin',
31
+ 'dms',
32
+ 'lrf',
33
+ 'mar',
34
+ 'so',
35
+ 'dist',
36
+ 'distz',
37
+ 'pkg',
38
+ 'bpk',
39
+ 'dump',
40
+ 'elc',
41
+ 'deploy'
42
+ ),
43
+ 'application/ogg' => 'ogx',
44
+ 'application/omdoc+xml' => 'omdoc',
45
+ 'application/pdf' => 'pdf',
46
+ 'application/pgp-encrypted' => 'pgp',
47
+ 'application/pgp-signature' => array('asc', 'sig'),
48
+ 'application/pkix-pkipath' => 'pkipath',
49
+ 'application/pkixcmp' => 'pki',
50
+ 'application/pls+xml' => 'pls',
51
+ 'application/postscript' => array('ai', 'eps', 'ps'),
52
+ 'application/pskc+xml' => 'pskcxml',
53
+ 'application/rdf+xml' => 'rdf',
54
+ 'application/reginfo+xml' => 'rif',
55
+ 'application/rss+xml' => 'rss',
56
+ 'application/rtf' => 'rtf',
57
+ 'application/sbml+xml' => 'sbml',
58
+ 'application/vnd.adobe.air-application-installer-package+zip' => 'air',
59
+ 'application/vnd.adobe.xdp+xml' => 'xdp',
60
+ 'application/vnd.adobe.xfdf' => 'xfdf',
61
+ 'application/vnd.ahead.space' => 'ahead',
62
+ 'application/vnd.dart' => 'dart',
63
+ 'application/vnd.data-vision.rdz' => 'rdz',
64
+ 'application/vnd.dece.data' => array('uvf', 'uvvf', 'uvd', 'uvvd'),
65
+ 'application/vnd.dece.ttml+xml' => array('uvt', 'uvvt'),
66
+ 'application/vnd.dece.unspecified' => array('uvx', 'uvvx'),
67
+ 'application/vnd.dece.zip' => array('uvz', 'uvvz'),
68
+ 'application/vnd.denovo.fcselayout-link' => 'fe_launch',
69
+ 'application/vnd.dna' => 'dna',
70
+ 'application/vnd.dolby.mlp' => 'mlp',
71
+ 'application/vnd.dpgraph' => 'dpg',
72
+ 'application/vnd.dreamfactory' => 'dfac',
73
+ 'application/vnd.ds-keypoint' => 'kpxx',
74
+ 'application/vnd.dvb.ait' => 'ait',
75
+ 'application/vnd.dvb.service' => 'svc',
76
+ 'application/vnd.dynageo' => 'geo',
77
+ 'application/vnd.ecowin.chart' => 'mag',
78
+ 'application/vnd.enliven' => 'nml',
79
+ 'application/vnd.epson.esf' => 'esf',
80
+ 'application/vnd.epson.msf' => 'msf',
81
+ 'application/vnd.epson.quickanime' => 'qam',
82
+ 'application/vnd.epson.salt' => 'slt',
83
+ 'application/vnd.epson.ssf' => 'ssf',
84
+ 'application/vnd.ezpix-album' => 'ez2',
85
+ 'application/vnd.ezpix-package' => 'ez3',
86
+ 'application/vnd.fdf' => 'fdf',
87
+ 'application/vnd.fdsn.mseed' => 'mseed',
88
+ 'application/vnd.fdsn.seed' => array('seed', 'dataless'),
89
+ 'application/vnd.flographit' => 'gph',
90
+ 'application/vnd.fluxtime.clip' => 'ftc',
91
+ 'application/vnd.hal+xml' => 'hal',
92
+ 'application/vnd.hydrostatix.sof-data' => 'sfd-hdstx',
93
+ 'application/vnd.ibm.minipay' => 'mpy',
94
+ 'application/vnd.ibm.secure-container' => 'sc',
95
+ 'application/vnd.iccprofile' => array('icc', 'icm'),
96
+ 'application/vnd.igloader' => 'igl',
97
+ 'application/vnd.immervision-ivp' => 'ivp',
98
+ 'application/vnd.kde.karbon' => 'karbon',
99
+ 'application/vnd.kde.kchart' => 'chrt',
100
+ 'application/vnd.kde.kformula' => 'kfo',
101
+ 'application/vnd.kde.kivio' => 'flw',
102
+ 'application/vnd.kde.kontour' => 'kon',
103
+ 'application/vnd.kde.kpresenter' => array('kpr', 'kpt'),
104
+ 'application/vnd.kde.kspread' => 'ksp',
105
+ 'application/vnd.kde.kword' => array('kwd', 'kwt'),
106
+ 'application/vnd.kenameaapp' => 'htke',
107
+ 'application/vnd.kidspiration' => 'kia',
108
+ 'application/vnd.kinar' => array('kne', 'knp'),
109
+ 'application/vnd.koan' => array('skp', 'skd', 'skt', 'skm'),
110
+ 'application/vnd.kodak-descriptor' => 'sse',
111
+ 'application/vnd.las.las+xml' => 'lasxml',
112
+ 'application/vnd.llamagraphics.life-balance.desktop' => 'lbd',
113
+ 'application/vnd.llamagraphics.life-balance.exchange+xml' => 'lbe',
114
+ 'application/vnd.lotus-1-2-3' => '123',
115
+ 'application/vnd.lotus-approach' => 'apr',
116
+ 'application/vnd.lotus-freelance' => 'pre',
117
+ 'application/vnd.lotus-notes' => 'nsf',
118
+ 'application/vnd.lotus-organizer' => 'org',
119
+ 'application/vnd.lotus-screencam' => 'scm',
120
+ 'application/vnd.mozilla.xul+xml' => 'xul',
121
+ 'application/vnd.ms-artgalry' => 'cil',
122
+ 'application/vnd.ms-cab-compressed' => 'cab',
123
+ 'application/vnd.ms-excel' => array(
124
+ 'xls',
125
+ 'xlm',
126
+ 'xla',
127
+ 'xlc',
128
+ 'xlt',
129
+ 'xlw'
130
+ ),
131
+ 'application/vnd.ms-excel.addin.macroenabled.12' => 'xlam',
132
+ 'application/vnd.ms-excel.sheet.binary.macroenabled.12' => 'xlsb',
133
+ 'application/vnd.ms-excel.sheet.macroenabled.12' => 'xlsm',
134
+ 'application/vnd.ms-excel.template.macroenabled.12' => 'xltm',
135
+ 'application/vnd.ms-fontobject' => 'eot',
136
+ 'application/vnd.ms-htmlhelp' => 'chm',
137
+ 'application/vnd.ms-ims' => 'ims',
138
+ 'application/vnd.ms-lrm' => 'lrm',
139
+ 'application/vnd.ms-officetheme' => 'thmx',
140
+ 'application/vnd.ms-pki.seccat' => 'cat',
141
+ 'application/vnd.ms-pki.stl' => 'stl',
142
+ 'application/vnd.ms-powerpoint' => array('ppt', 'pps', 'pot'),
143
+ 'application/vnd.ms-powerpoint.addin.macroenabled.12' => 'ppam',
144
+ 'application/vnd.ms-powerpoint.presentation.macroenabled.12' => 'pptm',
145
+ 'application/vnd.ms-powerpoint.slide.macroenabled.12' => 'sldm',
146
+ 'application/vnd.ms-powerpoint.slideshow.macroenabled.12' => 'ppsm',
147
+ 'application/vnd.ms-powerpoint.template.macroenabled.12' => 'potm',
148
+ 'application/vnd.ms-project' => array('mpp', 'mpt'),
149
+ 'application/vnd.ms-word.document.macroenabled.12' => 'docm',
150
+ 'application/vnd.ms-word.template.macroenabled.12' => 'dotm',
151
+ 'application/vnd.ms-works' => array('wps', 'wks', 'wcm', 'wdb'),
152
+ 'application/vnd.ms-wpl' => 'wpl',
153
+ 'application/vnd.ms-xpsdocument' => 'xps',
154
+ 'application/vnd.mseq' => 'mseq',
155
+ 'application/vnd.musician' => 'mus',
156
+ 'application/vnd.oasis.opendocument.chart' => 'odc',
157
+ 'application/vnd.oasis.opendocument.chart-template' => 'otc',
158
+ 'application/vnd.oasis.opendocument.database' => 'odb',
159
+ 'application/vnd.oasis.opendocument.formula' => 'odf',
160
+ 'application/vnd.oasis.opendocument.formula-template' => 'odft',
161
+ 'application/vnd.oasis.opendocument.graphics' => 'odg',
162
+ 'application/vnd.oasis.opendocument.graphics-template' => 'otg',
163
+ 'application/vnd.oasis.opendocument.image' => 'odi',
164
+ 'application/vnd.oasis.opendocument.image-template' => 'oti',
165
+ 'application/vnd.oasis.opendocument.presentation' => 'odp',
166
+ 'application/vnd.oasis.opendocument.presentation-template' => 'otp',
167
+ 'application/vnd.oasis.opendocument.spreadsheet' => 'ods',
168
+ 'application/vnd.oasis.opendocument.spreadsheet-template' => 'ots',
169
+ 'application/vnd.oasis.opendocument.text' => 'odt',
170
+ 'application/vnd.oasis.opendocument.text-master' => 'odm',
171
+ 'application/vnd.oasis.opendocument.text-template' => 'ott',
172
+ 'application/vnd.oasis.opendocument.text-web' => 'oth',
173
+ 'application/vnd.olpc-sugar' => 'xo',
174
+ 'application/vnd.oma.dd2+xml' => 'dd2',
175
+ 'application/vnd.openofficeorg.extension' => 'oxt',
176
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx',
177
+ 'application/vnd.openxmlformats-officedocument.presentationml.slide' => 'sldx',
178
+ 'application/vnd.openxmlformats-officedocument.presentationml.slideshow' => 'ppsx',
179
+ 'application/vnd.openxmlformats-officedocument.presentationml.template' => 'potx',
180
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx',
181
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'xltx',
182
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx',
183
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.template' => 'dotx',
184
+ 'application/vnd.pvi.ptid1' => 'ptid',
185
+ 'application/vnd.quark.quarkxpress' => array(
186
+ 'qxd',
187
+ 'qxt',
188
+ 'qwd',
189
+ 'qwt',
190
+ 'qxl',
191
+ 'qxb'
192
+ ),
193
+ 'application/vnd.realvnc.bed' => 'bed',
194
+ 'application/vnd.recordare.musicxml' => 'mxl',
195
+ 'application/vnd.recordare.musicxml+xml' => 'musicxml',
196
+ 'application/vnd.rig.cryptonote' => 'cryptonote',
197
+ 'application/vnd.rim.cod' => 'cod',
198
+ 'application/vnd.rn-realmedia' => 'rm',
199
+ 'application/vnd.rn-realmedia-vbr' => 'rmvb',
200
+ 'application/vnd.route66.link66+xml' => 'link66',
201
+ 'application/vnd.sailingtracker.track' => 'st',
202
+ 'application/vnd.seemail' => 'see',
203
+ 'application/vnd.sema' => 'sema',
204
+ 'application/vnd.semd' => 'semd',
205
+ 'application/vnd.semf' => 'semf',
206
+ 'application/vnd.shana.informed.formdata' => 'ifm',
207
+ 'application/vnd.shana.informed.formtemplate' => 'itp',
208
+ 'application/vnd.shana.informed.interchange' => 'iif',
209
+ 'application/vnd.shana.informed.package' => 'ipk',
210
+ 'application/vnd.simtech-mindmapper' => array('twd', 'twds'),
211
+ 'application/vnd.smaf' => 'mmf',
212
+ 'application/vnd.stepmania.stepchart' => 'sm',
213
+ 'application/vnd.sun.xml.calc' => 'sxc',
214
+ 'application/vnd.sun.xml.calc.template' => 'stc',
215
+ 'application/vnd.sun.xml.draw' => 'sxd',
216
+ 'application/vnd.sun.xml.draw.template' => 'std',
217
+ 'application/vnd.sun.xml.impress' => 'sxi',
218
+ 'application/vnd.sun.xml.impress.template' => 'sti',
219
+ 'application/vnd.sun.xml.math' => 'sxm',
220
+ 'application/vnd.sun.xml.writer' => 'sxw',
221
+ 'application/vnd.sun.xml.writer.global' => 'sxg',
222
+ 'application/vnd.sun.xml.writer.template' => 'stw',
223
+ 'application/vnd.sus-calendar' => array('sus', 'susp'),
224
+ 'application/vnd.svd' => 'svd',
225
+ 'application/vnd.symbian.install' => array('sis', 'sisx'),
226
+ 'application/vnd.syncml+xml' => 'xsm',
227
+ 'application/vnd.syncml.dm+wbxml' => 'bdm',
228
+ 'application/vnd.syncml.dm+xml' => 'xdm',
229
+ 'application/vnd.tao.intent-module-archive' => 'tao',
230
+ 'application/vnd.tcpdump.pcap' => array('pcap', 'cap', 'dmp'),
231
+ 'application/vnd.tmobile-livetv' => 'tmo',
232
+ 'application/vnd.trid.tpt' => 'tpt',
233
+ 'application/vnd.triscape.mxs' => 'mxs',
234
+ 'application/vnd.trueapp' => 'tra',
235
+ 'application/vnd.ufdl' => array('ufd', 'ufdl'),
236
+ 'application/vnd.uiq.theme' => 'utz',
237
+ 'application/vnd.umajin' => 'umj',
238
+ 'application/vnd.unity' => 'unityweb',
239
+ 'application/vnd.uoml+xml' => 'uoml',
240
+ 'application/vnd.vcx' => 'vcx',
241
+ 'application/vnd.visio' => array('vsd', 'vst', 'vss', 'vsw'),
242
+ 'application/vnd.visionary' => 'vis',
243
+ 'application/vnd.vsf' => 'vsf',
244
+ 'application/vnd.wap.wbxml' => 'wbxml',
245
+ 'application/vnd.wap.wmlc' => 'wmlc',
246
+ 'application/vnd.wap.wmlscriptc' => 'wmlsc',
247
+ 'application/vnd.webturbo' => 'wtb',
248
+ 'application/vnd.wolfram.player' => 'nbp',
249
+ 'application/vnd.wordperfect' => 'wpd',
250
+ 'application/vnd.wqd' => 'wqd',
251
+ 'application/vnd.wt.stf' => 'stf',
252
+ 'application/vnd.xara' => 'xar',
253
+ 'application/vnd.xfdl' => 'xfdl',
254
+ 'application/voicexml+xml' => 'vxml',
255
+ 'application/widget' => 'wgt',
256
+ 'application/winhlp' => 'hlp',
257
+ 'application/wsdl+xml' => 'wsdl',
258
+ 'application/wspolicy+xml' => 'wspolicy',
259
+ 'application/x-7z-compressed' => '7z',
260
+ 'application/x-bittorrent' => 'torrent',
261
+ 'application/x-blorb' => array('blb', 'blorb'),
262
+ 'application/x-bzip' => 'bz',
263
+ 'application/x-cdlink' => 'vcd',
264
+ 'application/x-cfs-compressed' => 'cfs',
265
+ 'application/x-chat' => 'chat',
266
+ 'application/x-chess-pgn' => 'pgn',
267
+ 'application/x-conference' => 'nsc',
268
+ 'application/x-cpio' => 'cpio',
269
+ 'application/x-csh' => 'csh',
270
+ 'application/x-debian-package' => array('deb', 'udeb'),
271
+ 'application/x-dgc-compressed' => 'dgc',
272
+ 'application/x-director' => array(
273
+ 'dir',
274
+ 'dcr',
275
+ 'dxr',
276
+ 'cst',
277
+ 'cct',
278
+ 'cxt',
279
+ 'w3d',
280
+ 'fgd',
281
+ 'swa'
282
+ ),
283
+ 'application/x-font-ttf' => array('ttf', 'ttc'),
284
+ 'application/x-font-type1' => array('pfa', 'pfb', 'pfm', 'afm'),
285
+ 'application/x-font-woff' => 'woff',
286
+ 'application/x-freearc' => 'arc',
287
+ 'application/x-futuresplash' => 'spl',
288
+ 'application/x-gca-compressed' => 'gca',
289
+ 'application/x-glulx' => 'ulx',
290
+ 'application/x-gnumeric' => 'gnumeric',
291
+ 'application/x-gramps-xml' => 'gramps',
292
+ 'application/x-gtar' => 'gtar',
293
+ 'application/x-hdf' => 'hdf',
294
+ 'application/x-install-instructions' => 'install',
295
+ 'application/x-iso9660-image' => 'iso',
296
+ 'application/x-java-jnlp-file' => 'jnlp',
297
+ 'application/x-latex' => 'latex',
298
+ 'application/x-lzh-compressed' => array('lzh', 'lha'),
299
+ 'application/x-mie' => 'mie',
300
+ 'application/x-mobipocket-ebook' => array('prc', 'mobi'),
301
+ 'application/x-ms-application' => 'application',
302
+ 'application/x-ms-shortcut' => 'lnk',
303
+ 'application/x-ms-wmd' => 'wmd',
304
+ 'application/x-ms-wmz' => 'wmz',
305
+ 'application/x-ms-xbap' => 'xbap',
306
+ 'application/x-msaccess' => 'mdb',
307
+ 'application/x-msbinder' => 'obd',
308
+ 'application/x-mscardfile' => 'crd',
309
+ 'application/x-msclip' => 'clp',
310
+ 'application/x-msdownload' => array('exe', 'dll', 'com', 'bat', 'msi'),
311
+ 'application/x-msmediaview' => array(
312
+ 'mvb',
313
+ 'm13',
314
+ 'm14'
315
+ ),
316
+ 'application/x-msmetafile' => array('wmf', 'wmz', 'emf', 'emz'),
317
+ 'application/x-rar-compressed' => 'rar',
318
+ 'application/x-research-info-systems' => 'ris',
319
+ 'application/x-sh' => 'sh',
320
+ 'application/x-shar' => 'shar',
321
+ 'application/x-shockwave-flash' => 'swf',
322
+ 'application/x-silverlight-app' => 'xap',
323
+ 'application/x-sql' => 'sql',
324
+ 'application/x-stuffit' => 'sit',
325
+ 'application/x-stuffitx' => 'sitx',
326
+ 'application/x-subrip' => 'srt',
327
+ 'application/x-sv4cpio' => 'sv4cpio',
328
+ 'application/x-sv4crc' => 'sv4crc',
329
+ 'application/x-t3vm-image' => 't3',
330
+ 'application/x-tads' => 'gam',
331
+ 'application/x-tar' => 'tar',
332
+ 'application/x-tcl' => 'tcl',
333
+ 'application/x-tex' => 'tex',
334
+ 'application/x-tex-tfm' => 'tfm',
335
+ 'application/x-texinfo' => array('texinfo', 'texi'),
336
+ 'application/x-tgif' => 'obj',
337
+ 'application/x-ustar' => 'ustar',
338
+ 'application/x-wais-source' => 'src',
339
+ 'application/x-x509-ca-cert' => array('der', 'crt'),
340
+ 'application/x-xfig' => 'fig',
341
+ 'application/x-xliff+xml' => 'xlf',
342
+ 'application/x-xpinstall' => 'xpi',
343
+ 'application/x-xz' => 'xz',
344
+ 'application/x-zmachine' => 'z1',
345
+ 'application/xaml+xml' => 'xaml',
346
+ 'application/xcap-diff+xml' => 'xdf',
347
+ 'application/xenc+xml' => 'xenc',
348
+ 'application/xhtml+xml' => array('xhtml', 'xht'),
349
+ 'application/xml' => array('xml', 'xsl'),
350
+ 'application/xml-dtd' => 'dtd',
351
+ 'application/xop+xml' => 'xop',
352
+ 'application/xproc+xml' => 'xpl',
353
+ 'application/xslt+xml' => 'xslt',
354
+ 'application/xspf+xml' => 'xspf',
355
+ 'application/xv+xml' => array('mxml', 'xhvml', 'xvml', 'xvm'),
356
+ 'application/yang' => 'yang',
357
+ 'application/yin+xml' => 'yin',
358
+ 'application/zip' => 'zip',
359
+ 'audio/adpcm' => 'adp',
360
+ 'audio/basic' => array('au', 'snd'),
361
+ 'audio/midi' => array('mid', 'midi', 'kar', 'rmi'),
362
+ 'audio/mp4' => 'mp4a',
363
+ 'audio/mpeg' => array(
364
+ 'mpga',
365
+ 'mp2',
366
+ 'mp2a',
367
+ 'mp3',
368
+ 'm2a',
369
+ 'm3a'
370
+ ),
371
+ 'audio/ogg' => array('oga', 'ogg', 'spx'),
372
+ 'audio/vnd.dece.audio' => array('uva', 'uvva'),
373
+ 'audio/vnd.rip' => 'rip',
374
+ 'audio/webm' => 'weba',
375
+ 'audio/x-aac' => 'aac',
376
+ 'audio/x-aiff' => array('aif', 'aiff', 'aifc'),
377
+ 'audio/x-caf' => 'caf',
378
+ 'audio/x-flac' => 'flac',
379
+ 'audio/x-matroska' => 'mka',
380
+ 'audio/x-mpegurl' => 'm3u',
381
+ 'audio/x-ms-wax' => 'wax',
382
+ 'audio/x-ms-wma' => 'wma',
383
+ 'audio/x-pn-realaudio' => array('ram', 'ra'),
384
+ 'audio/x-pn-realaudio-plugin' => 'rmp',
385
+ 'audio/x-wav' => 'wav',
386
+ 'audio/xm' => 'xm',
387
+ 'image/bmp' => 'bmp',
388
+ 'image/cgm' => 'cgm',
389
+ 'image/g3fax' => 'g3',
390
+ 'image/gif' => 'gif',
391
+ 'image/ief' => 'ief',
392
+ 'image/jpeg' => array('jpeg', 'jpg', 'jpe'),
393
+ 'image/ktx' => 'ktx',
394
+ 'image/png' => 'png',
395
+ 'image/prs.btif' => 'btif',
396
+ 'image/sgi' => 'sgi',
397
+ 'image/svg+xml' => array('svg', 'svgz'),
398
+ 'image/tiff' => array('tiff', 'tif'),
399
+ 'image/vnd.adobe.photoshop' => 'psd',
400
+ 'image/vnd.dece.graphic' => array('uvi', 'uvvi', 'uvg', 'uvvg'),
401
+ 'image/vnd.dvb.subtitle' => 'sub',
402
+ 'image/vnd.djvu' => array('djvu', 'djv'),
403
+ 'image/vnd.dwg' => 'dwg',
404
+ 'image/vnd.dxf' => 'dxf',
405
+ 'image/vnd.fastbidsheet' => 'fbs',
406
+ 'image/vnd.fpx' => 'fpx',
407
+ 'image/vnd.fst' => 'fst',
408
+ 'image/vnd.fujixerox.edmics-mmr' => 'mmr',
409
+ 'image/vnd.fujixerox.edmics-rlc' => 'rlc',
410
+ 'image/vnd.ms-modi' => 'mdi',
411
+ 'image/vnd.ms-photo' => 'wdp',
412
+ 'image/vnd.net-fpx' => 'npx',
413
+ 'image/vnd.wap.wbmp' => 'wbmp',
414
+ 'image/vnd.xiff' => 'xif',
415
+ 'image/webp' => 'webp',
416
+ 'image/x-3ds' => '3ds',
417
+ 'image/x-cmu-raster' => 'ras',
418
+ 'image/x-cmx' => 'cmx',
419
+ 'image/x-freehand' => array('fh', 'fhc', 'fh4', 'fh5', 'fh7'),
420
+ 'image/x-icon' => 'ico',
421
+ 'image/x-mrsid-image' => 'sid',
422
+ 'image/x-pcx' => 'pcx',
423
+ 'image/x-pict' => array('pic', 'pct'),
424
+ 'image/x-portable-anymap' => 'pnm',
425
+ 'image/x-portable-bitmap' => 'pbm',
426
+ 'image/x-portable-graymap' => 'pgm',
427
+ 'image/x-portable-pixmap' => 'ppm',
428
+ 'image/x-rgb' => 'rgb',
429
+ 'image/x-tga' => 'tga',
430
+ 'image/x-xbitmap' => 'xbm',
431
+ 'image/x-xpixmap' => 'xpm',
432
+ 'image/x-xwindowdump' => 'xwd',
433
+ 'message/rfc822' => array('eml', 'mime'),
434
+ 'model/iges' => array('igs', 'iges'),
435
+ 'model/mesh' => array('msh', 'mesh', 'silo'),
436
+ 'model/vnd.collada+xml' => 'dae',
437
+ 'model/vnd.dwf' => 'dwf',
438
+ 'model/vnd.gdl' => 'gdl',
439
+ 'model/vnd.gtw' => 'gtw',
440
+ 'model/vnd.mts' => 'mts',
441
+ 'model/vnd.vtu' => 'vtu',
442
+ 'model/vrml' => array('wrl', 'vrml'),
443
+ 'model/x3d+binary' => 'x3db',
444
+ 'model/x3d+vrml' => 'x3dv',
445
+ 'model/x3d+xml' => 'x3d',
446
+ 'text/cache-manifest' => 'appcache',
447
+ 'text/calendar' => array('ics', 'ifb'),
448
+ 'text/css' => 'css',
449
+ 'text/csv' => 'csv',
450
+ 'text/html' => array('html', 'htm'),
451
+ 'text/n3' => 'n3',
452
+ 'text/plain' => array(
453
+ 'txt',
454
+ 'text',
455
+ 'conf',
456
+ 'def',
457
+ 'list',
458
+ 'log',
459
+ 'in'
460
+ ),
461
+ 'text/prs.lines.tag' => 'dsc',
462
+ 'text/richtext' => 'rtx',
463
+ 'text/sgml' => array('sgml', 'sgm'),
464
+ 'text/tab-separated-values' => 'tsv',
465
+ 'text/troff' => array(
466
+ 't',
467
+ 'tr',
468
+ 'roff',
469
+ 'man',
470
+ 'me',
471
+ 'ms'
472
+ ),
473
+ 'text/turtle' => 'ttl',
474
+ 'text/uri-list' => array('uri', 'uris', 'urls'),
475
+ 'text/vcard' => 'vcard',
476
+ 'text/vnd.curl' => 'curl',
477
+ 'text/vnd.curl.dcurl' => 'dcurl',
478
+ 'text/vnd.curl.scurl' => 'scurl',
479
+ 'text/vnd.curl.mcurl' => 'mcurl',
480
+ 'text/vnd.dvb.subtitle' => 'sub',
481
+ 'text/vnd.fly' => 'fly',
482
+ 'text/vnd.fmi.flexstor' => 'flx',
483
+ 'text/vnd.graphviz' => 'gv',
484
+ 'text/vnd.in3d.3dml' => '3dml',
485
+ 'text/vnd.in3d.spot' => 'spot',
486
+ 'text/vnd.sun.j2me.app-descriptor' => 'jad',
487
+ 'text/vnd.wap.wml' => 'wml',
488
+ 'text/vnd.wap.wmlscript' => 'wmls',
489
+ 'text/x-asm' => array('s', 'asm'),
490
+ 'text/x-fortran' => array('f', 'for', 'f77', 'f90'),
491
+ 'text/x-java-source' => 'java',
492
+ 'text/x-opml' => 'opml',
493
+ 'text/x-pascal' => array('p', 'pas'),
494
+ 'text/x-nfo' => 'nfo',
495
+ 'text/x-setext' => 'etx',
496
+ 'text/x-sfv' => 'sfv',
497
+ 'text/x-uuencode' => 'uu',
498
+ 'text/x-vcalendar' => 'vcs',
499
+ 'text/x-vcard' => 'vcf',
500
+ 'video/3gpp' => '3gp',
501
+ 'video/3gpp2' => '3g2',
502
+ 'video/h261' => 'h261',
503
+ 'video/h263' => 'h263',
504
+ 'video/h264' => 'h264',
505
+ 'video/jpeg' => 'jpgv',
506
+ 'video/jpm' => array('jpm', 'jpgm'),
507
+ 'video/mj2' => 'mj2',
508
+ 'video/mp4' => 'mp4',
509
+ 'video/mpeg' => array('mpeg', 'mpg', 'mpe', 'm1v', 'm2v'),
510
+ 'video/ogg' => 'ogv',
511
+ 'video/quicktime' => array('qt', 'mov'),
512
+ 'video/vnd.dece.hd' => array('uvh', 'uvvh'),
513
+ 'video/vnd.dece.mobile' => array('uvm', 'uvvm'),
514
+ 'video/vnd.dece.pd' => array('uvp', 'uvvp'),
515
+ 'video/vnd.dece.sd' => array('uvs', 'uvvs'),
516
+ 'video/vnd.dece.video' => array('uvv', 'uvvv'),
517
+ 'video/vnd.dvb.file' => 'dvb',
518
+ 'video/vnd.fvt' => 'fvt',
519
+ 'video/vnd.mpegurl' => array('mxu', 'm4u'),
520
+ 'video/vnd.ms-playready.media.pyv' => 'pyv',
521
+ 'video/vnd.uvvu.mp4' => array('uvu', 'uvvu'),
522
+ 'video/vnd.vivo' => 'viv',
523
+ 'video/webm' => 'webm',
524
+ 'video/x-f4v' => 'f4v',
525
+ 'video/x-fli' => 'fli',
526
+ 'video/x-flv' => 'flv',
527
+ 'video/x-m4v' => 'm4v',
528
+ 'video/x-matroska' => array('mkv', 'mk3d', 'mks'),
529
+ 'video/x-mng' => 'mng',
530
+ 'video/x-ms-asf' => array('asf', 'asx'),
531
+ 'video/x-ms-vob' => 'vob',
532
+ 'video/x-ms-wm' => 'wm',
533
+ 'video/x-ms-wmv' => 'wmv',
534
+ 'video/x-ms-wmx' => 'wmx',
535
+ 'video/x-ms-wvx' => 'wvx',
536
+ 'video/x-msvideo' => 'avi',
537
+ 'video/x-sgi-movie' => 'movie',
538
+ );
539
+
540
+ /**
541
+ * Get a random MIME type
542
+ *
543
+ * @return string
544
+ * @example 'video/avi'
545
+ */
546
+ public static function mimeType()
547
+ {
548
+ return static::randomElement(array_keys(static::$mimeTypes));
549
+ }
550
+
551
+ /**
552
+ * Get a random file extension (without a dot)
553
+ *
554
+ * @example avi
555
+ * @return string
556
+ */
557
+ public static function fileExtension()
558
+ {
559
+ $random_extension = static::randomElement(array_values(static::$mimeTypes));
560
+
561
+ return is_array($random_extension) ? static::randomElement($random_extension) : $random_extension;
562
+ }
563
+
564
+ /**
565
+ * Copy a random file from the source directory to the target directory and returns the filename/fullpath
566
+ *
567
+ * @param string $sourceDirectory The directory to look for random file taking
568
+ * @param string $targetDirectory
569
+ * @param boolean $fullPath Whether to have the full path or just the filename
570
+ * @return string
571
+ */
572
+ public static function file($sourceDirectory = '/tmp', $targetDirectory = '/tmp', $fullPath = true)
573
+ {
574
+ if (!is_dir($sourceDirectory)) {
575
+ throw new \InvalidArgumentException(sprintf('Source directory %s does not exist or is not a directory.', $sourceDirectory));
576
+ }
577
+
578
+ if (!is_dir($targetDirectory)) {
579
+ throw new \InvalidArgumentException(sprintf('Target directory %s does not exist or is not a directory.', $targetDirectory));
580
+ }
581
+
582
+ if ($sourceDirectory == $targetDirectory) {
583
+ throw new \InvalidArgumentException('Source and target directories must differ.');
584
+ }
585
+
586
+ // Drop . and .. and reset array keys
587
+ $files = array_filter(array_values(array_diff(scandir($sourceDirectory), array('.', '..'))), function ($file) use ($sourceDirectory) {
588
+ return is_file($sourceDirectory . DIRECTORY_SEPARATOR . $file) && is_readable($sourceDirectory . DIRECTORY_SEPARATOR . $file);
589
+ });
590
+
591
+ if (empty($files)) {
592
+ throw new \InvalidArgumentException(sprintf('Source directory %s is empty.', $sourceDirectory));
593
+ }
594
+
595
+ $sourceFullPath = $sourceDirectory . DIRECTORY_SEPARATOR . static::randomElement($files);
596
+
597
+ $destinationFile = Uuid::uuid() . '.' . pathinfo($sourceFullPath, PATHINFO_EXTENSION);
598
+ $destinationFullPath = $targetDirectory . DIRECTORY_SEPARATOR . $destinationFile;
599
+
600
+ if (false === copy($sourceFullPath, $destinationFullPath)) {
601
+ return false;
602
+ }
603
+
604
+ return $fullPath ? $destinationFullPath : $destinationFile;
605
+ }
606
+ }
vendor/fakerphp/faker/src/Faker/Provider/HtmlLorem.php ADDED
@@ -0,0 +1,276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ use Faker\Generator;
6
+ use Faker\UniqueGenerator;
7
+
8
+ class HtmlLorem extends Base
9
+ {
10
+
11
+ const HTML_TAG = "html";
12
+ const HEAD_TAG = "head";
13
+ const BODY_TAG = "body";
14
+ const DIV_TAG = "div";
15
+ const P_TAG = "p";
16
+ const A_TAG = "a";
17
+ const SPAN_TAG = "span";
18
+ const TABLE_TAG = "table";
19
+ const THEAD_TAG = "thead";
20
+ const TBODY_TAG = "tbody";
21
+ const TR_TAG = "tr";
22
+ const TD_TAG = "td";
23
+ const TH_TAG = "th";
24
+ const UL_TAG = "ul";
25
+ const LI_TAG = "li";
26
+ const H_TAG = "h";
27
+ const B_TAG = "b";
28
+ const I_TAG = "i";
29
+ const TITLE_TAG = "title";
30
+ const FORM_TAG = "form";
31
+ const INPUT_TAG = "input";
32
+ const LABEL_TAG = "label";
33
+
34
+ private $idGenerator;
35
+
36
+ public function __construct(Generator $generator)
37
+ {
38
+ parent::__construct($generator);
39
+ $generator->addProvider(new Lorem($generator));
40
+ $generator->addProvider(new Internet($generator));
41
+ }
42
+
43
+ /**
44
+ * @param integer $maxDepth
45
+ * @param integer $maxWidth
46
+ *
47
+ * @return string
48
+ */
49
+ public function randomHtml($maxDepth = 4, $maxWidth = 4)
50
+ {
51
+ $document = new \DOMDocument();
52
+ $this->idGenerator = new UniqueGenerator($this->generator);
53
+
54
+ $head = $document->createElement("head");
55
+ $this->addRandomTitle($head);
56
+
57
+ $body = $document->createElement("body");
58
+ $this->addLoginForm($body);
59
+ $this->addRandomSubTree($body, $maxDepth, $maxWidth);
60
+
61
+ $html = $document->createElement("html");
62
+ $html->appendChild($head);
63
+ $html->appendChild($body);
64
+
65
+ $document->appendChild($html);
66
+ return $document->saveHTML();
67
+ }
68
+
69
+ private function addRandomSubTree(\DOMElement $root, $maxDepth, $maxWidth)
70
+ {
71
+ $maxDepth--;
72
+ if ($maxDepth <= 0) {
73
+ return $root;
74
+ }
75
+
76
+ $siblings = mt_rand(1, $maxWidth);
77
+ for ($i = 0; $i < $siblings; $i++) {
78
+ if ($maxDepth == 1) {
79
+ $this->addRandomLeaf($root);
80
+ } else {
81
+ $sibling = $root->ownerDocument->createElement("div");
82
+ $root->appendChild($sibling);
83
+ $this->addRandomAttribute($sibling);
84
+ $this->addRandomSubTree($sibling, mt_rand(0, $maxDepth), $maxWidth);
85
+ }
86
+ }
87
+ return $root;
88
+ }
89
+
90
+ private function addRandomLeaf(\DOMElement $node)
91
+ {
92
+ $rand = mt_rand(1, 10);
93
+ switch ($rand) {
94
+ case 1:
95
+ $this->addRandomP($node);
96
+ break;
97
+ case 2:
98
+ $this->addRandomA($node);
99
+ break;
100
+ case 3:
101
+ $this->addRandomSpan($node);
102
+ break;
103
+ case 4:
104
+ $this->addRandomUL($node);
105
+ break;
106
+ case 5:
107
+ $this->addRandomH($node);
108
+ break;
109
+ case 6:
110
+ $this->addRandomB($node);
111
+ break;
112
+ case 7:
113
+ $this->addRandomI($node);
114
+ break;
115
+ case 8:
116
+ $this->addRandomTable($node);
117
+ break;
118
+ default:
119
+ $this->addRandomText($node);
120
+ break;
121
+ }
122
+ }
123
+
124
+ private function addRandomAttribute(\DOMElement $node)
125
+ {
126
+ $rand = mt_rand(1, 2);
127
+ switch ($rand) {
128
+ case 1:
129
+ $node->setAttribute("class", $this->generator->word);
130
+ break;
131
+ case 2:
132
+ $node->setAttribute("id", (string)$this->idGenerator->randomNumber(5));
133
+ break;
134
+ }
135
+ }
136
+
137
+ private function addRandomP(\DOMElement $element, $maxLength = 10)
138
+ {
139
+
140
+ $node = $element->ownerDocument->createElement(static::P_TAG);
141
+ $node->textContent = $this->generator->sentence(mt_rand(1, $maxLength));
142
+ $element->appendChild($node);
143
+ }
144
+
145
+ private function addRandomText(\DOMElement $element, $maxLength = 10)
146
+ {
147
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
148
+ $element->appendChild($text);
149
+ }
150
+
151
+ private function addRandomA(\DOMElement $element, $maxLength = 10)
152
+ {
153
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
154
+ $node = $element->ownerDocument->createElement(static::A_TAG);
155
+ $node->setAttribute("href", $this->generator->safeEmailDomain);
156
+ $node->appendChild($text);
157
+ $element->appendChild($node);
158
+ }
159
+
160
+ private function addRandomTitle(\DOMElement $element, $maxLength = 10)
161
+ {
162
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
163
+ $node = $element->ownerDocument->createElement(static::TITLE_TAG);
164
+ $node->appendChild($text);
165
+ $element->appendChild($node);
166
+ }
167
+
168
+ private function addRandomH(\DOMElement $element, $maxLength = 10)
169
+ {
170
+ $h = static::H_TAG . (string)mt_rand(1, 3);
171
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
172
+ $node = $element->ownerDocument->createElement($h);
173
+ $node->appendChild($text);
174
+ $element->appendChild($node);
175
+ }
176
+
177
+ private function addRandomB(\DOMElement $element, $maxLength = 10)
178
+ {
179
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
180
+ $node = $element->ownerDocument->createElement(static::B_TAG);
181
+ $node->appendChild($text);
182
+ $element->appendChild($node);
183
+ }
184
+
185
+ private function addRandomI(\DOMElement $element, $maxLength = 10)
186
+ {
187
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
188
+ $node = $element->ownerDocument->createElement(static::I_TAG);
189
+ $node->appendChild($text);
190
+ $element->appendChild($node);
191
+ }
192
+
193
+ private function addRandomSpan(\DOMElement $element, $maxLength = 10)
194
+ {
195
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
196
+ $node = $element->ownerDocument->createElement(static::SPAN_TAG);
197
+ $node->appendChild($text);
198
+ $element->appendChild($node);
199
+ }
200
+
201
+ private function addLoginForm(\DOMElement $element)
202
+ {
203
+
204
+ $textInput = $element->ownerDocument->createElement(static::INPUT_TAG);
205
+ $textInput->setAttribute("type", "text");
206
+ $textInput->setAttribute("id", "username");
207
+
208
+ $textLabel = $element->ownerDocument->createElement(static::LABEL_TAG);
209
+ $textLabel->setAttribute("for", "username");
210
+ $textLabel->textContent = $this->generator->word;
211
+
212
+ $passwordInput = $element->ownerDocument->createElement(static::INPUT_TAG);
213
+ $passwordInput->setAttribute("type", "password");
214
+ $passwordInput->setAttribute("id", "password");
215
+
216
+ $passwordLabel = $element->ownerDocument->createElement(static::LABEL_TAG);
217
+ $passwordLabel->setAttribute("for", "password");
218
+ $passwordLabel->textContent = $this->generator->word;
219
+
220
+ $submit = $element->ownerDocument->createElement(static::INPUT_TAG);
221
+ $submit->setAttribute("type", "submit");
222
+ $submit->setAttribute("value", $this->generator->word);
223
+
224
+ $submit = $element->ownerDocument->createElement(static::FORM_TAG);
225
+ $submit->setAttribute("action", $this->generator->safeEmailDomain);
226
+ $submit->setAttribute("method", "POST");
227
+ $submit->appendChild($textLabel);
228
+ $submit->appendChild($textInput);
229
+ $submit->appendChild($passwordLabel);
230
+ $submit->appendChild($passwordInput);
231
+ $element->appendChild($submit);
232
+ }
233
+
234
+ private function addRandomTable(\DOMElement $element, $maxRows = 10, $maxCols = 6, $maxTitle = 4, $maxLength = 10)
235
+ {
236
+ $rows = mt_rand(1, $maxRows);
237
+ $cols = mt_rand(1, $maxCols);
238
+
239
+ $table = $element->ownerDocument->createElement(static::TABLE_TAG);
240
+ $thead = $element->ownerDocument->createElement(static::THEAD_TAG);
241
+ $tbody = $element->ownerDocument->createElement(static::TBODY_TAG);
242
+
243
+ $table->appendChild($thead);
244
+ $table->appendChild($tbody);
245
+
246
+ $tr = $element->ownerDocument->createElement(static::TR_TAG);
247
+ $thead->appendChild($tr);
248
+ for ($i = 0; $i < $cols; $i++) {
249
+ $th = $element->ownerDocument->createElement(static::TH_TAG);
250
+ $th->textContent = $this->generator->sentence(mt_rand(1, $maxTitle));
251
+ $tr->appendChild($th);
252
+ }
253
+ for ($i = 0; $i < $rows; $i++) {
254
+ $tr = $element->ownerDocument->createElement(static::TR_TAG);
255
+ $tbody->appendChild($tr);
256
+ for ($j = 0; $j < $cols; $j++) {
257
+ $th = $element->ownerDocument->createElement(static::TD_TAG);
258
+ $th->textContent = $this->generator->sentence(mt_rand(1, $maxLength));
259
+ $tr->appendChild($th);
260
+ }
261
+ }
262
+ $element->appendChild($table);
263
+ }
264
+
265
+ private function addRandomUL(\DOMElement $element, $maxItems = 11, $maxLength = 4)
266
+ {
267
+ $num = mt_rand(1, $maxItems);
268
+ $ul = $element->ownerDocument->createElement(static::UL_TAG);
269
+ for ($i = 0; $i < $num; $i++) {
270
+ $li = $element->ownerDocument->createElement(static::LI_TAG);
271
+ $li->textContent = $this->generator->sentence(mt_rand(1, $maxLength));
272
+ $ul->appendChild($li);
273
+ }
274
+ $element->appendChild($ul);
275
+ }
276
+ }
vendor/fakerphp/faker/src/Faker/Provider/Image.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ /**
6
+ * Depends on image generation from http://lorempixel.com/
7
+ */
8
+ class Image extends Base
9
+ {
10
+ protected static $categories = array(
11
+ 'abstract', 'animals', 'business', 'cats', 'city', 'food', 'nightlife',
12
+ 'fashion', 'people', 'nature', 'sports', 'technics', 'transport'
13
+ );
14
+
15
+ /**
16
+ * Generate the URL that will return a random image
17
+ *
18
+ * Set randomize to false to remove the random GET parameter at the end of the url.
19
+ *
20
+ * @example 'http://lorempixel.com/640/480/?12345'
21
+ *
22
+ * @param integer $width
23
+ * @param integer $height
24
+ * @param string|null $category
25
+ * @param bool $randomize
26
+ * @param string|null $word
27
+ * @param bool $gray
28
+ *
29
+ * @return string
30
+ */
31
+ public static function imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false)
32
+ {
33
+ $baseUrl = "https://lorempixel.com/";
34
+ $url = "{$width}/{$height}/";
35
+
36
+ if ($gray) {
37
+ $url = "gray/" . $url;
38
+ }
39
+
40
+ if ($category) {
41
+ if (!in_array($category, static::$categories)) {
42
+ throw new \InvalidArgumentException(sprintf('Unknown image category "%s"', $category));
43
+ }
44
+ $url .= "{$category}/";
45
+ if ($word) {
46
+ $url .= "{$word}/";
47
+ }
48
+ }
49
+
50
+ if ($randomize) {
51
+ $url .= '?' . static::randomNumber(5, true);
52
+ }
53
+
54
+ return $baseUrl . $url;
55
+ }
56
+
57
+ /**
58
+ * Download a remote random image to disk and return its location
59
+ *
60
+ * Requires curl, or allow_url_fopen to be on in php.ini.
61
+ *
62
+ * @example '/path/to/dir/13b73edae8443990be1aa8f1a483bc27.jpg'
63
+ */
64
+ public static function image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null, $gray = false)
65
+ {
66
+ $dir = is_null($dir) ? sys_get_temp_dir() : $dir; // GNU/Linux / OS X / Windows compatible
67
+ // Validate directory path
68
+ if (!is_dir($dir) || !is_writable($dir)) {
69
+ throw new \InvalidArgumentException(sprintf('Cannot write to directory "%s"', $dir));
70
+ }
71
+
72
+ // Generate a random filename. Use the server address so that a file
73
+ // generated at the same time on a different server won't have a collision.
74
+ $name = md5(uniqid(empty($_SERVER['SERVER_ADDR']) ? '' : $_SERVER['SERVER_ADDR'], true));
75
+ $filename = $name .'.jpg';
76
+ $filepath = $dir . DIRECTORY_SEPARATOR . $filename;
77
+
78
+ $url = static::imageUrl($width, $height, $category, $randomize, $word, $gray);
79
+
80
+ // save file
81
+ if (function_exists('curl_exec')) {
82
+ // use cURL
83
+ $fp = fopen($filepath, 'w');
84
+ $ch = curl_init($url);
85
+ curl_setopt($ch, CURLOPT_FILE, $fp);
86
+ $success = curl_exec($ch) && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200;
87
+ fclose($fp);
88
+ curl_close($ch);
89
+
90
+ if (!$success) {
91
+ unlink($filepath);
92
+
93
+ // could not contact the distant URL or HTTP error - fail silently.
94
+ return false;
95
+ }
96
+ } elseif (ini_get('allow_url_fopen')) {
97
+ // use remote fopen() via copy()
98
+ $success = copy($url, $filepath);
99
+ } else {
100
+ 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()');
101
+ }
102
+
103
+ return $fullPath ? $filepath : $filename;
104
+ }
105
+ }
vendor/fakerphp/faker/src/Faker/Provider/Internet.php ADDED
@@ -0,0 +1,362 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Internet extends Base
6
+ {
7
+ protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com');
8
+ protected static $tld = array('com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org');
9
+
10
+ protected static $userNameFormats = array(
11
+ '{{lastName}}.{{firstName}}',
12
+ '{{firstName}}.{{lastName}}',
13
+ '{{firstName}}##',
14
+ '?{{lastName}}',
15
+ );
16
+ protected static $emailFormats = array(
17
+ '{{userName}}@{{domainName}}',
18
+ '{{userName}}@{{freeEmailDomain}}',
19
+ );
20
+ protected static $urlFormats = array(
21
+ 'http://www.{{domainName}}/',
22
+ 'http://{{domainName}}/',
23
+ 'http://www.{{domainName}}/{{slug}}',
24
+ 'http://www.{{domainName}}/{{slug}}',
25
+ 'https://www.{{domainName}}/{{slug}}',
26
+ 'http://www.{{domainName}}/{{slug}}.html',
27
+ 'http://{{domainName}}/{{slug}}',
28
+ 'http://{{domainName}}/{{slug}}',
29
+ 'http://{{domainName}}/{{slug}}.html',
30
+ 'https://{{domainName}}/{{slug}}.html',
31
+ );
32
+
33
+ /**
34
+ * @example 'jdoe@acme.biz'
35
+ */
36
+ public function email()
37
+ {
38
+ $format = static::randomElement(static::$emailFormats);
39
+
40
+ return $this->generator->parse($format);
41
+ }
42
+
43
+ /**
44
+ * @example 'jdoe@example.com'
45
+ */
46
+ final public function safeEmail()
47
+ {
48
+ return preg_replace('/\s/u', '', $this->userName() . '@' . static::safeEmailDomain());
49
+ }
50
+
51
+ /**
52
+ * @example 'jdoe@gmail.com'
53
+ */
54
+ public function freeEmail()
55
+ {
56
+ return preg_replace('/\s/u', '', $this->userName() . '@' . static::freeEmailDomain());
57
+ }
58
+
59
+ /**
60
+ * @example 'jdoe@dawson.com'
61
+ */
62
+ public function companyEmail()
63
+ {
64
+ return preg_replace('/\s/u', '', $this->userName() . '@' . $this->domainName());
65
+ }
66
+
67
+ /**
68
+ * @example 'gmail.com'
69
+ */
70
+ public static function freeEmailDomain()
71
+ {
72
+ return static::randomElement(static::$freeEmailDomain);
73
+ }
74
+
75
+ /**
76
+ * @example 'example.org'
77
+ */
78
+ final public static function safeEmailDomain()
79
+ {
80
+ $domains = array(
81
+ 'example.com',
82
+ 'example.org',
83
+ 'example.net'
84
+ );
85
+
86
+ return static::randomElement($domains);
87
+ }
88
+ /**
89
+ * @example 'jdoe'
90
+ */
91
+ public function userName()
92
+ {
93
+ $format = static::randomElement(static::$userNameFormats);
94
+ $username = static::bothify($this->generator->parse($format));
95
+
96
+ $username = strtolower(static::transliterate($username));
97
+
98
+ // check if transliterate() didn't support the language and removed all letters
99
+ if (trim($username, '._') === '') {
100
+ throw new \Exception('userName failed with the selected locale. Try a different locale or activate the "intl" PHP extension.');
101
+ }
102
+
103
+ // clean possible trailing dots from first/last names
104
+ $username = str_replace('..', '.', $username);
105
+ $username = rtrim($username, '.');
106
+
107
+ return $username;
108
+ }
109
+ /**
110
+ * @example 'fY4èHdZv68'
111
+ */
112
+ public function password($minLength = 6, $maxLength = 20)
113
+ {
114
+ $pattern = str_repeat('*', $this->numberBetween($minLength, $maxLength));
115
+
116
+ return $this->asciify($pattern);
117
+ }
118
+
119
+ /**
120
+ * @example 'tiramisu.com'
121
+ */
122
+ public function domainName()
123
+ {
124
+ return $this->domainWord() . '.' . $this->tld();
125
+ }
126
+
127
+ /**
128
+ * @example 'faber'
129
+ */
130
+ public function domainWord()
131
+ {
132
+ $lastName = $this->generator->format('lastName');
133
+
134
+ $lastName = strtolower(static::transliterate($lastName));
135
+
136
+ // check if transliterate() didn't support the language and removed all letters
137
+ if (trim($lastName, '._') === '') {
138
+ throw new \Exception('domainWord failed with the selected locale. Try a different locale or activate the "intl" PHP extension.');
139
+ }
140
+
141
+ // clean possible trailing dot from last name
142
+ $lastName = rtrim($lastName, '.');
143
+
144
+ return $lastName;
145
+ }
146
+
147
+ /**
148
+ * @example 'com'
149
+ */
150
+ public function tld()
151
+ {
152
+ return static::randomElement(static::$tld);
153
+ }
154
+
155
+ /**
156
+ * @example 'http://www.runolfsdottir.com/'
157
+ */
158
+ public function url()
159
+ {
160
+ $format = static::randomElement(static::$urlFormats);
161
+
162
+ return $this->generator->parse($format);
163
+ }
164
+
165
+ /**
166
+ * @example 'aut-repellat-commodi-vel-itaque-nihil-id-saepe-nostrum'
167
+ */
168
+ public function slug($nbWords = 6, $variableNbWords = true)
169
+ {
170
+ if ($nbWords <= 0) {
171
+ return '';
172
+ }
173
+ if ($variableNbWords) {
174
+ $nbWords = (int) ($nbWords * mt_rand(60, 140) / 100) + 1;
175
+ }
176
+ $words = $this->generator->words($nbWords);
177
+
178
+ return join('-', $words);
179
+ }
180
+
181
+ /**
182
+ * @example '237.149.115.38'
183
+ */
184
+ public function ipv4()
185
+ {
186
+ return long2ip(mt_rand(0, 1) == 0 ? mt_rand(-2147483648, -2) : mt_rand(16777216, 2147483647));
187
+ }
188
+
189
+ /**
190
+ * @example '35cd:186d:3e23:2986:ef9f:5b41:42a4:e6f1'
191
+ */
192
+ public function ipv6()
193
+ {
194
+ $res = array();
195
+ for ($i=0; $i < 8; $i++) {
196
+ $res []= dechex(mt_rand(0, "65535"));
197
+ }
198
+
199
+ return join(':', $res);
200
+ }
201
+
202
+ /**
203
+ * @example '10.1.1.17'
204
+ */
205
+ public static function localIpv4()
206
+ {
207
+ if (static::numberBetween(0, 1) === 0) {
208
+ // 10.x.x.x range
209
+ return long2ip(static::numberBetween(ip2long("10.0.0.0"), ip2long("10.255.255.255")));
210
+ }
211
+
212
+ // 192.168.x.x range
213
+ return long2ip(static::numberBetween(ip2long("192.168.0.0"), ip2long("192.168.255.255")));
214
+ }
215
+
216
+ /**
217
+ * @example '32:F1:39:2F:D6:18'
218
+ */
219
+ public static function macAddress()
220
+ {
221
+ for ($i=0; $i<6; $i++) {
222
+ $mac[] = sprintf('%02X', static::numberBetween(0, 0xff));
223
+ }
224
+ $mac = implode(':', $mac);
225
+
226
+ return $mac;
227
+ }
228
+
229
+ protected static function transliterate($string)
230
+ {
231
+ if (0 === preg_match('/[^A-Za-z0-9_.]/', $string)) {
232
+ return $string;
233
+ }
234
+
235
+ $transId = 'Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC;';
236
+ if (class_exists('Transliterator', false) && $transliterator = \Transliterator::create($transId)) {
237
+ $transString = $transliterator->transliterate($string);
238
+ } else {
239
+ $transString = static::toAscii($string);
240
+ }
241
+
242
+ return preg_replace('/[^A-Za-z0-9_.]/u', '', $transString);
243
+ }
244
+
245
+ protected static function toAscii($string)
246
+ {
247
+ static $arrayFrom, $arrayTo;
248
+
249
+ if (empty($arrayFrom)) {
250
+ $transliterationTable = array(
251
+ 'IJ'=>'I', 'Ö'=>'O', 'Œ'=>'O', 'Ü'=>'U', 'ä'=>'a', 'æ'=>'a',
252
+ 'ij'=>'i', 'ö'=>'o', 'œ'=>'o', 'ü'=>'u', 'ß'=>'s', 'ſ'=>'s',
253
+ 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A',
254
+ 'Æ'=>'A', 'Ā'=>'A', 'Ą'=>'A', 'Ă'=>'A', 'Ç'=>'C', 'Ć'=>'C',
255
+ 'Č'=>'C', 'Ĉ'=>'C', 'Ċ'=>'C', 'Ď'=>'D', 'Đ'=>'D', 'È'=>'E',
256
+ 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ē'=>'E', 'Ę'=>'E', 'Ě'=>'E',
257
+ 'Ĕ'=>'E', 'Ė'=>'E', 'Ĝ'=>'G', 'Ğ'=>'G', 'Ġ'=>'G', 'Ģ'=>'G',
258
+ 'Ĥ'=>'H', 'Ħ'=>'H', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I',
259
+ 'Ī'=>'I', 'Ĩ'=>'I', 'Ĭ'=>'I', 'Į'=>'I', 'İ'=>'I', 'Ĵ'=>'J',
260
+ 'Ķ'=>'K', 'Ľ'=>'K', 'Ĺ'=>'K', 'Ļ'=>'K', 'Ŀ'=>'K', 'Ł'=>'L',
261
+ 'Ñ'=>'N', 'Ń'=>'N', 'Ň'=>'N', 'Ņ'=>'N', 'Ŋ'=>'N', 'Ò'=>'O',
262
+ 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ø'=>'O', 'Ō'=>'O', 'Ő'=>'O',
263
+ 'Ŏ'=>'O', 'Ŕ'=>'R', 'Ř'=>'R', 'Ŗ'=>'R', 'Ś'=>'S', 'Ş'=>'S',
264
+ 'Ŝ'=>'S', 'Ș'=>'S', 'Š'=>'S', 'Ť'=>'T', 'Ţ'=>'T', 'Ŧ'=>'T',
265
+ 'Ț'=>'T', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ū'=>'U', 'Ů'=>'U',
266
+ 'Ű'=>'U', 'Ŭ'=>'U', 'Ũ'=>'U', 'Ų'=>'U', 'Ŵ'=>'W', 'Ŷ'=>'Y',
267
+ 'Ÿ'=>'Y', 'Ý'=>'Y', 'Ź'=>'Z', 'Ż'=>'Z', 'Ž'=>'Z', 'à'=>'a',
268
+ 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ā'=>'a', 'ą'=>'a', 'ă'=>'a',
269
+ 'å'=>'a', 'ç'=>'c', 'ć'=>'c', 'č'=>'c', 'ĉ'=>'c', 'ċ'=>'c',
270
+ 'ď'=>'d', 'đ'=>'d', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e',
271
+ 'ē'=>'e', 'ę'=>'e', 'ě'=>'e', 'ĕ'=>'e', 'ė'=>'e', 'ƒ'=>'f',
272
+ 'ĝ'=>'g', 'ğ'=>'g', 'ġ'=>'g', 'ģ'=>'g', 'ĥ'=>'h', 'ħ'=>'h',
273
+ 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ī'=>'i', 'ĩ'=>'i',
274
+ 'ĭ'=>'i', 'į'=>'i', 'ı'=>'i', 'ĵ'=>'j', 'ķ'=>'k', 'ĸ'=>'k',
275
+ 'ł'=>'l', 'ľ'=>'l', 'ĺ'=>'l', 'ļ'=>'l', 'ŀ'=>'l', 'ñ'=>'n',
276
+ 'ń'=>'n', 'ň'=>'n', 'ņ'=>'n', 'ʼn'=>'n', 'ŋ'=>'n', 'ò'=>'o',
277
+ 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ø'=>'o', 'ō'=>'o', 'ő'=>'o',
278
+ 'ŏ'=>'o', 'ŕ'=>'r', 'ř'=>'r', 'ŗ'=>'r', 'ś'=>'s', 'š'=>'s',
279
+ 'ť'=>'t', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ū'=>'u', 'ů'=>'u',
280
+ 'ű'=>'u', 'ŭ'=>'u', 'ũ'=>'u', 'ų'=>'u', 'ŵ'=>'w', 'ÿ'=>'y',
281
+ 'ý'=>'y', 'ŷ'=>'y', 'ż'=>'z', 'ź'=>'z', 'ž'=>'z', 'Α'=>'A',
282
+ 'Ά'=>'A', 'Ἀ'=>'A', 'Ἁ'=>'A', 'Ἂ'=>'A', 'Ἃ'=>'A', 'Ἄ'=>'A',
283
+ 'Ἅ'=>'A', 'Ἆ'=>'A', 'Ἇ'=>'A', 'ᾈ'=>'A', 'ᾉ'=>'A', 'ᾊ'=>'A',
284
+ 'ᾋ'=>'A', 'ᾌ'=>'A', 'ᾍ'=>'A', 'ᾎ'=>'A', 'ᾏ'=>'A', 'Ᾰ'=>'A',
285
+ 'Ᾱ'=>'A', 'Ὰ'=>'A', 'ᾼ'=>'A', 'Β'=>'B', 'Γ'=>'G', 'Δ'=>'D',
286
+ 'Ε'=>'E', 'Έ'=>'E', 'Ἐ'=>'E', 'Ἑ'=>'E', 'Ἒ'=>'E', 'Ἓ'=>'E',
287
+ 'Ἔ'=>'E', 'Ἕ'=>'E', 'Ὲ'=>'E', 'Ζ'=>'Z', 'Η'=>'I', 'Ή'=>'I',
288
+ 'Ἠ'=>'I', 'Ἡ'=>'I', 'Ἢ'=>'I', 'Ἣ'=>'I', 'Ἤ'=>'I', 'Ἥ'=>'I',
289
+ 'Ἦ'=>'I', 'Ἧ'=>'I', 'ᾘ'=>'I', 'ᾙ'=>'I', 'ᾚ'=>'I', 'ᾛ'=>'I',
290
+ 'ᾜ'=>'I', 'ᾝ'=>'I', 'ᾞ'=>'I', 'ᾟ'=>'I', 'Ὴ'=>'I', 'ῌ'=>'I',
291
+ 'Θ'=>'T', 'Ι'=>'I', 'Ί'=>'I', 'Ϊ'=>'I', 'Ἰ'=>'I', 'Ἱ'=>'I',
292
+ 'Ἲ'=>'I', 'Ἳ'=>'I', 'Ἴ'=>'I', 'Ἵ'=>'I', 'Ἶ'=>'I', 'Ἷ'=>'I',
293
+ 'Ῐ'=>'I', 'Ῑ'=>'I', 'Ὶ'=>'I', 'Κ'=>'K', 'Λ'=>'L', 'Μ'=>'M',
294
+ 'Ν'=>'N', 'Ξ'=>'K', 'Ο'=>'O', 'Ό'=>'O', 'Ὀ'=>'O', 'Ὁ'=>'O',
295
+ 'Ὂ'=>'O', 'Ὃ'=>'O', 'Ὄ'=>'O', 'Ὅ'=>'O', 'Ὸ'=>'O', 'Π'=>'P',
296
+ 'Ρ'=>'R', 'Ῥ'=>'R', 'Σ'=>'S', 'Τ'=>'T', 'Υ'=>'Y', 'Ύ'=>'Y',
297
+ 'Ϋ'=>'Y', 'Ὑ'=>'Y', 'Ὓ'=>'Y', 'Ὕ'=>'Y', 'Ὗ'=>'Y', 'Ῠ'=>'Y',
298
+ 'Ῡ'=>'Y', 'Ὺ'=>'Y', 'Φ'=>'F', 'Χ'=>'X', 'Ψ'=>'P', 'Ω'=>'O',
299
+ 'Ώ'=>'O', 'Ὠ'=>'O', 'Ὡ'=>'O', 'Ὢ'=>'O', 'Ὣ'=>'O', 'Ὤ'=>'O',
300
+ 'Ὥ'=>'O', 'Ὦ'=>'O', 'Ὧ'=>'O', 'ᾨ'=>'O', 'ᾩ'=>'O', 'ᾪ'=>'O',
301
+ 'ᾫ'=>'O', 'ᾬ'=>'O', 'ᾭ'=>'O', 'ᾮ'=>'O', 'ᾯ'=>'O', 'Ὼ'=>'O',
302
+ 'ῼ'=>'O', 'α'=>'a', 'ά'=>'a', 'ἀ'=>'a', 'ἁ'=>'a', 'ἂ'=>'a',
303
+ 'ἃ'=>'a', 'ἄ'=>'a', 'ἅ'=>'a', 'ἆ'=>'a', 'ἇ'=>'a', 'ᾀ'=>'a',
304
+ 'ᾁ'=>'a', 'ᾂ'=>'a', 'ᾃ'=>'a', 'ᾄ'=>'a', 'ᾅ'=>'a', 'ᾆ'=>'a',
305
+ 'ᾇ'=>'a', 'ὰ'=>'a', 'ᾰ'=>'a', 'ᾱ'=>'a', 'ᾲ'=>'a', 'ᾳ'=>'a',
306
+ 'ᾴ'=>'a', 'ᾶ'=>'a', 'ᾷ'=>'a', 'β'=>'b', 'γ'=>'g', 'δ'=>'d',
307
+ 'ε'=>'e', 'έ'=>'e', 'ἐ'=>'e', 'ἑ'=>'e', 'ἒ'=>'e', 'ἓ'=>'e',
308
+ 'ἔ'=>'e', 'ἕ'=>'e', 'ὲ'=>'e', 'ζ'=>'z', 'η'=>'i', 'ή'=>'i',
309
+ 'ἠ'=>'i', 'ἡ'=>'i', 'ἢ'=>'i', 'ἣ'=>'i', 'ἤ'=>'i', 'ἥ'=>'i',
310
+ 'ἦ'=>'i', 'ἧ'=>'i', 'ᾐ'=>'i', 'ᾑ'=>'i', 'ᾒ'=>'i', 'ᾓ'=>'i',
311
+ 'ᾔ'=>'i', 'ᾕ'=>'i', 'ᾖ'=>'i', 'ᾗ'=>'i', 'ὴ'=>'i', 'ῂ'=>'i',
312
+ 'ῃ'=>'i', 'ῄ'=>'i', 'ῆ'=>'i', 'ῇ'=>'i', 'θ'=>'t', 'ι'=>'i',
313
+ 'ί'=>'i', 'ϊ'=>'i', 'ΐ'=>'i', 'ἰ'=>'i', 'ἱ'=>'i', 'ἲ'=>'i',
314
+ 'ἳ'=>'i', 'ἴ'=>'i', 'ἵ'=>'i', 'ἶ'=>'i', 'ἷ'=>'i', 'ὶ'=>'i',
315
+ 'ῐ'=>'i', 'ῑ'=>'i', 'ῒ'=>'i', 'ῖ'=>'i', 'ῗ'=>'i', 'κ'=>'k',
316
+ 'λ'=>'l', 'μ'=>'m', 'ν'=>'n', 'ξ'=>'k', 'ο'=>'o', 'ό'=>'o',
317
+ 'ὀ'=>'o', 'ὁ'=>'o', 'ὂ'=>'o', 'ὃ'=>'o', 'ὄ'=>'o', 'ὅ'=>'o',
318
+ 'ὸ'=>'o', 'π'=>'p', 'ρ'=>'r', 'ῤ'=>'r', 'ῥ'=>'r', 'σ'=>'s',
319
+ 'ς'=>'s', 'τ'=>'t', 'υ'=>'y', 'ύ'=>'y', 'ϋ'=>'y', 'ΰ'=>'y',
320
+ 'ὐ'=>'y', 'ὑ'=>'y', 'ὒ'=>'y', 'ὓ'=>'y', 'ὔ'=>'y', 'ὕ'=>'y',
321
+ 'ὖ'=>'y', 'ὗ'=>'y', 'ὺ'=>'y', 'ῠ'=>'y', 'ῡ'=>'y', 'ῢ'=>'y',
322
+ 'ῦ'=>'y', 'ῧ'=>'y', 'φ'=>'f', 'χ'=>'x', 'ψ'=>'p', 'ω'=>'o',
323
+ 'ώ'=>'o', 'ὠ'=>'o', 'ὡ'=>'o', 'ὢ'=>'o', 'ὣ'=>'o', 'ὤ'=>'o',
324
+ 'ὥ'=>'o', 'ὦ'=>'o', 'ὧ'=>'o', 'ᾠ'=>'o', 'ᾡ'=>'o', 'ᾢ'=>'o',
325
+ 'ᾣ'=>'o', 'ᾤ'=>'o', 'ᾥ'=>'o', 'ᾦ'=>'o', 'ᾧ'=>'o', 'ὼ'=>'o',
326
+ 'ῲ'=>'o', 'ῳ'=>'o', 'ῴ'=>'o', 'ῶ'=>'o', 'ῷ'=>'o', 'А'=>'A',
327
+ 'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E', 'Ё'=>'E',
328
+ 'Ж'=>'Z', 'З'=>'Z', 'И'=>'I', 'Й'=>'I', 'К'=>'K', 'Л'=>'L',
329
+ 'М'=>'M', 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R', 'С'=>'S',
330
+ 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Х'=>'K', 'Ц'=>'T', 'Ч'=>'C',
331
+ 'Ш'=>'S', 'Щ'=>'S', 'Ы'=>'Y', 'Э'=>'E', 'Ю'=>'Y', 'Я'=>'Y',
332
+ 'а'=>'A', 'б'=>'B', 'в'=>'V', 'г'=>'G', 'д'=>'D', 'е'=>'E',
333
+ 'ё'=>'E', 'ж'=>'Z', 'з'=>'Z', 'и'=>'I', 'й'=>'I', 'к'=>'K',
334
+ 'л'=>'L', 'м'=>'M', 'н'=>'N', 'о'=>'O', 'п'=>'P', 'р'=>'R',
335
+ 'с'=>'S', 'т'=>'T', 'у'=>'U', 'ф'=>'F', 'х'=>'K', 'ц'=>'T',
336
+ 'ч'=>'C', 'ш'=>'S', 'щ'=>'S', 'ы'=>'Y', 'э'=>'E', 'ю'=>'Y',
337
+ 'я'=>'Y', 'ð'=>'d', 'Ð'=>'D', 'þ'=>'t', 'Þ'=>'T', 'ა'=>'a',
338
+ 'ბ'=>'b', 'გ'=>'g', 'დ'=>'d', 'ე'=>'e', 'ვ'=>'v', 'ზ'=>'z',
339
+ 'თ'=>'t', 'ი'=>'i', 'კ'=>'k', 'ლ'=>'l', 'მ'=>'m', 'ნ'=>'n',
340
+ 'ო'=>'o', 'პ'=>'p', 'ჟ'=>'z', 'რ'=>'r', 'ს'=>'s', 'ტ'=>'t',
341
+ 'უ'=>'u', 'ფ'=>'p', 'ქ'=>'k', 'ღ'=>'g', 'ყ'=>'q', 'შ'=>'s',
342
+ 'ჩ'=>'c', 'ც'=>'t', 'ძ'=>'d', 'წ'=>'t', 'ჭ'=>'c', 'ხ'=>'k',
343
+ 'ჯ'=>'j', 'ჰ'=>'h', 'ţ'=>'t', 'ʼ'=>"'", '̧'=>'', 'ḩ'=>'h',
344
+ '‘'=>"'", '’'=>"'", 'ừ'=>'u', '/'=>'', 'ế'=>'e', 'ả'=>'a',
345
+ 'ị'=>'i', 'ậ'=>'a', 'ệ'=>'e', 'ỉ'=>'i', 'ồ'=>'o', 'ề'=>'e',
346
+ 'ơ'=>'o', 'ạ'=>'a', 'ẵ'=>'a', 'ư'=>'u', 'ằ'=>'a', 'ầ'=>'a',
347
+ 'ḑ'=>'d', 'Ḩ'=>'H', 'Ḑ'=>'D', 'ș'=>'s', 'ț'=>'t', 'ộ'=>'o',
348
+ 'ắ'=>'a', 'ş'=>'s', "'"=>'', 'ու'=>'u', 'ա'=>'a', 'բ'=>'b',
349
+ 'գ'=>'g', 'դ'=>'d', 'ե'=>'e', 'զ'=>'z', 'է'=>'e', 'ը'=>'y',
350
+ 'թ'=>'t', 'ժ'=>'zh', 'ի'=>'i', 'լ'=>'l', 'խ'=>'kh', 'ծ'=>'ts',
351
+ 'կ'=>'k', 'հ'=>'h', 'ձ'=>'dz', 'ղ'=>'gh', 'ճ'=>'ch', 'մ'=>'m',
352
+ 'յ'=>'y', 'ն'=>'n', 'շ'=>'sh', 'ո'=>'o', 'չ'=>'ch', 'պ'=>'p',
353
+ 'ջ'=>'j', 'ռ'=>'r', 'ս'=>'s', 'վ'=>'v', 'տ'=>'t', 'ր'=>'r',
354
+ 'ց'=>'ts', 'փ'=>'p', 'ք'=>'q', 'և'=>'ev', 'օ'=>'o', 'ֆ'=>'f',
355
+ );
356
+ $arrayFrom = array_keys($transliterationTable);
357
+ $arrayTo = array_values($transliterationTable);
358
+ }
359
+
360
+ return str_replace($arrayFrom, $arrayTo, $string);
361
+ }
362
+ }
vendor/fakerphp/faker/src/Faker/Provider/Lorem.php ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Lorem extends Base
6
+ {
7
+ protected static $wordList = array(
8
+ 'alias', 'consequatur', 'aut', 'perferendis', 'sit', 'voluptatem',
9
+ 'accusantium', 'doloremque', 'aperiam', 'eaque','ipsa', 'quae', 'ab',
10
+ 'illo', 'inventore', 'veritatis', 'et', 'quasi', 'architecto',
11
+ 'beatae', 'vitae', 'dicta', 'sunt', 'explicabo', 'aspernatur', 'aut',
12
+ 'odit', 'aut', 'fugit', 'sed', 'quia', 'consequuntur', 'magni',
13
+ 'dolores', 'eos', 'qui', 'ratione', 'voluptatem', 'sequi', 'nesciunt',
14
+ 'neque', 'dolorem', 'ipsum', 'quia', 'dolor', 'sit', 'amet',
15
+ 'consectetur', 'adipisci', 'velit', 'sed', 'quia', 'non', 'numquam',
16
+ 'eius', 'modi', 'tempora', 'incidunt', 'ut', 'labore', 'et', 'dolore',
17
+ 'magnam', 'aliquam', 'quaerat', 'voluptatem', 'ut', 'enim', 'ad',
18
+ 'minima', 'veniam', 'quis', 'nostrum', 'exercitationem', 'ullam',
19
+ 'corporis', 'nemo', 'enim', 'ipsam', 'voluptatem', 'quia', 'voluptas',
20
+ 'sit', 'suscipit', 'laboriosam', 'nisi', 'ut', 'aliquid', 'ex', 'ea',
21
+ 'commodi', 'consequatur', 'quis', 'autem', 'vel', 'eum', 'iure',
22
+ 'reprehenderit', 'qui', 'in', 'ea', 'voluptate', 'velit', 'esse',
23
+ 'quam', 'nihil', 'molestiae', 'et', 'iusto', 'odio', 'dignissimos',
24
+ 'ducimus', 'qui', 'blanditiis', 'praesentium', 'laudantium', 'totam',
25
+ 'rem', 'voluptatum', 'deleniti', 'atque', 'corrupti', 'quos',
26
+ 'dolores', 'et', 'quas', 'molestias', 'excepturi', 'sint',
27
+ 'occaecati', 'cupiditate', 'non', 'provident', 'sed', 'ut',
28
+ 'perspiciatis', 'unde', 'omnis', 'iste', 'natus', 'error',
29
+ 'similique', 'sunt', 'in', 'culpa', 'qui', 'officia', 'deserunt',
30
+ 'mollitia', 'animi', 'id', 'est', 'laborum', 'et', 'dolorum', 'fuga',
31
+ 'et', 'harum', 'quidem', 'rerum', 'facilis', 'est', 'et', 'expedita',
32
+ 'distinctio', 'nam', 'libero', 'tempore', 'cum', 'soluta', 'nobis',
33
+ 'est', 'eligendi', 'optio', 'cumque', 'nihil', 'impedit', 'quo',
34
+ 'porro', 'quisquam', 'est', 'qui', 'minus', 'id', 'quod', 'maxime',
35
+ 'placeat', 'facere', 'possimus', 'omnis', 'voluptas', 'assumenda',
36
+ 'est', 'omnis', 'dolor', 'repellendus', 'temporibus', 'autem',
37
+ 'quibusdam', 'et', 'aut', 'consequatur', 'vel', 'illum', 'qui',
38
+ 'dolorem', 'eum', 'fugiat', 'quo', 'voluptas', 'nulla', 'pariatur',
39
+ 'at', 'vero', 'eos', 'et', 'accusamus', 'officiis', 'debitis', 'aut',
40
+ 'rerum', 'necessitatibus', 'saepe', 'eveniet', 'ut', 'et',
41
+ 'voluptates', 'repudiandae', 'sint', 'et', 'molestiae', 'non',
42
+ 'recusandae', 'itaque', 'earum', 'rerum', 'hic', 'tenetur', 'a',
43
+ 'sapiente', 'delectus', 'ut', 'aut', 'reiciendis', 'voluptatibus',
44
+ 'maiores', 'doloribus', 'asperiores', 'repellat'
45
+ );
46
+
47
+ /**
48
+ * @example 'Lorem'
49
+ * @return string
50
+ */
51
+ public static function word()
52
+ {
53
+ return static::randomElement(static::$wordList);
54
+ }
55
+
56
+ /**
57
+ * Generate an array of random words
58
+ *
59
+ * @example array('Lorem', 'ipsum', 'dolor')
60
+ * @param integer $nb how many words to return
61
+ * @param bool $asText if true the sentences are returned as one string
62
+ * @return array|string
63
+ */
64
+ public static function words($nb = 3, $asText = false)
65
+ {
66
+ $words = array();
67
+ for ($i=0; $i < $nb; $i++) {
68
+ $words []= static::word();
69
+ }
70
+
71
+ return $asText ? implode(' ', $words) : $words;
72
+ }
73
+
74
+ /**
75
+ * Generate a random sentence
76
+ *
77
+ * @example 'Lorem ipsum dolor sit amet.'
78
+ * @param integer $nbWords around how many words the sentence should contain
79
+ * @param boolean $variableNbWords set to false if you want exactly $nbWords returned,
80
+ * otherwise $nbWords may vary by +/-40% with a minimum of 1
81
+ * @return string
82
+ */
83
+ public static function sentence($nbWords = 6, $variableNbWords = true)
84
+ {
85
+ if ($nbWords <= 0) {
86
+ return '';
87
+ }
88
+ if ($variableNbWords) {
89
+ $nbWords = self::randomizeNbElements($nbWords);
90
+ }
91
+
92
+ $words = static::words($nbWords);
93
+ $words[0] = ucwords($words[0]);
94
+
95
+ return implode(' ', $words) . '.';
96
+ }
97
+
98
+ /**
99
+ * Generate an array of sentences
100
+ *
101
+ * @example array('Lorem ipsum dolor sit amet.', 'Consectetur adipisicing eli.')
102
+ * @param integer $nb how many sentences to return
103
+ * @param bool $asText if true the sentences are returned as one string
104
+ * @return array|string
105
+ */
106
+ public static function sentences($nb = 3, $asText = false)
107
+ {
108
+ $sentences = array();
109
+ for ($i=0; $i < $nb; $i++) {
110
+ $sentences []= static::sentence();
111
+ }
112
+
113
+ return $asText ? implode(' ', $sentences) : $sentences;
114
+ }
115
+
116
+ /**
117
+ * Generate a single paragraph
118
+ *
119
+ * @example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.'
120
+ * @param integer $nbSentences around how many sentences the paragraph should contain
121
+ * @param boolean $variableNbSentences set to false if you want exactly $nbSentences returned,
122
+ * otherwise $nbSentences may vary by +/-40% with a minimum of 1
123
+ * @return string
124
+ */
125
+ public static function paragraph($nbSentences = 3, $variableNbSentences = true)
126
+ {
127
+ if ($nbSentences <= 0) {
128
+ return '';
129
+ }
130
+ if ($variableNbSentences) {
131
+ $nbSentences = self::randomizeNbElements($nbSentences);
132
+ }
133
+
134
+ return implode(' ', static::sentences($nbSentences));
135
+ }
136
+
137
+ /**
138
+ * Generate an array of paragraphs
139
+ *
140
+ * @example array($paragraph1, $paragraph2, $paragraph3)
141
+ * @param integer $nb how many paragraphs to return
142
+ * @param bool $asText if true the paragraphs are returned as one string, separated by two newlines
143
+ * @return array|string
144
+ */
145
+ public static function paragraphs($nb = 3, $asText = false)
146
+ {
147
+ $paragraphs = array();
148
+ for ($i=0; $i < $nb; $i++) {
149
+ $paragraphs []= static::paragraph();
150
+ }
151
+
152
+ return $asText ? implode("\n\n", $paragraphs) : $paragraphs;
153
+ }
154
+
155
+ /**
156
+ * Generate a text string.
157
+ * Depending on the $maxNbChars, returns a string made of words, sentences, or paragraphs.
158
+ *
159
+ * @example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.'
160
+ *
161
+ * @param integer $maxNbChars Maximum number of characters the text should contain (minimum 5)
162
+ *
163
+ * @return string
164
+ */
165
+ public static function text($maxNbChars = 200)
166
+ {
167
+ if ($maxNbChars < 5) {
168
+ throw new \InvalidArgumentException('text() can only generate text of at least 5 characters');
169
+ }
170
+
171
+ $type = ($maxNbChars < 25) ? 'word' : (($maxNbChars < 100) ? 'sentence' : 'paragraph');
172
+
173
+ $text = array();
174
+ while (empty($text)) {
175
+ $size = 0;
176
+
177
+ // until $maxNbChars is reached
178
+ while ($size < $maxNbChars) {
179
+ $word = ($size ? ' ' : '') . static::$type();
180
+ $text[] = $word;
181
+
182
+ $size += strlen($word);
183
+ }
184
+
185
+ array_pop($text);
186
+ }
187
+
188
+ if ($type === 'word') {
189
+ // capitalize first letter
190
+ $text[0] = ucwords($text[0]);
191
+
192
+ // end sentence with full stop
193
+ $text[count($text) - 1] .= '.';
194
+ }
195
+
196
+ return implode('', $text);
197
+ }
198
+
199
+ protected static function randomizeNbElements($nbElements)
200
+ {
201
+ return (int) ($nbElements * mt_rand(60, 140) / 100) + 1;
202
+ }
203
+ }
vendor/fakerphp/faker/src/Faker/Provider/Miscellaneous.php ADDED
@@ -0,0 +1,323 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Miscellaneous extends Base
6
+ {
7
+ /**
8
+ * @link https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
9
+ * On date of 2017-03-26
10
+ *
11
+ * U+1F600 - U+1F637 as their UTF-8 Pairings
12
+ */
13
+ protected static $emoji = array(
14
+ '\uD83D\uDE00', '\uD83D\uDE01', '\uD83D\uDE02', '\uD83D\uDE03',
15
+ '\uD83D\uDE04', '\uD83D\uDE05', '\uD83D\uDE06', '\uD83D\uDE07',
16
+ '\uD83D\uDE08', '\uD83D\uDE09', '\uD83D\uDE0A', '\uD83D\uDE0B',
17
+ '\uD83D\uDE0C', '\uD83D\uDE0D', '\uD83D\uDE0E', '\uD83D\uDE0F',
18
+ '\uD83D\uDE10', '\uD83D\uDE11', '\uD83D\uDE12', '\uD83D\uDE13',
19
+ '\uD83D\uDE14', '\uD83D\uDE15', '\uD83D\uDE16', '\uD83D\uDE17',
20
+ '\uD83D\uDE18', '\uD83D\uDE19', '\uD83D\uDE1A', '\uD83D\uDE1B',
21
+ '\uD83D\uDE1C', '\uD83D\uDE1D', '\uD83D\uDE1E', '\uD83D\uDE1F',
22
+ '\uD83D\uDE20', '\uD83D\uDE21', '\uD83D\uDE22', '\uD83D\uDE23',
23
+ '\uD83D\uDE24', '\uD83D\uDE25', '\uD83D\uDE26', '\uD83D\uDE27',
24
+ '\uD83D\uDE28', '\uD83D\uDE29', '\uD83D\uDE2A', '\uD83D\uDE2B',
25
+ '\uD83D\uDE2C', '\uD83D\uDE2D', '\uD83D\uDE2E', '\uD83D\uDE2F',
26
+ '\uD83D\uDE30', '\uD83D\uDE31', '\uD83D\uDE32', '\uD83D\uDE33',
27
+ '\uD83D\uDE34', '\uD83D\uDE35', '\uD83D\uDE36', '\uD83D\uDE37',
28
+ );
29
+
30
+ /**
31
+ * @link https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
32
+ * On date of 2016-04-22
33
+ */
34
+ protected static $languageCode = array(
35
+ 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av',
36
+ 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo',
37
+ 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv',
38
+ 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es',
39
+ 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga',
40
+ 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr',
41
+ 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik',
42
+ 'io', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj',
43
+ 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw',
44
+ 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv',
45
+ 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms', 'mt', 'my',
46
+ 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv',
47
+ 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps',
48
+ 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd',
49
+ 'se', 'sg', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr',
50
+ 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti',
51
+ 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug',
52
+ 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi',
53
+ 'yo', 'za', 'zh', 'zu',
54
+ );
55
+
56
+ /**
57
+ * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
58
+ * On date of 2014-10-19
59
+ */
60
+ protected static $countryCode = array(
61
+ 'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR',
62
+ 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE',
63
+ 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ',
64
+ 'BR', 'BS', 'BT', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF',
65
+ 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU',
66
+ 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO',
67
+ 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ',
68
+ 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG',
69
+ 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT',
70
+ 'GU', 'GW', 'GY', 'HK', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE',
71
+ 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM',
72
+ 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR',
73
+ 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS',
74
+ 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG',
75
+ 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS',
76
+ 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE',
77
+ 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM',
78
+ 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR',
79
+ 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW',
80
+ 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK',
81
+ 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY',
82
+ 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM',
83
+ 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM',
84
+ 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU',
85
+ 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW',
86
+ );
87
+
88
+ /**
89
+ * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
90
+ * On date of 2014-10-19
91
+ */
92
+ protected static $countryISOAlpha3 = array(
93
+ 'ABW', 'AFG', 'AGO', 'AIA', 'ALA', 'ALB', 'AND', 'ARE', 'ARG', 'ARM',
94
+ 'ASM', 'ATA', 'ATF', 'ATG', 'AUS', 'AUT', 'AZE', 'BDI', 'BEL', 'BEN',
95
+ 'BES', 'BFA', 'BGD', 'BGR', 'BHR', 'BHS', 'BIH', 'BLM', 'BLR', 'BLZ',
96
+ 'BMU', 'BOL', 'BRA', 'BRB', 'BRN', 'BTN', 'BVT', 'BWA', 'CAF', 'CAN',
97
+ 'CCK', 'CHE', 'CHL', 'CHN', 'CIV', 'CMR', 'COD', 'COG', 'COK', 'COL',
98
+ 'COM', 'CPV', 'CRI', 'CUB', 'CUW', 'CXR', 'CYM', 'CYP', 'CZE', 'DEU',
99
+ 'DJI', 'DMA', 'DNK', 'DOM', 'DZA', 'ECU', 'EGY', 'ERI', 'ESH', 'ESP',
100
+ 'EST', 'ETH', 'FIN', 'FJI', 'FLK', 'FRA', 'FRO', 'FSM', 'GAB', 'GBR',
101
+ 'GEO', 'GGY', 'GHA', 'GIB', 'GIN', 'GLP', 'GMB', 'GNB', 'GNQ', 'GRC',
102
+ 'GRD', 'GRL', 'GTM', 'GUF', 'GUM', 'GUY', 'HKG', 'HMD', 'HND', 'HRV',
103
+ 'HTI', 'HUN', 'IDN', 'IMN', 'IND', 'IOT', 'IRL', 'IRN', 'IRQ', 'ISL',
104
+ 'ISR', 'ITA', 'JAM', 'JEY', 'JOR', 'JPN', 'KAZ', 'KEN', 'KGZ', 'KHM',
105
+ 'KIR', 'KNA', 'KOR', 'KWT', 'LAO', 'LBN', 'LBR', 'LBY', 'LCA', 'LIE',
106
+ 'LKA', 'LSO', 'LTU', 'LUX', 'LVA', 'MAC', 'MAF', 'MAR', 'MCO', 'MDA',
107
+ 'MDG', 'MDV', 'MEX', 'MHL', 'MKD', 'MLI', 'MLT', 'MMR', 'MNE', 'MNG',
108
+ 'MNP', 'MOZ', 'MRT', 'MSR', 'MTQ', 'MUS', 'MWI', 'MYS', 'MYT', 'NAM',
109
+ 'NCL', 'NER', 'NFK', 'NGA', 'NIC', 'NIU', 'NLD', 'NOR', 'NPL', 'NRU',
110
+ 'NZL', 'OMN', 'PAK', 'PAN', 'PCN', 'PER', 'PHL', 'PLW', 'PNG', 'POL',
111
+ 'PRI', 'PRK', 'PRT', 'PRY', 'PSE', 'PYF', 'QAT', 'REU', 'ROU', 'RUS',
112
+ 'RWA', 'SAU', 'SDN', 'SEN', 'SGP', 'SGS', 'SHN', 'SJM', 'SLB', 'SLE',
113
+ 'SLV', 'SMR', 'SOM', 'SPM', 'SRB', 'SSD', 'STP', 'SUR', 'SVK', 'SVN',
114
+ 'SWE', 'SWZ', 'SXM', 'SYC', 'SYR', 'TCA', 'TCD', 'TGO', 'THA', 'TJK',
115
+ 'TKL', 'TKM', 'TLS', 'TON', 'TTO', 'TUN', 'TUR', 'TUV', 'TWN', 'TZA',
116
+ 'UGA', 'UKR', 'UMI', 'URY', 'USA', 'UZB', 'VAT', 'VCT', 'VEN', 'VGB',
117
+ 'VIR', 'VNM', 'VUT', 'WLF', 'WSM', 'YEM', 'ZAF', 'ZMB', 'ZWE',
118
+ );
119
+
120
+ protected static $localeData = array(
121
+ 'aa_DJ', 'aa_ER', 'aa_ET',
122
+ 'af_NA', 'af_ZA', 'ak_GH',
123
+ 'am_ET', 'ar_AE', 'ar_BH', 'ar_DZ',
124
+ 'ar_EG', 'ar_IQ', 'ar_JO', 'ar_KW', 'ar_LB',
125
+ 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA',
126
+ 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE',
127
+ 'as_IN', 'az_AZ', 'be_BY',
128
+ 'bg_BG', 'bn_BD', 'bn_IN',
129
+ 'bo_CN', 'bo_IN', 'bs_BA',
130
+ 'byn_ER', 'ca_ES',
131
+ 'cch_NG', 'cs_CZ',
132
+ 'cy_GB', 'da_DK', 'de_AT',
133
+ 'de_BE', 'de_CH', 'de_DE', 'de_LI', 'de_LU',
134
+ 'dv_MV', 'dz_BT',
135
+ 'ee_GH', 'ee_TG', 'el_CY', 'el_GR',
136
+ 'en_AS', 'en_AU', 'en_BE', 'en_BW',
137
+ 'en_BZ', 'en_CA', 'en_GB', 'en_GU', 'en_HK',
138
+ 'en_IE', 'en_IN', 'en_JM', 'en_MH', 'en_MP',
139
+ 'en_MT', 'en_NA', 'en_NZ', 'en_PH', 'en_PK',
140
+ 'en_SG', 'en_TT', 'en_UM', 'en_US', 'en_VI',
141
+ 'en_ZA', 'en_ZW', 'es_AR',
142
+ 'es_BO', 'es_CL', 'es_CO', 'es_CR', 'es_DO',
143
+ 'es_EC', 'es_ES', 'es_GT', 'es_HN', 'es_MX',
144
+ 'es_NI', 'es_PA', 'es_PE', 'es_PR', 'es_PY',
145
+ 'es_SV', 'es_US', 'es_UY', 'es_VE',
146
+ 'et_EE', 'eu_ES', 'fa_AF',
147
+ 'fa_IR', 'fi_FI', 'fil_PH',
148
+ 'fo_FO', 'fr_BE', 'fr_CA',
149
+ 'fr_CH', 'fr_FR', 'fr_LU', 'fr_MC', 'fr_SN',
150
+ 'fur_IT', 'ga_IE',
151
+ 'gaa_GH', 'gez_ER', 'gez_ET',
152
+ 'gl_ES', 'gsw_CH', 'gu_IN',
153
+ 'gv_GB', 'ha_GH', 'ha_NE',
154
+ 'ha_NG', 'ha_SD', 'haw_US',
155
+ 'he_IL', 'hi_IN', 'hr_HR',
156
+ 'hu_HU', 'hy_AM',
157
+ 'id_ID', 'ig_NG',
158
+ 'ii_CN', 'is_IS',
159
+ 'it_CH', 'it_IT',
160
+ 'ja_JP', 'ka_GE', 'kaj_NG',
161
+ 'kam_KE', 'kcg_NG',
162
+ 'kfo_CI', 'kk_KZ', 'kl_GL',
163
+ 'km_KH', 'kn_IN',
164
+ 'ko_KR', 'kok_IN', 'kpe_GN',
165
+ 'kpe_LR', 'ku_IQ', 'ku_IR', 'ku_SY',
166
+ 'ku_TR', 'kw_GB', 'ky_KG',
167
+ 'ln_CD', 'ln_CG', 'lo_LA',
168
+ 'lt_LT', 'lv_LV',
169
+ 'mk_MK', 'ml_IN', 'mn_CN',
170
+ 'mn_MN', 'mr_IN',
171
+ 'ms_BN', 'ms_MY', 'mt_MT',
172
+ 'my_MM', 'nb_NO', 'nds_DE',
173
+ 'ne_IN', 'ne_NP', 'nl_BE',
174
+ 'nl_NL', 'nn_NO',
175
+ 'nr_ZA', 'nso_ZA', 'ny_MW',
176
+ 'oc_FR', 'om_ET', 'om_KE',
177
+ 'or_IN', 'pa_IN', 'pa_PK',
178
+ 'pl_PL', 'ps_AF',
179
+ 'pt_BR', 'pt_PT', 'ro_MD', 'ro_RO',
180
+ 'ru_RU', 'ru_UA', 'rw_RW',
181
+ 'sa_IN', 'se_FI', 'se_NO',
182
+ 'sh_BA', 'sh_CS', 'sh_YU',
183
+ 'si_LK', 'sid_ET', 'sk_SK',
184
+ 'sl_SI', 'so_DJ', 'so_ET',
185
+ 'so_KE', 'so_SO', 'sq_AL',
186
+ 'sr_BA', 'sr_CS', 'sr_ME', 'sr_RS', 'sr_YU',
187
+ 'ss_SZ', 'ss_ZA', 'st_LS',
188
+ 'st_ZA', 'sv_FI', 'sv_SE',
189
+ 'sw_KE', 'sw_TZ', 'syr_SY',
190
+ 'ta_IN', 'te_IN', 'tg_TJ',
191
+ 'th_TH', 'ti_ER', 'ti_ET',
192
+ 'tig_ER', 'tn_ZA',
193
+ 'to_TO', 'tr_TR',
194
+ 'trv_TW', 'ts_ZA', 'tt_RU',
195
+ 'ug_CN', 'uk_UA',
196
+ 'ur_IN', 'ur_PK', 'uz_AF', 'uz_UZ',
197
+ 've_ZA', 'vi_VN',
198
+ 'wal_ET', 'wo_SN', 'xh_ZA',
199
+ 'yo_NG', 'zh_CN', 'zh_HK',
200
+ 'zh_MO', 'zh_SG', 'zh_TW', 'zu_ZA',
201
+ );
202
+
203
+ /**
204
+ * @link https://en.wikipedia.org/wiki/ISO_4217
205
+ * On date of 2019-09-27
206
+ *
207
+ * With the following exceptions:
208
+ * SVC has been replaced by the USD in 2001: https://en.wikipedia.org/wiki/Salvadoran_col%C3%B3n
209
+ * ZWL has been suspended since 2009: https://en.wikipedia.org/wiki/Zimbabwean_dollar
210
+ */
211
+ protected static $currencyCode = array(
212
+ 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN',
213
+ 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL',
214
+ 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHF', 'CLP', 'CNY',
215
+ 'COP', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD',
216
+ 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP',
217
+ 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR',
218
+ 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS',
219
+ 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR',
220
+ 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP',
221
+ 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO',
222
+ 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN',
223
+ 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG',
224
+ 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SYP', 'SZL',
225
+ 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH',
226
+ 'UGX', 'USD', 'UYU', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XCD',
227
+ 'XOF', 'XPF', 'YER', 'ZAR', 'ZMW',
228
+ );
229
+
230
+ /**
231
+ * Return a boolean, true or false.
232
+ *
233
+ * @param int $chanceOfGettingTrue Between 0 (always get false) and 100 (always get true)
234
+ *
235
+ * @return bool
236
+ *
237
+ * @example true
238
+ */
239
+ public static function boolean($chanceOfGettingTrue = 50)
240
+ {
241
+ return mt_rand(1, 100) <= $chanceOfGettingTrue;
242
+ }
243
+
244
+ /**
245
+ * @example 'cfcd208495d565ef66e7dff9f98764da'
246
+ */
247
+ public static function md5()
248
+ {
249
+ return md5(mt_rand());
250
+ }
251
+
252
+ /**
253
+ * @example 'b5d86317c2a144cd04d0d7c03b2b02666fafadf2'
254
+ */
255
+ public static function sha1()
256
+ {
257
+ return sha1(mt_rand());
258
+ }
259
+
260
+ /**
261
+ * @example '85086017559ccc40638fcde2fecaf295e0de7ca51b7517b6aebeaaf75b4d4654'
262
+ */
263
+ public static function sha256()
264
+ {
265
+ return hash('sha256', mt_rand());
266
+ }
267
+
268
+ /**
269
+ * @example 'fr_FR'
270
+ */
271
+ public static function locale()
272
+ {
273
+ return static::randomElement(static::$localeData);
274
+ }
275
+
276
+ /**
277
+ * @example 'FR'
278
+ *
279
+ * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
280
+ */
281
+ public static function countryCode()
282
+ {
283
+ return static::randomElement(static::$countryCode);
284
+ }
285
+
286
+ /**
287
+ * @example 'FRA'
288
+ *
289
+ * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
290
+ */
291
+ public static function countryISOAlpha3()
292
+ {
293
+ return static::randomElement(static::$countryISOAlpha3);
294
+ }
295
+
296
+ /**
297
+ * @example 'fr'
298
+ */
299
+ public static function languageCode()
300
+ {
301
+ return static::randomElement(static::$languageCode);
302
+ }
303
+
304
+ /**
305
+ * @example 'EUR'
306
+ *
307
+ * @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
308
+ */
309
+ public static function currencyCode()
310
+ {
311
+ return static::randomElement(static::$currencyCode);
312
+ }
313
+
314
+ /**
315
+ * Returns an encoded Unicode Character between U+1F600 and U+1F637.
316
+ *
317
+ * @link https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
318
+ */
319
+ public static function emoji()
320
+ {
321
+ return json_decode('"' . static::randomElement(static::$emoji) . '"');
322
+ }
323
+ }
vendor/fakerphp/faker/src/Faker/Provider/Payment.php ADDED
@@ -0,0 +1,286 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ use Faker\Calculator\Iban;
6
+ use Faker\Calculator\Luhn;
7
+
8
+ class Payment extends Base
9
+ {
10
+ public static $expirationDateFormat = "m/y";
11
+
12
+ protected static $cardVendors = array(
13
+ 'Visa', 'Visa', 'Visa', 'Visa', 'Visa',
14
+ 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard',
15
+ 'American Express', 'Discover Card', 'Visa Retired'
16
+ );
17
+
18
+ /**
19
+ * @var array List of card brand masks for generating valid credit card numbers
20
+ * @see https://en.wikipedia.org/wiki/Payment_card_number Reference for existing prefixes
21
+ * @see https://www.mastercard.us/en-us/issuers/get-support/2-series-bin-expansion.html MasterCard 2017 2-Series BIN Expansion
22
+ */
23
+ protected static $cardParams = array(
24
+ 'Visa' => array(
25
+ "4539###########",
26
+ "4556###########",
27
+ "4916###########",
28
+ "4532###########",
29
+ "4929###########",
30
+ "40240071#######",
31
+ "4485###########",
32
+ "4716###########",
33
+ "4##############"
34
+ ),
35
+ 'Visa Retired' => array(
36
+ "4539########",
37
+ "4556########",
38
+ "4916########",
39
+ "4532########",
40
+ "4929########",
41
+ "40240071####",
42
+ "4485########",
43
+ "4716########",
44
+ "4###########",
45
+ ),
46
+ 'MasterCard' => array(
47
+ "2221###########",
48
+ "23#############",
49
+ "24#############",
50
+ "25#############",
51
+ "26#############",
52
+ "2720###########",
53
+ "51#############",
54
+ "52#############",
55
+ "53#############",
56
+ "54#############",
57
+ "55#############"
58
+ ),
59
+ 'American Express' => array(
60
+ "34############",
61
+ "37############"
62
+ ),
63
+ 'Discover Card' => array(
64
+ "6011###########"
65
+ ),
66
+ );
67
+
68
+ /**
69
+ * @var array list of IBAN formats, source: @link https://www.swift.com/standards/data-standards/iban
70
+ */
71
+ protected static $ibanFormats = array(
72
+ 'AD' => array(array('n', 4), array('n', 4), array('c', 12)),
73
+ 'AE' => array(array('n', 3), array('n', 16)),
74
+ 'AL' => array(array('n', 8), array('c', 16)),
75
+ 'AT' => array(array('n', 5), array('n', 11)),
76
+ 'AZ' => array(array('a', 4), array('c', 20)),
77
+ 'BA' => array(array('n', 3), array('n', 3), array('n', 8), array('n', 2)),
78
+ 'BE' => array(array('n', 3), array('n', 7), array('n', 2)),
79
+ 'BG' => array(array('a', 4), array('n', 4), array('n', 2), array('c', 8)),
80
+ 'BH' => array(array('a', 4), array('c', 14)),
81
+ 'BR' => array(array('n', 8), array('n', 5), array('n', 10), array('a', 1), array('c', 1)),
82
+ 'CH' => array(array('n', 5), array('c', 12)),
83
+ 'CR' => array(array('n', 3), array('n', 14)),
84
+ 'CY' => array(array('n', 3), array('n', 5), array('c', 16)),
85
+ 'CZ' => array(array('n', 4), array('n', 6), array('n', 10)),
86
+ 'DE' => array(array('n', 8), array('n', 10)),
87
+ 'DK' => array(array('n', 4), array('n', 9), array('n', 1)),
88
+ 'DO' => array(array('c', 4), array('n', 20)),
89
+ 'EE' => array(array('n', 2), array('n', 2), array('n', 11), array('n', 1)),
90
+ 'ES' => array(array('n', 4), array('n', 4), array('n', 1), array('n', 1), array('n', 10)),
91
+ 'FI' => array(array('n', 6), array('n', 7), array('n', 1)),
92
+ 'FR' => array(array('n', 5), array('n', 5), array('c', 11), array('n', 2)),
93
+ 'GB' => array(array('a', 4), array('n', 6), array('n', 8)),
94
+ 'GE' => array(array('a', 2), array('n', 16)),
95
+ 'GI' => array(array('a', 4), array('c', 15)),
96
+ 'GR' => array(array('n', 3), array('n', 4), array('c', 16)),
97
+ 'GT' => array(array('c', 4), array('c', 20)),
98
+ 'HR' => array(array('n', 7), array('n', 10)),
99
+ 'HU' => array(array('n', 3), array('n', 4), array('n', 1), array('n', 15), array('n', 1)),
100
+ 'IE' => array(array('a', 4), array('n', 6), array('n', 8)),
101
+ 'IL' => array(array('n', 3), array('n', 3), array('n', 13)),
102
+ 'IS' => array(array('n', 4), array('n', 2), array('n', 6), array('n', 10)),
103
+ 'IT' => array(array('a', 1), array('n', 5), array('n', 5), array('c', 12)),
104
+ 'KW' => array(array('a', 4), array('n', 22)),
105
+ 'KZ' => array(array('n', 3), array('c', 13)),
106
+ 'LB' => array(array('n', 4), array('c', 20)),
107
+ 'LI' => array(array('n', 5), array('c', 12)),
108
+ 'LT' => array(array('n', 5), array('n', 11)),
109
+ 'LU' => array(array('n', 3), array('c', 13)),
110
+ 'LV' => array(array('a', 4), array('c', 13)),
111
+ 'MC' => array(array('n', 5), array('n', 5), array('c', 11), array('n', 2)),
112
+ 'MD' => array(array('c', 2), array('c', 18)),
113
+ 'ME' => array(array('n', 3), array('n', 13), array('n', 2)),
114
+ 'MK' => array(array('n', 3), array('c', 10), array('n', 2)),
115
+ 'MR' => array(array('n', 5), array('n', 5), array('n', 11), array('n', 2)),
116
+ 'MT' => array(array('a', 4), array('n', 5), array('c', 18)),
117
+ 'MU' => array(array('a', 4), array('n', 2), array('n', 2), array('n', 12), array('n', 3), array('a', 3)),
118
+ 'NL' => array(array('a', 4), array('n', 10)),
119
+ 'NO' => array(array('n', 4), array('n', 6), array('n', 1)),
120
+ 'PK' => array(array('a', 4), array('c', 16)),
121
+ 'PL' => array(array('n', 8), array('n', 16)),
122
+ 'PS' => array(array('a', 4), array('c', 21)),
123
+ 'PT' => array(array('n', 4), array('n', 4), array('n', 11), array('n', 2)),
124
+ 'RO' => array(array('a', 4), array('c', 16)),
125
+ 'RS' => array(array('n', 3), array('n', 13), array('n', 2)),
126
+ 'SA' => array(array('n', 2), array('c', 18)),
127
+ 'SE' => array(array('n', 3), array('n', 16), array('n', 1)),
128
+ 'SI' => array(array('n', 5), array('n', 8), array('n', 2)),
129
+ 'SK' => array(array('n', 4), array('n', 6), array('n', 10)),
130
+ 'SM' => array(array('a', 1), array('n', 5), array('n', 5), array('c', 12)),
131
+ 'TN' => array(array('n', 2), array('n', 3), array('n', 13), array('n', 2)),
132
+ 'TR' => array(array('n', 5), array('n', 1), array('c', 16)),
133
+ 'VG' => array(array('a', 4), array('n', 16)),
134
+ );
135
+
136
+ /**
137
+ * @return string Returns a credit card vendor name
138
+ *
139
+ * @example 'MasterCard'
140
+ */
141
+ public static function creditCardType()
142
+ {
143
+ return static::randomElement(static::$cardVendors);
144
+ }
145
+
146
+ /**
147
+ * Returns the String of a credit card number.
148
+ *
149
+ * @param string $type Supporting any of 'Visa', 'MasterCard', 'American Express', and 'Discover'
150
+ * @param boolean $formatted Set to true if the output string should contain one separator every 4 digits
151
+ * @param string $separator Separator string for formatting card number. Defaults to dash (-).
152
+ * @return string
153
+ *
154
+ * @example '4485480221084675'
155
+ */
156
+ public static function creditCardNumber($type = null, $formatted = false, $separator = '-')
157
+ {
158
+ if (is_null($type)) {
159
+ $type = static::creditCardType();
160
+ }
161
+ $mask = static::randomElement(static::$cardParams[$type]);
162
+
163
+ $number = static::numerify($mask);
164
+ $number .= Luhn::computeCheckDigit($number);
165
+
166
+ if ($formatted) {
167
+ $p1 = substr($number, 0, 4);
168
+ $p2 = substr($number, 4, 4);
169
+ $p3 = substr($number, 8, 4);
170
+ $p4 = substr($number, 12);
171
+ $number = $p1 . $separator . $p2 . $separator . $p3 . $separator . $p4;
172
+ }
173
+
174
+ return $number;
175
+ }
176
+
177
+ /**
178
+ * @param boolean $valid True (by default) to get a valid expiration date, false to get a maybe valid date
179
+ * @return \DateTime
180
+ * @example 04/13
181
+ */
182
+ public function creditCardExpirationDate($valid = true)
183
+ {
184
+ if ($valid) {
185
+ return $this->generator->dateTimeBetween('now', '36 months');
186
+ }
187
+
188
+ return $this->generator->dateTimeBetween('-36 months', '36 months');
189
+ }
190
+
191
+ /**
192
+ * @param boolean $valid True (by default) to get a valid expiration date, false to get a maybe valid date
193
+ * @param string $expirationDateFormat
194
+ * @return string
195
+ * @example '04/13'
196
+ */
197
+ public function creditCardExpirationDateString($valid = true, $expirationDateFormat = null)
198
+ {
199
+ return $this->creditCardExpirationDate($valid)->format(is_null($expirationDateFormat) ? static::$expirationDateFormat : $expirationDateFormat);
200
+ }
201
+
202
+ /**
203
+ * @param boolean $valid True (by default) to get a valid expiration date, false to get a maybe valid date
204
+ * @return array
205
+ */
206
+ public function creditCardDetails($valid = true)
207
+ {
208
+ $type = static::creditCardType();
209
+
210
+ return array(
211
+ 'type' => $type,
212
+ 'number' => static::creditCardNumber($type),
213
+ 'name' => $this->generator->name(),
214
+ 'expirationDate' => $this->creditCardExpirationDateString($valid)
215
+ );
216
+ }
217
+
218
+ /**
219
+ * International Bank Account Number (IBAN)
220
+ *
221
+ * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
222
+ * @param string $countryCode ISO 3166-1 alpha-2 country code
223
+ * @param string $prefix for generating bank account number of a specific bank
224
+ * @param integer $length total length without country code and 2 check digits
225
+ * @return string
226
+ */
227
+ public static function iban($countryCode = null, $prefix = '', $length = null)
228
+ {
229
+ $countryCode = is_null($countryCode) ? self::randomKey(self::$ibanFormats) : strtoupper($countryCode);
230
+
231
+ $format = !isset(static::$ibanFormats[$countryCode]) ? null : static::$ibanFormats[$countryCode];
232
+ if ($length === null) {
233
+ if ($format === null) {
234
+ $length = 24;
235
+ } else {
236
+ $length = 0;
237
+ foreach ($format as $part) {
238
+ list($class, $groupCount) = $part;
239
+ $length += $groupCount;
240
+ }
241
+ }
242
+ }
243
+ if ($format === null) {
244
+ $format = array(array('n', $length));
245
+ }
246
+
247
+ $expandedFormat = '';
248
+ foreach ($format as $item) {
249
+ list($class, $length) = $item;
250
+ $expandedFormat .= str_repeat($class, $length);
251
+ }
252
+
253
+ $result = $prefix;
254
+ $expandedFormat = substr($expandedFormat, strlen($result));
255
+ foreach (str_split($expandedFormat) as $class) {
256
+ switch ($class) {
257
+ default:
258
+ case 'c':
259
+ $result .= mt_rand(0, 100) <= 50 ? static::randomDigit() : strtoupper(static::randomLetter());
260
+ break;
261
+ case 'a':
262
+ $result .= strtoupper(static::randomLetter());
263
+ break;
264
+ case 'n':
265
+ $result .= static::randomDigit();
266
+ break;
267
+ }
268
+ }
269
+
270
+ $checksum = Iban::checksum($countryCode . '00' . $result);
271
+
272
+ return $countryCode . $checksum . $result;
273
+ }
274
+
275
+ /**
276
+ * Return the String of a SWIFT/BIC number
277
+ *
278
+ * @example 'RZTIAT22263'
279
+ * @link http://en.wikipedia.org/wiki/ISO_9362
280
+ * @return string Swift/Bic number
281
+ */
282
+ public static function swiftBicNumber()
283
+ {
284
+ return self::regexify("^([A-Z]){4}([A-Z]){2}([0-9A-Z]){2}([0-9A-Z]{3})?$");
285
+ }
286
+ }
vendor/fakerphp/faker/src/Faker/Provider/Person.php ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Person extends Base
6
+ {
7
+ const GENDER_MALE = 'male';
8
+ const GENDER_FEMALE = 'female';
9
+
10
+ protected static $titleFormat = array(
11
+ '{{titleMale}}',
12
+ '{{titleFemale}}',
13
+ );
14
+
15
+ protected static $firstNameFormat = array(
16
+ '{{firstNameMale}}',
17
+ '{{firstNameFemale}}',
18
+ );
19
+
20
+ protected static $maleNameFormats = array(
21
+ '{{firstNameMale}} {{lastName}}',
22
+ );
23
+
24
+ protected static $femaleNameFormats = array(
25
+ '{{firstNameFemale}} {{lastName}}',
26
+ );
27
+
28
+ protected static $firstNameMale = array(
29
+ 'John',
30
+ );
31
+
32
+ protected static $firstNameFemale = array(
33
+ 'Jane',
34
+ );
35
+
36
+ protected static $lastName = array('Doe');
37
+
38
+ protected static $titleMale = array('Mr.', 'Dr.', 'Prof.');
39
+
40
+ protected static $titleFemale = array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.');
41
+
42
+ /**
43
+ * @param string|null $gender 'male', 'female' or null for any
44
+ * @return string
45
+ * @example 'John Doe'
46
+ */
47
+ public function name($gender = null)
48
+ {
49
+ if ($gender === static::GENDER_MALE) {
50
+ $format = static::randomElement(static::$maleNameFormats);
51
+ } elseif ($gender === static::GENDER_FEMALE) {
52
+ $format = static::randomElement(static::$femaleNameFormats);
53
+ } else {
54
+ $format = static::randomElement(array_merge(static::$maleNameFormats, static::$femaleNameFormats));
55
+ }
56
+
57
+ return $this->generator->parse($format);
58
+ }
59
+
60
+ /**
61
+ * @param string|null $gender 'male', 'female' or null for any
62
+ * @return string
63
+ * @example 'John'
64
+ */
65
+ public function firstName($gender = null)
66
+ {
67
+ if ($gender === static::GENDER_MALE) {
68
+ return static::firstNameMale();
69
+ } elseif ($gender === static::GENDER_FEMALE) {
70
+ return static::firstNameFemale();
71
+ }
72
+
73
+ return $this->generator->parse(static::randomElement(static::$firstNameFormat));
74
+ }
75
+
76
+ public static function firstNameMale()
77
+ {
78
+ return static::randomElement(static::$firstNameMale);
79
+ }
80
+
81
+ public static function firstNameFemale()
82
+ {
83
+ return static::randomElement(static::$firstNameFemale);
84
+ }
85
+
86
+ /**
87
+ * @example 'Doe'
88
+ * @return string
89
+ */
90
+ public function lastName()
91
+ {
92
+ return static::randomElement(static::$lastName);
93
+ }
94
+
95
+ /**
96
+ * @example 'Mrs.'
97
+ * @param string|null $gender 'male', 'female' or null for any
98
+ * @return string
99
+ */
100
+ public function title($gender = null)
101
+ {
102
+ if ($gender === static::GENDER_MALE) {
103
+ return static::titleMale();
104
+ } elseif ($gender === static::GENDER_FEMALE) {
105
+ return static::titleFemale();
106
+ }
107
+
108
+ return $this->generator->parse(static::randomElement(static::$titleFormat));
109
+ }
110
+
111
+ /**
112
+ * @example 'Mr.'
113
+ */
114
+ public static function titleMale()
115
+ {
116
+ return static::randomElement(static::$titleMale);
117
+ }
118
+
119
+ /**
120
+ * @example 'Mrs.'
121
+ */
122
+ public static function titleFemale()
123
+ {
124
+ return static::randomElement(static::$titleFemale);
125
+ }
126
+ }
vendor/fakerphp/faker/src/Faker/Provider/PhoneNumber.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ use Faker\Calculator\Luhn;
6
+
7
+ class PhoneNumber extends Base
8
+ {
9
+ protected static $formats = array('###-###-###');
10
+
11
+ /**
12
+ * @example '555-123-546'
13
+ */
14
+ public function phoneNumber()
15
+ {
16
+ return static::numerify($this->generator->parse(static::randomElement(static::$formats)));
17
+ }
18
+
19
+ /**
20
+ * @example +27113456789
21
+ * @return string
22
+ */
23
+ public function e164PhoneNumber()
24
+ {
25
+ $formats = array('+%############');
26
+ return static::numerify($this->generator->parse(static::randomElement($formats)));
27
+ }
28
+
29
+ /**
30
+ * International Mobile Equipment Identity (IMEI)
31
+ *
32
+ * @link http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity
33
+ * @link http://imei-number.com/imei-validation-check/
34
+ * @example '720084494799532'
35
+ * @return int $imei
36
+ */
37
+ public function imei()
38
+ {
39
+ $imei = (string) static::numerify('##############');
40
+ $imei .= Luhn::computeCheckDigit($imei);
41
+ return $imei;
42
+ }
43
+ }
vendor/fakerphp/faker/src/Faker/Provider/Text.php ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ abstract class Text extends Base
6
+ {
7
+ protected static $baseText = '';
8
+ protected static $separator = ' ';
9
+ protected static $separatorLen = 1;
10
+ protected $explodedText;
11
+ protected $consecutiveWords = array();
12
+ protected static $textStartsWithUppercase = true;
13
+
14
+ /**
15
+ * Generate a text string by the Markov chain algorithm.
16
+ *
17
+ * Depending on the $maxNbChars, returns a random valid looking text. The algorithm
18
+ * generates a weighted table with the specified number of words as the index and the
19
+ * possible following words as the value.
20
+ *
21
+ * @example 'Alice, swallowing down her flamingo, and began by taking the little golden key'
22
+ * @param integer $maxNbChars Maximum number of characters the text should contain (minimum: 10)
23
+ * @param integer $indexSize Determines how many words are considered for the generation of the next word.
24
+ * The minimum is 1, and it produces a higher level of randomness, although the
25
+ * generated text usually doesn't make sense. Higher index sizes (up to 5)
26
+ * produce more correct text, at the price of less randomness.
27
+ * @return string
28
+ */
29
+ public function realText($maxNbChars = 200, $indexSize = 2)
30
+ {
31
+ if ($maxNbChars < 10) {
32
+ throw new \InvalidArgumentException('maxNbChars must be at least 10');
33
+ }
34
+
35
+ if ($indexSize < 1) {
36
+ throw new \InvalidArgumentException('indexSize must be at least 1');
37
+ }
38
+
39
+ if ($indexSize > 5) {
40
+ throw new \InvalidArgumentException('indexSize must be at most 5');
41
+ }
42
+
43
+ $words = $this->getConsecutiveWords($indexSize);
44
+ $result = array();
45
+ $resultLength = 0;
46
+ // take a random starting point
47
+ $next = static::randomKey($words);
48
+ while ($resultLength < $maxNbChars && isset($words[$next])) {
49
+ // fetch a random word to append
50
+ $word = static::randomElement($words[$next]);
51
+
52
+ // calculate next index
53
+ $currentWords = static::explode($next);
54
+ $currentWords[] = $word;
55
+ array_shift($currentWords);
56
+ $next = static::implode($currentWords);
57
+
58
+ // ensure text starts with an uppercase letter
59
+ if ($resultLength == 0 && !static::validStart($word)) {
60
+ continue;
61
+ }
62
+
63
+ // append the element
64
+ $result[] = $word;
65
+ $resultLength += static::strlen($word) + static::$separatorLen;
66
+ }
67
+
68
+ // remove the element that caused the text to overflow
69
+ array_pop($result);
70
+
71
+ // build result
72
+ $result = static::implode($result);
73
+
74
+ return static::appendEnd($result);
75
+ }
76
+
77
+ protected function getConsecutiveWords($indexSize)
78
+ {
79
+ if (!isset($this->consecutiveWords[$indexSize])) {
80
+ $parts = $this->getExplodedText();
81
+ $words = array();
82
+ $index = array();
83
+ for ($i = 0; $i < $indexSize; $i++) {
84
+ $index[] = array_shift($parts);
85
+ }
86
+
87
+ for ($i = 0, $count = count($parts); $i < $count; $i++) {
88
+ $stringIndex = static::implode($index);
89
+ if (!isset($words[$stringIndex])) {
90
+ $words[$stringIndex] = array();
91
+ }
92
+ $word = $parts[$i];
93
+ $words[$stringIndex][] = $word;
94
+ array_shift($index);
95
+ $index[] = $word;
96
+ }
97
+ // cache look up words for performance
98
+ $this->consecutiveWords[$indexSize] = $words;
99
+ }
100
+
101
+ return $this->consecutiveWords[$indexSize];
102
+ }
103
+
104
+ protected function getExplodedText()
105
+ {
106
+ if ($this->explodedText === null) {
107
+ $this->explodedText = static::explode(preg_replace('/\s+/u', ' ', static::$baseText));
108
+ }
109
+
110
+ return $this->explodedText;
111
+ }
112
+
113
+ protected static function explode($text)
114
+ {
115
+ return explode(static::$separator, $text);
116
+ }
117
+
118
+ protected static function implode($words)
119
+ {
120
+ return implode(static::$separator, $words);
121
+ }
122
+
123
+ protected static function strlen($text)
124
+ {
125
+ return function_exists('mb_strlen') ? mb_strlen($text, 'UTF-8') : strlen($text);
126
+ }
127
+
128
+ protected static function validStart($word)
129
+ {
130
+ $isValid = true;
131
+ if (static::$textStartsWithUppercase) {
132
+ $isValid = preg_match('/^\p{Lu}/u', $word);
133
+ }
134
+ return $isValid;
135
+ }
136
+
137
+ protected static function appendEnd($text)
138
+ {
139
+ return preg_replace("/([ ,-:;\x{2013}\x{2014}]+$)/us", '', $text).'.';
140
+ }
141
+ }
vendor/fakerphp/faker/src/Faker/Provider/UserAgent.php ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class UserAgent extends Base
6
+ {
7
+ protected static $userAgents = array('firefox', 'chrome', 'internetExplorer', 'opera', 'safari');
8
+
9
+ protected static $windowsPlatformTokens = array(
10
+ 'Windows NT 6.2', 'Windows NT 6.1', 'Windows NT 6.0', 'Windows NT 5.2', 'Windows NT 5.1',
11
+ 'Windows NT 5.01', 'Windows NT 5.0', 'Windows NT 4.0', 'Windows 98; Win 9x 4.90', 'Windows 98',
12
+ 'Windows 95', 'Windows CE'
13
+ );
14
+
15
+ /**
16
+ * Possible processors on Linux
17
+ */
18
+ protected static $linuxProcessor = array('i686', 'x86_64');
19
+
20
+ /**
21
+ * Mac processors (it also added U;)
22
+ */
23
+ protected static $macProcessor = array('Intel', 'PPC', 'U; Intel', 'U; PPC');
24
+
25
+ /**
26
+ * Add as many languages as you like.
27
+ */
28
+ protected static $lang = array('en-US', 'sl-SI');
29
+
30
+ /**
31
+ * Generate mac processor
32
+ *
33
+ * @return string
34
+ */
35
+ public static function macProcessor()
36
+ {
37
+ return static::randomElement(static::$macProcessor);
38
+ }
39
+
40
+ /**
41
+ * Generate linux processor
42
+ *
43
+ * @return string
44
+ */
45
+ public static function linuxProcessor()
46
+ {
47
+ return static::randomElement(static::$linuxProcessor);
48
+ }
49
+
50
+ /**
51
+ * Generate a random user agent
52
+ *
53
+ * @example 'Mozilla/5.0 (Windows CE) AppleWebKit/5350 (KHTML, like Gecko) Chrome/13.0.888.0 Safari/5350'
54
+ */
55
+ public static function userAgent()
56
+ {
57
+ $userAgentName = static::randomElement(static::$userAgents);
58
+
59
+ return static::$userAgentName();
60
+ }
61
+
62
+ /**
63
+ * Generate Chrome user agent
64
+ *
65
+ * @example 'Mozilla/5.0 (Macintosh; PPC Mac OS X 10_6_5) AppleWebKit/5312 (KHTML, like Gecko) Chrome/14.0.894.0 Safari/5312'
66
+ */
67
+ public static function chrome()
68
+ {
69
+ $saf = mt_rand(531, 536) . mt_rand(0, 2);
70
+
71
+ $platforms = array(
72
+ '(' . static::linuxPlatformToken() . ") AppleWebKit/$saf (KHTML, like Gecko) Chrome/" . mt_rand(36, 40) . '.0.' . mt_rand(800, 899) . ".0 Mobile Safari/$saf",
73
+ '(' . static::windowsPlatformToken() . ") AppleWebKit/$saf (KHTML, like Gecko) Chrome/" . mt_rand(36, 40) . '.0.' . mt_rand(800, 899) . ".0 Mobile Safari/$saf",
74
+ '(' . static::macPlatformToken() . ") AppleWebKit/$saf (KHTML, like Gecko) Chrome/" . mt_rand(36, 40) . '.0.' . mt_rand(800, 899) . ".0 Mobile Safari/$saf"
75
+ );
76
+
77
+ return 'Mozilla/5.0 ' . static::randomElement($platforms);
78
+ }
79
+
80
+ /**
81
+ * Generate Firefox user agent
82
+ *
83
+ * @example 'Mozilla/5.0 (X11; Linuxi686; rv:7.0) Gecko/20101231 Firefox/3.6'
84
+ */
85
+ public static function firefox()
86
+ {
87
+ $ver = 'Gecko/' . date('Ymd', mt_rand(strtotime('2010-1-1'), time())) . ' Firefox/' . mt_rand(35, 37) . '.0';
88
+
89
+ $platforms = array(
90
+ '(' . static::windowsPlatformToken() . '; ' . static::randomElement(static::$lang) . '; rv:1.9.' . mt_rand(0, 2) . '.20) ' . $ver,
91
+ '(' . static::linuxPlatformToken() . '; rv:' . mt_rand(5, 7) . '.0) ' . $ver,
92
+ '(' . static::macPlatformToken() . ' rv:' . mt_rand(2, 6) . '.0) ' . $ver
93
+ );
94
+
95
+ return "Mozilla/5.0 " . static::randomElement($platforms);
96
+ }
97
+
98
+ /**
99
+ * Generate Safari user agent
100
+ *
101
+ * @example 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_7_1 rv:3.0; en-US) AppleWebKit/534.11.3 (KHTML, like Gecko) Version/4.0 Safari/534.11.3'
102
+ */
103
+ public static function safari()
104
+ {
105
+ $saf = mt_rand(531, 535) . '.' . mt_rand(1, 50) . '.' . mt_rand(1, 7);
106
+ if (mt_rand(0, 1) == 0) {
107
+ $ver = mt_rand(4, 5) . '.' . mt_rand(0, 1);
108
+ } else {
109
+ $ver = mt_rand(4, 5) . '.0.' . mt_rand(1, 5);
110
+ }
111
+
112
+ $mobileDevices = array(
113
+ 'iPhone; CPU iPhone OS',
114
+ 'iPad; CPU OS'
115
+ );
116
+
117
+ $platforms = array(
118
+ '(Windows; U; ' . static::windowsPlatformToken() . ") AppleWebKit/$saf (KHTML, like Gecko) Version/$ver Safari/$saf",
119
+ '(' . static::macPlatformToken() . ' rv:' . mt_rand(2, 6) . '.0; ' . static::randomElement(static::$lang) . ") AppleWebKit/$saf (KHTML, like Gecko) Version/$ver Safari/$saf",
120
+ '(' . static::randomElement($mobileDevices) . ' ' . mt_rand(7, 8) . '_' . mt_rand(0, 2) . '_' . mt_rand(1, 2) . ' like Mac OS X; ' . static::randomElement(static::$lang) . ") AppleWebKit/$saf (KHTML, like Gecko) Version/" . mt_rand(3, 4) . ".0.5 Mobile/8B" . mt_rand(111, 119) . " Safari/6$saf",
121
+ );
122
+
123
+ return "Mozilla/5.0 " . static::randomElement($platforms);
124
+ }
125
+
126
+ /**
127
+ * Generate Opera user agent
128
+ *
129
+ * @example 'Opera/8.25 (Windows NT 5.1; en-US) Presto/2.9.188 Version/10.00'
130
+ */
131
+ public static function opera()
132
+ {
133
+ $platforms = array(
134
+ '(' . static::linuxPlatformToken() . '; ' . static::randomElement(static::$lang) . ') Presto/2.' . mt_rand(8, 12) . '.' . mt_rand(160, 355) . ' Version/' . mt_rand(10, 12) . '.00',
135
+ '(' . static::windowsPlatformToken() . '; ' . static::randomElement(static::$lang) . ') Presto/2.' . mt_rand(8, 12) . '.' . mt_rand(160, 355) . ' Version/' . mt_rand(10, 12) . '.00'
136
+ );
137
+
138
+ return "Opera/" . mt_rand(8, 9) . '.' . mt_rand(10, 99) . ' ' . static::randomElement($platforms);
139
+ }
140
+
141
+ /**
142
+ * Generate Internet Explorer user agent
143
+ *
144
+ * @example 'Mozilla/5.0 (compatible; MSIE 7.0; Windows 98; Win 9x 4.90; Trident/3.0)'
145
+ */
146
+ public static function internetExplorer()
147
+ {
148
+ return 'Mozilla/5.0 (compatible; MSIE ' . mt_rand(5, 11) . '.0; ' . static::windowsPlatformToken() . '; Trident/' . mt_rand(3, 5) . '.' . mt_rand(0, 1) . ')';
149
+ }
150
+
151
+ public static function windowsPlatformToken()
152
+ {
153
+ return static::randomElement(static::$windowsPlatformTokens);
154
+ }
155
+
156
+ public static function macPlatformToken()
157
+ {
158
+ return 'Macintosh; ' . static::randomElement(static::$macProcessor) . ' Mac OS X 10_' . mt_rand(5, 8) . '_' . mt_rand(0, 9);
159
+ }
160
+
161
+ public static function linuxPlatformToken()
162
+ {
163
+ return 'X11; Linux ' . static::randomElement(static::$linuxProcessor);
164
+ }
165
+ }
vendor/fakerphp/faker/src/Faker/Provider/Uuid.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider;
4
+
5
+ class Uuid extends Base
6
+ {
7
+ /**
8
+ * Generate name based md5 UUID (version 3).
9
+ * @example '7e57d004-2b97-0e7a-b45f-5387367791cd'
10
+ */
11
+ public static function uuid()
12
+ {
13
+ // fix for compatibility with 32bit architecture; each mt_rand call is restricted to 32bit
14
+ // two such calls will cause 64bits of randomness regardless of architecture
15
+ $seed = mt_rand(0, 2147483647) . '#' . mt_rand(0, 2147483647);
16
+
17
+ // Hash the seed and convert to a byte array
18
+ $val = md5($seed, true);
19
+ $byte = array_values(unpack('C16', $val));
20
+
21
+ // extract fields from byte array
22
+ $tLo = ($byte[0] << 24) | ($byte[1] << 16) | ($byte[2] << 8) | $byte[3];
23
+ $tMi = ($byte[4] << 8) | $byte[5];
24
+ $tHi = ($byte[6] << 8) | $byte[7];
25
+ $csLo = $byte[9];
26
+ $csHi = $byte[8] & 0x3f | (1 << 7);
27
+
28
+ // correct byte order for big edian architecture
29
+ if (pack('L', 0x6162797A) == pack('N', 0x6162797A)) {
30
+ $tLo = (($tLo & 0x000000ff) << 24) | (($tLo & 0x0000ff00) << 8)
31
+ | (($tLo & 0x00ff0000) >> 8) | (($tLo & 0xff000000) >> 24);
32
+ $tMi = (($tMi & 0x00ff) << 8) | (($tMi & 0xff00) >> 8);
33
+ $tHi = (($tHi & 0x00ff) << 8) | (($tHi & 0xff00) >> 8);
34
+ }
35
+
36
+ // apply version number
37
+ $tHi &= 0x0fff;
38
+ $tHi |= (3 << 12);
39
+
40
+ // cast to string
41
+ $uuid = sprintf(
42
+ '%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x',
43
+ $tLo,
44
+ $tMi,
45
+ $tHi,
46
+ $csHi,
47
+ $csLo,
48
+ $byte[10],
49
+ $byte[11],
50
+ $byte[12],
51
+ $byte[13],
52
+ $byte[14],
53
+ $byte[15]
54
+ );
55
+
56
+ return $uuid;
57
+ }
58
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Address.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_JO;
4
+
5
+ class Address extends \Faker\Provider\Address
6
+ {
7
+ protected static $streetPrefix = array('شارع');
8
+
9
+ protected static $cityPrefix = array('شمال', 'شرق', 'غرب', 'جنوب', 'وسط', );
10
+
11
+ /**
12
+ * @link http://ar.wikipedia.org/wiki/%D9%85%D9%84%D8%AD%D9%82:%D9%82%D8%A7%D8%A6%D9%85%D8%A9_%D9%85%D8%AF%D9%86_%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%86
13
+ */
14
+ protected static $cityName = array(
15
+ 'اربد', 'أبو نصير', 'الجبيهه', 'الحصن', 'الرصيفة', 'الرمثا', 'الزرقاء', 'السلط', 'الشهيد عزمي', 'الصريح', 'الضليل', 'الطفيلة', 'العقبة', 'القويسمة', 'الكرك', 'المشارع', 'المفرق', 'الهاشمية', 'ام قصير', 'ايدون',
16
+ 'بيت راس',
17
+ 'تلاع العلي',
18
+ 'جرش',
19
+ 'ساكب', 'سحاب',
20
+ 'شفا بدران',
21
+ 'صويلح',
22
+ 'عمان', 'عنجره', 'عين الباشا',
23
+ 'غور الصافي',
24
+ 'كريمه', 'كفرنجه',
25
+ 'مادبا', 'مخيم البقعه', 'مخيم حطين', 'مرج الحمام', 'معان',
26
+ 'ناعور',
27
+ 'وادي السير',
28
+ );
29
+
30
+ protected static $buildingNumber = array('#####', '####', '##');
31
+
32
+ protected static $postcode = array('#####', '#####-####');
33
+
34
+ /**
35
+ * @link http://ar.wikipedia.org/wiki/%D9%85%D9%84%D8%AD%D9%82:%D9%82%D8%A7%D8%A6%D9%85%D8%A9_%D8%A7%D9%84%D9%88%D9%84%D8%A7%D9%8A%D8%A7%D8%AA_%D8%A7%D9%84%D8%A3%D9%85%D8%B1%D9%8A%D9%83%D9%8A%D8%A9_%D8%AD%D8%B3%D8%A8_%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A9
36
+ */
37
+ protected static $state = array(
38
+ 'آيوا', 'أركنساس', 'أريزونا', 'ألاباما', 'ألاسكا', 'أوريغون', 'أوكلاهوما', 'أوهايو', 'أيداهو', 'إلينوي', 'إنديانا', 'الاباما', 'الجزر العذراء الأمريكية',
39
+ 'بنس يلفانيا', 'بورتو ريكو',
40
+ 'تكساس', 'تينيسي',
41
+ 'جزر ماريانا الشمالية', 'جورجيا',
42
+ 'داكوتا الجنوبية', 'داكوتا الشمالية', 'ديلاوير', 'رود آيلاند',
43
+ 'ساموا الأمريكية',
44
+ 'غوام',
45
+ 'فرجينيا الغربية', 'فلوريدا', 'فيرجينيا', 'فيرجينيا الغربية', 'فيرمونت',
46
+ 'كارولاينا الجنوبية', 'كارولاينا الشمالية','كارولينا الشمالية', 'كاليفورنيا', 'كانساس', 'كنتاكي', 'كولورادو', 'كونيتيكت',
47
+ 'لويزيانا',
48
+ 'ماريلاند', 'ماساتشوستس', 'ماين', 'مسيسيبي', 'مونتانا', 'ميريلاند', 'ميزوري', 'ميشيغان', 'مين', 'مينيسوتا',
49
+ 'نبراسكا', 'نيفادا', 'نيو جيرسي', 'نيو ميكسيكو', 'نيوهامشير', 'نيويورك',
50
+ 'هاواي',
51
+ 'واشنطن', 'وايومنغ', 'ويسكنسن', 'يوتا',
52
+ );
53
+
54
+ protected static $stateAbbr = array(
55
+ 'AK', 'AL', 'AR', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'GA', 'HI', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA', 'MA', 'MD', 'ME', 'MI', 'MN', 'MO', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VA', 'VT', 'WA', 'WI', 'WV', 'WY'
56
+ );
57
+
58
+ /**
59
+ * @link http://www.nationsonline.org/oneworld/countrynames_arabic.htm
60
+ */
61
+ protected static $country = array(
62
+ 'الكاريبي', 'أمريكا الوسطى', 'أنتيجوا وبربودا', 'أنجولا', 'أنجويلا', 'أندورا', 'اندونيسيا', 'أورجواي', 'أوروبا', 'أوزبكستان', 'أوغندا', 'أوقيانوسيا', 'أوقيانوسيا النائية', 'أوكرانيا', 'ايران', 'أيرلندا', 'أيسلندا', 'ايطاليا',
63
+ 'بابوا غينيا الجديدة', 'باراجواي', 'باكستان', 'بالاو', 'بتسوانا', 'بتكايرن', 'بربادوس', 'برمودا', 'بروناي', 'بلجيكا', 'بلغاريا', 'بليز', 'بنجلاديش', 'بنما', 'بنين', 'بوتان', 'بورتوريكو', 'بوركينا فاسو', 'بوروندي', 'بولندا', 'بوليفيا', 'بولينيزيا', 'بولينيزيا الفرنسية', 'بيرو',
64
+ 'تانزانيا', 'تايلند', 'تايوان', 'تركمانستان', 'تركيا', 'ترينيداد وتوباغو', 'تشاد', 'توجو', 'توفالو', 'توكيلو', 'تونجا', 'تونس', 'تيمور الشرقية',
65
+ 'جامايكا', 'جبل طارق', 'جرينادا', 'جرينلاند', 'جزر الأنتيل الهولندية', 'جزر الترك وجايكوس', 'جزر القمر', 'جزر الكايمن', 'جزر المارشال', 'جزر الملديف', 'جزر الولايات المتحدة البعيدة الصغيرة', 'جزر أولان', 'جزر سليمان', 'جزر فارو', 'جزر فرجين الأمريكية', 'جزر فرجين البريطانية', 'جزر فوكلاند', 'جزر كوك', 'جزر كوكوس', 'جزر ماريانا الشمالية', 'جزر والس وفوتونا', 'جزيرة الكريسماس', 'جزيرة بوفيه', 'جزيرة مان', 'جزيرة نورفوك', 'جزيرة هيرد وماكدونالد', 'جمهورية افريقيا الوسطى', 'جمهورية التشيك', 'جمهورية الدومينيك', 'جمهورية الكونغو الديمقراطية', 'جمهورية جنوب افريقيا', 'جنوب آسيا', 'جنوب أوروبا', 'جنوب شرق آسيا', 'جنوب وسط آسيا', 'جواتيمالا', 'جوادلوب', 'جوام', 'جورجيا', 'جورجيا الجنوبية وجزر ساندويتش الجنوبية', 'جيبوتي', 'جيرسي',
66
+ 'دومينيكا',
67
+ 'رواندا', 'روسيا', 'روسيا البيضاء', 'رومانيا', 'روينيون',
68
+ 'زامبيا', 'زيمبابوي',
69
+ 'ساحل العاج', 'ساموا', 'ساموا الأمريكية', 'سانت بيير وميكولون', 'سانت فنسنت وغرنادين', 'سانت كيتس ونيفيس', 'سانت لوسيا', 'سانت مارتين', 'سانت هيلنا', 'سان مارينو', 'ساو تومي وبرينسيبي', 'سريلانكا', 'سفالبارد وجان مايان', 'سلوفاكيا', 'سلوفينيا', 'سنغافورة', 'سوازيلاند', 'سوريا', 'سورينام', 'سويسرا', 'سيراليون', 'سيشل',
70
+ 'شرق آسيا', 'شرق افريقيا', 'شرق أوروبا', 'شمال افريقيا', 'شمال أمريكا', 'شمال أوروبا', 'شيلي',
71
+ 'صربيا', 'صربيا والجبل الأسود',
72
+ 'طاجكستان',
73
+ 'عمان',
74
+ 'غامبيا', 'غانا', 'غرب آسيا', 'غرب افريقيا', 'غرب أوروبا', 'غويانا', 'غيانا', 'غينيا', 'غينيا الاستوائية', 'غينيا بيساو',
75
+ 'فانواتو', 'فرنسا', 'فلسطين', 'فنزويلا', 'فنلندا', 'فيتنام', 'فيجي',
76
+ 'قبرص', 'قرغيزستان', 'قطر',
77
+ 'كازاخستان', 'كاليدونيا الجديدة', 'كرواتيا', 'كمبوديا', 'كندا', 'كوبا', 'كوريا الجنوبية', 'كوريا الشمالية', 'كوستاريكا', 'كولومبيا', 'كومنولث الدول المستقلة', 'كيريباتي', 'كينيا',
78
+ 'لاتفيا', 'لاوس', 'لبنان', 'لوكسمبورج', 'ليبيا', 'ليبيريا', 'ليتوانيا', 'ليختنشتاين', 'ليسوتو',
79
+ 'مارتينيك', 'ماكاو الصينية', 'مالطا', 'مالي', 'ماليزيا', 'مايوت', 'مدغشقر', 'مصر', 'مقدونيا', 'ملاوي', 'منغوليا', 'موريتانيا', 'موريشيوس', 'موزمبيق', 'مولدافيا', 'موناكو', 'مونتسرات', 'ميانمار', 'ميكرونيزيا', 'ميلانيزيا',
80
+ 'ناميبيا', 'نورو', 'نيبال', 'نيجيريا', 'نيكاراجوا', 'نيوزيلاندا', 'نيوي',
81
+ 'هايتي', 'هندوراس', 'هولندا', 'هونج كونج الصينية',
82
+ 'وسط آسيا', 'وسط افريقيا',
83
+ );
84
+
85
+ protected static $cityFormats = array(
86
+ '{{cityPrefix}} {{cityName}}',
87
+ '{{cityName}}',
88
+ );
89
+
90
+ protected static $streetNameFormats = array(
91
+ '{{streetPrefix}} {{firstName}} {{lastName}}',
92
+ );
93
+
94
+ protected static $streetAddressFormats = array(
95
+ '{{buildingNumber}} {{streetName}}',
96
+ '{{buildingNumber}} {{streetName}} {{secondaryAddress}}',
97
+ );
98
+
99
+ protected static $addressFormats = array(
100
+ "{{streetAddress}}\n{{city}}",
101
+ );
102
+
103
+ protected static $secondaryAddressFormats = array('شقة رقم. ##', 'بناية رقم ##');
104
+
105
+ /**
106
+ * @example 'شرق'
107
+ */
108
+ public static function cityPrefix()
109
+ {
110
+ return static::randomElement(static::$cityPrefix);
111
+ }
112
+
113
+ /**
114
+ * @example 'عمان'
115
+ */
116
+ public static function cityName()
117
+ {
118
+ return static::randomElement(static::$cityName);
119
+ }
120
+
121
+ /**
122
+ * @example 'شارع'
123
+ */
124
+ public static function streetPrefix()
125
+ {
126
+ return static::randomElement(static::$streetPrefix);
127
+ }
128
+
129
+ /**
130
+ * @example 'شقة رقم. 350'
131
+ */
132
+ public static function secondaryAddress()
133
+ {
134
+ return static::numerify(static::randomElement(static::$secondaryAddressFormats));
135
+ }
136
+
137
+ /**
138
+ * @example 'كاليفورنيا'
139
+ */
140
+ public static function state()
141
+ {
142
+ return static::randomElement(static::$state);
143
+ }
144
+
145
+ /**
146
+ * @example 'CA'
147
+ */
148
+ public static function stateAbbr()
149
+ {
150
+ return static::randomElement(static::$stateAbbr);
151
+ }
152
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Company.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_JO;
4
+
5
+ class Company extends \Faker\Provider\Company
6
+ {
7
+ protected static $formats = array(
8
+ '{{lastName}} {{companySuffix}}',
9
+ '{{companyPrefix}} {{lastName}} {{companySuffix}}',
10
+ '{{companyPrefix}} {{lastName}}',
11
+ );
12
+
13
+ protected static $bsWords = array(
14
+ array()
15
+ );
16
+
17
+ protected static $catchPhraseWords = array(
18
+ array('الخدمات','الحلول','الانظمة'),
19
+ array(
20
+ 'الذهبية','الذكية','المتطورة','المتقدمة', 'الدولية', 'المتخصصه', 'السريعة',
21
+ 'المثلى', 'الابداعية', 'المتكاملة', 'المتغيرة', 'المثالية'
22
+ ),
23
+ );
24
+
25
+ protected static $companyPrefix = array('شركة','مؤسسة','مجموعة','مكتب','أكاديمية','معرض');
26
+
27
+ protected static $companySuffix = array('وأولاده', 'للمساهمة المحدودة', ' ذ.م.م', 'مساهمة عامة', 'وشركائه');
28
+
29
+ /**
30
+ * @example 'مؤسسة'
31
+ * @return string
32
+ */
33
+ public function companyPrefix()
34
+ {
35
+ return static::randomElement(self::$companyPrefix);
36
+ }
37
+
38
+ /**
39
+ * @example 'Robust full-range hub'
40
+ */
41
+ public function catchPhrase()
42
+ {
43
+ $result = array();
44
+ foreach (static::$catchPhraseWords as &$word) {
45
+ $result[] = static::randomElement($word);
46
+ }
47
+
48
+ return join(' ', $result);
49
+ }
50
+
51
+ /**
52
+ * @example 'integrate extensible convergence'
53
+ */
54
+ public function bs()
55
+ {
56
+ $result = array();
57
+ foreach (static::$bsWords as &$word) {
58
+ $result[] = static::randomElement($word);
59
+ }
60
+
61
+ return join(' ', $result);
62
+ }
63
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Internet.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_JO;
4
+
5
+ class Internet extends \Faker\Provider\Internet
6
+ {
7
+ protected static $userNameFormats = array(
8
+ '{{lastNameAscii}}.{{firstNameAscii}}',
9
+ '{{firstNameAscii}}.{{lastNameAscii}}',
10
+ '{{firstNameAscii}}##',
11
+ '?{{lastNameAscii}}',
12
+ );
13
+ protected static $safeEmailTld = array(
14
+ 'com', 'jo', 'me', 'net', 'org',
15
+ );
16
+
17
+ protected static $tld = array(
18
+ 'biz', 'com', 'info', 'jo', 'net', 'org',
19
+ );
20
+
21
+ protected static $lastNameAscii = array(
22
+ 'abbad', 'abbadi', 'abbas', 'abulebbeh', 'flefel', 'hadi', 'hamad', 'hasan', 'jabri', 'kanaan', 'karam', 'maanee', 'melhem', 'nimry', 'obaisi', 'qasem', 'qawasmee', 'rabee', 'rashwani', 'shami', 'zaloum',
23
+ );
24
+ protected static $firstNameAscii = array(
25
+ 'abd', 'abdullah', 'ahmad', 'akram', 'amr', 'bashar', 'bilal', 'fadi', 'ibrahim', 'khaled', 'layth', 'mohammad', 'mutaz', 'omar', 'osama', 'rami', 'saleem', 'samer', 'sami', 'yazan',
26
+ );
27
+
28
+ public static function lastNameAscii()
29
+ {
30
+ return static::randomElement(static::$lastNameAscii);
31
+ }
32
+
33
+ public static function firstNameAscii()
34
+ {
35
+ return static::randomElement(static::$firstNameAscii);
36
+ }
37
+
38
+ /**
39
+ * @example 'ahmad.abbadi'
40
+ */
41
+ public function userName()
42
+ {
43
+ $format = static::randomElement(static::$userNameFormats);
44
+
45
+ return static::bothify($this->generator->parse($format));
46
+ }
47
+
48
+ /**
49
+ * @example 'wewebit.jo'
50
+ */
51
+ public function domainName()
52
+ {
53
+ return static::randomElement(static::$lastNameAscii) . '.' . $this->tld();
54
+ }
55
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Person.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_JO;
4
+
5
+ class Person extends \Faker\Provider\Person
6
+ {
7
+ protected static $maleNameFormats = array(
8
+ '{{firstNameMale}} {{lastName}}',
9
+ '{{firstNameMale}} {{lastName}}',
10
+ '{{firstNameMale}} {{lastName}}',
11
+ '{{firstNameMale}} {{lastName}}',
12
+ '{{titleMale}} {{firstNameMale}} {{lastName}}',
13
+ );
14
+
15
+ protected static $femaleNameFormats = array(
16
+ '{{firstNameFemale}} {{lastName}}',
17
+ '{{firstNameFemale}} {{lastName}}',
18
+ '{{firstNameFemale}} {{lastName}}',
19
+ '{{firstNameFemale}} {{lastName}}',
20
+ '{{titleFemale}} {{firstNameFemale}} {{lastName}}',
21
+ );
22
+
23
+ /**
24
+ * @link http://muslim-names.us/
25
+ */
26
+ protected static $firstNameMale = array(
27
+ 'آدم', 'أبراهيم', 'أبو بكر', 'أحمد', 'أدهم', 'أسامة', 'أسعد', 'أسيد', 'أشرف', 'أكثم', 'أكرم', 'أمجد', 'أمين', 'أنتوني', 'أنزور', 'أنس', 'أنمار', 'أنور', 'أواس', 'أوس', 'أيمن', 'أيهم', 'أيوب', 'إبراهيم', 'إسلام', 'إسماعيل', 'إلياس', 'إياد', 'إيهاب', 'ابان', 'ابراهام', 'ابراهيم', 'ابراهيم محمد', 'اثير', 'احسان', 'احمد', 'ادريس', 'ادم', 'ادهم', 'اديب', 'ارام', 'ازاد', 'ازد', 'اسامة', 'اسحاق', 'اسحق', 'اسعد', 'اسلام', 'اسماعيل', 'اسيد', 'اشراف', 'اشرف', 'اصلان', 'اكثم', 'اكرم', 'البراء', 'البشر', 'البطوش', 'الحارث', 'الحسين', 'الحمزه', 'الطفيل', 'العزم', 'الليث', 'المؤمن بالله', 'المثنى', 'المستبد', 'المعتز', 'المعتز بالله', 'المعتصم بالله', 'المنتصر بالله', 'المنصور', 'الياس', 'اليمان', 'امجد', 'امل', 'امير', 'امين', 'اندرو', 'انس', 'انور', 'انيس', 'اوس', 'اوسم', 'اوهان', 'اويس', 'اياد', 'اياد الدين', 'اياس', 'ايسر', 'ايليا', 'ايمن', 'ايهاب', 'ايهم', 'ايوب',
28
+ 'باجس', 'باسل', 'باسم', 'باندي', 'باهر', 'بدر', 'بدوان', 'براء', 'برنابا', 'برهان', 'بسام', 'بشار', 'بشارة', 'بشر', 'بشير', 'بطرس', 'بكر', 'بلال', 'بليغ', 'بندر', 'بهاء', 'بهاء الدين', 'بيتر',
29
+ 'تامر', 'تحسين', 'تركي', 'تشارلي', 'تقي الدين', 'توفيق', 'تيسير', 'تيمور',
30
+ 'ثائر', 'ثامر',
31
+ 'جابر', 'جاد', 'جاسر', 'جاسم', 'جاك', 'جباغ', 'جبر', 'جبرائي', 'جبير', 'جراح', 'جريس', 'جعفر', 'جلال', 'جلال الدين', 'جمال', 'جمزه', 'جميل', 'جهاد', 'جواد', 'جودت', 'جورج', 'جوزيف',
32
+ 'حابس', 'حاتم', 'حارث', 'حارثه', 'حازم', 'حازم محمد', 'حافظ', 'حاكم', 'حالد', 'حامد', 'حبيب', 'حذيفة', 'حذيفه', 'حسام', 'حسام الدين', 'حسان', 'حسن', 'حسني', 'حسين', 'حكم', 'حكمت', 'حلمي', 'حماده', 'حمد', 'حمدالله', 'حمدان', 'حمدي', 'حمزة', 'حمزه', 'حمود', 'حمودة', 'حموده', 'حميد', 'حنا', 'خالد',
33
+ 'خضر', 'خلدون', 'خلف', 'خليفة', 'خليفه', 'خليل', 'خميس', 'خير الدين', 'خيرالله', 'خيري',
34
+ 'دانتي', 'داني', 'دانيال', 'داود', 'داوود',
35
+ 'ذياب', 'ذيب',
36
+ 'رأفت', 'رؤوف', 'رئاد', 'رائد', 'رائف', 'راجح', 'راجي', 'راشد', 'راضي', 'راغب', 'رافت', 'رافع', 'رافي', 'راكان', 'رامان', 'رامز', 'رامي', 'رامين', 'ربيع', 'رجا', 'رجائي', 'رجب', 'رداد', 'رزق', 'رسلان', 'رسلان الدين', 'رشاد', 'رشبد', 'رشيد', 'رضا', 'رضوان', 'رعد', 'رغد', 'رغيد', 'ركان', 'رماح', 'رمزي', 'رمضان', 'رهاب', 'رواد', 'روحي', 'روزا', 'روني', 'رياض', 'ريان', 'ريتشارد', 'ريمون',
37
+ 'زاهر', 'زاهي', 'زايد', 'زبد', 'زخريا', 'زكريا', 'زكي', 'زمام', 'زهدي', 'زهير', 'زياد', 'زيد', 'زيدان', 'زيدون', 'زين', 'زين العابدين', 'سائد', 'سابا', 'ساري', 'سالم', 'سامح', 'سامر', 'سامي', 'ساهر', 'سدير', 'سركيس', 'سرمد', 'سري', 'سعد', 'سعدي', 'سعود', 'سعيد', 'سفيان', 'سكوت', 'سلام', 'سلطان', 'سلمان', 'سليم', 'سليمان', 'سمؤل', 'سمعان', 'سميح', 'سمير', 'سنان', 'سند', 'سهام الدين', 'سهل', 'سهم', 'سيف', 'سيف الاسلام', 'سيف الدين', 'سيمون',
38
+ 'شادي', 'شارلي', 'شافع', 'شاكر', 'شامان', 'شامل', 'شاهر', 'شحادة', 'شحاده', 'شربف', 'شرحبيل', 'شريف', 'شكري', 'شهاب', 'شهم', 'شوان', 'شوقي', 'شوكت',
39
+ 'صادق', 'صافي', 'صالح', 'صبحي', 'صبره', 'صبري', 'صخر', 'صدام', 'صدقي', 'صفاء', 'صفوان', 'صقر', 'صلاح', 'صلاح الدين', 'صليبا', 'صهيب',
40
+ 'ضرار', 'ضرغام', 'ضياء', 'ضياء الدين',
41
+ 'طارق', 'طالب', 'طاهر', 'طلال', 'طه',
42
+ 'عادل', 'عاصم', 'عاطف', 'عامر', 'عايد', 'عبادة', 'عباده', 'عباس', 'عبد', 'عبد الباري', 'عبد الحافظ', 'عبد الحكيم', 'عبد الحليم', 'عبد الحميد', 'عبد الحي', 'عبد الرحمان', 'عبد الرحمن', 'عبد الرحيم', 'عبد الرزاق', 'عبد السلام', 'عبد السميع', 'عبد العزيز', 'عبد العفو', 'عبد الغني', 'عبد الفتاح', 'عبد القادر', 'عبد الكريم', 'عبد اللطيف', 'عبد الله', 'عبد المجيد', 'عبد المولى', 'عبد الناصر', 'عبد الهادي', 'عبد ربه', 'عبداالله', 'عبدالاله', 'عبدالباسط', 'عبدالجليل', 'عبدالجواد', 'عبدالحليم', 'عبدالحميد', 'عبدالرؤوف', 'عبدالرحمن', 'عبدالرحيم', 'عبدالرزاق', 'عبدالسلام', 'عبدالعزيز', 'عبدالفتاح', 'عبدالقادر', 'عبدالكريم', 'عبداللطيف', 'عبدالله', 'عبدالمجيد', 'عبدالمطلب', 'عبدالمعطي', 'عبدالمهيمن', 'عبدالناصر', 'عبدالهادي', 'عبدالوهاب', 'عبدربه', 'عبده', 'عبود', 'عبيدالله', 'عبيدة', 'عتيبه', 'عثمان', 'عدب', 'عدلي', 'عدنان', 'عدوان', 'عدى', 'عدي', 'عرار', 'عربي', 'عرفات', 'عرفة', 'عرمان', 'عروة', 'عريق', 'عرين', 'عز الدين', 'عزالدين', 'عزام', 'عزت', 'عزمي', 'عزيز', 'عصام', 'عصمت', 'عطا', 'عطاالله', 'عطيه', 'عقل', 'علاء', 'علاء الدين', 'علي', 'عليان', 'عماد', 'عماد الدين', 'عمادالدين', 'عمار', 'عمر', 'عمراسامة', 'عمران', 'عمرو', 'عملا', 'عميد', 'عناد', 'عنان', 'عواد', 'عودة', 'عوده', 'عوض', 'عوف', 'عون', 'عوني', 'عيد', 'عيدالله', 'عيسى',
43
+ 'غازي', 'غالب', 'غانم', 'غدير', 'غسان', 'غيث',
44
+ 'فؤاد', 'فؤاس', 'فائق', 'فاخر', 'فادي', 'فارس', 'فاروق', 'فاضل', 'فايز', 'فتحي', 'فجر', 'فخرى', 'فخري', 'فرأس', 'فراس', 'فرح', 'فريد', 'فكتور', 'فلاح', 'فندي', 'فهد', 'فهمي', 'فواز', 'فوزي', 'فيصل', 'فيليب',
45
+ 'قارس', 'قاسم', 'قبلان', 'قتاده', 'قتيبة', 'قتيبه', 'قصي', 'قيس',
46
+ 'كاسترو', 'كاظم', 'كامل', 'كايد', 'كرم', 'كريم', 'كفاح', 'كمال', 'كنان',
47
+ 'لؤي', 'لؤي الدين', 'لبيب', 'لطف', 'لطفي', 'لورنس', 'لويس', 'ليث', 'ليث الدين', 'ليليان',
48
+ 'مأمون', 'مؤتمن', 'مؤثر', 'مؤمن', 'مؤنس', 'مؤيد', 'ماجد', 'مارتن', 'مارسيل', 'مازن', 'مالك', 'مامون', 'ماهر', 'مبارك', 'مثنى', 'مجاهد', 'مجد', 'مجدي', 'مجمد', 'محسن', 'محمد‏ ‏', 'محمود', 'محي', 'محي الدين', 'مختار', 'مخلص', 'مدحت', 'مدين', 'مراد', 'مرشد', 'مرهف', 'مروان', 'مسعد', 'مسعود', 'مسلم', 'مشاري', 'مشعل', 'مشهور', 'مشيل', 'مصباح', 'مصطغى', 'مصطفى', 'مصطفي', 'مصطلفى', 'مصعب', 'مضر', 'مطيع', 'مظفر', 'مظهر', 'معاد', 'معاذ', 'معاوية', 'معاويه', 'معتز', 'معتصم', 'معمر', 'معن', 'معنصم', 'معويه', 'معين', 'مفدي', 'مفلح', 'مقداد', 'مكين', 'ملهم', 'ممدوح', 'مناف', 'منتصر', 'منح', 'منذر', 'منصف', 'منصور', 'منقذ', 'منير', 'مهاب', 'مهدي', 'مهران', 'مهند', 'موسى', 'موفق', 'مياس', 'ميسم', 'ميشيل', 'ميلاد', 'مينا',
49
+ 'نائل', 'ناجي', 'نادر', 'نارت', 'ناصر', 'ناهض', 'نايف', 'نبراس', 'نبيل', 'نتانت', 'نجاتي', 'نجيب', 'نديم', 'نزار', 'نزال', 'نزيه', 'نسيم', 'نشات', 'نصار', 'نصر', 'نصري', 'نصوح', 'نضال', 'نظام', 'نعمان', 'نعمة', 'نعيم', 'نقولا', 'نمر', 'نهاد', 'نهار', 'نواف', 'نور', 'نور الدين', 'نورالدين', 'نورس', 'نوفان',
50
+ 'هادي', 'هارون', 'هاشم', 'هاكان', 'هانى', 'هاني', 'هذال', 'هشام', 'هلال', 'همام', 'هملر', 'هناء', 'هيثم',
51
+ 'وائل', 'واثق', 'واصف', 'وجدي', 'وجيه', 'وحيد', 'وديع', 'ورد', 'وسام', 'وسام الدين', 'وسن', 'وسيم', 'وصفي', 'وضاح', 'وعد', 'وفاء', 'وليد', 'وهيب',
52
+ 'ياسر', 'ياسين', 'يامن', 'يحيى', 'يزن', 'يزيد', 'يسار', 'يشار', 'يعرب', 'يعقوب', 'يمان', 'ينال', 'يوسف', 'يونس',
53
+ );
54
+
55
+ /**
56
+ * @link http://muslim-names.us/
57
+ */
58
+ protected static $firstNameFemale = array(
59
+ 'آثار', 'آلاء', 'آناء', 'آية', 'أبرار', 'أحلام', 'أروى', 'أريج', 'أسماء', 'أسيل', 'أصاله', 'أفنان', 'ألاء', 'أماني', 'أمل', 'أميرة', 'أنسام', 'أنطوانيت', 'أنوار', 'أيات', 'أية', 'أيناس', 'أيه', 'ؤقهسفغ', 'إباء', 'إخلاص', 'إسراء', 'إسلام', 'إكرام', 'إنعام', 'إيمان', 'إيناس', 'ابتهاج', 'ابتهال', 'ابرار', 'ابراهيم', 'اتيان', 'احسان', 'احلام', 'احمد', 'اخلاص', 'ارجوان', 'اروى', 'اريج', 'ازهار', 'اسامة', 'اسحار', 'اسرا', 'اسراء', 'اسرار', 'اسلام', 'اسما', 'اسماء', 'اسمهان', 'اسمى', 'اسيل', 'اشراق', 'اصالة', 'اعتدال', 'افراح', 'افنان', 'افيا', 'اكرام', 'الاء', 'العنود', 'الهام', 'اليان', 'اليزابيث', 'امال', 'اماندا', 'اماني', 'امل', 'امنه', 'اميرة', 'اميليا', 'امينة', 'اناهيد', 'انتظار', 'انجليكا', 'انعام', 'انوار', 'اويس', 'ايات', 'ايام', 'اية', 'ايفا', 'ايفان', 'ايفون', 'ايمان', 'ايناس', 'ايه',
60
+ 'باسمة', 'باميلا', 'بان', 'بانا', 'بتول', 'بثينه', 'بدور', 'براء', 'براءة', 'برديس', 'بروين', 'بسمة', 'بشائر', 'بشرى', 'بلسم', 'بلقيس', 'بنان', 'بهجه', 'بيا', 'بيان', 'بيداء', 'بيسان',
61
+ 'تالا', 'تالة', 'تالين', 'تامر', 'تانيا ماريا', 'تحرير', 'تسنيم', 'تغريد', 'تقوى', 'تقى', 'تمارا', 'تماضر', 'تمام', 'تهاني', 'تولين',
62
+ 'ثريا',
63
+ 'جاسمن', 'جالا', 'جلنار', 'جمانا', 'جمانة', 'جميلة', 'جنى', 'جهاد', 'جوانا', 'جود', 'جورجيت', 'جوسيت', 'جولييت', 'جيانا', 'جيسيكا',
64
+ 'حبيبة', 'حسناء', 'حصه', 'حلا', 'حليمة', 'حنان', 'حنين', 'حياة',
65
+ 'ختام', 'خديجه', 'خلود', 'خولة',
66
+ 'دارين', 'داليا', 'دالية', 'دانا', 'دانا كريستيل جميلة', 'دانة', 'دانية', 'دانييل', 'دبنا', 'دعاء', 'دعد', 'دلال', 'دنى', 'دنيا', 'دولا', 'ديالا', 'ديان', 'ديانا', 'ديما', 'دينا',
67
+ 'رؤى', 'رؤيه', 'رابعة', 'راغدة', 'راما', 'رانا', 'راندي', 'رانيا', 'راوية', 'راية', 'ربا', 'رباب', 'ربى', 'رجاء', 'رحمة', 'رحمه', 'ردينة', 'رزان', 'رشا', 'رغد', 'رغدة', 'رفاعية', 'رفاه', 'رقية', 'رقيه', 'رلى', 'رمال', 'رنا', 'رناد', 'رند', 'رنده', 'رنيم', 'رنين', 'رهام', 'رهف', 'رواء', 'روان', 'روبينا', 'روتانا', 'روحية', 'رودا', 'روزان', 'روزانا', 'روزين', 'رولى', 'روند', 'رويدة', 'ريان', 'ريتا', 'ريم', 'ريما', 'ريمان', 'ريناتا', 'ريناد', 'ريهام',
68
+ 'زكية', 'زمان', 'زها', 'زهرة', 'زين', 'زينا', 'زينات', 'زينب', 'زينة', 'ساجدة', 'ساجده', 'سارة', 'سارين', 'سالي', 'ساندرا', 'ساندي', 'سباتا', 'سجى', 'سحر', 'سدين', 'سرى', 'سرين', 'سعاد', 'سكينة', 'سلام', 'سلسبيل', 'سلمى', 'سلوى', 'سما', 'سماح', 'سماره', 'سمر', 'سمية', 'سميره', 'سميه', 'سناء', 'سنابل', 'سندس', 'سنريت', 'سنن', 'سها', 'سهاد', 'سهام', 'سهر', 'سهى', 'سهير', 'سهيله', 'سوار', 'سوزان', 'سوزانا', 'سوسن', 'سيرين', 'سيرينا', 'سيلفا', 'سيلين', 'سيما',
69
+ 'شدى', 'شذا', 'شذى', 'شروق', 'شريفة', 'شرين', 'شريهان', 'شفاء', 'شهد', 'شهناز', 'شيرين', 'شيماء',
70
+ 'صابرين', 'صالح', 'صبا', 'صباح', 'صباحت', 'صبرين', 'صحر', 'صفا', 'صفاء', 'صفية', 'صمود',
71
+ 'ضحى', 'ضياء',
72
+ 'عائشة', 'عاليا', 'عالية', 'عايشة', 'عبلة', 'عبير', 'عدله', 'عرين', 'عزة', 'عزيزة', 'عفاف', 'علا', 'علياء', 'عنود', 'عهد',
73
+ 'غادة', 'غدير', 'غرام', 'غزل', 'غصون', 'غفران', 'غنى', 'غيد', 'غيداء', 'غيده', 'غيفار',
74
+ 'فاتن', 'فادية', 'فاديه', 'فاطمة', 'فايزة', 'فتحية', 'فتحيه', 'فتنه', 'فداء', 'فدوى', 'فدى', 'فرح', 'فريال', 'فريدة', 'فوزية', 'فيروز', 'فيفيان',
75
+ 'قمر',
76
+ 'كاترين', 'كاتيا', 'كارلا', 'كرستينا', 'كريستين', 'كريستينا', 'كلوديت', 'كلودين', 'كوثر', 'كيان',
77
+ 'لارا', 'لاري', 'لانا', 'لبنا', 'لجين', 'لطيفة', 'لمى', 'لميس', 'لنا', 'لورا', 'لورينا', 'لوسانا', 'لوسينا', 'لونا', 'ليان', 'ليدا', 'ليلى', 'ليليان', 'لين', 'لينا', 'لينة', 'ليندا', 'لينه',
78
+ 'مادلين', 'ماري', 'ماريا', 'ماريان', 'مارينا', 'مايا', 'مجد', 'مجدولين', 'محبوبة', 'مديحة', 'مرام', 'مرح', 'مروة', 'مريام', 'مريانا', 'مريم', 'مسعدة', 'مشيرة', 'معالي', 'ملاك', 'ملك', 'منار', 'منال', 'منى', 'مها', 'مهتاب', 'مي', 'ميادة', 'مياده', 'ميار', 'ميان', 'ميرا', 'ميرال', 'ميران', 'ميرفت', 'ميرنا', 'ميريت', 'ميس', 'ميسا', 'ميساء', 'ميسر', 'ميسره', 'ميسم', 'ميسون', 'ميلاء', 'ميناس',
79
+ 'نائله', 'ناتاشا', 'ناتالي', 'ناديا', 'نادية', 'نادين', 'ناديه', 'ناردين', 'ناريمان', 'نانسي', 'نبال', 'نبراس', 'نبيله', 'نجاة', 'نجاح', 'نجلاء', 'نجوان', 'نجود', 'نجوى', 'نداء', 'ندى', 'ندين', 'نرمين', 'نزميه', 'نسرين', 'نسيمة', 'نعمت', 'نعمه', 'نهاد', 'نهى', 'نهيدة', 'نوال', 'نور', 'نور الهدى', 'نورا', 'نوران', 'نيروز', 'نيفين',
80
+ 'هادلين', 'هازار', 'هالة', 'هانيا', 'هايدي', 'هبة', 'هدايه', 'هدى', 'هديل', 'هزار', 'هلا', 'هلين', 'هنا', 'هناء', 'هنادا', 'هنادي', 'هند', 'هيا', 'هيفا', 'هيفاء', 'هيلين',
81
+ 'وئام', 'وجدان', 'وداد', 'ورود', 'وسام', 'وسن', 'وسيم', 'وعد', 'وفاء', 'ولاء',
82
+ 'ىمنة', 'يارا', 'ياسمين', 'يافا', 'يسرى', 'ينان', 'ﻟﻮﺗﺸﻴﺎ',
83
+ );
84
+
85
+ protected static $lastName = array(
86
+ 'آلهامي', 'أبو الرب', 'ابو رحمة', 'ابو سعده', 'ابو يوسف', 'ابوالحاج', 'الامام', 'البتراء', 'البلبيسي', 'الترابين', 'التلهوني', 'الجبارات', 'الجرَّاح', 'الجوابره', 'الجوالدة', 'الحجايا', 'الحوراني', 'الدعجة', 'الردايدة', 'الرشدان', 'الرفاعي', 'الروابدة', 'الروسان', 'الريماوي', 'الزعبية', 'الزوربا', 'السحاقات', 'السحيمات', 'السراج', 'السعد', 'السلطية', 'السيوف', 'الشامي', 'الشريدة', 'الشريف', 'الشطناوي', 'الشمالي', 'الصرايرة', 'الصمادي', 'الصنات', 'الضمور', 'الطباع', 'الطراونة', 'الطويسات', 'الطويل', 'العدوان', 'العضيبات', 'العلامي', 'العمري', 'العمرية', 'العناسوة', 'العنانبه', 'الغريب', 'الفاخوري', 'الفاعوري', 'الفناطسة', 'القطيشات', 'الكردي', 'الكركي', 'المبيضين', 'المجالي', 'المحاميد', 'المساعيد', 'المشاهره', 'المصري', 'المعشر', 'المواجدة', 'المومنى', 'المومنية', 'النسور', 'النشاشيبي', 'النعيمات', 'الهلسة', 'الوشاح',
87
+ 'بني حسن', 'بني صقر',
88
+ 'سحاب',
89
+ 'شمر',
90
+ 'ضميدات',
91
+ 'طلفاح',
92
+ 'عابدين', 'عباد', 'عجلون', 'عقلة', 'عناسوة',
93
+ 'مطير', 'معاني',
94
+ 'وادي',
95
+ );
96
+
97
+ protected static $titleMale = array('السيد', 'الأستاذ', 'الدكتور', 'المهندس');
98
+ protected static $titleFemale = array('السيدة', 'الآنسة', 'الدكتورة', 'المهندسة');
99
+ private static $prefix = array('أ.', 'د.', 'أ.د', 'م.');
100
+
101
+ /**
102
+ * @example 'أ.'
103
+ */
104
+ public static function prefix()
105
+ {
106
+ return static::randomElement(static::$prefix);
107
+ }
108
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_JO/Text.php ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_JO;
4
+
5
+ class Text extends \Faker\Provider\Text
6
+ {
7
+ protected static function validStart($word)
8
+ {
9
+ return preg_match('/^\p{Arabic}/u', $word);
10
+ }
11
+
12
+ /**
13
+ * License: Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
14
+ *
15
+ * Title: حي بن يقظان
16
+ * Author: ابن الطفيل
17
+ * Language: Arabic
18
+ *
19
+ * @see https://ar.wikisource.org/wiki/%D8%A7%D8%A8%D9%86_%D8%A7%D9%84%D8%B7%D9%81%D9%8A%D9%84_-_%D8%AD%D9%8A_%D8%A8%D9%86_%D9%8A%D9%82%D8%B8%D8%A7%D9%86
20
+ * @var string
21
+ */
22
+ protected static $baseText = <<<'EOT'
23
+ ذكر سلفنا الصالح - رضي الله عنهم - أن جزيرة من جزائر الهند التي تحت خط الاستواء، وهي الجزيرة التي يتولد بها الإنسان من غير أم ولا أب، وبها شجر يثمر نساء، وهي التي ذكر المسعودي أنها جزيرة الوقواق لان تلك الجزيرة اعدل بقاع الأرض هواء؛ أتممها لشروق النور الأعلى عليها استعدادً، وان كان ذلك خلاف ما يراه جمهور الفلاسفة وكبار الأطباء، فانهم يرون إن اعدل ما في المعمورة الإقليم الرابع، فان كانوا قالوا ذلك لأنه صح عندهم انه ليس على خط الاستواء عمارة لمانع من الموانع الأرضية، فلقولهم: أن الإقليم الرابع اعدل بقاع الأرض وجه، وان كانوا إنما أرادوا بذلك إن ما على خط الاستواء شديد الحرارة، كالذي يصرح به أكثرهم فهو خطأ يقوم البرهان على خلافه.
24
+
25
+ وذلك أنه قد تبرهن في العلوم الطبيعية أنه لا سبب لتكون الحرارة إلا الحركة أو ملاقاة الأجسام الحارة والإضاءة؛ وتبين فيها أيضاً إن الشمس بذاتها غير حارة ولا متكيفة بشيء من هذه الكيفيات المزاجية؛ وقد تبين فيها أيضاً إن الأجسام التي تقبل الإضاءة أتم القبول، هي الأجسام الصقيلة غير الشفافة، ويليها في قبول ذلك الأجسام الكثيفة غير الصقيلة، فأما الأجسام الشفافة التي لاشيء فيها من الكثافة فلا تقبل الضوء بوجه.
26
+
27
+ وهذا وحده مما برهنه الشيخ أبو علي خاصة، ولم يذكره من تقدمه، فإذا صحت هذه المقدمات، فاللازم عنها أن الشمس لا تسخن الأرض كما تسخن الأجسام الحارة أجسام أخر تماسها، لان الشمس في ذاتها غير حارة ولا الأرض أيضاً تسخن بالحركة لأنها ساكنة وعلى حالة واحدة في شروق الشمس عليها وفي وقت مغيبها عنها وأحوالها في التسخين والتبريد، ظاهرة الاختلاف للحس في هذين الوقتين.
28
+
29
+ ولا الشمس أيضاً تسخن الهواء أولاً ثم تسخن بعد ذلك الأرض بتوسط سخونة الهواء، وكيف يكون ذلك ونحن نجد أن ما قرب من الهواء من الأرض في وقت الحر، أسخن كثيراً من الهواء الذي يبعد منه علواً؟ فبقي أن تسخين الشمس للأرض إنما هو على سبيل الإضاءة لا غير، فان الحرارة تتبع الضوء أبداً: حتى إن الضوء إذا افرط في المرأة المقعرة، أشعل ما حاذاها.
30
+
31
+ وقد ثبت في علوم التعاليم بالبراهين القطعية، أن الشمس كروية الشكل، وأن الأرض كذلك، وأن الشمس أعظم من الأرض كثيراً، وأن الذي يستضيء من الشمس أبداً هو أعظم من نصفها، وأن هذا النصف المضيء من الأرض في كل وقت أشد ما يكون الضوء في وسطه، لأنه أبعد المواضع من المظلمة، ولأنه يقابل من الشمس أجزاءاً أكثر، وما قرب من المحيط كان أقل ضوءاً حتى ينتهي إلى الظلمة عند محيط الدائرة الذي ما أضاء موقعه من الأرض قط، وإنما يكون الموضع وسط دائرة الضياء إذا كانت الشمس على سمت رؤوس الساكنين فيه، وحينئذ تكون الحرارة في ذلك الموضع أشد ما يكون فان كان الموضع مما تبعد الشمس عن مسامتة رؤوس أهله، كان شديد البرودة جداً، وان كان مما تدوم فيه المسامتة كان شديد الحرارة، وقد ثبت في علم الهيئة أن بقاع الأرض التي على خط الاستواء لا تسامت الشمس رؤوس أهلها سوى مرتين في العام: عند حلولها برأس الحمل؛ وعند حلولها برأس الميزان.
32
+
33
+ وهي في سائر العام ستة أشهر جنوباً منهم، وستة أشهر شمالاً منهم: فليس عندهم حر مفرط، ولا برد مفرط. وأحوالهم بسبب ذلك متشابهة.
34
+
35
+ وهذا القول يحتاج إلى بيان أكثر من هذا، لا يليق بما نحن بسبيله؛ وإنما نبهناك عليه، لأنه من الأمور التي تشهد بصحة ما ذكر من تجويز تولد الإنسان بتلك البقعة من غير أم ولا أب.
36
+
37
+ فمنهم من بت الحكم وجزم القضية بأن حي بن يقظان من جملة من تكون في تلك البقعة من غير أم ولا أب، ومنهم من أنكر ذلك وروى من أمره خبراً نقصه عليك، فقال: انه كان بازاء تلك الجزيرة، جزيرة عظيمة متسعة الأكتاف، كثيرة الفوائد، عامرة بالناس، يملكها رجل منهم شديد الأنفة والغيرة، وكانت له أخت ذات جمال وحسن باهر فعضلها ومنعها الأزواج إذا لم يجد لها كفواً. وكان له قريب يسمى يقظان فتزوجها سراً على وجه جائز في مذهبهم المشهور في زمنهم.
38
+
39
+ ثم إنها حملت منه ووضعت طفلاً. فلما خافت أن يفتضح أمرها وينكشف سرها، وضعته في تابوت أحكمت زمه بعد أن أروته من الرضاع؛ وخرجت به في أول الليل في جملة من خدمها وثقاتها إلى ساحل البحر، وقلبها يحترق صبابةً به، وخوفاً عليه، ثم إنها ودعته وقالت: "اللهم انك خلقت هذا الطفل ولم يكن شيئاً مذكوراً، ورزقته في ظلمات الأحشاء، وتكفلت به حتى تم واستوى. وأنا قد سلمته إلى لطفك، ورجوت له فضلك، خوفاً من هذا الملك الغشوم الجبار العنيد.
40
+
41
+ فكن له، ولا تسلمه، يا أرحم الراحمين" ثم قذفت به في اليم. فصادف ذلك جري الماء بقوة المد، فاحتمله من ليلته إلى ساحل الجزيرة الأخرى المتقدم ذكرها. وكان المد يصل في ذلك الوقت إلى موضع لا يصل إليه بعد علم. فأدخله الماء بقوته إلى أجمة ملتفة الشجر عذبة التربة، مستورة عن الرياح والمطر، محجوبة عن الشمس تزاور عنها إذا طلعت، وتميل إذا غربت. ثم أخذ الماء في الجزر.
42
+
43
+ وبقي التابوت في ذلك الموضع، وعلت الرمال بهبوب الرياح، وتراكمت بعد ذلك حتى سدت مدخل الماء إلى تلك الأجمة. فكان المد لا ينتهي إليها، وكانت مسامير التابوت قد فلقت، وألواحه قد اضطربت عند رمي الماء في تلك الأجمة. فلما أشتد الجوع بذلك الطفل، بكى واستغاث وعالج الحركة، فوقع صوته في أذن ظبية فقدت طلاها، خرج من كناسه فحمله العقاب، فلما سمعت الصوت ظنته ولدها.
44
+
45
+ فتتبعت الصوت وهي تتخيل طلاها حتى وصلت إلى التابوت، ففحصت عنه بأظلافها وهو ينوء ويئن من داخله، حتى طار عن التابوت لوح من أعلاه. فحنت الظبية وحنت عليه ورئفت به، وألقمه حلمتها وأروته لبناً سائغاً. ومازالت تتعهده وتربيه وتدفع عنه الأذى. هذا ما كان من ابتداء أمره عند من ينكره التولد. ونحن نصف هنا كيف تربى وكيف أنتقل في أحواله حتى يبلغ المبلغ العظيم. وأما الذين زعموا أنه تولد من الأرض فانهم قالوا إن بطناً من أرض تلك الجزيرة تخمرت فيه طينه على مر السنين والأعوام، حتى امتزج فيها الحار بالبارد، والرطب باليابس، امتزاج تكافؤ وتعادل في القوى. وكانت هذه الطينة المتخمرة كبيرة جداً وكان بعضها يفضل بعضاً في اعتدال المزاج والتهيؤ لتكون الأمشاج.
46
+
47
+ وكان الوسط منها أعدل ما فيها وأتمه مشابهة بمزاج الإنسان: فتمخضت تلك الطينة، وحدث فيها شبه نفاخات الغليان لشدة لزوجتها: وحدث في الوسط منها لزوجة ونفاخة صغيرة جداً، منقسمة بقسمين، بينها حجاب رقيق، ممتلئة بجسم لطيف هوائي في غاية من الاعتدال اللائق به، فتعلق به عند ذلك الروح الذي هو من أمر الله تعالى وتشبث به تشبثاً يعسر انفصاله عنه عند الحس وعند العقل؛ إذ قد تبين أن هذا الروح دائم الفيضان من عند الله عز وجل، وأنه بمنزلة نور الشمس الذي هو دائم الفيضان على العالم.
48
+
49
+ فمن الأجسام ما لا يستضيء به، وهو الهواء الشفاف جداً؛ ومنها ما يستضيء به بعض الاستضاءة، وهي الأجسام الكثيفة غير الصقيلة وهذه تختلف في قبول الضياء، وتختلف بحسب ذلك ألوانها، ومنها ما يستضيء به غاية الاستضاءة وهي الأجسام الصقيلة كالمرأة ونحوها.
50
+
51
+ فإذا كانت هذه المرأة مقعرة على شكل مخصوص، حدث فيها النار لإفراط الضياء. الذي هو الروح، الذي هو من أمر الله تعالى، فياض أبداً على جميع الموجودات؛ فمنها ما لا يظهر أثره فيه اعدم الأستعداد، وهي الجمادات التي لا حياة لها، وهذه بمنزلة الهواء في المثال المتقدم، ومنها ما يظهر أثره فيه، وهي أنواع النبات بحسب استعداداتها وهذه بمنزلة الأجسام الكثيفة في المثال المتقدم؛ ومنها ما يظهر أثره فيه ظهوراً كثيراً، وهي الأجسام الصقيلة في المثال المتقدم.
52
+
53
+ ومن هذه الأجسام الصقيلة ما يزيد على شدة قبوله لضياء الشمس أنه يحكي صورة الشمس، ومثالها. وكذلك أيضاً من الحيوان ما يزيد على شدة قبوله للروح أنه يحكي الروح ويتصور بصورته وهو الإنسان خاصة.
54
+
55
+ واليه الإشارة بقوله صلى الله عليه وسلم: "إن الله خلق أدم على صورته". فان قويت في هذه الصورة حتى تتلاشى جميع الصور في حقها، وتبقى هي وحدها، وتحرق سبحات نورها كل ما أدركته، كانت حينئذ بمنزلة المرأة المنعكسة على نفسها المحرقة لسوها وهذا لا يكون إلا للأنبياء صلوات الله عليهم أجمعين. وهذا كله مبين في مواضعه اللائقة به، فليرجع إلى تمام ما حكوه من وصف ذلك التخلق.
56
+
57
+ قالوا: فلما تعلق هذا الروح بتلك القرارة، خضعت له جميع القوى وسجدت له وسخرت بأمر الله تعالى في كمالها، فتكون بازاء تلك القرارة نفاخة أخرى منقسمة إلى ثلاث قرارت بينهما حجب لطيفة، ومسالك نافذة، وامتلأت بمثل ذلك الهوائي الذي امتلأت منه القرارة الأولى؛ إلا أنه ألطف منه. وفي هذه البطون الثلاثة المنقسمة من واحد، طائفة من تلك القوى التي خضعت له وتوكلت بحراستها والقيام عليها، وإنهاء ما يطرأ فيها من دقيق الأشياء وجليلها إلى الروح الأول المتعلق بالقرارة الأولى.
58
+
59
+ وتكون بازاء هذه القرارة من الجهة المقابلة للقراءة الثانية، نفاخة ثالثة مملوءة جسماً هوائياً، إلا أنه أغلظ من الأولين وسكن في هذه القرارة فريق من تلك القوى الخاضعة، وتوكلت بحفظها و القيام عليها؛ فكانت هذه القرارة الأولى والثانية والثالثة، أول ما تخلق من تلك الطينة المتحمرة على الترتيب الذي ذكرناه. واحتاج بعضها إلى بعض: فالأولى منها حاجتها إلى الآخرين، حاجة استخدام وتسخير.
60
+
61
+ والأخريان حاجتهما إلى الأولى حاجة المرؤوس إلى الرئيس، والمدبر إلى المدبر؛ وكلاهما لما يتخلق بعدهما من الأعضاء رئيس لا مرؤوس. وأحدهما، وهو الثاني، أتمم رئاسة من الثالث فالأول منهما لما تعلق به الروح، واشتعلت حرارته تشكل بشكل النار لصنوبري وتشكل أيضاً الجسم الغليظ المحدق به على شكله، وتكون لحماً صلباً، وصار عليه غلاف صفيق يحفظه وسمي العضو كله قلباً واحتاج لما يتبع الحرارة من التحليل وافناء الرطوبات إلى شيء يمده ويغذوه، ويخلف ما تحلل منه على الدوام، وإلا لم يطل بقاؤه، واحتاج أيضاً إلى تحسس بما يلائمه فيجذبه، وبما يخالفه فيدفعه. فتكفل له العضو الواحد بما فيه من القوى التي أصلها منه بحاجته الواحدة، وتكفل له العضو الآخر بحاجته الأخرى.
62
+
63
+ وكان المتكفل بالحس هو الدماغو المتكفل بالغذاء هو الكبد؛ واحتاج كل واحد من هذين إليه في أن يمدها بحرارته، وبالقوى المخصوصة بهما التي أصلها منه ، فانتسجت بينهما لذلك كله مسالك وطرق: بعضها أوسع من بعض بحسب ما تدعواليه الضرورة، فكانت الشرايين و العروق. وصفه الطبيعيون في خلقة الجنين في الرحم، لم يغادروا من ذلك شيئاً، إلى أن كمل خلقه، وتمت أعضاؤه، وحصل في حد خروج الجنين من البطن، واستعانوا في وصف كمال ذلك بتلك الطينة الكبيرة المتخمرة، وأنها كانت قد تهيأت لان يتخلق منها كل ما يحتاج إليه في خلق الإنسان من الأغشية المجللة لجملة بدنه وغيرها فلما كمل انشقت عنه تلك الأغشية، بشبه المخاض، وتصدع باقي الطينة إذ كان قد لحقه الجفاف.
64
+
65
+ ثم استغاث ذلك الطفل عند فناء مادة غذائه واشتداد جوعه، فلبته ظبية فقدت طلاها. ثم استوى عبد ما وصفه هؤلاء بعد هذا الموضع، وما وصفه الطائفة الأولى في معنى التربية؛ فقالوا جميعاً: إن الظبية التي تكفلت به وافقت خصباً ومرعى أثيثاً، فكثر لحمها وكثر لبنها، حتى قام بغذاء ذلك الطفل أحسن قيام. وكانت معه لا تبعد عنه إلا لضرورة الرعي. وألف الطفل تلك الظبية حتى كان بحيث إذا هي أبطأت عنه اشتد بكاؤه فطارت إليه.
66
+
67
+ ولم يكن بتلك الجزيرة شيء من السباع العادية، فتربى الطفل ونما واغتذى بلبن تلك الظبية إلى أن تم له حولان، وتدرج في المشي وأثغر فكان يتبع تلك الظبية، وكانت هي ترفق به و ترحمه وتحمله إلى مواضع فيها شجر مثمر فكانت تطعمه ما تساقط من ثمراتها الحلوة النضيجة؛ وما كان منها صلب القشر كسرته له بطواحنها؛ ومتى عاد إلى اللبن أروته، ومتى ظمئ إلى الماء أرودته، متى ضحا ظللته؛ ومتى خصر أدفأته.
68
+
69
+ وإذا جن الليل صرفته إلى مكان الأول وجللته بنفسها وبريش كان هناك؛ مما ملئ به التابوت أولاً في وقت وضع الطفل فيه. وكان في غدوهما ورواحهما قد ألفهما ربرب يسرح ويبيت معهما حيث مبيتهما. فما زال الطفل مع الظباء على تلك الحال: يحكي نغمتها بصوته حتى لا يكاد يفرق بينهما؛ وكذلك كان يحكي جميع ما يسمعه من أصوات الطير وأنواع سائر الحيوان محاكاة شديدة لقوة انفعاله لما يريده ما كانت محاكاته لأصوات الظباء في الاستصراخ والاستئلاف والاستدعاء والاستدفاع. إذ للحيوانات في هذه الأحوال المختلفة أصوات مختلفة فألفته الوحوش وألفها؛ ولم تنكره ولا أنكرها.
70
+
71
+ فلما ثبت في نفسه أمثلة الأشياء بعد مغيبها عن مشاهدته، حدث له نزوغ إلى بعضها؛ وكراهية لبعض. وكان في ذلك كله ينظر إلى جميع الحيوانات فيراها كاسية بالاوبار و الأشعار و أنواع الريش، وكان يرى ما لها من العدو وقوة البطش، وما لها من الأسلحة المعدة لمدافعة من ينازعها، مثل القرون و الأنياب و الحوافر و الصياصي و المخالب. ثم يرجع إلى نفسه، فيرى ما به من العري وعدم السلاح، وضعف العدو، وقلة البطش، عندما كانت تنازعه الوحوش أكل الثمرات، وتستبد بها دونه، وتغلبه عليها، فلا يستطيع المدافعة عن نفسه، ولا الفرار عن شيء منها. وكان يرى أترابه من أولاد الظباء، قد تبتت لها قرون، بعد أن لم تكن، وصارت قوية بعد ضعفها في العدو.
72
+
73
+ ولم ير لنفسه شيئاً من ذلك فكان يفكر في ذلك ولا يدري ما سببه. وكان ينظر إلى ذوي العاهات والخلق الناقص فلا يجد لنفسه شبيهاً فيهم. وكان أيضاً ينظر إلى مخارج الفضول من سائر الحيوانات، فيراها مستورة: أما مخرج أغلظ الفضلتين فبالاذناب، وأما مخرج وأما مخرج أرقهما فبالاوبار وما أشبههما. ولأنها كانت أيضاً اخفى قضباناً منه. فكان ذلك ما يكربه ويسؤه.
74
+
75
+ فلما طال همه في ذلك كله، وهو قد قارب سبعة اعوام، ويئس من أن يكمل له ما قد أضر به نقصه، اتخذ من أوراق الشجر العريضة شيئاً جعل بعضه خلفه و بعضه قدمه، وعمل من الخوض والحلفاء شبه حزام على وسطه، علق به تلك الأوراق فلم يلبث إلا يسيراً حتى ذوى ذلك الورق وجف وتساقط. فما زال يتخذ غيره ويخصف بعضه ببعض طاقات مضاعفة، وربما كان ذلك أطول لبقائه إلا انه على كل حال قصير المدة.
76
+
77
+ واتخذ من أغصان الشجر عصياً وسوى أطرافها وعدل متنها. وكان بها على الوحوش المنازعة له، فيحمل على الضعيف منها، ويقاوم القوي منها، فنبل بذلك قدره عند نفسه بعض نباله، ورأى أن ليده فضلاً كثيراً على أيديها: إذ أمكن له بها ستر عورته واتخاذ العصي التي يدافع بها عن حوزته، ما استغنى به عما أراده من الذنب والعذاب الطبيعي. وفي خلال ذلك ترعرع واربى على السبع سنين، وطال به العناء في تجديد الأوراق التي كان يستتر بها.
78
+
79
+ فكانت نفسه عند ذلك تنازعه إلى اتخاذ ذنب من ذنوب الوحوش الميتة ليعلقه على نفسه، إلا أنه كان يرى أحياء الوحوش تتحامى ميتها وتفر عنه فلا يتأتى له الأقدام على ذلك الفعل، إلى أن صادف في الأيام نسراً ميتاً فهدي إلى نيل أمله منه، واغتنم الفرصة في، إذ لم ير للوحوش عنه نفرةً فأقدم عليه، وقطع جناحيه وذنبه صحاحاً كما هي، وفتح ريشها وسواها، وسلخ عنه سائر جلده، وفصله على قطعتين: ربط إحداهما على ظهره، وأخرى على سرته وما تحتها، وعلق الذنب من خلفه، وعلق الجناحين على عضديه، فأكسبه ذلك ستراً ودفئاً ومهابة في نفوس جميع الوحوش، حتى كانت لا تنازعه ولا تعارضه. فصار لايدنو إليه شيء منها سوى الظبية التي كانت أرضعته وربته: فانها لم تفارقه ولا فارقها، إلى أن اسنت وضعغت، فكان يرتاد بها المراعي الخصبة ويجتني لها الثمرات الحلوة، ويطعمها.
80
+
81
+ ومازل الهزل والضعف يستولي عليها ويتوالى، إلى أن أدركها الموت، فسكنت حركاتها بالجملة، وتعطلت جميع أفعالها. فلما رأها الصبي على تلك الحالة، جزع جزعاً شديداً، وكادت نفسه تفيض أسفاً عليها. فكان يناديها بالصوت الذي كانت عادتها أن تجيبه عند سماعه، ويصيح بأشد ما يقدر عليه، فلا لها عند ذلك حركة ولا تغييراً. فكان ينظر إلى أذنيها والى عينيها فلا يرى بها آفة ظاهرة، وكذلك كان ينظر إلى جميع أعضائها فلا يرى بشيء منها آفة.
82
+
83
+ فكان يطمع إن يعثر على موضع الآفة فيزيلها عنها، فترجع إلى ما كانت عليه فلم ياتت له شيء من ذلك ولا استطاعة. وكان الذي أرشده لهذا الرأي ما كان قد اعتبره في نفسه قبل ذلك: لانه كان يرى انه إذا غمض عينيه أو حجبهما بشيء لا يبصر حتى نزول ذلك العائق، وكذلك كان يرى انه اذا ادخل إصبعه في أذنيه وسدها لا يسمع شيئاً حتى يزول ذلك العارض، وإذا امسك أنفه بيده لا يشم شيئاً من الروائح حتى يفتح أنفه. فاعتقد من اجل ذلك إن جميع ماله من الادراكات و الأفعال قد تكون لها عوائق تعوقها، فإذا أزيلت العوائق عادت الأفعال.
84
+
85
+ فلما نظر إلى جميع أعضاء الظاهرة ولم ير فيها آفة ظاهرة - وكان يرى مع ذلك العطلة قد اشتملها ولم يختص بها عضو دون عضو - وقع في خاطرة أن الآفة التي نزلت بها، إنما هي العضو غائب عن العيان مستكن في باطن الجسد، وان ذلك العضو لا يغني عنه في فعله شيء من هذه الأعضاء الظاهرة. فلما نزلت به الآفة عمت المضرة، وشملت العطلة، وطمع لو أنه عثر على ذلك العضو وأزال عنه ما يزال به لاستقامت أحواله وفاض على سائر البدن نفعه، وعادت الأفعال إلى ما كانت عليه.
86
+
87
+ وكان قد شاهد قبل ذلك في الأشباح الميتة من الوحوش وسواها أن جميع أعضائها مصمتة لا تجويف فيها إلا القحف، والصدر، والبطن. فوقع في نفسه أن العضو الذي بتلك الصفة لن يعدو أحد هذه المواضع الثلاثة، وكان يغلب على ظنه غلبة قوية أنه إنما هو في الموضع المتوسط من هذه المواضع الثلاثة، إذ استقر في نفسه أن جميع الأعضاء محتاجة إليه، وأن الواجب بحسب ذلك أن يكون مسكنه في الوسط.
88
+
89
+ وكان أيضاً إذا رجع إلى ذاته، شعر بمثل هذا العضو في صدره لانه كان يعترض سائراً اعضائه كاليد، والرجل، والأذن، والانف، والعين، ويقدر مفارقتها، فيتاى له أنه كان يستغني عنها، وكان يقدر في رأسه مثل ذلك ويظن أنه يستغني عنه، فإذا فكر في الشيء الذي يجده في صدره، لم يتأت له الاستغناء عنه طرفة عين.
90
+
91
+ وكذلك كان عند محاربته للوحوش أكثر ما كان يتقي من صياصيهم على صدره، لشعوره بالشيء الذي فيه. فلما جزم الحكم بان العضو الذي نزلت به الآفة إنما هو في صدورها، اجمع على البحث عليه والتنقير عنه، لعله يظفر به، ويرى آفته فيزيلها ثم انه خاف أنه يكون نفس فعله هذا أعظم من الآفة التي نزلت بها أولاً فيكون سعيه عليها. ثم أنه تفكر: هل رأى من الوحوش وسواها، من ضار في مثل تلك الحال، ثم عاد إلى مثل حاله الأول؟ فلم يجد شيئاً! فحصل له من ذلك، اليأس من رجوعها إلى حالها الأولى إن هو تركها، وبقي له بعض الرجاء في رجوعها إلى تلك الحال إن هو وجد ذلك العضو وأزال الآفة عنه. فعزم على شق صدرها وتفتيش ما فيه، فاتخذ من كسور الأحجار الصلدة وشقوق القصب اليابسة، أشباه السكاكين، وشق بها بين أضلاعها حتى قطع اللحم الذي بين الأضلاع، وأفضى إلى الحجاب المستبطن للأضلاع فراه قوياً، فقوي ظنه مثل ذلك الحجاب لا يكون إلا لمثل ذلك العضو وطمع بأنه إذا تجاوزه ألفى مطلوبه فحاول شقه، فصعب عليه، لعدم الآلات، ولأنها لم تكن إلا من الحجارة والقصب، فاستجدها ثانية واستحدها وتلطف في خرق الحجاب حتى انخرق له، فأفضى إلى الرئة فظن أنها مطلوبه، فما زال يقلبها ويطلب موضع الآفة بها.
92
+
93
+ وكان أولاً نصفها الذي هو في الجانب الواحد. فلما راها مائلة إلى جهة واحدة، وكان قد اعتقد أن ذلك العضو لا يكون إلا في الوسط في عرض البدن، كما في الوسط في طوله. فمازال يفتش في وسط الصدر حتى ألفى القلب وهو مجلل بغشاء في غاية القوة مربوط بعلائق في غاية الوثاقة، والرثة مطيفة به من الجهة التي بدأ بالشق منها، فقال في نفسه: إن كان لهذا العضو من الجهة الأخرى مثل ما له من الجهة فهو في حقيقة الوسط، ولا محالة أنه مطلوبي. لا سيما مع ما أرى له حسن الوضع، وجمال الشكل، وقلة التشتت، وقوة اللحم، وأنه محجوب بمثل هذا الحجاب الذي لم أر مثله لشيء من الأعضاء. فبحث عن الجانب الآخر من الصدر، فوجد فيه الحجاب المستبطن للأضلاع، ووجد الرئة كمثل ما وجد من هذه الجهة.
94
+
95
+ فحكم بان ذلك العضو هو مطلوبه، فحاول هتك حجابه، وشق شغافه، فبكد واستكراه ما، قدر على ذلك، بعد استفراغ مجهوده. وجرد القلب فراه مصمتاً من كل جهة، فنظر هل يرى فيه آفة ظاهرة؟ فلم ير فيه شيئاً! فشد على يده، فتبين له أن فيه تجويفاً، فقال: لعل مطلوبي الأقصى إنما هو في داخل هذا العضو، وأنا حتى الآن لم أصل إليه. فشق عليه، فألقى فيه تجويفين اثنين احدهما من الجهة اليمنى والآخر من الجهة اليسرى، والذي من الجهة اليمنى مملوء بعقد منعقد، والذي من الجهة اليسرى خال لا شيء به.
96
+
97
+ فقال: لن يعدو مطلوبي أن يكون مسكنه أحد هذين البيتين. ثم قال: أما هذا البيت الأيمن، فلا أرى فيه إلا هذا الدم المنعقد. ولا شك أنه لم ينعقد حتى صار الجسد كله إلى هذا الحال - إذ كان قد شاهد الدماء متى سالت وخرجت انعقدت وجمدت ولم يكن هذا إلا دماً كسائر الدماء - وأنا أرى أن هذا الدم موجود في سائر الأعضاء لا يختص به عضو دون أخر، وأنا ليس مطلوبي شيئاً بهذه الصفة إنما مطلوبي الشيء الذي يختص به هذا الموضع الذي أجدني لا أستغني عنه طرفة العين، واليه كان انبعاثي من أول. واما هذا الدم فكم مرة جرحتني الوحوش في المحاربة فسال مني كثير منه فما ضرني ذلك ولا افقدني شيئاً من أفعالي، فهذا بيت ليس فيه مطلوبي. وأما هذا البيت الأيسر فأراه خالياً لاشيء فيه، وما أرى ذلك لباطل، فاني رأيت كل عضو من الأعضاء إنما لفعل يختص به، فكيف يكون هذا البيت على ما شاهدت من شرفه باطلاً؟ ما أرى إلا أن مطلوبي كان فيه! فارتحل عنه وأخلاه. وعند ذلك، طرأ على هذا الجسد من العطلة ما طرأ، ففقد الإدراك وعدم الحراك. فلما رأى أن الساكن في ذلك البيت قد ارتحل قبل انهدامه وتركه وهو بحاله، تحقق أنه أحرى أن لا يعود إليه بعد أن حدث فيه من الخراب والتخريق ما حدث. فصار عنده الجسد كله خسيساً لا قدر له بالإضافة إلى ذلك الشيء الذي اعتقد في نفسه أنه يسكنه مدة ويرحل عنه بعد ذلك.
98
+
99
+ فاقتصر على الفكرة في ذلك الشيء ما هو؟ وكيف هو؟ وما الذي ربطه بهذا الجسد؟ والى اين صار؟ ومن أي الأبواب خرج عند خروجه من الجسد؟ وما السبب الذي أزعجه إن كان خرج كارهاً؟ وما السبب الذي كره إليه الجسد، حتى فارقه إن كان خرج مختاراً؟ وتشتت فكره في ذلك كله، وسلا عن الجسد وطرحه، وعلم أن أمه التي عطفت عليه وأرضعته، إنما كانت ذلك الشيء المرتحل، وعنه كانت تصدر تلك الأفعال كلها، لا هذا الجسد العاطل وأن هذا الجسد بجملته، إنما هو كالآلة وبمنزلة العصي التي اتخذها هو لقتال الوحوش. فانتقلت علاقته عن الجسد إلى صاحب الجسد ومحركه، ولم يبق له شوق إلا إليه. وفي خلال ذلك نتن ذلك الجسد، وقامت منه روائح كريهة، فزادت نفرته عنه، وود أن لا يراه ثم انه سنح لنظره غرابان يقتتلان حتى صرع أحدهما الآخر ميتاً. ثم جعل الحي يبحث في الأرض حتى حفر حفرة فوارى فيها ذلك الميت بالتراب فقال في نفسه: ما أحسن ما صنع هذا الغراب في مواراة جيفة صاحبه وان كان قد أساء في قتله اياه! وأنا كنت أحق بالاهتداء إلى هذا الفعل بآمي! فحفر حفرة وألقى فيها جسد أمه، وحثا عليها التراب.
100
+
101
+ وبقي يتفكر في ذلك الشيء المصرف للجسد لا يدري ما هو! غير أنه كان ينظر إلى أشخاص الظباء كلها، فيراها على شكل أمه، وعلى صورتها فكان يغلب على ظنه، أن كل واحد منها إنما يحركه ويصرفه شيء هو مثل الشيء الذي كان يحرك أمه ويصرفها، فكان يألف الظباء ويحن إليها لمكان ذلك الشبه. وبقي على ذلك برهة من الزمن، يتصفح أنواع الحيوان والنبات ويطوف بساحل تلك الجزيرة، ويتطلب هل يرى أو يجد لنفسه شبيهاً حسبما يرى لكل واحد من أشخاص الحيوان والنبات أشباهاً كثيرة، فلا يجد شيئاً من ذلك. وكان يرى البحر قد أحدق بالجزيرة من كل جهة، فيعتقد أنه ليس في الوجود أرض سوى جزيرته تلك.
102
+
103
+ واتفق في بعض الاحيان أن انقدحت نار في أجمة قلخ على سبيل المحاكة. فلما بصر بها رأى منظراً هاله، وخلقاً لم يعهده قبل، فوقف يتعجب منها ملياً، ومازال يدنو منها شيئاً فشيئاً، فرأى ما للنار من الضوء الثاقب والفعل الغالب حتى لا تعلق بشيء إلا أتت عليه وأحالته إلى نفسها، فحمله، العجب بها، وبما ركب الله تعالى في طباعه من الجراءة و القوة، على أن يده إليها، وأراد أن يأخذ منها شيئاً فلما باشرها أحرقت يده فلم يستطع القبض عليها فاهتدى إلى أن يأخذ قبساً لم تستول النار على جميعه، فأخذ بطرفه السليم والنار في طرفه الآخر، فتاتي له ذلك وحمله إلى موضعه الذي كان يأوي إليه - وكان قد خلا في جحر استحسنه للسكنى قبل ذلك. ثم مازال يمد تلك النار بالحشيش والحطب الجزل، ويتعهدهاً ليلاً ونهاراً استحساناً منه وتعجباً منها.
104
+
105
+ وكان يزيد انسه بها ليلاً، لأنها كانت تقوم له مقام الشمس في الضياء و الدفء، فعظم بها ولوعه، واعتقد أنها أفضل الأشياء التي لديه: وكان دائماً يراها تتحرك إلى جهة فوق وتطلب العلو، فغلب على ظنه أنها من جملة الجواهر السماوية التي كان يشاهدها. وكان يختبر قوتها في جميع الأشياء بأن يلقيها فيها، فيراها مستولية عليه أما بسرعة واما ببطء بحسب قوة استعداد الجسم الذي كان يلقيه للاحتراق أو ضعفه. وكان من جملة ما القى فيها على سبيل الاختبار لقوتها، شيء من أصناف الحيوانات البحرية - كان قد ألقاه البحر إلى ساحله - فلما أنضجت ذلك الحيوان وسطع قتاره تحركت شهوته إليه، فأكل منه شيئاً فاستطابه، فاعتاد بذلك أكل اللحم، فصرف الحيلة في صيد البر والبحر، حتى مهر في ذلك. وزادت محبته للنار، إذ تأتي له بها من وجوه الاغتذاء الطيب شيء لم يتأت له قبل ذلك.
106
+
107
+ فلما اشتد شغفه بها لما رأى من أحسن آثارها وقوة اقتدارها، وقع في نفسه أن الشيء الذي ارتحل من قلب أمه الظبية التي أنشأته، كان من جوهر هذا الوجود أو من شيء يجانسه، وأكد ذلك في ظنه، ما كان يراه من حرارة الحيوان طول مدة حياته، وبرودته من بعد موته، وكل هذا دائم لا يختل، وما كان يجده في نفسه من شدة الحرارة عند صدره، بازاء الموضع الذي كان قد شق عليه من الظبية، فوقع في نفسه أنه لو أخذ حيواناً حياً وشق قلبه ونظر إلى ذلك التجويف الذي صادفه خالياً عندما شق عليه في أمه الظبية، لرأه في الحيوان الحي وهو مملوء بذلك الشيء الساكن فيه وتحقق هل هو من جوهر النار؟ وهل فيه شيء من الضوء والحرارة، آم لا؟ فعمد إلى بعد الوحوش واستوثق منه كتافاً وشقه على الصفة التي شق بها الظبية حتى وصل القلب. فقصد أولاً إلى الجهة اليسرى منه وشقها، فرأى ذلك الفراغ مملوءاً بهواء بخاري، يشبه الضباب الابيض، فأدخل إصبعه فيه، فوجده من الحرارة في حد كاد يحرقه، ومات ذلك الحيوان على الفور.
108
+
109
+ فصح عنده أن ذلك البخار الحار هو الذي كان يحرك هذا الحيوان، وأن في كل شخص من أشخاص الحيوانات مثل ذلك، ومتى انفصل عن الحيوان مات. ثم تحركت في نفسه الشهوة للبحث عن سائر أعضاء الحيوان وترتيبها وأوضاعها وكميتها وكيفية ارتباط بعضها ببعض، وكيف تستمد من هذا البخار الحار حتى تستمر لها الحياة به، وكيف بقاء هذا البخار المدة التي يبقى، ومن أين يستمد، وكيف لا تنفذ حرارته؟ فتتبع ذلك كله بتشريح الحيوانات الأحياء و الاموات، ولم يزل ينعم النظر فيها ويجيد الفكرة، حتى بلغ في ذلك كله مبلغ كبار الطبيعيين، فتبين له أن كل شخص من أشخاص الحيوان، وان كان كثيراً بأعضائه وتفنن حواسه وحركاته فانه واحد بذلك الروح الذي مبدؤه من قرار واحد، وانقسامه وانقسامه في سائر الأعضاء منبعث منه. وأن جميع الأعضاء إنما هي خادمة له، أو مؤدية عنه، وأن منزلة ذلك الروح في تصريف الجسد، كمنزلة من يحارب الأعداء بالسلاح التام، ويصيد جميع صيد البر والبحر، فيمد لكل جنس آلة يصيده بها والتي يحارب بها تنقسم: إلى ما يدفع به نكيلة غيره، والى ما ينكي بها غيره.
110
+
111
+ وكذلك آلات الصيد تنقسم: إلى ما يصلح لحيوان البحر، والى ما يصلح لحيوان البر، وكذلك الأشياء التي يشرح بها تنقسم: إلى ما يصلح للشق، والى ما يصلح للكسر، والى ما يصلح للثقب، والبدن الواحد، وهو يصرف ذلك أنحاء من التصريف بحسب ما تصلح له كل آلة، وبحسب الغايات التي تلتمس بذلك التصرف. كذلك؛ ذلك الروح الحيواني واحد، وإذا عمل بالة العين كان فعله أبصاراً، وإذا عمل بآلة الآذن كان فعله سمعاً، وإذا عمل بآلة الآنف كان فعله شماً، وإذا عمل بآلة اللسان كان فعله ذوقاً، وإذا عمل بالجلد واللحم كان فعله لمساً، وإذا عمل بالعضد كان فعله حركه، وإذا عمل بالكبد كان فعله غذاء واغتذاء.
112
+
113
+ ولكل واحد من هذه، أعضاء تخدمه. ولا يتم لشيء من هذه فعل إلا بما يصل إليها من ذلك الروح، على الطريق التي تسمى عصباً. ومتى انقطعت تلك الطرق أو انسدت، تعطل فعل ذلك العضو. وهذه الأعصاب إنما تستمد الروح من بطون الدماغ يستمد الروح من القلب، والدماغ فيه أرواح كثير، لانه موضع تتوزع فيه أقسام كثيرة: فآي عضو عدم هذا الروح بسبب من الأسباب تعطل فعله وصار بمنزلة الآلة المطرحة، التي يصرفها الفاعل ولا ينتفع بها. فان خرج هذا الروح بجملته عن الجسد، أو فني، أو تحلل بوجه من الوجوه، تعطل الجسد كله، وصار إلى حالة الموت، فانتهى به إلى هذا من منشئه، وذلك أحد وعشرون عاماً.
114
+
115
+ وفي خلال هذه المدة المذكورة تفنن في وجوه حيله، واكتسى بجلود الحيوانات التي كان يشرحها، واحتذى بها، واتخذ الخيوط من الأشعار ولحا قصب الخطمية والخباري والقنب، وكل نبات ذي خيط. وكان أصل اهتدائه إلى ذلك، أنه أخذ من الحلفاء وعمل خطاطيف من الشوك القوي والقصب المحدد على الحجارة.
116
+
117
+ واهتدى إلى البناء بما رأى من فعل الخطاطيف فاتخذ مخزناً وبيتاً لفضلة غذائه، وحصن عليه بباب من القصب المربوط بعضه إلى بعض، لئلا يصل إليه شيء من الحيوانات عند مغيبه عن تلك الجهة في بعض شؤونه. واستألف جوانح الطير ليستعين بها في الصيد، واتخذ الدواجن ببيضها وفراخها، واتخذ من الصياصي البقر الوحشية شبه الاسنة، وركبها في القصب القوي، وفي عصي الزان وغيرها، واستعان في ذلك بالنار وبحروف الحجارة، حتى صارت شبه الرماح، واتخذ ترسه من جلود مضاعة: كل ذلك لما رأى من عدمه السلاح الطبيعي. ولما رأى أن يده تفي له بكل ما فاته من ذلك، وكان لا يقاومه شيء من الحيوانات على اختلاف أنواعها، إلا أنها كانت عنه فتعجزه هرباً، فكر في وجه الحيلة في ذلك، فلم ير شيئاً أنجع له من أن يتالف بعض الحيوانات الشديدة العدو، ويحسن إليها بأعداد الغذاء الذي يصلح لها، حتى يتأتى له الركوب عليها ومطاردة سائر الأصناف بها.
118
+
119
+ وكان بتلك الجزيرة خيل البرية وحمر وحشية، فاتخذ منها ما يصلح له، وراضها حتى كمل بها غرضه، وعمل عليها من الشرك والجلود أمثال الشكائم والسروج فتاتي له بذلك ما امله من طرد الحيوانات التي صعبت عليه الحيلة في أخذها. وانما تفنن في هذه الأمور كلها ف وقت اشتغاله التشريح، وشهوته في وقوفه على خصائص أعضاء الحيوان، وبماذا تختلف، وذلك في المدة التي حددنا منتهاها بأحد وعشرين عاماً. ثم انه بعد ذلك أخذ في مآخذ أخر من النظر، فتصفح جميع الأجسام التي في عالم الكون والفساد: من الحيوانات على اختلاف أنواعها، والنبات والمعادن وأصناف الحجارة والتراب والماء والبخار والثلج والبرد، والدخان واللهيب والجمر، فرأى لها أصوافاً كثيرة وأفعالاً مختلفة، وحركات متفقة ومضادة، وأنعم النظر في ذلك والتثبت، فرأى أنها تتفق ببعض الصفات وتختلف ببعض، وأنها من الجهة التي تتفق بها واحدة، ومن الجهة التي تختلف فيها متغايرة ومتكثرة فكان تارة ينظر خصائص الأشياء وما يتفرد به بعضها عن بعض، فتكثر عنده كثرة تخرج عن الحصر، وينتشر له الوجود انتشار لا يضبط. كل عضو منها فيرى أنه يحتمل القسمة إلى أجزاء كثيرة جداً، فيحكم على ذاته بالكثرة، وكذلك على ذات كل شيء.
120
+
121
+ ثم كان يرجع إلى نظر آخر من طريق ثان، فيرى أن أعضاءه، وان كانت كثيرة فهي متصلة كلها بعضها ببعض، لا انفصال بينها بوجه، فهي في الحكم الواحد، وأنها لا تختلف إلا بحسب اختلاف أفعالها، أن ذلك الاختلاف إنما هو بسبب ما يصل إليها من قوة الروح الحيواني، الذي انتهى إليه نظره أولاً، وأن ذلك الروح واحد ذاته، وهو حقيقة الذات، وسائر الأعضاء كلها كالآلات، فكانت تتحد عنده ذاته بهذا الطريق.
122
+
123
+ ثم أنه كان ينتقل إلى جميع أنواع الحيوانات، فيرى كل شخص منها واحداً بهذا النوع من النظر. ثم كان ينظر إلى نوع منها: كالظباء والخيل وأصناف الطير صنفاً صنفاً، فكان يرى أشخاص كل نوع يشبه بعضه بعضاً في الأعضاء الظاهرة والباطنة الادراكات والحركات والمنازع، ولا يرى بينها اختلافاً إلا في أشياء يسيرة بالإضافة إلى ما اتفقت فيه.
124
+
125
+ وكان يحكم بان الروح الذي لجميع ذلك النوع شيء واحد، وأنه لم يختلف إلا أنه انقسم على قلوب كثيرة، وأنه لو أمكن أن يجمع جميع الذي افترق في تلك القلوب منه ويجعل في وعاء واحد، لكان كله شيئاً واحداً، بمنزلة ماء واحد، أو شراب واحد، يفرق على أوان كثيرة، ثم يجمع بعد ذلك. فهو في حالتي تفريقه وجمعه شيء واحد، إنما الغرض له التكثر بوجه ما، فكان يرى النوع بهذا النظر واحداً، ويجعل كثرة أشخاصه بمنزلة كثيرة أعضاء الشخص الواحد، التي لم تكن كثرة في الحقيقة.
126
+
127
+ ثم كان يحضر أنواع الحيوانات كلها في نفسه ويتأملها فيراها تتفق في أنها تحس، وتغتذي، وتتحرك بالإرادة إلى أي جهة شاءت، وكان قد علم أن هذه الأفعال هي أخص أفعال الروح الحيواني، وأن سائر الأشياء التي تختلف بها بعد هذا الاتفاق، ليست شديدة الاختصاص بالروح الحيواني. فظهر له بهذا التأمل، أن الروح الحيواني الذي لجميع جنس الحيوان واحد بالحقيقة، وان كان فيه اختلاف يسير، اختص به نوع دون نوع: بمنزلة ماء واحد مقسوم على أوان كثيرة، بعضه أبرد من بعض.
128
+
129
+ وهو في أصله واحد وكل ما كان في طبقة واحدة من البرودة، فهو بمنزلة اختصاص ذلك الروح الحيواني بنوع واحد، وان عرض له التكثر بوجه ما. فكان يرى جنس الحيوان كله واحداً بهذا النوع من النظر. ثم كان يرجع إلى أنواع النبات على اختلافها. فيرى كل نوع منها تشبه أشخاصه بعضها بعضاً في الأغصان، والورق، والزهر والثمر، والأفعال فكان يقيسها بالحيوان، ويعلم أن لها شيئاً واحداً فيه: هو لها بمنزلة الروح الحيواني وأنها بذلك الشيء واحد. وكذلك كان ينظر إلى جنس النبات كله، فيحكم باتحاده بحسب ما يراه من اتفاق فعله في أنه يتغذى وينمو.
130
+
131
+ ثم كان يجمع في نفسه جنس الحيوان وجنس النبات، فيراهما جميعاً متفقين في الاغتذاء والنمو، ألا أن الحيوان يزيد على النبات، بفضل الحس والادراك والتحرك؛ وربما ظهر في النبات شيء شبيه به، مثل تحول وجوه الزهر إلى جهة الشمس، وتحرك عروقه إلى الغذاء، بسبب شيء واحد مشترك بينهما، هو في أحدهما أتمم وأكمل، وفي الآخر قد عاقه عائق ما، وأن ذلك بمنزلة ماء واحد قسم بقسمين، أحدهما جامد والآخر سيال، فيتحد عنده النبات والحيوان. ثم ينظر إلى الأجسام التي لا تحس ولا تغتذي ولا تنمو، من الحجارة، والتراب، والماء، والهواء، واللهب، فيرى أنها أجسام مقدر لها الطول وعرض وعمق وأنها لاتختلف، إلا أن بعضها ذو لون وبعضها لا لون له وبعضها حار والآخر بارد، ونحو ذلك من الاختلافات وكان يرى أن الحار منها يصير بارداً، والبارد يصير حار وكان يرى الماء يصير بخاراً والبخار ماء، والأشياء المحترقة تصير جمراً، ورماداً، ولهيباً، ودخاناً، والدخان إذا وافق في صعوده قبة حجر انعقد فيه وصار بمنزلة سائر الأشياء الأرضية، فيظهر له بهذا التأمل، أن جميعها شيء واحد في الحقيقة، وان لحقتها الكثرة بوجه ما، فذلك مثل ما لحقت الكثرة للحيوان والنبات.
132
+
133
+ ثم ينظر إلى الشيء الذي اتحد به عند النبات والحيوان، فيرى أنه جسم ما مثل هذه الأجسام: له طول وعرض وعمق، وهو إما حار واما بارد، كواحد من هذه الأجسام التي لا تحس ولا تتغذى، وانما خالفها بأفعاله التي تظهر عنه بالآلات الحيوانية والنباتية لا غير، ولعل تلك الأفعال ليست ذاتية، وانما تسري إليه من شيء آخر ولو سرت إلى هذه الأجسام الآخر، لكانت مثله فكان ينظر إليه بذاته مجرداً عن هذه الأفعال، التي تظهر ببادئ الرأي، أنها صادرة عنه، فكان يرى أنه ليس إلا جسماً من هذه الأجسام، فيظهر له بهذا التأمل، أن الأجسام كلها شيء واحد: حيها وجمادها، متحركها وساكنها، إلا أنه يظهر أن لبعضها أفعالاً بالات، ولا يدري هل تلك الأفعال ذاتية لها، أو سارية أليها من غيرها. وكان في هذه الحال لا يرى شيئاً غير الأجسام فكان بهذا الطريق يرى الوجود كله شيئاً واحداً، وبالنظر الأول كثرة لا تنحصر ولا تتناهى. وبقي بحكم هذه الحالة مدة.
134
+
135
+ ثم انه تأمل جميع الأجسام حيها وجامدها. وهي التي هي عنده تارةً شيء واحد وتارةً كثيرة كثرة لا نهاية لها، فرأى إن كل واحد منها، لا يخلو من أحد أمرين: إما أن يتحرك إلى جهة العلو مثل الدخان واللهيب والهواء، إذا حصل تحت الماء واما أن يتحرك إلى الجهة المضادة لتلك الجهة، وهي جهة السفل، مثل الماء، وأجزاء الحيوان و النبات، وأن كل جسم من هذه الأجسام لن يعرى عن إحدى هاتين الحركتين وأنه لا يسكن إلا إذا منعه مانع يعوقه عن طريقه، مثل الحجر النازل يصادف وجه الأرض صلباً، فلا يمكن أن يخرقه، ولو أمكنه ذلك لما انثنى عن حركته فيما يظهر، ولذلك إذا رفعته، وجدته يتحامل عليك بميله إلى جهة السفل، طالباً للنزول. وكذلك الدخان في صعوده، لا ينثني إلا أن يصادف قبة صلبة تحبسه، فحينئذً ينعطف يميناً وشمالاً ثم إذا تخلص من تلك القبة، خرق الهواء صاعداً لأن الهواء لا يمكنه أن يحبسه.
136
+
137
+ وكان يرى إن الهواء إذا ملئ به زق جلد، وربط ثم غوص تحت الماء طلب الصعود وتحامل على من يمسكه تحت الماء، ولا يزال يفعل ذلك حتى يوافي موضع الهواء، وذلك بخروجه من تحت الماء فحينئذً يسكن ويزول عنه ذلك التحامل والميل إلى جهة العلو الذي كان يوجد منه قبل ذلك. ونظر هل يجد جسماً يعرى عن إحدى هاتين الحركتين أو الميل إلى إحداهما في الوقت ما؟ فلم يجد ذلك في الأجسام التي لديه، وانما طلب ذلك، لانه طمع أن يجده، فيرى طبيعة الجسم من حيث هو جسم، دون أن تقترن به وصف من الأوصاف، التي هي منشأ التكثر. فلما أعياه ذلك ونظر إلى الأجسام التي هي أقل الأجسام حملاً للأوصاف فلم يرها تعرى عن أحد هذين الوصفين بوجه، وهما اللذان يعبر عنهما بالثقل والخفة فنظر إلى الثقل والخفة، هل هما للجسم من حيث هو جسم؟ أو هما لمعنى زائد على الجسمية؟ فظهر له أنهما لمعنى زائد على الجسمية لانهما لو كانا للجسم من حيث هو جسم، لما وجد إلا وهما له.
138
+
139
+ ونحن نجد الثقيل لا توجد فيه الخفة، والخفيف لا يوجد فيه الثقل، وهما لا محالة جسمان ولكل واحد منهما معنى منفرد به عن الأخر زائد على جسميته. وذلك المعنى، الذي به غاير كل واحد منهما الآخر، ولولا ذلك لكانا شيئاً واحداً من جميع الوجوه.
140
+
141
+ فتبين له أن حقيقة كل واحد من الثقيل والخفيف، مركبة من معنيين: أحدهما ما يقع فيه الاشتراك منهما جميعاً، وهو معنى الجسمية؛ والآخر ما تنفرد به حقيقة كل واحد منهما على الاخر، وهما أما الثقل في احدهما واما الخفة في الاخر، المقترنان بمعنى الجسمية، أي المعنى الذي يحرك أحدهما الأخر علواً والأخر سفلاً. وكذلك نظر إلى سائر الأجسام من الجمادات والأحياء، فرأى أن حقيقة وجود كل واحد منهما مركبة من معنى الجسمية، ومن شيء أخر زائد على الجسمية: أما واحد، واما أكثر من واحد؛ فلاحت له صور الأجسام على اختلافها وهو أول ما لاح له من العالم الروحاني، اذ هي صور لا تدرك بالحس، وانما تدرك بضرب ما من النظر العقلي.
142
+
143
+ ولاح له في جملة ما لاح من ذلك، أن الروح الحيواني الذي مسكنه القلب - وهو الذي تقدم شرحه أولاً - لابد له أيضاً من معنى زائد على جسميته يصلح بذلك المعنى لأن يعمل هذه الأعمال الغريبة، التي تختص به من ضروب الاحساسات، وفنون الادراكات وأصناف الحركات، وذلك المعنى هو صورته وفضله الذي انفصل به عن سائر الأجسام، وهو الذي يعبر عنه النظار بالنفس الحيوانية. وكذلك ايضاً للشيء الذي يقوم للنبات مقام الحار الغريزي للحيوان، شيء يخصه هو صورته، وهو الذي يعبر عنه النظار بالنفس النباتية. وكذلك لجميع الأجسام الجمادات: وهي ما عدا الحيوان والنبات مما في عالم الكون والفساد شيء يخصها به، يفعل كل واحد منها فعله الذي يختص به مثل صنوف الحركات وضروب الكيفيات المحسوسة عنها، وذلك الشيء هو صورة كل واحد منها، وهو الذي يعبر النظار عنه بالطبيعة.
144
+
145
+ فلما وقف بهذا النظر على ان حقيقة الروح الحيواني، الذي كان تشوقه اليه ابداً، مركبة من معنى الجسمية، ومن معنى أخر زائد على الجسمية، وان معنى الجسمية مشترك، ولسائر الأجسام، والمعنى الأخر المقترن به هو وحده، هان عنده معنى الجسمية فاطرحه، وتعلق فكره بالمعنى الثاني، وهو الذي يعبر عنه النفس؛ فتشوق إلى التحقق به فالتزم الفكرة فيه، وجعل مبدأ النظر في ذلك تصفح الأجسام كلها، لا من جهة ما هي أجسام، بل من وجهة ما هي ذوات صور تلزم عنها خواص، ينفصل بها بعضها ببعض. فتتبع ذلك وحصره في نفسه، فرأى جملة من الأجسام، تشترك في صورة ما يصدر عنها فعل ما، أو أفعال ما، ورأى فريقاً من تلك الجملة، مع أنه يشارك الجملة بتلك الصورة، يزيد عليها بصورة أخرى، يصدر عنها ما، ورأى طائفة من ذلك الفريق، مع أنها تشارك الفريق في الصورة الأولى والثانية، تزيد عليه بصوره ثالثة، تصدر عنها أفعال ما خاصة بها. مثال ذلك: إن الأجسام الأرضية، مثل التراب والحجارة والمعادن والنبات والحيوان، وسائر الأجسام الثقيلة، وهي جملة واحدة تشترك في صورة واحدة تصدر عنها الحركة إلى الأسفل، ما لم يعقها عائق عن النزول: ومتى تحركت إلى جهة العلو بالقسر ثم تركت، تحركت بصورتها إلى الأسفل. وفريق من هذه الجملة، وهو النبات والحيوان، مع مشاركة الجملة المتقدمة في تلك الصورة، يزيد عليها صورة أخرى، يصدر عنها التغذي والنمو. والتغذي: هو أن يخلف المتغذي، بدل ما تحلل منه، بان يحيل إلى ما التشبه بجوهره مادة قريبة منه، يجتذبها إلى نفسه.
146
+
147
+ والنمو: هو الحركة في الأقطار الثلاثة، على نسبة محفوظة في الطول والعرض والعمق.
148
+
149
+ فهذان الفعلان عامان للنبات والحيوان، وهما لا محالة صادران عن صورة مشتركة لهما، وهي المعبر عنها بالنفس النباتية. وطائفة من هذا الفريق، وهو الحيوان خاصة، مع مشاركته الفريق المتقدم في الصورة الأولى والثانية، تزيد عليه بصورة ثالثة، يصدر عنها الحس والتنقل من حين إلى أخر. ورأى أيضاً كل نوع من أنواع الحيوان، له خاصية ينحاز بها عن سائر الأنواع، وينفصل بها متميزاً عنها. فعلم إن ذلك صادر عن صورة له تخصه هي زائدة عن معنى الصورة المشتركة له ولسائر الحيوان، وكذلك لكل واحد من أنواع النبات مثل ذلك. فتبين له إن الأجسام المحسوسة التي في عالم الكون والفساد، بعضها تلتئم حقيقته من معان كثيرة، زائدة على معنى الجسمية، وبعضها من معان اقل؛ وعلم إن معرفة الأقل أسهل من معرفة الأكثر؛ فطلب أولاً الوقوف على الحقيقة لشيء الذي تلتئم حقيقته من اقل الأشياء، ورأى إن الحيوان والنبات، لا تلتئم حقائقها إلا من معان كثيرة، لتفنن أفعالها؛ فأخر التفكير في صورهما. وكذلك رأى إن أجزاء الأرض بعضها ابسط من بعض، فقصد منها إلى ابسط ما قدر عليه وكذلك رأى إن الماء شيء قليل التركيب، لقلة ما يصدر عن صورته من أفعال، وكذلك راى النار والهواء. وكان قد سبق إلى ظنه أولاً، أن هذه الأربعة يستحيل بعضها إلى بعض، وان لها شيئاً واحداً تشترك فيه، وهو معنى الجسمية، وان ذلك الشيء ينبغي إن يكون خلواً من المعاني التي تميز بها كل واحد من هذه الأربعة عن الأخر، فلا يمكن أن يتحرك إلى فوق ولا إلى اسفل، ولا إن يكون حاراً ولا يكون بارداً، ولا يكون رطباً، ولا يابساً، لان كل واحد من هذه الاوصاف، لا يعم جميع الأجسام، فليست إذن للجسم بما هو جسم.
150
+
151
+ فإذا أمكن وجود جسم لا صورة فيه زائدة على الجسمية، فليس تكون فيه صفة من هذه الصفات، ولا يمكن إن تكون فيه صفة إلا وهي تعم سائر الأجسام المتصورة، بضروب الصور. فنظر هل يجد وصفاً واحداً يعم جميع الأجسام: حيها وجمادها، فلم يجد شيئاً يعم الأجسام كلها. إلا معنى الامتداد الموجود في جميعها في الأقطار الثلاثة، التي يعبر عنها بالطول، والعرض، والعمق، فعلم هذا المعنى هو للجسم من حيث هو جسم، لكنه لم يتأت له بالحس وجود جسم بهذه الصفة وحدها، حتى لا يكون فيه معنى زائد على الامتداد المذكور ويكون بالجملة خلواً من سائر الصور. ثم تفكر في هذا الامتداد إلى الأقطار الثلاثة، هل هو معنى الجسم بعينه، وليس ثم معنى أخر أو ليس الأمر كذلك، فرأى أن وراء هذا الامتداد معنى أخر، هو الذي يوجد فيه هذا الامتداد، وان الامتداد وحده لا يمكن إن يقوم بنفسه كما إن ذلك الشيء الممتد، لا يمكن أن تقوم دون امتداد. واعتبر ذلك ببعض هذه الأجسام المحسوسة ذوات الصور، كالطين مثلاً، كان له طول وعرض وعمق على قدر ما.
152
+
153
+ ثم إن تلك الكرة بعينها لو أخذت وردت إلى شكل مكعب أو بيض، لتبدل ذلك الطول وذلك العرض وذلك العمق، وصارت على قدر أخر. غير الذي كانت عليه، والطين واحد بعينه لم يتبدل، غير أنه لا بد له من طول وعرض وعمق على أي قدر كان، ولا يمكن إن يعرى عنها؛ غير أنها لتعاقبها عليه، تبين له أنها معنى على حياله؛ ولكونه لا يعرى بالجملة عنها، تبين له أنها من حقيقة. فلاح له بهذا الاعتبار، إن الجسم، بما هو جسم، مركب على الحقيقة من معنين: أحدهما يقوم منه مقام الطين للكرة في هذا المثال. والأخر: يقوم مقام طول الكرة وعرضها وعمقها، أو المكعب، أو أي شكل كان له. وانه لا يفهم الجسم إلا مركباً من هذين المعنين، وان احدهما لا يستغني عن الأخر. ولكن الذي يمكن أن يتبدل ويتعاقب على أوجه كثيرة، وهو معنى الامتداد يشبه الصورة التي لسائر الأجسام ذوات الصور، والذي يثبت على حال واحدة، وهو الذي ينزل منزلة الطين في المثال المتقدم، يشبه معنى الجسمية التي لسائر الأجسام ذوات الصور.
154
+
155
+ وهذا الشيء الذي هو بمنزلة الطين في هذا المثال هو الذي يسميه النظار المادة والهيولى وهي عارية عن الصورة جملة. فلما نظره إلى هذا الحد، وفارق المحسوس بعض مفارقة، وأشرف على تخوم العالم العقلي، استوحش وحن إلى ما ألفه من عالم الحس، فتقهقر قليلاً وترك الجسم على الإطلاق، إذ هو أمر لا يدركه الحس، ولا يقدر على تناوله. فاخذ أبسط الأجسام المحسوسة التي شاهدها، وهي تلك الأربعة التي كان قد وقف نظره عليها.
156
+
157
+ فأول ما نظر إلى الماء فرأى انه إذا خلي وما تقتضيه صورته، ظهر منه برد محسوس، وطلب النزول إلى اسفل فإذا سخن أما بالنار واما بحرارة الشمس، زال عنه البرد أولاً وبقي فيه طلب النزول، فإذا أفرط عليه بالتسخين، زال عنه طلب النزول إلى اسفل. وصار يطلب الصعود إلى فوق. فزال عنه بالجملة الوصفان اللذان كانا أبداً يصدران عن صورته، ولم يعرف من صورته أكثر من صدور هذين الفعلين عنها. فلما زال هذان الفعلان بطل حكم الصورة، فزالت الصورة المائية عن ذلك الجسم عندما ظهرت منه أفعال من شأنها أن تصدر عن صورة أخرى، وحدثت له صورة أخرى، بعد أن لم تكن، وصدر عنه بها أفعال لم يكن من شأنها أن تصدر عنه وهو بصورته الأولى. فعلم بالضرورة أن كل حادث لا بد له من محدث. فارتسم في نفسه بهذا الاعتبار، فاعل للصورة، ارتساماً على العموم دون تفصيل. ثم أنه تتبع الصور التي كان قد عاينها قبل ذلك، صورة صورة، فرأى أنها كلها حادثة، وأنها لا بد لها من فاعل. ثم نظر إلى ذوات، الصور، فلم ير أنها شيء أكثر من استعداد الجسم لان يصدر عنه ذلك الفعل، مثل الماء، فانه إذا افرط عليه التسخين، استعد للحركة إلى فوق وصلح لها.
158
+
159
+ فذلك الاستعداد هو صورته، إذ ليس ها هنا إلا جسم وأشياء تحس عنه، بعد أن لم تكن؛ فصلوح الجسم لبعض الحركات دون بعض، واستعداده بصورته، ولاح له مثل ذلك في جميع الصور، فتبين له أن الأفعال الصادرة عنها، ليست في الحقيقة لها، وانما هي لفاعل يفعل بها الأفعال المنسوبة إليها؛ وهذا المعنى الذي لاح له، هو قول الرسول الله عليه الصلاة والسلام: "كنت سمعه الذي يسمع به وبصره الذي يبصر به" وفي محكم التنزيل: "بسم الله الرحمن الرحيم" فان تقتلوهم ولكن الله قتلهم؛ وما رميت إذا رميت، ولكن الله رمى! صدق الله العظيم. فلما لاح له من أمر هذا الفاعل، ما لاح على الإجمال دون تفصيل، حدث له شوق حثيث إلى معرفته على التفصيل، ولانه لم يكن بعد فارق عالم الحس، جعل يطلب هذا الفاعل على جهة المحسوسات، وهو لا يعلم بعد هل هو واحد أو كثير؟ فتصفح جميع الأجسام التي لديه، وهي التي كانت فكرته أبداً فيها، فرأها كلها تتكون تارة وتفسد أخرى، وما لم يقف على فساد جملته، وقف على الفساد أجزائه مثل الماء والأرض، فانه راى أجزاءهما تفسد بالنار، وكذلك الهواء رآه يفسد بشدة البرد، حتى بتكون منه الثلج فيسيل ماء. وكذلك سائر الأجسام التي كانت لديه، ولم ير منها شيئاً بريئاً عن الحدوث والافتقار إلى الفاعل المختار، فاطرحها كلها وانتقلت فكرته إلى الأجسام السماوية.
160
+
161
+ وانتهى إلى هذا النظر على رأس أربعة أسابيع من منشئه، وذلك ثمانية وعشرون عاماً. فعلم إن السماء وما فيها من كواكب الأجسام، لأنها ممتدة في الأقطار الثلاثة: الطول، والعرض، والعمق؛ لا ينفك شيء منها عن هذه الصفة، وكل ما لا ينفك عن هذه الصفة، فهو جسم؛ فهي إذن كلها أجسام. ثم تفكر هل هي ممتدة إلى ما لا نهاية، وذاهبة أبداً في الطول والعرض والعمق إلى ما لا نهاية، أو هي متناهية محدودة بحدود تنقطع عندها، ولا يمكن أن يكون وراءها شيء من الامتداد؟ فتحير بعد ذلك بعض الحيرة. ثم انه بقوة فطرته، وذكاء خاطره، راى أن جسماً لا نهاية له أمر باطل، وشيء لا يمكن، ومعنى لا يعقل، وتقوى هذا الحكم عنده بحجج كثيرة، سنحت له بينه وبين نفسه وذلك أنه قال: أما الجسم السماوي فهو متناه من الجهة التي تليني والناحية التي وقع عليها حسي، فهذا لا شك فيه لأنني أدركه ببصر، وأما الجهة التي تقابل هذه الجهة، وهي التي يداخلني فيها الشك، فاني أيضاً أعلم من المحال أن تمتد إلى غير نهاية، لأني إن تخيلت أن خطين اثنين، يبتدئان من هذه الجهة المتناهية، ويمران في سمك الجسم إلى غير نهاية حسب امتداد الجسم، ثم تخيلت أن أحد هذين الخطين، قطع منه جزء كبير من ناحية طرفه المتناهي، ثم أخذ ما بقي منه شيء واطبق الخط المقطوع منه على الخط الذي لم يقطع منه شيء، وذهب الذهن كذلك معهما إلى الجهة التي يقال إنها غير متناهية، فأما أن نجد خطين أبداً يمتدان إلى غير نهاية ولا ينقص أحدهما عن الأخر، فيكون الذي قطع منه جزء مساوياً للذي لم يقطع منه شيء وهو محال، كما أن الكل مثل الجزء المحال؛ واما أن لا يمتد الناقص معه ابداً، بل ينقطع دون مذهبه ويقف عن الامتدادمعه، فيكون متناهياً، فإذا رد عليه القدر الذي قطع منه أولاً، وقد كان متناهياً، صار كله أيضاً متناهياً، وحينئذ لا يقصر عن الخط الأخر الذي يقطع منه شيء، ولا يفضل عليه فيكون إذن مثله وهو متناه، فذلك أيضاً متناه، فالجسم الذي تفرض فيه هذه الخطوط متناه، وكل جسم يمكن أن تفرض فيه هذه الخطوط، فكل جسم متناه.
162
+
163
+ فإذا فرضنا أن جسماً غير متناه، فقد فرضنا باطلاً ومحالاً. فلما صح عنده بفطرته الفائقة التي لمثل هذه الجهة، أن جسم السماء متناه، أراد أن يعرف على أي شكل هو، وكيفية انقطاعه بالسطوح التي تحده. فنظر أولاً إلى الشمس والقمر وسائر الكواكب، فرأها كلها تطلع من جهة المشرق، وتغرب من جهة المغرب، فما كان يمر على سمت رأسه، رأه يقطع دائرة عظمى، وما مال عن سمت رأسه إلى الشمال أو إلى الجنوب، رأه يقطع دائرة أصغر من تلك. وما كان أبعد عن سمت الرأس إلى أحد الجانبين، كانت دائرته أصغر من دائرة ما هو أقرب. حتى كانت أصغر الدوائر التي تتحرك عليها الكواكب، دائرتين اثنتين: إحداهما حول القطب الجنوبي، وهي مدار سهيل، والاخرى حول القطب الشمالي، وهي المدار الفرقدين. ولما كان مسكنه على خط الاستواء الذي وصفناه أولاً، كانت هذه الدوائر كلها على سطح آفة. ومتشابهة في الجنوب والشمال وكان القطبان معاً ظاهرين له، وكان يترقب إذا طلع كوكب من الكواكب على دائرة كبيرة، وطلع كوكب آخر على دائرة صغيرة، وكان طلوعهما معاً، فكان يرى غروبهما معاً. واطرد له في ذلك جميع الكواكب وفي جميع الأوقات، فتبين له بذلك أن الفلك على شكل الكرة، وقوى ذلك في اعتقاده، ما رآه من رجوع الشمس والقمر وسائر الكواكب إلى المشرق، بعد مغيبها بالمغرب، وما رآه أيضاً من أنها تظهر لبصره على قدر واحد من العظم في حال طلوعها وتوسطها وغروبها، وأنها لو كانت حركتها على غير شكل الكرة لكانت لا محالة في بعض الأوقات، أقرب إلى بصره منها في وقت آخر، ولو كانت كذلك، لكانت مقاديرها واعظامها تختلف عند بصره فيراها في حال القرب أعظم مما يراها في حال البعد، لاختلاف أبعادها عن مركزه حينئذ بخلافها على الأول.
164
+
165
+ فلما لم يكن شيء من ذلك؛ تحقق عنده كروية الشكل. وما زال يتصفح حركة القمر، فيراها آخذه من المغرب إلى المشرق وحركات الكواكب السيارة كذلك، حتى تبين له قدر كبير من علم الهيئة، وظهر له أن حركتها لا تكون إلا بأفلاك كثيرة، كلها مضمنة في فلك واحد، هو أعلاها. وهو الذي يحرك الكل من المشرق إلى المغرب في اليوم والليلة. وشرح كيفية انتقاله. ومعرفة ذلك يطول؛ وهو مثبت في الكتب، ولا يحتاج منه في غرضنا إلا للقدر الذي أردناه. فلما انتهى إلى هذه المعرفة، ووقف على أن الفلك بجملته وما يحتوي عليه، كشيء واحد متصل بعضه ببعض، وأن جميع الأجسام التي كان ينظر فيها أولاً: كالأرض والماء والهواء والنبات والحيوان وما شاكلها، هي كلها في ضمنه وغير خارجة عنه، وأنه كله أشبه شيء بشخص من أشخاص الحيوان؛ وما فيه من الكواكب المنيرة هي بمنزلة حواس الحيوان؛ وما فيه من ضروب الأفلاك، المتصل بعضها ببعض، هي بمنزلة أعضاء الحيوان؛ وما في داخله من الكون والفساد هي بمنزلة ما في جوف الحيوان من أصناف الفضول والرطوبات، التي كثيراً ما يتكون فيها أيضاً حيوان، كما يتكون في العالم الأكبر. فلما تبين له أنه كله كشخص واحد في الحقيقة، واتحدت عنده أجزاؤه الكثيرة بنوع من النظر الذي اتحدت به عنده الأجسام التي في عالم الكون والفساد، تفكر في العالم بجملته، هل هو شيء حدث بعد إن لم يكن، وخرج إلى الوجود بعد العدم؟ أو هو أمر كان موجوداً فيما سلف، ولم يسبقه العدم بوجه من الوجوه؟ فتشك في ذلك ولم يترجح عنده أحد الحكمين على الآخر. وذلك أنه كان إذا أزمع على اعتقاد القدم، اعترضه عوارض كثيرة، من استحالة وجود ما لا نهاية له، بمثل الذي استحال عنده به وجود جسم لا نهاية وكذلك أيضاً كان يرى أن هذا الوجود لا يخلو من الحوادث، فهو لا يمكن تقدمه عليها، وما لا يمكن أن يتقدم على الحوادث، فهو أيضاً محدث. وإذا أزمع على اعتقاد الحدوث، اعترضته عوارض أخرى، وذلك أنه كان يرى أن معنى حدوثه، بعد أن لم يكن لا يفهم إلا على أن الزمان تقدمه، والزمان من جملة العالم وغير منفك عنه، فإذن لا يفهم تأخر العالم عن الزمان. وكذلك أيضاً كان يقول: إذا كان حادثاً، فلا بد له من محدث؛ وهذا المحدث الذي أحدثه، لم أحدثه الآن ولم يحدثه قبل ذلك، الطارئ طرأ عليه ولا شيء هناك غيره، أم لتغير حدث في ذاته؟ فان كان فما الذي احدث ذلك التغيير؟ وما زال يتفكر في ذلك عدة سنين.
166
+
167
+ فتتعارض عنده الحجج، ولا يترجح عنده أحد الاعتقادين على الآخر. فلما أعياه ذلك، جعل يتفكر ما الذي يلزم عن كل واحد من الاعتقادين، فلعل اللازم عنهما يكون شيئاً واحداً. فرأى انه إن اعتقد حدوث العالم خروجه إلى الوجود بعد العدم، فاللازم عن ذلك ضرورة، انه لا يمكن أن يخرج إلى الوجود بنفسه، وانه لا بد له من فاعل يخرجه إلى الوجود، وان ذلك الفاعل لا يمكن إن يدرك بشيء من الحواس، لانه لو أدرك بشيء من الحواس لكان جسماً من الأجسام، ولو كان جسماً من الأجسام لكان من جملة العالم، وكان حادثاً واحتاج إلى محدث، ولو كان ذلك المحدث الثاني أيضاً جسماً، لحتاج إلى محدث ثالث، والثالث إلى رابع، ويتسلسل ذلك إلى غير نهايةً وهو باطل. فإذن لابد للعالم من فاعل ليس بجسم، وإذا لم يكن جسماً فليس إلى إدراكه لشيء من الحواس سبيل، الآن الحواس الخمس لا تدرك إلا الأجسام، وإذا لا يمكن أن يحس فلا يمكن أن يتخيل، لان التخيل ليس شيئاً إلا إحضار صور المحسوسات بعد غيبتها، وإذا لم يكن جسماً فصفات الأجسام كلها تستحيل عليه، وأول صفات الأجسام هو الامتداد في الطول والعرض والعمق، وهو منزه عن ذلك، وعن جميع ما يتبع هذا الوصف من صفات الأجسام. وإذا كان فاعلاً للعالم فهو لا محالة قادر عليه وعالم به "بسم الله الرحمن الرحيم" إلا يعلم من خلق، وهو اللطيف الخبير؟ صدق الله العظيم. وراى أيضاً انه إن اعتقد قدم العالم، وان العدم لم يسبقه، وانه لم يزل كما هو، فان اللازم عن ذلك أن حركته قديمة لا نهاية لها من جهة الابتداء، إذ لم يسبقها سكون يكون مبدؤها منه، وكل حركة فلابد لها من محرك ضرورة، والمحرك أما أن يكون قوة سارية في جسم من الأجسام - أما جسم المتحرك نفسه، واما جسم أخر خارج عنه - واما أن تكون قوة ليست سارية ولا شائعة قي جسم. وكل قوى سارية في جسم وشائعه فيه، فانها تنقسم بانقسامه، وتتضاعف بتضاعفه، مثل الثقل بالحجر مثلاً. المحرك إلى الأسفل.
168
+
169
+ فانه إن قسم الحجر نصفين. وان زيد عليه أخر مثله، زاد في الثقل أخر مثله، فان أمكن أن يتزايد الحجر إلى غير نهاية، كتزايد هذا الثقل إلى غير نهاية، وان وصل الحجر إلى حد ما من العظم ووقف، وصل الثقل إلى ذلك الحد ووقف، لكنه قد تبرهن أن كل جسم فانه لا محالة متناه، فإذن كل قوة في الجسم فهي لا محالة متناهية. فان وجدناها قوة تفعل فعلاً لا نهاية له، فهي قوة ليست في جسم، وقد وجدنا الفلك يتحرك أبداً حركة لانهاية لها ولا انقطاع إذ فرضناه قديماً لا ابتداء له فالواجب على ذلك أن تكون القوة التي تحرك ليست في جسمه، ولا في جسم خارج عنه. فهي إذا لشيء بريء عن الأجسام، وغير موصوف بشيء من أوصاف الجسمية، وقد كان لاح له في نظره الأول في عالم الكون والفساد إن حقيقة وجود كل جسم، إنما هي من جهة صورته التي هي استعداده لضروب الحركات، وان وجوده الذي له من جهة مادته وجود ضعيف لا يكاد يدرك؛ فان وجود العالم كله إنما هو من جهة استعداده لتحريك هذا المحرك البريء عن المادة، وعن صفات الأجسام، المنزه عن أن يدركه حس، أو يتطرق إليه خيال، سبحانه، وإذا كان فاعلاً لحركات الفلك على اختلاف أنواعها، فعلاً لا تفاوت فيه ولا فتور فيه ولا قصور، فهو لا محالة قادر عليها وعالم بها.
170
+
171
+ فانتهى نظره بهذا الطريق إلى ما انتهى إليه بالطريق الأول، ولم يضره في ذلك تشككه في قدم العالم أو حدوثه، وصح له على الوجهين جميعاً وجود فاعل غير الجسم، ولا متصل بجسم ولا منفصل عنه، ولا داخل فيه، ولا خارج عنه، إذ: الاتصال، والانفصال، والدخول، هي كلمات من صفات الأجسام، وهو منزه عنها. ولما كانت المادة في كل جسم مفتقرة إلى الصورة، إذ لا تقوم إلا بها ولا تثبت لها حقيقة دونها، وكانت الصورة لا يصح وجودها إلا من فعل هذا الفاعل تبين له افتقار جميع الموجودات في وجودها إلى هذا الفاعل وأنه لا قيام لشيء منها إلا به فهو إذن علة لها، وهي معلومة له، سواء كانت محدثة الوجود، بعد أن سبقها العدم، أو كانت الابتداء لها من جهة الزمان، ولم يسبقها العدم قط، فانها على كلا الحالتين معلولة، ومفتقرة إلى الفاعل، متعلقة الوجود به، ولولا دوامه لم تدم، ولولا وجوده لم توجد، ولولا قدمه لم تكن قديمة، وهو في ذاته غني عنها وبريء منها! وكيف لا يكون كذلك وقد تبرهن أن قدرته غير متناهية، وأن جميع الأجسام وما يتصل بها أو يتعلق بها، ولو بعض التعلق، هو متناه منقطع. فإذن العالم كله بما في السماوات والأرض والكواكب، وما بينها، وما فوقها، وما تحتها، فعله وخلقه؛ ومتأخر عليه بالذات، وان كانت غير ماخرة عليها بالزمان. كما انك إذا أخذت في قبضتك جسماً من الأجسام، ثم حركت يدك، فان ذلك الجسم لا محالة يتحرك تابعاً لحركة يدك، حركة متأخرة عن حركة يدك، تأخراً بالذات؛ وان كانت لم تتأخر بالزمان عنها، بل كان ابتداؤهما معاً، فكذلك العالم كله، معلول ومخلوق لهذا الفاعل بغير زمان "بسم الله الرحمن الرحيم" إنما أمره إذا أراد شيئاً أن يقول له كن فيكون صدق الله العظيم. فلما راى إن جميع الموجودات فعله، تصفحها من بعد ذا تصفحاً على طريق الاعتبار في قدرة فاعلها؛ والتعجب من غريب صنعته، ولطيف حكمته، ودقيق علمه فتبين له في اقل الأشياء الموجودة، فضلاً عن أكثرها من أثار الحكمة، وبدائع الصنعة، ما قضى منه كل العجب، وتحقق عنده إن ذلك لا يصدر إلا عن فاعل مختار في غاية الكمال وفوق الكمال "بسم الله الرحمن الرحيم" لا يغرب عنه مثقال ذرة في السموات ولا في الأرض ولا اصغر من ذلك ولا أكبر صدق الله العظيم.
172
+
173
+ ثمتأمل في جميع أصناف الحيوان، كيف "بسم الله الرحمن الرحيم" أعطى كل شيء خلقه، ثم هداه صدق الله العظيم لاستعماله، فلولا أنه هداه لاستعمال تلك الأعضاء التي خلقت له في وجوه المنافع المقصود بها، لما انتفع بها الحيوان، وكانت كلاً عليه، فعلم بذلك أنه أكرم الكرماء، وارحم الرحماء. من فيض ذلك الفاعل المختار - جل جلاله - ومن وجوده، ومن فعله، فعلم أن الذي هو في ذاته أعظم منها، وأكمل، واتمم وأحسن، وأبهى وأجمل وأدوم، وأنه لا نسبة لهذه إلى تلك. فما زال يتتبع صفات الكمال كلها، فيراها له وصادرة عنه، ويرى أنه أحق بها من كل ما يوصف بها دونه. وتتبع صفات النقص كلها فرآه بريئاً منها، ومنزهاً عنها؛ وكيف لا يكون بريئاً منها وليس معنى النقص إلا العدم المحض، أو ما يتعلق بالعدم؟ وكيف يكون العدم تعلق أو تلبس، بمن هو الموجود المحض، الواجب الوجود بذاته، المعطي لكل ذي وجود وجوده، فلا وجود إلا هو: فهو الوجود، وهو الكمال، وهو التمام، وهو الحسن، وهو البهاء، وهو القدرة، وهو العلم، وهو هو، و "بسم الله الرحمن الرحيم" كل شيء هالك إلا وجهه صدق الله العظيم. فانتهت به المعرفة إلى هذا الحد، على رأس خمسة أسابيع من منشئه، وذلك خمسة وثلاثون عاماً، وقد رسخ في قلبه من هذا الفاعل، ما شغله عن الفكرة في كل شيء إلا فيه، وذهل عما كان فيه تصفح الموجودات والبحث عنها، حتى صار بحيث لا يقع بصره على شيء من الأشياء، إلا ويرى فيه أثر الصنعة، ومن حينه، فينتقل بفكره على الفور إلى الصانع ويترك المصنوع، حتى اشتد شوقه إليه، وانزعج قلبه بالكلية عن العالم الأدنى المحسوس، وتعلق بالعالم الأرفع المعقول. فلما حصل له العلم بهذا الموجود الرفيع الثابت الوجود الذي لا سبب لوجود جميع الأشياء، أراد أن يعلم بأي شيء حصل له هذا العالم، وبأي قوة أدرك هذا الموجود: فتصفح حواسه كلها وهي: السمع، والبصر، والشم، والذوق، واللمس، فرأى أنها لا تدرك شيئاً إلا جسماً، أو ما هو في الجسم، وذلك أن السمع لا يدرك المسموعات، وهي ما يحدث من تموج الهواء عند تصادم الأجسام، والبصر إنما يدرك الألوان، والشم يدرك الروائح، والذوق يدرك الطعوم، واللمس يدرك الأمزجة والصلابة واللين، والخشونة والملاسة، وكذلك القوة الخيالية لا تدرك شيئاً إلا أن يكون له طول وعرض وعمق؛ وهذه المدركات كلها من صفات الأجسام، وليس لهذه الحواس أدراك شيء سواها، وذلك لأنها قوى شائعة في الأجسام، ومنقسمة بانقسامها، فهي لذلك لا تدرك إلا جسماً منقسماً، لان هذه القوة إذا كانت شائعة في شيء منقسم، فلا محالة أنها إذا أدركت شيئاً من الأشياء، فانه ينقسم بانقسامها؛ فإذن كل قوة في جسم، فانها لا محالة لا تدرك إلا جسماً أو ما هو جسم.
174
+
175
+ وقد تبين إن هذا الموجود الواجب الوجود، بريء من صفات الأجسام من جميع الاتجاهات، فإذن لا سبيل إلى إدراكه إلا بشيء ليس بجسم، ولا هو قوة في جسم، ولا تعلق له وجه من الوجوه بالأجسام، ولا هو داخل فيها ولا خارج عنها، ولا متصل بها ولا منفصل عنها. وقد كان تبين له أن أدركه بذاته، ورسخت المعرفة به عنده، فتبين له بذلك أن ذاته التي أدركه بها أمر غير جسماني، ولا يجوز عليه شيء من صفات الأجسام، وان كل ما يدركه من ظاهر ذاته من الجسمانية فانها ليست حقيقة ذاته، وانما حقيقة ذاته ذلك الشيء الذي أدرك به الموجود المطلق الواجب الوجود. فلما علم أن ذاته ليست هذه المتجسمة التي يدركها بحواسه، ويحيط بها أديمه، هان عنده بالجملة جسمه، وجعل يتفكر في تلك الذات الشريفة، التي أدرك بها ذلك الموجود الشريف الواجب الوجود، ونظر في ذاته تلك الشريفة، هل يمكن أن تبيد أو تفسد وتضمحل، أو هي دائمة البقاء؟ فرأى إن الفساد والاضمحلال إنما هو من صفات الأجسام بأن تخلع صورة وتلبس صورة أخرى، مثل الماء إذا صار هواء، والهواء إذا صار ماء، والنبات إذا صار تراباً، والتراب إذا صار نباتاً، هذا هو معنى الفساد.
176
+
177
+ وأما الشيء الذي ليس بجسم، ولا يحتاج في قوامه إلى جسم، وهو منزه بالجملة عن الجسمانية، فلا يتصور فساده البتة. فلما ثبت له أن ذاته الحقيقة لا يمكن فسادها، أراد إن يعلم كيف يكون حالها إذا اطرح البدن وتخلت عنه، وقد كان تبين له أنها لا تطرحه إلا إذا لم يصلح آلة لها، فتصفح جميع القوى المدركة، فرأى أن كل واحدة منها تارةً تكون مدركة بالقوة، وتارةً تكون مدرة بالفعل: مثل العين في حال تغميضها أو أعراضها عن البصر، فانها تكون مدركة بالقوة - ومعنى مدركه بالقوة أنها لا تدرك الآن وتدرك في المستقبل - وفي حال فتحها واستقبالها للمبصر، تكون مدركه بالفعل - ومعنى مدركة بالفعل أنها الآن تدرك - وكذلك كل واحدة من هذه القوى تكون مدركة بالقوة وتكون مدركة بالفعل، وكل واحدة من هذه القوى إن كانت لم تدرك قط بالفعل، فهي ما دامت بالقوة لا تتشوق إلى إدراك الشيء المخصوص بها لأنها لم تتعرف به بعد، مثل من خلق مكفوف البصر؛ وان كانت قد أدركت بالفعل تارةً، ثم صارت بالقوة، فانها ما دامت بالقوة تشتاق إلى الإدراك بالفعل لأنها قد تعرفت إلى المدرك، وتعلقت به، وحنت إليه، مثل من كان يصيراً ثم عمي فانه لا يزال يشتاق إلى المبصرات. وبحسب ما يكون الشيء المدرك أتم وأبهى وأحسن، يكون الشوق أكثر؛ والتألم لفقده اعظم، ولذلك كان تألم من يفقد بصره بعد الرؤية أعظم من تألم من يفقد شمه، إذ الأشياء التي يدركها البصر أتم وأحسن من التي يدركها الشم، فان كان في الأشياء شيء لا نهاية لكماله، ولا غاية لحسنه وجماله وبهائه، وهو فوق الكمال والبهاء والجمال، وليس في الوجود كمال، ولا حسن، ولا بهاء، ولا جمال إلا صادر من جهته، وفائض من قبله، فمن فقد إدراك ذلك الشيء بعد إن تعرف به، فلا محالة أنهما ما دام فاقد له، يكون في ألام لا نهاية لها، كما أن من كان مدركاً له على الدوام، فانه يكون في لذة لا انفصام لها، وغبطة لا غاية لها ورائها، وبهجة وسرور لا نهاية لهما. وقد تبين له أن الموجود الواجب الوجود.
178
+
179
+ متصف بأوصاف الكمال كلها، ومنزه عن الصفات النقص وبريء منها. وتبين له أن الشيء الذي به يتوصل إلى أدركه أمر لا يشبه الأجسام، ولا يفسد لفسادها؛ فظهر له بذلك أن من كانت له مثل هذه الذات، المعدة لمثل هذا الإدراك؛ فانه إذا أطرح البدن بالموت؛ فإما أن يكون قبل ذلك - في مدة تصريفه للبدن - لم يتعرف قط بهذا الموجود الواجب الوجود؛ ولا اتصل به؛ ولا سمع عنه؛ فهذا إذا فارق البدن لا يشتاق إلى ذلك الموجود ولا يتألم لفقده. واما جميع القوى الجسمانية، فانها تبطل ببطلان الجسم؛ فلا تشتاق أيضاً إلى مقتضيات تلك القوى، ولا تحن إليها، ولا تتألم لفقدها. وهذه حال البهائم غير الناطقة كلها: سواء كانت من صورة الإنسان أو لم تكن. واما إن يكون قبل ذلك - في مدة تصريفه للبدن - قد تعرف بهذا الموجود، وعلم ما هو عليه من الكمال والعظمة والسلطان والحسن إلا انه أعرض عنه واتبع هواه، حتى وافته منيته وهو على تلك الحال، فيحرم المشاهدة، وعنده الشوق إليها فيبقى في عذاب طويل، وألام لا نهاية لها. فأما من يتخلص من تلك الآلام بعد جهد طويل، ويشاهد ما تشوق إليه قبل ذلك، واما أن يبقى في آلامه بقاءً سرمدياً، بحسب استعداده لكل واحد من الوجهين لحياته الجسمانية.
180
+
181
+ واما من تعرف بهذا الموجود الواجب الوجود، قبل أن يفارق البدن، واقبل بكليته عليه والتزم الفكرة في جلاله وحسن بهائه، ولم يعرض عنه حتى وافته منيته، وهذا على حال من الإقبال والمشاهدة بالفعل. فهذا إذا فارق البدن بقي في لذة لا نهاية لها، وغبطة وسرور وفرح دائم، لاتصال مشاهدته لذلك الموجود الواجب الوجود، وسلامة تلك المشاهدة من الكدر والشوائب؛ ويزول عنه ما تقتضيه هذه القوى الجسمانية من الأمور الحسية التي هي - بالإضافة إلى تلك الحال - ألام وشرور وعوائق. فلما تبين له أن كمال ذاته ولذتها إنما هو بمشاهدة ذلك الموجود الواجب الوجود على الدوام، مشاهدة بالفعل أبداً، حتى لا يعرض عنه طرفة عين لكي توافيه منيته، وهو في حال المشاهدة بالفعل، فتتصل لذته دون أن يتخللها ألم. ثم جعل يتفكر كيف يتأتى له دوام هذه المشاهدة بالفعل، حتى لا يقع منه أعراض فكان يلازم الفكرة في ذلك الموجود كل ساعة، فما هو إلا يسنح لبصره محسوس ما من المحسوسات، أو يخرق سمعه صوت بعض الحيوان، أو يتعرضه خيال من الخيالات، أو يناله ألم في أحد اعضائه، أو يصيبه الجوع أو العطش أو البرد أو الحر، أو يحتاج القيام لدفع فضوله؛ فتختل فكرته، ويزول عما كان فيه، ويتعذر عليه الرجوع إلى ما كان عليه من حال المشاهدة، إلا بعد جهد. وكان يخاف أن تفاجأه منيته وهو في حال الأعراض، فيفضي إلى الشقاء الدائم، وألم الحجاب.
182
+
183
+ فساءه حاله ذلك، وأعياء الدواء. فجعل يتصفح أنواع الحيوانات كلها، وينظر أفعالها وما تسعى فيه، لعله يتفطن في بعضها أنها شعرت بهذا الموجود، وجعلت تسعى نحوه، فيتعلم منها ما يكون في سبب نجاته. فرآها كلها إنما تسعى في تحصيل غذائها، ومقتضى شهواتها من المطعوم والمشروب والمنكوح، والاستظلال والاستدفاء، وتجد في ذلك ليلها ونهارها إلى حين مماتها وانقضاء مدتها. ولم ير شيئاً منها ينحرف عن هذا الرأي، ولا يسعى لغيره في وقت من الأوقات، فبان له بذلك أنها لم تشعر بذلك الموجود ولا اشتاقت إليه، ولا تعرفت إليه بوجه من الوجوه، وأنها كلها صائرة إلى العدم، أو إلى حال شبيه بالعدم. فلما حكم على ذلك بالحيوان، علم أن الحكم على النبات أولى، إذ ليس للنبات من الادراكات إلا بعض ما للحيوان. وإذا كان الأكمل إدراكاً لم يصل إلى هذه المعرفة، فالأنقص إدراكاً أحرى أن لا يصل، مع انه رأى أيضاً أن أفعال النبات كلها لا تتعدى الغذاء والتوليد. ثم انه بعد ذلك نظر إلى الكواكب والأفلاك فرآها كلها منتظمة الحركات، جارية على نسق؛ ورآها شفافة ومضيئة بعيدة عن قبول التغيير والفساد، فحدس حدساً قوياً أن لها ذوات سوى أجسامها، تعرف ذلك الموجود الواجب الوجود، وأن تلك الذوات العارفة ليست بأجسام، ولا منطبعة في أجسام مثل ذاته، هو، العارفة، وكيف لا يكون لها مثل تلك الذوات البريئة عن الجسمانية، ويكون لمثله على ما به من الضعف وشدة الاحتياج إلى الأمور المحسوسة، وأنه من جملة الأجسام الفاسدة؟ ومع ما به من النقص، فلم يعقه ذلك عن أن تكون ذاته بريئة عن الأجسام لا تفسد، فتبين له بذلك أن الأجسام السماوية أولى بذلك، وعلم أنها تعرف ذلك الموجود الواجب الوجود وتشاهد على الدوام بالفعل، لأن العوائق التي قطعت به هو عن الدوام المشاهدة من العوارض المحسوسة، لا يوجد مثلها للأجسام السماوية.
184
+
185
+ ثم انه تفكر: لم اختص هو من بين سائر أنواع الحيوانات بهذه الذات التي أشبه بها الأجسام السماوية. وقد كان تبين له أولاً من آمر العناصر واستحالة بعضها إلى بعض، وأن جميع ما على وجه الأرض لا يبقى على صورته؛ بل الكون والفساد متعاقبان عليه أبداً، وأن أكثر هذه الأجسام مختلطة مركبة من أشياء متضادة، ولذلك تؤول إلى الفساد، وانه لا يوجد منه شيء صرفاً، وما كان منها قريباً من أن يكون صرفاً خالصاً لا شائبة فيه، فهو بعيد عن الفساد جداً مثل الذهب والياقوت، وأن الأجسام البسيطة صرفة، ولذلك هي بعيدة عن الفساد، والصور لا تتعاقب عليها. وتبين له هنالك أن جميع الأجسام التي في عالم الكون والفساد، منها ما تتقوم حقيقتها بصورة واحدة زائدة على معنى الجسمية - وهذه هي الاسطقسات الأربع - ومنها ما تتقوم حقيقتها أكثر من ذلك كالحيوان والنبات. فما كان قوام حقيقته بصور أقل، كانت أفعاله أقل، وبعده عن الحياة أكثر، فان عدم الصورة جملة لم يكن فيه إلى الحياة طريق، وصار في حال شبيه بالعدم، وما كان قوام حقيقته بصور أكثر، كانت أفعاله أكثر، ودخوله في حال الحياة أبلغ؛ وان كانت تلك الصورة بحيث لا سبيل إلى مفارقتها لمادتها التي اختصت بها كانت الحياة حينئذ كامل الظهور والكمال والقوة. فالشيء العديم للصورة جملة هو الهيولى والمادة، ولا شيء من الحياة فيها وهي شبيهة بالعدم، والشيء المتقوم بصورة واحدة هي الاسطقسات الأربع وهي في أول مراتب الوجود في عالم الكون والفساد ومنها تتركب الأشياء ذوات الصور الكثيرة. وهذه الاسطقسات ضعيفة الحياة جداً، إذ ليست تتحرك إلا حركة واحدة، وانما كانت ضعيفة الحياة لان لكل واحد منها ضداً ظاهر العناد يخالفه في مقتضى طبيعته، ويطلب أن يغير صورته.
186
+
187
+ فوجوده لذلك غير متمكن، وحياته ضعيف، والبات أقوى حياة منه والحيوان أظهر حياة منه. وذلك أن ما كان من هذه المركبات تغلب عليه طبيعة أسطقس واحد، فلقوته فيه يغلب طبائع الاسطقسات الباقية، ويبطل قواها، ويصير ذلك المركب في حكم الاسطقس الغالب، فلا يستأهل لاجل ذلك من الحياة آل شيئا يسيراً، كما إن ذلك الاسطقس لا يستأهل من الحياة إلا يسيراً ضعيفاً وما كان من هذه المركبات لا تغلب عليه طبيعة أسطقس واحد منها، فان الاسطقسات تكون فيه متعادلة متكافئة، فإذن لا يبطل لأحدهما الآخر قوة الآخر بأكثر مما يبطل ذلك الآخر قوته، بل يفعل بعضها في بعض فعلاً متساوياً، فلا يكون فعل أحد الاسطقسات أظهر فيه، ولا يستولي عليه أحدها، فيكون بعيد الشبه من كل واحد من الاسطقسات، فكأنه لا مضادة لصورته، فيستأهل الحياة بذلك. ومتى زاد هذا الاعتدال وكان أتم وأبعد من الانحراف، كان بعده عن أن يوجد له ضد أكثر، وكانت حياته أكمل. ولما كان الروح الحيواني الذي مسكنه القلب، شديد الاعتدال، لانه ألطف من الأرض والماء وأغلظ من النار والهواء، صار في حكم الوسط ولم يضاده شيء من الاسطقسات مضادة بينه.
188
+
189
+ فاستعد بذلك الصورة الحيوانية، فرأى أن الواجب إلى ذلك أن يكون أعدل ما في هذه الأرواح الحيوانية مستعداً لاتمم ما يكون من الحياة في عالم الكون والفساد، وأن يكون ذلك الروح قريباً من أن يقال أنه لا ضد لصورته، فيشبه لذلك هذه الأجسام السماوية التي لا ضد لصورها؛ ويكون روح ذلك الحيوان، وكأنه وسط بالحقيقة بين الاسطقسات التي لا تتحرك إلى جهة العلو على الإطلاق، ولا إلى جهة السفل، بل لو أمكن أن يجعل في وسط المسافة بين المراكز وأعلى ما تنتهي إليه النار في جهة العلو ولم يطرأ عليه الفساد، لثبت هناك ولم يطلب الصعود ولا نزول. ولو تحرك في المكان، لتحرك حول الوسط كما تتحرك الأجسام السماوية، ولو تحرك في الوضع، لتحرك على نفسه، وكان كروي الشكل إذ لا يمكن غير ذلك، فإذن هو شديد الشبه بالأجسام السماوية. ولما كان قد اعتقد أن أحوال الحيوان، ولم ير فيها ما يظن به انه شعر بالموجود الواجب الوجود، وقد كان علم من ذاتها قد شعرت به، قطع ذلك على أنه هو الحيوان المعتدل الروح، الشيبة بالأجسام السماوية وتبين لو انه نوع مباين لسائر الحيوان، وانه إنما خلق لغاية أخرى، وأعد لامر عظيم، لم يعد له شيء من أنواع الحيوان، وكفى به شرفاً أن يكون أحس جزأيه - وهو الجسماني - أشبه الأشياء بالجواهر السماوية الخارجة عن عالم الكون والفساد، المنزهة عن الحوادث النقص والاستحالة والتغيير. وأما أشرف جزأيه، فهو الشيء الذي به عرف الموجود الواجب الوجود، وهذا الشيء العارف، أمر رباني الهي يستحيل ولا يلحقه الفساد، ولا يوصف بشيء مما توصف به الأجسام، ولا يدرك بشيء من الحواس، ولا يتخيل، ولا يتوصل إلى معرفته بآلة سواه، بل يتوصل إليه به؛ فهو العارف والمعروف، والمعرفة؛ وهو العالم، والمعلوم، والعلم؛ لا يتباين في شيء من ذلك، إذ التباين والانفصال من صفات الأجسام ولواحقها، ولا جسم هنالك ولا صفة جسم ولا لاحق بجسم! فلما تبين له الوجه الذي اختص به من بين سائر أصناف الحيوان بمشابهة الأجسام السماوية، رأى إن الواجب عليه أن يتقبلها ويحاكي أفعالها ويتشبه بها جهده. وكذلك رأى أنه بجزئه الاشرف الذي به عرف الموجود الواجب الوجود، فيه شبه ما منه من حيث هو منزه عن صفات الأجسام، وكما أن الواجب الوجود منزه عنها، فرأى ايضاً انه يجب عليه أن يسعى في تحصيل صفاته لنفسه من أي وجه أمكن، وان يتخلق بأخلاقه ويقتدي بأفعاله، ويجد في تنفيذ إرادته، ويسلم الآمر له، ويرضى بجميع حكمه، رضى من قلبه ظاهراً وباطناً، بحيث يسر به وان كان مؤلماً لجسمه وضاراً به ومتلفتاً لبدنه بالجملة. وكذلك رأى فيه شبهاً من سائر أنواع الحيوان بجزئه الخسيس الذي هو من عالم الكون والفساد، وهو البدن المظلم والكثيف، الذي يطالبه بأنواع المحسوسات من المطعوم والمشروب والمنكوح، ورأى أيضاً أن ذلك البدن لم يخلق له عبثاً ولا قرن به لامر باطل، ويجب عليه أن يتفقده ويصلح من شأنه. هذا التفقد لا يكون منه إلا بفعل يشبه أفعال سائر الحيوان. فاتجهت عنده الأعمال التي يجب عليه أن يفعلها نحو ثلاثة أغراض: أما عمل يتشبه بالحيوان الغير الناطق.
190
+
191
+ واما عمل يتشبه به بالأجسام السماوية. واما عمل يتشبه به بالموجود الواجب الوجود. فالتشبه الأول: يجب عليه من حيث البدن المظلم ذو الأعضاء المنقسمة، والقوى المختلفة، والمنازع المتفننة. والتشبه الثاني: يجب عليه من حيث له الروح الحيواني الذي مسكنه القلب، وهو مبدأ لسائر البدن، ولما فيه من القوى. والتشبه الثالث: يجب عليه من حيث هو، أي: من حيث هو الذات التي بها عرف ذلك الموجود الواجب الوجود. وكان أولاً قد وقف على أن سعادته وفوزه من الشقاء، إنما هي في دوام المشاهدة لهذا الموجود الواجب الوجود، حتى يكون بحيث لا يعرض بطرفة عين. ثم أنه نظر بالوجه الذي يتأتى له به هذا الدوام، فأخر له النظر أنه يجب عليه الاعتمال في هذه الأقسام الثلاثة من التشبيهات: آما التشبه الأول، فلا يحصل له به شيء من هذه المشاهدة، بل هو صارف عنها وعائق دونها، إذ هو تصرف في الأمور المحسوسة، والأمور المحسوسة كلها حجب معترضة دون تلك المشاهدة؛ وانما احتيج إلى هذا التشبه لاستدامة هذا الروح الحيواني الذي يحصل به التشبه الثاني بالأجسام السماوية.
192
+
193
+ فالضرورة تدعو إليه من هذا الطريق،ولو كان لا يخلو من تلك المضرة. واما التشبه الثاني، فيحصل له به حظ عظيم من المشاهدة على الدوام، لكنها مشاهدة يخالطها شوب؛ اذ من يشاهد ذلك النحو من المشاهدة على الدوام فهو مع تلك المشاهدة يعقل ذاته ويلتفت إليه حسبما يتبين بعد هذا. واما التشبه الثالث، فتحصل به المشاهدة الصرفة، والاستغراق المحض الذي لا التفات فيه بوجه من الوجوه الا إلى الموجود الواجب الوجود، والذي يشاهد هذه المشاهدة قد غابت عنه ذات نفسه وفنيت وتلاشت. وكذلك سائر الذوات، كثيرة كانت أو قليلة، إلا ذات الواحد الحق الواجب الوجود - جل وتعالى وعز. فلما تبين له أن مطلوبه الأقصى هو هذا التشبه الثالث، وأنه لا يحصل له إلا بعد التمرن والاعتمال مدة طويلة في التشبه الثاني، وان هذه المدة لا تدوم له بالتشبه الأول، وعلم أن التشبه الأول - وان كان ضرورياً، فانه عائق بذاته وان كان معيناً بالعرض لا بالذات لكنه ضروري- فألزم نفسه أن لا يجعل لها حظاً من هذا التشبه الأول، إلا بقدر الضرورة، وهي الكفاية التي لا بقاء للروح الحيواني بأقل منها. ووجد ما تدعو إليه الضرورة في بقاء هذا الروح أمرين: أحدهما: ما يمده من الداخل، ويخلف عليه بدل ما يتخلل منه وهو الغذاء. والأخر: ما يقيه من الخارج، ويدفع عنه وجوه الأذى: من البرد والحر والمطر ولفح الشمس والحيوانات المؤذية ونحو ذلك. ورأى أنه إن تناول ضرورية من هذه جزافاً كيفما اتفق، ربما وقع في السرف واخذ فوق الكفاية. فكان سعيه على نفسه من حيث لا يشعر، فرأى أن الحزم له أن يفرض لنفسه فيها حدوداً لا يتعداها، ومقادير لا يتجاوزها، وبأن له الفرض يجب أن يكون في جنس ما يتغذى به. وأي شيء يكون وفي مقداره وفي المدة التي تكون بين العبادات إليه. فنظر أولاً إلى أجناس ما به يتغذى، فرآها ثلاثة أضرب: أولاً: أما نبات لم يكمل بعد نضجه ولم ينته إلى غاية تمامه، وهي أصناف البقول الرطبة التي يمكن الاغتذاء بها.
194
+
195
+ ثانياً: واما ثمرات النبات الذي تم وانتهى وأخرج بذرة ليتكون منه أخر من نوعه حفظاً له، وهي أصناف الفواكه رطبها ويابسها. ثالثاً: واما حيوان من الحيوانات التي يتغذى بها: أما البرية واما البحرية. وكان قد صح عنده أن هذه الأجناس كلها، من فعل ذلك الموجود الواجب الوجود الذي تبين له أن سعادته في القرب منه، وطلب التشبه به، ولا محالة أن الاغتذاء بها مما يقطعها عن كمالها ويحول بينها وبين الغاية القصوى المقصودة بها. فكان ذلك اعتراض على فعل الفاعل. وهذا الاعتراض مضاد لما يطلبه من القرب منه والتشبه به. فرأى أن الصواب كان له لو أمكن أن يمتنع عن الغذاء جملة واحدة، لكنه لما لم يمكنه ذلك، لانه أن امتنع عنه أل ذلك إلى فساد جسمه، فيكون ذلك اعتراضاً على فاعله أشد من الأول، إذ هو أشرف من تلك الأشياء الآخر التي يكون فسادها سبباً لبقائه.
196
+
197
+ فاستهل أيسر الضررين، وتسامح في اخف الاعتراضين، ورأى إن يأخذ من هذه الأجناس إذا عدمت آيها تيسر له، بالقدر الذي يتبين له بعد هذا. فأما إن كانت كلها موجودة فينبغي له حينئذ إن يتثبت ويتخير منها ما لم يكن في أخذه كبير اعتراض على فعل فاعل، وذلك مثل لحوم الفواكه التي قد تناهت في الطيب، وصلح ما فيها لتوليد البزر على الشرط التحفظ على ذلك البزر، بان لا يأكله ولا يفسده ولا يلقيه في موضع لا يصلح للنبات، مثل الصفاة والسبخة ونحوهما. فان تعذر عليه وجود مثل هذه الثمرات ذات الطعم الغاذي، كالتفاح والكمثرى والأجاص ونحوها، كان له عند ذلك إن يأكل آما الثمرات التي لا يغذو منها إلا نفس البزر، كالجوز والقسطل، واما من البقول التي لم تصل بعد حد كمالها. والشرط عليه في هذين لأن يقصد أكثرها وجوداً وأقواها توليداً، وان لا يستأصل أصولها ولا يفني بزرها. فان عدم هذه، فله أن يأخذ من الحيوان آو من بيضه، والشرط عليه من الحيوان إن يأخذ من أكثره وجوداً، ويستأصل منه نوعاً بأسره. هذا ما رأى في جنس ما يتغذى به. واما المقدر فرأى أن يكون بحسب ما يسد خلة الجوع ولا يزيد عليها. واما الزمان الذي بين كل عودتين، فرأى انه إذا اخذ حاجته من الغذاء، أن يقيم عليه ولا يتعرض لسواه، حتى يلحقه ضعف يقطع به بعض الأعمال التي تجب عليه في التشبه الثاني، وهي التي يأتي ذكرها بعد هذا. فأما ما تدعو إليه الضرورة في بقاء الروح الحيواني مما يقيه من خارج، فكان الخطب فيه يسيراً: إذ كان مكتسياً بالجلود، وقد كان له مسكن يقيه مما يرد عليه من خارج، فاكتفى بذلك ولم يرى الاشتغال به، والتزم في غذائه القوانين التي رسمها لنفسه، وهي التي تقدم شرحها. ثم اخذ في العمل الثاني، وهو التشبه بالأجسام السماوية والاقتداء بها، والتقبل أوصافها، فانحصرت عنده في ثلاثة أضرب: الضرب الأول: أوصاف لها بالإضافة إلى ما تحتها من عالم الكون والفساد، وهي ما تعطيه إياه من التسخين بالذات، آو التبريد بالعرض، والإضاءة والتلطيف والتكثيف، إلى سائر ما تفعل فيه من الأمور التي بها يستعد لفيضان الصور الروحانية عليه من عند الفاعل الواجب الوجود. والضرب الثاني: أوصاف لها في ذاتها، مثل كونها شفافة وناصعة وطاهرة منزهة عن الكدر وضروب الرجس، ومتحركة بالاستدارة بعضها على مركز نفسها، وبعضها على مركز غيرها.
198
+
199
+ والضرب الثالث: أوصاف لها بالإضافة إلى الموجود الواجب الوجود، مثل كونها تشاهد مشاهدة دائمة، وتعرض عنه، وتتشوق إليه، وتتصرف بحكمه، وتتسخر في تتميم إرادته، ولا تتحرك إلا بمشيئته وفي قبضته. فجعل يتشبه بها جهده في كل من هذه الاضرب الثلاثة. آما الضرب الأول: فكان تشبه بها فيه: إن ألزم نفسه إن لا يرى ذا حاجة آو عاهة آو مضرة، أو ذا عائق من الحيوان أو النبات، وهو يقدر على أزالتها عنه إلا ويزيلها. فمتى وقع بصره على نبات قد حجبه عن الشمس حاجب آو تعلق به نبات آخر يؤذيه، أو عطش عطشاً يكاد يفسده، أزال عنه ذلك الحاجب إن كان ما يزال، وفصل بينه وبين ذلك المؤذي بفاصل لا يضر المؤذي، وتهده بالسقي ما أمكنه. ومتى وقع بصره على حيوان قد أرهقه سبع آو نشب به ناشب، آو تعلق به شوك، آو سقط على عينيه آو آذنيه شيء يؤذيه، آو مسه ظمأ آو جوع، تكفل بإزالة ذلك كله عنه جهده واطعمه وسقاه. ومتى وقع بصره على ماء يسيل إلى سقي نبات أو حيوان وقد عاقه عن ممره ذلك عائق، من حجر سقط فيه، آو جرف انهار عليه، ازال ذلك كله عنه. وما زال يمعن في هذا النوع من ضروب التشبه حتى بلغ فيه الغاية. واما الضرب الثاني: فكان تشبهه بها فيه إن الزم نفسه دوام الطهارة وإزالة الدنس والرجس عن جسمه والاغتسال بالماء في أكثر الأوقات، وتنظيف ما كان من أظافره واسنانه ومغابن بدنه، وتطيبها بما أمكن من طيبات النبات وصنوف الدهون العطرة، وتعهد لباسه بالتنظيف والتطييب حتى كان يتلألأ حسناً وجمالاً ونظافة وطيباً. والتزم مع ذلك ضروب الحركة على الاستدارة: فتارةً كان يطوف بالجزيرة، ويدور على ساحلها ويسيح باكنافها، وتارةً كان يطوف ببيته، او ببعض الكدى أدوارا معدوده: آما مشياً، آما هرولة؛ وتارة يدور على نفسه حتى يغشه عليه.
200
+
201
+ وأما الضرب الثالث: فكان تشبهه بها فيه، إن كان يلازم الفكرة في تلك الموجود الواجب الوجود، ثم يقطع علائق المحسوسات. ويغمض عينيه، ويسد أذنيه، ويضرب جهده عن تتبع الخيال، ويروم بمبلغ طاقته إن لا يفكر في شيء سواه، ولا يشترك به احداً ويستعين على ذلك بالاستدارة على نفسه والاستحثاث فيها.
202
+
203
+ فكان اذا اشتد في الاستدارة، غابت عنه جميع المحسوسات، وضعف الخيال وسائر القوى التي إلى الألأت الجسمانية، وقوي فعل ذاته - التي هي بريئة من الجسم - فكانت في بعض الأوقات فكرته قد تخلص عن الشوب ويشاهد بها الموجود الواجب الوجود، ثم تكر عليه القوى الجسمانية فتفسد عليه حاله، وترده إلى اسفل السافلين. ويعود من ذي قبل، فان لحقه ضعف يقطع به عن غرضه تناول بعض الأغذية عن الشرائط المذكورة. ثم انتقل إلى شأنه من التشبه بالأجسام السماوية بالأضرب الثلاثة المذكورة. ودأب على ذلك مدة وهو يجاهد قواه الجسمانية وتجاهده، وينازعها وتنازعه في الأوقات التي يكون له عليها الظهور، وتتخلص فكرته عن الشوب، يلوح له شيء من أحوال أهل التشبه الثالث.
204
+
205
+ ثم جعل يطلب التشبه الثالث، ويسعى في تحصيله، فينظر في صفات الموجود الواجب الوجود. وقد كان تبين له أثناء نظره العلمي قبل الشروع في العمل، إنها على ضربين: آما صفة ثبوت: كالعلم والقدرة والحكمة.
206
+
207
+ وأما صففة سلب: كتنزه عن الجسمانية وعن صفات الأجسام ولواحقها، وما يتعلق بها، ولو على بعد.
208
+
209
+ وأن صفات الثبوت يشترط فيها هذا التنزيه حتى لا يكون فيها شيء من صفات الأجسام التي من جملتها الكثرة، فلا تتكثر ذاته بهذه الصفات الثبوتية، ثم ترجع كلها إلى معنى واحد هي حقيقة ذاته. فجعل يطلب كيف يتشبه به في كل واحد من هذين الضربين. آما صفات الاجاب، فلما علم انها كلها راجعة إلى حقيقة ذاته، وانه لا كثرة فيها بوجه من الوجوه، إذ الكثرة من صفات الأجسام؛ وعلم إن علمه بذاته؛ ليس معنى زائداً على ذاته، بل ذاته هي علمه لذاته؛ وعلمه بذاته هو ذاته، تبين له انه إن أمكنه هو إن يعلم ذاته، فليس ذلك العلم الذي علم به ذاته معنى زائداً على ذاته، بل هو هو! فرأى إن التشبه به من صفات الاجاب، هو ان يعلمه فقط دون إن يشرك به شيئاً من صفات الأجسام؛ فاخذ نفسه بذلك. واما صقات السلب، فانها كلها راجعة إلى التنزه عن الجسمية. فجعل يطرح اوصاف الجسمية عن ذاته. وكان قد طرح منها كثيراً في رياضته المتقدمة التي كان ينحو بها بالتشبه بالأجسام السماوية. إلا انه أبقى منها بقايا كثيرة: كحركة الاستدارة - والحركة من أخص صفات الأجسام - وكل الاعتناء بأمر الحيوان والنبات والرحمة لها، والاهتمام بإزالة عوائقها. فان هذه أيضاً من صفات الأجسام، إذ لا يراها أولاً إلا بقوة جسمانية، ثم يكدح بأمرها بقوة جسمانية أيضاً. فاخذ في طرح ذلك كله عن نفسه، إذ هي بجملتها مما لا يليق بهذه الحالة التي يطلبها الآن.
210
+
211
+ وما زال يقتصر على السكون في قصر مغارته مطرقاً، غاضاً بصره، معرضاً عن جميع المحسوسات والقوى الجسمانية، مجتمع الهم والفكرة في الموجود الواجب الوجود وحده دون شركه؛ فمتى سنح بخياله سانح سواه، طرده عن خياله جهده، ودافعه وراض نفسه على ذلك، ودأب فيه مدة طويلة، بحيث تمر عليه عدة أيام لا يتغذى فيها ولا يتحرك. وفي خلال شدة مجاهدته هذه ربما كانت تغيب عن ذكره وفكره جميع الأشياء إلا ذاته، فانها كانت لا تغيب عنه في وقت استغراقه بمشاهدة الموجود الأول الحق الواجب الوجود.
212
+
213
+ فكان يسوءه ذلك، ويعلم انه شوب في المشاهدة المحضة، وشركه في الملاحظة. ومازال يطلب الفناء عن نفسه والإخلاص في مشاهدة الحق حتى تأتى له ذلك، وغابت عن ذكره وفكره السموات والأرض وما بينهما، وجميع الصور الروحانية والقوى الجسمانية، وجميع القوى المفارقة للمواد، والتي هي الذوات العارفه بالموجود الحق؛ وغابت ذاته في جملة تلك الذوات، وتلاشى الكل واضمحل، وصار هباءً منثوراً، ولم يبقى إلا الواحد الحق الموجود الثابت الوجود.
214
+
215
+ وهو يقول بقوله الذي ليس معنى زائداً على ذاته: "بسم الله الرحمن الرحيم" لمن الملك اليوم لله الواحد القهار صدق الله العظيم ففهم كلامه وسمع ندائه ولم يمنعه عن فهمه كونه لا يعرف الكلام، ولا يتكلم.
216
+
217
+ واستغرق في حالته هذه وشاهد ما لا عين رأت ولا إذن سمعت! ولا خطر على قلب بشر. فلا تعلق قلبك بوصف آمر لم يخطر على قلب بشر، فان كثيراً من الأمور التي تخطر على قلوب البشر قد يتعذر وصفه، فكيف بأمر لا سبيل إلى خطورة على القلب، ولا هو من عالمه ولا من طوره!؟ ولست أعني بالقلب جسم القلب، ولا الروح التي في تجويفه بل أعني صورة تلك الروح الفائضة بقواها على بدن الإنسان، فان كل واحد من هذه الثلاثة قد يقال له قلب ولكن لا سبيل لخطور ذلك الآمر على واحد من هذه الثلاثة، ولا يتأتى التعبير إلا عما الخطر علها.
218
+
219
+ ومن رام التعبير عن تلك الحال، فقد رام مستحيلاً وهو بمنزلة من يريد أن يذوق الألوان من حيث هي الألوان، ويطلب أن يكون السواد مثلاً حلواً أو حامضاً.
220
+
221
+ لكنا، مع ذلك، لا نخيلك عن إشارات نومئ بها إلى ما شاهده من عجائب ذلك المقام، على سبيل ضرب المثل، لا على سبيل قرع باب الحقيقية. إذ لا سبيل إلى التحقق بما في ذلك المقام إلا بالوصول إليه.
222
+
223
+ فأصغ الآن بسمع قلبك، وحدق ييصر إلى ما أشير به اليك لعلك أن تجد منه هدياً يلقيك على جادة الطريق! وشرطي عليك أن لا تطلب مني في هذا الوقت مزيد بيان بالمشافهة على ما أودعه هذه الاوراق فان المجال ضيق، والتحكم بالألفاظ على آمر ليس من شأنه أن يلفظ به خطر.
224
+
225
+ فأقول: انه لما فني عن ذاتهوعن جميع وعن جميع الذوات ولم ير في الوجود إلا الواحد القيوم، وشاهد ما شاهد، ثم عاد إلى ملاحظة الاغيار عندما آفاق من حالة تلك التي شبيه بالسكر، خطر بباله انه لا ذات له يغاير بها ذات الحق تعالى، وان حقيقة ذاته هي ذات الحق، وان الشيء الذي كان يظن أولاً انه ذات المغايرة لذات الحق، ليس شيئاً في الحقيقة، بل ليس ثم شيء إلا ذات الحق، وان ذلك بمنزلة نور الشمس الذي يقع على الأجسام الكثيفة فتراه يظهر فيها.
226
+
227
+ فإنه وإن نسب إلى الجسم الذي يظهر فيه، فليس هو في الحقيقية شيئاً سوى نور الشمس. وان زال ذلك الجسم زال نوره، وبقي نور الشمس بحاله لم ينقص عند حضور ذلك الجسم ولم يزد عند مغيبه.
228
+
229
+ ومتى حدث جسم يصلح لقبول ذلك النور، قبله، فإذا عدم الجسم عدم ذلك القبول، ولك يكن له معنى، عنده هذا الظن بما قد بان له من إن ذات الحق، عز وجل، لا تتكثر بوجهه من الوجوه، وأن علمه بذاته، وهو ذاته بعينها.
230
+
231
+ فلزم عنده من هذا أن حصل عنده العلم بذاته، فقد حصلت عنده ذاته، وقد كان حصل عنده العلم فحصلت عنده الذات.
232
+
233
+ وهذه الذات لا تحصل إلا عند ذاتها، ونفس حصولها هو الذات؛ فإذن هو الذات بعينها. وكذلك جميع الذوات المفارقة للمادة العارفة بتلك الذات الحقه التي كان يراها أولاً كثيرة، وصارت عنده بهذا الظن شيئاً واحداً. وكادت هذه الشبه ترسخ في نفسه لولا أن تداركه الله برحمته وتلافاه بهدايته، فعلم إن الشبهة انما ثارت عنده من بقايا ظلمة الأجسام، وكدورة المحسوسات. فان الكثير والقليل والواحد والوحدة، والجمع والاجتماع، والافتراق، هي كلها من صفات الأجسام، وتلك الذوات المفارقة العارفة بذات الحق، عز وجل، لبرائتها عن المادة، لا يجب إن يقال انها كثيرة، ولا واحدة، لان الكثرة انما هي مغايرة الذوات بعضها لبعض، والوحدة أيضاً لا تكون إلا بالاتصال. ولا يفهم شيء من ذلك إلا في المعاني المركبة المتلبسة بالمادة. غير إن العبارة في هذا الموضع قد تضيق جداً لانك إن عبرت عن تلك الذوات المفارقة بصيغة الجمع حسب لفظنا هذا، أوهم ذلك معنى الكثرة فيها، وهي بريئة عن الكثرة. وان أنت عبرت بصيغة الإفراد، اوهم ذلك معنى الاتحاد، وهو مستحيل عليها. وكأني بمن يقف على هذا الموضع من الخفافيش الذين تظلم الشمس في أعينهم يتحرك في سلسلة جنونه، ويقول: لقد افرطت في تدقيقك حتى انك قد انخلعت عن غريزة العقلاء، واطرحت حكم معقول، فان من أحكام العقل إن الشيء آما واحد واما كثير، فليتئد في غلوائه، وليكف من غرب لسانه وليتهم نفسه، وليعتبر بالعالم المحسوس الخسيس الذي هو أطباقه بنحو ما اعتبر به حي بن يقظان حيث كان بنظر فيه بنظر فيراه كثيراً كثرة لا تنحصر ولا تدخل تحت حد، ثم ينظر فيه بنظر آخر، فيراه واحداً. وبقي في ذلك متردداً ولم يكنه إن يقطع بأحد الوصفين دون الآخر. هذا فالعالم المحسوس منشأ الجمع والإفراد، وفيه الانفصال والاتصال، والتحيز والمغايرة، والاتفاق والاختلاف، فما ظنه بالعالم الإلهي الذي لا يقال فيه كل ولا بعض، ولا ينطق في أمره بلفظ من الألفاظ المسموعة، إلا وتوهم فيه شيء على خلاف الحقيقة، فلا يعرفه إلا من شاهده؛ ولا تثبت حقيقته إلا عند من حصل فيه. واما قوله: حتى انخلعت عن غريزة العقلاء، واطرحت حكم المعقول. فنحن نسلم له ذلك، ونتركه مع عقله وعقلائه، فان العقل الذي يعنيه هو أمثاله، انما هو القوة الناطقة التي تتصفح أشخاص الموجودات المحسوسة، وتقتنص منها المعنى الكلي. والعقلاء الذين يعنيهم، هم ينظرون من هذا النظر والنمط الذي كلامنا فيه فوق هذا كله، فليسد عنه سمعه من لا يعرف سوى المحسوسات وكلياتها، وليرجع إلى فريقه الذين "بسم الله الرحمن الرحيم" يعملون ظاهراً من الحياة الدنيا. وهم عن الآخرة هم غافلون. صدق الله العظيم. فان كنت ممن يقتنع بهذا النوع من التلويح والإشارة إلى ما في العالم الإلهي، ولا تحمل ألفاظاً من المعاني على ما جرت العادة بها في تحميلها إياه، فنحن نزيدك شيئاً مما شاهده حي بن يقظان في مقام أولي الصدق الذي تقدم ذكره، فتقول: انه بعض الاستغراق المحض، والفناء التام، وحقيقة الوصول، وشاهد للفلك الأعلى، الذي لا جسم له، ورأى ذاتاً بريئة عن المادة، ليست هي ذات الواحد الحق، ولا هي نفس الفلك، ولا هي غيرها؛ وكأنها صورة الشمس التي تظهر في مرآة من المرائي الصقيلة، فانها ليست هي الشمس ولا المرأة ولا غيرهما. وراى لذات ذلك الفلك المفارقة من الكمال والبهاء والحسن، ما يعظم عن إن يوصف بلسان، ويدق إن يكسى بحرف آو صوت، وراه في غاية من اللذة والسرور، والغبطة والفرح، بمشاهدة ذات الحق جل جلاله. وشاهد ايضاً للفلك الذي يليه، وهو فلك الكواكب الثابتة، ذاتاً بريئة عن المادة أيضاً، ليست هي ذات الواحد الحق، ولا ذات الفلك الأعلى المفارقة، ولا نفسه، ولا هي غيرها. وكأنها صورة الشمس التي تظهر في المرآة قد انعكست إليها من مرآة أخرى مقابلة للشمس، ورأى لهذه الذات ايضاً من البهاء والحسن واللذة مثل ما راى لتلك التي للفلك الأعلى. وشاهد ايضاً للفلك الذي يلي هذا، وهو فلك زحل ذاتاً مفارقة للمادة ليست هي شيئاً من الدواب التي شاهدها قبله ولا هي غيرها؛ وكأنها صورة الشمس التي تظهر في مرآة قد انعكست إليها الصورة من مرآة مقابلة للشمس؛ وراى لهذه الذات ايضاً مثل ما راى آمل قبلها من البهاء واللذة. ومازال يشاهد لكل فلك ذاتاً مفارقة بريئة عن المادة ليست هي شيئاً من الذوات التي قبلها ولا هي غيرها وكأنها صورة الشمس التي تنعكس من مرآة على مرآة، على رتب مرتبة بحسب ترتيب الأفلاك. وشاهد لكل ذات من هذه الذوات من الحسن والبهاء، واللذة والفرح، ما لا عين رأت، ولا أذن سمعت، ولا خطر على قلب بشر. إلى أن انتهى إلى عالم الكون والفساد، وهو جميعه حشو فلك القمر. فرأى له ذاتاً بريئة عن المادة ليست شيئاً من الذوات التي شاهدها قبلها، ولا هي سواها. ولهذه سبعون ألف وجه، في كل وجه سبعون ألف فم، في كل فم سبعون ألف لسان، يسبح بها ذات الواحد الحق، ويقدسها ويمجدها، لا يفتر؛ ورأى لهذه الذات، التي توهم فيها الكثرة وليست كثيرة، من الكمال واللذة، مثل الذي رآه لما قبلها. وكأن هذه الذات صورة الشمس التي تظهر في ماء مترجرج، وقد انعكست إليها الصورة من آخر المرايا التي انتهى إليها الانعكاس على الترتيب المتقدم من المرآة الأولى التي قابلت الشمس بعينها. ثم شاهد لنفسه ذاتاً مفارقة، لو جاز إن تتبعض ذات السبعين ألف وجه، لقلنا انها بعضها. ولولا إن هذه الذات حدثت بعد إن لم تكن، لقلنا إنها هي! ولولا اختصاصها ببدنه عند حدوثه، لقلنا إنها لم تحدث! وشاهد في هذه الرتبة ذواتاً، مثل ذاته، لاجسام كانت ثم اضمحلت، ولاجسام لم تزل معه في الوجود، وهي من الكثرة في حد بحيث لا تتناهى إن جاز أن يقال لها كثيرة، أو هي كلها متحدة إن جاز إن يقال لها واحدة. وراى لذاته ولتلك الذوات التي في رتبته من الحسن والبهاء واللذة غير المتناهية، ما لا عين رأت ولا أذن سمعت، ولا خطر على قلب بشر، ولا يصفه الواصفون، ولا يعقله إلا الواصلون العارفون. وشاهد ذواتاً كثيرة مفارقة للمادة كأنها مرايا صدئة، قد ران عليها الخبث، وهي مع ذلك مستدبرة للمرايا الصقيلة التي ارتسمت فيها صورة الشمس، ومولية عنها بوجوهها، وراى لهذه الذوات من القبح والنقص ما لم يقم بباله قط؛ وراها في ألام لا تنقضي، وحسرات لا تنمحي؛ قد أحاط بها سرادق العذاب، وأحرقتها نار الحجاب، ونشرت بمناشير بين الانزعاج والانجذاب. وشاهد هنا ذواتاً سوى هذه المعذبة تلوح ثم تضمحل، وتنعقد ثم تنحل، فتثبت فيها وأنعم النظر إليها، فرأى هولاً عظيماً وخطباً جسيماً، وخلقاً حثيثاً، وأحكاماً بليغة، وتسوية ونفخاً وإنشاء ونسخاً. فما هو إلا إن تثبت قليلاً، فعادت إليه حواسه، وتنبه من حاله تلك التي كانت شبيهة بالغشي، وزلت قدمه عن ذلك المقام، ولاح له العالم المحسوس، وغاب عنه العالم الإلهي: إذ لم يكن اجتماعهما في حال واحدة، إذ الأخرى والدنيا كضرتين، إن أرضيت احدهما أسخطت الأخرى، فان قلت يظهر مما حكيته من هذه المشاهدة، إن الذوات المفارقة إن كانت لجسم دائم الوجود لا يفسد، كالأفلاك، كانت هي دائمة الوجود؛ وان كانت لجسم يؤول إلى الفساد كالحيوان الناطق، فسدت هي واضمحلت وتلاشت، حسبما مثلث به في المرايا الانعكاس، فان الصورة لا ثبات لها إلا ثبات بثبات المرآة، فإذا فسدت المرآة صح فساد الصورة واضمحلت هي؛ فأقول لك: ما لأسرع ما نسيت العهد، وحلت عن الربط، ألم نقدم إليك إن مجال العبارة هنا ضيق، وان الألفاظ على كل حال توهم غير الحقيقة وذلك الذي توهمته إنما أوقعك فيه، إن جعلت المثال والممثل به على حكم واحد من جميع الوجوه. ولا ينبغي أن يفعل ذلك في أصناف المخاطبات المعتادة، فكيف ها هنا والشمس ونورها، وصورتها وتشكلها والمرايا والصور الحاصلة فيها، كلها أمور غير مفارقة للأجسام، ولا قوام لها إلا بها وفيها؟ فلذلك افتقرت في وجودها إليها وبطلت ببطلانها. واما الذوات الإلهية، والأرواح الربانية، فانها كلها بريئة عن الأجسام ولواحقها ومنزهة غاية التنزيه عنها، فلا ارتباط ولا تعلق لها بها، وسواء بالإضافة إليها بطلان الأجسام أو ثبوتها، ووجودها أو عدمها؛ وانما ارتباطها وتعلقها بذات الواحد الحق الموجود الواجب الوجود، الذي هو أولها ومبدؤها وسببها وموجدها، وهو يعطيها الدوام ويمدها بالبقاء والتسرمد؛ ولا حاجة بها إلى الأجسام بل الأجسام المحتاجة إليها. ولو جاز عدمها لعدمت الأجسام فانها هي مبديها، كما انه لو جاز إن تعدم ذات الواحد الحق - تعالى وتقدس عن ذلك؛ لا اله إلا هو! - لعدمت هذه الذوات كلها، ولعدمت الأجسام، ولعدم العالم الحسي بآسره، ولم يبق موجود، إذ الكل مرتبط بعضه ببعض. والعالم المحسوس وان كان تابعاً للعالم الإلهي، شبيه الظل له؛ والعالم الإلهي مستغن عنه وبريء منه فانه مع ذلك قد يستحيل فرض عدمه، إذ هو لا محالة تابع للعالم الإلهي، وانما فساده إن يبدل، لا إن يعدم بالجملة، وبذلك نطق الكتاب العزيز حيثما وقع هذا المعنى منه في تسيير الجبال وتسييرها كالعهن والناس كالفراش. وتكوير الشمس والقمر، وتفجيرالبحار يوم تبدل الارض غير الأرض والسموات. فهذا القدر هو الذي امكنني الآن أن أشير إليك به فيما شاهده حي بن يقظان في ذلك المقام الكريم فلا تلتمس الزيادة عليه من جهة الألفاظ فان ذلك كالمعتذر. واما تمام خبره - فسأتلوه عليك إن شاء الله تعالى: وهو انه لما عاد إلى العالم المحسوس، وذلك بعد جولا نه حيث جال، سئم تكاليف الحياة الدنيا، واشتد شوقه إلى الحياة الدنيا، واشتد شوقه إلى الحياة القصوى، فجعل يطلب العود إلى ذلك المقام بالنحو الذي طلبه أولاً حتى وصل إليه بأيسر من السعي الذي وصل به أولاً ودام فيه ثانياً مدة أطول من الأولى. ثم عاد إلى عالم الحس. ثم تكلف الوصول إلى مقامه بعد ذلك فكان ايسر عليه من الأولى والثانية وكان دوامه أطول. وما زال الوصول إلى ذلك المقام الكريم يزيد عليه سهولة، والدوام يزيد فيه طولاً مدة بعد مدة، حتى صار يصل إليه متى شاء، ولا ينفصل عنه إلا متى شاء؛ فكان يلازم مقامه ذلك ولا ينثني عنه إلا لضرورة بدنه التي كان قد قللها، حتى كان لا يوجد اقل منها. وهو في كل ذلك كله يريد إن يريحه الله عز وجل من كل بدنه الذي يدعوه إلى مفارقة مقامه ذلك، فيتخلص إلى لذته تخلصاً دائماً، ويبرأ عما يجده من الألم عند الأعراض عن مقامه ذلك إلى ضرورة البدن. وبقي على حالته تلك حتى أناف على سبعة أسابيع من منشئه وذلك خمسون عاماً. وحينئذ اتفقت له صحبة أسال وكان من قصته معه ما يأتي ذكره بعد هذا إن شاء الله تعالى. ذكروا: إن جزيرة قريبة من الجزيرة التي ولد بها حي بن يقظان على أحد القولين المختلفين على صفة مبدئه، انتقلت إليه ملة من الملل الصحيحة الماخوذه على بعض الأنبياء المتقدمين، صلوات الله عليهم. وكانت ملة محاكية لجميع الموجودات الحقيقية بالأمثال المضروبة التي خيالات تلك الأشياء، وتثبت رسومها في النفوس، حسبما جرت به العادة في مخاطبة الجمهور؛ فما زالت تلك الملة تنتشر بتلك الجزيرة وتقوى وتظهر، حتى قام بها ملكها وحمل الناس على التزامها. وكان قد نشأ بها فتيان من أهل الفضل والخير، يسمى أحدهما أسال والآخر سلامان فتلقيا هذه الملة وقبلاها احسن قبول، واخذ على أنفسهما على بالتزام جميع شرائعها والموظبة على جميع أعمالها، واصطحبا على ذلك. وكانا يتفقهان في بعض الأوقات فيما ورد من ألفاظ تلك الشريعة في صفة الله عز وجل وملائكته، وصفات الميعاد والثواب والعقاب. فأما أسال فكان أشد غوصاً على الباطن، وأكثر عثوراً على المعاني الروحانية واطمع في التأويل. واما سلامان صاحبه فكان أكثر احتفاظاً بالظاهر، وأشد بعداً عن التأويل، وأوقف عن التصرف والتأمل؛ وكلاهما مجد في الأعمال الظاهرة، ومحاسبة النفس، ومجاهدة الهوى. وكان في تلك الشريعة أقوال تحمل عن العزلة والانفراد، وتدل على إن الفوز والنجاة فيهما؛ واقوال أخر تحمل على المعاشرة وملازمة الجماعة. فتعلق أسال بطلب العزلة، ورجح القول فيها لما كان في طباعه من دوام الفكرة، وملازمة العبرة، والغوص على المعاني، وأكثر ما كان يتأتى له أمله من ذلك بالانفراد. وتعلق سلامان بملازمة الجماعة، ورجح القول فيها لما كان في طباعه من الجبن عن الفكرة والتصرف. فكانت ملازمته الجماعة عنده مما يدرأ الوسواس، ويزيل الظنون المعترضة ويعيد من همزات الشياطين. وكان اختلافهما في هذا الرأي سبب افتراقهما. وكان أسال قد سمع عن الجزيرة التي ذكر أن حي بن يقظان تكون بها وعرف ما بها من الخصب والمرافق والهواء المعتدل، وان الانفراد بها يتأتى لملتمسه، فأجمع إن يرتحل إليها ويعتزل الناس بها بقية عمره. فجمع ما كان له من المال، واشترى ببعضه مركباً تحمله إلى تلك الجزيرة، وفرق باقيه على المساكين، وودع صاحبه سلامان وركب متن البحر؛ فحمله الملاحون إلى تلك الجزيرة؛ ووضعوه بساحلها؛ وانفصلوا عنها. فبقي أسال بتلك الجزيرة يعبد الله عز وجل؛ ويعظمه ويقدسه؛ ويفكر في اسمائه الحسنى وصفاته العليا؛ فلا ينقطع خاطره؛ ولا تتكدر فكرته. واذا احتاج إلى غذاء تناول من ثمرات تلك الجزيرة وصيدها ما يسد بها جوعته. وأقام على تلك الحال مدة وهو في أتم غبطة وأعظم أنس بمناجاة ربه. وكان كل يوم يشاهد من ألطافه ومزايا تحفة وتيسره عليه في مطلبه وغذائه ما يثبت يقينه ويقر عينه. وكان في تلك المدة حي بن يقظان شديد الاستغراق في مقاماته الكريمة؛ فكان لا يبرح عن مغارته إلا مرة في الاسبوع لتناول ما سنح من الغذاء، فلذلك لم يعثر عليه أسال لأول وهلة، بل كان يتطوف بأكناف تلك الجزيرة ويسبح في أرجائها، فلا يرى أنسياً ولا يشاهد أثراً فيزيد بذلك أنسه وتنبسط نفسه لما كان قد عزم عليه من التناهي في طلب العزلة والانفراد. إلى إن اتفق في بعض تلك الأوقات إن خرج حي بن يقظان لالتماس غذائه وأسال قد ألم بتلك الجهة، فوقع بصر كل منهما على الآخر. فإما أسال فلم يشك أنه من العباد المنقطعين، وصل تلك الجزيرة لطلب العزلة عن الناس كما وصل هو إليها. فخشي إن هو تعرض له وتعرف به إن يكون سبباً في فساد حاله وعائقاً بينه وبين أمله. واما حي بن يقظان فلم يدر ما هو، لانه لم يره على صورة شيء من الحيوانات التي كان قد عاينها قبل ذلك. وكان عليه مدرعة سوداء من الشعر والصوف، فظن إنها لباس طبيعي. فوقف يتعجب منه ملياً. وولى أسال هارباً منه خيفة أن يشغله عن حاله، فاقتفى حي بن يقظان أثره لما كان في طباعه من البحث عن الحقائق. فلما رآه يشتد في الهرب. خنس عنه وتوارى له، حتى ظن أسال انه قد انصرف عنه وتباعد من تلك الجهة. فشرع أسال في الصلاة والقراءة، والدعاء والبكاء، والتضرع والتواجد، حتى شغله ذلك عن كل شيء. فجعل حي بن يقظان يتقرب منه قليلاً قليلاً، وأسال لا يشعر به حتى دنا منه بحيث يسمع قراءته وتسبيحه، ويشاهد خضوعه وبكائه. فسمع صوتاً حسناً وحروف منظمة، لم يعهد مثلها من شيء من أصناف الحيوان. ونظر إلى أشكاله وتخطيطه فرآه على صورته، وتبين له أن المدرعة التي عليه ليست جلداً طبيعياً، وانما هي لباس متخذ مثل لباسه هو، ولما رأى حسن خشوعه وتضرعه وبكائه لم يشك في انه من الذوات العارفة بالحق؛ فتشوق إليه واراد إن يرى ما عنده، وما الذي أوجب بكاءه وتضرعه؛ فزاد في الدنو منه حتى أحس به أسال؛ فاشتد في العدو، واشتد حي بن يقظان في أثره حتى التحق به - لما كان أعطاه الله من القوة والبسطة في العلم والجسم - فالتزمه وقبض عليه؛ ولم يمكنه من البراح. فلما نظر إليه أسال وهو مكتس بجلود الحيوان ذوات الاوبار؛ وشعره قد طال حتى جلل كثيراً منه، ورأى ما عنده من سرعة العدو وقوة البطش، فرق منه فرقاً شديداً، وجعل يستعطفه ويرغب إليه بكلام لا يفهمه حي بن يقظان ولا يدري ما هو، غير أنه يميز فيه شمائل الجزع. فكان يؤنسه بأصوات كان قد تعلمها من الحيوانات، ويجر يده على رأسه، ويمسح أعطافه. ويتملق إليه، ويظهر البشر والفرح به. حتى سكن جأش أسال وعلم أنه لا يريد به سوءاً. كان أسال قديماً لمحبته في علم التأويل. قد تعلم أكثر الألسن، ومهر فيها. فجعل يكلم حي بن يقظان ويسائله عن شأنه بكل لسان يعلمه ويعالج أفهامه فلا يستطيع، وحي بن يقظان في ذلك كله يتعجب مما يسمع ولا يدري ما هو. غير أنه يظهر له البشر والقبول. فاستغرب كل واحد منهما أمر صاحبه. وكان عند أسال من زاد كان قد اصطحبه من الجزيرة المعمورة، فقربه إلى حي بن يقظان فلم يدر ما هو، لانه لم يكن شاهده قبل ذلك. فأكل منه أسال وأشار إليه ليأكل ففكر حي بن يقظان فيما كان ألزم نفسه من الشروط لتناول الغذاء، ولم يدر اصل ذلك الشيء الذي قدم له ما هو، وهل يجوز له تناوله أم لا! فامتنع عن الآكل. ولم يزل أسال يرغب إليه ويستعطفه. وقد كان اولع به حي بن يقظان فخشي إن دام على امتناعه إن يوحشه، فاقدم على ذلك الزاد وأكل منه. فلما ذاقه واستطابه بدا له سوء ما صنع من نقض عهوده في شرط غذاء، وندم على فعله، وأراد الانفصال عن أسال والإقبال على شأنه من طلب الرجوع إلى مقامه الكريم، فلما تتأت له المشاهدة بسرعة. فرأى أن يقيم مع أسال في عالم الحس حتى يقف على حقيقة شأنه، ولا يبقي في نفسه هو نزوع إليه، وينصرف بعد ذلك إلى مقامه دون إن يشغله شاغل. فالتزم صحبة أسال ولما رأى أسال أيضاً انه لا يتكلم، آمن من غلوائه على دينه، ورجا أن يعلمه الكلام والعلم والدين، فيكون له بذلك أعظم أجر وزلفى عند الله. فشرع أسال في تعليمه الكلام أولاً بأن كان يشير له إلى أعيان الموجودات وينطق بأسمائها ويكرر ذلك عليه ويحمله على النطق، فينطق بها مقترناً بالاشارة، حتى علمه الأسماء كلها، ودرجه قليلاً قليلاً حتى تكلم في أقرب مدة. فجعل أسال يسأله عن شأنه ومن أين صار إلى تلك الجزيرة، فأعلمه حي بن يقظان انه لا يدري لنفسه ابتداء ولا أباً ولا أماً أكثر من الظبية التي ربته، ووصف له شأنه كله وكيف ترقى بالمعرفة، حتى انتهى إلى درجة الوصول.
234
+
235
+ فلما سمع أسال منه وصف تلك الحقائق والذوات المفارقة لعالم الحس العارفة بذات الحق عز وجل، ووصفه ذلك الحق تعالى وجل بأوصافه الحسنى، ووصف له ما أمكنه وصفه مما شاهده عند الوصول من لذات الواصلين وألام المحجوبين، لم يشك أسال في أن جميع الأشياء التي وردت في شريعته من أمر الله عز وجل، وملائكته، وكتبه، ورسله، واليوم الآخر، وجنته وناره، هي أمثلة هذه التي شاهدها حي بن يقظان؛ فانفتح بصر قلبه وانقدحت نار خطره وتطابق عنده المعقول والمنقول، وقربت عليه طرق التأويل، ولم يبق عليه مشكل في الشرع إلا تبين له، ولا مغلق إلا انفتح، ولا غامض إلا اتضح، وصار من أولى الألباب. وعند ذلك نظر إلى حي بن يقظان بعين التعظيم والتوقير، وتحقق عنده أنه من أولياء الله الذين لا خوف عليهم ولا هم يحزنون. فالتزم خدمته والاقتداء به بإشارته فيما تعارض عنده من الأعمال الشرعية التي قد تعلمها في ملته. وجعل حي بن يقظان يستفصحه عن أمره وشأنه، فجعل أسال يصف له شأن جزيرته وما فيها من العالم، وكيف كانت سيرهم قبل وصول الملة اليهم.
236
+
237
+ وكيف هي الآن بعد وصولها إليهم، وصف له جميع ما ورد في الشريعة من وصف العالم الإلهي، والجنة والنار، والبعث والنشور، والحشر والحساب، والميزان والصراط. ففهم حي بن يقظان ذلك كله ولم ير فيه شيء على خلاف ما شاهده في مقامه الكريم. فعلم أن الذي وصف ذلك وجاء به محق في وصفه، صادق في قوله، ورسول من عند ربه؛ فأمن به وصدقه وشهد برسالته.
238
+
239
+ ثم جاء يسأله عما جاء به من الفرائض، ووضعه من العبادات؛ فوصف له الصلاة والزكاة، والصيام والحج، وما أشبهها من الأعمال الظاهرة؛ فتلقى ذلك والتزمه، وأخذ نفسه بأدائه امتثالاً للآمر الذي صح عنده صدق قوله.
240
+
241
+ إلا انه بقي في نفسه أمران كان يتعجب منهما ولا يدري وجه الحكمة فيهما: أحدهما - لما ضرب هذا الرسول الأمثال للناس في أكثر ما وصفه من أمر العالم الإلهي، وأضرب عن المكاشفة حتى وقع الناس في أمر عظيم من التجسيم، واعتقاد أشياء في ذات الحق هو منزه عنها وبريء منها؟ وكذلك في أمر الثواب والعقاب! والآمر الآخر - لم اقتصر على هذه الفرائض ووظائف العبادات وأباح الاقتناء للأموال والتوسع في المأكل، حتى بفرغ الناس بالاشتغال بالباطل، والأعراض عن الحق؟ وكان رأيه هو لا يتناول أحد شيئاً إلا ما يقيم به من الرمق؛ واما الأموال فلم تكن لها عنده معنى.
242
+
243
+ وكان يرى ما في الشرع من الأحكام في أمر الأموال: كالزكاة وتشعبها، والبيوع والربا والحدود والعقوبات، فكان يستغرب هذا كله ويراه تطويلاً، ويقول: إن الناس لو فهموا الآمر على حقيقته لاعرضوا عن هذه البواطل، وأقبلو على الحق، واستغنوا عن هذا كله، ولم يكن لاحد اختصاص بمال يسأل عن زكاته، أو تقطع الأيدي على سرقته، أو تذهب النفوس على أخذه مجاهرة.
244
+
245
+ وكان الذي أوقعه في ذلك ظنه، أن الناس كلهم ذوو فطر فائقة، وأذهان ثاقبة، ونفوس عازمة، ولم يكن يدري ما هم عليه من البلادة والنقص، وسوء الرأي وضعف العزم، وأنهم كالأنعام بل هم أضل سبيلاً.
246
+
247
+ فلما اشتد إشفاقه على الناس، وطمع أن تكون نجاتهم على يديه، حدثت له النية في الوصول إليهم، وإيضاح الحق لديهم، وتبييه لهم ففاوض في ذلك صاحبه أسال وسأله: هل تمكنه حيلة في الوصول اليهم؟ فأعلمه بما هم فيه من نقص الفطرة والأعراض عن آمر الله فلم يتأت له فهم ذلك، وبقي في نفسه تعلق بما كان قد أمله.
248
+
249
+ وطمع أسال أيضاً أن يهدي الله على يديه طائفة من معارفه المريدين الذين كانوا أقرب من التخلص من سواهم، فساعده على رأيه، ورأيا أن يلتزما ساحل البحر ولا يفارقاه ليلاً ولا نهاراً، لعل الله إن السني لهما عبور البحر فالتزما ذلك وابتهلا الله تعالى أن يهيء لهما من أمرهما رشدأً.
250
+
251
+ فكان من أمر الله عز وجل أن سفينة ضلت مسلكها، ودفعها الرياح وتلاطم الأمواج إلى ساحلها. فلما قربت من البر رأى أهلها الرجلين على الشاطئ.
252
+
253
+ فدنوا منها فكلمهم أسال وسألهم أن يحملوهما معهم، فأجابوهما إلى ذلك، وأدخلوهما السفينة، فأرسل الله إليهم ريحاً رخاء حملت السفينة في أقرب مدة إلى الجزيرة التي أملاها فنزلا بها، ودخلا مدينتها، واجتمع أصحاب أسال به، فعرفهم شأن حي بن يقظان، فاشتملوا عليه شديداً وأكبروا آمره، واجتمعوا إليه واعظموه وبجلوه، وأعلمه أسال أن تلك الطائفة هم أن تلك الطائفة هم أقرب إلى الفهم والذكاء من جميع الناس، وانه إن عجز عن تعليمهم فهو عن تعليم الجمهور أعجز.
254
+
255
+ وكان رأس تلك الجزيرة سلامان وهو صاحب أسال الذي كان يراه ملازمة الجماعة، ويقول بتحريم العزلة، فشرع حي بن يقظان في تعليمهم وبث أسرار الحكمة إليهم.
256
+
257
+ فما هو إلا أن ترقى عن الظاهر قليلاً وأخذ في وصف ما سبق إلى فهمهم خلافه، فجعلوا ينقبضون منه وتشمئز نفوسهم مما يأتي به، ويتسخطونه بقلوبهم، وان اظهروا له الرضا في وجهه اكراماً لغربته فيهم، ومراعاة لحق صاحبهم أسال! وما زال حي بن يقظان يستلطفهم ليلاً ونهاراً، ويبن لهم الحق سراً وجهاراً، فلا يزيدهم ذلك إلا نبوأً ونفاراً، مع أنهم كانوا محبين للخير، راغبين في الحق، إلا انهم لنقص فطرتهم كانوا لا يطلبون الحق من طريقة ولا يأخذونه لجهة تحقيقه، ولا يلتمسونه من بابه، بل كانوا لا يريدون معرفته من طريق أربابه. فيأس من أصلاحهم، وانقطع رجائه من صلاحهم لقلة قبولهم.
258
+
259
+ وتصفح طبقات الناس بعد ذلك، فرأى كل حزب بما لديهم فرحون، قد اتخذوا ألههم هواهم، ومعبودهم شهواتهم، وتهالكوا في جميع حطام الدنيا، ألهاهم التكاثر حتى زاروا المقابر، لا تنجح فيهم الموعظة ولا تعمل فيهم الكلمة الحسنة، ولا يزدادون بالجدل إلا إصرارا.
260
+
261
+ واما الحكمة فلا سبيل لهم إليها، ولا حظ لهم منه، قد غمرتهم الجهالة وران على قلوبهم ما يكسبون ختم الله على قلوبهم وعلى سمعهم وعلى أبصارهم غشاوةً ولهم عذاب عظيم.
262
+
263
+ فلما رأى سرادق العذاب قد أحاط بهم، الظالمات الحجب قد تغشتهم، والكل منهم - إلا اليسير - لا يتمسكون من ملتهم إلا بالدنيا، وقد نبذوا أعمالهم على خفتها وسهولتها وراء ظهورهم، واشتروا بها ثمناً قليلاً، وألهاهم عن ذكر الله تعالى التجارة والبيع، ولم يخافوا يوماً تنقلب فيه القلوب والابصار، لأن له وتحقق على القطع، أن مخاطبتهم بطريق المكاشفة لا تمكن وأن تكليفهم من العمل فوق هذا القدر لا يتفق، وأن حظ أكثر الجمهور من الانتفاع بالشريعة إنما هو في حياتهم الدنيا لا يستقيم له معاشه، ولا يتعدى عليه سواه فيما اختص هو به، وانه لا يفوز منه بالسعادة الأخروية إلا الشاذ النادر، وهو من أراد حرث الآخرة وسعى لها سعياً وهو مؤمن.
264
+
265
+ وأما من طغى وأثر الحياة الدنيا فان الجحيم هي المأوى، وأي تعب أعظم وشقاوةً أطم ممن إذا تصفحت أعماله من وقت انتباهه من نومه إلى حين رجوعه إلى الكره لا تجد منها شيئاً إلا وهو يلتمس به تحصيل غايةً من هذه الأمور المحسوسة الخسيسة آما مال يجمعه أو لذة ينالها أو شهوة يقضيها أو غيطاً يتشفه به أو جاه يحرزه أو عمل من أعمال الشرع يتزين به أو يدافع عن رقبته، وهي كلها ظلمات بعضها فوق بعض في بحر لجي وان منكم إلا واردها كان على ربك حتماً مقضياً.
266
+
267
+ فلما فهم أحوال الناس وان أكثرهم بمنزلة الحيوان غير الناطق علم أن الحكمة كلها والهداية والتوفيق فيما نطقت به الرسل ووردت به الشريعة لا يمكن غير ذلك ولا يحتمل المزيد عليه ولكل عمل رجال وكل ميسر لما خلق له "بسم الله الرحمن الرحيم" سنة الله التي قد خلت من قبل ولن تجد لسنة الله تبديلاً صدق الله العظيم.
268
+
269
+ فانصرف إلى سلامان وأصحابه، فاعتذر عما تكلم به معه وتبرأ إليهم منه وأعلمهم أنه قد رآه مثل رأيهم واهتدى بمثل هديهم، وأوصاهم بملازمة ما هم عليه من التزام حدود الشرع والأعمال الظاهرة مقلة الخوض فيما لا يعنيهم، والإيمان بالمتشابهات والتسليم لها، والأعراض عن البدع والأهواء والاقتداء بالسلف الصالح والترك لمحدثات الأمور، وأمرهم بمجانبة ما عليه جمهور العوام من إهمال الشريعة والإقبال على الدنيا، وحذرهم عنه غاية التحذير، وعلم هو وصاحبه أسال أن هذه الطائفة المريدة القاصرة لا نجاة لها إلا بهذا الطريق، وأنها إن رفعت عنه إلى يفاع الاستبصار اختل ما هي عليه ولم يمكنها أن تلحق بدرجة السعداء وتذبذبت وانتكست وساءت عاقبتها. وان هي دامت على ما هي عليه حتى يوافيها اليقين فازت بالآمن وكانت من أصحاب اليمين، والسابقون السابقون أولئك المقربون. فو دعاهم وانفصلا عنهم وتلطفا في العود إلى جزيرتهما حتى يسر الله عز وجل عليهما العبور إليها. وطلب حي بن يقظان مقامه الكريم بالنحو الذي طلبه أولاً حتى عاد إليه، واقتدى به أسال حتى قرب من أو كاد وعبدا الله في تلك الجزيرة حتى أتاهما اليقين. هذا - أيدنا الله وأياك بروح منه - ما كان من نبأ حي بن يقظان وأسال وسلامان وقد أشتمل على حظ من الكلام لا يوجد في كتاب ولا يسمع في معتاد خطاب، وهو من العلم المكنون الذي لا يقبله إلا أهل المعرفة بالله، ولا يجهله إلا أهل الغرة بالله. وقد خالفنا فيه طريق السلف الصالح في الضنانا به والشح عليه. إلا أن الذي سهل علينا إفشاء هذا السر وهتك الحجاب، ما ظهر في زماننا من أراء فاسده نبغت بها متفلسفة العصر وصرحت بها، حتى انتشرت في البلدان وعما ضررها وخشينا على الضعفاء الذين اطرحوا تقليد الأنبياء صلوات الله عليهم، وأرادوا تقليد السفهاء والأغبياء أن يظنوا أن تلك الآراء هي الأسرار المضنون بها على غير أهلها، فيزيد بذلك حبهم فيها وولعهم فيها. فرأينا أن نلمح إليهم بطرف من سر الأسرار لنجتذبهم إلى جانب التحقيق، ثم نصدهم عن ذلك الطريق. ولم نخل مع ذلك ما أودعناه هذه الأوراق اليسيره من الأسرار عن حجاب رقيق وستر لطيف ينتهك سريعاً لمن هو أهله، ويتكاثف لمن لا يستحق تجاوزه حتى لا يتعداه. وأنا أسئل إخواني الواقفين على هذا الكلام، أن يقبلو عذري فيما تسائلت في تبينه وتسامحت في تثبيته، فلم أفعل ذلك إلا لأني تسمنت شواهق يزل الطرف عن مرآها. وأردت تقريب الكلام فيها على وجه الترغيب والتشويق في دخول الطريق. وأسأل الله التجاوز والعفو، وأن يوردنا من المعرفة به الصفو، إنه منعم كريم. والسلام عليك أيها الأخ المفترض إسعافه ورحمت الله وبركاته.
270
+ EOT;
271
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Address.php ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ class Address extends \Faker\Provider\Address
6
+ {
7
+ protected static $streetPrefix = array('شارع', 'طريق', 'ممر');
8
+
9
+ /**
10
+ * @link https://ar.wikipedia.org/wiki/%D9%82%D8%A7%D8%A6%D9%85%D8%A9_%D9%85%D8%AF%D9%86_%D8%A7%D9%84%D8%B3%D8%B9%D9%88%D8%AF%D9%8A%D8%A9
11
+ */
12
+ protected static $cityName = array(
13
+ 'الرياض', 'جدة', 'مكة', 'المدينة المنورة', 'تبوك', 'الدمام', 'الأحساء', 'القطيف', 'خميس مشيط', 'المظيلف', 'الهفوف',
14
+ 'المبرز', 'الطائف', 'نجران', 'حفر الباطن', 'الجبيل', 'ضباء', 'الخرج', 'الثقبة', 'ينبع البحر', 'الخبر', 'عرعر', 'الحوية',
15
+ 'عنيزة', 'سكاكا', 'جيزان', 'القريات', 'الظهران', 'الزلفي', 'الباحة', 'الرس', 'وادي الدواسر', 'بيشة', 'سيهات', 'شرورة',
16
+ 'الدوادمي', 'الأفلاج',
17
+ );
18
+
19
+ /**
20
+ * @link https://ar.wikipedia.org/wiki/%D8%A7%D9%84%D8%AA%D9%82%D8%B3%D9%8A%D9%85_%D8%A7%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D9%8A_%D9%84%D9%84%D9%85%D9%85%D9%84%D9%83%D8%A9_%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9_%D8%A7%D9%84%D8%B3%D8%B9%D9%88%D8%AF%D9%8A%D8%A9
21
+ */
22
+ protected static $subdivisions = array(
23
+ 'منطقة الرياض', 'منطقة القصيم',
24
+ 'منطقة مكة المكرمة', 'منطقة المدينة المنورة',
25
+ 'منطقة حائل', 'منطقة الجوف', 'منطقة تبوك', 'منطقة الحدود الشمالية',
26
+ 'منطقة عسير', 'منطقة جازان', 'منطقة نجران', 'منطقة الباحة',
27
+ 'المنطقة الشرقية',
28
+ );
29
+
30
+ /**
31
+ * @link https://ar.wikipedia.org/wiki/%D9%82%D8%A7%D8%A6%D9%85%D8%A9_%D9%85%D8%AD%D8%A7%D9%81%D8%B8%D8%A7%D8%AA_%D8%A7%D9%84%D8%B3%D8%B9%D9%88%D8%AF%D9%8A%D8%A9
32
+ */
33
+ protected static $governorates = array(
34
+ 'الرياض', 'الدرعية', 'الخرج', 'الدوادمي', 'المجمعة', 'القويعية', 'الأفلاج', 'وادي الدواسر', 'الزلفي', 'شقراء', 'حوطة بني تميم', 'عفيف', 'الغاط', 'السليل', 'ضرما', 'المزاحمية', 'رماح', 'ثادق', 'حريملاء', 'الحريق', 'مرات',
35
+ 'مكة المكرمة', 'جدة', 'الطائف', 'القنفذة', 'الليث', 'رابغ', 'خليص', 'الخرمة', 'رنية', 'تربة', 'الجموم', 'الكامل', 'المويه', 'ميسان', 'أضم', 'العرضيات', 'بحرة',
36
+ 'المدينة المنورة', 'ينبع', 'العلا', 'مهد الذهب', 'الحناكية', 'بدر', 'خيبر', 'العيص', 'وادي الفرع',
37
+ 'بريدة', 'عنيزة', 'الرس', 'المذنب', 'البكيرية', 'البدائع', 'الأسياح', 'النبهانية', 'الشماسية', 'عيون الجواء', 'رياض الخبراء', 'عقلة الصقور', 'ضرية',
38
+ 'الدمام', 'الأحساء', 'حفر الباطن', 'الجبيل', 'القطيف', 'الخبر', 'الخفجي', 'رأس تنورة', 'بقيق', 'النعيرية', 'قرية العليا', 'العديد',
39
+ 'أبها', 'خميس مشيط', 'بيشة', 'النماص', 'محايل عسير', 'ظهران الجنوب', 'تثليث', 'سراة عبيدة', 'رجال ألمع', 'بلقرن', 'أحد رفيدة', 'المجاردة', 'البرك', 'بارق', 'تنومة', 'طريب',
40
+ 'تبوك', 'الوجه', 'ضبا', 'تيماء', 'أملج', 'حقل', 'البدع',
41
+ 'حائل', 'بقعاء', 'الغزالة', 'الشنان', 'الحائط', 'السليمي', 'الشملي', 'موقق', 'سميراء',
42
+ 'عرعر', 'رفحاء', 'طريف', 'العويقيلة',
43
+ 'جازان', 'صبيا', 'أبو عريش', 'صامطة', 'بيش', 'الدرب', 'الحرث', 'ضمد', 'الريث', 'جزر فرسان', 'الدائر', 'العارضة', 'أحد المسارحة', 'العيدابي', 'فيفاء', 'الطوال', 'هروب',
44
+ 'نجران', 'شرورة', 'حبونا', 'بدر الجنوب', 'يدمه', 'ثار', 'خباش', 'الخرخير',
45
+ 'الباحة', 'بلجرشي', 'المندق', 'المخواة', 'قلوة', 'العقيق', 'القرى', 'غامد الزناد', 'الحجرة', 'بني حسن',
46
+ 'سكاكا', 'القريات', 'دومة الجندل', 'طبرجل'
47
+ );
48
+
49
+ protected static $buildingNumber = array('#####', '####', '##');
50
+
51
+ protected static $postcode = array('#####', '#####-####');
52
+
53
+ /**
54
+ * @link http://www.nationsonline.org/oneworld/countrynames_arabic.htm
55
+ */
56
+ protected static $country = array(
57
+ 'الكاريبي', 'أمريكا الوسطى', 'أنتيجوا وبربودا', 'أنجولا', 'أنجويلا', 'أندورا', 'اندونيسيا', 'أورجواي', 'أوروبا', 'أوزبكستان', 'أوغندا', 'أوقيانوسيا', 'أوقيانوسيا النائية', 'أوكرانيا', 'ايران', 'أيرلندا', 'أيسلندا', 'ايطاليا',
58
+ 'بابوا غينيا الجديدة', 'باراجواي', 'باكستان', 'بالاو', 'بتسوانا', 'بتكايرن', 'بربادوس', 'برمودا', 'بروناي', 'بلجيكا', 'بلغاريا', 'بليز', 'بنجلاديش', 'بنما', 'بنين', 'بوتان', 'بورتوريكو', 'بوركينا فاسو', 'بوروندي', 'بولندا', 'بوليفيا', 'بولينيزيا', 'بولينيزيا الفرنسية', 'بيرو',
59
+ 'تانزانيا', 'تايلند', 'تايوان', 'تركمانستان', 'تركيا', 'ترينيداد وتوباغو', 'تشاد', 'توجو', 'توفالو', 'توكيلو', 'تونجا', 'تونس', 'تيمور الشرقية',
60
+ 'جامايكا', 'جبل طارق', 'جرينادا', 'جرينلاند', 'جزر الأنتيل الهولندية', 'جزر الترك وجايكوس', 'جزر القمر', 'جزر الكايمن', 'جزر المارشال', 'جزر الملديف', 'جزر الولايات المتحدة البعيدة الصغيرة', 'جزر أولان', 'جزر سليمان', 'جزر فارو', 'جزر فرجين الأمريكية', 'جزر فرجين البريطانية', 'جزر فوكلاند', 'جزر كوك', 'جزر كوكوس', 'جزر ماريانا الشمالية', 'جزر والس وفوتونا', 'جزيرة الكريسماس', 'جزيرة بوفيه', 'جزيرة مان', 'جزيرة نورفوك', 'جزيرة هيرد وماكدونالد', 'جمهورية افريقيا الوسطى', 'جمهورية التشيك', 'جمهورية الدومينيك', 'جمهورية الكونغو الديمقراطية', 'جمهورية جنوب افريقيا', 'جنوب آسيا', 'جنوب أوروبا', 'جنوب شرق آسيا', 'جنوب وسط آسيا', 'جواتيمالا', 'جوادلوب', 'جوام', 'جورجيا', 'جورجيا الجنوبية وجزر ساندويتش الجنوبية', 'جيبوتي', 'جيرسي',
61
+ 'دومينيكا',
62
+ 'رواندا', 'روسيا', 'روسيا البيضاء', 'رومانيا', 'روينيون',
63
+ 'زامبيا', 'زيمبابوي',
64
+ 'ساحل العاج', 'ساموا', 'ساموا الأمريكية', 'سانت بيير وميكولون', 'سانت فنسنت وغرنادين', 'سانت كيتس ونيفيس', 'سانت لوسيا', 'سانت مارتين', 'سانت هيلنا', 'سان مارينو', 'ساو تومي وبرينسيبي', 'سريلانكا', 'سفالبارد وجان مايان', 'سلوفاكيا', 'سلوفينيا', 'سنغافورة', 'سوازيلاند', 'سوريا', 'سورينام', 'سويسرا', 'سيراليون', 'سيشل',
65
+ 'شرق آسيا', 'شرق افريقيا', 'شرق أوروبا', 'شمال افريقيا', 'شمال أمريكا', 'شمال أوروبا', 'شيلي',
66
+ 'صربيا', 'صربيا والجبل الأسود',
67
+ 'طاجكستان',
68
+ 'عمان',
69
+ 'غامبيا', 'غانا', 'غرب آسيا', 'غرب افريقيا', 'غرب أوروبا', 'غويانا', 'غيانا', 'غينيا', 'غينيا الاستوائية', 'غينيا بيساو',
70
+ 'فانواتو', 'فرنسا', 'فلسطين', 'فنزويلا', 'فنلندا', 'فيتنام', 'فيجي',
71
+ 'قبرص', 'قرغيزستان', 'قطر',
72
+ 'كازاخستان', 'كاليدونيا الجديدة', 'كرواتيا', 'كمبوديا', 'كندا', 'كوبا', 'كوريا الجنوبية', 'كوريا الشمالية', 'كوستاريكا', 'كولومبيا', 'كومنولث الدول المستقلة', 'كيريباتي', 'كينيا',
73
+ 'لاتفيا', 'لاوس', 'لبنان', 'لوكسمبورج', 'ليبيا', 'ليبيريا', 'ليتوانيا', 'ليختنشتاين', 'ليسوتو',
74
+ 'مارتينيك', 'ماكاو الصينية', 'مالطا', 'مالي', 'ماليزيا', 'مايوت', 'مدغشقر', 'مصر', 'مقدونيا', 'ملاوي', 'منغوليا', 'موريتانيا', 'موريشيوس', 'موزمبيق', 'مولدافيا', 'موناكو', 'مونتسرات', 'ميانمار', 'ميكرونيزيا', 'ميلانيزيا',
75
+ 'ناميبيا', 'نورو', 'نيبال', 'نيجيريا', 'نيكاراجوا', 'نيوزيلاندا', 'نيوي',
76
+ 'هايتي', 'هندوراس', 'هولندا', 'هونج كونج الصينية',
77
+ 'وسط آسيا', 'وسط افريقيا',
78
+ );
79
+
80
+ protected static $cityFormats = array(
81
+ '{{cityName}}',
82
+ );
83
+
84
+ protected static $streetNameFormats = array(
85
+ '{{streetPrefix}} {{firstName}} {{lastName}}',
86
+ );
87
+
88
+ protected static $streetAddressFormats = array(
89
+ '{{buildingNumber}} {{streetName}}',
90
+ '{{buildingNumber}} {{streetName}} {{secondaryAddress}}',
91
+ );
92
+
93
+ protected static $addressFormats = array(
94
+ "{{streetAddress}}\n{{city}}",
95
+ );
96
+
97
+ protected static $secondaryAddressFormats = array('شقة رقم. ##', 'عمارة رقم ##');
98
+
99
+ /**
100
+ * @example 'شرق'
101
+ */
102
+ public static function cityPrefix()
103
+ {
104
+ return static::randomElement(static::$cityPrefix);
105
+ }
106
+
107
+ /**
108
+ * @example 'الرياض'
109
+ */
110
+ public static function cityName()
111
+ {
112
+ return static::randomElement(static::$cityName);
113
+ }
114
+
115
+ /**
116
+ * @example 'شارع'
117
+ */
118
+ public static function streetPrefix()
119
+ {
120
+ return static::randomElement(static::$streetPrefix);
121
+ }
122
+
123
+ /**
124
+ * @example 'شقة رقم. 350'
125
+ */
126
+ public static function secondaryAddress()
127
+ {
128
+ return static::numerify(static::randomElement(static::$secondaryAddressFormats));
129
+ }
130
+
131
+ /**
132
+ * @example 'منطقة الرياض'
133
+ */
134
+ public static function subdivision()
135
+ {
136
+ return static::randomElement(static::$subdivisions);
137
+ }
138
+
139
+ /**
140
+ * @example 'منطقة الرياض'
141
+ */
142
+ public static function governorate()
143
+ {
144
+ return static::randomElement(static::$governorates);
145
+ }
146
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Color.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ class Color extends \Faker\Provider\Color
6
+ {
7
+ protected static $safeColorNames = array(
8
+ 'أسود', 'قرمزي', 'أخضر', 'أزرق داكن', 'زيتوني',
9
+ 'أرجواني', 'أحمر', 'ليمي', 'أزرق', 'فضي',
10
+ 'رمادي', 'أصفر', 'برتقالي', 'بني', 'أبيض'
11
+ );
12
+
13
+ /**
14
+ * @link https://ar.wikipedia.org/wiki/%D9%82%D8%A7%D8%A6%D9%85%D8%A9_%D8%A7%D9%84%D8%A3%D9%84%D9%88%D8%A7%D9%86_(%D9%85%D8%AA%D8%B6%D8%A7%D9%85%D8%A9)
15
+ **/
16
+ protected static $allColorNames = array(
17
+ 'استقلالي', 'انصهاري الذهب', 'أبنوسي', 'أبيض', 'أبيض الشبح', 'أبيض زهوري', 'أبيض عتيق', 'أبيض مضاد للإشعاع',
18
+ 'أبيض هولندي', 'أحمر الأبنية', 'أحمر التفاح المحلى', 'أحمر التفاح المحلى الداكن', 'أحمر الفالون',
19
+ 'أحمر الفيراري', 'أحمر إمبراطوري', 'أحمر إنجليزي', 'أحمر باستيلي داكن', 'أحمر توسكاني عميق',
20
+ 'أحمر جامعة بوسطن', 'أحمر حرس السواحل', 'أحمر داكن', 'أحمر ديبيان', 'أحمر صيني', 'أحمر طوبي', 'أحمر عقيقي',
21
+ 'أحمر كادميومي', 'أحمر كارمن', 'أحمر مرجاني', 'أحمر مطفئة الحريق', 'أحمر نحاسي', 'أحمر هندي', 'أخضر (بانتون)',
22
+ 'أخضر (ح ص ز)', 'أخضر (صباغ)', 'أخضر (عجلة الألوان) (أخض )', 'أخضر (كريولا)', 'أخضر (لون)', 'أخضر (مونسل)',
23
+ 'أخضر (نظام الألوان الطبيعية)', 'أخضر الصياد', 'أخضر الغابة (تقليدي)', 'أخضر الغابة (وب)', 'أخضر الهند',
24
+ 'أخضر أندرويد', 'أخضر إسلامي', 'أخضر إلكتروني', 'أخضر إنجليزي', 'أخضر باستيلي داكن', 'أخضر بحري داكن',
25
+ 'أخضر برونسويكي', 'أخضر بنغلاديشي', 'أخضر تشارلستون', 'أخضر تفاحي', 'أخضر تمويهي', 'أخضر جامعة كاليفورنيا م ت',
26
+ 'أزرق جامعة كامبريدج', 'أخضر جيشي', 'أخضر دارتموثي', 'أخضر داكن', 'أخضر دغلي', 'أخضر دغلي داكن',
27
+ 'أخضر دغلي عميق', 'أخضر ربيعي داكن', 'أخضر زيتوني داكن', 'أخضر سباقي بريطاني', 'أخضر سرخسي',
28
+ 'أخضر طحالبي داكن', 'أخضر قاروري', 'أخضر كادميومي', 'أخضر كاستلتون', 'أخضر كاريبي', 'أخضر مزرق',
29
+ 'أخضر مضيء', 'أخضر مكتبي', 'أخضر هوكر', 'أرجواني إلكرتوني', 'أرجواني إمبراطوري', 'أرجواني باستيلي داكن',
30
+ 'أرجواني فوشي', 'أرجواني قطيفي', 'أرجواني هان', 'أزرق', 'أزرق (ح ص ز)', 'أزرق (صبغة)', 'أزرق (كريولا)',
31
+ 'أزرق (مونسل)', 'أزرق (نظام الألوان الطبيعية)', 'أزرق اردوازي داكن', 'أزرق البحرية مضيء',
32
+ 'أزرق التفوق الجوي', 'أزرق السماء الإيطالي', 'أزرق السماء الفرنسي', 'أزرق العاشقين', 'أزرق الهونولولو',
33
+ 'أزرق أليس', 'أزرق إلكتروني', 'أزرق إلكتروني داكن', 'أزرق إمبراطوري', 'أزرق إمبراطوري داكن', 'إزرق إيتون',
34
+ 'أزرق باستيلي داكن', 'أزرق بوندي', 'أزرق جامعة براندايس', 'أزرق جامعة ديوك', 'أزرق جامعة كارولينا',
35
+ 'أزرق جامعة كولومبيا', 'أزرق جوي (القوات الجوية الأمريكية)', 'أزرق جوي (سلاح الجو الملكي)',
36
+ 'أزرق حرس السواحل', 'أزرق داكن', 'أزرق رمادي', 'أزرق سماوي داكن', 'أزرق سماوي عميق', 'أزرق سيروليان',
37
+ 'أزرق طفولي', 'أزرق عاصفي', 'أزرق عيني الطفل', 'أزرق فرنسا', 'أزرق فرنسي', 'أزرق فريق دودجر',
38
+ 'أزرق قنطريوني', 'أزرق كاتالينا', 'أزرق كاديتي', 'أزرق كروي', 'أزرق كلين العالمي', 'أزرق مسحوقي داكن',
39
+ 'أزرق مصري', 'أزرق هان', 'أزرق هوائي', 'أسود', 'أشقر', 'أصفر الكناري', 'أصفر الكوبالت', 'أصفر أريليد',
40
+ 'أصفر إلكتروني', 'أصفر برونزي', 'أصفر داكن', 'أصفر ذهبي', 'أصفر كادميومي', 'أصفر متألق',
41
+ 'أزرق منتصف الليل الداكن', 'أصفر الأرض', 'أصفر مخضر', 'أصفر موزي', 'أصفر هندي', 'أفوكادوي', 'ألماسي',
42
+ 'أمازوني', 'أومبرياوي محروق', 'أيلي', 'إمبراطوري', 'إيزابيلي', 'باذنجاني', 'برتقالي الجزر',
43
+ 'برتقالي الجزر العميق', 'برتقالي داكن', 'برتقالي عالمي (جسر البوابة الذهبية)', 'برتقالي عالمي (فضاء جوي)',
44
+ 'برتقالي عالمي (هندسة)', 'برتقالي فريق الجيانتس', 'برتقالي كادميومي', 'برتقالي متألق', 'برتقالي محروق',
45
+ 'برتقالي مشاب', 'برعمي يونيو', 'برغوثي داكن', 'برغوثي عميق', 'برغوثي فرنسي', 'برقي', 'برونزي', 'برونزي عتيق',
46
+ 'برونزي منطلق', 'بندقي الكستناء', 'بندقي الكستناء الداكن', 'بندقي الكستناء العميق', 'بنفسجي إلكتروني',
47
+ 'بنفسجي إنجليزي', 'بنفسجي داكن', 'بنفسجي صيني', 'بنفسجي فرنسي', 'بنفسجي مزرق', 'بنفسجي ياباني',
48
+ 'بني الحمير', 'بني المتملقين', 'بني داكن', 'بني ذهبي', 'بني كاكاوي', 'بني (وب)', 'بني (تقليدي)',
49
+ 'بورغندي', 'بيزنطي', 'بيزنطي داكن', 'ترابي', 'تربي داكن', 'تربي محروق', 'تفاحي جراني سميث', 'تملقي',
50
+ 'توردي', 'جاسبري', 'جلدي الجاموس', 'جمشتي', 'جملي', 'جوزي الهند', 'حسائي', 'حممي داكن', 'خامي',
51
+ 'خبازي عميق', 'خبازي فرنسي', 'خرنوبي', 'خزامي إلكتروني', 'خزامي إنجليزي', 'خزامي داكن', 'خزامي مضيء',
52
+ 'خشخاشي ذهبي', 'خشخاشي منثور', 'خلدي داكن', 'خلدي عميق', 'خوخي عميق', 'خوخي فرنسي', 'دودي قياس', 'دينمي',
53
+ 'ذروي', 'ذهبي (معدني)', 'ذهبي (وب)(ذهبي)', 'ذهبي القلب', 'رأسي الموت', 'رقيبي الشمس', 'رماد الأخشاب', 'رمادي',
54
+ 'رمادي (رمادي HTML/CSS)', 'رمادي (رمادي X11)', 'رمادي الميدان', 'رمادي-أزرق داكن', 'رمادي اردوازي داكن',
55
+ 'رمادي دافي', 'رمادي داكن', 'رمادي البوارج', 'رمادي بارد', 'رمادي خافت', 'رمادي رقيبي الشمس', 'رمادي كاديتي',
56
+ 'رمادي متوسط داكن', 'رمادي مزرق', 'زبرجدي', 'زرنيخي', 'زعفراني عميق', 'زمردي', 'زمردي مضيء', 'زنجبيلي',
57
+ 'زنجفري', 'زهري النحام', 'زهري إزهار الكرز', 'زهري الحافة', 'زهري الحجاب', 'زهري الحلوى السكرية', 'زهري الصين',
58
+ 'زهري القرنفل', 'زهري الكرز', 'زهري باربي', 'زهري بيكر-ميلر', 'زهري ساحر', 'زهري ساخن', 'زهري داكن',
59
+ 'زهري طفولي', 'زهري عميق', 'زهري فاندانغو', 'زهري فرنسي', 'زهري فوشي', 'زهري قطيفي', 'زهري كارمن',
60
+ 'زهري كارمن العميق', 'زهري متألق', 'زهري مرجاني', 'زيتوني أسود', 'ستري أسود الجلد', 'سحلبي داكن',
61
+ 'سقفي', 'سقلاتي داكن', 'سلموني داكن', 'سوسني', 'سيان', 'سيان (طباعي)', 'سيان إلكتروني', 'سيان داكن',
62
+ 'سيروليان', 'سيروليان داكن', 'سيروليان مضيء', 'شامباني', 'شامباني عميق', 'شوكولاتي (تقليدي)', 'شوكولاتي (وب)',
63
+ 'صبغة خشب الزان', 'صبغي النيلة', 'صحراوي', 'صفروي', 'صقيعي سيرولياني', 'صوفي', 'صوفي فرنسي', 'طوبي',
64
+ 'طيني نضيج داكن', 'عاجي', 'عاصفي الغبار', 'عصوي الذهب', 'عصوي الذهب الداكن', 'عظمي', 'علكي', 'عليقي بويزن',
65
+ 'عليقي داكن', 'عليقي فرنسي', 'عنبري', 'عنبي', 'عنبري (SAE/ECE)', 'عنبي بري', 'غزلي البنات', 'فاصولي أسود',
66
+ 'فاندانغوي', 'فانيلي داكن', 'فحمي', 'فقاعي', 'فلدسباري', 'فوشي', 'فوشي (كريولا)', 'فوشي الموضة', 'فوشي عتيق',
67
+ 'فوشي عميق', 'فوشي فرنسي', 'فيروزي داكن', 'فيروزي مضيء', 'قرطبي', 'قرفي', 'قرمزي', 'قرمزي الأليزارين',
68
+ 'قرمزي إلكتروني', 'قرمزي جامعة ألاباما', 'قرمزي جامعة هارفارد', 'قشدي', 'قشري البيض', 'قطيفي', 'قندسي',
69
+ 'قنطريوني', 'قهوي', 'قهوي اللبن', 'قهوي عميق', 'كابري', 'كاديتي', 'كاردينالي', 'كارمن', 'كارمن عميق',
70
+ 'كارمن ياباني', 'كبادي', 'كبدي داكن', 'كبدي داكن (الأحصنة)', 'كتاني', 'كستنائي مضيء', 'كرتوزي (تقليدي)',
71
+ 'كرتوزي (وب)', 'كرزي', 'كرزي عميق', 'كرزي هوليوود', 'كلاريتي', 'كمبوجي', 'كوبالتي', 'كوزي العسل', 'لاتيهي كوني',
72
+ 'لازوردي', 'لازوردي إلكتروني', 'لازوردي ضبابي(ويب)', 'لحائي داكن', 'لهيبي', 'لوزي', 'لوزي مبيض', 'ليلاكي عميق',
73
+ 'ليلاكي فرنسي', 'ليلاكي مضيء', 'ليموني عميق', 'ليموني مر', 'ليمي إلكتروني', 'ليمي فرنسي', 'ليمي مر', 'مائي',
74
+ 'ماجنتي داكن', 'ماجنتي ساخن', 'ماجنتي عميق', 'مرجاني', 'مرجاني داكن', 'مسحوقي الطفل', 'مشمشي', 'مصفر', 'معدني',
75
+ 'موزي مجنون', 'نبيذي فرنسي', 'نحاسي', 'نحاسي (كريولا)', 'نحاسي أصفر', 'نحاسي عتيق', 'نرجسي أسلي', 'نرجسي كاذب',
76
+ 'نيلي (وب)', 'نيلي', 'نيلي إلكتروني', 'نيلي ياباني', 'هليوني', 'هليوني رمادي', 'هندبائي', 'هوائي طلق',
77
+ 'وردي أمريكي', 'وردي الأسواق', 'وردي الصين', 'وردي بلغاري', 'وردي فرنسي', 'وردي فوشي', 'وردي قرانيا',
78
+ 'وردي كلاسيكي', 'وردي مضيء', 'وردي نحاسي', 'ياسميني', 'ياقوتي أزرق', 'ياقوتي عتيق', 'ياقوتي عميق',
79
+ 'ياقوتي مغمور', 'يخضور عام', 'يشبي', 'يوسفي داكن', 'يوسفي ذري', 'يوكاليبتوسي'
80
+ );
81
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Company.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ use Faker\Calculator\Luhn;
6
+
7
+ class Company extends \Faker\Provider\Company
8
+ {
9
+ protected static $formats = array(
10
+ '{{lastName}} {{companySuffix}}',
11
+ '{{companyPrefix}} {{lastName}} {{companySuffix}}',
12
+ '{{companyPrefix}} {{lastName}}',
13
+ );
14
+
15
+ protected static $bsWords = array(
16
+ array()
17
+ );
18
+
19
+ protected static $catchPhraseWords = array(
20
+ array('الخدمات','الحلول','الانظمة'),
21
+ array(
22
+ 'الذهبية','الذكية','المتطورة','المتقدمة', 'الدولية', 'المتخصصه', 'السريعة',
23
+ 'المثلى', 'الابداعية', 'المتكاملة', 'المتغيرة', 'المثالية'
24
+ ),
25
+ );
26
+
27
+ protected static $companyPrefix = array('شركة', 'مؤسسة', 'مجموعة', 'مكتب', 'أكاديمية', 'معرض');
28
+
29
+ protected static $companySuffix = array('وأولاده', 'للمساهمة المحدودة', ' ذ.م.م', 'مساهمة عامة', 'وشركائه');
30
+
31
+ /**
32
+ * @example 'مؤسسة'
33
+ * @return string
34
+ */
35
+ public function companyPrefix()
36
+ {
37
+ return static::randomElement(self::$companyPrefix);
38
+ }
39
+
40
+ /**
41
+ * @example 'الحلول المتقدمة'
42
+ */
43
+ public function catchPhrase()
44
+ {
45
+ $result = array();
46
+ foreach (static::$catchPhraseWords as &$word) {
47
+ $result[] = static::randomElement($word);
48
+ }
49
+
50
+ return join(' ', $result);
51
+ }
52
+
53
+ /**
54
+ * @example 'integrate extensible convergence'
55
+ */
56
+ public function bs()
57
+ {
58
+ $result = array();
59
+ foreach (static::$bsWords as &$word) {
60
+ $result[] = static::randomElement($word);
61
+ }
62
+
63
+ return join(' ', $result);
64
+ }
65
+
66
+ /**
67
+ * example 7001010101
68
+ **/
69
+ public static function companyIdNumber()
70
+ {
71
+ $partialValue = static::numerify(700 . str_repeat('#', 6));
72
+ return Luhn::generateLuhnNumber($partialValue);
73
+ }
74
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Internet.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ class Internet extends \Faker\Provider\Internet
6
+ {
7
+ protected static $userNameFormats = array(
8
+ '{{lastNameAscii}}.{{firstNameAscii}}',
9
+ '{{firstNameAscii}}.{{lastNameAscii}}',
10
+ '{{firstNameAscii}}##',
11
+ '?{{lastNameAscii}}',
12
+ );
13
+ protected static $safeEmailTld = array(
14
+ 'com', 'jo', 'me', 'net', 'org',
15
+ );
16
+
17
+ protected static $tld = array(
18
+ 'biz', 'com', 'info', 'sa', 'net', 'org',
19
+ );
20
+
21
+ protected static $lastNameAscii = array(
22
+ 'abbad', 'abbadi', 'abbas', 'abulebbeh', 'flefel', 'hadi', 'hamad', 'hasan', 'jabri', 'kanaan', 'karam', 'maanee', 'melhem', 'nimry', 'obaisi', 'qasem', 'qawasmee', 'rabee', 'rashwani', 'shami', 'zaloum',
23
+ );
24
+ protected static $firstNameAscii = array(
25
+ 'abd', 'abdullah', 'ahmad', 'akram', 'amr', 'bashar', 'bilal', 'fadi', 'ibrahim', 'khaled', 'layth', 'mohammad', 'mutaz', 'omar', 'osama', 'rami', 'saleem', 'samer', 'sami', 'yazan',
26
+ );
27
+
28
+ public static function lastNameAscii()
29
+ {
30
+ return static::randomElement(static::$lastNameAscii);
31
+ }
32
+
33
+ public static function firstNameAscii()
34
+ {
35
+ return static::randomElement(static::$firstNameAscii);
36
+ }
37
+
38
+ /**
39
+ * @example 'ahmad.abbadi'
40
+ */
41
+ public function userName()
42
+ {
43
+ $format = static::randomElement(static::$userNameFormats);
44
+
45
+ return static::bothify($this->generator->parse($format));
46
+ }
47
+
48
+ /**
49
+ * @example 'wewebit.jo'
50
+ */
51
+ public function domainName()
52
+ {
53
+ return static::randomElement(static::$lastNameAscii) . '.' . $this->tld();
54
+ }
55
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Payment.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ class Payment extends \Faker\Provider\Payment
6
+ {
7
+ /**
8
+ * International Bank Account Number (IBAN)
9
+ * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
10
+ * @param string $prefix for generating bank account number of a specific bank
11
+ * @param string $countryCode ISO 3166-1 alpha-2 country code
12
+ * @param integer $length total length without country code and 2 check digits
13
+ * @return string
14
+ */
15
+ public static function bankAccountNumber($prefix = '', $countryCode = 'SA', $length = null)
16
+ {
17
+ return static::iban($countryCode, $prefix, $length);
18
+ }
19
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Person.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ use Faker\Calculator\Luhn;
6
+
7
+ class Person extends \Faker\Provider\Person
8
+ {
9
+ protected static $maleNameFormats = array(
10
+ '{{firstNameMale}} {{lastName}}',
11
+ '{{firstNameMale}} {{lastName}}',
12
+ '{{firstNameMale}} {{lastName}}',
13
+ '{{firstNameMale}} {{firstNameMale}} {{lastName}}',
14
+ '{{firstNameMale}} {{firstNameMale}} {{firstNameMale}} {{lastName}}',
15
+ '{{titleFemale}} {{firstNameFemale}} {{lastName}}',
16
+ );
17
+
18
+ protected static $femaleNameFormats = array(
19
+ '{{firstNameFemale}} {{lastName}}',
20
+ '{{firstNameFemale}} {{lastName}}',
21
+ '{{firstNameFemale}} {{lastName}}',
22
+ '{{firstNameFemale}} {{lastName}}',
23
+ '{{firstNameFemale}} {{firstNameMale}} {{lastName}}',
24
+ '{{firstNameFemale}} {{firstNameMale}} {{firstNameMale}} {{lastName}}',
25
+ '{{titleFemale}} {{firstNameFemale}} {{lastName}}',
26
+ );
27
+
28
+ /**
29
+ * @link http://muslim-names.us/
30
+ */
31
+ protected static $firstNameMale = array(
32
+
33
+ 'آدم', 'أبراهيم', 'أحمد', 'أدهم', 'أسامة', 'أسعد', 'أشرف', 'أكثم', 'أكرم', 'أمجد', 'أمين', 'أنس', 'أنور', 'أواس', 'أوس', 'أيمن', 'أيهم', 'أيوب', 'إبراهيم', 'إسلام', 'إسماعيل', 'إلياس', 'إياد', 'إيهاب', 'ابان', 'ابراهيم', 'اثير', 'احسان', 'احمد', 'ادريس', 'ادم', 'ادهم', 'اديب', 'اسامة',
34
+ 'اسحاق', 'اسحق', 'اسعد', 'اسلام', 'اسماعيل', 'اسيد', 'اشراف', 'اشرف', 'اصلان', 'اكثم', 'اكرم', 'البراء', 'البشر', 'الحارث', 'الحسين', 'الطفيل', 'العزم', 'الليث', 'المثنى', 'المنصور', 'الياس', 'اليمان', 'امجد', 'امير', 'امين', 'أنس', 'انور', 'انيس', 'اوس', 'اوسم', 'اويس', 'اياد', 'اياس',
35
+ 'ايسر', 'ايمن', 'ايهم', 'ايوب', 'باسل', 'باسم', 'باهر', 'بدر', 'بدوان', 'براء', 'برهان', 'بسام', 'بشار', 'بشر', 'بشير', 'بكر', 'بلال', 'بليغ', 'بندر', 'بهاء', 'تركي', 'توفيق', 'ثامر', 'جابر', 'جاسر', 'جاسم', 'جبر', 'جبير', 'جراح', 'جريس', 'جعفر', 'جلال', 'جمال', 'جمزه', 'جميل', 'جهاد',
36
+ 'جواد', 'حابس', 'حاتم', 'حارث', 'حازم', 'حافظ', 'حاكم', 'حامد', 'حبيب', 'حذيفة', 'حسام', 'حسان', 'حسن', 'حسني', 'حسين', 'حكم', 'حمد', 'حمدالله', 'حمدان', 'حمدي', 'حمزة', 'حمود', 'حميد', 'خالد', 'خضر', 'خلدون', 'خلف', 'خليفة', 'خليل', 'خميس', 'داوود', 'ذياب', 'ذيب', 'رأفت', 'رؤوف', 'رئاد',
37
+ 'رائد', 'رائف', 'راجح', 'راجي', 'راشد', 'راضي', 'راغب', 'رافت', 'رافع', 'رافي', 'راكان', 'رامان', 'رامز', 'رامي', 'رامين', 'ربيع', 'رجا', 'رجائي', 'رجب', 'رداد', 'رزق', 'رسلان', 'رشاد', 'رشيد', 'رضا', 'رضوان', 'رعد', 'رغد', 'رغيد', 'ركان', 'رماح', 'رياض', 'ريان', 'زاهر', 'زاهي', 'زايد',
38
+ 'زكريا', 'زمام', 'زهير', 'زياد', 'زيد', 'زيدان', 'زيدون', 'زين', 'زين العابدين', 'سائد', 'ساري', 'سالم', 'سامح', 'سامر', 'سامي', 'ساهر', 'سدير', 'سرمد', 'سري', 'سعد', 'سعود', 'سعيد', 'سفيان', 'سكوت', 'سلام', 'سلطان', 'سلمان', 'سليم', 'سليمان', 'سمعان', 'سميح', 'سنان', 'سند', 'سهل', 'سهم',
39
+ 'سيف', 'شادي', 'شافع', 'شاكر', 'شامل', 'شاهر', 'شرحبيل', 'شريف', 'شهاب', 'شهم', 'شوان', 'صادق', 'صافي', 'صالح', 'صخر', 'صدام', 'صفاء', 'صفوان', 'صقر', 'صلاح', 'صلاح الدين', 'صهيب', 'ضرار', 'ضرغام', 'ضياء', 'ضياء الدين’, ', 'طارق', 'طالب', 'طاهر', 'طلال', 'طه', 'عادل', 'عاصم', 'عاطف',
40
+ 'عامر', 'عايد', 'عبادة', 'عباس', 'عبد الباري', 'عبد الحافظ', 'عبد الحكيم', 'عبد الحليم', 'عبد الحميد', 'عبد الحي', 'عبد الرحمان', 'عبد الرحمن', 'عبد الرحيم', 'عبد الرزاق', 'عبد السلام', 'عبد السميع', 'عبد العزيز', 'عبد العفو', 'عبد الغني', 'عبد الفتاح', 'عبد القادر', 'عبد الكريم',
41
+ 'عبد اللطيف', 'عبد الله', 'عبد المجيد', 'عبد المولى', 'عبد الناصر', 'عبد الهادي', 'عبد ربه', 'عبداالله', 'عبدالاله', 'عبدالباسط', 'عبدالجليل', 'عبدالجواد', 'عبدالحليم', 'عبدالحميد', 'عبدالرؤوف', 'عبدالرحمن', 'عبدالرحيم', 'عبدالرزاق', 'عبدالسلام', 'عبدالعزيز', 'عبدالفتاح', 'عبدالقادر',
42
+ 'عبدالكريم', 'عبداللطيف', 'عبدالله', 'عبدالمجيد', 'عبدالمطلب', 'عبدالمعطي', 'عبدالمهيمن', 'عبدالناصر', 'عبدالهادي', 'عبدالوهاب', 'عبيدالله', 'عبيدة', 'عتيبه', 'عثمان', 'عدب', 'عدلي', 'عدنان', 'عدوان', 'عدي', 'عرار', 'عرمان', 'عروة', 'عريق', 'عرين', 'عز الدين', 'عزالدين', 'عزام', 'عزت',
43
+ 'عزمي', 'عزيز', 'عصام', 'عقل', 'علاء', 'علي', 'عليان', 'عماد', 'عمار', 'عمر', 'عمران', 'عمرو', 'عملا', 'عميد', 'عناد', 'عنان', 'عواد', 'عودة', 'عوده', 'عوض', 'عوف', 'عون', 'عوني', 'عيد', 'عيدالله', 'عيسى', 'غازي', 'غالب', 'غانم', 'غدير', 'غسان', 'غيث', 'فؤاد', 'فائق', 'فاخر', 'فادي',
44
+ 'فارس', 'فاروق', 'فاضل', 'فايز', 'فتحي', 'فجر', 'فراس', 'فرح', 'فريد', 'فلاح', 'فهد', 'فهمي', 'فواز', 'فوزي', 'فيصل', 'قارس', 'قاسم', 'قبلان', 'قتاده', 'قتيبة', 'قصي', 'قيس', 'كاظم', 'كامل', 'كايد', 'كرم', 'كريم', 'كفاح', 'كمال', 'كنان', 'لؤي', 'لبيب', 'لطف', 'لطفي', 'ليث', 'مأمون', 'مؤثر',
45
+ 'مؤمن', 'مؤنس', 'مؤيد', 'ماجد', 'مازن', 'مالك', 'مامون', 'ماهر', 'مبارك', 'مثنى', 'مجاهد', 'مجد', 'مجدي', 'محسن', 'محمد ', 'محمود', 'محي', 'مختار', 'مخلص', 'مدحت', 'مدين', 'مراد', 'مرشد', 'مرهف', 'مروان', 'مسعد', 'مسعود', 'مسلم', 'مشاري', 'مشعل', 'مشهور', 'مصباح', 'مصطفى', 'مصطفي', 'مصعب',
46
+ 'مضر', 'مطيع', 'مظفر', 'مظهر', 'معاذ', 'معاوية', 'معتز', 'معتصم', 'معمر', 'معن', 'معين', 'مفدي', 'مفلح', 'مقداد', 'ملهم', 'ممدوح', 'مناف', 'منتصر', 'منح', 'منذر', 'منصف', 'منصور', 'منير', 'مهاب', 'مهدي', 'مهران', 'مهند', 'موسى', 'موفق', 'نائل', 'ناجي', 'نادر', 'ناصر', 'ناهض', 'نايف',
47
+ 'نبراس', 'نبيل', 'نجيب', 'نديم', 'نزار', 'نزال', 'نزيه', 'نسيم', 'نشات', 'نصار', 'نصر', 'نصري', 'نصوح', 'نضال', 'نظام', 'نعمان', 'نعمة', 'نعيم', 'نقولا', 'نمر', 'نهاد', 'نهار', 'نواف', 'نورس', 'نوفان', 'هادي', 'هارون', 'هاشم', 'هانى', 'هاني', 'هذال', 'هشام', 'هلال', 'همام', 'هيثم', 'وائل',
48
+ 'واثق', 'واصف', 'وجدي', 'وجيه', 'وحيد', 'وديع', 'ورد', 'وسام', 'وسن', 'وسيم', 'وصفي', 'وضاح', 'وعد', 'وفاء', 'وليد', 'وهيب', 'ياسر', 'ياسين', 'يامن', 'يحيى', 'يزن', 'يزيد', 'يسار', 'يشار', 'يعرب', 'يعقوب', 'يمان', 'ينال', 'يوسف', 'يونس',
49
+ );
50
+
51
+ /**
52
+ * @link http://muslim-names.us/
53
+ */
54
+ protected static $firstNameFemale = array(
55
+ 'آثار', 'آلاء', 'آناء', 'آية', 'أبرار', 'أحلام', 'أروى', 'أريج', 'أسماء', 'أسيل', 'أصاله', 'أفنان', 'ألاء', 'أماني', 'أمل', 'أميرة', 'أنسام', 'أنوار', 'إباء', 'إخلاص', 'إسراء', 'إسلام', 'إكرام', 'إنعام', 'إيمان', 'إيناس', 'ابتهاج', 'ابتهال', 'أبرار', 'إخلاص', 'ارجوان', 'أروى', 'أريج',
56
+ 'أزهار', 'أسحار', 'اسراء', 'اسرار', 'اسيل', 'اشراق', 'أصالة', 'اعتدال', 'أفراح', 'أفنان', 'إكرام', 'آلاء', 'العنود', 'إلهام', 'آمال', 'أمنة', 'أميرة', 'أمينة', 'أناهيد', 'انتظار', 'أنعام', 'أنوار', 'آيات', 'إيمان', 'إيناس', 'آية', 'باسمة', 'بتول', 'بثينة', 'بدور', 'براء', 'براءة', 'بسمة',
57
+ 'بشائر', 'بشرى', 'بلسم', 'بنان', 'بهجة', 'بيان', 'بيداء', 'بيسان', 'تالا', 'تالة', 'تالين', 'تحرير', 'تسنيم', 'تغريد', 'تقوى', 'تقى', 'تمارا', 'تماضر', 'تمام', 'تهاني', 'تولين', 'ثريا', 'جمانة', 'جميلة', 'جنى', 'جهاد', 'جود', 'حبيبة', 'حسناء', 'حصة', 'حلا', 'حليمة', 'حنان', 'حنين', 'حياة',
58
+ 'ختام', 'خديجة', 'خلود', 'خولة', 'دارين', 'داليا', 'دالية', 'دانا', 'دانة', 'دانية', 'دعاء', 'دلال', 'دنى', 'دنيا', 'ديانا', 'ديما', 'دينا', 'رؤى', 'رؤيه', 'رابعة', 'راغدة', 'راما', 'رانا', 'رانيا', 'راوية', 'راية', 'ربا', 'رباب', 'ربى', 'رجاء', 'رحمة', 'رحمه', 'ردينة', 'رزان',
59
+ 'رشا', 'رغد', 'رغدة', 'رفاه', 'رقية', 'رمال', 'رنا', 'رناد', 'رند', 'رنده', 'رنيم', 'رنين', 'رهام', 'رهف', 'رواء', 'روان', 'روزان', 'روزانا', 'روزين', 'رولى', 'روند', 'رويدة', 'ريان', 'ريتا', 'ريم', 'ريما', 'ريمان', 'ريناتا', 'ريناد', 'ريهام', 'زكية', 'زمان', 'زها', 'زهرة', 'زين', 'زينا',
60
+ 'زينات', 'زينب', 'زينة', 'ساجدة', 'سارة', 'سجى', 'سحر', 'سدين', 'سرى', 'سرين', 'سعاد', 'سكينة', 'سلام', 'سلسبيل', 'سلمى', 'سلوى', 'سما', 'سماح', 'سماره', 'سمر', 'سمية', 'سميرة', 'سناء', 'سنابل', 'سندس', 'سنريت', 'سنن', 'سهاد', 'سهام', 'سهر', 'سهى', 'سهير', 'سهيله', 'سوار', 'سوزان', 'سوسن',
61
+ 'سيرين', 'سيرينا', 'سيلفا', 'سيلين', 'سيما', 'شذى', 'شروق', 'شريفة', 'شرين', 'شريهان', 'شفاء', 'شهد', 'شيرين', 'شيماء', 'صابرين', 'صبا', 'صباح', 'صبرين', 'صفا', 'صفاء', 'صفية', 'صمود', 'ضحى', 'ضياء', 'عائشة', 'عاليا', 'عالية', 'عبلة', 'عبير', 'عزة', 'عزيزة', 'عفاف', 'علا', 'علياء',
62
+ 'عنود', 'عهد', 'غادة', 'غدير', 'غرام', 'غزل', 'غصون', 'غفران', 'غنى', 'غيد', 'غيداء', 'غيده', 'فاتن', 'فادية', 'فاديه', 'فاطمة', 'فايزة', 'فتحية', 'فداء', 'فدوى', 'فدى', 'فرح', 'فريال', 'فريدة', 'فوزية', 'فيروز', 'فيفيان', 'قمر', 'كيان', 'لارا', 'لانا', 'لبنا', 'لجين', 'لطيفة', 'لمى',
63
+ 'لميس', 'لنا', 'لورا', 'لورينا', 'لونا', 'ليان', 'ليدا', 'ليلى', 'ليليان', 'لين', 'لينا', 'لينة', 'ليندا', 'لينه', 'مايا', 'مجد', 'مجدولين', 'محبوبة', 'مديحة', 'مرام', 'مرح', 'مروة', 'مريام', 'مريم', 'مسعدة', 'مشيرة', 'معالي', 'ملاك', 'ملك', 'منار', 'منال', 'منى', 'مها', 'مي',
64
+ 'ميادة', 'مياده', 'ميار', 'ميان', 'ميرا', 'ميرال', 'ميران', 'ميرفت', 'ميس', 'ميسا', 'ميساء', 'ميسر', 'ميسره', 'ميسم', 'ميسون', 'ميلاء', 'ميناس', 'نائله', 'ناديا', 'نادية', 'نادين', 'ناديه', 'نانسي', 'نبال', 'نبراس', 'نبيله', 'نجاة', 'نجاح', 'نجلاء', 'نجود', 'نجوى', 'نداء', 'ندى',
65
+ 'ندين', 'نرمين', 'نسرين', 'نسيمة', 'نعمت', 'نعمه', 'نهاد', 'نهى', 'نهيدة', 'نوال', 'نور', 'نور الهدى', 'نورا', 'نوران', 'نيروز', 'نيفين', 'هادلين', 'هازار', 'هالة', 'هانيا', 'هايدي', 'هبة', 'هدايه', 'هدى', 'هديل', 'هزار', 'هلا', 'هنا', 'هناء', 'هنادي', 'هند', 'هيا', 'هيفا',
66
+ 'هيفاء', 'هيلين', 'وئام', 'وجدان', 'وداد', 'ورود', 'وسام', 'وسن', 'وسيم', 'وعد', 'وفاء', 'ولاء', 'ىمنة', 'يارا', 'ياسمين', 'يسرى',
67
+ );
68
+
69
+ protected static $lastName = array(
70
+ 'العتيبي', 'الشهري', 'العنزي', 'الخضيري', 'الحسين', 'العسكر', 'باشا', 'مدني', 'العرفج',
71
+ 'القحطاني', 'الفدا', 'المشيقح', 'العمرو', 'السالم', 'الشيباني', 'السهلي', 'المطرفي',
72
+ 'الأحمري', 'الفيفي', 'العقل', 'الفرحان', 'الحصين', 'الأسمري', 'الماجد', 'الخالدي', 'السيف',
73
+ 'الحنتوشي', 'الشهيل', 'الزامل', 'الصامل', 'السماعيل', 'الجريد', 'الحميد', 'المقبل',
74
+ 'الراجحي', 'المنيف', 'السويلم', 'السمير', 'الصقير', 'الصقيه', 'سقا', 'مكي', 'جواهرجي',
75
+ 'الجهني', 'الفريدي', 'برماوي', 'هوساوي', 'السعيد', 'الداوود', 'السليم', 'السماري',
76
+ );
77
+
78
+ protected static $titleMale = array('السيد', 'الأستاذ', 'الدكتور', 'المهندس');
79
+ protected static $titleFemale = array('السيدة', 'الآنسة', 'الدكتورة', 'المهندسة');
80
+ private static $prefix = array('أ.', 'د.', 'أ.د', 'م.');
81
+
82
+ /**
83
+ * @example 'أ.'
84
+ */
85
+ public static function prefix()
86
+ {
87
+ return static::randomElement(static::$prefix);
88
+ }
89
+
90
+ /**
91
+ * @example 1010101010
92
+ */
93
+ public static function idNumber()
94
+ {
95
+ $partialValue = static::numerify(
96
+ static::randomElement(array(1, 2)) . str_repeat('#', 8)
97
+ );
98
+ return Luhn::generateLuhnNumber($partialValue);
99
+ }
100
+
101
+ /**
102
+ * @example 1010101010
103
+ */
104
+ public static function nationalIdNumber()
105
+ {
106
+ $partialValue = static::numerify(1 . str_repeat('#', 8));
107
+ return Luhn::generateLuhnNumber($partialValue);
108
+ }
109
+
110
+ /**
111
+ * @example 2010101010
112
+ */
113
+ public static function foreignerIdNumber()
114
+ {
115
+ $partialValue = static::numerify(2 . str_repeat('#', 8));
116
+ return Luhn::generateLuhnNumber($partialValue);
117
+ }
118
+ }
vendor/fakerphp/faker/src/Faker/Provider/ar_SA/Text.php ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\ar_SA;
4
+
5
+ class Text extends \Faker\Provider\Text
6
+ {
7
+ protected static function validStart($word)
8
+ {
9
+ return preg_match('/^\p{Arabic}/u', $word);
10
+ }
11
+
12
+ /**
13
+ * License: Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
14
+ *
15
+ * Title: حي بن يقظان
16
+ * Author: ابن الطفيل
17
+ * Language: Arabic
18
+ *
19
+ * @see https://ar.wikisource.org/wiki/%D8%A7%D8%A8%D9%86_%D8%A7%D9%84%D8%B7%D9%81%D9%8A%D9%84_-_%D8%AD%D9%8A_%D8%A8%D9%86_%D9%8A%D9%82%D8%B8%D8%A7%D9%86
20
+ * @var string
21
+ */
22
+ protected static $baseText = <<<'EOT'
23
+ ذكر سلفنا الصالح - رضي الله عنهم - أن جزيرة من جزائر الهند التي تحت خط الاستواء، وهي الجزيرة التي يتولد بها الإنسان من غير أم ولا أب، وبها شجر يثمر نساء، وهي التي ذكر المسعودي أنها جزيرة الوقواق لان تلك الجزيرة اعدل بقاع الأرض هواء؛ أتممها لشروق النور الأعلى عليها استعدادً، وان كان ذلك خلاف ما يراه جمهور الفلاسفة وكبار الأطباء، فانهم يرون إن اعدل ما في المعمورة الإقليم الرابع، فان كانوا قالوا ذلك لأنه صح عندهم انه ليس على خط الاستواء عمارة لمانع من الموانع الأرضية، فلقولهم: أن الإقليم الرابع اعدل بقاع الأرض وجه، وان كانوا إنما أرادوا بذلك إن ما على خط الاستواء شديد الحرارة، كالذي يصرح به أكثرهم فهو خطأ يقوم البرهان على خلافه.
24
+
25
+ وذلك أنه قد تبرهن في العلوم الطبيعية أنه لا سبب لتكون الحرارة إلا الحركة أو ملاقاة الأجسام الحارة والإضاءة؛ وتبين فيها أيضاً إن الشمس بذاتها غير حارة ولا متكيفة بشيء من هذه الكيفيات المزاجية؛ وقد تبين فيها أيضاً إن الأجسام التي تقبل الإضاءة أتم القبول، هي الأجسام الصقيلة غير الشفافة، ويليها في قبول ذلك الأجسام الكثيفة غير الصقيلة، فأما الأجسام الشفافة التي لاشيء فيها من الكثافة فلا تقبل الضوء بوجه.
26
+
27
+ وهذا وحده مما برهنه الشيخ أبو علي خاصة، ولم يذكره من تقدمه، فإذا صحت هذه المقدمات، فاللازم عنها أن الشمس لا تسخن الأرض كما تسخن الأجسام الحارة أجسام أخر تماسها، لان الشمس في ذاتها غير حارة ولا الأرض أيضاً تسخن بالحركة لأنها ساكنة وعلى حالة واحدة في شروق الشمس عليها وفي وقت مغيبها عنها وأحوالها في التسخين والتبريد، ظاهرة الاختلاف للحس في هذين الوقتين.
28
+
29
+ ولا الشمس أيضاً تسخن الهواء أولاً ثم تسخن بعد ذلك الأرض بتوسط سخونة الهواء، وكيف يكون ذلك ونحن نجد أن ما قرب من الهواء من الأرض في وقت الحر، أسخن كثيراً من الهواء الذي يبعد منه علواً؟ فبقي أن تسخين الشمس للأرض إنما هو على سبيل الإضاءة لا غير، فان الحرارة تتبع الضوء أبداً: حتى إن الضوء إذا افرط في المرأة المقعرة، أشعل ما حاذاها.
30
+
31
+ وقد ثبت في علوم التعاليم بالبراهين القطعية، أن الشمس كروية الشكل، وأن الأرض كذلك، وأن الشمس أعظم من الأرض كثيراً، وأن الذي يستضيء من الشمس أبداً هو أعظم من نصفها، وأن هذا النصف المضيء من الأرض في كل وقت أشد ما يكون الضوء في وسطه، لأنه أبعد المواضع من المظلمة، ولأنه يقابل من الشمس أجزاءاً أكثر، وما قرب من المحيط كان أقل ضوءاً حتى ينتهي إلى الظلمة عند محيط الدائرة الذي ما أضاء موقعه من الأرض قط، وإنما يكون الموضع وسط دائرة الضياء إذا كانت الشمس على سمت رؤوس الساكنين فيه، وحينئذ تكون الحرارة في ذلك الموضع أشد ما يكون فان كان الموضع مما تبعد الشمس عن مسامتة رؤوس أهله، كان شديد البرودة جداً، وان كان مما تدوم فيه المسامتة كان شديد الحرارة، وقد ثبت في علم الهيئة أن بقاع الأرض التي على خط الاستواء لا تسامت الشمس رؤوس أهلها سوى مرتين في العام: عند حلولها برأس الحمل؛ وعند حلولها برأس الميزان.
32
+
33
+ وهي في سائر العام ستة أشهر جنوباً منهم، وستة أشهر شمالاً منهم: فليس عندهم حر مفرط، ولا برد مفرط. وأحوالهم بسبب ذلك متشابهة.
34
+
35
+ وهذا القول يحتاج إلى بيان أكثر من هذا، لا يليق بما نحن بسبيله؛ وإنما نبهناك عليه، لأنه من الأمور التي تشهد بصحة ما ذكر من تجويز تولد الإنسان بتلك البقعة من غير أم ولا أب.
36
+
37
+ فمنهم من بت الحكم وجزم القضية بأن حي بن يقظان من جملة من تكون في تلك البقعة من غير أم ولا أب، ومنهم من أنكر ذلك وروى من أمره خبراً نقصه عليك، فقال: انه كان بازاء تلك الجزيرة، جزيرة عظيمة متسعة الأكتاف، كثيرة الفوائد، عامرة بالناس، يملكها رجل منهم شديد الأنفة والغيرة، وكانت له أخت ذات جمال وحسن باهر فعضلها ومنعها الأزواج إذا لم يجد لها كفواً. وكان له قريب يسمى يقظان فتزوجها سراً على وجه جائز في مذهبهم المشهور في زمنهم.
38
+
39
+ ثم إنها حملت منه ووضعت طفلاً. فلما خافت أن يفتضح أمرها وينكشف سرها، وضعته في تابوت أحكمت زمه بعد أن أروته من الرضاع؛ وخرجت به في أول الليل في جملة من خدمها وثقاتها إلى ساحل البحر، وقلبها يحترق صبابةً به، وخوفاً عليه، ثم إنها ودعته وقالت: "اللهم انك خلقت هذا الطفل ولم يكن شيئاً مذكوراً، ورزقته في ظلمات الأحشاء، وتكفلت به حتى تم واستوى. وأنا قد سلمته إلى لطفك، ورجوت له فضلك، خوفاً من هذا الملك الغشوم الجبار العنيد.
40
+
41
+ فكن له، ولا تسلمه، يا أرحم الراحمين" ثم قذفت به في اليم. فصادف ذلك جري الماء بقوة المد، فاحتمله من ليلته إلى ساحل الجزيرة الأخرى المتقدم ذكرها. وكان المد يصل في ذلك الوقت إلى موضع لا يصل إليه بعد علم. فأدخله الماء بقوته إلى أجمة ملتفة الشجر عذبة التربة، مستورة عن الرياح والمطر، محجوبة عن الشمس تزاور عنها إذا طلعت، وتميل إذا غربت. ثم أخذ الماء في الجزر.
42
+
43
+ وبقي التابوت في ذلك الموضع، وعلت الرمال بهبوب الرياح، وتراكمت بعد ذلك حتى سدت مدخل الماء إلى تلك الأجمة. فكان المد لا ينتهي إليها، وكانت مسامير التابوت قد فلقت، وألواحه قد اضطربت عند رمي الماء في تلك الأجمة. فلما أشتد الجوع بذلك الطفل، بكى واستغاث وعالج الحركة، فوقع صوته في أذن ظبية فقدت طلاها، خرج من كناسه فحمله العقاب، فلما سمعت الصوت ظنته ولدها.
44
+
45
+ فتتبعت الصوت وهي تتخيل طلاها حتى وصلت إلى التابوت، ففحصت عنه بأظلافها وهو ينوء ويئن من داخله، حتى طار عن التابوت لوح من أعلاه. فحنت الظبية وحنت عليه ورئفت به، وألقمه حلمتها وأروته لبناً سائغاً. ومازالت تتعهده وتربيه وتدفع عنه الأذى. هذا ما كان من ابتداء أمره عند من ينكره التولد. ونحن نصف هنا كيف تربى وكيف أنتقل في أحواله حتى يبلغ المبلغ العظيم. وأما الذين زعموا أنه تولد من الأرض فانهم قالوا إن بطناً من أرض تلك الجزيرة تخمرت فيه طينه على مر السنين والأعوام، حتى امتزج فيها الحار بالبارد، والرطب باليابس، امتزاج تكافؤ وتعادل في القوى. وكانت هذه الطينة المتخمرة كبيرة جداً وكان بعضها يفضل بعضاً في اعتدال المزاج والتهيؤ لتكون الأمشاج.
46
+
47
+ وكان الوسط منها أعدل ما فيها وأتمه مشابهة بمزاج الإنسان: فتمخضت تلك الطينة، وحدث فيها شبه نفاخات الغليان لشدة لزوجتها: وحدث في الوسط منها لزوجة ونفاخة صغيرة جداً، منقسمة بقسمين، بينها حجاب رقيق، ممتلئة بجسم لطيف هوائي في غاية من الاعتدال اللائق به، فتعلق به عند ذلك الروح الذي هو من أمر الله تعالى وتشبث به تشبثاً يعسر انفصاله عنه عند الحس وعند العقل؛ إذ قد تبين أن هذا الروح دائم الفيضان من عند الله عز وجل، وأنه بمنزلة نور الشمس الذي هو دائم الفيضان على العالم.
48
+
49
+ فمن الأجسام ما لا يستضيء به، وهو الهواء الشفاف جداً؛ ومنها ما يستضيء به بعض الاستضاءة، وهي الأجسام الكثيفة غير الصقيلة وهذه تختلف في قبول الضياء، وتختلف بحسب ذلك ألوانها، ومنها ما يستضيء به غاية الاستضاءة وهي الأجسام الصقيلة كالمرأة ونحوها.
50
+
51
+ فإذا كانت هذه المرأة مقعرة على شكل مخصوص، حدث فيها النار لإفراط الضياء. الذي هو الروح، الذي هو من أمر الله تعالى، فياض أبداً على جميع الموجودات؛ فمنها ما لا يظهر أثره فيه اعدم الأستعداد، وهي الجمادات التي لا حياة لها، وهذه بمنزلة الهواء في المثال المتقدم، ومنها ما يظهر أثره فيه، وهي أنواع النبات بحسب استعداداتها وهذه بمنزلة الأجسام الكثيفة في المثال المتقدم؛ ومنها ما يظهر أثره فيه ظهوراً كثيراً، وهي الأجسام الصقيلة في المثال المتقدم.
52
+
53
+ ومن هذه الأجسام الصقيلة ما يزيد على شدة قبوله لضياء الشمس أنه يحكي صورة الشمس، ومثالها. وكذلك أيضاً من الحيوان ما يزيد على شدة قبوله للروح أنه يحكي الروح ويتصور بصورته وهو الإنسان خاصة.
54
+
55
+ واليه الإشارة بقوله صلى الله عليه وسلم: "إن الله خلق أدم على صورته". فان قويت في هذه الصورة حتى تتلاشى جميع الصور في حقها، وتبقى هي وحدها، وتحرق سبحات نورها كل ما أدركته، كانت حينئذ بمنزلة المرأة المنعكسة على نفسها المحرقة لسوها وهذا لا يكون إلا للأنبياء صلوات الله عليهم أجمعين. وهذا كله مبين في مواضعه اللائقة به، فليرجع إلى تمام ما حكوه من وصف ذلك التخلق.
56
+
57
+ قالوا: فلما تعلق هذا الروح بتلك القرارة، خضعت له جميع القوى وسجدت له وسخرت بأمر الله تعالى في كمالها، فتكون بازاء تلك القرارة نفاخة أخرى منقسمة إلى ثلاث قرارت بينهما حجب لطيفة، ومسالك نافذة، وامتلأت بمثل ذلك الهوائي الذي امتلأت منه القرارة الأولى؛ إلا أنه ألطف منه. وفي هذه البطون الثلاثة المنقسمة من واحد، طائفة من تلك القوى التي خضعت له وتوكلت بحراستها والقيام عليها، وإنهاء ما يطرأ فيها من دقيق الأشياء وجليلها إلى الروح الأول المتعلق بالقرارة الأولى.
58
+
59
+ وتكون بازاء هذه القرارة من الجهة المقابلة للقراءة الثانية، نفاخة ثالثة مملوءة جسماً هوائياً، إلا أنه أغلظ من الأولين وسكن في هذه القرارة فريق من تلك القوى الخاضعة، وتوكلت بحفظها و القيام عليها؛ فكانت هذه القرارة الأولى والثانية والثالثة، أول ما تخلق من تلك الطينة المتحمرة على الترتيب الذي ذكرناه. واحتاج بعضها إلى بعض: فالأولى منها حاجتها إلى الآخرين، حاجة استخدام وتسخير.
60
+
61
+ والأخريان حاجتهما إلى الأولى حاجة المرؤوس إلى الرئيس، والمدبر إلى المدبر؛ وكلاهما لما يتخلق بعدهما من الأعضاء رئيس لا مرؤوس. وأحدهما، وهو الثاني، أتمم رئاسة من الثالث فالأول منهما لما تعلق به الروح، واشتعلت حرارته تشكل بشكل النار لصنوبري وتشكل أيضاً الجسم الغليظ المحدق به على شكله، وتكون لحماً صلباً، وصار عليه غلاف صفيق يحفظه وسمي العضو كله قلباً واحتاج لما يتبع الحرارة من التحليل وافناء الرطوبات إلى شيء يمده ويغذوه، ويخلف ما تحلل منه على الدوام، وإلا لم يطل بقاؤه، واحتاج أيضاً إلى تحسس بما يلائمه فيجذبه، وبما يخالفه فيدفعه. فتكفل له العضو الواحد بما فيه من القوى التي أصلها منه بحاجته الواحدة، وتكفل له العضو الآخر بحاجته الأخرى.
62
+
63
+ وكان المتكفل بالحس هو الدماغو المتكفل بالغذاء هو الكبد؛ واحتاج كل واحد من هذين إليه في أن يمدها بحرارته، وبالقوى المخصوصة بهما التي أصلها منه ، فانتسجت بينهما لذلك كله مسالك وطرق: بعضها أوسع من بعض بحسب ما تدعواليه الضرورة، فكانت الشرايين و العروق. وصفه الطبيعيون في خلقة الجنين في الرحم، لم يغادروا من ذلك شيئاً، إلى أن كمل خلقه، وتمت أعضاؤه، وحصل في حد خروج الجنين من البطن، واستعانوا في وصف كمال ذلك بتلك الطينة الكبيرة المتخمرة، وأنها كانت قد تهيأت لان يتخلق منها كل ما يحتاج إليه في خلق الإنسان من الأغشية المجللة لجملة بدنه وغيرها فلما كمل انشقت عنه تلك الأغشية، بشبه المخاض، وتصدع باقي الطينة إذ كان قد لحقه الجفاف.
64
+
65
+ ثم استغاث ذلك الطفل عند فناء مادة غذائه واشتداد جوعه، فلبته ظبية فقدت طلاها. ثم استوى عبد ما وصفه هؤلاء بعد هذا الموضع، وما وصفه الطائفة الأولى في معنى التربية؛ فقالوا جميعاً: إن الظبية التي تكفلت به وافقت خصباً ومرعى أثيثاً، فكثر لحمها وكثر لبنها، حتى قام بغذاء ذلك الطفل أحسن قيام. وكانت معه لا تبعد عنه إلا لضرورة الرعي. وألف الطفل تلك الظبية حتى كان بحيث إذا هي أبطأت عنه اشتد بكاؤه فطارت إليه.
66
+
67
+ ولم يكن بتلك الجزيرة شيء من السباع العادية، فتربى الطفل ونما واغتذى بلبن تلك الظبية إلى أن تم له حولان، وتدرج في المشي وأثغر فكان يتبع تلك الظبية، وكانت هي ترفق به و ترحمه وتحمله إلى مواضع فيها شجر مثمر فكانت تطعمه ما تساقط من ثمراتها الحلوة النضيجة؛ وما كان منها صلب القشر كسرته له بطواحنها؛ ومتى عاد إلى اللبن أروته، ومتى ظمئ إلى الماء أرودته، متى ضحا ظللته؛ ومتى خصر أدفأته.
68
+
69
+ وإذا جن الليل صرفته إلى مكان الأول وجللته بنفسها وبريش كان هناك؛ مما ملئ به التابوت أولاً في وقت وضع الطفل فيه. وكان في غدوهما ورواحهما قد ألفهما ربرب يسرح ويبيت معهما حيث مبيتهما. فما زال الطفل مع الظباء على تلك الحال: يحكي نغمتها بصوته حتى لا يكاد يفرق بينهما؛ وكذلك كان يحكي جميع ما يسمعه من أصوات الطير وأنواع سائر الحيوان محاكاة شديدة لقوة انفعاله لما يريده ما كانت محاكاته لأصوات الظباء في الاستصراخ والاستئلاف والاستدعاء والاستدفاع. إذ للحيوانات في هذه الأحوال المختلفة أصوات مختلفة فألفته الوحوش وألفها؛ ولم تنكره ولا أنكرها.
70
+
71
+ فلما ثبت في نفسه أمثلة الأشياء بعد مغيبها عن مشاهدته، حدث له نزوغ إلى بعضها؛ وكراهية لبعض. وكان في ذلك كله ينظر إلى جميع الحيوانات فيراها كاسية بالاوبار و الأشعار و أنواع الريش، وكان يرى ما لها من العدو وقوة البطش، وما لها من الأسلحة المعدة لمدافعة من ينازعها، مثل القرون و الأنياب و الحوافر و الصياصي و المخالب. ثم يرجع إلى نفسه، فيرى ما به من العري وعدم السلاح، وضعف العدو، وقلة البطش، عندما كانت تنازعه الوحوش أكل الثمرات، وتستبد بها دونه، وتغلبه عليها، فلا يستطيع المدافعة عن نفسه، ولا الفرار عن شيء منها. وكان يرى أترابه من أولاد الظباء، قد تبتت لها قرون، بعد أن لم تكن، وصارت قوية بعد ضعفها في العدو.
72
+
73
+ ولم ير لنفسه شيئاً من ذلك فكان يفكر في ذلك ولا يدري ما سببه. وكان ينظر إلى ذوي العاهات والخلق الناقص فلا يجد لنفسه شبيهاً فيهم. وكان أيضاً ينظر إلى مخارج الفضول من سائر الحيوانات، فيراها مستورة: أما مخرج أغلظ الفضلتين فبالاذناب، وأما مخرج وأما مخرج أرقهما فبالاوبار وما أشبههما. ولأنها كانت أيضاً اخفى قضباناً منه. فكان ذلك ما يكربه ويسؤه.
74
+
75
+ فلما طال همه في ذلك كله، وهو قد قارب سبعة اعوام، ويئس من أن يكمل له ما قد أضر به نقصه، اتخذ من أوراق الشجر العريضة شيئاً جعل بعضه خلفه و بعضه قدمه، وعمل من الخوض والحلفاء شبه حزام على وسطه، علق به تلك الأوراق فلم يلبث إلا يسيراً حتى ذوى ذلك الورق وجف وتساقط. فما زال يتخذ غيره ويخصف بعضه ببعض طاقات مضاعفة، وربما كان ذلك أطول لبقائه إلا انه على كل حال قصير المدة.
76
+
77
+ واتخذ من أغصان الشجر عصياً وسوى أطرافها وعدل متنها. وكان بها على الوحوش المنازعة له، فيحمل على الضعيف منها، ويقاوم القوي منها، فنبل بذلك قدره عند نفسه بعض نباله، ورأى أن ليده فضلاً كثيراً على أيديها: إذ أمكن له بها ستر عورته واتخاذ العصي التي يدافع بها عن حوزته، ما استغنى به عما أراده من الذنب والعذاب الطبيعي. وفي خلال ذلك ترعرع واربى على السبع سنين، وطال به العناء في تجديد الأوراق التي كان يستتر بها.
78
+
79
+ فكانت نفسه عند ذلك تنازعه إلى اتخاذ ذنب من ذنوب الوحوش الميتة ليعلقه على نفسه، إلا أنه كان يرى أحياء الوحوش تتحامى ميتها وتفر عنه فلا يتأتى له الأقدام على ذلك الفعل، إلى أن صادف في الأيام نسراً ميتاً فهدي إلى نيل أمله منه، واغتنم الفرصة في، إذ لم ير للوحوش عنه نفرةً فأقدم عليه، وقطع جناحيه وذنبه صحاحاً كما هي، وفتح ريشها وسواها، وسلخ عنه سائر جلده، وفصله على قطعتين: ربط إحداهما على ظهره، وأخرى على سرته وما تحتها، وعلق الذنب من خلفه، وعلق الجناحين على عضديه، فأكسبه ذلك ستراً ودفئاً ومهابة في نفوس جميع الوحوش، حتى كانت لا تنازعه ولا تعارضه. فصار لايدنو إليه شيء منها سوى الظبية التي كانت أرضعته وربته: فانها لم تفارقه ولا فارقها، إلى أن اسنت وضعغت، فكان يرتاد بها المراعي الخصبة ويجتني لها الثمرات الحلوة، ويطعمها.
80
+
81
+ ومازل الهزل والضعف يستولي عليها ويتوالى، إلى أن أدركها الموت، فسكنت حركاتها بالجملة، وتعطلت جميع أفعالها. فلما رأها الصبي على تلك الحالة، جزع جزعاً شديداً، وكادت نفسه تفيض أسفاً عليها. فكان يناديها بالصوت الذي كانت عادتها أن تجيبه عند سماعه، ويصيح بأشد ما يقدر عليه، فلا لها عند ذلك حركة ولا تغييراً. فكان ينظر إلى أذنيها والى عينيها فلا يرى بها آفة ظاهرة، وكذلك كان ينظر إلى جميع أعضائها فلا يرى بشيء منها آفة.
82
+
83
+ فكان يطمع إن يعثر على موضع الآفة فيزيلها عنها، فترجع إلى ما كانت عليه فلم ياتت له شيء من ذلك ولا استطاعة. وكان الذي أرشده لهذا الرأي ما كان قد اعتبره في نفسه قبل ذلك: لانه كان يرى انه إذا غمض عينيه أو حجبهما بشيء لا يبصر حتى نزول ذلك العائق، وكذلك كان يرى انه اذا ادخل إصبعه في أذنيه وسدها لا يسمع شيئاً حتى يزول ذلك العارض، وإذا امسك أنفه بيده لا يشم شيئاً من الروائح حتى يفتح أنفه. فاعتقد من اجل ذلك إن جميع ماله من الادراكات و الأفعال قد تكون لها عوائق تعوقها، فإذا أزيلت العوائق عادت الأفعال.
84
+
85
+ فلما نظر إلى جميع أعضاء الظاهرة ولم ير فيها آفة ظاهرة - وكان يرى مع ذلك العطلة قد اشتملها ولم يختص بها عضو دون عضو - وقع في خاطرة أن الآفة التي نزلت بها، إنما هي العضو غائب عن العيان مستكن في باطن الجسد، وان ذلك العضو لا يغني عنه في فعله شيء من هذه الأعضاء الظاهرة. فلما نزلت به الآفة عمت المضرة، وشملت العطلة، وطمع لو أنه عثر على ذلك العضو وأزال عنه ما يزال به لاستقامت أحواله وفاض على سائر البدن نفعه، وعادت الأفعال إلى ما كانت عليه.
86
+
87
+ وكان قد شاهد قبل ذلك في الأشباح الميتة من الوحوش وسواها أن جميع أعضائها مصمتة لا تجويف فيها إلا القحف، والصدر، والبطن. فوقع في نفسه أن العضو الذي بتلك الصفة لن يعدو أحد هذه المواضع الثلاثة، وكان يغلب على ظنه غلبة قوية أنه إنما هو في الموضع المتوسط من هذه المواضع الثلاثة، إذ استقر في نفسه أن جميع الأعضاء محتاجة إليه، وأن الواجب بحسب ذلك أن يكون مسكنه في الوسط.
88
+
89
+ وكان أيضاً إذا رجع إلى ذاته، شعر بمثل هذا العضو في صدره لانه كان يعترض سائراً اعضائه كاليد، والرجل، والأذن، والانف، والعين، ويقدر مفارقتها، فيتاى له أنه كان يستغني عنها، وكان يقدر في رأسه مثل ذلك ويظن أنه يستغني عنه، فإذا فكر في الشيء الذي يجده في صدره، لم يتأت له الاستغناء عنه طرفة عين.
90
+
91
+ وكذلك كان عند محاربته للوحوش أكثر ما كان يتقي من صياصيهم على صدره، لشعوره بالشيء الذي فيه. فلما جزم الحكم بان العضو الذي نزلت به الآفة إنما هو في صدورها، اجمع على البحث عليه والتنقير عنه، لعله يظفر به، ويرى آفته فيزيلها ثم انه خاف أنه يكون نفس فعله هذا أعظم من الآفة التي نزلت بها أولاً فيكون سعيه عليها. ثم أنه تفكر: هل رأى من الوحوش وسواها، من ضار في مثل تلك الحال، ثم عاد إلى مثل حاله الأول؟ فلم يجد شيئاً! فحصل له من ذلك، اليأس من رجوعها إلى حالها الأولى إن هو تركها، وبقي له بعض الرجاء في رجوعها إلى تلك الحال إن هو وجد ذلك العضو وأزال الآفة عنه. فعزم على شق صدرها وتفتيش ما فيه، فاتخذ من كسور الأحجار الصلدة وشقوق القصب اليابسة، أشباه السكاكين، وشق بها بين أضلاعها حتى قطع اللحم الذي بين الأضلاع، وأفضى إلى الحجاب المستبطن للأضلاع فراه قوياً، فقوي ظنه مثل ذلك الحجاب لا يكون إلا لمثل ذلك العضو وطمع بأنه إذا تجاوزه ألفى مطلوبه فحاول شقه، فصعب عليه، لعدم الآلات، ولأنها لم تكن إلا من الحجارة والقصب، فاستجدها ثانية واستحدها وتلطف في خرق الحجاب حتى انخرق له، فأفضى إلى الرئة فظن أنها مطلوبه، فما زال يقلبها ويطلب موضع الآفة بها.
92
+
93
+ وكان أولاً نصفها الذي هو في الجانب الواحد. فلما راها مائلة إلى جهة واحدة، وكان قد اعتقد أن ذلك العضو لا يكون إلا في الوسط في عرض البدن، كما في الوسط في طوله. فمازال يفتش في وسط الصدر حتى ألفى القلب وهو مجلل بغشاء في غاية القوة مربوط بعلائق في غاية الوثاقة، والرثة مطيفة به من الجهة التي بدأ بالشق منها، فقال في نفسه: إن كان لهذا العضو من الجهة الأخرى مثل ما له من الجهة فهو في حقيقة الوسط، ولا محالة أنه مطلوبي. لا سيما مع ما أرى له حسن الوضع، وجمال الشكل، وقلة التشتت، وقوة اللحم، وأنه محجوب بمثل هذا الحجاب الذي لم أر مثله لشيء من الأعضاء. فبحث عن الجانب الآخر من الصدر، فوجد فيه الحجاب المستبطن للأضلاع، ووجد الرئة كمثل ما وجد من هذه الجهة.
94
+
95
+ فحكم بان ذلك العضو هو مطلوبه، فحاول هتك حجابه، وشق شغافه، فبكد واستكراه ما، قدر على ذلك، بعد استفراغ مجهوده. وجرد القلب فراه مصمتاً من كل جهة، فنظر هل يرى فيه آفة ظاهرة؟ فلم ير فيه شيئاً! فشد على يده، فتبين له أن فيه تجويفاً، فقال: لعل مطلوبي الأقصى إنما هو في داخل هذا العضو، وأنا حتى الآن لم أصل إليه. فشق عليه، فألقى فيه تجويفين اثنين احدهما من الجهة اليمنى والآخر من الجهة اليسرى، والذي من الجهة اليمنى مملوء بعقد منعقد، والذي من الجهة اليسرى خال لا شيء به.
96
+
97
+ فقال: لن يعدو مطلوبي أن يكون مسكنه أحد هذين البيتين. ثم قال: أما هذا البيت الأيمن، فلا أرى فيه إلا هذا الدم المنعقد. ولا شك أنه لم ينعقد حتى صار الجسد كله إلى هذا الحال - إذ كان قد شاهد الدماء متى سالت وخرجت انعقدت وجمدت ولم يكن هذا إلا دماً كسائر الدماء - وأنا أرى أن هذا الدم موجود في سائر الأعضاء لا يختص به عضو دون أخر، وأنا ليس مطلوبي شيئاً بهذه الصفة إنما مطلوبي الشيء الذي يختص به هذا الموضع الذي أجدني لا أستغني عنه طرفة العين، واليه كان انبعاثي من أول. واما هذا الدم فكم مرة جرحتني الوحوش في المحاربة فسال مني كثير منه فما ضرني ذلك ولا افقدني شيئاً من أفعالي، فهذا بيت ليس فيه مطلوبي. وأما هذا البيت الأيسر فأراه خالياً لاشيء فيه، وما أرى ذلك لباطل، فاني رأيت كل عضو من الأعضاء إنما لفعل يختص به، فكيف يكون هذا البيت على ما شاهدت من شرفه باطلاً؟ ما أرى إلا أن مطلوبي كان فيه! فارتحل عنه وأخلاه. وعند ذلك، طرأ على هذا الجسد من العطلة ما طرأ، ففقد الإدراك وعدم الحراك. فلما رأى أن الساكن في ذلك البيت قد ارتحل قبل انهدامه وتركه وهو بحاله، تحقق أنه أحرى أن لا يعود إليه بعد أن حدث فيه من الخراب والتخريق ما حدث. فصار عنده الجسد كله خسيساً لا قدر له بالإضافة إلى ذلك الشيء الذي اعتقد في نفسه أنه يسكنه مدة ويرحل عنه بعد ذلك.
98
+
99
+ فاقتصر على الفكرة في ذلك الشيء ما هو؟ وكيف هو؟ وما الذي ربطه بهذا الجسد؟ والى اين صار؟ ومن أي الأبواب خرج عند خروجه من الجسد؟ وما السبب الذي أزعجه إن كان خرج كارهاً؟ وما السبب الذي كره إليه الجسد، حتى فارقه إن كان خرج مختاراً؟ وتشتت فكره في ذلك كله، وسلا عن الجسد وطرحه، وعلم أن أمه التي عطفت عليه وأرضعته، إنما كانت ذلك الشيء المرتحل، وعنه كانت تصدر تلك الأفعال كلها، لا هذا الجسد العاطل وأن هذا الجسد بجملته، إنما هو كالآلة وبمنزلة العصي التي اتخذها هو لقتال الوحوش. فانتقلت علاقته عن الجسد إلى صاحب الجسد ومحركه، ولم يبق له شوق إلا إليه. وفي خلال ذلك نتن ذلك الجسد، وقامت منه روائح كريهة، فزادت نفرته عنه، وود أن لا يراه ثم انه سنح لنظره غرابان يقتتلان حتى صرع أحدهما الآخر ميتاً. ثم جعل الحي يبحث في الأرض حتى حفر حفرة فوارى فيها ذلك الميت بالتراب فقال في نفسه: ما أحسن ما صنع هذا الغراب في مواراة جيفة صاحبه وان كان قد أساء في قتله اياه! وأنا كنت أحق بالاهتداء إلى هذا الفعل بآمي! فحفر حفرة وألقى فيها جسد أمه، وحثا عليها التراب.
100
+
101
+ وبقي يتفكر في ذلك الشيء المصرف للجسد لا يدري ما هو! غير أنه كان ينظر إلى أشخاص الظباء كلها، فيراها على شكل أمه، وعلى صورتها فكان يغلب على ظنه، أن كل واحد منها إنما يحركه ويصرفه شيء هو مثل الشيء الذي كان يحرك أمه ويصرفها، فكان يألف الظباء ويحن إليها لمكان ذلك الشبه. وبقي على ذلك برهة من الزمن، يتصفح أنواع الحيوان والنبات ويطوف بساحل تلك الجزيرة، ويتطلب هل يرى أو يجد لنفسه شبيهاً حسبما يرى لكل واحد من أشخاص الحيوان والنبات أشباهاً كثيرة، فلا يجد شيئاً من ذلك. وكان يرى البحر قد أحدق بالجزيرة من كل جهة، فيعتقد أنه ليس في الوجود أرض سوى جزيرته تلك.
102
+
103
+ واتفق في بعض الاحيان أن انقدحت نار في أجمة قلخ على سبيل المحاكة. فلما بصر بها رأى منظراً هاله، وخلقاً لم يعهده قبل، فوقف يتعجب منها ملياً، ومازال يدنو منها شيئاً فشيئاً، فرأى ما للنار من الضوء الثاقب والفعل الغالب حتى لا تعلق بشيء إلا أتت عليه وأحالته إلى نفسها، فحمله، العجب بها، وبما ركب الله تعالى في طباعه من الجراءة و القوة، على أن يده إليها، وأراد أن يأخذ منها شيئاً فلما باشرها أحرقت يده فلم يستطع القبض عليها فاهتدى إلى أن يأخذ قبساً لم تستول النار على جميعه، فأخذ بطرفه السليم والنار في طرفه الآخر، فتاتي له ذلك وحمله إلى موضعه الذي كان يأوي إليه - وكان قد خلا في جحر استحسنه للسكنى قبل ذلك. ثم مازال يمد تلك النار بالحشيش والحطب الجزل، ويتعهدهاً ليلاً ونهاراً استحساناً منه وتعجباً منها.
104
+
105
+ وكان يزيد انسه بها ليلاً، لأنها كانت تقوم له مقام الشمس في الضياء و الدفء، فعظم بها ولوعه، واعتقد أنها أفضل الأشياء التي لديه: وكان دائماً يراها تتحرك إلى جهة فوق وتطلب العلو، فغلب على ظنه أنها من جملة الجواهر السماوية التي كان يشاهدها. وكان يختبر قوتها في جميع الأشياء بأن يلقيها فيها، فيراها مستولية عليه أما بسرعة واما ببطء بحسب قوة استعداد الجسم الذي كان يلقيه للاحتراق أو ضعفه. وكان من جملة ما القى فيها على سبيل الاختبار لقوتها، شيء من أصناف الحيوانات البحرية - كان قد ألقاه البحر إلى ساحله - فلما أنضجت ذلك الحيوان وسطع قتاره تحركت شهوته إليه، فأكل منه شيئاً فاستطابه، فاعتاد بذلك أكل اللحم، فصرف الحيلة في صيد البر والبحر، حتى مهر في ذلك. وزادت محبته للنار، إذ تأتي له بها من وجوه الاغتذاء الطيب شيء لم يتأت له قبل ذلك.
106
+
107
+ فلما اشتد شغفه بها لما رأى من أحسن آثارها وقوة اقتدارها، وقع في نفسه أن الشيء الذي ارتحل من قلب أمه الظبية التي أنشأته، كان من جوهر هذا الوجود أو من شيء يجانسه، وأكد ذلك في ظنه، ما كان يراه من حرارة الحيوان طول مدة حياته، وبرودته من بعد موته، وكل هذا دائم لا يختل، وما كان يجده في نفسه من شدة الحرارة عند صدره، بازاء الموضع الذي كان قد شق عليه من الظبية، فوقع في نفسه أنه لو أخذ حيواناً حياً وشق قلبه ونظر إلى ذلك التجويف الذي صادفه خالياً عندما شق عليه في أمه الظبية، لرأه في الحيوان الحي وهو مملوء بذلك الشيء الساكن فيه وتحقق هل هو من جوهر النار؟ وهل فيه شيء من الضوء والحرارة، آم لا؟ فعمد إلى بعد الوحوش واستوثق منه كتافاً وشقه على الصفة التي شق بها الظبية حتى وصل القلب. فقصد أولاً إلى الجهة اليسرى منه وشقها، فرأى ذلك الفراغ مملوءاً بهواء بخاري، يشبه الضباب الابيض، فأدخل إصبعه فيه، فوجده من الحرارة في حد كاد يحرقه، ومات ذلك الحيوان على الفور.
108
+
109
+ فصح عنده أن ذلك البخار الحار هو الذي كان يحرك هذا الحيوان، وأن في كل شخص من أشخاص الحيوانات مثل ذلك، ومتى انفصل عن الحيوان مات. ثم تحركت في نفسه الشهوة للبحث عن سائر أعضاء الحيوان وترتيبها وأوضاعها وكميتها وكيفية ارتباط بعضها ببعض، وكيف تستمد من هذا البخار الحار حتى تستمر لها الحياة به، وكيف بقاء هذا البخار المدة التي يبقى، ومن أين يستمد، وكيف لا تنفذ حرارته؟ فتتبع ذلك كله بتشريح الحيوانات الأحياء و الاموات، ولم يزل ينعم النظر فيها ويجيد الفكرة، حتى بلغ في ذلك كله مبلغ كبار الطبيعيين، فتبين له أن كل شخص من أشخاص الحيوان، وان كان كثيراً بأعضائه وتفنن حواسه وحركاته فانه واحد بذلك الروح الذي مبدؤه من قرار واحد، وانقسامه وانقسامه في سائر الأعضاء منبعث منه. وأن جميع الأعضاء إنما هي خادمة له، أو مؤدية عنه، وأن منزلة ذلك الروح في تصريف الجسد، كمنزلة من يحارب الأعداء بالسلاح التام، ويصيد جميع صيد البر والبحر، فيمد لكل جنس آلة يصيده بها والتي يحارب بها تنقسم: إلى ما يدفع به نكيلة غيره، والى ما ينكي بها غيره.
110
+
111
+ وكذلك آلات الصيد تنقسم: إلى ما يصلح لحيوان البحر، والى ما يصلح لحيوان البر، وكذلك الأشياء التي يشرح بها تنقسم: إلى ما يصلح للشق، والى ما يصلح للكسر، والى ما يصلح للثقب، والبدن الواحد، وهو يصرف ذلك أنحاء من التصريف بحسب ما تصلح له كل آلة، وبحسب الغايات التي تلتمس بذلك التصرف. كذلك؛ ذلك الروح الحيواني واحد، وإذا عمل بالة العين كان فعله أبصاراً، وإذا عمل بآلة الآذن كان فعله سمعاً، وإذا عمل بآلة الآنف كان فعله شماً، وإذا عمل بآلة اللسان كان فعله ذوقاً، وإذا عمل بالجلد واللحم كان فعله لمساً، وإذا عمل بالعضد كان فعله حركه، وإذا عمل بالكبد كان فعله غذاء واغتذاء.
112
+
113
+ ولكل واحد من هذه، أعضاء تخدمه. ولا يتم لشيء من هذه فعل إلا بما يصل إليها من ذلك الروح، على الطريق التي تسمى عصباً. ومتى انقطعت تلك الطرق أو انسدت، تعطل فعل ذلك العضو. وهذه الأعصاب إنما تستمد الروح من بطون الدماغ يستمد الروح من القلب، والدماغ فيه أرواح كثير، لانه موضع تتوزع فيه أقسام كثيرة: فآي عضو عدم هذا الروح بسبب من الأسباب تعطل فعله وصار بمنزلة الآلة المطرحة، التي يصرفها الفاعل ولا ينتفع بها. فان خرج هذا الروح بجملته عن الجسد، أو فني، أو تحلل بوجه من الوجوه، تعطل الجسد كله، وصار إلى حالة الموت، فانتهى به إلى هذا من منشئه، وذلك أحد وعشرون عاماً.
114
+
115
+ وفي خلال هذه المدة المذكورة تفنن في وجوه حيله، واكتسى بجلود الحيوانات التي كان يشرحها، واحتذى بها، واتخذ الخيوط من الأشعار ولحا قصب الخطمية والخباري والقنب، وكل نبات ذي خيط. وكان أصل اهتدائه إلى ذلك، أنه أخذ من الحلفاء وعمل خطاطيف من الشوك القوي والقصب المحدد على الحجارة.
116
+
117
+ واهتدى إلى البناء بما رأى من فعل الخطاطيف فاتخذ مخزناً وبيتاً لفضلة غذائه، وحصن عليه بباب من القصب المربوط بعضه إلى بعض، لئلا يصل إليه شيء من الحيوانات عند مغيبه عن تلك الجهة في بعض شؤونه. واستألف جوانح الطير ليستعين بها في الصيد، واتخذ الدواجن ببيضها وفراخها، واتخذ من الصياصي البقر الوحشية شبه الاسنة، وركبها في القصب القوي، وفي عصي الزان وغيرها، واستعان في ذلك بالنار وبحروف الحجارة، حتى صارت شبه الرماح، واتخذ ترسه من جلود مضاعة: كل ذلك لما رأى من عدمه السلاح الطبيعي. ولما رأى أن يده تفي له بكل ما فاته من ذلك، وكان لا يقاومه شيء من الحيوانات على اختلاف أنواعها، إلا أنها كانت عنه فتعجزه هرباً، فكر في وجه الحيلة في ذلك، فلم ير شيئاً أنجع له من أن يتالف بعض الحيوانات الشديدة العدو، ويحسن إليها بأعداد الغذاء الذي يصلح لها، حتى يتأتى له الركوب عليها ومطاردة سائر الأصناف بها.
118
+
119
+ وكان بتلك الجزيرة خيل البرية وحمر وحشية، فاتخذ منها ما يصلح له، وراضها حتى كمل بها غرضه، وعمل عليها من الشرك والجلود أمثال الشكائم والسروج فتاتي له بذلك ما امله من طرد الحيوانات التي صعبت عليه الحيلة في أخذها. وانما تفنن في هذه الأمور كلها ف وقت اشتغاله التشريح، وشهوته في وقوفه على خصائص أعضاء الحيوان، وبماذا تختلف، وذلك في المدة التي حددنا منتهاها بأحد وعشرين عاماً. ثم انه بعد ذلك أخذ في مآخذ أخر من النظر، فتصفح جميع الأجسام التي في عالم الكون والفساد: من الحيوانات على اختلاف أنواعها، والنبات والمعادن وأصناف الحجارة والتراب والماء والبخار والثلج والبرد، والدخان واللهيب والجمر، فرأى لها أصوافاً كثيرة وأفعالاً مختلفة، وحركات متفقة ومضادة، وأنعم النظر في ذلك والتثبت، فرأى أنها تتفق ببعض الصفات وتختلف ببعض، وأنها من الجهة التي تتفق بها واحدة، ومن الجهة التي تختلف فيها متغايرة ومتكثرة فكان تارة ينظر خصائص الأشياء وما يتفرد به بعضها عن بعض، فتكثر عنده كثرة تخرج عن الحصر، وينتشر له الوجود انتشار لا يضبط. كل عضو منها فيرى أنه يحتمل القسمة إلى أجزاء كثيرة جداً، فيحكم على ذاته بالكثرة، وكذلك على ذات كل شيء.
120
+
121
+ ثم كان يرجع إلى نظر آخر من طريق ثان، فيرى أن أعضاءه، وان كانت كثيرة فهي متصلة كلها بعضها ببعض، لا انفصال بينها بوجه، فهي في الحكم الواحد، وأنها لا تختلف إلا بحسب اختلاف أفعالها، أن ذلك الاختلاف إنما هو بسبب ما يصل إليها من قوة الروح الحيواني، الذي انتهى إليه نظره أولاً، وأن ذلك الروح واحد ذاته، وهو حقيقة الذات، وسائر الأعضاء كلها كالآلات، فكانت تتحد عنده ذاته بهذا الطريق.
122
+
123
+ ثم أنه كان ينتقل إلى جميع أنواع الحيوانات، فيرى كل شخص منها واحداً بهذا النوع من النظر. ثم كان ينظر إلى نوع منها: كالظباء والخيل وأصناف الطير صنفاً صنفاً، فكان يرى أشخاص كل نوع يشبه بعضه بعضاً في الأعضاء الظاهرة والباطنة الادراكات والحركات والمنازع، ولا يرى بينها اختلافاً إلا في أشياء يسيرة بالإضافة إلى ما اتفقت فيه.
124
+
125
+ وكان يحكم بان الروح الذي لجميع ذلك النوع شيء واحد، وأنه لم يختلف إلا أنه انقسم على قلوب كثيرة، وأنه لو أمكن أن يجمع جميع الذي افترق في تلك القلوب منه ويجعل في وعاء واحد، لكان كله شيئاً واحداً، بمنزلة ماء واحد، أو شراب واحد، يفرق على أوان كثيرة، ثم يجمع بعد ذلك. فهو في حالتي تفريقه وجمعه شيء واحد، إنما الغرض له التكثر بوجه ما، فكان يرى النوع بهذا النظر واحداً، ويجعل كثرة أشخاصه بمنزلة كثيرة أعضاء الشخص الواحد، التي لم تكن كثرة في الحقيقة.
126
+
127
+ ثم كان يحضر أنواع الحيوانات كلها في نفسه ويتأملها فيراها تتفق في أنها تحس، وتغتذي، وتتحرك بالإرادة إلى أي جهة شاءت، وكان قد علم أن هذه الأفعال هي أخص أفعال الروح الحيواني، وأن سائر الأشياء التي تختلف بها بعد هذا الاتفاق، ليست شديدة الاختصاص بالروح الحيواني. فظهر له بهذا التأمل، أن الروح الحيواني الذي لجميع جنس الحيوان واحد بالحقيقة، وان كان فيه اختلاف يسير، اختص به نوع دون نوع: بمنزلة ماء واحد مقسوم على أوان كثيرة، بعضه أبرد من بعض.
128
+
129
+ وهو في أصله واحد وكل ما كان في طبقة واحدة من البرودة، فهو بمنزلة اختصاص ذلك الروح الحيواني بنوع واحد، وان عرض له التكثر بوجه ما. فكان يرى جنس الحيوان كله واحداً بهذا النوع من النظر. ثم كان يرجع إلى أنواع النبات على اختلافها. فيرى كل نوع منها تشبه أشخاصه بعضها بعضاً في الأغصان، والورق، والزهر والثمر، والأفعال فكان يقيسها بالحيوان، ويعلم أن لها شيئاً واحداً فيه: هو لها بمنزلة الروح الحيواني وأنها بذلك الشيء واحد. وكذلك كان ينظر إلى جنس النبات كله، فيحكم باتحاده بحسب ما يراه من اتفاق فعله في أنه يتغذى وينمو.
130
+
131
+ ثم كان يجمع في نفسه جنس الحيوان وجنس النبات، فيراهما جميعاً متفقين في الاغتذاء والنمو، ألا أن الحيوان يزيد على النبات، بفضل الحس والادراك والتحرك؛ وربما ظهر في النبات شيء شبيه به، مثل تحول وجوه الزهر إلى جهة الشمس، وتحرك عروقه إلى الغذاء، بسبب شيء واحد مشترك بينهما، هو في أحدهما أتمم وأكمل، وفي الآخر قد عاقه عائق ما، وأن ذلك بمنزلة ماء واحد قسم بقسمين، أحدهما جامد والآخر سيال، فيتحد عنده النبات والحيوان. ثم ينظر إلى الأجسام التي لا تحس ولا تغتذي ولا تنمو، من الحجارة، والتراب، والماء، والهواء، واللهب، فيرى أنها أجسام مقدر لها الطول وعرض وعمق وأنها لاتختلف، إلا أن بعضها ذو لون وبعضها لا لون له وبعضها حار والآخر بارد، ونحو ذلك من الاختلافات وكان يرى أن الحار منها يصير بارداً، والبارد يصير حار وكان يرى الماء يصير بخاراً والبخار ماء، والأشياء المحترقة تصير جمراً، ورماداً، ولهيباً، ودخاناً، والدخان إذا وافق في صعوده قبة حجر انعقد فيه وصار بمنزلة سائر الأشياء الأرضية، فيظهر له بهذا التأمل، أن جميعها شيء واحد في الحقيقة، وان لحقتها الكثرة بوجه ما، فذلك مثل ما لحقت الكثرة للحيوان والنبات.
132
+
133
+ ثم ينظر إلى الشيء الذي اتحد به عند النبات والحيوان، فيرى أنه جسم ما مثل هذه الأجسام: له طول وعرض وعمق، وهو إما حار واما بارد، كواحد من هذه الأجسام التي لا تحس ولا تتغذى، وانما خالفها بأفعاله التي تظهر عنه بالآلات الحيوانية والنباتية لا غير، ولعل تلك الأفعال ليست ذاتية، وانما تسري إليه من شيء آخر ولو سرت إلى هذه الأجسام الآخر، لكانت مثله فكان ينظر إليه بذاته مجرداً عن هذه الأفعال، التي تظهر ببادئ الرأي، أنها صادرة عنه، فكان يرى أنه ليس إلا جسماً من هذه الأجسام، فيظهر له بهذا التأمل، أن الأجسام كلها شيء واحد: حيها وجمادها، متحركها وساكنها، إلا أنه يظهر أن لبعضها أفعالاً بالات، ولا يدري هل تلك الأفعال ذاتية لها، أو سارية أليها من غيرها. وكان في هذه الحال لا يرى شيئاً غير الأجسام فكان بهذا الطريق يرى الوجود كله شيئاً واحداً، وبالنظر الأول كثرة لا تنحصر ولا تتناهى. وبقي بحكم هذه الحالة مدة.
134
+
135
+ ثم انه تأمل جميع الأجسام حيها وجامدها. وهي التي هي عنده تارةً شيء واحد وتارةً كثيرة كثرة لا نهاية لها، فرأى إن كل واحد منها، لا يخلو من أحد أمرين: إما أن يتحرك إلى جهة العلو مثل الدخان واللهيب والهواء، إذا حصل تحت الماء واما أن يتحرك إلى الجهة المضادة لتلك الجهة، وهي جهة السفل، مثل الماء، وأجزاء الحيوان و النبات، وأن كل جسم من هذه الأجسام لن يعرى عن إحدى هاتين الحركتين وأنه لا يسكن إلا إذا منعه مانع يعوقه عن طريقه، مثل الحجر النازل يصادف وجه الأرض صلباً، فلا يمكن أن يخرقه، ولو أمكنه ذلك لما انثنى عن حركته فيما يظهر، ولذلك إذا رفعته، وجدته يتحامل عليك بميله إلى جهة السفل، طالباً للنزول. وكذلك الدخان في صعوده، لا ينثني إلا أن يصادف قبة صلبة تحبسه، فحينئذً ينعطف يميناً وشمالاً ثم إذا تخلص من تلك القبة، خرق الهواء صاعداً لأن الهواء لا يمكنه أن يحبسه.
136
+
137
+ وكان يرى إن الهواء إذا ملئ به زق جلد، وربط ثم غوص تحت الماء طلب الصعود وتحامل على من يمسكه تحت الماء، ولا يزال يفعل ذلك حتى يوافي موضع الهواء، وذلك بخروجه من تحت الماء فحينئذً يسكن ويزول عنه ذلك التحامل والميل إلى جهة العلو الذي كان يوجد منه قبل ذلك. ونظر هل يجد جسماً يعرى عن إحدى هاتين الحركتين أو الميل إلى إحداهما في الوقت ما؟ فلم يجد ذلك في الأجسام التي لديه، وانما طلب ذلك، لانه طمع أن يجده، فيرى طبيعة الجسم من حيث هو جسم، دون أن تقترن به وصف من الأوصاف، التي هي منشأ التكثر. فلما أعياه ذلك ونظر إلى الأجسام التي هي أقل الأجسام حملاً للأوصاف فلم يرها تعرى عن أحد هذين الوصفين بوجه، وهما اللذان يعبر عنهما بالثقل والخفة فنظر إلى الثقل والخفة، هل هما للجسم من حيث هو جسم؟ أو هما لمعنى زائد على الجسمية؟ فظهر له أنهما لمعنى زائد على الجسمية لانهما لو كانا للجسم من حيث هو جسم، لما وجد إلا وهما له.
138
+
139
+ ونحن نجد الثقيل لا توجد فيه الخفة، والخفيف لا يوجد فيه الثقل، وهما لا محالة جسمان ولكل واحد منهما معنى منفرد به عن الأخر زائد على جسميته. وذلك المعنى، الذي به غاير كل واحد منهما الآخر، ولولا ذلك لكانا شيئاً واحداً من جميع الوجوه.
140
+
141
+ فتبين له أن حقيقة كل واحد من الثقيل والخفيف، مركبة من معنيين: أحدهما ما يقع فيه الاشتراك منهما جميعاً، وهو معنى الجسمية؛ والآخر ما تنفرد به حقيقة كل واحد منهما على الاخر، وهما أما الثقل في احدهما واما الخفة في الاخر، المقترنان بمعنى الجسمية، أي المعنى الذي يحرك أحدهما الأخر علواً والأخر سفلاً. وكذلك نظر إلى سائر الأجسام من الجمادات والأحياء، فرأى أن حقيقة وجود كل واحد منهما مركبة من معنى الجسمية، ومن شيء أخر زائد على الجسمية: أما واحد، واما أكثر من واحد؛ فلاحت له صور الأجسام على اختلافها وهو أول ما لاح له من العالم الروحاني، اذ هي صور لا تدرك بالحس، وانما تدرك بضرب ما من النظر العقلي.
142
+
143
+ ولاح له في جملة ما لاح من ذلك، أن الروح الحيواني الذي مسكنه القلب - وهو الذي تقدم شرحه أولاً - لابد له أيضاً من معنى زائد على جسميته يصلح بذلك المعنى لأن يعمل هذه الأعمال الغريبة، التي تختص به من ضروب الاحساسات، وفنون الادراكات وأصناف الحركات، وذلك المعنى هو صورته وفضله الذي انفصل به عن سائر الأجسام، وهو الذي يعبر عنه النظار بالنفس الحيوانية. وكذلك ايضاً للشيء الذي يقوم للنبات مقام الحار الغريزي للحيوان، شيء يخصه هو صورته، وهو الذي يعبر عنه النظار بالنفس النباتية. وكذلك لجميع الأجسام الجمادات: وهي ما عدا الحيوان والنبات مما في عالم الكون والفساد شيء يخصها به، يفعل كل واحد منها فعله الذي يختص به مثل صنوف الحركات وضروب الكيفيات المحسوسة عنها، وذلك الشيء هو صورة كل واحد منها، وهو الذي يعبر النظار عنه بالطبيعة.
144
+
145
+ فلما وقف بهذا النظر على ان حقيقة الروح الحيواني، الذي كان تشوقه اليه ابداً، مركبة من معنى الجسمية، ومن معنى أخر زائد على الجسمية، وان معنى الجسمية مشترك، ولسائر الأجسام، والمعنى الأخر المقترن به هو وحده، هان عنده معنى الجسمية فاطرحه، وتعلق فكره بالمعنى الثاني، وهو الذي يعبر عنه النفس؛ فتشوق إلى التحقق به فالتزم الفكرة فيه، وجعل مبدأ النظر في ذلك تصفح الأجسام كلها، لا من جهة ما هي أجسام، بل من وجهة ما هي ذوات صور تلزم عنها خواص، ينفصل بها بعضها ببعض. فتتبع ذلك وحصره في نفسه، فرأى جملة من الأجسام، تشترك في صورة ما يصدر عنها فعل ما، أو أفعال ما، ورأى فريقاً من تلك الجملة، مع أنه يشارك الجملة بتلك الصورة، يزيد عليها بصورة أخرى، يصدر عنها ما، ورأى طائفة من ذلك الفريق، مع أنها تشارك الفريق في الصورة الأولى والثانية، تزيد عليه بصوره ثالثة، تصدر عنها أفعال ما خاصة بها. مثال ذلك: إن الأجسام الأرضية، مثل التراب والحجارة والمعادن والنبات والحيوان، وسائر الأجسام الثقيلة، وهي جملة واحدة تشترك في صورة واحدة تصدر عنها الحركة إلى الأسفل، ما لم يعقها عائق عن النزول: ومتى تحركت إلى جهة العلو بالقسر ثم تركت، تحركت بصورتها إلى الأسفل. وفريق من هذه الجملة، وهو النبات والحيوان، مع مشاركة الجملة المتقدمة في تلك الصورة، يزيد عليها صورة أخرى، يصدر عنها التغذي والنمو. والتغذي: هو أن يخلف المتغذي، بدل ما تحلل منه، بان يحيل إلى ما التشبه بجوهره مادة قريبة منه، يجتذبها إلى نفسه.
146
+
147
+ والنمو: هو الحركة في الأقطار الثلاثة، على نسبة محفوظة في الطول والعرض والعمق.
148
+
149
+ فهذان الفعلان عامان للنبات والحيوان، وهما لا محالة صادران عن صورة مشتركة لهما، وهي المعبر عنها بالنفس النباتية. وطائفة من هذا الفريق، وهو الحيوان خاصة، مع مشاركته الفريق المتقدم في الصورة الأولى والثانية، تزيد عليه بصورة ثالثة، يصدر عنها الحس والتنقل من حين إلى أخر. ورأى أيضاً كل نوع من أنواع الحيوان، له خاصية ينحاز بها عن سائر الأنواع، وينفصل بها متميزاً عنها. فعلم إن ذلك صادر عن صورة له تخصه هي زائدة عن معنى الصورة المشتركة له ولسائر الحيوان، وكذلك لكل واحد من أنواع النبات مثل ذلك. فتبين له إن الأجسام المحسوسة التي في عالم الكون والفساد، بعضها تلتئم حقيقته من معان كثيرة، زائدة على معنى الجسمية، وبعضها من معان اقل؛ وعلم إن معرفة الأقل أسهل من معرفة الأكثر؛ فطلب أولاً الوقوف على الحقيقة لشيء الذي تلتئم حقيقته من اقل الأشياء، ورأى إن الحيوان والنبات، لا تلتئم حقائقها إلا من معان كثيرة، لتفنن أفعالها؛ فأخر التفكير في صورهما. وكذلك رأى إن أجزاء الأرض بعضها ابسط من بعض، فقصد منها إلى ابسط ما قدر عليه وكذلك رأى إن الماء شيء قليل التركيب، لقلة ما يصدر عن صورته من أفعال، وكذلك راى النار والهواء. وكان قد سبق إلى ظنه أولاً، أن هذه الأربعة يستحيل بعضها إلى بعض، وان لها شيئاً واحداً تشترك فيه، وهو معنى الجسمية، وان ذلك الشيء ينبغي إن يكون خلواً من المعاني التي تميز بها كل واحد من هذه الأربعة عن الأخر، فلا يمكن أن يتحرك إلى فوق ولا إلى اسفل، ولا إن يكون حاراً ولا يكون بارداً، ولا يكون رطباً، ولا يابساً، لان كل واحد من هذه الاوصاف، لا يعم جميع الأجسام، فليست إذن للجسم بما هو جسم.
150
+
151
+ فإذا أمكن وجود جسم لا صورة فيه زائدة على الجسمية، فليس تكون فيه صفة من هذه الصفات، ولا يمكن إن تكون فيه صفة إلا وهي تعم سائر الأجسام المتصورة، بضروب الصور. فنظر هل يجد وصفاً واحداً يعم جميع الأجسام: حيها وجمادها، فلم يجد شيئاً يعم الأجسام كلها. إلا معنى الامتداد الموجود في جميعها في الأقطار الثلاثة، التي يعبر عنها بالطول، والعرض، والعمق، فعلم هذا المعنى هو للجسم من حيث هو جسم، لكنه لم يتأت له بالحس وجود جسم بهذه الصفة وحدها، حتى لا يكون فيه معنى زائد على الامتداد المذكور ويكون بالجملة خلواً من سائر الصور. ثم تفكر في هذا الامتداد إلى الأقطار الثلاثة، هل هو معنى الجسم بعينه، وليس ثم معنى أخر أو ليس الأمر كذلك، فرأى أن وراء هذا الامتداد معنى أخر، هو الذي يوجد فيه هذا الامتداد، وان الامتداد وحده لا يمكن إن يقوم بنفسه كما إن ذلك الشيء الممتد، لا يمكن أن تقوم دون امتداد. واعتبر ذلك ببعض هذه الأجسام المحسوسة ذوات الصور، كالطين مثلاً، كان له طول وعرض وعمق على قدر ما.
152
+
153
+ ثم إن تلك الكرة بعينها لو أخذت وردت إلى شكل مكعب أو بيض، لتبدل ذلك الطول وذلك العرض وذلك العمق، وصارت على قدر أخر. غير الذي كانت عليه، والطين واحد بعينه لم يتبدل، غير أنه لا بد له من طول وعرض وعمق على أي قدر كان، ولا يمكن إن يعرى عنها؛ غير أنها لتعاقبها عليه، تبين له أنها معنى على حياله؛ ولكونه لا يعرى بالجملة عنها، تبين له أنها من حقيقة. فلاح له بهذا الاعتبار، إن الجسم، بما هو جسم، مركب على الحقيقة من معنين: أحدهما يقوم منه مقام الطين للكرة في هذا المثال. والأخر: يقوم مقام طول الكرة وعرضها وعمقها، أو المكعب، أو أي شكل كان له. وانه لا يفهم الجسم إلا مركباً من هذين المعنين، وان احدهما لا يستغني عن الأخر. ولكن الذي يمكن أن يتبدل ويتعاقب على أوجه كثيرة، وهو معنى الامتداد يشبه الصورة التي لسائر الأجسام ذوات الصور، والذي يثبت على حال واحدة، وهو الذي ينزل منزلة الطين في المثال المتقدم، يشبه معنى الجسمية التي لسائر الأجسام ذوات الصور.
154
+
155
+ وهذا الشيء الذي هو بمنزلة الطين في هذا المثال هو الذي يسميه النظار المادة والهيولى وهي عارية عن الصورة جملة. فلما نظره إلى هذا الحد، وفارق المحسوس بعض مفارقة، وأشرف على تخوم العالم العقلي، استوحش وحن إلى ما ألفه من عالم الحس، فتقهقر قليلاً وترك الجسم على الإطلاق، إذ هو أمر لا يدركه الحس، ولا يقدر على تناوله. فاخذ أبسط الأجسام المحسوسة التي شاهدها، وهي تلك الأربعة التي كان قد وقف نظره عليها.
156
+
157
+ فأول ما نظر إلى الماء فرأى انه إذا خلي وما تقتضيه صورته، ظهر منه برد محسوس، وطلب النزول إلى اسفل فإذا سخن أما بالنار واما بحرارة الشمس، زال عنه البرد أولاً وبقي فيه طلب النزول، فإذا أفرط عليه بالتسخين، زال عنه طلب النزول إلى اسفل. وصار يطلب الصعود إلى فوق. فزال عنه بالجملة الوصفان اللذان كانا أبداً يصدران عن صورته، ولم يعرف من صورته أكثر من صدور هذين الفعلين عنها. فلما زال هذان الفعلان بطل حكم الصورة، فزالت الصورة المائية عن ذلك الجسم عندما ظهرت منه أفعال من شأنها أن تصدر عن صورة أخرى، وحدثت له صورة أخرى، بعد أن لم تكن، وصدر عنه بها أفعال لم يكن من شأنها أن تصدر عنه وهو بصورته الأولى. فعلم بالضرورة أن كل حادث لا بد له من محدث. فارتسم في نفسه بهذا الاعتبار، فاعل للصورة، ارتساماً على العموم دون تفصيل. ثم أنه تتبع الصور التي كان قد عاينها قبل ذلك، صورة صورة، فرأى أنها كلها حادثة، وأنها لا بد لها من فاعل. ثم نظر إلى ذوات، الصور، فلم ير أنها شيء أكثر من استعداد الجسم لان يصدر عنه ذلك الفعل، مثل الماء، فانه إذا افرط عليه التسخين، استعد للحركة إلى فوق وصلح لها.
158
+
159
+ فذلك الاستعداد هو صورته، إذ ليس ها هنا إلا جسم وأشياء تحس عنه، بعد أن لم تكن؛ فصلوح الجسم لبعض الحركات دون بعض، واستعداده بصورته، ولاح له مثل ذلك في جميع الصور، فتبين له أن الأفعال الصادرة عنها، ليست في الحقيقة لها، وانما هي لفاعل يفعل بها الأفعال المنسوبة إليها؛ وهذا المعنى الذي لاح له، هو قول الرسول الله عليه الصلاة والسلام: "كنت سمعه الذي يسمع به وبصره الذي يبصر به" وفي محكم التنزيل: "بسم الله الرحمن الرحيم" فان تقتلوهم ولكن الله قتلهم؛ وما رميت إذا رميت، ولكن الله رمى! صدق الله العظيم. فلما لاح له من أمر هذا الفاعل، ما لاح على الإجمال دون تفصيل، حدث له شوق حثيث إلى معرفته على التفصيل، ولانه لم يكن بعد فارق عالم الحس، جعل يطلب هذا الفاعل على جهة المحسوسات، وهو لا يعلم بعد هل هو واحد أو كثير؟ فتصفح جميع الأجسام التي لديه، وهي التي كانت فكرته أبداً فيها، فرأها كلها تتكون تارة وتفسد أخرى، وما لم يقف على فساد جملته، وقف على الفساد أجزائه مثل الماء والأرض، فانه راى أجزاءهما تفسد بالنار، وكذلك الهواء رآه يفسد بشدة البرد، حتى بتكون منه الثلج فيسيل ماء. وكذلك سائر الأجسام التي كانت لديه، ولم ير منها شيئاً بريئاً عن الحدوث والافتقار إلى الفاعل المختار، فاطرحها كلها وانتقلت فكرته إلى الأجسام السماوية.
160
+
161
+ وانتهى إلى هذا النظر على رأس أربعة أسابيع من منشئه، وذلك ثمانية وعشرون عاماً. فعلم إن السماء وما فيها من كواكب الأجسام، لأنها ممتدة في الأقطار الثلاثة: الطول، والعرض، والعمق؛ لا ينفك شيء منها عن هذه الصفة، وكل ما لا ينفك عن هذه الصفة، فهو جسم؛ فهي إذن كلها أجسام. ثم تفكر هل هي ممتدة إلى ما لا نهاية، وذاهبة أبداً في الطول والعرض والعمق إلى ما لا نهاية، أو هي متناهية محدودة بحدود تنقطع عندها، ولا يمكن أن يكون وراءها شيء من الامتداد؟ فتحير بعد ذلك بعض الحيرة. ثم انه بقوة فطرته، وذكاء خاطره، راى أن جسماً لا نهاية له أمر باطل، وشيء لا يمكن، ومعنى لا يعقل، وتقوى هذا الحكم عنده بحجج كثيرة، سنحت له بينه وبين نفسه وذلك أنه قال: أما الجسم السماوي فهو متناه من الجهة التي تليني والناحية التي وقع عليها حسي، فهذا لا شك فيه لأنني أدركه ببصر، وأما الجهة التي تقابل هذه الجهة، وهي التي يداخلني فيها الشك، فاني أيضاً أعلم من المحال أن تمتد إلى غير نهاية، لأني إن تخيلت أن خطين اثنين، يبتدئان من هذه الجهة المتناهية، ويمران في سمك الجسم إلى غير نهاية حسب امتداد الجسم، ثم تخيلت أن أحد هذين الخطين، قطع منه جزء كبير من ناحية طرفه المتناهي، ثم أخذ ما بقي منه شيء واطبق الخط المقطوع منه على الخط الذي لم يقطع منه شيء، وذهب الذهن كذلك معهما إلى الجهة التي يقال إنها غير متناهية، فأما أن نجد خطين أبداً يمتدان إلى غير نهاية ولا ينقص أحدهما عن الأخر، فيكون الذي قطع منه جزء مساوياً للذي لم يقطع منه شيء وهو محال، كما أن الكل مثل الجزء المحال؛ واما أن لا يمتد الناقص معه ابداً، بل ينقطع دون مذهبه ويقف عن الامتدادمعه، فيكون متناهياً، فإذا رد عليه القدر الذي قطع منه أولاً، وقد كان متناهياً، صار كله أيضاً متناهياً، وحينئذ لا يقصر عن الخط الأخر الذي يقطع منه شيء، ولا يفضل عليه فيكون إذن مثله وهو متناه، فذلك أيضاً متناه، فالجسم الذي تفرض فيه هذه الخطوط متناه، وكل جسم يمكن أن تفرض فيه هذه الخطوط، فكل جسم متناه.
162
+
163
+ فإذا فرضنا أن جسماً غير متناه، فقد فرضنا باطلاً ومحالاً. فلما صح عنده بفطرته الفائقة التي لمثل هذه الجهة، أن جسم السماء متناه، أراد أن يعرف على أي شكل هو، وكيفية انقطاعه بالسطوح التي تحده. فنظر أولاً إلى الشمس والقمر وسائر الكواكب، فرأها كلها تطلع من جهة المشرق، وتغرب من جهة المغرب، فما كان يمر على سمت رأسه، رأه يقطع دائرة عظمى، وما مال عن سمت رأسه إلى الشمال أو إلى الجنوب، رأه يقطع دائرة أصغر من تلك. وما كان أبعد عن سمت الرأس إلى أحد الجانبين، كانت دائرته أصغر من دائرة ما هو أقرب. حتى كانت أصغر الدوائر التي تتحرك عليها الكواكب، دائرتين اثنتين: إحداهما حول القطب الجنوبي، وهي مدار سهيل، والاخرى حول القطب الشمالي، وهي المدار الفرقدين. ولما كان مسكنه على خط الاستواء الذي وصفناه أولاً، كانت هذه الدوائر كلها على سطح آفة. ومتشابهة في الجنوب والشمال وكان القطبان معاً ظاهرين له، وكان يترقب إذا طلع كوكب من الكواكب على دائرة كبيرة، وطلع كوكب آخر على دائرة صغيرة، وكان طلوعهما معاً، فكان يرى غروبهما معاً. واطرد له في ذلك جميع الكواكب وفي جميع الأوقات، فتبين له بذلك أن الفلك على شكل الكرة، وقوى ذلك في اعتقاده، ما رآه من رجوع الشمس والقمر وسائر الكواكب إلى المشرق، بعد مغيبها بالمغرب، وما رآه أيضاً من أنها تظهر لبصره على قدر واحد من العظم في حال طلوعها وتوسطها وغروبها، وأنها لو كانت حركتها على غير شكل الكرة لكانت لا محالة في بعض الأوقات، أقرب إلى بصره منها في وقت آخر، ولو كانت كذلك، لكانت مقاديرها واعظامها تختلف عند بصره فيراها في حال القرب أعظم مما يراها في حال البعد، لاختلاف أبعادها عن مركزه حينئذ بخلافها على الأول.
164
+
165
+ فلما لم يكن شيء من ذلك؛ تحقق عنده كروية الشكل. وما زال يتصفح حركة القمر، فيراها آخذه من المغرب إلى المشرق وحركات الكواكب السيارة كذلك، حتى تبين له قدر كبير من علم الهيئة، وظهر له أن حركتها لا تكون إلا بأفلاك كثيرة، كلها مضمنة في فلك واحد، هو أعلاها. وهو الذي يحرك الكل من المشرق إلى المغرب في اليوم والليلة. وشرح كيفية انتقاله. ومعرفة ذلك يطول؛ وهو مثبت في الكتب، ولا يحتاج منه في غرضنا إلا للقدر الذي أردناه. فلما انتهى إلى هذه المعرفة، ووقف على أن الفلك بجملته وما يحتوي عليه، كشيء واحد متصل بعضه ببعض، وأن جميع الأجسام التي كان ينظر فيها أولاً: كالأرض والماء والهواء والنبات والحيوان وما شاكلها، هي كلها في ضمنه وغير خارجة عنه، وأنه كله أشبه شيء بشخص من أشخاص الحيوان؛ وما فيه من الكواكب المنيرة هي بمنزلة حواس الحيوان؛ وما فيه من ضروب الأفلاك، المتصل بعضها ببعض، هي بمنزلة أعضاء الحيوان؛ وما في داخله من الكون والفساد هي بمنزلة ما في جوف الحيوان من أصناف الفضول والرطوبات، التي كثيراً ما يتكون فيها أيضاً حيوان، كما يتكون في العالم الأكبر. فلما تبين له أنه كله كشخص واحد في الحقيقة، واتحدت عنده أجزاؤه الكثيرة بنوع من النظر الذي اتحدت به عنده الأجسام التي في عالم الكون والفساد، تفكر في العالم بجملته، هل هو شيء حدث بعد إن لم يكن، وخرج إلى الوجود بعد العدم؟ أو هو أمر كان موجوداً فيما سلف، ولم يسبقه العدم بوجه من الوجوه؟ فتشك في ذلك ولم يترجح عنده أحد الحكمين على الآخر. وذلك أنه كان إذا أزمع على اعتقاد القدم، اعترضه عوارض كثيرة، من استحالة وجود ما لا نهاية له، بمثل الذي استحال عنده به وجود جسم لا نهاية وكذلك أيضاً كان يرى أن هذا الوجود لا يخلو من الحوادث، فهو لا يمكن تقدمه عليها، وما لا يمكن أن يتقدم على الحوادث، فهو أيضاً محدث. وإذا أزمع على اعتقاد الحدوث، اعترضته عوارض أخرى، وذلك أنه كان يرى أن معنى حدوثه، بعد أن لم يكن لا يفهم إلا على أن الزمان تقدمه، والزمان من جملة العالم وغير منفك عنه، فإذن لا يفهم تأخر العالم عن الزمان. وكذلك أيضاً كان يقول: إذا كان حادثاً، فلا بد له من محدث؛ وهذا المحدث الذي أحدثه، لم أحدثه الآن ولم يحدثه قبل ذلك، الطارئ طرأ عليه ولا شيء هناك غيره، أم لتغير حدث في ذاته؟ فان كان فما الذي احدث ذلك التغيير؟ وما زال يتفكر في ذلك عدة سنين.
166
+
167
+ فتتعارض عنده الحجج، ولا يترجح عنده أحد الاعتقادين على الآخر. فلما أعياه ذلك، جعل يتفكر ما الذي يلزم عن كل واحد من الاعتقادين، فلعل اللازم عنهما يكون شيئاً واحداً. فرأى انه إن اعتقد حدوث العالم خروجه إلى الوجود بعد العدم، فاللازم عن ذلك ضرورة، انه لا يمكن أن يخرج إلى الوجود بنفسه، وانه لا بد له من فاعل يخرجه إلى الوجود، وان ذلك الفاعل لا يمكن إن يدرك بشيء من الحواس، لانه لو أدرك بشيء من الحواس لكان جسماً من الأجسام، ولو كان جسماً من الأجسام لكان من جملة العالم، وكان حادثاً واحتاج إلى محدث، ولو كان ذلك المحدث الثاني أيضاً جسماً، لحتاج إلى محدث ثالث، والثالث إلى رابع، ويتسلسل ذلك إلى غير نهايةً وهو باطل. فإذن لابد للعالم من فاعل ليس بجسم، وإذا لم يكن جسماً فليس إلى إدراكه لشيء من الحواس سبيل، الآن الحواس الخمس لا تدرك إلا الأجسام، وإذا لا يمكن أن يحس فلا يمكن أن يتخيل، لان التخيل ليس شيئاً إلا إحضار صور المحسوسات بعد غيبتها، وإذا لم يكن جسماً فصفات الأجسام كلها تستحيل عليه، وأول صفات الأجسام هو الامتداد في الطول والعرض والعمق، وهو منزه عن ذلك، وعن جميع ما يتبع هذا الوصف من صفات الأجسام. وإذا كان فاعلاً للعالم فهو لا محالة قادر عليه وعالم به "بسم الله الرحمن الرحيم" إلا يعلم من خلق، وهو اللطيف الخبير؟ صدق الله العظيم. وراى أيضاً انه إن اعتقد قدم العالم، وان العدم لم يسبقه، وانه لم يزل كما هو، فان اللازم عن ذلك أن حركته قديمة لا نهاية لها من جهة الابتداء، إذ لم يسبقها سكون يكون مبدؤها منه، وكل حركة فلابد لها من محرك ضرورة، والمحرك أما أن يكون قوة سارية في جسم من الأجسام - أما جسم المتحرك نفسه، واما جسم أخر خارج عنه - واما أن تكون قوة ليست سارية ولا شائعة قي جسم. وكل قوى سارية في جسم وشائعه فيه، فانها تنقسم بانقسامه، وتتضاعف بتضاعفه، مثل الثقل بالحجر مثلاً. المحرك إلى الأسفل.
168
+
169
+ فانه إن قسم الحجر نصفين. وان زيد عليه أخر مثله، زاد في الثقل أخر مثله، فان أمكن أن يتزايد الحجر إلى غير نهاية، كتزايد هذا الثقل إلى غير نهاية، وان وصل الحجر إلى حد ما من العظم ووقف، وصل الثقل إلى ذلك الحد ووقف، لكنه قد تبرهن أن كل جسم فانه لا محالة متناه، فإذن كل قوة في الجسم فهي لا محالة متناهية. فان وجدناها قوة تفعل فعلاً لا نهاية له، فهي قوة ليست في جسم، وقد وجدنا الفلك يتحرك أبداً حركة لانهاية لها ولا انقطاع إذ فرضناه قديماً لا ابتداء له فالواجب على ذلك أن تكون القوة التي تحرك ليست في جسمه، ولا في جسم خارج عنه. فهي إذا لشيء بريء عن الأجسام، وغير موصوف بشيء من أوصاف الجسمية، وقد كان لاح له في نظره الأول في عالم الكون والفساد إن حقيقة وجود كل جسم، إنما هي من جهة صورته التي هي استعداده لضروب الحركات، وان وجوده الذي له من جهة مادته وجود ضعيف لا يكاد يدرك؛ فان وجود العالم كله إنما هو من جهة استعداده لتحريك هذا المحرك البريء عن المادة، وعن صفات الأجسام، المنزه عن أن يدركه حس، أو يتطرق إليه خيال، سبحانه، وإذا كان فاعلاً لحركات الفلك على اختلاف أنواعها، فعلاً لا تفاوت فيه ولا فتور فيه ولا قصور، فهو لا محالة قادر عليها وعالم بها.
170
+
171
+ فانتهى نظره بهذا الطريق إلى ما انتهى إليه بالطريق الأول، ولم يضره في ذلك تشككه في قدم العالم أو حدوثه، وصح له على الوجهين جميعاً وجود فاعل غير الجسم، ولا متصل بجسم ولا منفصل عنه، ولا داخل فيه، ولا خارج عنه، إذ: الاتصال، والانفصال، والدخول، هي كلمات من صفات الأجسام، وهو منزه عنها. ولما كانت المادة في كل جسم مفتقرة إلى الصورة، إذ لا تقوم إلا بها ولا تثبت لها حقيقة دونها، وكانت الصورة لا يصح وجودها إلا من فعل هذا الفاعل تبين له افتقار جميع الموجودات في وجودها إلى هذا الفاعل وأنه لا قيام لشيء منها إلا به فهو إذن علة لها، وهي معلومة له، سواء كانت محدثة الوجود، بعد أن سبقها العدم، أو كانت الابتداء لها من جهة الزمان، ولم يسبقها العدم قط، فانها على كلا الحالتين معلولة، ومفتقرة إلى الفاعل، متعلقة الوجود به، ولولا دوامه لم تدم، ولولا وجوده لم توجد، ولولا قدمه لم تكن قديمة، وهو في ذاته غني عنها وبريء منها! وكيف لا يكون كذلك وقد تبرهن أن قدرته غير متناهية، وأن جميع الأجسام وما يتصل بها أو يتعلق بها، ولو بعض التعلق، هو متناه منقطع. فإذن العالم كله بما في السماوات والأرض والكواكب، وما بينها، وما فوقها، وما تحتها، فعله وخلقه؛ ومتأخر عليه بالذات، وان كانت غير ماخرة عليها بالزمان. كما انك إذا أخذت في قبضتك جسماً من الأجسام، ثم حركت يدك، فان ذلك الجسم لا محالة يتحرك تابعاً لحركة يدك، حركة متأخرة عن حركة يدك، تأخراً بالذات؛ وان كانت لم تتأخر بالزمان عنها، بل كان ابتداؤهما معاً، فكذلك العالم كله، معلول ومخلوق لهذا الفاعل بغير زمان "بسم الله الرحمن الرحيم" إنما أمره إذا أراد شيئاً أن يقول له كن فيكون صدق الله العظيم. فلما راى إن جميع الموجودات فعله، تصفحها من بعد ذا تصفحاً على طريق الاعتبار في قدرة فاعلها؛ والتعجب من غريب صنعته، ولطيف حكمته، ودقيق علمه فتبين له في اقل الأشياء الموجودة، فضلاً عن أكثرها من أثار الحكمة، وبدائع الصنعة، ما قضى منه كل العجب، وتحقق عنده إن ذلك لا يصدر إلا عن فاعل مختار في غاية الكمال وفوق الكمال "بسم الله الرحمن الرحيم" لا يغرب عنه مثقال ذرة في السموات ولا في الأرض ولا اصغر من ذلك ولا أكبر صدق الله العظيم.
172
+
173
+ ثمتأمل في جميع أصناف الحيوان، كيف "بسم الله الرحمن الرحيم" أعطى كل شيء خلقه، ثم هداه صدق الله العظيم لاستعماله، فلولا أنه هداه لاستعمال تلك الأعضاء التي خلقت له في وجوه المنافع المقصود بها، لما انتفع بها الحيوان، وكانت كلاً عليه، فعلم بذلك أنه أكرم الكرماء، وارحم الرحماء. من فيض ذلك الفاعل المختار - جل جلاله - ومن وجوده، ومن فعله، فعلم أن الذي هو في ذاته أعظم منها، وأكمل، واتمم وأحسن، وأبهى وأجمل وأدوم، وأنه لا نسبة لهذه إلى تلك. فما زال يتتبع صفات الكمال كلها، فيراها له وصادرة عنه، ويرى أنه أحق بها من كل ما يوصف بها دونه. وتتبع صفات النقص كلها فرآه بريئاً منها، ومنزهاً عنها؛ وكيف لا يكون بريئاً منها وليس معنى النقص إلا العدم المحض، أو ما يتعلق بالعدم؟ وكيف يكون العدم تعلق أو تلبس، بمن هو الموجود المحض، الواجب الوجود بذاته، المعطي لكل ذي وجود وجوده، فلا وجود إلا هو: فهو الوجود، وهو الكمال، وهو التمام، وهو الحسن، وهو البهاء، وهو القدرة، وهو العلم، وهو هو، و "بسم الله الرحمن الرحيم" كل شيء هالك إلا وجهه صدق الله العظيم. فانتهت به المعرفة إلى هذا الحد، على رأس خمسة أسابيع من منشئه، وذلك خمسة وثلاثون عاماً، وقد رسخ في قلبه من هذا الفاعل، ما شغله عن الفكرة في كل شيء إلا فيه، وذهل عما كان فيه تصفح الموجودات والبحث عنها، حتى صار بحيث لا يقع بصره على شيء من الأشياء، إلا ويرى فيه أثر الصنعة، ومن حينه، فينتقل بفكره على الفور إلى الصانع ويترك المصنوع، حتى اشتد شوقه إليه، وانزعج قلبه بالكلية عن العالم الأدنى المحسوس، وتعلق بالعالم الأرفع المعقول. فلما حصل له العلم بهذا الموجود الرفيع الثابت الوجود الذي لا سبب لوجود جميع الأشياء، أراد أن يعلم بأي شيء حصل له هذا العالم، وبأي قوة أدرك هذا الموجود: فتصفح حواسه كلها وهي: السمع، والبصر، والشم، والذوق، واللمس، فرأى أنها لا تدرك شيئاً إلا جسماً، أو ما هو في الجسم، وذلك أن السمع لا يدرك المسموعات، وهي ما يحدث من تموج الهواء عند تصادم الأجسام، والبصر إنما يدرك الألوان، والشم يدرك الروائح، والذوق يدرك الطعوم، واللمس يدرك الأمزجة والصلابة واللين، والخشونة والملاسة، وكذلك القوة الخيالية لا تدرك شيئاً إلا أن يكون له طول وعرض وعمق؛ وهذه المدركات كلها من صفات الأجسام، وليس لهذه الحواس أدراك شيء سواها، وذلك لأنها قوى شائعة في الأجسام، ومنقسمة بانقسامها، فهي لذلك لا تدرك إلا جسماً منقسماً، لان هذه القوة إذا كانت شائعة في شيء منقسم، فلا محالة أنها إذا أدركت شيئاً من الأشياء، فانه ينقسم بانقسامها؛ فإذن كل قوة في جسم، فانها لا محالة لا تدرك إلا جسماً أو ما هو جسم.
174
+
175
+ وقد تبين إن هذا الموجود الواجب الوجود، بريء من صفات الأجسام من جميع الاتجاهات، فإذن لا سبيل إلى إدراكه إلا بشيء ليس بجسم، ولا هو قوة في جسم، ولا تعلق له وجه من الوجوه بالأجسام، ولا هو داخل فيها ولا خارج عنها، ولا متصل بها ولا منفصل عنها. وقد كان تبين له أن أدركه بذاته، ورسخت المعرفة به عنده، فتبين له بذلك أن ذاته التي أدركه بها أمر غير جسماني، ولا يجوز عليه شيء من صفات الأجسام، وان كل ما يدركه من ظاهر ذاته من الجسمانية فانها ليست حقيقة ذاته، وانما حقيقة ذاته ذلك الشيء الذي أدرك به الموجود المطلق الواجب الوجود. فلما علم أن ذاته ليست هذه المتجسمة التي يدركها بحواسه، ويحيط بها أديمه، هان عنده بالجملة جسمه، وجعل يتفكر في تلك الذات الشريفة، التي أدرك بها ذلك الموجود الشريف الواجب الوجود، ونظر في ذاته تلك الشريفة، هل يمكن أن تبيد أو تفسد وتضمحل، أو هي دائمة البقاء؟ فرأى إن الفساد والاضمحلال إنما هو من صفات الأجسام بأن تخلع صورة وتلبس صورة أخرى، مثل الماء إذا صار هواء، والهواء إذا صار ماء، والنبات إذا صار تراباً، والتراب إذا صار نباتاً، هذا هو معنى الفساد.
176
+
177
+ وأما الشيء الذي ليس بجسم، ولا يحتاج في قوامه إلى جسم، وهو منزه بالجملة عن الجسمانية، فلا يتصور فساده البتة. فلما ثبت له أن ذاته الحقيقة لا يمكن فسادها، أراد إن يعلم كيف يكون حالها إذا اطرح البدن وتخلت عنه، وقد كان تبين له أنها لا تطرحه إلا إذا لم يصلح آلة لها، فتصفح جميع القوى المدركة، فرأى أن كل واحدة منها تارةً تكون مدركة بالقوة، وتارةً تكون مدرة بالفعل: مثل العين في حال تغميضها أو أعراضها عن البصر، فانها تكون مدركة بالقوة - ومعنى مدركه بالقوة أنها لا تدرك الآن وتدرك في المستقبل - وفي حال فتحها واستقبالها للمبصر، تكون مدركه بالفعل - ومعنى مدركة بالفعل أنها الآن تدرك - وكذلك كل واحدة من هذه القوى تكون مدركة بالقوة وتكون مدركة بالفعل، وكل واحدة من هذه القوى إن كانت لم تدرك قط بالفعل، فهي ما دامت بالقوة لا تتشوق إلى إدراك الشيء المخصوص بها لأنها لم تتعرف به بعد، مثل من خلق مكفوف البصر؛ وان كانت قد أدركت بالفعل تارةً، ثم صارت بالقوة، فانها ما دامت بالقوة تشتاق إلى الإدراك بالفعل لأنها قد تعرفت إلى المدرك، وتعلقت به، وحنت إليه، مثل من كان يصيراً ثم عمي فانه لا يزال يشتاق إلى المبصرات. وبحسب ما يكون الشيء المدرك أتم وأبهى وأحسن، يكون الشوق أكثر؛ والتألم لفقده اعظم، ولذلك كان تألم من يفقد بصره بعد الرؤية أعظم من تألم من يفقد شمه، إذ الأشياء التي يدركها البصر أتم وأحسن من التي يدركها الشم، فان كان في الأشياء شيء لا نهاية لكماله، ولا غاية لحسنه وجماله وبهائه، وهو فوق الكمال والبهاء والجمال، وليس في الوجود كمال، ولا حسن، ولا بهاء، ولا جمال إلا صادر من جهته، وفائض من قبله، فمن فقد إدراك ذلك الشيء بعد إن تعرف به، فلا محالة أنهما ما دام فاقد له، يكون في ألام لا نهاية لها، كما أن من كان مدركاً له على الدوام، فانه يكون في لذة لا انفصام لها، وغبطة لا غاية لها ورائها، وبهجة وسرور لا نهاية لهما. وقد تبين له أن الموجود الواجب الوجود.
178
+
179
+ متصف بأوصاف الكمال كلها، ومنزه عن الصفات النقص وبريء منها. وتبين له أن الشيء الذي به يتوصل إلى أدركه أمر لا يشبه الأجسام، ولا يفسد لفسادها؛ فظهر له بذلك أن من كانت له مثل هذه الذات، المعدة لمثل هذا الإدراك؛ فانه إذا أطرح البدن بالموت؛ فإما أن يكون قبل ذلك - في مدة تصريفه للبدن - لم يتعرف قط بهذا الموجود الواجب الوجود؛ ولا اتصل به؛ ولا سمع عنه؛ فهذا إذا فارق البدن لا يشتاق إلى ذلك الموجود ولا يتألم لفقده. واما جميع القوى الجسمانية، فانها تبطل ببطلان الجسم؛ فلا تشتاق أيضاً إلى مقتضيات تلك القوى، ولا تحن إليها، ولا تتألم لفقدها. وهذه حال البهائم غير الناطقة كلها: سواء كانت من صورة الإنسان أو لم تكن. واما إن يكون قبل ذلك - في مدة تصريفه للبدن - قد تعرف بهذا الموجود، وعلم ما هو عليه من الكمال والعظمة والسلطان والحسن إلا انه أعرض عنه واتبع هواه، حتى وافته منيته وهو على تلك الحال، فيحرم المشاهدة، وعنده الشوق إليها فيبقى في عذاب طويل، وألام لا نهاية لها. فأما من يتخلص من تلك الآلام بعد جهد طويل، ويشاهد ما تشوق إليه قبل ذلك، واما أن يبقى في آلامه بقاءً سرمدياً، بحسب استعداده لكل واحد من الوجهين لحياته الجسمانية.
180
+
181
+ واما من تعرف بهذا الموجود الواجب الوجود، قبل أن يفارق البدن، واقبل بكليته عليه والتزم الفكرة في جلاله وحسن بهائه، ولم يعرض عنه حتى وافته منيته، وهذا على حال من الإقبال والمشاهدة بالفعل. فهذا إذا فارق البدن بقي في لذة لا نهاية لها، وغبطة وسرور وفرح دائم، لاتصال مشاهدته لذلك الموجود الواجب الوجود، وسلامة تلك المشاهدة من الكدر والشوائب؛ ويزول عنه ما تقتضيه هذه القوى الجسمانية من الأمور الحسية التي هي - بالإضافة إلى تلك الحال - ألام وشرور وعوائق. فلما تبين له أن كمال ذاته ولذتها إنما هو بمشاهدة ذلك الموجود الواجب الوجود على الدوام، مشاهدة بالفعل أبداً، حتى لا يعرض عنه طرفة عين لكي توافيه منيته، وهو في حال المشاهدة بالفعل، فتتصل لذته دون أن يتخللها ألم. ثم جعل يتفكر كيف يتأتى له دوام هذه المشاهدة بالفعل، حتى لا يقع منه أعراض فكان يلازم الفكرة في ذلك الموجود كل ساعة، فما هو إلا يسنح لبصره محسوس ما من المحسوسات، أو يخرق سمعه صوت بعض الحيوان، أو يتعرضه خيال من الخيالات، أو يناله ألم في أحد اعضائه، أو يصيبه الجوع أو العطش أو البرد أو الحر، أو يحتاج القيام لدفع فضوله؛ فتختل فكرته، ويزول عما كان فيه، ويتعذر عليه الرجوع إلى ما كان عليه من حال المشاهدة، إلا بعد جهد. وكان يخاف أن تفاجأه منيته وهو في حال الأعراض، فيفضي إلى الشقاء الدائم، وألم الحجاب.
182
+
183
+ فساءه حاله ذلك، وأعياء الدواء. فجعل يتصفح أنواع الحيوانات كلها، وينظر أفعالها وما تسعى فيه، لعله يتفطن في بعضها أنها شعرت بهذا الموجود، وجعلت تسعى نحوه، فيتعلم منها ما يكون في سبب نجاته. فرآها كلها إنما تسعى في تحصيل غذائها، ومقتضى شهواتها من المطعوم والمشروب والمنكوح، والاستظلال والاستدفاء، وتجد في ذلك ليلها ونهارها إلى حين مماتها وانقضاء مدتها. ولم ير شيئاً منها ينحرف عن هذا الرأي، ولا يسعى لغيره في وقت من الأوقات، فبان له بذلك أنها لم تشعر بذلك الموجود ولا اشتاقت إليه، ولا تعرفت إليه بوجه من الوجوه، وأنها كلها صائرة إلى العدم، أو إلى حال شبيه بالعدم. فلما حكم على ذلك بالحيوان، علم أن الحكم على النبات أولى، إذ ليس للنبات من الادراكات إلا بعض ما للحيوان. وإذا كان الأكمل إدراكاً لم يصل إلى هذه المعرفة، فالأنقص إدراكاً أحرى أن لا يصل، مع انه رأى أيضاً أن أفعال النبات كلها لا تتعدى الغذاء والتوليد. ثم انه بعد ذلك نظر إلى الكواكب والأفلاك فرآها كلها منتظمة الحركات، جارية على نسق؛ ورآها شفافة ومضيئة بعيدة عن قبول التغيير والفساد، فحدس حدساً قوياً أن لها ذوات سوى أجسامها، تعرف ذلك الموجود الواجب الوجود، وأن تلك الذوات العارفة ليست بأجسام، ولا منطبعة في أجسام مثل ذاته، هو، العارفة، وكيف لا يكون لها مثل تلك الذوات البريئة عن الجسمانية، ويكون لمثله على ما به من الضعف وشدة الاحتياج إلى الأمور المحسوسة، وأنه من جملة الأجسام الفاسدة؟ ومع ما به من النقص، فلم يعقه ذلك عن أن تكون ذاته بريئة عن الأجسام لا تفسد، فتبين له بذلك أن الأجسام السماوية أولى بذلك، وعلم أنها تعرف ذلك الموجود الواجب الوجود وتشاهد على الدوام بالفعل، لأن العوائق التي قطعت به هو عن الدوام المشاهدة من العوارض المحسوسة، لا يوجد مثلها للأجسام السماوية.
184
+
185
+ ثم انه تفكر: لم اختص هو من بين سائر أنواع الحيوانات بهذه الذات التي أشبه بها الأجسام السماوية. وقد كان تبين له أولاً من آمر العناصر واستحالة بعضها إلى بعض، وأن جميع ما على وجه الأرض لا يبقى على صورته؛ بل الكون والفساد متعاقبان عليه أبداً، وأن أكثر هذه الأجسام مختلطة مركبة من أشياء متضادة، ولذلك تؤول إلى الفساد، وانه لا يوجد منه شيء صرفاً، وما كان منها قريباً من أن يكون صرفاً خالصاً لا شائبة فيه، فهو بعيد عن الفساد جداً مثل الذهب والياقوت، وأن الأجسام البسيطة صرفة، ولذلك هي بعيدة عن الفساد، والصور لا تتعاقب عليها. وتبين له هنالك أن جميع الأجسام التي في عالم الكون والفساد، منها ما تتقوم حقيقتها بصورة واحدة زائدة على معنى الجسمية - وهذه هي الاسطقسات الأربع - ومنها ما تتقوم حقيقتها أكثر من ذلك كالحيوان والنبات. فما كان قوام حقيقته بصور أقل، كانت أفعاله أقل، وبعده عن الحياة أكثر، فان عدم الصورة جملة لم يكن فيه إلى الحياة طريق، وصار في حال شبيه بالعدم، وما كان قوام حقيقته بصور أكثر، كانت أفعاله أكثر، ودخوله في حال الحياة أبلغ؛ وان كانت تلك الصورة بحيث لا سبيل إلى مفارقتها لمادتها التي اختصت بها كانت الحياة حينئذ كامل الظهور والكمال والقوة. فالشيء العديم للصورة جملة هو الهيولى والمادة، ولا شيء من الحياة فيها وهي شبيهة بالعدم، والشيء المتقوم بصورة واحدة هي الاسطقسات الأربع وهي في أول مراتب الوجود في عالم الكون والفساد ومنها تتركب الأشياء ذوات الصور الكثيرة. وهذه الاسطقسات ضعيفة الحياة جداً، إذ ليست تتحرك إلا حركة واحدة، وانما كانت ضعيفة الحياة لان لكل واحد منها ضداً ظاهر العناد يخالفه في مقتضى طبيعته، ويطلب أن يغير صورته.
186
+
187
+ فوجوده لذلك غير متمكن، وحياته ضعيف، والبات أقوى حياة منه والحيوان أظهر حياة منه. وذلك أن ما كان من هذه المركبات تغلب عليه طبيعة أسطقس واحد، فلقوته فيه يغلب طبائع الاسطقسات الباقية، ويبطل قواها، ويصير ذلك المركب في حكم الاسطقس الغالب، فلا يستأهل لاجل ذلك من الحياة آل شيئا يسيراً، كما إن ذلك الاسطقس لا يستأهل من الحياة إلا يسيراً ضعيفاً وما كان من هذه المركبات لا تغلب عليه طبيعة أسطقس واحد منها، فان الاسطقسات تكون فيه متعادلة متكافئة، فإذن لا يبطل لأحدهما الآخر قوة الآخر بأكثر مما يبطل ذلك الآخر قوته، بل يفعل بعضها في بعض فعلاً متساوياً، فلا يكون فعل أحد الاسطقسات أظهر فيه، ولا يستولي عليه أحدها، فيكون بعيد الشبه من كل واحد من الاسطقسات، فكأنه لا مضادة لصورته، فيستأهل الحياة بذلك. ومتى زاد هذا الاعتدال وكان أتم وأبعد من الانحراف، كان بعده عن أن يوجد له ضد أكثر، وكانت حياته أكمل. ولما كان الروح الحيواني الذي مسكنه القلب، شديد الاعتدال، لانه ألطف من الأرض والماء وأغلظ من النار والهواء، صار في حكم الوسط ولم يضاده شيء من الاسطقسات مضادة بينه.
188
+
189
+ فاستعد بذلك الصورة الحيوانية، فرأى أن الواجب إلى ذلك أن يكون أعدل ما في هذه الأرواح الحيوانية مستعداً لاتمم ما يكون من الحياة في عالم الكون والفساد، وأن يكون ذلك الروح قريباً من أن يقال أنه لا ضد لصورته، فيشبه لذلك هذه الأجسام السماوية التي لا ضد لصورها؛ ويكون روح ذلك الحيوان، وكأنه وسط بالحقيقة بين الاسطقسات التي لا تتحرك إلى جهة العلو على الإطلاق، ولا إلى جهة السفل، بل لو أمكن أن يجعل في وسط المسافة بين المراكز وأعلى ما تنتهي إليه النار في جهة العلو ولم يطرأ عليه الفساد، لثبت هناك ولم يطلب الصعود ولا نزول. ولو تحرك في المكان، لتحرك حول الوسط كما تتحرك الأجسام السماوية، ولو تحرك في الوضع، لتحرك على نفسه، وكان كروي الشكل إذ لا يمكن غير ذلك، فإذن هو شديد الشبه بالأجسام السماوية. ولما كان قد اعتقد أن أحوال الحيوان، ولم ير فيها ما يظن به انه شعر بالموجود الواجب الوجود، وقد كان علم من ذاتها قد شعرت به، قطع ذلك على أنه هو الحيوان المعتدل الروح، الشيبة بالأجسام السماوية وتبين لو انه نوع مباين لسائر الحيوان، وانه إنما خلق لغاية أخرى، وأعد لامر عظيم، لم يعد له شيء من أنواع الحيوان، وكفى به شرفاً أن يكون أحس جزأيه - وهو الجسماني - أشبه الأشياء بالجواهر السماوية الخارجة عن عالم الكون والفساد، المنزهة عن الحوادث النقص والاستحالة والتغيير. وأما أشرف جزأيه، فهو الشيء الذي به عرف الموجود الواجب الوجود، وهذا الشيء العارف، أمر رباني الهي يستحيل ولا يلحقه الفساد، ولا يوصف بشيء مما توصف به الأجسام، ولا يدرك بشيء من الحواس، ولا يتخيل، ولا يتوصل إلى معرفته بآلة سواه، بل يتوصل إليه به؛ فهو العارف والمعروف، والمعرفة؛ وهو العالم، والمعلوم، والعلم؛ لا يتباين في شيء من ذلك، إذ التباين والانفصال من صفات الأجسام ولواحقها، ولا جسم هنالك ولا صفة جسم ولا لاحق بجسم! فلما تبين له الوجه الذي اختص به من بين سائر أصناف الحيوان بمشابهة الأجسام السماوية، رأى إن الواجب عليه أن يتقبلها ويحاكي أفعالها ويتشبه بها جهده. وكذلك رأى أنه بجزئه الاشرف الذي به عرف الموجود الواجب الوجود، فيه شبه ما منه من حيث هو منزه عن صفات الأجسام، وكما أن الواجب الوجود منزه عنها، فرأى ايضاً انه يجب عليه أن يسعى في تحصيل صفاته لنفسه من أي وجه أمكن، وان يتخلق بأخلاقه ويقتدي بأفعاله، ويجد في تنفيذ إرادته، ويسلم الآمر له، ويرضى بجميع حكمه، رضى من قلبه ظاهراً وباطناً، بحيث يسر به وان كان مؤلماً لجسمه وضاراً به ومتلفتاً لبدنه بالجملة. وكذلك رأى فيه شبهاً من سائر أنواع الحيوان بجزئه الخسيس الذي هو من عالم الكون والفساد، وهو البدن المظلم والكثيف، الذي يطالبه بأنواع المحسوسات من المطعوم والمشروب والمنكوح، ورأى أيضاً أن ذلك البدن لم يخلق له عبثاً ولا قرن به لامر باطل، ويجب عليه أن يتفقده ويصلح من شأنه. هذا التفقد لا يكون منه إلا بفعل يشبه أفعال سائر الحيوان. فاتجهت عنده الأعمال التي يجب عليه أن يفعلها نحو ثلاثة أغراض: أما عمل يتشبه بالحيوان الغير الناطق.
190
+
191
+ واما عمل يتشبه به بالأجسام السماوية. واما عمل يتشبه به بالموجود الواجب الوجود. فالتشبه الأول: يجب عليه من حيث البدن المظلم ذو الأعضاء المنقسمة، والقوى المختلفة، والمنازع المتفننة. والتشبه الثاني: يجب عليه من حيث له الروح الحيواني الذي مسكنه القلب، وهو مبدأ لسائر البدن، ولما فيه من القوى. والتشبه الثالث: يجب عليه من حيث هو، أي: من حيث هو الذات التي بها عرف ذلك الموجود الواجب الوجود. وكان أولاً قد وقف على أن سعادته وفوزه من الشقاء، إنما هي في دوام المشاهدة لهذا الموجود الواجب الوجود، حتى يكون بحيث لا يعرض بطرفة عين. ثم أنه نظر بالوجه الذي يتأتى له به هذا الدوام، فأخر له النظر أنه يجب عليه الاعتمال في هذه الأقسام الثلاثة من التشبيهات: آما التشبه الأول، فلا يحصل له به شيء من هذه المشاهدة، بل هو صارف عنها وعائق دونها، إذ هو تصرف في الأمور المحسوسة، والأمور المحسوسة كلها حجب معترضة دون تلك المشاهدة؛ وانما احتيج إلى هذا التشبه لاستدامة هذا الروح الحيواني الذي يحصل به التشبه الثاني بالأجسام السماوية.
192
+
193
+ فالضرورة تدعو إليه من هذا الطريق،ولو كان لا يخلو من تلك المضرة. واما التشبه الثاني، فيحصل له به حظ عظيم من المشاهدة على الدوام، لكنها مشاهدة يخالطها شوب؛ اذ من يشاهد ذلك النحو من المشاهدة على الدوام فهو مع تلك المشاهدة يعقل ذاته ويلتفت إليه حسبما يتبين بعد هذا. واما التشبه الثالث، فتحصل به المشاهدة الصرفة، والاستغراق المحض الذي لا التفات فيه بوجه من الوجوه الا إلى الموجود الواجب الوجود، والذي يشاهد هذه المشاهدة قد غابت عنه ذات نفسه وفنيت وتلاشت. وكذلك سائر الذوات، كثيرة كانت أو قليلة، إلا ذات الواحد الحق الواجب الوجود - جل وتعالى وعز. فلما تبين له أن مطلوبه الأقصى هو هذا التشبه الثالث، وأنه لا يحصل له إلا بعد التمرن والاعتمال مدة طويلة في التشبه الثاني، وان هذه المدة لا تدوم له بالتشبه الأول، وعلم أن التشبه الأول - وان كان ضرورياً، فانه عائق بذاته وان كان معيناً بالعرض لا بالذات لكنه ضروري- فألزم نفسه أن لا يجعل لها حظاً من هذا التشبه الأول، إلا بقدر الضرورة، وهي الكفاية التي لا بقاء للروح الحيواني بأقل منها. ووجد ما تدعو إليه الضرورة في بقاء هذا الروح أمرين: أحدهما: ما يمده من الداخل، ويخلف عليه بدل ما يتخلل منه وهو الغذاء. والأخر: ما يقيه من الخارج، ويدفع عنه وجوه الأذى: من البرد والحر والمطر ولفح الشمس والحيوانات المؤذية ونحو ذلك. ورأى أنه إن تناول ضرورية من هذه جزافاً كيفما اتفق، ربما وقع في السرف واخذ فوق الكفاية. فكان سعيه على نفسه من حيث لا يشعر، فرأى أن الحزم له أن يفرض لنفسه فيها حدوداً لا يتعداها، ومقادير لا يتجاوزها، وبأن له الفرض يجب أن يكون في جنس ما يتغذى به. وأي شيء يكون وفي مقداره وفي المدة التي تكون بين العبادات إليه. فنظر أولاً إلى أجناس ما به يتغذى، فرآها ثلاثة أضرب: أولاً: أما نبات لم يكمل بعد نضجه ولم ينته إلى غاية تمامه، وهي أصناف البقول الرطبة التي يمكن الاغتذاء بها.
194
+
195
+ ثانياً: واما ثمرات النبات الذي تم وانتهى وأخرج بذرة ليتكون منه أخر من نوعه حفظاً له، وهي أصناف الفواكه رطبها ويابسها. ثالثاً: واما حيوان من الحيوانات التي يتغذى بها: أما البرية واما البحرية. وكان قد صح عنده أن هذه الأجناس كلها، من فعل ذلك الموجود الواجب الوجود الذي تبين له أن سعادته في القرب منه، وطلب التشبه به، ولا محالة أن الاغتذاء بها مما يقطعها عن كمالها ويحول بينها وبين الغاية القصوى المقصودة بها. فكان ذلك اعتراض على فعل الفاعل. وهذا الاعتراض مضاد لما يطلبه من القرب منه والتشبه به. فرأى أن الصواب كان له لو أمكن أن يمتنع عن الغذاء جملة واحدة، لكنه لما لم يمكنه ذلك، لانه أن امتنع عنه أل ذلك إلى فساد جسمه، فيكون ذلك اعتراضاً على فاعله أشد من الأول، إذ هو أشرف من تلك الأشياء الآخر التي يكون فسادها سبباً لبقائه.
196
+
197
+ فاستهل أيسر الضررين، وتسامح في اخف الاعتراضين، ورأى إن يأخذ من هذه الأجناس إذا عدمت آيها تيسر له، بالقدر الذي يتبين له بعد هذا. فأما إن كانت كلها موجودة فينبغي له حينئذ إن يتثبت ويتخير منها ما لم يكن في أخذه كبير اعتراض على فعل فاعل، وذلك مثل لحوم الفواكه التي قد تناهت في الطيب، وصلح ما فيها لتوليد البزر على الشرط التحفظ على ذلك البزر، بان لا يأكله ولا يفسده ولا يلقيه في موضع لا يصلح للنبات، مثل الصفاة والسبخة ونحوهما. فان تعذر عليه وجود مثل هذه الثمرات ذات الطعم الغاذي، كالتفاح والكمثرى والأجاص ونحوها، كان له عند ذلك إن يأكل آما الثمرات التي لا يغذو منها إلا نفس البزر، كالجوز والقسطل، واما من البقول التي لم تصل بعد حد كمالها. والشرط عليه في هذين لأن يقصد أكثرها وجوداً وأقواها توليداً، وان لا يستأصل أصولها ولا يفني بزرها. فان عدم هذه، فله أن يأخذ من الحيوان آو من بيضه، والشرط عليه من الحيوان إن يأخذ من أكثره وجوداً، ويستأصل منه نوعاً بأسره. هذا ما رأى في جنس ما يتغذى به. واما المقدر فرأى أن يكون بحسب ما يسد خلة الجوع ولا يزيد عليها. واما الزمان الذي بين كل عودتين، فرأى انه إذا اخذ حاجته من الغذاء، أن يقيم عليه ولا يتعرض لسواه، حتى يلحقه ضعف يقطع به بعض الأعمال التي تجب عليه في التشبه الثاني، وهي التي يأتي ذكرها بعد هذا. فأما ما تدعو إليه الضرورة في بقاء الروح الحيواني مما يقيه من خارج، فكان الخطب فيه يسيراً: إذ كان مكتسياً بالجلود، وقد كان له مسكن يقيه مما يرد عليه من خارج، فاكتفى بذلك ولم يرى الاشتغال به، والتزم في غذائه القوانين التي رسمها لنفسه، وهي التي تقدم شرحها. ثم اخذ في العمل الثاني، وهو التشبه بالأجسام السماوية والاقتداء بها، والتقبل أوصافها، فانحصرت عنده في ثلاثة أضرب: الضرب الأول: أوصاف لها بالإضافة إلى ما تحتها من عالم الكون والفساد، وهي ما تعطيه إياه من التسخين بالذات، آو التبريد بالعرض، والإضاءة والتلطيف والتكثيف، إلى سائر ما تفعل فيه من الأمور التي بها يستعد لفيضان الصور الروحانية عليه من عند الفاعل الواجب الوجود. والضرب الثاني: أوصاف لها في ذاتها، مثل كونها شفافة وناصعة وطاهرة منزهة عن الكدر وضروب الرجس، ومتحركة بالاستدارة بعضها على مركز نفسها، وبعضها على مركز غيرها.
198
+
199
+ والضرب الثالث: أوصاف لها بالإضافة إلى الموجود الواجب الوجود، مثل كونها تشاهد مشاهدة دائمة، وتعرض عنه، وتتشوق إليه، وتتصرف بحكمه، وتتسخر في تتميم إرادته، ولا تتحرك إلا بمشيئته وفي قبضته. فجعل يتشبه بها جهده في كل من هذه الاضرب الثلاثة. آما الضرب الأول: فكان تشبه بها فيه: إن ألزم نفسه إن لا يرى ذا حاجة آو عاهة آو مضرة، أو ذا عائق من الحيوان أو النبات، وهو يقدر على أزالتها عنه إلا ويزيلها. فمتى وقع بصره على نبات قد حجبه عن الشمس حاجب آو تعلق به نبات آخر يؤذيه، أو عطش عطشاً يكاد يفسده، أزال عنه ذلك الحاجب إن كان ما يزال، وفصل بينه وبين ذلك المؤذي بفاصل لا يضر المؤذي، وتهده بالسقي ما أمكنه. ومتى وقع بصره على حيوان قد أرهقه سبع آو نشب به ناشب، آو تعلق به شوك، آو سقط على عينيه آو آذنيه شيء يؤذيه، آو مسه ظمأ آو جوع، تكفل بإزالة ذلك كله عنه جهده واطعمه وسقاه. ومتى وقع بصره على ماء يسيل إلى سقي نبات أو حيوان وقد عاقه عن ممره ذلك عائق، من حجر سقط فيه، آو جرف انهار عليه، ازال ذلك كله عنه. وما زال يمعن في هذا النوع من ضروب التشبه حتى بلغ فيه الغاية. واما الضرب الثاني: فكان تشبهه بها فيه إن الزم نفسه دوام الطهارة وإزالة الدنس والرجس عن جسمه والاغتسال بالماء في أكثر الأوقات، وتنظيف ما كان من أظافره واسنانه ومغابن بدنه، وتطيبها بما أمكن من طيبات النبات وصنوف الدهون العطرة، وتعهد لباسه بالتنظيف والتطييب حتى كان يتلألأ حسناً وجمالاً ونظافة وطيباً. والتزم مع ذلك ضروب الحركة على الاستدارة: فتارةً كان يطوف بالجزيرة، ويدور على ساحلها ويسيح باكنافها، وتارةً كان يطوف ببيته، او ببعض الكدى أدوارا معدوده: آما مشياً، آما هرولة؛ وتارة يدور على نفسه حتى يغشه عليه.
200
+
201
+ وأما الضرب الثالث: فكان تشبهه بها فيه، إن كان يلازم الفكرة في تلك الموجود الواجب الوجود، ثم يقطع علائق المحسوسات. ويغمض عينيه، ويسد أذنيه، ويضرب جهده عن تتبع الخيال، ويروم بمبلغ طاقته إن لا يفكر في شيء سواه، ولا يشترك به احداً ويستعين على ذلك بالاستدارة على نفسه والاستحثاث فيها.
202
+
203
+ فكان اذا اشتد في الاستدارة، غابت عنه جميع المحسوسات، وضعف الخيال وسائر القوى التي إلى الألأت الجسمانية، وقوي فعل ذاته - التي هي بريئة من الجسم - فكانت في بعض الأوقات فكرته قد تخلص عن الشوب ويشاهد بها الموجود الواجب الوجود، ثم تكر عليه القوى الجسمانية فتفسد عليه حاله، وترده إلى اسفل السافلين. ويعود من ذي قبل، فان لحقه ضعف يقطع به عن غرضه تناول بعض الأغذية عن الشرائط المذكورة. ثم انتقل إلى شأنه من التشبه بالأجسام السماوية بالأضرب الثلاثة المذكورة. ودأب على ذلك مدة وهو يجاهد قواه الجسمانية وتجاهده، وينازعها وتنازعه في الأوقات التي يكون له عليها الظهور، وتتخلص فكرته عن الشوب، يلوح له شيء من أحوال أهل التشبه الثالث.
204
+
205
+ ثم جعل يطلب التشبه الثالث، ويسعى في تحصيله، فينظر في صفات الموجود الواجب الوجود. وقد كان تبين له أثناء نظره العلمي قبل الشروع في العمل، إنها على ضربين: آما صفة ثبوت: كالعلم والقدرة والحكمة.
206
+
207
+ وأما صففة سلب: كتنزه عن الجسمانية وعن صفات الأجسام ولواحقها، وما يتعلق بها، ولو على بعد.
208
+
209
+ وأن صفات الثبوت يشترط فيها هذا التنزيه حتى لا يكون فيها شيء من صفات الأجسام التي من جملتها الكثرة، فلا تتكثر ذاته بهذه الصفات الثبوتية، ثم ترجع كلها إلى معنى واحد هي حقيقة ذاته. فجعل يطلب كيف يتشبه به في كل واحد من هذين الضربين. آما صفات الاجاب، فلما علم انها كلها راجعة إلى حقيقة ذاته، وانه لا كثرة فيها بوجه من الوجوه، إذ الكثرة من صفات الأجسام؛ وعلم إن علمه بذاته؛ ليس معنى زائداً على ذاته، بل ذاته هي علمه لذاته؛ وعلمه بذاته هو ذاته، تبين له انه إن أمكنه هو إن يعلم ذاته، فليس ذلك العلم الذي علم به ذاته معنى زائداً على ذاته، بل هو هو! فرأى إن التشبه به من صفات الاجاب، هو ان يعلمه فقط دون إن يشرك به شيئاً من صفات الأجسام؛ فاخذ نفسه بذلك. واما صقات السلب، فانها كلها راجعة إلى التنزه عن الجسمية. فجعل يطرح اوصاف الجسمية عن ذاته. وكان قد طرح منها كثيراً في رياضته المتقدمة التي كان ينحو بها بالتشبه بالأجسام السماوية. إلا انه أبقى منها بقايا كثيرة: كحركة الاستدارة - والحركة من أخص صفات الأجسام - وكل الاعتناء بأمر الحيوان والنبات والرحمة لها، والاهتمام بإزالة عوائقها. فان هذه أيضاً من صفات الأجسام، إذ لا يراها أولاً إلا بقوة جسمانية، ثم يكدح بأمرها بقوة جسمانية أيضاً. فاخذ في طرح ذلك كله عن نفسه، إذ هي بجملتها مما لا يليق بهذه الحالة التي يطلبها الآن.
210
+
211
+ وما زال يقتصر على السكون في قصر مغارته مطرقاً، غاضاً بصره، معرضاً عن جميع المحسوسات والقوى الجسمانية، مجتمع الهم والفكرة في الموجود الواجب الوجود وحده دون شركه؛ فمتى سنح بخياله سانح سواه، طرده عن خياله جهده، ودافعه وراض نفسه على ذلك، ودأب فيه مدة طويلة، بحيث تمر عليه عدة أيام لا يتغذى فيها ولا يتحرك. وفي خلال شدة مجاهدته هذه ربما كانت تغيب عن ذكره وفكره جميع الأشياء إلا ذاته، فانها كانت لا تغيب عنه في وقت استغراقه بمشاهدة الموجود الأول الحق الواجب الوجود.
212
+
213
+ فكان يسوءه ذلك، ويعلم انه شوب في المشاهدة المحضة، وشركه في الملاحظة. ومازال يطلب الفناء عن نفسه والإخلاص في مشاهدة الحق حتى تأتى له ذلك، وغابت عن ذكره وفكره السموات والأرض وما بينهما، وجميع الصور الروحانية والقوى الجسمانية، وجميع القوى المفارقة للمواد، والتي هي الذوات العارفه بالموجود الحق؛ وغابت ذاته في جملة تلك الذوات، وتلاشى الكل واضمحل، وصار هباءً منثوراً، ولم يبقى إلا الواحد الحق الموجود الثابت الوجود.
214
+
215
+ وهو يقول بقوله الذي ليس معنى زائداً على ذاته: "بسم الله الرحمن الرحيم" لمن الملك اليوم لله الواحد القهار صدق الله العظيم ففهم كلامه وسمع ندائه ولم يمنعه عن فهمه كونه لا يعرف الكلام، ولا يتكلم.
216
+
217
+ واستغرق في حالته هذه وشاهد ما لا عين رأت ولا إذن سمعت! ولا خطر على قلب بشر. فلا تعلق قلبك بوصف آمر لم يخطر على قلب بشر، فان كثيراً من الأمور التي تخطر على قلوب البشر قد يتعذر وصفه، فكيف بأمر لا سبيل إلى خطورة على القلب، ولا هو من عالمه ولا من طوره!؟ ولست أعني بالقلب جسم القلب، ولا الروح التي في تجويفه بل أعني صورة تلك الروح الفائضة بقواها على بدن الإنسان، فان كل واحد من هذه الثلاثة قد يقال له قلب ولكن لا سبيل لخطور ذلك الآمر على واحد من هذه الثلاثة، ولا يتأتى التعبير إلا عما الخطر علها.
218
+
219
+ ومن رام التعبير عن تلك الحال، فقد رام مستحيلاً وهو بمنزلة من يريد أن يذوق الألوان من حيث هي الألوان، ويطلب أن يكون السواد مثلاً حلواً أو حامضاً.
220
+
221
+ لكنا، مع ذلك، لا نخيلك عن إشارات نومئ بها إلى ما شاهده من عجائب ذلك المقام، على سبيل ضرب المثل، لا على سبيل قرع باب الحقيقية. إذ لا سبيل إلى التحقق بما في ذلك المقام إلا بالوصول إليه.
222
+
223
+ فأصغ الآن بسمع قلبك، وحدق ييصر إلى ما أشير به اليك لعلك أن تجد منه هدياً يلقيك على جادة الطريق! وشرطي عليك أن لا تطلب مني في هذا الوقت مزيد بيان بالمشافهة على ما أودعه هذه الاوراق فان المجال ضيق، والتحكم بالألفاظ على آمر ليس من شأنه أن يلفظ به خطر.
224
+
225
+ فأقول: انه لما فني عن ذاتهوعن جميع وعن جميع الذوات ولم ير في الوجود إلا الواحد القيوم، وشاهد ما شاهد، ثم عاد إلى ملاحظة الاغيار عندما آفاق من حالة تلك التي شبيه بالسكر، خطر بباله انه لا ذات له يغاير بها ذات الحق تعالى، وان حقيقة ذاته هي ذات الحق، وان الشيء الذي كان يظن أولاً انه ذات المغايرة لذات الحق، ليس شيئاً في الحقيقة، بل ليس ثم شيء إلا ذات الحق، وان ذلك بمنزلة نور الشمس الذي يقع على الأجسام الكثيفة فتراه يظهر فيها.
226
+
227
+ فإنه وإن نسب إلى الجسم الذي يظهر فيه، فليس هو في الحقيقية شيئاً سوى نور الشمس. وان زال ذلك الجسم زال نوره، وبقي نور الشمس بحاله لم ينقص عند حضور ذلك الجسم ولم يزد عند مغيبه.
228
+
229
+ ومتى حدث جسم يصلح لقبول ذلك النور، قبله، فإذا عدم الجسم عدم ذلك القبول، ولك يكن له معنى، عنده هذا الظن بما قد بان له من إن ذات الحق، عز وجل، لا تتكثر بوجهه من الوجوه، وأن علمه بذاته، وهو ذاته بعينها.
230
+
231
+ فلزم عنده من هذا أن حصل عنده العلم بذاته، فقد حصلت عنده ذاته، وقد كان حصل عنده العلم فحصلت عنده الذات.
232
+
233
+ وهذه الذات لا تحصل إلا عند ذاتها، ونفس حصولها هو الذات؛ فإذن هو الذات بعينها. وكذلك جميع الذوات المفارقة للمادة العارفة بتلك الذات الحقه التي كان يراها أولاً كثيرة، وصارت عنده بهذا الظن شيئاً واحداً. وكادت هذه الشبه ترسخ في نفسه لولا أن تداركه الله برحمته وتلافاه بهدايته، فعلم إن الشبهة انما ثارت عنده من بقايا ظلمة الأجسام، وكدورة المحسوسات. فان الكثير والقليل والواحد والوحدة، والجمع والاجتماع، والافتراق، هي كلها من صفات الأجسام، وتلك الذوات المفارقة العارفة بذات الحق، عز وجل، لبرائتها عن المادة، لا يجب إن يقال انها كثيرة، ولا واحدة، لان الكثرة انما هي مغايرة الذوات بعضها لبعض، والوحدة أيضاً لا تكون إلا بالاتصال. ولا يفهم شيء من ذلك إلا في المعاني المركبة المتلبسة بالمادة. غير إن العبارة في هذا الموضع قد تضيق جداً لانك إن عبرت عن تلك الذوات المفارقة بصيغة الجمع حسب لفظنا هذا، أوهم ذلك معنى الكثرة فيها، وهي بريئة عن الكثرة. وان أنت عبرت بصيغة الإفراد، اوهم ذلك معنى الاتحاد، وهو مستحيل عليها. وكأني بمن يقف على هذا الموضع من الخفافيش الذين تظلم الشمس في أعينهم يتحرك في سلسلة جنونه، ويقول: لقد افرطت في تدقيقك حتى انك قد انخلعت عن غريزة العقلاء، واطرحت حكم معقول، فان من أحكام العقل إن الشيء آما واحد واما كثير، فليتئد في غلوائه، وليكف من غرب لسانه وليتهم نفسه، وليعتبر بالعالم المحسوس الخسيس الذي هو أطباقه بنحو ما اعتبر به حي بن يقظان حيث كان بنظر فيه بنظر فيراه كثيراً كثرة لا تنحصر ولا تدخل تحت حد، ثم ينظر فيه بنظر آخر، فيراه واحداً. وبقي في ذلك متردداً ولم يكنه إن يقطع بأحد الوصفين دون الآخر. هذا فالعالم المحسوس منشأ الجمع والإفراد، وفيه الانفصال والاتصال، والتحيز والمغايرة، والاتفاق والاختلاف، فما ظنه بالعالم الإلهي الذي لا يقال فيه كل ولا بعض، ولا ينطق في أمره بلفظ من الألفاظ المسموعة، إلا وتوهم فيه شيء على خلاف الحقيقة، فلا يعرفه إلا من شاهده؛ ولا تثبت حقيقته إلا عند من حصل فيه. واما قوله: حتى انخلعت عن غريزة العقلاء، واطرحت حكم المعقول. فنحن نسلم له ذلك، ونتركه مع عقله وعقلائه، فان العقل الذي يعنيه هو أمثاله، انما هو القوة الناطقة التي تتصفح أشخاص الموجودات المحسوسة، وتقتنص منها المعنى الكلي. والعقلاء الذين يعنيهم، هم ينظرون من هذا النظر والنمط الذي كلامنا فيه فوق هذا كله، فليسد عنه سمعه من لا يعرف سوى المحسوسات وكلياتها، وليرجع إلى فريقه الذين "بسم الله الرحمن الرحيم" يعملون ظاهراً من الحياة الدنيا. وهم عن الآخرة هم غافلون. صدق الله العظيم. فان كنت ممن يقتنع بهذا النوع من التلويح والإشارة إلى ما في العالم الإلهي، ولا تحمل ألفاظاً من المعاني على ما جرت العادة بها في تحميلها إياه، فنحن نزيدك شيئاً مما شاهده حي بن يقظان في مقام أولي الصدق الذي تقدم ذكره، فتقول: انه بعض الاستغراق المحض، والفناء التام، وحقيقة الوصول، وشاهد للفلك الأعلى، الذي لا جسم له، ورأى ذاتاً بريئة عن المادة، ليست هي ذات الواحد الحق، ولا هي نفس الفلك، ولا هي غيرها؛ وكأنها صورة الشمس التي تظهر في مرآة من المرائي الصقيلة، فانها ليست هي الشمس ولا المرأة ولا غيرهما. وراى لذات ذلك الفلك المفارقة من الكمال والبهاء والحسن، ما يعظم عن إن يوصف بلسان، ويدق إن يكسى بحرف آو صوت، وراه في غاية من اللذة والسرور، والغبطة والفرح، بمشاهدة ذات الحق جل جلاله. وشاهد ايضاً للفلك الذي يليه، وهو فلك الكواكب الثابتة، ذاتاً بريئة عن المادة أيضاً، ليست هي ذات الواحد الحق، ولا ذات الفلك الأعلى المفارقة، ولا نفسه، ولا هي غيرها. وكأنها صورة الشمس التي تظهر في المرآة قد انعكست إليها من مرآة أخرى مقابلة للشمس، ورأى لهذه الذات ايضاً من البهاء والحسن واللذة مثل ما راى لتلك التي للفلك الأعلى. وشاهد ايضاً للفلك الذي يلي هذا، وهو فلك زحل ذاتاً مفارقة للمادة ليست هي شيئاً من الدواب التي شاهدها قبله ولا هي غيرها؛ وكأنها صورة الشمس التي تظهر في مرآة قد انعكست إليها الصورة من مرآة مقابلة للشمس؛ وراى لهذه الذات ايضاً مثل ما راى آمل قبلها من البهاء واللذة. ومازال يشاهد لكل فلك ذاتاً مفارقة بريئة عن المادة ليست هي شيئاً من الذوات التي قبلها ولا هي غيرها وكأنها صورة الشمس التي تنعكس من مرآة على مرآة، على رتب مرتبة بحسب ترتيب الأفلاك. وشاهد لكل ذات من هذه الذوات من الحسن والبهاء، واللذة والفرح، ما لا عين رأت، ولا أذن سمعت، ولا خطر على قلب بشر. إلى أن انتهى إلى عالم الكون والفساد، وهو جميعه حشو فلك القمر. فرأى له ذاتاً بريئة عن المادة ليست شيئاً من الذوات التي شاهدها قبلها، ولا هي سواها. ولهذه سبعون ألف وجه، في كل وجه سبعون ألف فم، في كل فم سبعون ألف لسان، يسبح بها ذات الواحد الحق، ويقدسها ويمجدها، لا يفتر؛ ورأى لهذه الذات، التي توهم فيها الكثرة وليست كثيرة، من الكمال واللذة، مثل الذي رآه لما قبلها. وكأن هذه الذات صورة الشمس التي تظهر في ماء مترجرج، وقد انعكست إليها الصورة من آخر المرايا التي انتهى إليها الانعكاس على الترتيب المتقدم من المرآة الأولى التي قابلت الشمس بعينها. ثم شاهد لنفسه ذاتاً مفارقة، لو جاز إن تتبعض ذات السبعين ألف وجه، لقلنا انها بعضها. ولولا إن هذه الذات حدثت بعد إن لم تكن، لقلنا إنها هي! ولولا اختصاصها ببدنه عند حدوثه، لقلنا إنها لم تحدث! وشاهد في هذه الرتبة ذواتاً، مثل ذاته، لاجسام كانت ثم اضمحلت، ولاجسام لم تزل معه في الوجود، وهي من الكثرة في حد بحيث لا تتناهى إن جاز أن يقال لها كثيرة، أو هي كلها متحدة إن جاز إن يقال لها واحدة. وراى لذاته ولتلك الذوات التي في رتبته من الحسن والبهاء واللذة غير المتناهية، ما لا عين رأت ولا أذن سمعت، ولا خطر على قلب بشر، ولا يصفه الواصفون، ولا يعقله إلا الواصلون العارفون. وشاهد ذواتاً كثيرة مفارقة للمادة كأنها مرايا صدئة، قد ران عليها الخبث، وهي مع ذلك مستدبرة للمرايا الصقيلة التي ارتسمت فيها صورة الشمس، ومولية عنها بوجوهها، وراى لهذه الذوات من القبح والنقص ما لم يقم بباله قط؛ وراها في ألام لا تنقضي، وحسرات لا تنمحي؛ قد أحاط بها سرادق العذاب، وأحرقتها نار الحجاب، ونشرت بمناشير بين الانزعاج والانجذاب. وشاهد هنا ذواتاً سوى هذه المعذبة تلوح ثم تضمحل، وتنعقد ثم تنحل، فتثبت فيها وأنعم النظر إليها، فرأى هولاً عظيماً وخطباً جسيماً، وخلقاً حثيثاً، وأحكاماً بليغة، وتسوية ونفخاً وإنشاء ونسخاً. فما هو إلا إن تثبت قليلاً، فعادت إليه حواسه، وتنبه من حاله تلك التي كانت شبيهة بالغشي، وزلت قدمه عن ذلك المقام، ولاح له العالم المحسوس، وغاب عنه العالم الإلهي: إذ لم يكن اجتماعهما في حال واحدة، إذ الأخرى والدنيا كضرتين، إن أرضيت احدهما أسخطت الأخرى، فان قلت يظهر مما حكيته من هذه المشاهدة، إن الذوات المفارقة إن كانت لجسم دائم الوجود لا يفسد، كالأفلاك، كانت هي دائمة الوجود؛ وان كانت لجسم يؤول إلى الفساد كالحيوان الناطق، فسدت هي واضمحلت وتلاشت، حسبما مثلث به في المرايا الانعكاس، فان الصورة لا ثبات لها إلا ثبات بثبات المرآة، فإذا فسدت المرآة صح فساد الصورة واضمحلت هي؛ فأقول لك: ما لأسرع ما نسيت العهد، وحلت عن الربط، ألم نقدم إليك إن مجال العبارة هنا ضيق، وان الألفاظ على كل حال توهم غير الحقيقة وذلك الذي توهمته إنما أوقعك فيه، إن جعلت المثال والممثل به على حكم واحد من جميع الوجوه. ولا ينبغي أن يفعل ذلك في أصناف المخاطبات المعتادة، فكيف ها هنا والشمس ونورها، وصورتها وتشكلها والمرايا والصور الحاصلة فيها، كلها أمور غير مفارقة للأجسام، ولا قوام لها إلا بها وفيها؟ فلذلك افتقرت في وجودها إليها وبطلت ببطلانها. واما الذوات الإلهية، والأرواح الربانية، فانها كلها بريئة عن الأجسام ولواحقها ومنزهة غاية التنزيه عنها، فلا ارتباط ولا تعلق لها بها، وسواء بالإضافة إليها بطلان الأجسام أو ثبوتها، ووجودها أو عدمها؛ وانما ارتباطها وتعلقها بذات الواحد الحق الموجود الواجب الوجود، الذي هو أولها ومبدؤها وسببها وموجدها، وهو يعطيها الدوام ويمدها بالبقاء والتسرمد؛ ولا حاجة بها إلى الأجسام بل الأجسام المحتاجة إليها. ولو جاز عدمها لعدمت الأجسام فانها هي مبديها، كما انه لو جاز إن تعدم ذات الواحد الحق - تعالى وتقدس عن ذلك؛ لا اله إلا هو! - لعدمت هذه الذوات كلها، ولعدمت الأجسام، ولعدم العالم الحسي بآسره، ولم يبق موجود، إذ الكل مرتبط بعضه ببعض. والعالم المحسوس وان كان تابعاً للعالم الإلهي، شبيه الظل له؛ والعالم الإلهي مستغن عنه وبريء منه فانه مع ذلك قد يستحيل فرض عدمه، إذ هو لا محالة تابع للعالم الإلهي، وانما فساده إن يبدل، لا إن يعدم بالجملة، وبذلك نطق الكتاب العزيز حيثما وقع هذا المعنى منه في تسيير الجبال وتسييرها كالعهن والناس كالفراش. وتكوير الشمس والقمر، وتفجيرالبحار يوم تبدل الارض غير الأرض والسموات. فهذا القدر هو الذي امكنني الآن أن أشير إليك به فيما شاهده حي بن يقظان في ذلك المقام الكريم فلا تلتمس الزيادة عليه من جهة الألفاظ فان ذلك كالمعتذر. واما تمام خبره - فسأتلوه عليك إن شاء الله تعالى: وهو انه لما عاد إلى العالم المحسوس، وذلك بعد جولا نه حيث جال، سئم تكاليف الحياة الدنيا، واشتد شوقه إلى الحياة الدنيا، واشتد شوقه إلى الحياة القصوى، فجعل يطلب العود إلى ذلك المقام بالنحو الذي طلبه أولاً حتى وصل إليه بأيسر من السعي الذي وصل به أولاً ودام فيه ثانياً مدة أطول من الأولى. ثم عاد إلى عالم الحس. ثم تكلف الوصول إلى مقامه بعد ذلك فكان ايسر عليه من الأولى والثانية وكان دوامه أطول. وما زال الوصول إلى ذلك المقام الكريم يزيد عليه سهولة، والدوام يزيد فيه طولاً مدة بعد مدة، حتى صار يصل إليه متى شاء، ولا ينفصل عنه إلا متى شاء؛ فكان يلازم مقامه ذلك ولا ينثني عنه إلا لضرورة بدنه التي كان قد قللها، حتى كان لا يوجد اقل منها. وهو في كل ذلك كله يريد إن يريحه الله عز وجل من كل بدنه الذي يدعوه إلى مفارقة مقامه ذلك، فيتخلص إلى لذته تخلصاً دائماً، ويبرأ عما يجده من الألم عند الأعراض عن مقامه ذلك إلى ضرورة البدن. وبقي على حالته تلك حتى أناف على سبعة أسابيع من منشئه وذلك خمسون عاماً. وحينئذ اتفقت له صحبة أسال وكان من قصته معه ما يأتي ذكره بعد هذا إن شاء الله تعالى. ذكروا: إن جزيرة قريبة من الجزيرة التي ولد بها حي بن يقظان على أحد القولين المختلفين على صفة مبدئه، انتقلت إليه ملة من الملل الصحيحة الماخوذه على بعض الأنبياء المتقدمين، صلوات الله عليهم. وكانت ملة محاكية لجميع الموجودات الحقيقية بالأمثال المضروبة التي خيالات تلك الأشياء، وتثبت رسومها في النفوس، حسبما جرت به العادة في مخاطبة الجمهور؛ فما زالت تلك الملة تنتشر بتلك الجزيرة وتقوى وتظهر، حتى قام بها ملكها وحمل الناس على التزامها. وكان قد نشأ بها فتيان من أهل الفضل والخير، يسمى أحدهما أسال والآخر سلامان فتلقيا هذه الملة وقبلاها احسن قبول، واخذ على أنفسهما على بالتزام جميع شرائعها والموظبة على جميع أعمالها، واصطحبا على ذلك. وكانا يتفقهان في بعض الأوقات فيما ورد من ألفاظ تلك الشريعة في صفة الله عز وجل وملائكته، وصفات الميعاد والثواب والعقاب. فأما أسال فكان أشد غوصاً على الباطن، وأكثر عثوراً على المعاني الروحانية واطمع في التأويل. واما سلامان صاحبه فكان أكثر احتفاظاً بالظاهر، وأشد بعداً عن التأويل، وأوقف عن التصرف والتأمل؛ وكلاهما مجد في الأعمال الظاهرة، ومحاسبة النفس، ومجاهدة الهوى. وكان في تلك الشريعة أقوال تحمل عن العزلة والانفراد، وتدل على إن الفوز والنجاة فيهما؛ واقوال أخر تحمل على المعاشرة وملازمة الجماعة. فتعلق أسال بطلب العزلة، ورجح القول فيها لما كان في طباعه من دوام الفكرة، وملازمة العبرة، والغوص على المعاني، وأكثر ما كان يتأتى له أمله من ذلك بالانفراد. وتعلق سلامان بملازمة الجماعة، ورجح القول فيها لما كان في طباعه من الجبن عن الفكرة والتصرف. فكانت ملازمته الجماعة عنده مما يدرأ الوسواس، ويزيل الظنون المعترضة ويعيد من همزات الشياطين. وكان اختلافهما في هذا الرأي سبب افتراقهما. وكان أسال قد سمع عن الجزيرة التي ذكر أن حي بن يقظان تكون بها وعرف ما بها من الخصب والمرافق والهواء المعتدل، وان الانفراد بها يتأتى لملتمسه، فأجمع إن يرتحل إليها ويعتزل الناس بها بقية عمره. فجمع ما كان له من المال، واشترى ببعضه مركباً تحمله إلى تلك الجزيرة، وفرق باقيه على المساكين، وودع صاحبه سلامان وركب متن البحر؛ فحمله الملاحون إلى تلك الجزيرة؛ ووضعوه بساحلها؛ وانفصلوا عنها. فبقي أسال بتلك الجزيرة يعبد الله عز وجل؛ ويعظمه ويقدسه؛ ويفكر في اسمائه الحسنى وصفاته العليا؛ فلا ينقطع خاطره؛ ولا تتكدر فكرته. واذا احتاج إلى غذاء تناول من ثمرات تلك الجزيرة وصيدها ما يسد بها جوعته. وأقام على تلك الحال مدة وهو في أتم غبطة وأعظم أنس بمناجاة ربه. وكان كل يوم يشاهد من ألطافه ومزايا تحفة وتيسره عليه في مطلبه وغذائه ما يثبت يقينه ويقر عينه. وكان في تلك المدة حي بن يقظان شديد الاستغراق في مقاماته الكريمة؛ فكان لا يبرح عن مغارته إلا مرة في الاسبوع لتناول ما سنح من الغذاء، فلذلك لم يعثر عليه أسال لأول وهلة، بل كان يتطوف بأكناف تلك الجزيرة ويسبح في أرجائها، فلا يرى أنسياً ولا يشاهد أثراً فيزيد بذلك أنسه وتنبسط نفسه لما كان قد عزم عليه من التناهي في طلب العزلة والانفراد. إلى إن اتفق في بعض تلك الأوقات إن خرج حي بن يقظان لالتماس غذائه وأسال قد ألم بتلك الجهة، فوقع بصر كل منهما على الآخر. فإما أسال فلم يشك أنه من العباد المنقطعين، وصل تلك الجزيرة لطلب العزلة عن الناس كما وصل هو إليها. فخشي إن هو تعرض له وتعرف به إن يكون سبباً في فساد حاله وعائقاً بينه وبين أمله. واما حي بن يقظان فلم يدر ما هو، لانه لم يره على صورة شيء من الحيوانات التي كان قد عاينها قبل ذلك. وكان عليه مدرعة سوداء من الشعر والصوف، فظن إنها لباس طبيعي. فوقف يتعجب منه ملياً. وولى أسال هارباً منه خيفة أن يشغله عن حاله، فاقتفى حي بن يقظان أثره لما كان في طباعه من البحث عن الحقائق. فلما رآه يشتد في الهرب. خنس عنه وتوارى له، حتى ظن أسال انه قد انصرف عنه وتباعد من تلك الجهة. فشرع أسال في الصلاة والقراءة، والدعاء والبكاء، والتضرع والتواجد، حتى شغله ذلك عن كل شيء. فجعل حي بن يقظان يتقرب منه قليلاً قليلاً، وأسال لا يشعر به حتى دنا منه بحيث يسمع قراءته وتسبيحه، ويشاهد خضوعه وبكائه. فسمع صوتاً حسناً وحروف منظمة، لم يعهد مثلها من شيء من أصناف الحيوان. ونظر إلى أشكاله وتخطيطه فرآه على صورته، وتبين له أن المدرعة التي عليه ليست جلداً طبيعياً، وانما هي لباس متخذ مثل لباسه هو، ولما رأى حسن خشوعه وتضرعه وبكائه لم يشك في انه من الذوات العارفة بالحق؛ فتشوق إليه واراد إن يرى ما عنده، وما الذي أوجب بكاءه وتضرعه؛ فزاد في الدنو منه حتى أحس به أسال؛ فاشتد في العدو، واشتد حي بن يقظان في أثره حتى التحق به - لما كان أعطاه الله من القوة والبسطة في العلم والجسم - فالتزمه وقبض عليه؛ ولم يمكنه من البراح. فلما نظر إليه أسال وهو مكتس بجلود الحيوان ذوات الاوبار؛ وشعره قد طال حتى جلل كثيراً منه، ورأى ما عنده من سرعة العدو وقوة البطش، فرق منه فرقاً شديداً، وجعل يستعطفه ويرغب إليه بكلام لا يفهمه حي بن يقظان ولا يدري ما هو، غير أنه يميز فيه شمائل الجزع. فكان يؤنسه بأصوات كان قد تعلمها من الحيوانات، ويجر يده على رأسه، ويمسح أعطافه. ويتملق إليه، ويظهر البشر والفرح به. حتى سكن جأش أسال وعلم أنه لا يريد به سوءاً. كان أسال قديماً لمحبته في علم التأويل. قد تعلم أكثر الألسن، ومهر فيها. فجعل يكلم حي بن يقظان ويسائله عن شأنه بكل لسان يعلمه ويعالج أفهامه فلا يستطيع، وحي بن يقظان في ذلك كله يتعجب مما يسمع ولا يدري ما هو. غير أنه يظهر له البشر والقبول. فاستغرب كل واحد منهما أمر صاحبه. وكان عند أسال من زاد كان قد اصطحبه من الجزيرة المعمورة، فقربه إلى حي بن يقظان فلم يدر ما هو، لانه لم يكن شاهده قبل ذلك. فأكل منه أسال وأشار إليه ليأكل ففكر حي بن يقظان فيما كان ألزم نفسه من الشروط لتناول الغذاء، ولم يدر اصل ذلك الشيء الذي قدم له ما هو، وهل يجوز له تناوله أم لا! فامتنع عن الآكل. ولم يزل أسال يرغب إليه ويستعطفه. وقد كان اولع به حي بن يقظان فخشي إن دام على امتناعه إن يوحشه، فاقدم على ذلك الزاد وأكل منه. فلما ذاقه واستطابه بدا له سوء ما صنع من نقض عهوده في شرط غذاء، وندم على فعله، وأراد الانفصال عن أسال والإقبال على شأنه من طلب الرجوع إلى مقامه الكريم، فلما تتأت له المشاهدة بسرعة. فرأى أن يقيم مع أسال في عالم الحس حتى يقف على حقيقة شأنه، ولا يبقي في نفسه هو نزوع إليه، وينصرف بعد ذلك إلى مقامه دون إن يشغله شاغل. فالتزم صحبة أسال ولما رأى أسال أيضاً انه لا يتكلم، آمن من غلوائه على دينه، ورجا أن يعلمه الكلام والعلم والدين، فيكون له بذلك أعظم أجر وزلفى عند الله. فشرع أسال في تعليمه الكلام أولاً بأن كان يشير له إلى أعيان الموجودات وينطق بأسمائها ويكرر ذلك عليه ويحمله على النطق، فينطق بها مقترناً بالاشارة، حتى علمه الأسماء كلها، ودرجه قليلاً قليلاً حتى تكلم في أقرب مدة. فجعل أسال يسأله عن شأنه ومن أين صار إلى تلك الجزيرة، فأعلمه حي بن يقظان انه لا يدري لنفسه ابتداء ولا أباً ولا أماً أكثر من الظبية التي ربته، ووصف له شأنه كله وكيف ترقى بالمعرفة، حتى انتهى إلى درجة الوصول.
234
+
235
+ فلما سمع أسال منه وصف تلك الحقائق والذوات المفارقة لعالم الحس العارفة بذات الحق عز وجل، ووصفه ذلك الحق تعالى وجل بأوصافه الحسنى، ووصف له ما أمكنه وصفه مما شاهده عند الوصول من لذات الواصلين وألام المحجوبين، لم يشك أسال في أن جميع الأشياء التي وردت في شريعته من أمر الله عز وجل، وملائكته، وكتبه، ورسله، واليوم الآخر، وجنته وناره، هي أمثلة هذه التي شاهدها حي بن يقظان؛ فانفتح بصر قلبه وانقدحت نار خطره وتطابق عنده المعقول والمنقول، وقربت عليه طرق التأويل، ولم يبق عليه مشكل في الشرع إلا تبين له، ولا مغلق إلا انفتح، ولا غامض إلا اتضح، وصار من أولى الألباب. وعند ذلك نظر إلى حي بن يقظان بعين التعظيم والتوقير، وتحقق عنده أنه من أولياء الله الذين لا خوف عليهم ولا هم يحزنون. فالتزم خدمته والاقتداء به بإشارته فيما تعارض عنده من الأعمال الشرعية التي قد تعلمها في ملته. وجعل حي بن يقظان يستفصحه عن أمره وشأنه، فجعل أسال يصف له شأن جزيرته وما فيها من العالم، وكيف كانت سيرهم قبل وصول الملة اليهم.
236
+
237
+ وكيف هي الآن بعد وصولها إليهم، وصف له جميع ما ورد في الشريعة من وصف العالم الإلهي، والجنة والنار، والبعث والنشور، والحشر والحساب، والميزان والصراط. ففهم حي بن يقظان ذلك كله ولم ير فيه شيء على خلاف ما شاهده في مقامه الكريم. فعلم أن الذي وصف ذلك وجاء به محق في وصفه، صادق في قوله، ورسول من عند ربه؛ فأمن به وصدقه وشهد برسالته.
238
+
239
+ ثم جاء يسأله عما جاء به من الفرائض، ووضعه من العبادات؛ فوصف له الصلاة والزكاة، والصيام والحج، وما أشبهها من الأعمال الظاهرة؛ فتلقى ذلك والتزمه، وأخذ نفسه بأدائه امتثالاً للآمر الذي صح عنده صدق قوله.
240
+
241
+ إلا انه بقي في نفسه أمران كان يتعجب منهما ولا يدري وجه الحكمة فيهما: أحدهما - لما ضرب هذا الرسول الأمثال للناس في أكثر ما وصفه من أمر العالم الإلهي، وأضرب عن المكاشفة حتى وقع الناس في أمر عظيم من التجسيم، واعتقاد أشياء في ذات الحق هو منزه عنها وبريء منها؟ وكذلك في أمر الثواب والعقاب! والآمر الآخر - لم اقتصر على هذه الفرائض ووظائف العبادات وأباح الاقتناء للأموال والتوسع في المأكل، حتى بفرغ الناس بالاشتغال بالباطل، والأعراض عن الحق؟ وكان رأيه هو لا يتناول أحد شيئاً إلا ما يقيم به من الرمق؛ واما الأموال فلم تكن لها عنده معنى.
242
+
243
+ وكان يرى ما في الشرع من الأحكام في أمر الأموال: كالزكاة وتشعبها، والبيوع والربا والحدود والعقوبات، فكان يستغرب هذا كله ويراه تطويلاً، ويقول: إن الناس لو فهموا الآمر على حقيقته لاعرضوا عن هذه البواطل، وأقبلو على الحق، واستغنوا عن هذا كله، ولم يكن لاحد اختصاص بمال يسأل عن زكاته، أو تقطع الأيدي على سرقته، أو تذهب النفوس على أخذه مجاهرة.
244
+
245
+ وكان الذي أوقعه في ذلك ظنه، أن الناس كلهم ذوو فطر فائقة، وأذهان ثاقبة، ونفوس عازمة، ولم يكن يدري ما هم عليه من البلادة والنقص، وسوء الرأي وضعف العزم، وأنهم كالأنعام بل هم أضل سبيلاً.
246
+
247
+ فلما اشتد إشفاقه على الناس، وطمع أن تكون نجاتهم على يديه، حدثت له النية في الوصول إليهم، وإيضاح الحق لديهم، وتبييه لهم ففاوض في ذلك صاحبه أسال وسأله: هل تمكنه حيلة في الوصول اليهم؟ فأعلمه بما هم فيه من نقص الفطرة والأعراض عن آمر الله فلم يتأت له فهم ذلك، وبقي في نفسه تعلق بما كان قد أمله.
248
+
249
+ وطمع أسال أيضاً أن يهدي الله على يديه طائفة من معارفه المريدين الذين كانوا أقرب من التخلص من سواهم، فساعده على رأيه، ورأيا أن يلتزما ساحل البحر ولا يفارقاه ليلاً ولا نهاراً، لعل الله إن السني لهما عبور البحر فالتزما ذلك وابتهلا الله تعالى أن يهيء لهما من أمرهما رشدأً.
250
+
251
+ فكان من أمر الله عز وجل أن سفينة ضلت مسلكها، ودفعها الرياح وتلاطم الأمواج إلى ساحلها. فلما قربت من البر رأى أهلها الرجلين على الشاطئ.
252
+
253
+ فدنوا منها فكلمهم أسال وسألهم أن يحملوهما معهم، فأجابوهما إلى ذلك، وأدخلوهما السفينة، فأرسل الله إليهم ريحاً رخاء حملت السفينة في أقرب مدة إلى الجزيرة التي أملاها فنزلا بها، ودخلا مدينتها، واجتمع أصحاب أسال به، فعرفهم شأن حي بن يقظان، فاشتملوا عليه شديداً وأكبروا آمره، واجتمعوا إليه واعظموه وبجلوه، وأعلمه أسال أن تلك الطائفة هم أن تلك الطائفة هم أقرب إلى الفهم والذكاء من جميع الناس، وانه إن عجز عن تعليمهم فهو عن تعليم الجمهور أعجز.
254
+
255
+ وكان رأس تلك الجزيرة سلامان وهو صاحب أسال الذي كان يراه ملازمة الجماعة، ويقول بتحريم العزلة، فشرع حي بن يقظان في تعليمهم وبث أسرار الحكمة إليهم.
256
+
257
+ فما هو إلا أن ترقى عن الظاهر قليلاً وأخذ في وصف ما سبق إلى فهمهم خلافه، فجعلوا ينقبضون منه وتشمئز نفوسهم مما يأتي به، ويتسخطونه بقلوبهم، وان اظهروا له الرضا في وجهه اكراماً لغربته فيهم، ومراعاة لحق صاحبهم أسال! وما زال حي بن يقظان يستلطفهم ليلاً ونهاراً، ويبن لهم الحق سراً وجهاراً، فلا يزيدهم ذلك إلا نبوأً ونفاراً، مع أنهم كانوا محبين للخير، راغبين في الحق، إلا انهم لنقص فطرتهم كانوا لا يطلبون الحق من طريقة ولا يأخذونه لجهة تحقيقه، ولا يلتمسونه من بابه، بل كانوا لا يريدون معرفته من طريق أربابه. فيأس من أصلاحهم، وانقطع رجائه من صلاحهم لقلة قبولهم.
258
+
259
+ وتصفح طبقات الناس بعد ذلك، فرأى كل حزب بما لديهم فرحون، قد اتخذوا ألههم هواهم، ومعبودهم شهواتهم، وتهالكوا في جميع حطام الدنيا، ألهاهم التكاثر حتى زاروا المقابر، لا تنجح فيهم الموعظة ولا تعمل فيهم الكلمة الحسنة، ولا يزدادون بالجدل إلا إصرارا.
260
+
261
+ واما الحكمة فلا سبيل لهم إليها، ولا حظ لهم منه، قد غمرتهم الجهالة وران على قلوبهم ما يكسبون ختم الله على قلوبهم وعلى سمعهم وعلى أبصارهم غشاوةً ولهم عذاب عظيم.
262
+
263
+ فلما رأى سرادق العذاب قد أحاط بهم، الظالمات الحجب قد تغشتهم، والكل منهم - إلا اليسير - لا يتمسكون من ملتهم إلا بالدنيا، وقد نبذوا أعمالهم على خفتها وسهولتها وراء ظهورهم، واشتروا بها ثمناً قليلاً، وألهاهم عن ذكر الله تعالى التجارة والبيع، ولم يخافوا يوماً تنقلب فيه القلوب والابصار، لأن له وتحقق على القطع، أن مخاطبتهم بطريق المكاشفة لا تمكن وأن تكليفهم من العمل فوق هذا القدر لا يتفق، وأن حظ أكثر الجمهور من الانتفاع بالشريعة إنما هو في حياتهم الدنيا لا يستقيم له معاشه، ولا يتعدى عليه سواه فيما اختص هو به، وانه لا يفوز منه بالسعادة الأخروية إلا الشاذ النادر، وهو من أراد حرث الآخرة وسعى لها سعياً وهو مؤمن.
264
+
265
+ وأما من طغى وأثر الحياة الدنيا فان الجحيم هي المأوى، وأي تعب أعظم وشقاوةً أطم ممن إذا تصفحت أعماله من وقت انتباهه من نومه إلى حين رجوعه إلى الكره لا تجد منها شيئاً إلا وهو يلتمس به تحصيل غايةً من هذه الأمور المحسوسة الخسيسة آما مال يجمعه أو لذة ينالها أو شهوة يقضيها أو غيطاً يتشفه به أو جاه يحرزه أو عمل من أعمال الشرع يتزين به أو يدافع عن رقبته، وهي كلها ظلمات بعضها فوق بعض في بحر لجي وان منكم إلا واردها كان على ربك حتماً مقضياً.
266
+
267
+ فلما فهم أحوال الناس وان أكثرهم بمنزلة الحيوان غير الناطق علم أن الحكمة كلها والهداية والتوفيق فيما نطقت به الرسل ووردت به الشريعة لا يمكن غير ذلك ولا يحتمل المزيد عليه ولكل عمل رجال وكل ميسر لما خلق له "بسم الله الرحمن الرحيم" سنة الله التي قد خلت من قبل ولن تجد لسنة الله تبديلاً صدق الله العظيم.
268
+
269
+ فانصرف إلى سلامان وأصحابه، فاعتذر عما تكلم به معه وتبرأ إليهم منه وأعلمهم أنه قد رآه مثل رأيهم واهتدى بمثل هديهم، وأوصاهم بملازمة ما هم عليه من التزام حدود الشرع والأعمال الظاهرة مقلة الخوض فيما لا يعنيهم، والإيمان بالمتشابهات والتسليم لها، والأعراض عن البدع والأهواء والاقتداء بالسلف الصالح والترك لمحدثات الأمور، وأمرهم بمجانبة ما عليه جمهور العوام من إهمال الشريعة والإقبال على الدنيا، وحذرهم عنه غاية التحذير، وعلم هو وصاحبه أسال أن هذه الطائفة المريدة القاصرة لا نجاة لها إلا بهذا الطريق، وأنها إن رفعت عنه إلى يفاع الاستبصار اختل ما هي عليه ولم يمكنها أن تلحق بدرجة السعداء وتذبذبت وانتكست وساءت عاقبتها. وان هي دامت على ما هي عليه حتى يوافيها اليقين فازت بالآمن وكانت من أصحاب اليمين، والسابقون السابقون أولئك المقربون. فو دعاهم وانفصلا عنهم وتلطفا في العود إلى جزيرتهما حتى يسر الله عز وجل عليهما العبور إليها. وطلب حي بن يقظان مقامه الكريم بالنحو الذي طلبه أولاً حتى عاد إليه، واقتدى به أسال حتى قرب من أو كاد وعبدا الله في تلك الجزيرة حتى أتاهما اليقين. هذا - أيدنا الله وأياك بروح منه - ما كان من نبأ حي بن يقظان وأسال وسلامان وقد أشتمل على حظ من الكلام لا يوجد في كتاب ولا يسمع في معتاد خطاب، وهو من العلم المكنون الذي لا يقبله إلا أهل المعرفة بالله، ولا يجهله إلا أهل الغرة بالله. وقد خالفنا فيه طريق السلف الصالح في الضنانا به والشح عليه. إلا أن الذي سهل علينا إفشاء هذا السر وهتك الحجاب، ما ظهر في زماننا من أراء فاسده نبغت بها متفلسفة العصر وصرحت بها، حتى انتشرت في البلدان وعما ضررها وخشينا على الضعفاء الذين اطرحوا تقليد الأنبياء صلوات الله عليهم، وأرادوا تقليد السفهاء والأغبياء أن يظنوا أن تلك الآراء هي الأسرار المضنون بها على غير أهلها، فيزيد بذلك حبهم فيها وولعهم فيها. فرأينا أن نلمح إليهم بطرف من سر الأسرار لنجتذبهم إلى جانب التحقيق، ثم نصدهم عن ذلك الطريق. ولم نخل مع ذلك ما أودعناه هذه الأوراق اليسيره من الأسرار عن حجاب رقيق وستر لطيف ينتهك سريعاً لمن هو أهله، ويتكاثف لمن لا يستحق تجاوزه حتى لا يتعداه. وأنا أسئل إخواني الواقفين على هذا الكلام، أن يقبلو عذري فيما تسائلت في تبينه وتسامحت في تثبيته، فلم أفعل ذلك إلا لأني تسمنت شواهق يزل الطرف عن مرآها. وأردت تقريب الكلام فيها على وجه الترغيب والتشويق في دخول الطريق. وأسأل الله التجاوز والعفو، وأن يوردنا من المعرفة به الصفو، إنه منعم كريم. والسلام عليك أيها الأخ المفترض إسعافه ورحمت الله وبركاته.
270
+ EOT;
271
+ }
vendor/fakerphp/faker/src/Faker/Provider/at_AT/Payment.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\at_AT;
4
+
5
+ /**
6
+ * Class Payment
7
+ *
8
+ * @package Faker\Provider\at_AT
9
+ */
10
+ class Payment extends \Faker\Provider\Payment
11
+ {
12
+ /**
13
+ * Value Added Tax (VAT)
14
+ *
15
+ * @example 'ATU12345678', ('spaced') 'AT U12345678'
16
+ *
17
+ * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11
18
+ * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm
19
+ * @see http://en.wikipedia.org/wiki/VAT_identification_number
20
+ *
21
+ * @param bool $spacedNationalPrefix
22
+ *
23
+ * @return string VAT Number
24
+ */
25
+ public static function vat($spacedNationalPrefix = true)
26
+ {
27
+ $prefix = $spacedNationalPrefix ? "AT U" : "ATU";
28
+
29
+ return sprintf("%s%d", $prefix, self::randomNumber(8, true));
30
+ }
31
+
32
+ /**
33
+ * International Bank Account Number (IBAN)
34
+ * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
35
+ * @param string $prefix for generating bank account number of a specific bank
36
+ * @param string $countryCode ISO 3166-1 alpha-2 country code
37
+ * @param integer $length total length without country code and 2 check digits
38
+ * @return string
39
+ */
40
+ public static function bankAccountNumber($prefix = '', $countryCode = 'AT', $length = null)
41
+ {
42
+ return static::iban($countryCode, $prefix, $length);
43
+ }
44
+ }
vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Internet.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bg_BG;
4
+
5
+ class Internet extends \Faker\Provider\Internet
6
+ {
7
+ protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com', 'mail.bg', 'abv.bg', 'dir.bg');
8
+ protected static $tld = array('bg', 'bg', 'bg', 'bg', 'bg', 'bg', 'com', 'biz', 'info', 'net', 'org');
9
+ }
vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Payment.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bg_BG;
4
+
5
+ class Payment extends \Faker\Provider\Payment
6
+ {
7
+ /**
8
+ * International Bank Account Number (IBAN)
9
+ * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
10
+ * @param string $prefix for generating bank account number of a specific bank
11
+ * @param string $countryCode ISO 3166-1 alpha-2 country code
12
+ * @param integer $length total length without country code and 2 check digits
13
+ * @return string
14
+ */
15
+ public static function bankAccountNumber($prefix = '', $countryCode = 'BG', $length = null)
16
+ {
17
+ return static::iban($countryCode, $prefix, $length);
18
+ }
19
+
20
+ /**
21
+ * Value Added Tax (VAT)
22
+ *
23
+ * @example 'BG1234567890', ('spaced') 'BG 1234567890'
24
+ *
25
+ * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11
26
+ * @see http://en.wikipedia.org/wiki/VAT_identification_number
27
+ *
28
+ * @param bool $spacedNationalPrefix
29
+ *
30
+ * @return string VAT Number
31
+ */
32
+ public static function vat($spacedNationalPrefix = true)
33
+ {
34
+ $prefix = $spacedNationalPrefix ? "BG " : "BG";
35
+
36
+ return sprintf(
37
+ "%s%d%d",
38
+ $prefix,
39
+ self::randomNumber(5, true), // workaround for mt_getrandmax() limitation
40
+ self::randomNumber(self::randomElement(array(4, 5)), true)
41
+ );
42
+ }
43
+ }
vendor/fakerphp/faker/src/Faker/Provider/bg_BG/Person.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bg_BG;
4
+
5
+ class Person extends \Faker\Provider\Person
6
+ {
7
+ protected static $lastNameFormat = array(
8
+ '{{lastNameMale}}',
9
+ '{{lastNameFemale}}',
10
+ );
11
+
12
+ protected static $maleNameFormats = array(
13
+ '{{firstNameMale}} {{lastNameMale}}',
14
+ '{{firstNameMale}} {{lastNameMale}}',
15
+ '{{firstNameMale}} {{lastNameMale}}',
16
+ '{{titleMale}} {{firstNameMale}} {{lastNameMale}}',
17
+ );
18
+
19
+ protected static $femaleNameFormats = array(
20
+ '{{firstNameFemale}} {{lastNameFemale}}',
21
+ '{{firstNameFemale}} {{lastNameFemale}}',
22
+ '{{firstNameFemale}} {{lastNameFemale}}',
23
+ '{{titleFemale}} {{firstNameFemale}} {{lastNameFemale}}'
24
+ );
25
+
26
+ protected static $firstNameMale = array(
27
+ 'Абен', 'Аблен', 'Август', 'Августиан', 'Августин', 'Авел', 'Авер', 'Аверно', 'Авксентий', 'Аво', 'Авраам', 'Аврам', 'Аврели', 'Аврелий', 'Аврор', 'Агапи', 'Агапий', 'Агатопод', 'Агент', 'Аглай', 'Аглар', 'Агнен', 'Агнеш', 'Агоп', 'Агъци', 'Адалберт', 'Адам', 'Адеан', 'Аделин', 'Адем', 'Аднан', 'Адриан', 'Адриян', 'Аерозол', 'Азалия', 'Айдемир', 'Акашия', 'Аксакусти', 'Аксидан', 'Аксинтия', 'Албен', 'Алберт', 'Албияна', 'Алдин', 'Алевандър', 'Алег', 'Алек', 'Алекзандриян',
28
+ 'Беримир', 'Берин', 'Берислав', 'Берия', 'Беро', 'Берослав', 'Бетина', 'Бетино', 'Бечо', 'Билян', 'Бинко', 'Биньо', 'Биню', 'Бисенти', 'Бисер', 'Благо', 'Благовест', 'Благой', 'Благомир', 'Благосвет', 'Блаже', 'Бог', 'Богдан', 'Богиня', 'Богой', 'Боголюб', 'Богомил', 'Богослав', 'Бодромир', 'Божан', 'Божидар', 'Божик', 'Божил', 'Божимир', 'Божин', 'Божинел', 'Божко', 'Божо', 'Божур', 'Боил', 'Боила', 'Бойко', 'Бойо', 'Бойчо', 'Болен', 'Болеслав', 'Боне', 'Бонислав', 'Бонко', 'Боно',
29
+ 'Веселин', 'Весислав', 'Веско', 'Весо', 'Веспасиян', 'Ветко', 'Вечко', 'Вигалот', 'Виго', 'Виделин', 'Виден', 'Видин', 'Видол', 'Видослав', 'Видю', 'Викенти', 'Виктор', 'Вилиан', 'Вилизар', 'Вилизара', 'Вилислав', 'Вилиян', 'Вилям', 'Винету', 'Винко', 'Вино', 'Винсънт', 'Винченцо', 'Виолет', 'Виолин', 'Висарион', 'Виталий', 'Витан', 'Витко', 'Витлян', 'Витомир', 'Витош', 'Вихрен', 'Вихрони', 'Вихър', 'Вичо', 'Виша', 'Вишан', 'Вишетин', 'Вишню', 'Влад', 'Владилен', 'Владимер', 'Владимир',
30
+ 'Галентин', 'Галиен', 'Галимир', 'Галин', 'Галиян', 'Гани', 'Ганислав', 'Ганцомир', 'Ганчо', 'Ганьо', 'Гаро', 'Гатьо', 'Гацо', 'Гачо', 'Гвардиана', 'Гелемир', 'Генади', 'Генади Валериев', 'Генадий', 'Генислав', 'Генко', 'Гено', 'Генчо', 'Геньо', 'Гео', 'Геодим', 'Геомил', 'Георги', 'Герасим', 'Герган', 'Гергей', 'Гергелюб', 'Гергин', 'Герго', 'Гердан', 'Герман', 'Геро', 'Герой', 'Герчо', 'Гетислав', 'Гетко', 'Гето', 'Гецо', 'Гечко', 'Гечо', 'Гешо', 'Гивеза', 'Гиздален', 'Гико', 'Гилдрой',
31
+ 'Делчо', 'Делян', 'Деляна', 'Демин', 'Демир', 'Демян', 'Дениз', 'Деника', 'Денимир', 'Денис', 'Денислав', 'Дениян', 'Денчо', 'Деньо', 'Дердидас', 'десилиан', 'Десимир', 'Десислав', 'Деслав', 'Деспин', 'Деспинка', 'Деспот', 'Детелин', 'Детелюб', 'Дечко', 'Дечо', 'Дечю', 'Дешо', 'Деян', 'Джанер', 'Джанко', 'Джихад', 'Джон-стефан', 'Джулиен', 'Диаманди', 'Диамантина', 'Диан', 'Диван (на дядо Диан и дядо Иван)', 'Дивизие', 'Дивизия', 'Дивил', 'Дидко', 'Диего', 'Дийвид', 'Дико', 'Дилян',
32
+ 'Евстати', 'Евстатий', 'Евстахий', 'Евтим', 'Егор', 'Едвин', 'Едит', 'Еднорог', 'Едрю', 'Едуард', 'Еким', 'Ектар', 'Ектор', 'Елвис', 'Елеан', 'Електрон', 'Елемаг', 'Елен', 'Еленко', 'Елиан', 'Елиас', 'Елиезер', 'Елизабет', 'Елин', 'Елисей', 'Елисия', 'Елко', 'Елтимир', 'Ельо', 'Ема-Бела', 'Еманоил', 'Емануел', 'Емануил', 'Емил', 'Емилиан', 'Емилиян', 'Ендо', 'Енис', 'Енчо', 'Еньо', 'Еню', 'Ервин', 'Ередин', 'Еремия', 'Ерик', 'Ерина', 'Ерол', 'Ерослав', 'Ерсен', 'Есен', 'Етиен', 'Ефка',
33
+ 'Заварин', 'Завен', 'Замфир', 'Занго', 'Занко', 'Заприн', 'Запрян', 'Зарко', 'Зафер', 'Зафир', 'Захар', 'Захари', 'Захарин', 'Захо', 'Звездан', 'Звезделюб', 'Звездин', 'Звездислав', 'Звездиян', 'Звездолет', 'Звездомир', 'Згура', 'Здравелин', 'Здравец', 'Здравко', 'Здравомир', 'Здравчо', 'Зенгин', 'Зика', 'Зинко', 'Зинови', 'Златан', 'Злати', 'Златил', 'Златимир', 'Златин', 'Златиян', 'Златко', 'Златогор', 'Златозар', 'Златомир', 'Златослав', 'Златоцвет', 'Златьо', 'Золтан', 'Зоран',
34
+ 'Илиомар', 'Илич', 'Илия', 'Илиян', 'Илко', 'Илчо', 'Имилиан', 'Ингемунд', 'Инко', 'Инокентий', 'Инчо', 'Иполит', 'Ириан', 'Ириней', 'иринеус', 'Ириян', 'Ирко', 'Ирма', 'Ирник', 'Исайа', 'Исак', 'Исидор', 'Искрен', 'Искър', 'Исперих', 'Истан', 'Истатко', 'Истилян', 'Исус', 'Итан', 'Итко', 'Ихтиандър', 'Ицо', 'Ичо', 'Йено', 'Йеремия', 'Йоан', 'Йоан-Александър', 'Йоан-иво', 'Йов', 'Йован', 'Йовица', 'Йовко', 'Йово', 'Йовро', 'Йовцо', 'Йовчо', 'Йожи', 'Йоил', 'Йоланд', 'Йолиян', 'Йолко',
35
+ 'Карен', 'Карим', 'Карин', 'Карло', 'Кармен', 'Каролин', 'Карчо', 'Касандър', 'Катакомб', 'Каталинка', 'Катерин', 'Кевин', 'Кеворк', 'Кери', 'Кибер', 'Кимба', 'Кимбо', 'Кимо', 'Кимон', 'Кимчо', 'Кин', 'Кинка', 'Кинта', 'Киприслав', 'Киприян', 'Кириен', 'Кирил', 'Кирко', 'Кирчо', 'Киряк', 'Киряки', 'Киряко', 'Кис', 'Кит', 'Кито', 'Китодар', 'Китомир', 'Клеантин', 'Клим', 'Климент', 'Кнут', 'Козма', 'Койно', 'Койо', 'Койчо', 'Коко', 'Коле', 'Колонина', 'Колчо', 'Кольо', 'Колю', 'Комнин',
36
+ 'Лалко', 'Лало', 'Лальо', 'Ламби', 'Ламбо', 'Ламбри', 'Ламбю', 'Ланселот', 'Ласкал', 'Ласкар', 'Ластър', 'Латин', 'Латко', 'Латьо', 'Латю', 'Лашко', 'ЛЕА-МАРИЯ', 'Леандър', 'Лев', 'Левент', 'Левчо', 'Леко', 'Ленин', 'Ленко', 'Леон', 'Леонардо', 'Леонид', 'Лесе', 'Лефтер', 'Лечо', 'Лилко', 'Лило', 'Лилчо', 'Лилян', 'Лимон', 'Лимончо', 'Липе', 'Лихия', 'Личо', 'Ловчо', 'Лозан', 'Лозана', 'Лозен', 'Лора-софия', 'Лоранс', 'Лоренцо', 'Лука', 'Лукан', 'Луко', 'Лули', 'Лулчо', 'Лусио', 'Лусия',
37
+ 'Маноел', 'Манол', 'Манолин', 'Маноло', 'Мантас', 'Мануил', 'Мануш', 'Манчестър Юнайтед', 'Манчо', 'Маньо', 'Маню', 'Марангони', 'Маргарин', 'Маргарит', 'Марек', 'Мариан', 'Марий', 'Марин', 'Маринел', 'Маринчо', 'Марио', 'Мариоллита', 'Мариочка', 'Маритна', 'Мариян', 'Марк', 'Марк-антоний', 'Марко', 'Маркус', 'Мартен', 'Мартин', 'Мартиниян', 'Марто', 'Маруш', 'Марчело', 'Маслина', 'Матей', 'Матьо', 'Матю', 'Махно', 'Машо', 'Медиан', 'Менко', 'Мено', 'Мерилин', 'Месак', 'Метакса',
38
+ 'Найо', 'Найчо', 'Наке', 'Нако', 'Нанко', 'Нанков', 'Нано', 'Нансимир', 'Нанчо', 'Наню', 'Нарцислав', 'Наско', 'Настимир', 'Настрадин', 'Натанаил', 'Нати', 'Натко', 'Наум', 'Нафисат', 'Нафтали', 'Нацко', 'Нацо', 'Начиян', 'Начко', 'Начо', 'Невелин', 'Невен', 'Невенко', 'Невилиян', 'Невян', 'Негослав', 'Неделин', 'Неделчо', 'Недислав', 'Недко', 'Недолюб', 'Недьо', 'Недю', 'Недялко', 'Нейко', 'Нейчо', 'Нелко', 'Нелчо', 'Нене', 'Ненко', 'Нено', 'Ненсислав', 'Ненчо', 'Неокли', 'Нерес',
39
+ 'Обретим', 'Ованес', 'Огин', 'Огнемир', 'Огнен', 'Огнян', 'Океан', 'Олег', 'Олек', 'Олимпи', 'Омар', 'Омуртаг', 'Оник', 'Онуфри', 'Ончо', 'Орел', 'Орлин', 'Ортодокси', 'Орфей', 'Орхидей', 'Орце', 'Оскар', 'Оханес', 'Павел', 'Павелин', 'Павил', 'Павко', 'Павлик', 'Павлин', 'Павлинчо', 'Павломир', 'Паисий', 'Пако', 'Палми', 'Палмиро', 'Панаври', 'Панай', 'Панайот', 'Панде', 'Панделис', 'Пане', 'Панкртийян', 'Пано', 'Панталей', 'Пантелей', 'Пантер', 'Панто', 'Пантю', 'Панчо', 'Паолина',
40
+ 'Параскев', 'Параход', 'Парашкев', 'Парашкеван', 'Паруш', 'Паскал', 'Паско', 'Паспанахил', 'Пато', 'Патрик', 'Патьо', 'Паулин', 'Паун', 'Пацо', 'Пачо', 'Пашо', 'Пейко', 'Пейо', 'Пейодон', 'Пейтан', 'Пейчин', 'Пейчо', 'Пеко', 'Пелай', 'Пеле', 'Пене', 'Пенко', 'Пенчин', 'Пенчо', 'Пеньо', 'Пеню', 'Пео', 'Пепино', 'Пепислав', 'Пепо', 'Пепонаки', 'Перикъл', 'Персиана', 'Персиян', 'Перчо', 'Петиконгрес', 'Петкан', 'Петко', 'Пето', 'Петраки', 'Петран', 'Петрана', 'Петринел', 'Петрозар', 'Петромил',
41
+ 'Рангел', 'Рангел-любими', 'Рандю', 'Ранчо', 'Расате', 'Ратослав', 'Рафаил', 'Рачко', 'Рачо', 'Рашко', 'Рашо', 'Раю', 'Раян', 'Реан', 'Рем', 'Рикардо', 'Риналдо', 'Рис', 'Ристя', 'Ричард', 'Ричерд', 'Роберт', 'Роберто', 'Робин', 'Робърт', 'Рогелин', 'Рогелина', 'Рогена', 'Родан', 'Родион', 'Розалин', 'Розин', 'Розоцвет', 'Ройо', 'Роксан', 'Роман', 'Ромел', 'Ромелина', 'Ромен', 'Ромео', 'Ромил', 'Ромул', 'Росен', 'Росенка', 'Росимир', 'Росицвет', 'Роска', 'Роско', 'Ростиана', 'Ростимир', 'Ростислав',
42
+ 'Светломир', 'Светлю', 'Светозар', 'Светослав', 'Свилен', 'Себастиан', 'Себахтин', 'Севан', 'Севар', 'Севастин', 'Севдалин', 'Севдан', 'Севелин', 'Северин', 'Седевчо', 'Седеф', 'Седефчо', 'Селен', 'Селена', 'Сенко', 'Серафим', 'Сергей', 'Сеслав', 'Сиви', 'Сивко', 'Сидер', 'Сидония', 'Сидор', 'Сиен', 'Силаги', 'Силан', 'Силвестър', 'Силвио', 'Силвиян', 'Силен', 'Силян', 'Симеон', 'Симо', 'Сирман', 'Сифоня', 'Скорбут', 'Слав', 'Славдо', 'Славе', 'Славей', 'Славейко', 'Славен', 'Слави', 'Славил',
43
+ 'Теодоси', 'Теодосий', 'Теодослав', 'Теодостин', 'Теофан', 'Теофил', 'Теохар', 'Тервел', 'Тигрони', 'Тило', 'Тильо', 'Тимо', 'Тимон', 'Тимотей', 'Тимчо', 'Тинко', 'Тино', 'Тинчо', 'Тихо', 'Тихол', 'Тихомир', 'Тихон', 'Тишо', 'Тоде', 'Тодомирка', 'Тодор', 'Тодораки', 'Тодорин', 'Тодорина', 'Токимир', 'Толек', 'Толю', 'Тома', 'Томас', 'Томен', 'Томи', 'Томинка', 'Томислав', 'Томо', 'Тоне', 'Тони', 'Тонимир', 'Тонислав', 'Тонко', 'Тончо', 'Тоньо', 'Топалко', 'Тополко', 'Тотко', 'Тотьо', 'Тотю', 'Тоцо',
44
+ 'Филатей', 'Фили', 'Филидан', 'Филимон', 'Филион', 'Филип', 'Филипас', 'Филипопол', 'Филко', 'Филомир', 'Филчо', 'Фильо', 'Финдо', 'Финдол', 'Фиро', 'Фирчо', 'Фичо', 'Флори', 'Флориан', 'Флорин', 'Флоро', 'Фори', 'Фосил', 'Фотин', 'Франк', 'Франц', 'Францислав', 'Фрацил', 'Фреди', 'Фродо', 'Фуго', 'Фуко', 'Фъстък', 'Фътьо', 'Фьодор', 'Хавтелин', 'Ханко', 'Хараламби', 'Харалампи', 'Харалан', 'Харбингър', 'Хари', 'Харизан', 'Харитии', 'Харитон', 'Хасан', 'Хасатин', 'Хачо', 'Хвойне', 'Хебър', 'Хектор',
45
+ 'Хераклит', 'Хернани', 'Херодот', 'Хефестион', 'Химинай', 'Хинко', 'Хино', 'Хитко', 'Хороз', 'Храбрин', 'Храбър', 'Хранимир', 'Хранко', 'Хрелко', 'Хрельо', 'Хрисим', 'Хрисимир', 'Хрисо', 'Христалин', 'Христивилин', 'Христиела', 'Христилиан', 'Христилин', 'християн', 'Христо', 'Христо-никола', 'Христодор', 'Христозар', 'Христозорнициан', 'Христозорницомил', 'Христомил', 'Христомир', 'Христоско', 'Христослав', 'Христофор', 'Хрисчо', 'Хрондел', 'Хрусан', 'Хубав', 'Хубавен', 'Хубан', 'Хубен',
46
+ 'Цоньо', 'Цоню', 'Цоцо', 'Цочо', 'Цъки', 'Чавдар', 'Чанкете', 'Чанко', 'Чано', 'Чаньо', 'Чаню', 'Чардафон', 'Чародей', 'Чауш', 'Чачо', 'Чвор', 'Чедомир', 'Ченко', 'Ченю', 'Чепо', 'Чернобил', 'Черноризец', 'Черньо', 'Чийо', 'Чико', 'Чило', 'Чонар', 'Чони', 'Чоно', 'Чоню', 'Чора', 'Чочо', 'Чочомир', 'Чубрик', 'Чуде', 'Чудо', 'Чудомир', 'Чудослав', 'Чук', 'Шабан', 'Шамо', 'Шанко', 'Шаноу', 'Шаро', 'Шейна', 'Шеки', 'Шенко', 'Шенол', 'Шибил', 'Шидер', 'Шильо', 'Шинко', 'Шино', 'Шипчан', 'Ширко', 'Шишман',
47
+ 'Шкодри', 'Шмильо', 'Шмулю', 'Шпилко', 'Шпиньо', 'Шушо', 'Щедрин', 'Щедю', 'Щеки', 'Щено', 'Щеню', 'Щерион', 'Щериян', 'Щерко', 'Щеро', 'Щерьо', 'Щерю', 'Щилиян', 'Щилян', 'Щирян', 'Щоно', 'Щтърбан', 'Щтъркан', 'Щурк', 'Щурчо', 'Щърбан', 'Щъркан', 'Ъглен', 'Ълен', 'Ърнест', 'Ъруин', 'Ърчо', 'Ьобирдар', 'Юги', 'Юли', 'Юлиан', 'Юлий', 'Юлиян', 'Юрдан', 'Юри', 'Юрий', 'Юстин', 'Юстиниан', 'Яблен', 'Явлен', 'Явор', 'Яго', 'Ягодин', 'Язо', 'Яким', 'Яко', 'Якоб', 'Яков', 'Якослав', 'Ямболен', 'Ян', 'Янадин',
48
+ 'Янаки', 'Янакин', 'Яначко', 'Яне', 'Янег', 'Янедин', 'Янек', 'Янеслав', 'Яни', 'Яниел', 'Яник', 'Янимир', 'Янис', 'Янислав', 'Яничко', 'Янко', 'Янкул', 'Янкуп', 'Яно', 'Яномил', 'Янтар', 'Януш', 'Янцислав', 'Янче', 'Янчо', 'Ярно', 'Яромир', 'Ярослав', 'Ярце', 'Ярчо', 'Яръм', 'Ярю', 'Ясен', 'Ясер', 'Ястреб', 'Ятан', 'Яцо', 'Ячко', 'Ячо', 'Яшар', 'Яшка', 'Яшо', 'Яшон'
49
+ );
50
+
51
+ protected static $firstNameFemale = array(
52
+ 'Авгия', 'Авигея', 'Авторка', 'Аглая', 'Аглоида', 'Агнешка', 'Адамина', 'Адра', 'Адрианиа', 'Аела', 'Айрен', 'Аксентия', 'Алания', 'Албина', 'Александрина', 'Алексиа', 'Аленка', 'Алиана', 'Алисия', 'Алтая', 'Амбър', 'Амория', 'Ана Мария', 'Анатолия', 'Ангелка', 'Андика', 'Андриана', 'Анелина', 'анета', 'Анза', 'Анимира', 'Аница', 'Аномалия', 'Антоалина', 'Антонела', 'Ануша', 'Анхея-мей', 'Аполинария', 'Аралия', 'Аркадия', 'Арсена', 'Аселина', 'Асифа', 'Астромерия', 'Атина', 'Аурора', 'Багра',
53
+ 'Балина', 'Бацислава', 'Беатрис', 'Бела', 'Белисима', 'Беломира', 'Бенелена', 'Берислава', 'Бея', 'Билена', 'Бисера', 'Биянка', 'Благодатка', 'Благосвета', 'Богдалина', 'Богородка', 'Бодурка', 'Божидара-силвестра', 'Божинела', 'Божурка', 'Бонифация', 'Борена', 'Бориска', 'Борянка', 'Боца', 'Бригита', 'Бронислава', 'Буна', 'Буча', 'Бързана', 'Ваклина', 'Валерия', 'Валя', 'Вангелия', 'Ванухи', 'Варта', 'Васенка', 'Василина', 'Васка', 'Вашиля', 'Вежда', 'Велиана', 'Велинна', 'Велиянка', 'Венда',
54
+ 'Венеция', 'Венислава', 'Венчислава', 'Верена', 'Верислава', 'Веса', 'Веселинка', 'Весна', 'Веца', 'Видима', 'Виктория', 'Вилия', 'Вилхема', 'Виолета', 'Виржиния', 'Витомира', 'Вишка', 'Владилена', 'Владлена', 'Водица', 'Войнка', 'Вула', 'Възкресения', 'Въльо', 'Върбунка', 'Въца', 'Габи', 'Галена', 'Галина', 'Галя', 'Гануца', 'Гвоздейка', 'Гена', 'Георгелена', 'Георгица', 'Герга', 'Гердана', 'Гертруда', 'Гиздана', 'Гичка', 'Гордана', 'Гория', 'Гоца', 'Графица', 'Грета', 'Гримяна', 'Гроздинка',
55
+ 'Гуна', 'Гъда', 'Гълъбица', 'Гюгра', 'Гюргя', 'Дакота', 'Дамяна', 'Данелина', 'Данимира', 'Данка', 'Дарданела', 'Дария', 'Дафинка', 'Деа', 'Деви', 'Делиана', 'Деля', 'Демирела', 'Дениандра', 'Дениславена', 'Денница', 'Десимиляна', 'Десияна', 'Дефлорина', 'Дея', 'Джана', 'Джиневра', 'Джулия', 'Диана - Мария', 'Дида', 'Дилмана', 'Димитра', 'Димка', 'Динна', 'Добрина', 'Дойка', 'Доменика', 'Доника', 'Дора-Анна', 'Дорина', 'Доста', 'Доча', 'Драгица', 'Дренка', 'Дуда', 'Душка', 'Дюкяна', 'Евангелина',
56
+ 'Евдокия', 'Евридика', 'Едита', 'Ел', 'Елдора', 'Еленица', 'Елеонета', 'Ели', 'Елиз', 'Елина', 'Елиса', 'Елица', 'Елма', 'Елфида', 'Емануила', 'Емма', 'Еница', 'Ергана', 'Ермиля', 'Естела', 'Ефимена', 'Ефросиния', 'Жаклин', 'Жанин', 'Жара', 'Жейна', 'Желязка', 'Женимира', 'Жива', 'Живомира', 'Жичка', 'Жорка', 'Жулиана', 'Заека', 'Занка', 'Зафа', 'Захаринка', 'Звездемира', 'Здравелина', 'Здухостина', 'Зинаида', 'Златея', 'Златка', 'Златомира', 'Зоичка', 'Зорка', 'Зузичка', 'Ивалена', 'ивамина',
57
+ 'Иванеса', 'Иваничка', 'Ивелиана', 'Ивинка', 'Иглика', 'Изидора', 'Илеана', 'Илианна', 'Илинда', 'Илка', 'Инан', 'Инеса', 'Ира', 'Ирин', 'Ирла', 'Исихия', 'Истилияна', 'Йоана', 'Йоанна', 'Йованка', 'Йоко', 'Йолина', 'Йона', 'Йоника', 'Йорданка', 'Йоханна', 'Кадифейка', 'Калея', 'Калина', 'Калиса', 'Калуда', 'Камея', 'Кануша', 'Карамелита', 'Карина', 'Касиди', 'Катастрофа', 'Катинка', 'Каунка', 'Кветослава', 'Керанка', 'Кети', 'Кино', 'Кирка', 'Китчица', 'Клара', 'Клеуна', 'Клоя', 'Кокимира',
58
+ 'Комара', 'Константина', 'Корнелия', 'Костадинка', 'Кралина', 'Красидара', 'Красияна', 'Криси', 'кристабела', 'Кристиана', 'Кристия', 'Кръстанка', 'Ксандриния', 'Кунка', 'Кьнина', 'Лада', 'Лазура', 'Лалка', 'Лариса', 'Лаца', 'Лека', 'Ленче', 'Летисия', 'Либерта', 'Лидийка', 'Лика', 'Лилия', 'Лилянка', 'Линда', 'Лия', 'Лозанка', 'Лорена', 'Лоти', 'Луна', 'Лъчезарка', 'Любина', 'Люблина', 'Любослава', 'Люляна', 'Люсила', 'Лянка', 'Магдалена', 'Мадлен', 'Майя', 'Максимилияна', 'Малена',
59
+ 'Малтина', 'Манолина', 'Мара-антоанета', 'Маргит', 'Марен', 'Мари-анри', 'Марийка', 'Маринета', 'Мариотка', 'Мария', 'Мария-елена', 'Мария-Хуана', 'Марлена', 'Маруся', 'Маса', 'Матка', 'Маша', 'Медиха', 'Мелания', 'Мелъди', 'Меропа', 'Миглена', 'Мила', 'Милара', 'милдия', 'Милиана', 'Милост', 'Мимоза', 'Минка', 'Миранза', 'Мирена', 'Миропа', 'Мисла', 'Митошка', 'Михайлена', 'Мишка', 'Младлена', 'Момера', 'Моника', 'Мортадела', 'Мушана', 'Наводненка', 'Надка', 'Найда', 'Нани', 'Настия',
60
+ 'Наташа', 'Невена', 'Негрита', 'Неделяна', 'Нейка', 'Нелида', 'Нелла', 'Неолина', 'Нешка', 'Нигрита', 'Никоела', 'Николина', 'Нионила', 'Нона', 'Норка', 'Нурета', 'Огнена', 'Октавия', 'Оливера', 'Омана', 'Орлеана', 'Орхидея', 'Павилия', 'Павлина', 'Палвира', 'Паломина', 'Панда', 'Пантера', 'Парашкевица', 'Парунка', 'Патриотка', 'Паулина', 'Паца', 'Пейолина', 'Пелина', 'Пепелота', 'Периана', 'перуна', 'Петинка', 'Петрийка', 'Петромира', 'Петрушка', 'Пешка', 'Пламена', 'Плодовитка',
61
+ 'Полексина', 'Полин', 'Правда', 'Преса', 'Прина', 'Пролетина', 'Простисвета', 'Пупи', 'Първолетка', 'Рада', 'Радиа', 'Радимира', 'Радка', 'Радосвета', 'Радостка', 'Раинка', 'Райничка', 'Рамина', 'Ревка', 'Ренгия', 'Риана', 'Римма', 'Рия', 'Роза', 'Розана', 'Розета', 'Розка', 'Роксана', 'Ромолета', 'Роселина', 'Росислава', 'Ростислава', 'Ружка', 'Румислава', 'Русалия', 'Руска', 'Сабина', 'Савета', 'Салина', 'Санка', 'Сарая', 'Сахория', 'Свежа', 'Светла', 'Светломира', 'Свидна', 'Свободка',
62
+ 'Севда', 'севделина', 'Севета', 'Семенарка', 'Сергелинка', 'Сибила', 'Сиена', 'Силви', 'Силвия-александра', 'Силяна', 'Симона', 'Синтия', 'Сисоя', 'Скакалка', 'Славея', 'Славка', 'Сладоледка', 'Смехотерапия', 'Смирна', 'Снежинка', 'Софийка', 'Спасена', 'Спасияна', 'Спирела', 'Стависара', 'Стаматка', 'Станиела', 'Станимирка', 'Сташа', 'Стелина', 'Стефани', 'Стеяна', 'Стоимена', 'Столетка', 'Стоянка', 'Сузи', 'Съвестина', 'Сърменка', 'Таисия', 'тамара', 'Таня', 'Ташимира', 'Теа',
63
+ 'Телефонка', 'Темира', 'Теодора', 'Теса', 'Тилиана', 'Тиха', 'Тоанета', 'Толиана', 'Тона', 'Тоницвета', 'Тоска', 'Тошка', 'Трендафила', 'Трифонка', 'Троша', 'Труфана', 'Тръпка', 'Туфка', 'Улиана', 'Урима', 'Фабияна', 'Фатиме', 'Феня', 'Фикия', 'Филипини', 'Фимка', 'Флавия', 'Флорика', 'Фотинка', 'Фронка', 'Фуга', 'Хана', 'Харитония', 'Хенриета', 'Хинка', 'Холи', 'Хранислава', 'Хрисанка', 'Христа', 'Христела', 'Христилияна', 'Христоелена', 'Христя', 'Хубавелка', 'Цанета', 'Царевна',
64
+ 'Цветана', 'Цветелина', 'Цветилена', 'Цветлина', 'Цветолилия', 'Цветяна', 'Цеца', 'Цола', 'Цоня', 'Чана', 'Чардафона', 'Чачия', 'Череша', 'Четвърта', 'Чона', 'Чубрина', 'Шана', 'Шена', 'Шехерезада', 'Шинка', 'Щедра', 'Щериана', 'Щефания', 'Щилянка', 'Щтилка', 'Ъгленка', 'Ъчка', 'Юлиена', 'Юлия', 'Юнона', 'Юрита', 'Юстианна', 'Ябленка', 'Явора', 'Ягода', 'Ялислава', 'Яна - Мартина', 'Янина', 'Яниславия', 'Янка', 'Ярка', 'Ясена', 'Ятана'
65
+ );
66
+
67
+ protected static $lastNameMale = array(
68
+ 'Чанталиев', 'Симеонов', 'Данданов', 'Кърков', 'Братухчев', 'Цветков', 'Иванов', 'Яназов', 'Тодоров', 'Колчев', 'Порязов', 'Келешев', 'Бърборков', 'Дришльов',
69
+ 'Макаронски', 'Количков', 'Принов', 'Бодуров', 'Китов', 'Гьоков', 'Кукуряшков', 'Симеонов', 'Балахуров', 'Милачков', 'Европов Кирилов',
70
+ 'Площаков', 'Мангъров', 'Хвърчилков', 'Дзезов', 'Ждраков', 'Месаров', 'Тухчиев', 'Топков', 'Яков', 'Иликьов', 'Бурханларски', 'Вражалски', 'Тутурилов', 'Бранков',
71
+ 'Зенгинов', 'Чокълтов', 'Фенеров', 'Кучев', 'Възвъзов', 'Кьоров', 'Джогов', 'Пъков', 'Рангелов', 'Чутурков', 'Самсонов', 'Ментешев',
72
+ 'Андонов', 'Бумов', 'Мочев', 'Дачев', 'Муев', 'Младенов', 'Тошев', 'Бедринов', 'Тумангелов', 'Негрилов', 'Канчин', 'Миленков', 'Патков',
73
+ 'Пондьов', 'Самоходов', 'Четрафилски', 'Смърдански', 'Клатуров', 'Вакрилов', 'Портокалов', 'Прошков', 'Пулев', 'Парашкевов', 'Манавски', 'Чуков',
74
+ 'Овнарски', 'Рошльов', 'Пройкова', 'Младенова', 'Кочеткова', 'Кесьов', 'Римпопов', 'Златков', 'Колев', 'Пикянски', 'Николов', 'Цицков',
75
+ 'Стойков', 'Каракашев', 'Чуканов', 'Докова', 'Мераков', 'Пеева', 'Педалов', 'Тъпчилещов', 'Въртунински', 'Кодуков', 'Татьозов', 'Токов',
76
+ 'Кукуригов', 'Юрганчев', 'Клатикрушев', 'Монтянов', 'Бобев', 'Топчийски', 'Луланков', 'Костов', 'Колипатков', 'Чукчуков', 'Геройски', 'Катъров', 'Кобиларов',
77
+ 'Лимонадов', 'Цоцов', 'Поаков', 'Недялков', 'Станишев', 'Йорданов', 'Щърбов', 'Щонов', 'Занов'
78
+ );
79
+
80
+ protected static $lastNameFemale = array(
81
+ 'Шестакова', 'Кокошкова', 'Градинарова', 'Куртакова', 'Чанлиева', 'Тодорова', 'Пътечкова', 'Скринска', 'Сапунджиева', 'Вампирска', 'Червенкова', 'Васовa', 'Таралингова',
82
+ 'Илиева', 'Кривошапкова', 'Чупетловска', 'Катърова', 'Бележкова', 'Мустакова', 'Пръндачка', 'Коритарова', 'Йоткова', 'Сланинкова', 'Мангъфова', 'Шкембова', 'Пенджакова',
83
+ 'Пачаръзка', 'Куртажова', 'Плюнкова', 'Многознаева', 'Контопишева', 'Белоконска-Вражалска', 'Кучкуделова', 'Крушовска', 'Пищовколева', 'Сопаджиева', 'Точева-Клопова',
84
+ 'Габровлиева', 'Първанова', 'Певецова', 'Курухубева', 'Яркова', 'Плюцова', 'Балканска'
85
+ );
86
+
87
+ protected static $titleMale = array('Г-н', 'Др.');
88
+ protected static $titleFemale = array('Г-жа', 'Г-ца', 'Др.');
89
+
90
+ /**
91
+ * @param string|null $gender 'male', 'female' or null for any
92
+ * @example 'Чанталиев'
93
+ */
94
+ public function lastName($gender = null)
95
+ {
96
+ if ($gender === static::GENDER_MALE) {
97
+ return static::lastNameMale();
98
+ } elseif ($gender === static::GENDER_FEMALE) {
99
+ return static::lastNameFemale();
100
+ }
101
+
102
+ return $this->generator->parse(static::randomElement(static::$lastNameFormat));
103
+ }
104
+
105
+ public static function lastNameMale()
106
+ {
107
+ return static::randomElement(static::$lastNameMale);
108
+ }
109
+
110
+ public static function lastNameFemale()
111
+ {
112
+ return static::randomElement(static::$lastNameFemale);
113
+ }
114
+ }
vendor/fakerphp/faker/src/Faker/Provider/bg_BG/PhoneNumber.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bg_BG;
4
+
5
+ class PhoneNumber extends \Faker\Provider\PhoneNumber
6
+ {
7
+ protected static $formats = array(
8
+ '+359(0)#########',
9
+ '+359(0)### ######',
10
+ '+359(0)### ### ###',
11
+ '+359#########',
12
+ '0#########',
13
+ '0### ######',
14
+ '0### ### ###',
15
+ '0### ###-###',
16
+ '(0###) ######',
17
+ '(0###) ### ###',
18
+ '(0###) ###-###',
19
+ );
20
+ }
vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Address.php ADDED
@@ -0,0 +1,310 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bn_BD;
4
+
5
+ class Address extends \Faker\Provider\Address
6
+ {
7
+ protected static $cityPrefix = array('দক্ষিন', 'পূর্ব', 'পশ্চিম', 'উত্তর', 'নতুন', 'লেইক', 'পোর্ট');
8
+ protected static $citySuffix = array('টাউন', 'তলা', 'হাট', 'খানা');
9
+
10
+ protected static $streetNames = array(
11
+ 'বরকত', 'হাজী', 'করিমউদ্দিন'
12
+ );
13
+
14
+ protected static $streetSuffix = array(
15
+ 'তলী', 'গলি', 'চিপা', 'ব্রীজ', 'সড়ক', 'বাইপাস', 'ক্যাম্প',
16
+ );
17
+ protected static $postcode = array('#####', '#####-####');
18
+ protected static $state = array(
19
+ 'খুলনা', 'বরিশাল', 'চিটাগং', 'ঢাকা', 'রাজশাহী', 'সিলেট', 'কুমিল্লা'
20
+ );
21
+ protected static $country = array(
22
+ 'অস্ট্রিয়া',
23
+ 'অস্ট্রেলিয়া',
24
+ 'অ্যাঙ্গোলা',
25
+ 'অ্যান্টার্কটিকা',
26
+ 'অ্যাসসেনশন আইল্যান্ড',
27
+ 'আইভরি কোস্ট',
28
+ 'আইল অফ ম্যান',
29
+ 'আইসল্যান্ড',
30
+ 'আজারবাইজান',
31
+ 'আফগানিস্তান',
32
+ 'আমেরিকান সামোয়া',
33
+ 'আয়ারল্যান্ড',
34
+ 'আরুবা',
35
+ 'আর্জেন্টিনা',
36
+ 'আর্মেনিয়া',
37
+ 'আলজেরিয়া',
38
+ 'আলব্যানিয়া',
39
+ 'আলান্ড দ্বীপপুঞ্জ',
40
+ 'ইউক্রেইন',
41
+ 'ইকুয়েডর',
42
+ 'ইতালী',
43
+ 'ইন্দোনেশিয়া',
44
+ 'ইফিওপিয়া',
45
+ 'ইয়েমেন',
46
+ 'ইরাক',
47
+ 'ইরান',
48
+ 'ইরিত্রিয়া',
49
+ 'ইস্রায়েল',
50
+ 'উগান্ডা',
51
+ 'উজবেকিস্তান',
52
+ 'উত্তর কোরিয়া',
53
+ 'উত্তরাঞ্চলীয় মারিয়ানা দ্বীপপুঞ্জ',
54
+ 'উরুগুয়ে',
55
+ 'এন্টিগুয়া ও বারবুডা',
56
+ 'এল সালভেদর',
57
+ 'এস্তোনিয়া',
58
+ 'এ্যাঙ্গুইলা',
59
+ 'এ্যান্ডোরা',
60
+ 'ওমান',
61
+ 'ওয়ালিস ও ফুটুনা',
62
+ 'কঙ্গো - ব্রাজাভিল',
63
+ 'কঙ্গো-কিনশাসা',
64
+ 'কমোরোস',
65
+ 'কম্বোডিয়া',
66
+ 'কসোভো',
67
+ 'কাজাকস্থান',
68
+ 'কাতার',
69
+ 'কানাডা',
70
+ 'কিউবা',
71
+ 'কিউরাসাও',
72
+ 'কিরিবাতি',
73
+ 'কির্গিজিয়া',
74
+ 'কুউটা এবং মেলিলা',
75
+ 'কুক দ্বীপপুঞ্জ',
76
+ 'কুয়েত',
77
+ 'কেনিয়া',
78
+ 'কেপভার্দে',
79
+ 'কেম্যান দ্বীপপুঞ্জ',
80
+ 'কোকোস (কদ্বীপপুঞ্জ',
81
+ 'কোলোম্বিয়া',
82
+ 'কোস্টারিকা',
83
+ 'ক্যানারি দ্বীপপুঞ্জ',
84
+ 'ক্যামেরুন',
85
+ 'ক্যারিবিয়ান নেদারল্যান্ডস',
86
+ 'ক্রিসমাস দ্বীপ',
87
+ 'ক্রোয়েশিয়া',
88
+ 'গাম্বিয়া',
89
+ 'গিনি',
90
+ 'গিনি-বিসাউ',
91
+ 'গিয়ানা',
92
+ 'গুয়াদেলৌপ',
93
+ 'গুয়াম',
94
+ 'গোয়াটিমালা',
95
+ 'গ্যাবন',
96
+ 'গ্রাঞ্জি',
97
+ 'গ্রীনল্যান্ড',
98
+ 'গ্রীস',
99
+ 'গ্রেনাডা',
100
+ 'ঘানা',
101
+ 'চাদ',
102
+ 'চিলি',
103
+ 'চীন',
104
+ 'চেক প্রজাতন্ত্র',
105
+ 'জর্জিয়া',
106
+ 'জর্ডন',
107
+ 'জাপান',
108
+ 'জাম্বিয়া',
109
+ 'জার্মানি',
110
+ 'জার্সি',
111
+ 'জিবুতি',
112
+ 'জিব্রাল্টার',
113
+ 'জিম্বাবোয়ে',
114
+ 'জ্যামাইকা',
115
+ 'টুভালু',
116
+ 'টোকেলাউ',
117
+ 'টোগো',
118
+ 'টোঙ্গা',
119
+ 'ট্রিস্টান ডা কুনহা',
120
+ 'ডেনমার্ক',
121
+ 'ডোমিনিকা',
122
+ 'ডোমেনিকান প্রজাতন্ত্র',
123
+ 'তাইওয়ান',
124
+ 'তাজিকস্থান',
125
+ 'তাঞ্জানিয়া',
126
+ 'তিউনিশিয়া',
127
+ 'তিমুর-লেস্তে',
128
+ 'তুরস্ক',
129
+ 'তুর্কমেনিস্তান',
130
+ 'তুর্কস ও কাইকোস দ্বীপপুঞ্জ',
131
+ 'ত্রিনিনাদ ও টোব্যাগো',
132
+ 'থাইল্যান্ড',
133
+ 'দক্ষিণ আফ্রিকা',
134
+ 'দক্ষিণ কোরিয়া',
135
+ 'দক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপপুঞ্জ',
136
+ 'দক্ষিন সুদান',
137
+ 'দিয়েগো গার্সিয়া',
138
+ 'নরওয়ে',
139
+ 'নাইজার',
140
+ 'নাইজেরিয়া',
141
+ 'নাউরু',
142
+ 'নামিবিয়া',
143
+ 'নিউ ক্যালেডোনিয়া',
144
+ 'নিউজিল্যান্ড',
145
+ 'নিউয়ে',
146
+ 'নিকারাগুয়া',
147
+ 'নিরক্ষীয় গিনি',
148
+ 'নিরফোক দ্বীপ',
149
+ 'নেদারল্যান্ডস',
150
+ 'নেপাল',
151
+ 'পর্তুগাল',
152
+ 'পশ্চিম সাহারা',
153
+ 'পাকিস্তান',
154
+ 'পানামা',
155
+ 'পাপুয়া নিউ গিনি',
156
+ 'পালাউ',
157
+ 'পিটকেয়ার্ন দ্বীপপুঞ্জ',
158
+ 'পিরু',
159
+ 'পুয়ের্তো রিকো',
160
+ 'পোল্যান্ড',
161
+ 'প্যারাগুয়ে',
162
+ 'ফকল্যান্ড দ্বীপপুঞ্জ',
163
+ 'ফরাসী গায়ানা',
164
+ 'ফরাসী দক্ষিণাঞ্চল',
165
+ 'ফরাসী পলিনেশিয়া',
166
+ 'ফিজি',
167
+ 'ফিনল্যান্ড',
168
+ 'ফিলিপাইন',
169
+ 'ফিলিস্তিন অঞ্চলসমূহ',
170
+ 'ফ্যারও দ্বীপপুঞ্জ',
171
+ 'ফ্রান্স',
172
+ 'বতসোয়ানা',
173
+ 'বসনিয়া ও হার্জেগোভিনা',
174
+ 'বাংলাদেশ',
175
+ 'বারবাদোস',
176
+ 'বারমুডা',
177
+ 'বাহরাইন',
178
+ 'বাহামা দ্বীপপুঞ্জ',
179
+ 'বুরকিনা ফাসো',
180
+ 'বুরুন্ডি',
181
+ 'বুলগেরিয়া',
182
+ 'বেনিন',
183
+ 'বেলজিয়াম',
184
+ 'বেলিজ',
185
+ 'বেলোরুশিয়া',
186
+ 'বোলিভিয়া',
187
+ 'ব্রাজিল',
188
+ 'ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল',
189
+ 'ব্রিটিশ ভার্জিন দ্বীপপুঞ্জ',
190
+ 'ব্রুনেই',
191
+ 'ভানুয়াটু',
192
+ 'ভারত',
193
+ 'ভিয়েতনাম',
194
+ 'ভুটান',
195
+ 'ভেনেজুয়েলা',
196
+ 'ভ্যাটিকান সিটি',
197
+ 'মঙ্গোলিয়া',
198
+ 'মধ্য আফ্রিকার প্রজাতন্ত্র',
199
+ 'মন্টসেরাট',
200
+ 'মন্টিনিগ্রো',
201
+ 'মরিতানিয়া',
202
+ 'মরিশাস',
203
+ 'মাইক্রোনেশিয়া',
204
+ 'মাদাগাস্কার',
205
+ 'মায়ানমার (বা',
206
+ 'মায়োত্তে',
207
+ 'মার্কিন ভার্জিন দ্বীপপুঞ্জ',
208
+ 'মার্কিন যুক্তরাষ্ট্র',
209
+ 'মার্টিনিক',
210
+ 'মার্শাল দ্বীপপুঞ্জ',
211
+ 'মালদ্বীপ',
212
+ 'মালয়েশিয়া',
213
+ 'মালাউই',
214
+ 'মালি',
215
+ 'মাল্টা',
216
+ 'মিশর',
217
+ 'মেক্সিকো',
218
+ 'মোজাম্বিক',
219
+ 'মোনাকো',
220
+ 'মোরক্কো',
221
+ 'মোল্দাভিয়া',
222
+ 'ম্যাকাও এস এ আর চায়না',
223
+ 'ম্যাসাডোনিয়া',
224
+ 'যুক্তরাজ্য',
225
+ 'যুক্তরাষ্ট্রের পার্শ্ববর্তী দ্বীপপুঞ্জ',
226
+ 'রাশিয়া',
227
+ 'রিইউনিয়ন',
228
+ 'রুমানিয়া',
229
+ 'রুয়ান্ডা',
230
+ 'লাইবেরিয়া',
231
+ 'লাওস',
232
+ 'লাক্সেমবার্গ',
233
+ 'লাত্ভিয়া',
234
+ 'লিচেনস্টেইন',
235
+ 'লিথুয়ানিয়া',
236
+ 'লিবিয়া',
237
+ 'লেবানন',
238
+ 'লেসোথো',
239
+ 'শ্রীলঙ্কা',
240
+ 'শ্লোভাকিয়া',
241
+ 'সংযুক্ত আরব আমিরাত',
242
+ 'সলোমন দ্বীপপুঞ্জ',
243
+ 'সাইপ্রাস',
244
+ 'সাওটোমা ও প্রিন্সিপি',
245
+ 'সান মারিনো',
246
+ 'সামোয়া',
247
+ 'সার্বিয়া',
248
+ 'সিঙ্গাপুর',
249
+ 'সিন্ট মার্টেন',
250
+ 'সিয়েরালিওন',
251
+ 'সিরিয়া',
252
+ 'সিসিলি',
253
+ 'সুইজারল্যান্ড',
254
+ 'সুইডেন',
255
+ 'সুদান',
256
+ 'সুরিনাম',
257
+ 'সেনেগাল',
258
+ 'সেন্ট কিটস ও নেভিস',
259
+ 'সেন্ট পিয়ের ও মিকুয়েলন',
260
+ 'সেন্ট বারথেলিমি',
261
+ 'সেন্ট ভিনসেন্ট ও দ্যা গ্রেনাডিনস',
262
+ 'সেন্ট মার্টিন',
263
+ 'সেন্ট লুসিয়া',
264
+ 'সেন্ট হেলেনা',
265
+ 'সোমালিয়া',
266
+ 'সোয়াজিল্যান্ড',
267
+ 'সৌদি আরব',
268
+ 'স্পেন',
269
+ 'স্বালবার্ড ও জান মেয়েন',
270
+ 'স্লোভানিয়া',
271
+ 'হংকং এসএআর চীনা',
272
+ 'হণ্ডুরাস',
273
+ 'হাইতি',
274
+ 'হাঙ্গেরি',
275
+ );
276
+ protected static $cityFormats = array(
277
+ '{{cityPrefix}}{{citySuffix}}',
278
+
279
+ );
280
+ protected static $streetNameFormats = array(
281
+ '{{banglaStreetName}} {{streetSuffix}}',
282
+
283
+ );
284
+ protected static $streetAddressFormats = array(
285
+ '{{streetNumber}} {{streetName}}',
286
+ );
287
+ protected static $addressFormats = array(
288
+ "{{streetAddress}}, {{city}} {{state}}",
289
+ );
290
+
291
+ public static function cityPrefix()
292
+ {
293
+ return static::randomElement(static::$cityPrefix);
294
+ }
295
+
296
+ public static function state()
297
+ {
298
+ return static::randomElement(static::$state);
299
+ }
300
+
301
+ public static function streetNumber()
302
+ {
303
+ return Utils::getBanglaNumber(static::numberBetween(1, 100));
304
+ }
305
+
306
+ public static function banglaStreetName()
307
+ {
308
+ return static::randomElement(static::$streetNames);
309
+ }
310
+ }
vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Company.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bn_BD;
4
+
5
+ class Company extends \Faker\Provider\Company
6
+ {
7
+ protected static $formats = array(
8
+ '{{companyName}} {{companyType}}'
9
+ );
10
+
11
+ protected static $names = array(
12
+ 'রহিম', 'করিম', 'বাবলু'
13
+ );
14
+
15
+ protected static $types = array(
16
+ 'সিমেন্ট', 'সার', 'ঢেউটিন'
17
+ );
18
+
19
+ public static function companyType()
20
+ {
21
+ return static::randomElement(static::$types);
22
+ }
23
+
24
+ public static function companyName()
25
+ {
26
+ return static::randomElement(static::$names);
27
+ }
28
+ }
vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Person.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bn_BD;
4
+
5
+ class Person extends \Faker\Provider\Person
6
+ {
7
+ protected static $maleNameFormats = array(
8
+ '{{firstNameMale}} {{lastName}}',
9
+ '{{firstNameMale}} {{lastName}}',
10
+ '{{firstNameMale}} {{lastName}}',
11
+ '{{titleMale}} {{firstNameMale}} {{lastName}}',
12
+ );
13
+
14
+ protected static $femaleNameFormats = array(
15
+ '{{firstNameFemale}} {{lastName}}',
16
+ '{{firstNameFemale}} {{lastName}}',
17
+ '{{firstNameFemale}} {{lastName}}',
18
+ '{{titleFemale}} {{firstNameFemale}} {{lastName}}',
19
+ );
20
+
21
+ protected static $firstNameMale = array(
22
+ 'অনন্ত', 'আব্দুল্লাহ', 'আহসান', 'ইমরুল', 'করিম', 'জলিল', 'বরকত', 'মাসনুন', 'রহিম', 'রিফাত', 'হাসনাত', 'হাসান',
23
+ );
24
+
25
+ protected static $firstNameFemale = array(
26
+ 'জারিন', 'জেরিন', 'ফারহানা', 'ফাহমেদা', 'মাহজাবিন', 'মেহনাজ', 'রহিমা', 'লাবনী', 'সাবরিন', 'সাবরিনা', 'হাসিন', 'রহমত',
27
+ );
28
+
29
+ protected static $lastName = array(
30
+ 'খান', 'শেখ', 'শিকদার', 'আলী', 'তাসনীম', 'তাবাসসুম'
31
+ );
32
+
33
+ protected static $titleMale = array('মি.');
34
+
35
+ protected static $titleFemale = array('মিসেস.', 'মিস.');
36
+ }
vendor/fakerphp/faker/src/Faker/Provider/bn_BD/PhoneNumber.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bn_BD;
4
+
5
+ class PhoneNumber extends \Faker\Provider\PhoneNumber
6
+ {
7
+ public function phoneNumber()
8
+ {
9
+ $number = "+880";
10
+ $number .= static::randomNumber(7);
11
+
12
+ return Utils::getBanglaNumber($number);
13
+ }
14
+ }
vendor/fakerphp/faker/src/Faker/Provider/bn_BD/Utils.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\bn_BD;
4
+
5
+ class Utils
6
+ {
7
+ public static function getBanglaNumber($number)
8
+ {
9
+ $english = range(0, 10);
10
+ $bangla = array('০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯');
11
+
12
+ return str_replace($english, $bangla, $number);
13
+ }
14
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Address.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class Address extends \Faker\Provider\Address
6
+ {
7
+ protected static $streetAddressFormats = array(
8
+ '{{streetName}}',
9
+ '{{streetName}} {{buildingNumber}}',
10
+ '{{streetName}} {{buildingNumber}}',
11
+ '{{streetName}} {{buildingNumber}}',
12
+ '{{streetName}} {{buildingNumber}}',
13
+ );
14
+
15
+ protected static $addressFormats = array(
16
+ "{{streetAddress}}\n{{region}}\n{{postcode}} {{city}}",
17
+ "{{streetAddress}}\n{{postcode}} {{city}}",
18
+ "{{streetAddress}}\n{{postcode}} {{city}}",
19
+ "{{streetAddress}}\n{{postcode}} {{city}}",
20
+ "{{streetAddress}}\n{{postcode}} {{city}}",
21
+ "{{streetAddress}}\n{{postcode}} {{city}}",
22
+ "{{streetAddress}}\n{{postcode}} {{city}}\nČeská republika",
23
+ );
24
+
25
+ protected static $buildingNumber = array('%', '%%', '%/%%', '%%/%%', '%/%%%', '%%/%%%');
26
+
27
+ protected static $postcode = array('#####', '### ##');
28
+
29
+ /**
30
+ * Source: https://cs.wikipedia.org/wiki/Seznam_m%C4%9Bst_v_%C4%8Cesku_podle_po%C4%8Dtu_obyvatel
31
+ */
32
+ protected static $city = array(
33
+ 'Brno', 'Břeclav', 'Cheb', 'Chomutov', 'Chrudim', 'Černošice', 'Česká Lípa', 'České Budějovice',
34
+ 'Český Těšín', 'Děčín', 'Frýdek-Místek', 'Havlíčkův Brod', 'Havířov', 'Hodonín', 'Hradec Králové',
35
+ 'Jablonec nad Nisou', 'Jihlava', 'Karlovy Vary', 'Karviná', 'Kladno', 'Kolín', 'Krnov', 'Kroměříž',
36
+ 'Liberec', 'Litoměřice', 'Litvínov', 'Mladá Boleslav', 'Most', 'Nový Jičín', 'Olomouc', 'Opava', 'Orlová',
37
+ 'Ostrava', 'Pardubice', 'Plzeň', 'Praha', 'Prostějov', 'Písek', 'Přerov', 'Příbram', 'Sokolov', 'Šumperk',
38
+ 'Teplice', 'Trutnov', 'Tábor', 'Třebíč', 'Třinec', 'Uherské Hradiště', 'Ústí nad Labem',
39
+ 'Valašské Meziříčí', 'Vsetín', 'Zlín', 'Znojmo',
40
+ );
41
+
42
+ /**
43
+ * Source: https://cs.wikipedia.org/wiki/Seznam_st%C3%A1t%C5%AF_sv%C4%9Bta
44
+ */
45
+ protected static $country = array(
46
+ 'Afghánistán', 'Albánie', 'Alžírsko', 'Andorra', 'Angola', 'Antigua a Barbuda', 'Argentina',
47
+ 'Arménie', 'Austrálie', 'Ázerbájdžán', 'Bahamy', 'Bahrajn', 'Bangladéš', 'Barbados', 'Belgie',
48
+ 'Belize', 'Benin', 'Bělorusko', 'Bhútán', 'Bolívie', 'Bosna a Hercegovina', 'Botswana', 'Brazílie',
49
+ 'Brunej', 'Bulharsko', 'Burkina Faso', 'Burundi', 'Cookovy ostrovy', 'Čad', 'Černá Hora', 'Česká republika',
50
+ 'Čína', 'Dánsko', 'Demokratická republika Kongo', 'Dominika', 'Dominikánská republika', 'Džibutsko',
51
+ 'Egypt', 'Ekvádor', 'Eritrea', 'Estonsko', 'Etiopie', 'Fidži', 'Filipíny', 'Finsko', 'Francie', 'Gabon',
52
+ 'Gambie', 'Ghana', 'Grenada', 'Gruzie', 'Guatemala', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras',
53
+ 'Chile', 'Chorvatsko', 'Indie', 'Indonésie', 'Irák', 'Írán', 'Irsko', 'Island', 'Itálie', 'Izrael', 'Jamajka',
54
+ 'Japonsko', 'Jemen', 'Jihoafrická republika', 'Jižní Korea', 'Jižní Súdán', 'Jordánsko', 'Kambodža', 'Kamerun',
55
+ 'Kanada', 'Kapverdy', 'Katar', 'Kazachstán', 'Keňa', 'Kiribati', 'Kolumbie', 'Komory', 'Republika Kongo',
56
+ 'Kostarika', 'Kuba', 'Kuvajt', 'Kypr', 'Kyrgyzstán', 'Laos', 'Lesotho', 'Libanon', 'Libérie', 'Libye',
57
+ 'Lichtenštejnsko', 'Litva', 'Lotyšsko', 'Lucembursko', 'Madagaskar', 'Maďarsko', 'Makedonie', 'Malajsie',
58
+ 'Malawi', 'Maledivy', 'Mali', 'Malta', 'Maroko', 'Marshallovy ostrovy', 'Mauritánie', 'Mauricius', 'Mexiko',
59
+ 'Federativní státy Mikronésie', 'Moldavsko', 'Monako', 'Mongolsko', 'Mosambik', 'Myanmar', 'Namibie', 'Nauru',
60
+ 'Nepál', 'Německo', 'Niger', 'Nigérie', 'Nikaragua', 'Niue', 'Nizozemsko', 'Norsko', 'Nový Zéland', 'Omán',
61
+ 'Pákistán', 'Palau', 'Panama', 'Papua-Nová Guinea', 'Paraguay', 'Peru', 'Pobřeží slonoviny', 'Polsko',
62
+ 'Portugalsko', 'Rakousko', 'Rovníková Guinea', 'Rumunsko', 'Rusko', 'Rwanda', 'Řecko', 'Salvador', 'Samoa',
63
+ 'San Marino', 'Saúdská Arábie', 'Senegal', 'Severní Korea', 'Seychely', 'Sierra Leone', 'Singapur',
64
+ 'Slovensko', 'Slovinsko', 'Somálsko', 'Spojené arabské emiráty', 'Spojené království', 'Spojené státy americké',
65
+ 'Srbsko', 'Středoafrická republika', 'Surinam', 'Súdán', 'Svatá Lucie', 'Svatý Kryštof a Nevis',
66
+ 'Svatý Tomáš a Princův ostrov', 'Svatý Vincenc a Grenadiny', 'Svazijsko', 'Sýrie', 'Šalamounovy ostrovy',
67
+ 'Španělsko', 'Šrí Lanka', 'Švédsko', 'Švýcarsko', 'Tádžikistán', 'Tanzanie', 'Thajsko', 'Togo', 'Tonga',
68
+ 'Trinidad a Tobago', 'Tunisko', 'Turecko', 'Turkmenistán', 'Tuvalu', 'Uganda', 'Ukrajina', 'Uruguay',
69
+ 'Uzbekistán', 'Vanuatu', 'Vatikán', 'Venezuela', 'Vietnam', 'Východní Timor', 'Zambie', 'Zimbabwe',
70
+ );
71
+
72
+ /**
73
+ * Source: https://cs.wikipedia.org/wiki/Kraje_v_%C4%8Cesku#Ekonomika
74
+ */
75
+ private static $regions = array(
76
+ 'Hlavní město Praha', 'Jihomoravský kraj', 'Jihočeský kraj', 'Karlovarský kraj', 'Královéhradecký kraj',
77
+ 'Liberecký kraj', 'Moravskoslezský kraj', 'Olomoucký kraj', 'Pardubický kraj', 'Plzeňský kraj',
78
+ 'Středočeský kraj', 'Vysočina', 'Zlínský kraj', 'Ústecký kraj',
79
+ );
80
+
81
+ /**
82
+ * Source: http://aplikace.mvcr.cz/adresy/
83
+ */
84
+ protected static $street = array(
85
+ 'Alžírská', 'Angelovova', 'Antonínská', 'Arménská', 'Čelkovická', 'Červenkova', 'Československého exilu',
86
+ 'Chlumínská', 'Chládkova', 'Diskařská', 'Do Kopečka', 'Do Vozovny', 'Do Vršku', 'Doubravická', 'Doudova',
87
+ 'Drahotínská', 'Dělnická', 'Generála Šišky', 'Gončarenkova', 'Gutova', 'Havlínova', 'Havraní', 'Helmova',
88
+ 'Hečkova', 'Holubinková', 'Holínská', 'Horní Hrdlořezská', 'Horní Stromky', 'Hostivařské nám.', 'Houbařská',
89
+ 'Hořanská', 'Hrachovská', 'Hrad III. nádvoří', 'Hrdlořezská', 'Jenská', 'Jerevanská', 'Ježovická', 'K Březince',
90
+ 'K Dobré Vodě', 'K Hořavce', 'K Hrušovu', 'K Háji', 'K Návsi', 'K Padesátníku', 'K Pyramidce', 'K Samotě',
91
+ 'K Vinici', 'K Vystrkovu', 'Karlovarská', 'Karlínské nám.', 'Kaňkova', 'Ke Kyjovu', 'Ke Stadionu', 'Kejnická',
92
+ 'Klatovská', 'Kohoutových', 'Kopanská', 'Kralupská', 'Kukelská', 'Kukučínova', 'Kunešova', 'Kvestorská',
93
+ 'Křišťanova', 'Lanžhotská', 'Leštínská', 'Lindavská', 'Litevská', 'Lojovická', 'Lukešova', 'Maltézské náměstí',
94
+ 'Melodická', 'Mečíková', 'Milady Horákové', 'Mšenská', 'N. A. Někrasova', 'Na Dědince', 'Na Habrové',
95
+ 'Na Jezerce', 'Na Jílech', 'Na Petynce', 'Na Rozcestí', 'Na Sedlišti', 'Na Vrchu', 'Na Výšině', 'Na Úbočí',
96
+ 'Na Štamberku', 'Nad Hliníkem', 'Nad Hřištěm', 'Nad Klikovkou', 'Nad libeňským nádražím', 'Nad Nuslemi',
97
+ 'Nad Slávií', 'Nad Trnkovem', 'Nad Šauerovými sady', 'Netřebská', 'Nivnická', 'Nádražní', 'nám. Pod Lípou',
98
+ 'nám. Před bateriemi', 'nám. Svatopluka Čecha', 'Odlehlá', 'Okrasná', 'Omská', 'Otavova', 'Oválová',
99
+ 'Palackého nám.', 'Pavlišovská', 'Paškova', 'Petřínské sady', 'Pilovská', 'Pod Bruskou', 'Pod novou školou',
100
+ 'Pod soutratím', 'Pod Svahem', 'Pod Útesy', 'Pohledná', 'Pošepného nám.', 'Prokopových', 'Pávovské náměstí',
101
+ 'Pětipeského', 'Příbramská', 'Radbuzská', 'Radnické schody', 'Raichlova', 'Roentgenova', 'Rozkošného',
102
+ 'Rozrazilová', 'Ruzyňská', 'Římovská', 'Říční', 'Satalická', 'Schoellerova', 'Smrková', 'Souvratní', 'Sovova',
103
+ 'Sportovní', 'Stadionová', 'Statková', 'Stavební', 'Široká', 'Školní', 'Tatranská', 'Tomsova', 'Toruňská',
104
+ 'Točenská', 'Trnkovo náměstí', 'Truhlářova', 'Tvrdonická', 'Týmlova', 'U Beránky', 'U Chmelnice',
105
+ 'U Chodovského hřbitova', 'U Drážky', 'U Fořta', 'U Kamýku', 'U Klubovny', 'U Lesa', 'U Pekáren',
106
+ 'U Prašné brány', 'U Prádelny', 'U Silnice', 'U Sladovny', 'U Slovanky', 'U Soutoku', 'U Trojice', 'U Vinice',
107
+ 'U vinných sklepů', 'U Vodárny', 'U Vorlíků', 'U zeleného ptáka', 'U Čekárny', 'U Županských', 'Ukrajinská',
108
+ 'Újezdská', 'V Jámě', 'V Předním Hloubětíně', 'V Rohu', 'V Uličce', 'Valčíkova', 'Ve Lhotce', 'Ve Vrších',
109
+ 'Velenická', 'Violková', 'Vlašská', 'Voděradská', 'Vyderská', 'Vysokoškolská', 'Výpadová', 'Vřesovická',
110
+ 'Za Pekárnou', 'Zámecká',
111
+ );
112
+
113
+ /**
114
+ * Randomly returns a czech city.
115
+ *
116
+ * @example 'Krnov'
117
+ *
118
+ * @return string
119
+ */
120
+ public function city()
121
+ {
122
+ return static::randomElement(static::$city);
123
+ }
124
+
125
+ /**
126
+ * Randomly returns a czech region.
127
+ *
128
+ * @example 'Liberecký kraj'
129
+ *
130
+ * @return string
131
+ */
132
+ public static function region()
133
+ {
134
+ return static::randomElement(static::$regions);
135
+ }
136
+
137
+ /**
138
+ * Real street names as random data can hardly be
139
+ * generated due to inflection.
140
+ *
141
+ * @example 'U Vodárny'
142
+ *
143
+ * @return string
144
+ */
145
+ public function streetName()
146
+ {
147
+ return static::randomElement(static::$street);
148
+ }
149
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Company.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class Company extends \Faker\Provider\Company
6
+ {
7
+ /**
8
+ * @var array Czech company name formats.
9
+ */
10
+ protected static $formats = array(
11
+ '{{lastName}} {{companySuffix}}',
12
+ '{{lastName}} {{lastName}} {{companySuffix}}',
13
+ '{{lastName}}-{{lastName}} {{companySuffix}}',
14
+ '{{lastName}} a {{lastName}} {{companySuffix}}',
15
+ );
16
+
17
+ /**
18
+ * @var array Czech catch phrase formats.
19
+ */
20
+ protected static $catchPhraseFormats = array(
21
+ '{{catchPhraseVerb}} {{catchPhraseNoun}} {{catchPhraseAttribute}}',
22
+ '{{catchPhraseVerb}} {{catchPhraseNoun}} a {{catchPhraseNoun}} {{catchPhraseAttribute}}',
23
+ '{{catchPhraseVerb}} {{catchPhraseNoun}} {{catchPhraseAttribute}} a {{catchPhraseAttribute}}',
24
+ 'Ne{{catchPhraseVerb}} {{catchPhraseNoun}} {{catchPhraseAttribute}}',
25
+ );
26
+
27
+ /**
28
+ * @var array Czech nouns (used by the catch phrase format).
29
+ */
30
+ protected static $noun = array(
31
+ 'bezpečnost', 'pohodlí', 'seo', 'rychlost', 'testování', 'údržbu', 'odebírání', 'výstavbu',
32
+ 'návrh', 'prodej', 'nákup', 'zprostředkování', 'odvoz', 'přepravu', 'pronájem'
33
+ );
34
+
35
+ /**
36
+ * @var array Czech verbs (used by the catch phrase format).
37
+ */
38
+ protected static $verb = array(
39
+ 'zajišťujeme', 'nabízíme', 'děláme', 'provozujeme', 'realizujeme', 'předstihujeme', 'mobilizujeme',
40
+ );
41
+
42
+ /**
43
+ * @var array End of sentences (used by the catch phrase format).
44
+ */
45
+ protected static $attribute = array(
46
+ 'pro vás', 'pro vaší službu', 'a jsme jednička na trhu', 'pro lepší svět', 'zdarma', 'se zárukou',
47
+ 's inovací', 'turbíny', 'mrakodrapů', 'lampiónků a svíček', 'bourací techniky', 'nákupních košíků',
48
+ 'vašeho webu', 'pro vaše zákazníky', 'za nízkou cenu', 'jako jediní na trhu', 'webu', 'internetu',
49
+ 'vaší rodiny', 'vašich známých', 'vašich stránek', 'čehokoliv na světě', 'za hubičku'
50
+ );
51
+
52
+ /**
53
+ * @var array Company suffixes.
54
+ */
55
+ protected static $companySuffix = array('s.r.o.', 's.r.o.', 's.r.o.', 's.r.o.', 'a.s.', 'o.p.s.', 'o.s.');
56
+
57
+ /**
58
+ * Returns a random catch phrase noun.
59
+ *
60
+ * @return string
61
+ */
62
+ public function catchPhraseNoun()
63
+ {
64
+ return static::randomElement(static::$noun);
65
+ }
66
+
67
+ /**
68
+ * Returns a random catch phrase attribute.
69
+ *
70
+ * @return string
71
+ */
72
+ public function catchPhraseAttribute()
73
+ {
74
+ return static::randomElement(static::$attribute);
75
+ }
76
+
77
+ /**
78
+ * Returns a random catch phrase verb.
79
+ *
80
+ * @return string
81
+ */
82
+ public function catchPhraseVerb()
83
+ {
84
+ return static::randomElement(static::$verb);
85
+ }
86
+
87
+ /**
88
+ * @return string
89
+ */
90
+ public function catchPhrase()
91
+ {
92
+ $format = static::randomElement(static::$catchPhraseFormats);
93
+
94
+ return ucfirst($this->generator->parse($format));
95
+ }
96
+
97
+ /**
98
+ * Generates valid czech IČO
99
+ *
100
+ * @see http://phpfashion.com/jak-overit-platne-ic-a-rodne-cislo
101
+ * @return string
102
+ */
103
+ public function ico()
104
+ {
105
+ $ico = static::numerify('#######');
106
+ $split = str_split($ico);
107
+ $prod = 0;
108
+ foreach (array(8, 7, 6, 5, 4, 3, 2) as $i => $p) {
109
+ $prod += $p * $split[$i];
110
+ }
111
+ $mod = $prod % 11;
112
+ if ($mod === 0 || $mod === 10) {
113
+ return "{$ico}1";
114
+ } elseif ($mod === 1) {
115
+ return "{$ico}0";
116
+ }
117
+
118
+ return $ico . (11 - $mod);
119
+ }
120
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/DateTime.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ /**
6
+ * Czech months and days without setting locale
7
+ */
8
+ class DateTime extends \Faker\Provider\DateTime
9
+ {
10
+ protected static $days = array(
11
+ 'neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'
12
+ );
13
+ protected static $months = array(
14
+ 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec',
15
+ 'srpen', 'září', 'říjen', 'listopad', 'prosinec'
16
+ );
17
+ protected static $monthsGenitive = array(
18
+ 'ledna', 'února', 'března', 'dubna', 'května', 'června', 'července',
19
+ 'srpna', 'září', 'října', 'listopadu', 'prosince'
20
+ );
21
+ protected static $formattedDateFormat = array(
22
+ '{{dayOfMonth}}. {{monthNameGenitive}} {{year}}',
23
+ );
24
+
25
+ public static function monthName($max = 'now')
26
+ {
27
+ return static::$months[parent::month($max) - 1];
28
+ }
29
+
30
+ public static function monthNameGenitive($max = 'now')
31
+ {
32
+ return static::$monthsGenitive[parent::month($max) - 1];
33
+ }
34
+
35
+ public static function dayOfWeek($max = 'now')
36
+ {
37
+ return static::$days[static::dateTime($max)->format('w')];
38
+ }
39
+
40
+ /**
41
+ * @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
42
+ * @return string
43
+ * @example '2'
44
+ */
45
+ public static function dayOfMonth($max = 'now')
46
+ {
47
+ return static::dateTime($max)->format('j');
48
+ }
49
+
50
+ /**
51
+ * Full date with inflected month
52
+ * @return string
53
+ * @example '16. listopadu 2003'
54
+ */
55
+ public function formattedDate()
56
+ {
57
+ $format = static::randomElement(static::$formattedDateFormat);
58
+
59
+ return $this->generator->parse($format);
60
+ }
61
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Internet.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class Internet extends \Faker\Provider\Internet
6
+ {
7
+ protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'seznam.cz', 'atlas.cz', 'centrum.cz', 'email.cz', 'post.cz');
8
+ protected static $tld = array('cz', 'cz', 'cz', 'cz', 'cz', 'cz', 'com', 'info', 'net', 'org');
9
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Payment.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class Payment extends \Faker\Provider\Payment
6
+ {
7
+ /**
8
+ * International Bank Account Number (IBAN)
9
+ * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
10
+ * @param string $prefix for generating bank account number of a specific bank
11
+ * @param string $countryCode ISO 3166-1 alpha-2 country code
12
+ * @param integer $length total length without country code and 2 check digits
13
+ * @return string
14
+ */
15
+ public static function bankAccountNumber($prefix = '', $countryCode = 'CZ', $length = null)
16
+ {
17
+ return static::iban($countryCode, $prefix, $length);
18
+ }
19
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Person.php ADDED
@@ -0,0 +1,533 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class Person extends \Faker\Provider\Person
6
+ {
7
+ protected static $lastNameFormat = array(
8
+ '{{lastNameMale}}',
9
+ '{{lastNameFemale}}',
10
+ );
11
+
12
+ protected static $maleNameFormats = array(
13
+ '{{firstNameMale}} {{lastNameMale}}',
14
+ '{{firstNameMale}} {{lastNameMale}}',
15
+ '{{firstNameMale}} {{lastNameMale}}',
16
+ '{{firstNameMale}} {{lastNameMale}}',
17
+ '{{titleMale}} {{firstNameMale}} {{lastNameMale}}',
18
+ );
19
+
20
+ protected static $femaleNameFormats = array(
21
+ '{{firstNameFemale}} {{lastNameFemale}}',
22
+ '{{firstNameFemale}} {{lastNameFemale}}',
23
+ '{{firstNameFemale}} {{lastNameFemale}}',
24
+ '{{firstNameFemale}} {{lastNameFemale}}',
25
+ '{{titleFemale}} {{firstNameFemale}} {{lastNameFemale}}',
26
+ );
27
+
28
+ protected static $firstNameMale = array(
29
+ 'Adam', 'Aleš', 'Alois', 'Antonín', 'Bohumil', 'Bohuslav', 'Dagmar',
30
+ 'Dalibor', 'Daniel', 'David', 'Dominik', 'Dušan', 'Eduard', 'Emil',
31
+ 'Filip', 'František', 'Ilona', 'Ivan', 'Ivo', 'Jakub', 'Jan', 'Ján',
32
+ 'Jaromír', 'Jaroslav', 'Jindřich', 'Jiří', 'Josef', 'Jozef', 'Kamil',
33
+ 'Karel', 'Kryštof', 'Ladislav', 'Libor', 'Lubomír', 'Luboš', 'Luděk',
34
+ 'Ludvík', 'Lukáš', 'Marcel', 'Marek', 'Martin', 'Matěj', 'Matyáš',
35
+ 'Michael', 'Michal', 'Milan', 'Miloslav', 'Miloš', 'Miroslav',
36
+ 'Oldřich', 'Ondřej', 'Patrik', 'Pavel', 'Peter', 'Petr', 'Radek',
37
+ 'Radim', 'Radomír', 'René', 'Richard', 'Robert', 'Roman', 'Rostislav',
38
+ 'Rudolf', 'Stanislav', 'Šimon', 'Štefan', 'Štěpán', 'Tomáš',
39
+ 'Václav', 'Vasyl', 'Viktor', 'Vít', 'Vítězslav', 'Vladimír',
40
+ 'Vladislav', 'Vlastimil', 'Vojtěch', 'Zbyněk', 'Zdeněk'
41
+ );
42
+
43
+ protected static $firstNameFemale = array(
44
+ 'Adéla', 'Alena', 'Alžběta', 'Andrea', 'Aneta', 'Anežka', 'Anna',
45
+ 'Barbora', 'Blanka', 'Božena', 'Dana', 'Daniela', 'Denisa', 'Dominika',
46
+ 'Eliška', 'Emilie', 'Eva', 'Františka', 'Gabriela', 'Hana', 'Helena',
47
+ 'Irena', 'Iva', 'Ivana', 'Iveta', 'Jana', 'Jarmila', 'Jaroslava',
48
+ 'Jindřiška', 'Jiřina', 'Jitka', 'Kamila', 'Karolína', 'Kateřina',
49
+ 'Klára', 'Kristýna', 'Lenka', 'Libuše', 'Lucie', 'Ludmila', 'Marcela',
50
+ 'Mária', 'Marie', 'Markéta', 'Marta', 'Martina', 'Michaela', 'Milada',
51
+ 'Milena', 'Miloslava', 'Miluše', 'Miroslava', 'Monika', 'Naděžda',
52
+ 'Natálie', 'Nela', 'Nikola', 'Olga', 'Pavla', 'Pavlína', 'Petra',
53
+ 'Radka', 'Renata', 'Renáta', 'Romana', 'Růžena', 'Simona', 'Soňa',
54
+ 'Stanislava', 'Šárka', 'Štěpánka', 'Tereza', 'Vendula', 'Věra',
55
+ 'Veronika', 'Vladimíra', 'Vlasta', 'Zdenka', 'Zdeňka', 'Zdeňka',
56
+ 'Zuzana'
57
+ );
58
+
59
+ protected static $lastNameMale = array(
60
+ 'Adam', 'Adamec', 'Adámek', 'Albrecht', 'Ambrož', 'Anděl', 'Andrle',
61
+ 'Antoš', 'Bajer', 'Baláž', 'Balcar', 'Balog', 'Baloun', 'Barák',
62
+ 'Baran', 'Bareš', 'Bárta', 'Barták', 'Bartoň', 'Bartoš',
63
+ 'Bartošek', 'Bartůněk', 'Bašta', 'Bauer', 'Bayer', 'Bažant',
64
+ 'Bečka', 'Bečvář', 'Bednář', 'Bednařík', 'Bělohlávek',
65
+ 'Benda', 'Beneš', 'Beran', 'Beránek', 'Berger', 'Berka', 'Berky',
66
+ 'Bernard', 'Bezděk', 'Bílek', 'Bílý', 'Bína', 'Bittner',
67
+ 'Blaha', 'Bláha', 'Blažek', 'Blecha', 'Bobek', 'Boček', 'Boháč',
68
+ 'Boháček', 'Böhm', 'Borovička', 'Bouček', 'Bouda', 'Bouška',
69
+ 'Brabec', 'Brabenec', 'Brada', 'Bradáč', 'Braun', 'Brázda',
70
+ 'Brázdil', 'Brejcha', 'Brož', 'Brožek', 'Brychta', 'Březina',
71
+ 'Bříza', 'Bubeník', 'Buček', 'Buchta', 'Burda', 'Bureš', 'Burian',
72
+ 'Buriánek', 'Byrtus', 'Caha', 'Cibulka', 'Cihlář', 'Císař', 'Coufal',
73
+ 'Čada', 'Čáp', 'Čapek', 'Čech', 'Čejka', 'Čermák', 'Černík',
74
+ 'Černohorský', 'Černoch', 'Černý', 'Červeňák', 'Červenka',
75
+ 'Červený', 'Červinka', 'Čihák', 'Čížek', 'Čonka', 'Čurda',
76
+ 'Daněk', 'Daniel', 'Daniš', 'David', 'Dědek', 'Dittrich', 'Diviš',
77
+ 'Dlouhý', 'Dobeš', 'Dobiáš', 'Dobrovolný', 'Dočekal', 'Dočkal',
78
+ 'Dohnal', 'Dokoupil', 'Doleček', 'Dolejš', 'Dolejší', 'Doležal',
79
+ 'Doležel', 'Doskočil', 'Dostál', 'Doubek', 'Doubrava', 'Douša',
80
+ 'Drábek', 'Drozd', 'Dubský', 'Duda', 'Dudek', 'Dufek', 'Duchoň',
81
+ 'Dunka', 'Dušek', 'Dvorský', 'Dvořáček', 'Dvořák', 'Eliáš',
82
+ 'Erben', 'Fabián', 'Fanta', 'Farkaš', 'Fejfar', 'Fencl', 'Ferenc',
83
+ 'Fiala', 'Fiedler', 'Filip', 'Fischer', 'Fišer', 'Florián', 'Fojtík',
84
+ 'Foltýn', 'Formánek', 'Forman', 'Fořt', 'Fousek', 'Franc', 'Franěk',
85
+ 'Frank', 'Fridrich', 'Frydrych', 'Fučík', 'Fuchs', 'Fuksa', 'Gábor',
86
+ 'Gabriel', 'Gajdoš', 'Gregor', 'Gruber', 'Grundza', 'Grygar', 'Hájek',
87
+ 'Hajný', 'Hála', 'Hampl', 'Hanáček', 'Hána', 'Hanák', 'Hanousek',
88
+ 'Hanus', 'Hanuš', 'Hanzal', 'Hanzl', 'Hanzlík', 'Hartman', 'Hašek',
89
+ 'Havel', 'Havelka', 'Havlíček', 'Havlík', 'Havránek', 'Heczko',
90
+ 'Heger', 'Hejda', 'Hejduk', 'Hejl', 'Hejna', 'Hendrych', 'Herman',
91
+ 'Heřmánek', 'Heřman', 'Hladík', 'Hladký', 'Hlaváček', 'Hlaváč',
92
+ 'Hlavatý', 'Hlávka', 'Hloušek', 'Hoffmann', 'Hofman', 'Holan',
93
+ 'Holas', 'Holec', 'Holeček', 'Holík', 'Holoubek', 'Holub', 'Holý',
94
+ 'Homola', 'Homolka', 'Horáček', 'Hora', 'Horák', 'Horký', 'Horňák',
95
+ 'Horníček', 'Horník', 'Horský', 'Horváth', 'Horvát', 'Hořejší',
96
+ 'Hošek', 'Houdek', 'Houška', 'Hovorka', 'Hrabal', 'Hrabovský',
97
+ 'Hradecký', 'Hradil', 'Hrbáček', 'Hrbek', 'Hrdina', 'Hrdlička',
98
+ 'Hrdý', 'Hrnčíř', 'Hroch', 'Hromádka', 'Hron', 'Hrubeš', 'Hrubý',
99
+ 'Hruška', 'Hrůza', 'Hubáček', 'Hudec', 'Hudeček', 'Hůlka', 'Huml',
100
+ 'Husák', 'Hušek', 'Hýbl', 'Hynek', 'Chaloupka', 'Chalupa', 'Charvát',
101
+ 'Chládek', 'Chlup', 'Chmelař', 'Chmelík', 'Chovanec', 'Chromý',
102
+ 'Chudoba', 'Chvátal', 'Chvojka', 'Chytil', 'Jahoda', 'Jakeš',
103
+ 'Jakl', 'Jakoubek', 'Jakubec', 'Janáček', 'Janák', 'Janata',
104
+ 'Janča', 'Jančík', 'Janda', 'Janeček', 'Janečka', 'Janíček',
105
+ 'Janík', 'Janků', 'Janota', 'Janoušek', 'Janovský', 'Jansa',
106
+ 'Jánský', 'Jareš', 'Jaroš', 'Jašek', 'Javůrek', 'Jedlička',
107
+ 'Jech', 'Jelen', 'Jelínek', 'Jeníček', 'Jeřábek', 'Ježek', 'Jež',
108
+ 'Jílek', 'Jindra', 'Jíra', 'Jirák', 'Jiránek', 'Jirásek', 'Jirka',
109
+ 'Jirků', 'Jiroušek', 'Jirsa', 'Jiřík', 'John', 'Jonáš', 'Junek',
110
+ 'Jurčík', 'Jurečka', 'Juřica', 'Juřík', 'Kabát', 'Kačírek',
111
+ 'Kadeřábek', 'Kadlec', 'Kafka', 'Kaiser', 'Kaláb', 'Kala', 'Kalaš',
112
+ 'Kalina', 'Kalivoda', 'Kalousek', 'Kalous', 'Kameník', 'Kaňa',
113
+ 'Kaňka', 'Kantor', 'Kaplan', 'Karásek', 'Karas', 'Karban', 'Karel',
114
+ 'Karlík', 'Kasal', 'Kašík', 'Kašpárek', 'Kašpar', 'Kavka', 'Kazda',
115
+ 'Kindl', 'Klečka', 'Klein', 'Klement', 'Klíma', 'Kliment', 'Klimeš',
116
+ 'Klouček', 'Klouda', 'Knap', 'Knotek', 'Kocián', 'Kocman', 'Kocourek',
117
+ 'Kohoutek', 'Kohout', 'Koch', 'Koláček', 'Kolařík', 'Kolář',
118
+ 'Kolek', 'Kolman', 'Komárek', 'Komínek', 'Konečný', 'Koníček',
119
+ 'Kopal', 'Kopecký', 'Kopeček', 'Kopečný', 'Kopřiva', 'Korbel',
120
+ 'Kořínek', 'Kosík', 'Kosina', 'Kos', 'Kostka', 'Košťál', 'Kotas',
121
+ 'Kotek', 'Kotlár', 'Kotrba', 'Kouba', 'Koubek', 'Koudela', 'Koudelka',
122
+ 'Koukal', 'Kouřil', 'Koutný', 'Kováč', 'Kovařík', 'Kovářík',
123
+ 'Kovář', 'Kozák', 'Kozel', 'Krajíček', 'Králíček', 'Králík',
124
+ 'Král', 'Krátký', 'Kratochvíl', 'Kraus', 'Krčmář', 'Krejčík',
125
+ 'Krejčí', 'Krejčíř', 'Krištof', 'Kropáček', 'Kroupa', 'Krupa',
126
+ 'Krupička', 'Krupka', 'Křeček', 'Křenek', 'Křivánek', 'Křížek',
127
+ 'Kříž', 'Kuba', 'Kubálek', 'Kubánek', 'Kubát', 'Kubec', 'Kubelka',
128
+ 'Kubeš', 'Kubica', 'Kubíček', 'Kubík', 'Kubín', 'Kubiš', 'Kuča',
129
+ 'Kučera', 'Kudláček', 'Kudrna', 'Kuchař', 'Kuchta', 'Kukla',
130
+ 'Kulhánek', 'Kulhavý', 'Kunc', 'Kuneš', 'Kupec', 'Kupka', 'Kurka',
131
+ 'Kužel', 'Kvapil', 'Kvasnička', 'Kyncl', 'Kysela', 'Lacina', 'Lacko',
132
+ 'Lakatoš', 'Landa', 'Langer', 'Lang', 'Langr', 'Látal', 'Lavička',
133
+ 'Lebeda', 'Levý', 'Líbal', 'Linhart', 'Liška', 'Lorenc', 'Louda',
134
+ 'Ludvík', 'Lukáč', 'Lukášek', 'Lukáš', 'Lukeš', 'Macák', 'Macek',
135
+ 'Macura', 'Macháček', 'Machač', 'Macháč', 'Machala', 'Machálek',
136
+ 'Mácha', 'Mach', 'Majer', 'Maleček', 'Málek', 'Malík', 'Malina',
137
+ 'Malý', 'Maňák', 'Mareček', 'Marek', 'Mareš', 'Maršálek',
138
+ 'Maršík', 'Martinec', 'Martinek', 'Martínek', 'Mařík', 'Masopust',
139
+ 'Mašek', 'Matějíček', 'Matějka', 'Matoušek', 'Matouš', 'Matula',
140
+ 'Matuška', 'Matyáš', 'Matys', 'Maxa', 'Mayer', 'Mazánek', 'Medek',
141
+ 'Melichar', 'Mencl', 'Menšík', 'Merta', 'Mička', 'Michalec',
142
+ 'Michálek', 'Michalík', 'Michal', 'Michna', 'Mika', 'Míka', 'Mikeš',
143
+ 'Miko', 'Mikula', 'Mikulášek', 'Minařík', 'Minář', 'Mirga',
144
+ 'Mládek', 'Mlčoch', 'Mlejnek', 'Mojžíš', 'Mokrý', 'Molnár',
145
+ 'Moravec', 'Morávek', 'Motl', 'Motyčka', 'Moučka', 'Moudrý',
146
+ 'Mráček', 'Mrázek', 'Mráz', 'Mrkvička', 'Mucha', 'Müller',
147
+ 'Műller', 'Musil', 'Mužík', 'Myška', 'Nagy', 'Najman', 'Navrátil',
148
+ 'Nečas', 'Nedbal', 'Nedoma', 'Nedvěd', 'Nejedlý', 'Němec',
149
+ 'Němeček', 'Nesvadba', 'Nešpor', 'Neubauer', 'Neuman', 'Neumann',
150
+ 'Nguyen', 'Nguyen', 'Nosek', 'Nováček', 'Novák', 'Novosad', 'Novotný',
151
+ 'Nový', 'Odehnal', 'Oláh', 'Oliva', 'Ondráček', 'Ondra', 'Orság',
152
+ 'Otáhal', 'Paleček', 'Pánek', 'Papež', 'Pařízek', 'Pašek',
153
+ 'Pátek', 'Patočka', 'Paul', 'Pavelek', 'Pavelka', 'Pavel', 'Pavlas',
154
+ 'Pavlica', 'Pavlíček', 'Pavlík', 'Pavlů', 'Pazdera', 'Pecka',
155
+ 'Pecháček', 'Pecha', 'Pech', 'Pekárek', 'Pekař', 'Pelc', 'Pelikán',
156
+ 'Pernica', 'Peroutka', 'Peřina', 'Pešek', 'Peška', 'Pešta',
157
+ 'Peterka', 'Petrák', 'Petráš', 'Petr', 'Petrů', 'Petříček',
158
+ 'Petřík', 'Pham', 'Pícha', 'Pilař', 'Pilát', 'Píša', 'Pivoňka',
159
+ 'Plaček', 'Plachý', 'Plšek', 'Pluhař', 'Podzimek', 'Pohl', 'Pokorný',
160
+ 'Poláček', 'Polách', 'Polák', 'Polanský', 'Polášek', 'Polívka',
161
+ 'Popelka', 'Pospíchal', 'Pospíšil', 'Potůček', 'Pour', 'Prachař',
162
+ 'Prášek', 'Pražák', 'Prchal', 'Procházka', 'Prokeš', 'Prokop',
163
+ 'Prošek', 'Provazník', 'Průcha', 'Průša', 'Přibyl', 'Příhoda',
164
+ 'Přikryl', 'Pšenička', 'Ptáček', 'Rác', 'Rada', 'Rak', 'Rambousek',
165
+ 'Raška', 'Rataj', 'Remeš', 'Rezek', 'Richter', 'Richtr', 'Roubal',
166
+ 'Rous', 'Rozsypal', 'Rudolf', 'Růžek', 'Růžička', 'Ryba', 'Rybář',
167
+ 'Rýdl', 'Ryšavý', 'Řeháček', 'Řehák', 'Řehoř', 'Řezáč',
168
+ 'Řezníček', 'Říha', 'Sadílek', 'Samek', 'Sedláček', 'Sedlák',
169
+ 'Sedlář', 'Sehnal', 'Seidl', 'Seifert', 'Sekanina', 'Semerád',
170
+ 'Severa', 'Schejbal', 'Schmidt', 'Schneider', 'Schwarz', 'Sikora',
171
+ 'Sivák', 'Skácel', 'Skala', 'Skála', 'Skalický', 'Sklenář',
172
+ 'Skopal', 'Skořepa', 'Skřivánek', 'Slabý', 'Sládek', 'Sladký',
173
+ 'Sláma', 'Slanina', 'Slavíček', 'Slavík', 'Slezák', 'Slováček',
174
+ 'Slovák', 'Sluka', 'Smejkal', 'Smékal', 'Smetana', 'Smola', 'Smolík',
175
+ 'Smolka', 'Smrčka', 'Smrž', 'Smutný', 'Sobek', 'Sobotka', 'Sochor',
176
+ 'Sojka', 'Sokol', 'Sommer', 'Souček', 'Soukup', 'Sova', 'Spáčil',
177
+ 'Spurný', 'Srb', 'Staněk', 'Stárek', 'Starý', 'Stehlík', 'Steiner',
178
+ 'Stejskal', 'Stibor', 'Stoklasa', 'Straka', 'Stránský', 'Strejček',
179
+ 'Strnad', 'Strouhal', 'Studený', 'Studnička', 'Stuchlík',
180
+ 'Stupka', 'Suchánek', 'Suchomel', 'Suchý', 'Suk', 'Svačina',
181
+ 'Svatoň', 'Svatoš', 'Světlík', 'Sviták', 'Svoboda', 'Svozil',
182
+ 'Sýkora', 'Synek', 'Syrový', 'Šafařík', 'Šafář', 'Šafránek',
183
+ 'Šálek', 'Šanda', 'Šašek', 'Šebek', 'Šebela', 'Šebesta', 'Šeda',
184
+ 'Šedivý', 'Šenk', 'Šesták', 'Ševčík', 'Šilhavý', 'Šimáček',
185
+ 'Šimák', 'Šimánek', 'Šíma', 'Šimčík', 'Šimeček', 'Šimek',
186
+ 'Šimon', 'Šimůnek', 'Šindelář', 'Šindler', 'Šípek', 'Šíp',
187
+ 'Široký', 'Šír', 'Šiška', 'Škoda', 'Škrabal', 'Šlechta',
188
+ 'Šmejkal', 'Šmerda', 'Šmíd', 'Šnajdr', 'Šolc', 'Špaček',
189
+ 'Špička', 'Šplíchal', 'Šrámek', 'Šťastný', 'Štefan',
190
+ 'Štefek', 'Štefl', 'Štěpánek', 'Štěpán', 'Štěrba', 'Šubrt',
191
+ 'Šulc', 'Šustr', 'Šváb', 'Švanda', 'Švarc', 'Švec', 'Švehla',
192
+ 'Švejda', 'Švestka', 'Táborský', 'Tancoš', 'Teplý', 'Tesař',
193
+ 'Tichý', 'Tománek', 'Toman', 'Tomášek', 'Tomáš', 'Tomeček',
194
+ 'Tomek', 'Tomeš', 'Tóth', 'Tran', 'Trávníček', 'Trčka', 'Trnka',
195
+ 'Trojan', 'Truhlář', 'Tříska', 'Tuček', 'Tůma', 'Tureček', 'Turek',
196
+ 'Tvrdík', 'Tvrdý', 'Uher', 'Uhlíř', 'Ulrich', 'Urbanec', 'Urbánek',
197
+ 'Urban', 'Vacek', 'Václavek', 'Václavík', 'Vaculík', 'Vágner',
198
+ 'Vácha', 'Valášek', 'Vala', 'Válek', 'Valenta', 'Valeš', 'Váňa',
199
+ 'Vančura', 'Vaněček', 'Vaněk', 'Vaníček', 'Varga', 'Vašák',
200
+ 'Vašek', 'Vašíček', 'Vávra', 'Vavřík', 'Večeřa', 'Vejvoda',
201
+ 'Verner', 'Veselý', 'Veverka', 'Vícha', 'Vilímek', 'Vinš', 'Víšek',
202
+ 'Vitásek', 'Vítek', 'Vít', 'Vlach', 'Vlasák', 'Vlček', 'Vlk',
203
+ 'Vobořil', 'Vodák', 'Vodička', 'Vodrážka', 'Vojáček', 'Vojta',
204
+ 'Vojtěch', 'Vojtek', 'Vojtíšek', 'Vokoun', 'Volek', 'Volf', 'Volný',
205
+ 'Vondráček', 'Vondrák', 'Vondra', 'Voráček', 'Vorel', 'Vorlíček',
206
+ 'Voříšek', 'Votava', 'Votruba', 'Vrabec', 'Vrána', 'Vrba', 'Vrzal',
207
+ 'Vybíral', 'Vydra', 'Vymazal', 'Vyskočil', 'Vysloužil', 'Wagner',
208
+ 'Walter', 'Weber', 'Weiss', 'Winkler', 'Wolf', 'Zábranský', 'Zahrádka',
209
+ 'Zahradník', 'Zach', 'Zajíc', 'Zajíček', 'Zálešák', 'Zámečník',
210
+ 'Zapletal', 'Záruba', 'Zatloukal', 'Zavadil', 'Zavřel', 'Zbořil',
211
+ 'Zdražil', 'Zedník', 'Zelenka', 'Zelený', 'Zelinka', 'Zemánek',
212
+ 'Zeman', 'Zezula', 'Zíka', 'Zikmund', 'Zima', 'Zlámal', 'Zoubek',
213
+ 'Zouhar', 'Zvěřina', 'Žáček', 'Žák', 'Žďárský', 'Žemlička',
214
+ 'Žídek', 'Žižka', 'Žůrek'
215
+ );
216
+
217
+ protected static $lastNameFemale = array(
218
+ 'Adamová', 'Adamcová', 'Adámková', 'Albrechtová', 'Ambrožová',
219
+ 'Andělová', 'Andrlová', 'Antošová', 'Bajerová', 'Balážová',
220
+ 'Balcarová', 'Balogová', 'Balounová', 'Baráková', 'Baranová',
221
+ 'Barešová', 'Bártová', 'Bartáková', 'Bartoňová', 'Bartošová',
222
+ 'Bartošková', 'Bartůňková', 'Baštová', 'Bauerová', 'Bayerová',
223
+ 'Bažantová', 'Bečková', 'Bečvářová', 'Bednářová',
224
+ 'Bednaříková', 'Bělohlávková', 'Bendová', 'Benešová',
225
+ 'Beranová', 'Beránková', 'Bergerová', 'Berková', 'Berkyová',
226
+ 'Bernardová', 'Bezděková', 'Bílková', 'Bílová', 'Bínová',
227
+ 'Bittnerová', 'Blahová', 'Bláhová', 'Blažková', 'Blechová',
228
+ 'Bobková', 'Bočková', 'Boháčová', 'Boháčková', 'Böhmová',
229
+ 'Borovičková', 'Boučková', 'Boudová', 'Boušková', 'Brabcová',
230
+ 'Brabencová', 'Bradová', 'Bradáčová', 'Braunová', 'Brázdová',
231
+ 'Brázdilová', 'Brejchová', 'Brožová', 'Brožková', 'Brychtová',
232
+ 'Březinová', 'Břízová', 'Bubeníková', 'Bučková', 'Buchtová',
233
+ 'Burdová', 'Burešová', 'Burianová', 'Buriánková', 'Byrtusová',
234
+ 'Cahová', 'Cibulková', 'Cihlářová', 'Císařová', 'Coufalová',
235
+ 'Čadová', 'Čápová', 'Čapková', 'Čechová', 'Čejková',
236
+ 'Čermáková', 'Černíková', 'Černohorská', 'Černochová',
237
+ 'Černá', 'Červeňáková', 'Červenková', 'Červená', 'Červinková',
238
+ 'Čiháková', 'Čížková', 'Čonková', 'Čurdová', 'Daňková',
239
+ 'Danielová', 'Danišová', 'Davidová', 'Dědková', 'Dittrichová',
240
+ 'Divišová', 'Dlouhá', 'Dobešová', 'Dobiášová', 'Dobrovolná',
241
+ 'Dočekalová', 'Dočkalová', 'Dohnalová', 'Dokoupilová',
242
+ 'Dolečková', 'Dolejšová', 'Dolejší', 'Doležalová', 'Doleželová',
243
+ 'Doskočilová', 'Dostálová', 'Doubková', 'Doubravová', 'Doušová',
244
+ 'Drábková', 'Drozdová', 'Dubská', 'Dudová', 'Dudková', 'Dufková',
245
+ 'Duchoňová', 'Dunková', 'Dušková', 'Dvorská', 'Dvořáčková',
246
+ 'Dvořáková', 'Eliášová', 'Erbenová', 'Fabiánová', 'Fantová',
247
+ 'Farkašová', 'Fejfarová', 'Fenclová', 'Ferencová', 'Fialová',
248
+ 'Fiedlerová', 'Filipová', 'Fischerová', 'Fišerová', 'Floriánová',
249
+ 'Fojtíková', 'Foltýnová', 'Formánková', 'Formanová', 'Fořtová',
250
+ 'Fousková', 'Francová', 'Fraňková', 'Franková', 'Fridrichová',
251
+ 'Frydrychová', 'Fučíková', 'Fuchsová', 'Fuksová', 'Gáborová',
252
+ 'Gabrielová', 'Gajdošová', 'Gregorová', 'Gruberová', 'Grundzová',
253
+ 'Grygarová', 'Hájková', 'Hajná', 'Hálová', 'Hamplová',
254
+ 'Hanáčková', 'Hánová', 'Hanáková', 'Hanousková', 'Hanusová',
255
+ 'Hanušová', 'Hanzalová', 'Hanzlová', 'Hanzlíková', 'Hartmanová',
256
+ 'Hašková', 'Havelová', 'Havelková', 'Havlíčková', 'Havlíková',
257
+ 'Havránková', 'Heczková', 'Hegerová', 'Hejdová', 'Hejduková',
258
+ 'Hejlová', 'Hejnová', 'Hendrychová', 'Hermanová', 'Heřmánková',
259
+ 'Heřmanová', 'Hladíková', 'Hladká', 'Hlaváčková', 'Hlaváčová',
260
+ 'Hlavatá', 'Hlávková', 'Hloušková', 'Hoffmannová', 'Hofmanová',
261
+ 'Holanová', 'Holasová', 'Holcová', 'Holečková', 'Holíková',
262
+ 'Holoubková', 'Holubová', 'Holá', 'Homolová', 'Homolková',
263
+ 'Horáčková', 'Horová', 'Horáková', 'Horká', 'Horňáková',
264
+ 'Horníčková', 'Horníková', 'Horská', 'Horváthová', 'Horvátová',
265
+ 'Hořejšíová', 'Hošková', 'Houdková', 'Houšková', 'Hovorková',
266
+ 'Hrabalová', 'Hrabovská', 'Hradecká', 'Hradilová', 'Hrbáčková',
267
+ 'Hrbková', 'Hrdinová', 'Hrdličková', 'Hrdá', 'Hrnčířová',
268
+ 'Hrochová', 'Hromádková', 'Hronová', 'Hrubešová', 'Hrubá',
269
+ 'Hrušková', 'Hrůzová', 'Hubáčková', 'Hudcová', 'Hudečková',
270
+ 'Hůlková', 'Humlová', 'Husáková', 'Hušková', 'Hýblová',
271
+ 'Hynková', 'Chaloupková', 'Chalupová', 'Charvátová', 'Chládková',
272
+ 'Chlupová', 'Chmelařová', 'Chmelíková', 'Chovancová', 'Chromá',
273
+ 'Chudobová', 'Chvátalová', 'Chvojková', 'Chytilová', 'Jahodová',
274
+ 'Jakešová', 'Jaklová', 'Jakoubková', 'Jakubcová', 'Janáčková',
275
+ 'Janáková', 'Janatová', 'Jančová', 'Jančíková', 'Jandová',
276
+ 'Janečková', 'Janečková', 'Janíčková', 'Janíková', 'Janková',
277
+ 'Janotová', 'Janoušková', 'Janovská', 'Jansová', 'Jánská',
278
+ 'Jarešová', 'Jarošová', 'Jašková', 'Javůrková', 'Jedličková',
279
+ 'Jechová', 'Jelenová', 'Jelínková', 'Jeníčková', 'Jeřábková',
280
+ 'Ježková', 'Ježová', 'Jílková', 'Jindrová', 'Jírová',
281
+ 'Jiráková', 'Jiránková', 'Jirásková', 'Jirková', 'Jirková',
282
+ 'Jiroušková', 'Jirsová', 'Jiříková', 'Johnová', 'Jonášová',
283
+ 'Junková', 'Jurčíková', 'Jurečková', 'Juřicová', 'Juříková',
284
+ 'Kabátová', 'Kačírková', 'Kadeřábková', 'Kadlcová', 'Kafková',
285
+ 'Kaiserová', 'Kalábová', 'Kalová', 'Kalašová', 'Kalinová',
286
+ 'Kalivodová', 'Kalousková', 'Kalousová', 'Kameníková', 'Kaňová',
287
+ 'Kaňková', 'Kantorová', 'Kaplanová', 'Karásková', 'Karasová',
288
+ 'Karbanová', 'Karelová', 'Karlíková', 'Kasalová', 'Kašíková',
289
+ 'Kašpárková', 'Kašparová', 'Kavková', 'Kazdová', 'Kindlová',
290
+ 'Klečková', 'Kleinová', 'Klementová', 'Klímová', 'Klimentová',
291
+ 'Klimešová', 'Kloučková', 'Kloudová', 'Knapová', 'Knotková',
292
+ 'Kociánová', 'Kocmanová', 'Kocourková', 'Kohoutková', 'Kohoutová',
293
+ 'Kochová', 'Koláčková', 'Kolaříková', 'Kolářová', 'Kolková',
294
+ 'Kolmanová', 'Komárková', 'Komínková', 'Konečná', 'Koníčková',
295
+ 'Kopalová', 'Kopecká', 'Kopečková', 'Kopečná', 'Kopřivová',
296
+ 'Korbelová', 'Kořínková', 'Kosíková', 'Kosinová', 'Kosová',
297
+ 'Kostková', 'Košťálová', 'Kotasová', 'Kotková', 'Kotlárová',
298
+ 'Kotrbová', 'Koubová', 'Koubková', 'Koudelová', 'Koudelková',
299
+ 'Koukalová', 'Kouřilová', 'Koutná', 'Kováčová', 'Kovaříková',
300
+ 'Kováříková', 'Kovářová', 'Kozáková', 'Kozelová',
301
+ 'Krajíčková', 'Králíčková', 'Králíková', 'Králová',
302
+ 'Krátká', 'Kratochvílová', 'Krausová', 'Krčmářová',
303
+ 'Krejčíková', 'Krejčová', 'Krejčířová', 'Krištofová',
304
+ 'Kropáčková', 'Kroupová', 'Krupová', 'Krupičková', 'Krupková',
305
+ 'Křečková', 'Křenková', 'Křivánková', 'Křížková',
306
+ 'Křížová', 'Kubová', 'Kubálková', 'Kubánková', 'Kubátová',
307
+ 'Kubcová', 'Kubelková', 'Kubešová', 'Kubicová', 'Kubíčková',
308
+ 'Kubíková', 'Kubínová', 'Kubišová', 'Kučová', 'Kučerová',
309
+ 'Kudláčková', 'Kudrnová', 'Kuchařová', 'Kuchtová', 'Kuklová',
310
+ 'Kulhánková', 'Kulhavá', 'Kuncová', 'Kunešová', 'Kupcová',
311
+ 'Kupková', 'Kurková', 'Kuželová', 'Kvapilová', 'Kvasničková',
312
+ 'Kynclová', 'Kyselová', 'Lacinová', 'Lacková', 'Lakatošová',
313
+ 'Landová', 'Langerová', 'Langová', 'Langrová', 'Látalová',
314
+ 'Lavičková', 'Lebedová', 'Levá', 'Líbalová', 'Linhartová',
315
+ 'Lišková', 'Lorencová', 'Loudová', 'Ludvíková', 'Lukáčová',
316
+ 'Lukášková', 'Lukášová', 'Lukešová', 'Macáková', 'Macková',
317
+ 'Macurová', 'Macháčková', 'Machačová', 'Macháčová', 'Machalová',
318
+ 'Machálková', 'Máchová', 'Machová', 'Majerová', 'Malečková',
319
+ 'Málková', 'Malíková', 'Malinová', 'Malá', 'Maňáková',
320
+ 'Marečková', 'Marková', 'Marešová', 'Maršálková',
321
+ 'Maršíková', 'Martincová', 'Martinková', 'Martínková',
322
+ 'Maříková', 'Masopustová', 'Mašková', 'Matějíčková',
323
+ 'Matějková', 'Matoušková', 'Matoušová', 'Matulová', 'Matušková',
324
+ 'Matyášová', 'Matysová', 'Maxová', 'Mayerová', 'Mazánková',
325
+ 'Medková', 'Melicharová', 'Menclová', 'Menšíková', 'Mertová',
326
+ 'Mičková', 'Michalcová', 'Michálková', 'Michalíková',
327
+ 'Michalová', 'Michnová', 'Miková', 'Míková', 'Mikešová',
328
+ 'Miková', 'Mikulová', 'Mikulášková', 'Minaříková', 'Minářová',
329
+ 'Mirgová', 'Mládková', 'Mlčochová', 'Mlejnková', 'Mojžíšová',
330
+ 'Mokrá', 'Molnárová', 'Moravcová', 'Morávková', 'Motlová',
331
+ 'Motyčková', 'Moučková', 'Moudrá', 'Mráčková', 'Mrázková',
332
+ 'Mrázová', 'Mrkvičková', 'Muchová', 'Müllerová', 'Műllerová',
333
+ 'Musilová', 'Mužíková', 'Myšková', 'Nagyová', 'Najmanová',
334
+ 'Navrátilová', 'Nečasová', 'Nedbalová', 'Nedomová', 'Nedvědová',
335
+ 'Nejedlá', 'Němcová', 'Němečková', 'Nesvadbová', 'Nešporová',
336
+ 'Neubauerová', 'Neumanová', 'Neumannová', 'Nguyenová', 'Vanová',
337
+ 'Nosková', 'Nováčková', 'Nováková', 'Novosadová', 'Novotná',
338
+ 'Nová', 'Odehnalová', 'Oláhová', 'Olivová', 'Ondráčková',
339
+ 'Ondrová', 'Orságová', 'Otáhalová', 'Palečková', 'Pánková',
340
+ 'Papežová', 'Pařízková', 'Pašková', 'Pátková', 'Patočková',
341
+ 'Paulová', 'Pavelková', 'Pavelková', 'Pavelová', 'Pavlasová',
342
+ 'Pavlicová', 'Pavlíčková', 'Pavlíková', 'Pavlová', 'Pazderová',
343
+ 'Pecková', 'Pecháčková', 'Pechová', 'Pechová', 'Pekárková',
344
+ 'Pekařová', 'Pelcová', 'Pelikánová', 'Pernicová', 'Peroutková',
345
+ 'Peřinová', 'Pešková', 'Pešková', 'Peštová', 'Peterková',
346
+ 'Petráková', 'Petrášová', 'Petrová', 'Petrová', 'Petříčková',
347
+ 'Petříková', 'Phamová', 'Píchová', 'Pilařová', 'Pilátová',
348
+ 'Píšová', 'Pivoňková', 'Plačková', 'Plachá', 'Plšková',
349
+ 'Pluhařová', 'Podzimková', 'Pohlová', 'Pokorná', 'Poláčková',
350
+ 'Poláchová', 'Poláková', 'Polanská', 'Polášková', 'Polívková',
351
+ 'Popelková', 'Pospíchalová', 'Pospíšilová', 'Potůčková',
352
+ 'Pourová', 'Prachařová', 'Prášková', 'Pražáková',
353
+ 'Prchalová', 'Procházková', 'Prokešová', 'Prokopová',
354
+ 'Prošková', 'Provazníková', 'Průchová', 'Průšová',
355
+ 'Přibylová', 'Příhodová', 'Přikrylová', 'Pšeničková',
356
+ 'Ptáčková', 'Rácová', 'Radová', 'Raková', 'Rambousková',
357
+ 'Rašková', 'Ratajová', 'Remešová', 'Rezková', 'Richterová',
358
+ 'Richtrová', 'Roubalová', 'Rousová', 'Rozsypalová', 'Rudolfová',
359
+ 'Růžková', 'Růžičková', 'Rybová', 'Rybářová', 'Rýdlová',
360
+ 'Ryšavá', 'Řeháčková', 'Řeháková', 'Řehořová', 'Řezáčová',
361
+ 'Řezníčková', 'Říhová', 'Sadílková', 'Samková', 'Sedláčková',
362
+ 'Sedláková', 'Sedlářová', 'Sehnalová', 'Seidlová', 'Seifertová',
363
+ 'Sekaninová', 'Semerádová', 'Severová', 'Schejbalová', 'Schmidtová',
364
+ 'Schneiderová', 'Schwarzová', 'Sikorová', 'Siváková', 'Skácelová',
365
+ 'Skalová', 'Skálová', 'Skalická', 'Sklenářová', 'Skopalová',
366
+ 'Skořepová', 'Skřivánková', 'Slabá', 'Sládková', 'Sladká',
367
+ 'Slámová', 'Slaninová', 'Slavíčková', 'Slavíková', 'Slezáková',
368
+ 'Slováčková', 'Slováková', 'Sluková', 'Smejkalová', 'Smékalová',
369
+ 'Smetanová', 'Smolová', 'Smolíková', 'Smolková', 'Smrčková',
370
+ 'Smržová', 'Smutná', 'Sobková', 'Sobotková', 'Sochorová',
371
+ 'Sojková', 'Sokolová', 'Sommerová', 'Součková', 'Soukupová',
372
+ 'Sovová', 'Spáčilová', 'Spurná', 'Srbová', 'Staňková',
373
+ 'Stárková', 'Stará', 'Stehlíková', 'Steinerová', 'Stejskalová',
374
+ 'Stiborová', 'Stoklasová', 'Straková', 'Stránská', 'Strejčková',
375
+ 'Strnadová', 'Strouhalová', 'Studená', 'Studničková',
376
+ 'Stuchlíková', 'Stupková', 'Suchánková', 'Suchomelová', 'Suchá',
377
+ 'Suková', 'Svačinová', 'Svatoňová', 'Svatošová', 'Světlíková',
378
+ 'Svitáková', 'Svobodová', 'Svozilová', 'Sýkorová', 'Synková',
379
+ 'Syrová', 'Šafaříková', 'Šafářová', 'Šafránková',
380
+ 'Šálková', 'Šandová', 'Šašková', 'Šebková', 'Šebelová',
381
+ 'Šebestová', 'Šedová', 'Šedivá', 'Šenková', 'Šestáková',
382
+ 'Ševčíková', 'Šilhavá', 'Šimáčková', 'Šimáková',
383
+ 'Šimánková', 'Šímová', 'Šimčíková', 'Šimečková', 'Šimková',
384
+ 'Šimonová', 'Šimůnková', 'Šindelářová', 'Šindlerová',
385
+ 'Šípková', 'Šípová', 'Široká', 'Šírová', 'Šišková',
386
+ 'Škodová', 'Škrabalová', 'Šlechtová', 'Šmejkalová', 'Šmerdová',
387
+ 'Šmídová', 'Šnajdrová', 'Šolcová', 'Špačková', 'Špičková',
388
+ 'Šplíchalová', 'Šrámková', 'Šťastná', 'Štefanová',
389
+ 'Štefková', 'Šteflová', 'Štěpánková', 'Štěpánová',
390
+ 'Štěrbová', 'Šubrtová', 'Šulcová', 'Šustrová', 'Švábová',
391
+ 'Švandová', 'Švarcová', 'Švecová', 'Švehlová', 'Švejdová',
392
+ 'Švestková', 'Táborská', 'Tancošová', 'Teplá', 'Tesařová',
393
+ 'Tichá', 'Tománková', 'Tomanová', 'Tomášková', 'Tomášová',
394
+ 'Tomečková', 'Tomková', 'Tomešová', 'Tóthová', 'Tranová',
395
+ 'Trávníčková', 'Trčková', 'Trnková', 'Trojanová', 'Truhlářová',
396
+ 'Třísková', 'Tučková', 'Tůmová', 'Turečková', 'Turková',
397
+ 'Tvrdíková', 'Tvrdá', 'Uherová', 'Uhlířová', 'Ulrichová',
398
+ 'Urbancová', 'Urbánková', 'Urbanová', 'Vacková', 'Václavková',
399
+ 'Václavíková', 'Vaculíková', 'Vágnerová', 'Váchová',
400
+ 'Valášková', 'Valová', 'Válková', 'Valentová', 'Valešová',
401
+ 'Váňová', 'Vančurová', 'Vaněčková', 'Vaňková', 'Vaníčková',
402
+ 'Vargová', 'Vašáková', 'Vašková', 'Vašíčková', 'Vávrová',
403
+ 'Vavříková', 'Večeřová', 'Vejvodová', 'Vernerová', 'Veselá',
404
+ 'Veverková', 'Víchová', 'Vilímková', 'Vinšová', 'Víšková',
405
+ 'Vitásková', 'Vítková', 'Vítová', 'Vlachová', 'Vlasáková',
406
+ 'Vlčková', 'Vlková', 'Vobořilová', 'Vodáková', 'Vodičková',
407
+ 'Vodrážková', 'Vojáčková', 'Vojtová', 'Vojtěchová',
408
+ 'Vojtková', 'Vojtíšková', 'Vokounová', 'Volková', 'Volfová',
409
+ 'Volná', 'Vondráčková', 'Vondráková', 'Vondrová', 'Voráčková',
410
+ 'Vorlová', 'Vorlíčková', 'Voříšková', 'Votavová', 'Votrubová',
411
+ 'Vrabcová', 'Vránová', 'Vrbová', 'Vrzalová', 'Vybíralová',
412
+ 'Vydrová', 'Vymazalová', 'Vyskočilová', 'Vysloužilová',
413
+ 'Wagnerová', 'Walterová', 'Weberová', 'Weissová', 'Winklerová',
414
+ 'Wolfová', 'Zábranská', 'Zahrádková', 'Zahradníková', 'Zachová',
415
+ 'Zajícová', 'Zajíčková', 'Zálešáková', 'Zámečníková',
416
+ 'Zapletalová', 'Zárubová', 'Zatloukalová', 'Zavadilová',
417
+ 'Zavřelová', 'Zbořilová', 'Zdražilová', 'Zedníková', 'Zelenková',
418
+ 'Zelená', 'Zelinková', 'Zemánková', 'Zemanová', 'Zezulová',
419
+ 'Zíková', 'Zikmundová', 'Zimová', 'Zlámalová', 'Zoubková',
420
+ 'Zouharová', 'Zvěřinová', 'Žáčková', 'Žáková', 'Žďárská',
421
+ 'Žemličková', 'Žídková', 'Žižková', 'Žůrková'
422
+ );
423
+
424
+ protected static $title = array(
425
+ 'Bc.', 'Ing.', 'MUDr.', 'MVDr.', 'Mgr.', 'JUDr.', 'PhDr.', 'RNDr.', 'doc.', 'Dr.'
426
+ );
427
+
428
+ /**
429
+ * @return czech birth number
430
+ * @param string|null $gender 'male', 'female' or null for any
431
+ * @param int $minAge minimal age of "generated person" in years
432
+ * @param int $maxAge maximal age of "generated person" in years
433
+ */
434
+
435
+ public function birthNumber($gender = null, $minAge = 0, $maxAge = 100, $slashProbability = 50)
436
+ {
437
+ if ($gender === null) {
438
+ $gender = $this->generator->boolean() ? static::GENDER_MALE : static::GENDER_FEMALE;
439
+ }
440
+
441
+ $startTimestamp = strtotime("-${maxAge} year");
442
+ $endTimestamp = strtotime("-${minAge} year");
443
+ $randTimestamp = static::numberBetween($startTimestamp, $endTimestamp);
444
+
445
+ $year = intval(date('Y', $randTimestamp));
446
+ $month = intval(date('n', $randTimestamp));
447
+ $day = intval(date('j', $randTimestamp));
448
+ $suffix = static::numberBetween(0, 999);
449
+
450
+ // women has +50 to month
451
+ if ($gender == static::GENDER_FEMALE) {
452
+ $month += 50;
453
+ }
454
+ // from year 2004 everyone has +20 to month when birth numbers in one day are exhausted
455
+ if ($year >= 2004 && $this->generator->boolean(10)) {
456
+ $month += 20;
457
+ }
458
+
459
+ $birthNumber = sprintf('%02d%02d%02d%03d', $year % 100, $month, $day, $suffix);
460
+
461
+ // from year 1954 birth number includes CRC
462
+ if ($year >= 1954) {
463
+ $crc = intval($birthNumber, 10) % 11;
464
+ if ($crc == 10) {
465
+ $crc = 0;
466
+ }
467
+ $birthNumber .= sprintf('%d', $crc);
468
+ }
469
+
470
+ // add slash
471
+ if ($this->generator->boolean($slashProbability)) {
472
+ $birthNumber = substr($birthNumber, 0, 6) . '/' . substr($birthNumber, 6);
473
+ }
474
+
475
+ return $birthNumber;
476
+ }
477
+
478
+ public static function birthNumberMale()
479
+ {
480
+ return static::birthNumber(static::GENDER_MALE);
481
+ }
482
+
483
+ public static function birthNumberFemale()
484
+ {
485
+ return static::birthNumber(static::GENDER_FEMALE);
486
+ }
487
+
488
+ public function title($gender = null)
489
+ {
490
+ return static::titleMale();
491
+ }
492
+
493
+ /**
494
+ * replaced by specific unisex Czech title
495
+ */
496
+ public static function titleMale()
497
+ {
498
+ return static::randomElement(static::$title);
499
+ }
500
+
501
+ /**
502
+ * replaced by specific unisex Czech title
503
+ */
504
+ public static function titleFemale()
505
+ {
506
+ return static::titleMale();
507
+ }
508
+
509
+ /**
510
+ * @param string|null $gender 'male', 'female' or null for any
511
+ * @example 'Albrecht'
512
+ */
513
+ public function lastName($gender = null)
514
+ {
515
+ if ($gender === static::GENDER_MALE) {
516
+ return static::lastNameMale();
517
+ } elseif ($gender === static::GENDER_FEMALE) {
518
+ return static::lastNameFemale();
519
+ }
520
+
521
+ return $this->generator->parse(static::randomElement(static::$lastNameFormat));
522
+ }
523
+
524
+ public static function lastNameMale()
525
+ {
526
+ return static::randomElement(static::$lastNameMale);
527
+ }
528
+
529
+ public static function lastNameFemale()
530
+ {
531
+ return static::randomElement(static::$lastNameFemale);
532
+ }
533
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class PhoneNumber extends \Faker\Provider\PhoneNumber
6
+ {
7
+ protected static $formats = array(
8
+ '+420 %## ### ###',
9
+ '%## ### ###',
10
+ '00420%########',
11
+ '+420%########',
12
+ '%########',
13
+ );
14
+ }
vendor/fakerphp/faker/src/Faker/Provider/cs_CZ/Text.php ADDED
@@ -0,0 +1,7185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Faker\Provider\cs_CZ;
4
+
5
+ class Text extends \Faker\Provider\Text
6
+ {
7
+ public function realText($maxNbChars = 200, $indexSize = 2)
8
+ {
9
+ $text = parent::realText($maxNbChars, $indexSize);
10
+ $text = str_replace('„', '', $text);
11
+
12
+ return str_replace('“', '', $text);
13
+ }
14
+
15
+ /**
16
+ * License: PD old 70
17
+ *
18
+ * Title: Krakatit
19
+ * Author: Karel Čapek
20
+ * Release Date: 25. 12. 1923 – 15. 4. 1924
21
+ * Language: Czech
22
+ *
23
+ * @see https://cs.wikisource.org/wiki/Krakatit
24
+ * @var string
25
+ *
26
+ * Karel Čapek
27
+ * KRAKATIT
28
+ * Znění tohoto textu vychází z díla Krakatit tak, jak bylo vydáno v Československém spisovateli v roce 1982
29
+ * (ČAPEK, Karel. Továrna na absolutno ; Krakatit. 12. vyd. Továrny na absolutno, 16. vyd. Krakatitu. Praha :
30
+ * Československý spisovatel, 1982. 476 s. Spisy, sv. 3.).
31
+ * Další díla Karla Čapka naleznete online na www stránkách Městské knihovny v Praze: www.mlp.cz/karelcapek.
32
+ * Elektronické publikování díla Karla Čapka je společným projektem Městské knihovny v Praze,
33
+ * Společnosti bratří Čapků, Památníku Karla Čapka a Českého národního korpusu.
34
+ */
35
+ protected static $baseText = <<<'EOT'
36
+ I.
37
+ S večerem zhoustla mlha sychravého dne. Je ti, jako by ses protlačoval řídkou
38
+ vlhkou hmotou, jež se za tebou neodvratně zavírá. Chtěl bys být doma. Doma, u
39
+ své lampy, v krabici čtyř stěn. Nikdy ses necítil tak opuštěn.
40
+ Prokop si razí cestu po nábřeží. Mrazí ho a čelo má zvlhlé potem slabosti;
41
+ chtěl by si sednout tady na té mokré lavičce, ale bojí se strážníků. Zdá se
42
+ mu, že se motá; ano, u Staroměstských mlýnů se mu někdo vyhnul obloukem jako
43
+ opilému. Nyní tedy vynakládá veškeru sílu, aby šel rovně. Teď, teď jde proti
44
+ němu člověk, má klobouk do očí a vyhrnutý límec. Prokop zatíná zuby, vraští
45
+ čelo, napíná všechny svaly, aby bezvadně přešel. Ale zrovna na krok před
46
+ chodcem se mu udělá v hlavě tma a celý svět se s ním pojednou zatočí; náhle
47
+ vidí zblízka, zblizoučka pár pronikavých očí, jak se do něho vpíchly, naráží
48
+ na něčí rameno, vypraví ze sebe cosi jako „promiňte“ a vzdaluje se s
49
+ křečovitou důstojností. Po několika krocích se zastaví a ohlédne; ten člověk
50
+ stojí a dívá se upřeně za ním. Prokop se sebere a odchází trochu rychleji; ale
51
+ nedá mu to, musí se znovu ohlédnout; a vida, ten člověk ještě pořád stojí a
52
+ dívá se za ním, dokonce samou pozorností vysunul z límce hlavu jako želva. „Ať
53
+ kouká,“ myslí si Prokop znepokojen, „teď už se ani neohlédnu.“ A jde, jak
54
+ nejlépe umí; náhle slyší za sebou kroky. Člověk s vyhrnutým límcem jde za ním.
55
+ Zdá se, že běží. A Prokop se v nesnesitelné hrůze dal na útěk.
56
+ Svět se s ním opět zatočil. Těžce oddychuje, jektaje zuby opřel se o strom a
57
+ zavřel oči. Bylo mu strašně špatně, bál se, že padne, že mu praskne srdce a
58
+ krev vyšplíchne ústy. Když otevřel oči, viděl těsně před sebou člověka s
59
+ vyhrnutým límcem.
60
+ „Nejste vy inženýr Prokop?“ ptal se člověk, patrně už poněkolikáté.
61
+ „Já… já tam nebyl,“ pokoušel se Prokop cosi zalhávat.
62
+ „Kde?“ ptal se muž.
63
+ „Tam,“ řekl Prokop a ukazoval hlavou kamsi k Strahovu. „Co na mně chcete?“
64
+ „Copak mne neznáš? Já jsem Tomeš. Tomeš z techniky, nevíš už?“
65
+ „Tomeš,“ opakoval Prokop, a bylo mu k smrti jedno, jaké to je jméno. „Ano,
66
+ Tomeš, to se rozumí. A co – co mi chcete?“
67
+ Muž s vyhrnutým límcem uchopil Prokopa pod paží. „Počkej, teď si sedneš,
68
+ rozumíš?“
69
+ „Ano,“ řekl Prokop a nechal se dovést k lavičce. „Já totiž… mně není dobře,
70
+ víte?“ Náhle vyprostil z kapsy ruku zavázanou jakýmsi špinavým cárem.
71
+ „Poraněn, víte? Zatracená věc.“
72
+ „A hlava tě nebolí?“ řekl člověk.
73
+ „Bolí.“
74
+ „Tak poslouchej, Prokope,“ řekl člověk. „Teď máš horečku nebo co. Musíš do
75
+ špitálu, víš? Je ti zle, to je vidět. Ale aspoň se hleď upamatovat, že se
76
+ známe. Já jsem Tomeš. Chodili jsme spolu do chemie. Člověče, rozpomeň se!“
77
+ „Já vím, Tomeš,“ ozval se Prokop chabě. „Ten holomek. Co s ním je?“
78
+ „Nic,“ řekl Tomeš. „Mluví s tebou. Musíš do postele, rozumíš? Kde bydlíš?“
79
+ „Tam,“ namáhal se mluvit Prokop a ukazoval někam hlavou. „U… u Hybšmonky.“
80
+ Náhle se pokoušel vstát. „Já tam nechci! Nechoďte tam! Tam je – tam je –“
81
+ „Co?“
82
+ „Krakatit,“ zašeptal Prokop.
83
+ „Co je to?“
84
+ „Nic. Neřeknu. Tam nikdo nesmí. Nebo – nebo –“
85
+ „Co?“
86
+ „Ffft, bum!“ udělal Prokop a hodil rukou do výše.
87
+ „Co je to?“
88
+ „Krakatoe. Kra-ka-tau. Sopka. Vul-vulkán, víte? Mně to… natrhlo palec. Já
89
+ nevím, co…“ Prokop se zarazil a pomalu dodal: „To ti je strašná věc, člověče.“
90
+ Tomeš se pozorně díval, jako by něco očekával. „Tak tedy,“ začal po chvilce,
91
+ „ty ještě pořád děláš do třaskavin?“
92
+ „Pořád.“
93
+ „S úspěchem?“
94
+ Prokop vydal ze sebe cosi na způsob smíchu. „Chtěl bys vědět, že? Holenku, to
95
+ není jen tak. Není – není jen tak,“ opakoval klátě opile hlavou. „Člověče, ono
96
+ to samo od sebe samo od sebe –“
97
+ „Co?“
98
+ „Kra-ka-tit. Krakatit. Krrrakatit. A ono to samo od sebe – Já nechal jen
99
+ prášek na stole, víš? Ostatní jsem smetl dododo-do takové piksly. Zu-zůstal
100
+ jen poprašek na stole, – a najednou –“
101
+ „– to vybuchlo.“
102
+ „Vybuchlo. Jen takový nálet, jen prášek, co jsem utrousil. Ani to vidět
103
+ nebylo. Tuhle – žárovka – kilometr dál. Ta to nebyla. A já – v lenošce, jako
104
+ kus dřeva. Víš, unaven. Příliš práce. A najednou… prásk! Já letěl na zem. Okna
105
+ to vyrazilo a – žárovka pryč. Detonace jako – jako když bouchne lydditová
106
+ patrona. Stra-strašná brizance. Já – já nejdřív myslel, že praskla ta por-
107
+ porcená – ponce – por-ce-lánová, polcelánová, porcenálová, poncelár, jak se to
108
+ honem, to bílé, víte, izolátor, jak se to jmenuje? Kře-mi-čitan hlinitý.“
109
+ „Porcelán.“
110
+ „Piksla. Já myslel, že praskla ta piksla, se vším všudy. Tak rozškrtnu sirku,
111
+ a ona tam je celá, ona je celá, ona je celá. A já – jako sloup – až mně sirka
112
+ spálila prsty. A pryč – přes pole – potmě – na Břevnov nebo do Střešovic – Aa
113
+ někde mě napadlo to slovo. Krakatoe. Krakatit. Kra-ka-tit. Nene, tak to
114
+ nenenebylo. Jak to bouchlo, letím na zem a křičím Krakatit. Krakatit. Pak jsem
115
+ na to zapomněl. Kdo je tu? Kdo – kdo jste?“
116
+ „Kolega Tomeš.“
117
+ „Tomeš, aha. Ten všivák! Přednášky si vypůjčoval. Nevrátil mně jeden sešit
118
+ chemie. Tomeš, jak se jmenoval?“
119
+ „Jiří.“
120
+ „Já už vím, Jirka. Ty jsi Jirka, já vím. Jirka Tomeš. Kde máš ten sešit?
121
+ Počkej, já ti něco řeknu. Až vyletí to ostatní, je zle. Člověče, to rozmlátí
122
+ celou Prahu. Smete. Odfoukne, ft! Až vyletí ta por-ce-lánová dóze, víš?“
123
+ „Jaká dóze?“
124
+ „Ty jsi Jirka Tomeš, já vím. Jdi do Karlína. Do Karlína nebo do Vysočan, a
125
+ dívej se, až to vyletí. Běž, běž honem!“
126
+ „Proč?“
127
+ „Já toho nadělal cent. Cent Krakatitu. Ne, asi – asi patnáct deka. Tam nahoře,
128
+ v té por-ce-lánové dózi. Člověče, až ta vyletí – Ale počkej, to není možné, to
129
+ je nesmysl,“ mumlal Prokop chytaje se za hlavu.
130
+ „Nu?“
131
+ „Proč – proč – proč to nevybuchlo také v té dózi? Když ten prášek – sám od
132
+ sebe – Počkej, na stole je zin-zinkový plech – plech – Od čeho to na stole
133
+ vybuchlo? Poč-kej, buď tiše, buď tiše,“ drtil Prokop a vrávoravě se zvedl.
134
+ „Co je ti?“
135
+ „Krakatit,“ zabručel Prokop, udělal celým tělem jakýsi otáčivý pohyb a svalil
136
+ se na zem v mrákotách.
137
+
138
+
139
+ II.
140
+
141
+ První, co si Prokop uvědomil, bylo, že se s ním všechno otřásá v drnčivém
142
+ rachotu a že ho někdo pevně drží kolem pasu. Hrozně se bál otevřít oči;
143
+ myslel, že se to na něj řítí. Ale když to neustávalo, otevřel oči a viděl před
144
+ sebou matný čtyřúhelník, kterým se sunou mlhavé světelné koule a pruhy. Neuměl
145
+ si to vysvětlit; díval se zmateně na uplývající a poskakující mátohy, trpně
146
+ odevzdán ve vše, co se s ním bude dít. Pak pochopil, že ten horlivý rachot
147
+ jsou kola vozu a venku že míjejí jenom svítilny v mlze; a unaven tolikerým
148
+ pozorováním zavřel opět oči a nechal se unášet.
149
+ „Teď si lehneš,“ řekl tiše hlas nad jeho hlavou; „spolkneš aspirin a bude ti
150
+ líp. Ráno ti přivedu doktora, ano?“
151
+ „Kdo je to,“ ptal se Prokop ospale.
152
+ „Tomeš. Lehneš si u mne, Prokope. Máš horečku. Kde tě co bolí?“
153
+ „Všude. Hlava se mi točí. Tak, víš –“
154
+ „Jen tiše lež. Uvařím ti čaj a vyspíš se. Máš to z rozčilení, víš. To je
155
+ taková nervová horečka. Do rána to přejde.“
156
+ Prokop svraštil čelo v námaze vzpomínání. „Já vím,“ řekl po chvíli
157
+ starostlivě. „Poslyš, ale někdo by měl tu pikslu hodit do vody. Aby
158
+ nevybuchla.“
159
+ „Bez starosti. Teď nemluv.“
160
+ „A… já bych snad mohl sedět. Nejsem ti těžký?“
161
+ „Ne, jen lež.“
162
+ „– – A ty máš ten můj sešit chemie,“ vzpomněl si Prokop najednou.
163
+ „Ano, dostaneš jej. Ale teď klid, slyšíš?“
164
+ „Já ti mám tak těžkou hlavu –“
165
+ Zatím drkotala drožka nahoru Ječnou ulicí. Tomeš slabounce hvízdal nějakou
166
+ melodii a díval se oknem. Prokop sípavě dýchal s tichým sténáním. Mlha smáčela
167
+ chodníky a vnikala až pod kabát svým sychravým slizem; bylo pusto a pozdě.
168
+ „Už tam budeme,“ řekl Tomeš nahlas. Drožka se čerstvěji rozhrčela na náměstí a
169
+ zahnula vpravo. „Počkej, Prokope, můžeš udělat pár kroků? Já ti pomohu.“
170
+ S námahou vlekl Tomeš svého hosta do druhého patra, Prokop si připadal jaksi
171
+ lehký a bez váhy, a nechal se skoro vynést po schodech nahoru; ale Tomeš silně
172
+ oddechoval a utíral si pot.
173
+ „Viď, jsem jako nitě,“ divil se Prokop.
174
+ „Nu ovšem,“ mručel udýchaný Tomeš odemykaje svůj byt.
175
+ Prokopovi bylo jako malému dítěti, když jej Tomeš svlékal. „Má maminka,“ začal
176
+ něco povídat, „když má maminka, to už je, to už je dávno, tatínek seděl u
177
+ stolu, a maminka mne nosila do postele, rozumíš?“
178
+ Pak už byl v posteli, přikryt po bradu, jektal zuby a díval se, jak se Tomeš
179
+ točí u kamen a rychle zatápí. Bylo mu do pláče dojetím, lítostí a slabostí, a
180
+ pořád brebentil; uklidnil se, až dostal na čelo studený obkladek. Tu se tiše
181
+ díval po pokoji; bylo tu cítit tabák a ženu.
182
+ „Ty jsi kujón, Tomši,“ ozval se vážně. „Pořád máš holky.“
183
+ Tomeš se k němu obrátil. „Nu, a co?“
184
+ „Nic. Co vlastně děláš?“
185
+ Tomeš mávl rukou. „Mizerně, kamaráde. Peníze nejsou.“
186
+ „Flámuješ.“
187
+ Tomeš jen potřásl hlavou.
188
+ „A je tě škoda, víš?“ začal Prokop starostlivě. „Ty bys mohl – Koukej, já
189
+ dělám už dvanáct let.“
190
+ „A co z toho máš?“ namítl Tomeš příkře.
191
+ „No, sem tam něco. Prodal jsem letos třaskavý dextrin.“
192
+ „Zač?“
193
+ „Za deset tisíc. Víš, nic to není, hloupost. Taková pitomá bouchačka, pro
194
+ doly. Ale kdybych chtěl –“
195
+ „Je ti už líp?“
196
+ „Krásně mi je. Já jsem ti našel metody! Člověče, jeden nitrát ceru, to ti je
197
+ vášnivá potvora; a chlor, chlor, tetrastupeň chlordusíku se zapálí světlem.
198
+ Rozsvítíš žárovku, a prásk! Ale to nic není. Koukej,“ prohlásil náhle
199
+ vystrkuje zpod pokrývky hubenou, děsně zkomolenou ruku. „Když něco vezmu do
200
+ ruky, tak… v tom cítím šumět atomy. Zrovna to mravenčí. Každá hmota mravenčí
201
+ jinak, rozumíš?“
202
+ „Ne.“
203
+ „To je síla, víš? Síla v hmotě. Hmota je strašně silná. Já… já hmatám, jak se
204
+ to v ní hemží. Drží to dohromady… s hroznou námahou. Jak to uvnitř rozvikláš,
205
+ rozpadne se, bum! Všechno je exploze. Když se rozevře květina, je to exploze.
206
+ Každá myšlenka, to je takové prasknutí v mozku. Když mně podáš ruku, cítím,
207
+ jak v tobě něco exploduje. Já mám takový hmat, člověče. A sluch. Všechno šumí,
208
+ jako šumivý prášek. To jsou samé malinkaté výbuchy. Mně ti tak hučí v hlavě…
209
+ Ratatata, jako strojní puška.“
210
+ „Tak,“ řekl Tomeš, „a teď spolkni tuhleten aspirin.“
211
+ „Ano. Třa-třaskavý aspirin. Perchlorovaný acetylsalicylazid. To nic není.
212
+ Člověče, já jsem našel exotermické třaskaviny. Každá látka je vlastně
213
+ třaskavina. Voda… voda je třaskavina. Hlína… a vzduch jsou třaskaviny. Peří,
214
+ peří v peřině je taky třaskavina. Víš, zatím to má jen teoretický význam. A já
215
+ jsem našel atomové výbuchy. Já – já – já jsem udělal alfaexploze. Roz-pad-ne
216
+ se to na plus plus částice. Žádná termochemie. De-struk-ce. Destruktivní
217
+ chemie, člověče. To ti je ohromná věc, Tomši, čistě vědecky. Já ti mám doma
218
+ tabulky… Lidi, kdybych já měl aparáty! Ale já mám jen oči… a ruce… Počkej, až
219
+ to napíšu!“
220
+ „Nechce se ti spát?“
221
+ „Chce. Jsem – dnes – unaven. A co tys pořád dělal?“
222
+ „Nu, nic. Život.“
223
+ „Život je třaskavina, víš? Prásk, člověk se narodí a rozpadne se, bum! A nám
224
+ se zdá, že to trvá bůhvíkolik let, viď? Počkej, já jsem teď něco spletl, že?“
225
+ „Docela v pořádku, Prokope. Možná že zítra udělám bum. Nebudu-li mít totiž
226
+ peníze. Ale to je jedno, starouši, jen spi.“
227
+ „Já bych ti půjčil, nechceš?“
228
+ „Nech. Na to bys nestačil. Snad ještě můj tatík –“ Tomeš mávl rukou.
229
+ „Tak vidíš, ty máš ještě tatínka,“ ozval se Prokop po chvíli s náhlou
230
+ měkkostí.
231
+ „Nu ano. Doktor v Týnici.“ Tomeš vstal a přecházel po pokoji. „Je to mizérie,
232
+ člověče, mizérie. Mám to nahnuté, nu! A nestarej se o mne. Já už – něco
233
+ udělám. Spi!“
234
+ Prokop se utišil. Polozavřenýma očima viděl, jak Tomeš sedá ke stolku a hrabe
235
+ se v nějakých papírech. Bylo mu jaksi sladko naslouchat šustění papíru a
236
+ tichému hukotu ohně v kamnech. Člověk skloněný u stolku opřel hlavu o dlaně a
237
+ snad ani nedýchal; a Prokopovi bylo, že leží doma a vidí svého staršího
238
+ bratra, svého bratra Josefa; učí se z knížek elektrotechnice a bude zítra
239
+ dělat zkoušku; a Prokop usnul horečným spánkem.
240
+
241
+
242
+ III.
243
+
244
+ Zdálo se mu, že slyší hukot jakoby nesčetných kol. „To je nějaká továrna,“
245
+ myslel si a běžel po schodech nahoru. Zničehonic se ocitl před velikými
246
+ dveřmi, kde stálo na skleněné tabulce: Plinius. Zaradoval se nesmírně a vešel
247
+ dovnitř. „Je tu pan Plinius?“ ptal se nějaké slečinky u psacího stroje. „Hned
248
+ přijde,“ řekla slečinka, a tu k němu přistoupil vysoký oholený muž v cutawayi
249
+ a s ohromnými kruhovými skly na očích. „Co si přejete?“ řekl.
250
+ Prokop se zvědavě díval do jeho neobyčejně výrazné tváře. Mělo to britskou
251
+ hubu a vypouklé rozježděné čelo, na skráni bradavici zvící šestáku a bradu
252
+ jako filmový herec. „Vy – vy – račte být – Plinius?“
253
+ „Prosím,“ řekl vysoký muž a krátkým gestem mu ukázal do své pracovny.
254
+ „Jsem velmi… je mi… ohromnou ctí,“ koktal Prokop usedaje.
255
+ „Co si přejete?“ přerušil ho vysoký muž.
256
+ „Já jsem rozbil hmotu,“ prohlásil Prokop. Plinius nic; hrál si jen s ocelovým
257
+ klíčkem a zavíral těžká víčka pod skly.
258
+ „To je totiž tak,“ začal Prokop překotně. „V-v-všecko se rozpadá, že? Hmota je
259
+ křehká. Ale já udělám, že se to rozpadne najednou, bum! Výbuch, rozumíte? Na
260
+ padrť. Na molekuly. Na atomy. Ale já jsem rozbil také atomy.“
261
+ „Škoda,“ řekl Plinius povážlivě.
262
+ „Proč – jaká škoda?“
263
+ „Škoda něco rozbít. I atomu je škoda. Nu tak dál.“
264
+ „Já… rozbiju atom. Já vím, že už Rutherford… Ale to byla jen taková páračka se
265
+ zářením, víte? To nic není. To se musí en masse. Jestli chcete, já vám
266
+ rozbourám tunu bismutu; rozštípne to ce-celý svět, ale to je jedno. Chcete?“
267
+ „Proč byste to dělal?“
268
+ „Je to… vědecky zajímavé,“ zmátl se Prokop. „Počkejte, jakpak bych vám to… To
269
+ je – to je vám ne-smír-ně zajímavé.“ Chytil se za hlavu. „Počkejte, mně
270
+ praskne hla-va; to bude – vědecky – ohromně zajímavé, že? Aha, aha,“ vyhrkl s
271
+ úlevou, „já vám to vyložím. Dynamit – dynamit trhá hmotu na kusy, na balvany,
272
+ ale benzoltrioxozonid ji roztrhá na prášek; udělá jen malou díru, ale
273
+ rrrozdrtí hmotu nana-na submikroskopickou padrť, rozumíte? To dělá detonační
274
+ rychlost. Hmota nemá čas ustoupit; nemůže se už ani roz-rozhrnout, roztrhnout,
275
+ víte? A já… jjjá jsem stupňoval detonační rychlost. Argonozonid.
276
+ Chlorargonoxozonid. Tetrargon. A pořád dál. Pak už ani vzduch nemůže ustoupit;
277
+ je stejně tuhý jako… jako ocelová deska. Roztrhá se na molekuly. A pořád dál.
278
+ A najednou vám… od jisté rychlosti… začne brizance děsně stoupat. Roste…
279
+ kvadraticky. Já koukám jako blázen. Odkud se to bere? Kde kde kde se najednou
280
+ vzala ta energie?“ naléhal Prokop zimničně. „Tak řekněte.“
281
+ „Nu, třeba v atomu,“ mínil Plinius.
282
+ „Aha,“ prohlásil Prokop vítězně a utřel si pot. „Tady je ten vtip. Jednoduše v
283
+ atomu. Ono to… vrazí atomy do sebe… a… sss… serve betaplášť… a jádro se musí
284
+ rozpadnout. To je alfaexploze. Víte, kdo jsem? Já jsem první člověk, který
285
+ překročil koeficient stlačitelnosti, pane. Já jsem našel atomové výbuchy. Já…
286
+ já jsem vyrazil z bismutu tantal. Poslyšte, víte vy, kolik je vy-výkonu v
287
+ jednom gramu rtuti? Čtyři sta dvaašedesát miliónů kilogramometrů. Hmota je
288
+ děsně silná. Hmota je regiment, který přešlapuje na místě: ráz dva, ráz dva;
289
+ ale dejte ten pravý povel, a regiment vyrazí v útok, en evant! To je výbuch,
290
+ rozumíte? Hurá!“
291
+ Prokop se zarazil vlastním křikem; v hlavě mu bušilo tak, že přestal cokoli
292
+ vnímat. „Promiňte,“ řekl, aby zamluvil rozpaky, a hledal třesoucí se rukou své
293
+ pouzdro na cigára. „Kouříte?“
294
+ „Ne.“
295
+ „Již staří Římané kouřili,“ ujišťoval Prokop a otevřel pouzdro; byly tam samé
296
+ těžké patrony. „Zapalte si,“ nutil, „to je lehoučký Nobel Extra.“ Sám ukousl
297
+ špičku tetrylové patrony a hledal sirky. „To nic není,“ začal, „ale znáte
298
+ třaskavé sklo? Škoda. Poslyšte, já vám mohu udělat výbušný papír. Napíšete
299
+ psaní, někdo to hodí do ohně a prásk! celý barák se sesype. Chcete?“
300
+ „K čemu?“ ptal se Plinius zvedaje obočí.
301
+ „Jen tak. Síla musí ven. Já vám něco povím. Kdybyste chodil po stropě, tak co
302
+ vám z toho vznikne? Já především kašlu na valenční teorie. Všecko se dá dělat.
303
+ Slyšíte, jak to venku rachotí? To slyšíte růst trávu: samé výbuchy. Každé
304
+ semínko je třaskavá kapsle, která vyletí. Puf, jako raketa. A ti hlupáci si
305
+ myslí, že není žádná tautomerie. Já jim ukážu takovou merotropii, že budou z
306
+ toho blázni. Samá laboratorní zkušenost, pane.“
307
+ Prokop cítil s hrůzou, že žvaní nesmysly; chtěl tomu uniknout a mlel tím
308
+ rychleji, pleta páté přes deváté. Plinius vážně kýval hlavou; dokonce komihal
309
+ celým tělem hlouběji a pořád hlouběji, jako by se klaněl. Prokop drmolil
310
+ zmatené formule a nemohl se zastavit, poule oči na Plinia, který se komihal s
311
+ rostoucí rychlostí jako stroj. Podlaha pod ním se začala houpat a zvedat.
312
+ „Ale tak přestaňte, člověče,“ zařval Prokop zděšen a probudil se. Místo Plinia
313
+ viděl Tomše, který neobraceje se od stolku bručel: „Nekřič, prosím tě.“
314
+ „Já nekřičím,“ řekl Prokop a zavřel oči. V hlavě mu hučelo rychlými a
315
+ bolestnými tepy.
316
+ Zdálo se mu, že letí přinejmenším rychlostí světla; nějak se mu svíralo srdce,
317
+ ale to dělá jen Fitzgerald-Lorentzovo zploštění, řekl si; musím být placatý
318
+ jako lívanec. A najednou se proti němu vyježí nesmírné skleněné hranoly; ne,
319
+ jsou to jenom nekonečné hladce vybroušené roviny, jež se protínají a
320
+ prostupují v břitkých úhlech jako krystalografické modely; a proti jedné
321
+ takové hraně je hnán úžasnou rychlostí. „Pozor,“ zařval sám na sebe, neboť v
322
+ tisícině vteřiny se musí roztříštit; ale tu již bleskově odletěl zpět a rovnou
323
+ proti hrotu obrovského jehlanu; odrazil se jako paprsek a byl vržen na
324
+ skleněně hladkou stěnu, smeká se podle ní, sviští do ostrého úhlu, kmitá
325
+ šíleně mezi jeho stěnami, je hozen pozpátku nevěda proti čemu, zas odmrštěn
326
+ dopadá bradou na ostrou hranu, ale v poslední chvíli ho to odhodí vzhůru; nyní
327
+ si roztřískne hlavu o euklidovskou rovinu nekonečna, ale již se řítí střemhlav
328
+ dolů, dolů do tmy; prudký náraz, bolestné cuknutí v celém těle, ale hned zas
329
+ se zvedl a dal se na útěk. Uhání labyrintickou chodbou a za sebou slyší dupot
330
+ pronásledovatelů; chodba se úží, svírá se, její stěny se přirážejí k sobě
331
+ děsným a neodvratným pohybem; i dělá se tenký jako šídlo, zatajuje dech a
332
+ upaluje v bláznivé hrůze, aby tudy proběhl, než ho ty stěny rozdrtí. Zavřelo
333
+ se to za ním s kamenným nárazem, zatímco sám svistí do propasti podle ledově
334
+ čišící zdi. Strašný úder, a ztrácí vědomí; když procitl, vidí, že je v černé
335
+ tmě; hmatá po slizkých kamenných stěnách a křičí o pomoc, ale z jeho úst
336
+ nevychází zvuku; taková je tu tma. Jektaje hrůzou klopýtá po dně propasti;
337
+ nahmatá postranní chodbu, i vrhá se do ní; jsou to vlastně. schody, a nahoře,
338
+ nekonečně daleko svítá malinký otvor jako v šachtě; běží tedy nahoru po
339
+ nesčíslných a strašně příkrých stupních; ale nahoře není než plošinka,
340
+ lehoučká plechová platforma drnčící a chvějící se nad závratnou hlubinou, a
341
+ dolů se šroubem točí jen nekonečné schůdky ze železných plátů. A tu již za
342
+ sebou slyšel supění pronásledovatelů. Bez sebe hrůzou se řítil a točil po
343
+ schůdkách dolů, a za ním železně řinčí a rachotí dupající zástup nepřátel. A
344
+ najednou vinuté schody se končí ostře v prázdnu. Prokop zavyl, rozpřáhl ruce a
345
+ pořád ještě víře padal do bezdna. Hlava se mu zatočila, neviděl už a neslyšel;
346
+ váznoucíma nohama běžel nevěda kam, drcen strašným a slepým puzením, že musí
347
+ kamsi dorazit, než bude pozdě. Rychleji a rychleji ubíhal nekonečným
348
+ koridorem; čas od času míjel semafor, na kterém pokaždé vyskočila vyšší
349
+ číslice: 17, 18, 19. Najednou pochopil, že běhá v kruhu a ta čísla že udávají
350
+ počet jeho oběhů. 40, 41. Popadla ho nesnesitelná hrůza, že přijde pozdě a že
351
+ se odtud nedostane; svištěl zběsilou rychlostí, takže se semafor jenom mihal
352
+ jako telegrafní tyče z rychlíku; a ještě rychleji! nyní už semafor ani
353
+ neubíhá, nýbrž stojí na jednom místě a odpočítává bleskovou rychlostí tisíce a
354
+ desettisíce oběhů, a nikde není východ z té chodby, a chodba je na pohled
355
+ rovná a lesklá jako hamburský tunel, a přece se vrací kruhem; Prokop vzlyká
356
+ děsem: to je Einsteinův vesmír, a já musím dojít, než bude pozdě! Náhle zazněl
357
+ strašný výkřik, a Prokop ustrnul: je to hlas tatínkův, někdo ho vraždí; i jal
358
+ se obíhat ještě rychleji, semafor zmizel, udělala se tma; Prokop tápal po
359
+ stěnách a nahmatal zamčené dveře, a za nimi je slyšet to zoufalé bědování a
360
+ rány pokáceného nábytku. Řva hrůzou zarývá Prokop nehty do dveří, štípe je a
361
+ rozškrabává; vytrhal je po třískách a našel za nimi staré známé schody, jež ho
362
+ denně vedly domů, když byl maličký; a nahoře dusí se tatínek, někdo ho škrtí a
363
+ smýká jím po zemi. Křiče vyletí Prokop nahoru, je doma na chodbě, vidí konve a
364
+ chlebovou skříň maminčinu a pootevřené dveře do kuchyně, a tam uvnitř chroptí
365
+ a prosí tatínek, aby ho nezabíjeli; někdo mu tluče hlavou o zem; chce mu jít
366
+ na pomoc, ale nějaká slepá, bláznivá moc ho nutí, aby tady na chodbě běhal
367
+ dokola, pořád rychleji dokolečka a chechtal se jíkavě, zatímco uvnitř skomírá
368
+ a dusí se tatínkovo sténání. A neschopen vykročit ze závratného bludného
369
+ kruhu, řítě se stále rychleji ryčel Prokop šíleným smíchem hrůzy.
370
+ Tu se probudil zalit potem a jektaje zuby. Tomeš mu stál u hlav a dával mu na
371
+ rozžhavené čelo nový chladivý obklad.
372
+ „To je dobře, to je dobře,“ mumlal Prokop, „já už nebudu spát.“ I ležel tiše a
373
+ díval se na Tomše, jak sedí u lampy. Jirka Tomeš, říkal si, a počkejme, pak
374
+ kolega Duras, a Honza Buchta, Sudík, Sudík, Sudík, a kdo ještě? Sudík, Trlica,
375
+ Trlica, Pešek, Jovanovič, Mádr, Holoubek, co nosil brejle, to je náš ročník na
376
+ chemii. Bože, a který je tamhleten? Aha, to je Vedral, ten padl v roce
377
+ šestnáct, a za ním sedí Holoubek, Pacovský, Trlica, Šeba, celý ročník. A tu
378
+ slyšel najednou: „Pan Prokop bude kolokvovat.“
379
+ Lekl se nesmírně. U katedry sedí profesor Wald a tahá se suchou ručičkou za
380
+ vousy, jako vždy. „Povězte,“ praví profesor Wald, „co víte o třaskavinách.“
381
+ „Třaskaviny třaskaviny,“ začíná Prokop nervózně, „jejich výbušnost záleží na
382
+ tom, že že že se náhle vyvine veliký objem plynu, který který se vyvine z
383
+ mnohem menšího objemu výbušné masy… Prosím, to není správné.“
384
+ „Jak to?“ táže se Wald přísně.
385
+ „Já já já jsem našel alfavýbuchy. Výbuch totiž nastane rozpadem atomu.
386
+ Částečky atomu se rozletí – rozletí –“
387
+ „Nesmysl,“ přeruší ho profesor. „Není žádných atomů.“
388
+ „Jsou jsou jsou,“ drtil Prokop. „Prosím, já já já to dokážu –“
389
+ „Překonaná teorie,“ bručí profesor. „Nejsou vůbec žádné atomy, jsou jenom
390
+ gumetály. Víte, co je to gumetál?“
391
+ Prokop se zapotil úlekem. Toho slova nikdy v životě neslyšel. Gumetál? „To
392
+ neznám,“ vydechl stísněně.
393
+ „Tak vidíte,“ řekl suše Wald. „A pak si troufáte dělat kolokvium. Co víte o
394
+ Krakatitu?“
395
+ Prokop se nesmírně zarazil. „Krakatit,“ šeptal, „to je… to je úplně nová
396
+ třaskavina, která… která dosud…“
397
+ „Čím se zanítí? Čím? Čím exploduje?“
398
+ „Hertzovými vlnami,“ vyhrkl Prokop s úlevou.
399
+ „Jak to víte?“
400
+ „Protože mně zničehonic vybuchla. Protože… protože nebyl žádný jiný impuls. A
401
+ protože –“
402
+ „Nu?“
403
+ „… její syn-syntéza… se mně povedla za-za-za… vysokofrekvenční oscilace. Není
404
+ to dosud vyvyvysvětleno; ale já myslím, že – – že to byly nějaké
405
+ elektromagnetické vlny.“
406
+ „Byly. Já to vím. Teď napište na tabuli chemicky vzorec Krakatitu.“
407
+ Prokop vzal kus křídy a načmáral na tabuli svůj vzorec.
408
+ „Přečtěte.“
409
+ Prokop odříkal vzorec nahlas. Tu vstal profesor Wald a řekl najednou jakýmsi
410
+ docela jiným hlasem: „Jak? Jak je to?“
411
+ Prokop opakoval formuli.
412
+ „Tetrargon?“ ptal se profesor rychle. „Pb kolik?“
413
+ „Dvě.“
414
+ „Jak se to dělá?“ tázal se hlas podivně blízce. „Postup! Jak se to dělá? Jak?…
415
+ Jak se dělá Krakatit?“
416
+ Prokop otevřel oči. Nad ním se skláněl Tomeš s tužkou a zápisníkem v ruce a
417
+ bez dechu se díval na jeho rty.
418
+ „Co?“ mumlal Prokop neklidně. „Co chceš? Jak… jak se to dělá?“
419
+ „Něco se ti zdálo,“ řekl Tomeš a schoval zápisník za zády. „Spi, člověče,
420
+ spi.“
421
+
422
+
423
+ IV.
424
+
425
+ Teď jsem něco vyžvanil, uvědomoval si Prokop jasnějším cípem mozku; ale jinak
426
+ mu to bylo svrchovaně lhostejno; chtělo se mu jen spát, nesmírně spát. Viděl
427
+ jakýsi turecký koberec, jehož vzor se bez konce přesunoval, prostupoval a
428
+ měnil. Nebylo to nic, a přece ho to jaksi rozčilovalo; i ve spaní zatoužil
429
+ vidět znovu Plinia. Snažil se vybavit si jeho podobu; místo toho měl před
430
+ sebou ohavnou zešklebenou tvář, jež skřípala žlutými vyžranými zuby, až se
431
+ drtily, a pak je po kouskách vyplivovala. Chtěl tomu uniknout; napadlo ho
432
+ slovo „rybář“, a hle, zjevil se mu rybář nad šedivou vodou i s rybami v
433
+ čeřenu; řekl si „lešení“, a viděl skutečné lešení do poslední skoby a vazby.
434
+ Dlouho se bavil tím, že vymýšlel slova a pozoroval obrázky jimi promítnuté;
435
+ ale pak, pak už si živou mocí nemohl na žádné slovo vzpomenout. Namáhal se
436
+ usilovně, aby našel aspoň jedno jediné slovo nebo věc, ale marně; tu ho zalila
437
+ hrůza bezmoci studeným potem. Musím postupovat metodicky, umínil si; začnu zas
438
+ od začátku, nebo jsem ztracen. Šťastně si vzpomněl na slovo „rybář“, ale
439
+ zjevil se mu hliněný prázdný galon od petroleje; bylo to děsné. Řekl si
440
+ „židle“, a ukázal se mu s podivnou podrobností dehtovaný tovární plot s
441
+ trochou smutné zaprášené trávy a rezavými obručemi. To je šílenství, řekl si s
442
+ mrazivou jasností; to je, pánové, typická pomatenost, hyperofabula ugongi
443
+ dugongi Darwin. Tu se mu tento odborný název zazdál neznámo proč ukrutně
444
+ směšný, a dal se do hlasitého, zrovna zalykavého smíchu, jímž se probudil.
445
+ Byl úplně zpocen a odkopán. Díval se horečnýma očima na Tomše, který chvatně
446
+ přecházel po pokoji a házel nějaké věci do kufříku; ale nepoznával ho.
447
+ „Poslyšte, poslyšte,“ začal, „to je k smíchu, poslyšte, tak počkejte, to
448
+ musíte, poslyšte –“ Chtěl říci jako vtip ten podivuhodný odborný název, a sám
449
+ se smál předem; ale živou mocí si nemohl vzpomenout, jak to vlastně bylo, i
450
+ rozmrzel se a umkl.
451
+ Tomeš si oblékl ulstr a narazil čepici; a když už bral kufřík, zaváhal a sedl
452
+ si na pelest k Prokopovi. „Poslyš, starouši,“ řekl starostlivě, „já teď musím
453
+ odejet. K tátovi, do Týnice. Nedá-li mně peníze, tak – se už nevrátím, víš?
454
+ Ale nic si z toho nedělej. Ráno sem přijde domovnice a přivede ti doktora,
455
+ ano?“
456
+ „Kolik je hodin?“ ptal se Prokop netečně.
457
+ „Čtyři… Čtyři a pět minut. Snad… ti tu nic neschází?“
458
+ Prokop zavřel oči, odhodlán nezajímat se už o nic na světě. Tomeš ho pečlivě
459
+ přikryl, a bylo ticho.
460
+ Náhle otevřel oči dokořán. Viděl nad sebou neznámý strop a po jeho kraji běží
461
+ neznámý ornament. Sáhl rukou po svém nočním stolku, a hmátl do prázdna.
462
+ Obrátil se polekán, a místo svého širokého laboratorního pultu vidí nějaký
463
+ cizí stolek s lampičkou. Tam, kde bývalo okno, je skříň; kde stávalo umyvadlo,
464
+ jsou jakési dveře. Zmátl se tím vším nesmírně; nedovedl pochopit, co se s ním
465
+ děje, kde se octl, a přemáhaje závrať usedl na posteli. Pomalu si uvědomil, že
466
+ není doma, ale nemohl si vzpomenout, jak se sem dostal. „Kdo je to,“ zeptal se
467
+ hlasitě nazdařbůh, stěží hýbaje jazykem. „Pít,“ ozval se po chvíli, „pít!“
468
+ Bylo trýznivé ticho. Vstal z postele a trochu vrávoravě šel hledat vodu. Na
469
+ umyvadle našel karafu a pil z ní dychtivě; a když se vracel do postele,
470
+ podlomily se mu nohy a usedl na židli, nemoha dále. Seděl snad hodně dlouho;
471
+ pak ho roztřásla zima, neboť se celý polil vodou z karafy, a přišlo mu líto
472
+ sebe sama, že je kdesi a neví sám kde, že ani do postele nedojde a že je tak
473
+ bezradně a bezmocně sám; tu propukl v dětský vzlykavý pláč.
474
+ Když se trochu vyplakal, bylo mu v hlavě jasněji. Dokonce mohl dojít až k
475
+ posteli a ulehl jektaje zuby; a sotva se zahřál, usnul mrákotným spánkem beze
476
+ snu.
477
+ Když se probudil, byla roleta vytažena do šedivého dne a v pokoji trochu
478
+ pouklizeno; nedovedl pochopit, kdo to udělal, ale jinak se pamatoval na vše,
479
+ na včerejší explozi, na Tomše i na jeho odjezd. Zato ho třeštivě bolela hlava,
480
+ bylo mu těžko na prsou a drásavě ho mučil kašel. Je to špatné, říkal si, je to
481
+ docela špatné; měl bych jít domů a lehnout si. Vstal tedy a začal se pomalu
482
+ strojit chvílemi odpočívaje. Bylo mu, jako by mu něco drtilo hrozným tlakem
483
+ prsa. Usedl pak netečný ke všemu a těžce dýchal.
484
+ Tu krátce, jemně zazněl zvonek. Vzchopil se s námahou a šel otevřít. Na prahu
485
+ v chodbě stála mladá dívka s tváří zastřenou závojem.
486
+ „Bydlí tady… pan Tomeš?“ ptala se spěšně a stísněně.
487
+ „Prosím,“ řekl Prokop a ustoupil jí z cesty; a když, trochu váhajíc, těsně
488
+ podle něho vcházela dovnitř, zavála na něj slabounká a spanilá vůně, že
489
+ rozkoší vzdychl.
490
+ Posadil ji vedle okna a usedl proti ní, drže se zpříma, jak nejlépe dovedl.
491
+ Cítil, že samým úsilím vypadá přísně a strnule, což uvádělo do nesmírných
492
+ rozpaků jeho i dívku. Hryzala si pod závojem rty a klopila oči; ach, líbezná
493
+ hladkost tváře, ach, ruce malé a hrozně rozčilené! Náhle zvedla oči, a Prokop
494
+ zatajil dech omámen úžasem; tak krásná se mu zdála.
495
+ „Pan Tomeš není doma?“ ptala se dívka.
496
+ „Tomeš odejel,“ řekl Prokop váhavě. „Dnes v noci, slečno.“
497
+ „Kam?“
498
+ „Do Týnice, k svému otci.“
499
+ „A vrátí se?“
500
+ Prokop pokrčil rameny.
501
+ Dívka sklopila hlavu a její ruce s něčím zápasily. „A řekl vám, proč – proč –“
502
+ „Řekl.“
503
+ „A myslíte, že – že to udělá?“
504
+ „Co, slečno?“
505
+ „Že se zastřelí.“
506
+ Prokop si bleskem vzpomněl, že viděl Tomše ukládat revolver do kufříku. ,Možná
507
+ že zítra udělám bum,‘ slyšel jej znovu drtit mezi zuby. Nechtěl nic říci, ale
508
+ vypadal asi velmi povážlivě.
509
+ „Ó bože, ó bože,“ vypravila ze sebe dívka, „ale to je strašné! Řekněte,
510
+ řekněte –“
511
+ „Co, slečno?“
512
+ „Kdyby – kdyby někdo mohl za ním jet! Kdyby mu někdo řekl – kdyby mu dal –
513
+ Vždyť by to nemusel udělat, chápete? Kdyby někdo za ním ještě dnes jel –“
514
+ Prokop se díval na její zoufalé ruce, jež se zatínaly a spínaly.
515
+ „Já tam tedy pojedu, slečno,“ řekl tiše. „Náhodou… mám snad v tu stranu
516
+ nějakou cestu. Kdybyste chtěla – já –“
517
+ Dívka zvedla hlavu. „Skutečně,“ vyhrkla radostně, „vy byste mohl –?“
518
+ „Já jsem jeho… starý kamarád, víte?“ vysvětloval Prokop. „Chcete-li mu něco
519
+ vzkázat… nebo poslat… já ochotně…“
520
+ „Bože, vy jste hodný,“ vydechla dívka.
521
+ Prokop se slabě začervenal. „To je maličkost, slečno,“ bránil se. „Náhodou…
522
+ mám zrovna volný čas… stejně chci někam jet, a vůbec –“ Mávl v rozpacích
523
+ rukou. „To nestojí za řeč. Udělám všecko, co chcete.“
524
+ Dívka se zarděla a honem se dívala jinam. „Ani nevím, jak bych… vám měla
525
+ děkovat,“ řekla zmateně. „Mně je tak líto, že… že vy… Ale je to tak důležité –
526
+ A pak, vy jste jeho přítel – Nemyslete si, že já sama –“ Tu se přemohla a
527
+ upřela na Prokopa čiré oči. „Já mu něco musím poslat. Od někoho jiného. Já vám
528
+ nemohu říci –“
529
+ „Není třeba,“ řekl Prokop rychle. „Já mu to dám, a je to. Já jsem tak rád, že
530
+ mohu vám… že mohu jemu… Prší snad?“ ptal se náhle dívaje se na její zrosenou
531
+ kožišinku.
532
+ „Prší.“
533
+ „To je dobře,“ mínil Prokop; myslel totiž na to, jak příjemně by chladilo,
534
+ kdyby na tu kožišinku směl položit čelo.
535
+ „Já to tu nemám,“ řekla vstávajíc. „Bude to jen malý balíček. Kdybyste mohl
536
+ počkat… Já vám to přinesu za dvě hodiny.“
537
+ Prokop se velmi strnule uklonil; bál se totiž, že ztratí rovnováhu. Ve dveřích
538
+ se obrátila a pohlédla na něj upřenýma očima. „Na shledanou.“ A byla ta tam.
539
+ Prokop usedl a zavřel oči. Krupičky deště na kožišince, hustý a orosený závoj;
540
+ zastřený hlas, vůně, neklidné ruce v těsných, maličkých rukavičkách; chladná
541
+ vůně, pohled jasný a matoucí pod sličným, pevným obočím. Ruce na klíně, měkké
542
+ řasení sukně na silných kolenou, ach, maličké ruce v těsných rukavicích! Vůně,
543
+ temný a chvějící se hlas, líčko hladké a pobledlé. Prokop zatínal zuby do
544
+ chvějících se rtů. Smutná, zmatená a statečná. Modrošedé oči, oči čisté a
545
+ světelné. Ó bože, ó bože, jak se tiskl závoj k jejím rtům!
546
+ Prokop zasténal a otevřel oči. Je to Tomšova holka, řekl si se slepým vztekem.
547
+ Věděla kudy jít, není tu poprvé. Snad tady… zrovna tady v tom pokoji – –
548
+ Prokop si v nesnesitelné trýzni vrýval nehty do dlaní. A já hlupák se nabízím,
549
+ že pojedu za ním! Já hlupák, já mu ponesu psaníčko! Co – co – co mi je vůbec
550
+ po ní?
551
+ Tu ho napadla spásná myšlenka. Uteku domů, do svého laboratorního baráku tam
552
+ nahoře. A ona, ať si sem přijde! ať si pak dělá, co chce! Ať – ať – ať si jede
553
+ za ním sama, když… když jí na tom záleží –
554
+ Rozhlédl se po pokoji; viděl zválenou postel, zastyděl se a ustlal ji, jak byl
555
+ zvyklý doma. Pak se mu nezdála dost slušně ustlaná, přestlal ji, rovnal a
556
+ hladil, a pak už rovnal všechno všudy, uklízel, pokoušel se pěkně zřasit i
557
+ záclony, načež usedl s hlavou zmotanou a hrudí drcenou bolestným tlakem a
558
+ čekal.
559
+
560
+
561
+ V.
562
+
563
+ Zdálo se mu, že jde ohromnou zelinářskou zahradou; kolem dokola nic než samé
564
+ zelné hlávky, ale nejsou to hlávky, nýbrž zešklebené a olezlé, krhavé a
565
+ blekotající, nestvůrné, vodnaté, trudovité a vyboulené hlavy lidské; vyrůstají
566
+ z hubených košťálů a lezou po nich odporné zelené housenky. A hle, přes pole k
567
+ němu běží dívka se závojem na tváři; zvedá trochu sukni a přeskakuje lidské
568
+ hlávky. Tu vyrůstají zpod každé z nich nahé, úžasně tenké a chlupaté ruce a
569
+ sahají jí po nohou a po sukních. Dívka křičí v šílené hrůze a zvedá sukni
570
+ výše, až nad silná kolena, obnažuje bílé nohy a snaží se přeskočit ty
571
+ chňapající ruce. Prokop zavírá oči; nesnese pohled na její bílé silné nohy, a
572
+ šílí úzkostí, že ji ty zelné hlávky zhanobí. Tu vrhá se na zem a uřezává
573
+ kapesním nožem první hlávku; ta zvířecky ječí a cvaká mu vyžranými zuby po
574
+ rukou. Nyní druhá, třetí hlávka; Kriste Ježíši, kdy skosí to ohromné pole, než
575
+ se dostane k dívce zápasící tam na druhé straně nekonečné zahrady? Zběsile
576
+ vyskakuje a šlape po těch příšerných hlavách, rozdupává je, kope do nich;
577
+ zaplete se nohama do jejich tenkých, přísavných pracek, padá, je uchopen,
578
+ rván, dušen, a vše mizí.
579
+ Vše mizí v závratném víření. A náhle se ozve zblízka zastřený hlas: „Nesu vám
580
+ ten balíček.“ Tu vyskočil a otevřel oči, a před ním stojí děvečka z Hybšmonky,
581
+ šilhavá a těhotná, se zmáčeným břichem, a podává mu cosi zabaleného v mokrém
582
+ hadru. To není ona, trne bolestně Prokop, a rázem vidí vytáhlou smutnou
583
+ prodavačku, která mu dřevěnými tyčinkami roztahuje rukavice. To není ona,
584
+ brání se Prokop, a vidí naduřelé dítě na křivičných nožkách, jež – jež – jež
585
+ se mu nestoudně nabízí! „Jdi pryč,“ křičí Prokop, a tu se mu zjeví pohozená
586
+ konev uprostřed záhonu povadlé a slimáky prolezlé kapusty a nemizí přes
587
+ všechno jeho úsilí.
588
+ Vtom tiše zazněl zvonek jako tiknutí ptáčka. Prokop se vrhl ke dveřím a
589
+ otevřel; na prahu stála dívka se závojem, tiskla k ňadrům balíček a
590
+ oddychovala. „To jste vy,“ řekl Prokop tiše a (neznámo proč) nesmírně dojat.
591
+ Dívka vešla, dotkla se ho ramenem; její vůně dechla na Prokopa trýznivým
592
+ opojením.
593
+ Zůstala stát uprostřed pokoje. „Prosím vás, nehněvejte se,“ mluvila tiše a
594
+ jakoby spěchajíc, „že jsem vám dala takové poslání. Vždyť ani nevíte, proč –
595
+ proč já – Kdyby vám to dělalo nějaké potíže –“
596
+ „Pojedu,“ vypravil ze sebe Prokop chraptivě.
597
+ Dívka upřela na něj zblízka své vážné, čisté oči. „Nemyslete si o mně nic
598
+ zlého. Já mám jenom strach, aby pan… aby váš přítel neudělal něco, co by
599
+ někoho… někoho jiného do smrti trápilo. Já mám k vám tolik důvěry… Vy ho
600
+ zachráníte, že?“
601
+ „Nesmírně rád,“ vydechl Prokop nějakým nesvým a rozechvěným hlasem; tak ho
602
+ opojovalo nadšení. „Slečno, já… co budete chtít…“ Odvracel oči; bál se, že
603
+ něco vybleptne, že je snad slyšet, jak mu bouchá srdce, a styděl se za svou
604
+ těžkopádnost.
605
+ I dívku zachvátil jeho zmatek; hrozně se zarděla a nevěděla kam s očima.
606
+ „Děkuju, děkuju vám,“ pokoušela se také jaksi nejistým hlasem, a silně mačkala
607
+ v rukou zapečetěný balíček. Nastalo ticho, jež působilo Prokopovi sladkou a
608
+ mučivou závrať. Cítil s mrazením, že dívka letmo zkoumá jeho tvář; a když k ní
609
+ náhle obrátil oči, viděl, že se dívá k zemi a čeká, připravena, aby snesla
610
+ jeho pohled. Prokop cítil, že by měl něco říci, aby zachránil situaci; místo
611
+ toho jen hýbal rty a chvěl se na celém těle.
612
+ Konečně pohnula dívka rukou a zašeptala: „Ten balíček –“ Tu zapomněl Prokop,
613
+ proč schovává pravou ruku za zády, a sáhl po tlusté obálce. Dívka zbledla a
614
+ couvla. „Vy jste poraněn,“ vyhrkla. „Ukažte!“ Prokop honem schovával ruku. „To
615
+ nic není,“ ujišťoval rychle, „to… to se mi jen trochu zanítila… zanítila
616
+ taková ranka, víte?“
617
+ Dívka, docela bledá, zasykla, jako by sama cítila tu bolest. „Proč nejdete k
618
+ lékaři?“ řekla prudce. „Vy nemůžete nikam jet! Já… já pošlu někoho jiného!“
619
+ „Vždyť už se to hojí,“ bránil se Prokop, jako by mu brali něco drahého.
620
+ „Jistě, to už je… skoro v pořádku, jen škrábnutí, a vůbec, to je nesmysl; proč
621
+ bych nejel? A pak, slečno, v takové věci… nemůžete poslat cizího člověka,
622
+ víte? Vždyť to už ani nebolí, hleďte,“ a zatřepal pravou rukou.
623
+ Dívka stáhla obočí přísnou soustrastí. „Vy nesmíte jet! Proč jste mi to
624
+ neřekl? Já – já – já to nedovolím! Já nechci –“
625
+ Prokop byl docela nešťasten. „Hleďte, slečno,“ spustil horlivě, „to jistě nic
626
+ není; já jsem na to zvyklý. Podívejte se, tady,“ a ukázal jí levou ruku, kde
627
+ mu scházel skoro celý malík a kloub ukazováčku naduřel uzlovitou jizvou. „To
628
+ už je takové řemeslo, víte?“ Ani nepozoroval, že dívka couvá s blednoucími rty
629
+ a dívá se na pořádný šrám jeho čela od oka k vlasům. „Udělá to prásk, a je to.
630
+ Jako voják. Zvednu se a běžím útokem dál, rozumíte? Nic se mně nemůže stát.
631
+ Nu, dejte sem!“ Vzal jí z ruky balíček, vyhodil do výše a chytil. „Žádná
632
+ starost, pane. Pojedu jako pán. Víte, já, já už jsem dávno nikde nebyl. Znáte
633
+ Ameriku?“
634
+ Dívka mlčela a hleděla na něho se zachmuřeným obočím.
635
+ „Ať si říkají, že mají nové teorie,“ drmolil Prokop horečně; „počkejte, já jim
636
+ to dokážu, až vyjdou mé výpočty. Škoda že tomu nerozumíte; já bych vám to
637
+ vyložil, vám věřím, vám věřím, ale jemu ne. Nevěřte mu,“ mluvil naléhavě,
638
+ „mějte se na pozoru. Vy jste tak krásná,“ vydechl nadšeně. „Tam nahoře já
639
+ nikdy s nikým nemluvím. Je to jen taková bouda z prken, víte? Haha, vy jste se
640
+ tak bála těch hlávek! Ale já vás nedám, o to nic; nebojte se ničeho. Já vás
641
+ nedám.“
642
+ Pohlížela na něho s očima rozšířenýma hrůzou. „Vy přece nemůžete odejet!“
643
+ Prokop zesmutněl a zmalátněl. „Ne, na to nesmíte dát, co mluvím. Povídal jsem
644
+ nesmysly, že? Já jsem jenom chtěl, abyste nemyslela na tu ruku. Abyste se
645
+ nebála. To už přešlo.“ – Přemohl své vzrušení, byl tuhý a zakaboněný samým
646
+ soustředěním. „Pojedu do Týnice a najdu Tomše. Dám mu ten balíček a řeknu, že
647
+ to posílá slečna, kterou zná. Je to tak správně?“
648
+ „Ano,“ řekla dívka váhavě, „ale vy přece nemůžete –“
649
+ Prokop se pokusil o prosebný úsměv; jeho těžká, rozjizvená tvář náhle docela
650
+ zkrásněla. „Nechte mne,“ řekl tiše, „vždyť je to – je to – pro vás.“
651
+ Dívka zamžikala očima; bylo jí skoro do pláče prudkým pohnutím. Mlčky kývla a
652
+ podávala mu ruku. Zvedl svou beztvarou levici; pohlédla na ni zvědavě a silně
653
+ ji stiskla. „Já vám tolik děkuju,“ řekla rychle, „sbohem!“
654
+ Ve dveřích se zastavila a chtěla něco říci; mačkala v ruce kliku a čekala –
655
+ „Mám mu… vyřídit… pozdrav?“ optal se Prokop s křivým úsměvem.
656
+ „Ne,“ vydechla a rychle na něj pohlédla. „Na shledanou.“
657
+ Dveře za ní zapadly. Prokop se na ně díval, bylo mu najednou na smrt těžko a
658
+ chabě, hlava se mu točila, a stálo ho nesmírné usilí, aby učinil jediný krok.
659
+
660
+
661
+ VI.
662
+
663
+ Na nádraží bylo mu čekati půldruhé hodiny. Sedl si na chodbě a chvěl se zimou.
664
+ V poraněné ruce mu pulsovala ukrutná bolest; zavíral oči, a tu se mu zdálo, že
665
+ ta bolavá ruka roste, že je veliká jako hlava, jako tykev, jako hrnec na
666
+ vyváření prádla, a že v celém jejím rozsahu palčivě cuká živé maso. Přitom mu
667
+ bylo mdlo k dávení a na čele mu ustavičně vyrážel studený pot úzkosti. Nesměl
668
+ se podívat na špinavé, poplivané, zablácené dlážky chodby, aby se mu nezvedal
669
+ žaludek. Vyhrnul si límec a polo snil, pomalu přemáhán nekonečnou
670
+ lhostejností. Zdálo se mu, že zas je vojákem a leží poraněn v širém poli; kde
671
+ – kde to pořád bojují? Tu zazněl mu do uší prudký zvon a někdo volal: „Týnice,
672
+ Duchcov, Moldava, nastupovat!“
673
+ Nyní už tedy sedí ve vagóně u okna a je mu nezřízeně veselo, jako by někoho
674
+ přelstil nebo někomu utekl; teď, holenku, už jedu do Týnice a nic mne nemůže
675
+ zadržet. Skoro se chechtal radostí, uvelebil se ve svém koutě a s náramnou
676
+ čilostí pozoroval své spolucestující. Naproti němu sedí nějaký krejčík s
677
+ tenkým krkem, hubená černá paní, pak člověk s divně bezvýraznou tváří; vedle
678
+ Prokopa strašně tlustý pán, kterému se nemůže nějak břicho vejít mezi nohy, a
679
+ snad ještě někdo, to už je jedno. Prokop se nesmí dívat z okna, protože mu to
680
+ dělá závrať. Ratata ratata ratata vybuchuje vlak, vše drnčí, bouchá, otřásá se
681
+ samou horlivostí spěchu. Krejčíkovi se klátí hlava napravo nalevo, napravo
682
+ nalevo; černá paní jaksi podivně a ztuhle hopkuje na místě, bezvýrazná tvář se
683
+ třese a kmitá jako špatný snímek ve filmu. A tlustý soused, to je kupa rosolu,
684
+ jež se houpe, otřásá, poskakuje nesmírně směšným způsobem. Týnice, Týnice,
685
+ Týnice, skanduje Prokop s údery kol; rychleji! rychleji! Vlak se ohřál samým
686
+ chvatem, je tu horko, Prokop se potí žárem; krejčík má nyní dvě hlavy na dvou
687
+ tenkých krcích, obě hlavy se třesou a narážejí na sebe, až to drnčí. Černá
688
+ paní výsměšně a urážlivě hopkuje na svém sedadle; tváří se naschvál jako
689
+ dřevěná loutka. Bezvýrazná tvář zmizela; sedí tam trup s rukama mrtvě
690
+ složenýma na klíně, ruce neživě poskakují, ale trup je bezhlavý.
691
+ Prokop sbírá všechny své síly, aby se na to pořádně podíval; štípe se do nohy,
692
+ ale nic platno, trup je dál bezhlavý a mrtvě se poddává otřesům vlaku.
693
+ Prokopovi je z toho děsně úzko; šťouchá loktem tlustého souseda, ale ten se
694
+ jen rosolovitě chvěje, a Prokopovi se zdá, že se mu to tlusté tělo bezhlase
695
+ chechtá. Nemůže se už na to dívat; obrací se k oknu, ale tam zničehonic vidí
696
+ lidskou tvář. Neví zprvu, co je na ní tak zarážejícího; pozoruje ji
697
+ vytřeštěnýma očima a poznává, že to je jiný Prokop, který na něho upírá oči s
698
+ děsivou pozorností. Co chce? zhrozil se Prokop. Proboha, nezapomněl jsem ten
699
+ balíček v Tomšově bytě? Hmatá honem po kapsách a najde obálku v náprsní kapse.
700
+ Tu se tvář v okně usmála a Prokopovi se ulevilo. Odvážil se dokonce pohlédnout
701
+ na bezhlavý trup; a vida, on si ten člověk jen přetáhl pověšený svrchník přes
702
+ hlavu a spí pod ním. Prokop by to udělal také, ale bojí se, aby mu někdo
703
+ nevytáhl z kapsy tu zapečetěnou obálku. A přece jde na něho spaní, je
704
+ nesnesitelně unaven; nikdy by si nedovedl představit, že je možno být tak
705
+ unaven. Usíná, vyrve se z toho vytřeštěně a opět usíná. Černá paní má jednu
706
+ hopkující hlavu na ramenou a druhou drží na klíně oběma rukama; a co se
707
+ krejčíka týče, sedí místo něho jen prázdné, beztělé šaty, z nichž čouhá
708
+ porcelánová palička. Prokop usíná, ale pojednou se z toho vytrhne v horlivé
709
+ jistotě, že je v Týnici; snad to někdo venku volal, neboť vlak stojí.
710
+ Vyběhl tedy ven a viděl, že už je večer; dva tři lidé vystupují na malinkém
711
+ blikajícím nádraží, za nímž je neznámá a mlhavá tma. Řekli Prokopovi, že do
712
+ Týnice musí jet poštou, je-li na ní ještě místo. Poštovní vůz, to byl jen
713
+ kozlík a za ním truhlík na zásilky; a na kozlíku už seděl pošťák a nějaký
714
+ pasažér.
715
+ „Prosím vás, vemte mne do Týnice,“ řekl Prokop.
716
+ Pošťák potřásl hlavou v nekonečném smutku. „Nejde,“ odpověděl po chvíli.
717
+ „Proč… jak to?“
718
+ „Není už místo,“ řekl pošťák zrale.
719
+ Prokopovi vstoupily do očí slzy samou lítostí. „Jak je tam daleko… pěšky?“
720
+ Pošťák účastně přemýšlel. „No, hodinu,“ řekl.
721
+ „Ale já… nemohu jít pěšky! Já musím k doktoru Tomšovi!“ protestoval Prokop
722
+ zdrcen.
723
+ Pošťák uvažoval. „Vy jste… jako… pacient?“
724
+ „Mně je zle,“ zamumlal Prokop; skutečně se chvěl slabostí a zimou.
725
+ Pošťák přemýšlel a potřásal hlavou. „Když to nejde,“ ozval se konečně.
726
+ „Já se vejdu, já… kdyby byl jen kousek místa, já…“
727
+ Na kozlíku ticho; jen pošťák se drbal ve vousech, až to chrastělo; pak neřekl
728
+ slova a slezl, dělal něco na postraňku a mlčky odešel do nádraží. Pasažér na
729
+ kozlíku se ani nepohnul.
730
+ Prokop byl tak vyčerpán, že si musel sednout na patník. Nedojdu, cítil
731
+ zoufale; zůstanu tady, až… až…
732
+ Pošťák se vracel z nádraží a nesl prázdnou bedničku. Nějak ji vpravil na
733
+ plošinu kozlíku a rozvážně ji pozoroval. „Tak si tam sedněte,“ řekl posléze.
734
+ „Kam?“ ptal se Prokop.
735
+ „No… na kozlík.“
736
+ Prokop se dostal na kozlík tak nadpřirozeně, jako by ho vynesly nebeské síly.
737
+ Pošťák zas dělal cosi na řemení, a teď sedí na bedničce s nohama visícíma dolů
738
+ a bere opratě. „Hý,“ povídá.
739
+ Kůň nic. Jenom se zachvěl.
740
+ Pošťák nasadil jakési tenké, hrdelní „rrr“. Kůň pohodil ocasem a pustil
741
+ hlasitý pšouk.
742
+ „Rrrrr.“
743
+ Pošta se rozjela. Prokop se křečovitě chytil nízkého zábradlíčka; cítil, že je
744
+ nad jeho síly udržet se na kozlíku.
745
+ „Rrrrr.“ Zdálo se, že ten vysoký hrčivý zpěv nějak galvanizuje starého koně.
746
+ Běžel kulhavě, pohazoval ocasem a při každém kroku pouštěl slyšitelné větry.
747
+ „Rrrrrrrr.“ Šlo to alejí holých stromů; byla černočerná tma, jen kmitavý
748
+ proužek světla z lucerny se smýkal po blátě. Prokop ztuhlými prsty svíral
749
+ zábradlíčko; cítil, že už vůbec nevládne svému tělu, že nesmí spadnout, že
750
+ bezmezně slábne. Nějaké osvětlené okno, alej, černá pole. „Rrrr.“ Kůň vytrvale
751
+ pšukal a klusal pleta nohama toporně a nepřirozeně, jako by byl už dávno
752
+ mrtev.
753
+ Prokop se úkosem podíval na svého spolucestujícího. Byl to děda s krkem
754
+ ovázaným šálou; pořád něco žvýkal, překusoval, žmoulal a zase vyplivoval. A tu
755
+ si Prokop vzpomněl, že tu podobu už viděl. Byla to ta ohavná tvář ze sna, jež
756
+ skřípala vyžranými zuby, až se drtily, a pak je po kouskách vyplivovala. Bylo
757
+ to divné a strašné.
758
+ „Rrrrr.“ Silnice se obrací, motá se do kopce a zase dolů. Nějaký statek, je
759
+ slyšet psa, člověk jde po silnici a povídá „dobrý večer“. Domků přibývá, jde
760
+ to do kopce. Pošta zatáčí, vysoké „rrrr“ náhle ustane a kůň se zastaví.
761
+ „Tak tady bydlí doktor Tomeš,“ povídá pošťák.
762
+ Prokop chtěl něco říci, ale nemohl; chtěl se pustit zábradlí, ale nešlo to,
763
+ protože mu prsty křečovitě ztuhly.
764
+ „No, už jsme tady,“ povídá pošťák znovu. Ponenáhlu křeče povolí a Prokop slézá
765
+ z kozlíku, chvěje se na celém těle. Jakoby popaměti otvírá vrátka a zvoní u
766
+ dveří. Uvnitř zuřivý štěkot, a mladý hlas volá: „Honzíku, ticho!“ Dveře se
767
+ otevrou, a stěží hýbaje jazykem ptá se Prokop: „Je pan doktor doma?“
768
+ Chvilku ticho; pak řekl mladý hlas: „Pojďte dál.“
769
+ Prokop stojí v teplé světnici; na stole je lampa a večeře, voní to bukovým
770
+ dřívím. Starý pán s brejličkami na čele vstává od svého talíře, jde k
771
+ Prokopovi a povídá: „Tak copak vám schází?“
772
+ Prokop se mračně upomínal, co tu vlastně chce. „Já… totiž…,“ začal, „je váš
773
+ syn doma?“
774
+ Starý pán se pozorně díval na Prokopa. „Není. Co vám je?“
775
+ „Jirka… Jiří,“ m ručel Prokop, „já jsem… jeho přítel a nesu mu… mám mu dát…“
776
+ Lovil v kapse zapečetěnou obálku. „Je to… důležitá věc a… a…“
777
+ „Jirka je v Praze,“ přerušil ho starý pán. „Člověče, sedněte si aspoň!“
778
+ Prokop se nesmírně podivil. „Vždyť říkal… říkal, že jede sem. Já mu musím
779
+ dát…“ Podlaha se pod ním zakymácela a počala se naklánět.
780
+ „Aničko, židli,“ křikl starý pán podivným hlasem.
781
+ Tu ještě zaslechl Prokop tlumený výkřik a poroučel se na zem. Zalila ho
782
+ nesmírná temnota, a pak již nebylo nic.
783
+
784
+
785
+ VII.
786
+
787
+ Nebylo nic; jen jako kdyby se časem protrhly mlhy, zjevil se vzorek malované
788
+ stěny, řezaná římsa skříně, cíp záclony či frýzek stropu; nebo se naklonila
789
+ nějaká tvář jakoby nad otvorem studně, ale nebylo vidět jejích rysů. Něco se
790
+ dělo, někdo časem svlažil horké rty nebo pozvedal bezvládné tělo, ale vše
791
+ mizelo v plynoucích útržcích snění. Byly to krajiny, kobercové vzory,
792
+ diferenciální počty, ohnivé koule, chemické formule; jen časem něco vyplulo
793
+ navrch a stalo se na okamžik jasnějším snem, aby se to vzápětí zas rozplynulo
794
+ v širokotokém bezvědomí.
795
+ Konečně přišla chvíle, kdy procitl; viděl nad sebou teplý a bezpečný strop se
796
+ štukovým frýzkem; našel očima své vlastní hubené, mrtvě bílé ruce na květované
797
+ přikrývce; za nimi objevil pelest postele, skříň a bílé dveře: vše nějak milé,
798
+ tiché a už známé. Neměl ponětí, kde je; chtěl o tom uvažovat, ale měl nemožně
799
+ slabou hlavu, vše se mu opět počalo mást, i zavřel oči a odpočíval v odevzdané
800
+ chabosti.
801
+ Dveře tichounce zavrzly. Prokop otevřel oči a posadil se na posteli, jako by
802
+ ho něco zvedlo. A ono u dveří stojí děvče, vytáhlé nějak a světlé, má
803
+ jasňoučké oči náramně udivené, ústa pootevřená překvapením a tiskne k prsoum
804
+ bílé pláténko. Nehýbe se rozpačitá, mrká dlouhými řasami a její růžový čumáček
805
+ se počíná nejistě, plaše usmívat.
806
+ Prokop se zachmuřil; usilovně hleděl něco říci, ale měl v hlavě docela
807
+ prázdno; hýbal nehlasně rty a pozoroval dívku jaksi přísnýma a vzpomínavýma
808
+ očima.
809
+ „Gúnúmai se, anassa,“ splynulo mu náhle a bezděčně se rtů, „theos ny tis é
810
+ brotos essi? Ei men tis theos essi, toi úranon euryn echúsin, Artemidi se egó
811
+ ge, Dios kúré megaloio, eidos te megethos te fyén t’anchista eďskó.“ A dále,
812
+ verš za veršem, řinulo se božské pozdravení, jímž Odysseus oslovil Nausikau.
813
+ „Proboha prosím tě, paní! Jsi božstvo či smrtelný člověk? Jestližes některá z
814
+ bohyň, co sídlí na nebi širém, s Artemidou bych já, jež velkého Dia je dcera,
815
+ krásou a vzrůstem těla i velkostí nejspíš tě srovnal. Jsi-li však některá z
816
+ lidí, co mají na zemi sídlo, třikrát blaženi jsou tvůj otec i velebná matka,
817
+ třikrát blaženi bratři, neb jistě jim nadmíru srdce pokaždé rozkoší blahou se
818
+ pro tebe rozhřívá v hrudi, kdykoli zří, jak takový květ jde do kola k tanci.“
819
+ Dívka bez hnutí, jako zkamenělá, naslouchala tomuto po. zdravu v neznámé řeči;
820
+ a na jejím hladkém čele bylo tolik zmatku, její oči tak dětsky a polekaně
821
+ mžikaly, že Prokop zdvojnásobil horlivost Odyssea na břeh vyvrženého, sám jer
822
+ nejasně chápaje smysl slov.
823
+ „Keinos ďau peri kéri makartatos,“ odříkával rychle. „Avšak nad jiné ten se
824
+ pocítí blaženým v srdci, který zvítězí dary a tebe si odvede domů, neboť dosud
825
+ nikdy jsem takého člověka nezřel ze všech mužů ni žen; já s úžasem na tebe
826
+ hledím.“
827
+ Sebas m’echei eisoroónta. Děvče se silně zardělo, jako by rozumělo pozdravu
828
+ řeckého hrdiny; neobratný a líbezný zmatek jí vázal údy, a Prokop, spínaje
829
+ ruce na pokrývce, mluvil, jako by se modlil.
830
+ „Déló dé pote,“ pokračoval spěšně, „jenom na Délu jednou, blíž oltáře jasného
831
+ Foiba, palmový mladý strůmek jsem viděl ze země růsti, – neboť i tam jsem
832
+ přišel a množství lidu šlo se mnou na cestě té, z níž trampoty zlé mi vzejíti
833
+ měly. Tam jsem právě tak stál, pln úžasu, když jsem jej viděl, dlouho, vždyť
834
+ takový kmen se nezrodil ze země dosud. Tak teď tobě se divím a žasnu a bojím
835
+ se hrozně dotknout se kolenou tvých, ač velký smutek mě tísní.“
836
+ Deidia ďainós: ano, bál se hrozně, ale i dívka se bála a tiskla k prsoum bílé
837
+ prádlo a neodvracela očí z Prokopa, jenž chvátal vypovědět svou trýzeň:
838
+ „Včera, až v dvacátý den, jsem ušel třpytnému moři, do doby té jsem vlnou byl
839
+ hnán a prudkými větry od výspy Ógygie, teď sem mě zas uvrhlo božstvo, abych tu
840
+ též snad zakusil strast, vždyť sotva se, tuším, skončí, a množství běd mi
841
+ bohové přisoudí ještě.“
842
+ Prokop těžce vzdychl a pozvedl úděsně vyhublé ruce. „Alla, anass‘, eleaire!
843
+ Avšak slituj se, paní, vždyť vytrpěv útrapy mnohé, nejdřív přišel jsem k tobě
844
+ – z těch druhých nikoho neznám lidí, co v krajině té a v městě své obydlí
845
+ mají. Do města cestu mi ukaž, dej roucho, bych tělo si zakryl, jestližes
846
+ vzala, sem jdouc, snad nějaký na prádlo obal.“
847
+ Nyní se dívčí tvář poněkud vyjasnila, vlahé rty se pootevřely; snad Nausikaá
848
+ promluví, ale Prokop chtěl jí ještě požehnati za ten obláček líbezného
849
+ soucitu, kterým růžovělo její líčko. „Soi de theoi tosa doien, hosa fresi sési
850
+ menoinás: bozi pak račte ti dát, čeho ve své mysli si žádáš, muže i dům, a
851
+ přidejtež vám i svorného ducha, vzácný to dar, – vždyť lepšího nic ni krasšího
852
+ není, než když smýšlením svorni svou domácnost společně vedou žena i muž, jak
853
+ odpůrcům v žal, tak na radost velkou všechněm příznivcům svým, a nejvíc to
854
+ pocítí sami.“ [* Překlad O. Vaňorného (1921)]
855
+ Poslední slova Prokop už skoro jen dýchal; sám stěží rozuměl tomu, co
856
+ odříkává, vytékalo to plynně a bez vůle z nějakého neznámého kouta paměti;
857
+ bylo tomu skoro dvacet let, co se jakžtakž probíral sladkou melodií šestého
858
+ zpěvu. Působilo mu až fyzickou úlevu nechávat to volně odtékat; dělalo se mu v
859
+ hlavě lehčeji a jasněji, bylo mu skoro blaženě v té plihé a libé slabosti, a
860
+ tu se mu zachvěl na rtech rozpačitý úsměv.
861
+ Dívka se usmála, pohnula sebou a řekla: „Nu tak?“ Udělala krůček blíž a dala
862
+ se do smíchu. „Co jste to povídal?“
863
+ „Já nevím,“ děl Prokop nejistě.
864
+ Tu se rozlétly nedovřené dveře a do pokoje vrazilo něco malého a chundelatého,
865
+ kviklo radostí a skočilo Prokopovi na postel.
866
+ „Honzíku,“ křikla dívka polekaně, „jdeš dolů!“ Ale psisko už olízlo Prokopovu
867
+ tvář a v náruživé radosti se zachumlávalo do přikrývek. Prokop si sáhl na
868
+ tvář, aby se otřel, a s úžasem pocítil pod rukou plnovous. „Co-copak,“ koktal
869
+ a umlkl údivem. Psisko bláznilo; kousalo s překypující něhou Prokopovy ruce,
870
+ pištělo, funělo, a tumáš! mokrou mordou se mu dostalo až na prsa.
871
+ „Honzíku,“ křičela dívka, „ty jsi blázen! Necháš pána!“ Přiběhla k posteli a
872
+ vzala psíka do náruče. „Bože, Honzíku, ty jsi hlupák!“
873
+ „Nechte ho,“ žádal Prokop.
874
+ „Vždyť máte bolavou ruku,“ namítalo děvče s velikou vážností, tisknouc k
875
+ prsoum zápasícího psa.
876
+ Prokop se podíval nechápavě na svou pravici. Od palce přes dlaň táhla se
877
+ široká jizva, pokrytá novou, tenoučkou, červenou kožkou příjemně svědící.
878
+ „Kde… kde to jsem?“ podivil se.
879
+ „U nás,“ řekla s náramnou samozřejmostí, jež Prokopa ihned uspokojila. „U
880
+ vás,“ opakoval s úlevou, ač neměl ponětí, kde to je. „A jak dlouho?“
881
+ „Dvacátý den. A pořád –,“ chtěla něco říci, ale spolkla to. „Honzík spával s
882
+ vámi,“ dodala spěšně a zarděla se neznámo proč, chovajíc psa jako malé dítě.
883
+ „Víte o tom?“
884
+ „Nevím,“ vzpomínal Prokop. „Copak jsem spal?“
885
+ „Pořád,“ vyhrkla. „Už jste se mohl vyspat.“ Tu postavila psa na zem a
886
+ přiblížila se k posteli. „Je vám líp?… Chtěl byste něco?“
887
+ Prokop zakroutil hlavou; nevěděl o ničem, co by chtěl. „Kolik je hodin?“ ptal
888
+ se nejistě.
889
+ „Deset. Já nevím, co smíte jíst; až přijde tati… Tati bude tak rád… Chtěl
890
+ byste něco?“
891
+ „Zrcadlo,“ řekl Prokop váhavě.
892
+ Dívka se zasmála a vyběhla. Prokopovi hučelo v hlavě; pořád se hleděl
893
+ rozpomenout a pořád mu vše unikalo. A už je tu děvče, něco povídá a podává mu
894
+ zrcátko. Prokop chce zvednout ruku, ale bůhsámví proč to nejde; děvče mu
895
+ vkládá držadlo mezi prsty, ale zrcátko padá na pokrývku. Tu zbledlo děvče,
896
+ nějak se znepokojilo a samo mu nastavilo zrcadlo k očím. Prokop se dívá, vidí
897
+ docela zarostlé tváře a obličej skoro neznámý; hledí a nemůže pochopit, a tu
898
+ se mu roztřásly rty.
899
+ „Lehněte si, hned si zas lehněte,“ káže mu drobounký hlásek skoro plačící, a
900
+ rychlé ruce mu nastavují podušku. Prokop se sváží naznak a zavírá oči; jen
901
+ chvilinku si zdřímnu, myslí si, a udělalo se libé, hluboké ticho.
902
+
903
+
904
+ VIII.
905
+
906
+ Někdo ho zatahal za rukáv. „Nu, nu,“ povídá ten někdo, „už bychom nemuseli
907
+ spát, co?“ Prokop otevřel oči a viděl starého pána, má růžovou pleš a bílou
908
+ bradu, zlaté brejličky na čele a náramně čilý koukej. „Už nespěte, velectěný,“
909
+ povídá, „už toho je dost; nebo se probudíte na onom světě.“
910
+ Prokop si chmurně prohlížel starého pána; chtělo se mu totiž dřímat. „Co
911
+ chcete?“ ozval se vzdorovitě. „A… s kým mám tu čest?“
912
+ Starý pán se dal do smíchu. „Prosím, doktor Tomeš. Vy jste mne neráčil dosud
913
+ vzít na vědomí, co? Ale nic si z toho nedělejte. Tak co, jak se máme?“
914
+ „Prokop,“ ozval se nemocný nevlídně.
915
+ „Tak, tak,“ povídal doktor spokojeně. „A já jsem si myslel, že jste Šípková
916
+ Růženka. A teď, pane inženýre,“ řekl čile, „se na vás musíme podívat. No,
917
+ neškareďte se.“ Vyeskamotoval mu z podpaží teploměr a libě zachrochtal.
918
+ „Třicet pět osm. Človíčku, vy jste jako moucha. Musíme vás nakrmit, co?
919
+ Nehýbejte se.“
920
+ Prokop cítil na prsou hladkou pleš a studené ucho, jak mu jezdí od ramene k
921
+ rameni, od břicha k hrdlu za povzbuzujícího broukání.
922
+ „No, sláva,“ řekl konečně doktor a nasadil si brejle na oči. „Napravo vám to
923
+ drobátko rachotí, a srdce – no, to se urovná, že?“ Naklonil se k Prokopovi,
924
+ drbal ho prsty ve vlasech a přitom mu palcem zvedal a zase zatlačoval oční
925
+ víčka. „Nespat už, víme?“ mluvil a přitom mu něco zkoumal na zorničkách.
926
+ „Dostaneme knížky a budeme číst. Sníme něco, vypijeme skleničku vína a –
927
+ nehýbejte se! Já vás neukousnu.“
928
+ „Co mně je?“ ptal se Prokop nesměle.
929
+ Doktor se vztyčil. „No, nic už. Poslechněte, kde jste se tady vzal?“
930
+ „Kde tady?“
931
+ „Tady, v Týnici. Sebrali jsme vás na podlaze a… Odkud jste, člověče, přišel?“
932
+ „Já nevím. Z Prahy, ne?“ vzpomínal Prokop.
933
+ Doktor potřásl hlavou. „Vlakem z Prahy! Se zápalem mozkových blan! Měl jste
934
+ rozum? Víte, co to vůbec je?“
935
+ „Co?“
936
+ „Meningitis. Spací forma. A k tomu zápal plic. Čtyřicet celých, he? Kamaráde,
937
+ s něčím takovým se nejezdí na výlety. A víte, že – nu, ukažte honem pravou
938
+ ruku!“
939
+ „To… to bylo jen škrábnutí,“ hájil se Prokop.
940
+ „Pěkné škrábnutí. Otrava krve, rozumíte? Až budete zdráv, řeknu vám, že jste
941
+ byl… že jste byl osel. Odpusťte,“ řekl s důstojným rozhořčením, „málem bych
942
+ byl řekl něco horšího. Vzdělaný člověk, a neví, že toho má v sobě na trojí
943
+ exitus! Jak jste se vůbec mohl držet na nohou?“
944
+ „Já nevím,“ šeptal Prokop zahanbeně.
945
+ Doktor chtěl hubovat dál, ale zavrčel jen a mávl rukou. „A jak se cítíte?“
946
+ začal přísně. „Trochu pitomý, ne? Žádná paměť, co? A tady, tady nějak,“ ťukal
947
+ si na čelo, „nějaký slabý, že?“
948
+ Prokop mlčel.
949
+ „Tak tedy, pane inženýre,“ spustil doktor. „Z toho si nic nedělat. Nějaký
950
+ čásek to potrvá, co? Rozumíte mi? Nesmíte si namáhat hlavu. Nemyslet. To se
951
+ vrátí… po kouskách. Jen přechodná porucha, slabá amence, rozumíte mi? To
952
+ přejde samo od sebe, co? Rozumíte mi?“
953
+ Doktor křičel, potil se a rozčiloval se, jako by se hádal s hluchoněmým.
954
+ Prokop se na něj pozorně díval, a ozval se klidně: „Já tedy zůstanu
955
+ slabomyslný?“
956
+ „Ale ne, ne,“ rozčiloval se doktor. „Naprosto vyloučeno. Ale prostě… po
957
+ nějakou dobu… porucha paměti, roztržitost, únava a takové ty příznaky,
958
+ rozumíte mi? Poruchy v koordinaci, chápete? Odpočívat. Klid. Nic nedělat.
959
+ Velectěný, děkujte pánubohu, že jste to vůbec přečkal.“
960
+ „Přečkal,“ ozval se po chvíli a radostně zatroubil do kapesníku. „Poslechněte,
961
+ takový případ jsem ještě neměl. Vy jste sem přišel pěkně v deliriu, praštil
962
+ jste sebou na zem, a finis, poroučím se vám. Co jsem měl s vámi dělat? Do
963
+ nemocnice je daleko, a holka nad vámi tento, brečela… a vůbec, přišel jste
964
+ jako host k… Jirkovi, k synovi, no ne? Tak jsme si vás tu nechali, rozumíte
965
+ mi? Nu, nám to nevadí. Ale takového zábavného hosta jsem ještě neviděl. Dvacet
966
+ dní prospat, pěkně děkuju! Když vám kolega primář řezal ruku, ani jste se
967
+ neráčil probudit, co? Tichý pacient, namouduši. No, to už je jedno. Jen když
968
+ jste z toho venku, člověče.“ Doktor se plácl hlučně do stehna. „U čerta,
969
+ nespěte už! Pane, hej, pane, mohl byste usnout nadobro, slyšíte? U všech
970
+ všudy, hleďte se trochu přemáhat! Nechte toho, slyšíte?“
971
+ Prokop chabě kývl; cítil, že se nějaké závoje přetahují mezi ním a
972
+ skutečností, že se vše obestírá, kalí a tichne.
973
+ „Andulo,“ slyšel zdáli rozčilený hlas, „víno! dones víno!“ Nějaké rychlé
974
+ kroky, hovor jakoby pod vodou, a chladivá chuť vína mu stékala do hrdla.
975
+ Otevřel oči a viděl nad sebou skloněné děvče. „Nesmíte spát,“ povídá děvče
976
+ rozechvěně, a její předlouhé řasy mžikají, jako když srdce tluče.
977
+ „Já už nebudu,“ omlouvá se Prokop pokorně.
978
+ „To bych si vyprosil, velectěný,“ lomozil doktor u pelestě. „Přijede sem z
979
+ města primář extra na konzultaci; ať vidí, že my felčaři venku taky něco
980
+ umíme, no ne? Musíte se pěkně držet.“ S neobyčejnou obratností zvedl Prokopa a
981
+ shrnul mu za záda polštáře. „Tak, teď bude pán sedět; a spaní si nechá až po
982
+ obědě, že? Já musím do ordinace. A ty, Ando, si tady sedni a něco žvaň; jindy
983
+ ti huba jede jako trakař, co? A kdyby chtěl spát, zavolej mne; já už si to s
984
+ ním vyřídím.“ Ve dveřích se obrátil a zavrčel: „Ale… mám radost, rozumíte? Co?
985
+ Tak pozor!“
986
+ Prokopovy oči se svezly na dívku. Seděla opodál, ruce v klíně, a při bohu
987
+ nevěděla, o čem mluvit. Tak, teď zvedla hlavu a pootevřela ústa; slyšme, co z
988
+ ní vyletí; ale zatím se jenom zastyděla, spolkla to a sklopila hlavu ještě
989
+ níž; je vidět jen dlouhé řasy, jak se chvějí nad líčkem.
990
+ „Tati je tak prudký,“ ozvala se konečně. „On je tak zvyklý křičet… vadit se… s
991
+ pacienty…“ Látka jí bohužel došla; zato – jako na zavolanou – ocitla se jí v
992
+ prstech zástěra a nechala se dlouho a všelijak zajímavě skládat, za pozorného
993
+ mžikání ohnutých řas.
994
+ „Co to řinčí?“ optal se Prokop po delší době.
995
+ Obrátila hlavu k oknu; má pěkné světlé vlasy, jež jí ozařují čelo, a šťavnaté
996
+ světélko na vlhké puse. „To jsou krávy,“ povídá s úlevou. „Tam je panský dvůr,
997
+ víte? Tenhle dům taky patří k panství. Tati má koně a kočárek… Jmenuje se
998
+ Fricek.“
999
+ „Kdo?“
1000
+ „Ten kůň. Vy jste nebyl nikdy v Týnici, že? Tady nic není. Jen aleje a pole…
1001
+ Dokud byla živa maminka, tak tu bylo veseleji; to sem jezdil náš Jirka… Už tu
1002
+ nebyl přes rok; pohádal se s tatim a… ani nepíše. Ani se o něm u nás nesmí
1003
+ mluvit – Vídáte ho často?“
1004
+ Prokop rozhodně zavrtěl hlavou.
1005
+ Děvče vzdychlo a zamyslilo se. „On je… já nevím. Takový divný. Jen tu chodil s
1006
+ rukama v kapsách a zíval… Já vím, že tu nic není; ale přec… Tati je taky rád,
1007
+ že jste zůstal u nás,“ zakončila rychle a trochu nesouvisle.
1008
+ Někde venku se chraptivě a směšně rozkřikl mladý kohoutek. Najednou se tam
1009
+ dole strhlo jakési slepičí rozčilení, bylo slyšet divoké „ko-ko-ko-“ a vítězně
1010
+ kvikající štěkot psiska. Děvče vyskočilo. „Honzík honí slepice!“ Ale hned si
1011
+ zase sedla, odhodlána ponechat slípky jejich osudu. Bylo příjemné a jasné
1012
+ ticho.
1013
+ „Já nevím, o čem povídat,“ řekla po chvíli s nejkrásnější prostotou. „Já vám
1014
+ přečtu noviny, chcete?“
1015
+ Prokop se usmál. A už tu byla s novinami a pustila se odvážně do úvodníku.
1016
+ Finanční rovnováha, státní rozpočet, nekrytý úvěr… Líbezný a nejistý hlásek
1017
+ odříkával klidně ty nesmírně vážné věci, a Prokopovi, jenž naprosto
1018
+ neposlouchal, bylo lépe, než kdyby hluboce spal.
1019
+
1020
+
1021
+ IX.
1022
+
1023
+ Nyní už smí Prokop na nějakou hodinku denně vylézt z postele; dosud táhne nohy
1024
+ všelijak a bohužel není s ním mnoho řeči; říkejte si mu co chcete, většinou
1025
+ odpoví nějak skoupě a přitom se omlouvá plachým úsměvem.
1026
+ Dejme tomu v poledne – je teprve začátek dubna – sedává v zahrádce na lavičce;
1027
+ vedle něho ježatý teriér Honzík se směje na celé kolo pod svými mokrými
1028
+ fořtovskými vousy, neboť je zřejmě pyšný na svou funkci společníka, a samou
1029
+ radostí se oblízne a mhouří oči, když ho zjizvená Prokopova levička pohladí po
1030
+ teplé huňaté hlavě. V tu hodinu obyčejně doktor vyběhne z ordinace, čepička mu
1031
+ sem tam jezdí po hladké pleši, sedne na bobek a sází zeleninu; tlustými
1032
+ krátkými prsty rozmílá hrudky prsti a pozorně vystýlá lůžko mladých klíčků. Co
1033
+ chvíli se začne rozčilovat a bručí; zapíchl někde do záhonku svou lulku a
1034
+ nemůže ji najít. Tu se Prokop zvedne a s divinací detektiva (neboť čte v
1035
+ posteli detektivky) zamíří rovnou k ztracené faječce. Čehož Honzík užije k
1036
+ tomu, aby se hlučně otřepal.
1037
+ V tu hodinu chodívá Anči (neboť tak a nikoliv Andula si přeje být jmenována)
1038
+ zalévat tatínkovy záhony. V pravé ruce nese konev, levá plave ve vzduchu;
1039
+ stříbrná prška šumí do mladé hlíny, a naskytne-li se nablízku Honzík, dostane
1040
+ ji na zadek nebo na pitomou veselou hlavu; tu zoufale kvikne a hledá ochranu u
1041
+ Prokopa.
1042
+ Celé ráno se trousí do ordinace pacienti. Chrchlají v čekárně a mlčí, každý
1043
+ mysle jen na své utrpení. Někdy se ozve z ordinace strašný křik, když doktor
1044
+ tahá zub nějakému kloučeti. Tu se zase Anči v panice zachrání k Prokopovi,
1045
+ bledá a zrovna bez sebe, úzkostně mžiká krásnými řasami a čeká, až strašná
1046
+ událost přejde. Konečně kluk ubíhá ven s táhlým vytím, a Anči nějak nešikovně
1047
+ zamlouvá svou útlocitnou zbabělost.
1048
+ Ovšem něco jiného je, když před doktorovým domem zastaví vůz vystlaný slámou a
1049
+ dva strejci opatrně vynášejí po schodech těžce raněného člověka. Má rozdrcenou
1050
+ ruku nebo zlomenou nohu nebo hlavu roztříštěnou kopytem; studený pot se mu
1051
+ řine po hrozně bledém čele, a tiše, s hrdinným sebepřemáháním sténá. Na celý
1052
+ dům lehne tragické ticho; v ordinaci se bez hluku odehrává něco těžkého,
1053
+ tlustá veselá služka chodí po špičkách, Anči má oči plné slz a prsty se jí
1054
+ třesou. Doktor vrazí do kuchyně, s křikem žádá rum, víno nebo vodu, a
1055
+ dvojnásobnou hrubostí zakrývá mučivý soucit. A ještě celý den potom nemluví a
1056
+ vzteká se a bouchá dveřmi.
1057
+ Ale je také veliký svátek, slavný výroční trh venkovské doktořiny: očkování
1058
+ dětí. Sta maminek houpá své bečící, řvoucí, spící uzlíčky, je toho plná
1059
+ ordinace, chodba, kuchyně i zahrádka; Anči je jako blázen, chtěla by chovat,
1060
+ houpat a převíjet všechny ty bezzubé, uřvané, ochmýřené děti v nadšeném
1061
+ záchvatu kybelického mateřství. I starému doktorovi se nějak okázaleji svítí
1062
+ pleš, od rána chodí bez brejlí, aby nepolekal ty haranty, a oči mu plavou
1063
+ únavou a radostí.
1064
+ Jindy uprostřed noci rozčileně zařinčí zvonek. Pak bručí ve dveřích nějaké
1065
+ hlasy, doktor hubuje a kočí Jozef musí zapřahat. Někde ve vsi za svítícím
1066
+ okénkem přichází na svět nový člověk. Až ráno se doktor vrací, unavený, ale
1067
+ spokojený, a na deset kroků smrdí karbolem; ale takhle ho má Anči nejraději.
1068
+ Pak jsou tu ještě jiné osobnosti: tlustá řehtavá Nanda v kuchyni, která po
1069
+ celý den zpívá a řinčí a ohýbá se smíchem. Dále vážný kočí Jozef s visutými
1070
+ kníry, historik; čte pořád dějepisné knížky a rád vykládá dejme tomu o
1071
+ husitských válkách nebo o historických tajemnostech kraje. Dále panský
1072
+ zahradník, náramný holkář, který denně zaskočí do doktorovy zahrady, očkuje mu
1073
+ růže, stříhá keře a uvádí Nandu do nebezpečných záchvatů smíchu. Dále zmíněný
1074
+ chlupatý a rozjařený Honzík, jenž provází Prokopa, honí blechy a slepice a
1075
+ zmíry rád jezdí na kozlíku doktorova kočárku. Fric, to je starý rap trochu
1076
+ šedivějící, přítel králíků, rozšafný a dobrosrdečný kůň; pohladit jeho teplé a
1077
+ citlivé nozdry, to je prostě vrchol příjemnosti. Dále brunátný adjunkt ze
1078
+ dvora, zamilovaný do Anči, která si z něho ve spojení s Nandou ukrutně střílí.
1079
+ Ředitel ze dvora, starý lišák a zloděj, jenž chodí s doktorem hrát v šachy;
1080
+ doktor se rozčiluje, zuří a prohrává. A jiné místní osobnosti, mezi nimiž
1081
+ neobyčejně nudný a politicky interesovaný civilní geometr otravuje Prokopa
1082
+ právem kolegiality.
1083
+ Prokop mnoho čte nebo se tváří, jako by četl. Jeho zjizvená, těžká tvář mnoho
1084
+ nepovídá, zejména ne o zoufalém a tajném zápasu s porouchanou pamětí. Zvláště
1085
+ poslední pracovní léta mnoho utrpěla; nejjednodušší vzorce a procesy jsou ty
1086
+ tam, a na okraji knížek si píše Prokop kusé formule, které se mu vynořují v
1087
+ hlavě, když na ně nejméně myslí. Pak se sebere a jde hrát s Anči kulečník;
1088
+ neboť je to hra, při které se mnoho nemluví. I na Anči padá jeho kožená a
1089
+ neproniknutelná vážnost; hraje soustředěně, míří s přísně staženým obočím, ale
1090
+ když koule zamíří naschvál jinam, otevře údivem ústa a mokrým jazejčkem jí
1091
+ ukazuje správnou cestu.
1092
+ Večery u lampy. Nejvíc toho napovídá doktor, nadšený přírodovědec bez
1093
+ jakýchkoliv znalostí. Zejména jej okouzlují poslední záhady světa:
1094
+ radioaktivita, nekonečnost prostoru, elektřina, relativita, původ hmoty a
1095
+ stáří lidstva. Je zapřisáhlý materialista, a právě proto cítí tajemnou a
1096
+ sladkou hrůzu neřešitelných věcí. Někdy se Prokop nezdrží a opravuje
1097
+ büchnerovskou naivitu jeho názorů. Tu starý pán naslouchá přímo pobožně a
1098
+ počíná si Prokopa nesmírně vážit, zejména tam, kde mu přestává rozumět,
1099
+ řekněme takhle o rezonančním potenciálu nebo teorii kvant. Anči, ta prostě
1100
+ sedí opírajíc se bradou o stůl; je sice na tuto pozici už trochu veliká, ale
1101
+ patrně od maminčiny smrti zapomněla dospívat. Ani nemrká a dívá se velkýma
1102
+ očima z táty na Prokopa a vice versa.
1103
+ A noci, noci jsou pokojné a širé jako všude venku. Chvílemi zařinčí z kravína
1104
+ řetězy, chvílemi se blízko nebo daleko rozštěkají psi; po nebi se mihne
1105
+ padající hvězda, jarní déšť zašumí v zahradě nebo stříbrným zvukem odkapává
1106
+ osamělá studna. Čirý, hlubinný chlad vane otevřeným oknem, a člověk usíná
1107
+ požehnaným spánkem bez vidin.
1108
+
1109
+
1110
+ X.
1111
+
1112
+ Nuže, bylo lépe; den za dnem se Prokopovi vracel život drobnými krůčky. Cítil
1113
+ jen malátnost hlavy, bylo mu stále trochu jako ve snách. Nezbývalo než
1114
+ poděkovat doktorovi a jeti po svém. Chtěl to ohlásit jednou po večeři, ale
1115
+ zrovna všichni mlčeli jako zařezaní. A pak vzal starý doktor Prokopa pod paží
1116
+ a dovedl si ho do ordinace; po nějakém okolkování vyhrkl s rozpačitou
1117
+ hrubostí, že jako Prokop nemusí odjíždět, ať raději odpočívá, že nemá ještě
1118
+ vyhráno, a vůbec ať si tu zůstane a dost. Prokop se matně bránil; faktum ovšem
1119
+ bylo, že se ještě necítil v sedle a že se poněkud rozmazlil. Zkrátka o odjezdu
1120
+ nebylo zatím řeči.
1121
+ Vždy odpoledne se doktor zavíral v ordinaci. „Přijďte si někdy ke mně sednout,
1122
+ co?“ řekl Prokopovi mimochodem. Tak tedy ho Prokop zastihl u všelijakých
1123
+ lahviček a kelímků a prášků. „Víte, tady v místě není hapatyka,“ vysvětloval
1124
+ doktor, „já musím sám dělat léky.“ A třesoucími se tlustými prsty dozoval
1125
+ nějaký prášek na ručních vážkách. Měl nejistou ruku, váhy se mu houpaly a
1126
+ točily; starý pán se rozčiloval, funěl a potil se na nose drobnými krůpějkami.
1127
+ „Když na to pořádně nevidím,“ zamlouval stáří svých prstů. Prokop se chvíli
1128
+ díval, pak neřekl nic a vzal mu vážky z ruky. Klep, klep, a prášek byl na
1129
+ miligram odvážen. A druhý, třetí prášek. Citlivé vážky jen tančily v
1130
+ Prokopových prstech. „Ale koukejme, koukejme,“ divil se doktor a s úžasem
1131
+ sledoval Prokopovy ruce, rozbité, uzlovité, s netvornými klouby, ulámanými
1132
+ nehty a krátkými pahýly místo několika prstů. „Človíčku, vy máte šikovnost v
1133
+ těch rukou!“ Za chvíli už Prokop roztíral nějakou masť, odměřoval kapky a
1134
+ nahříval zkumavky. Doktor zářil a nalepoval viněty. Za půl hodiny byl hotov s
1135
+ celou lékárnou, a ještě tu byla hromada prášků do zásoby. A po několika dnech
1136
+ Prokop už zběžně četl doktorovy recepty a bez řečí mu dělal magistra. Bon.
1137
+ Kdysi kvečeru se dloubal doktor na zahradě v kyprém záhonku. Najednou strašná
1138
+ rána v domě, a hned nato se s řinkotem sypalo sklo. Doktor se vrhl do domu a
1139
+ na chodbě se srazil s uděšenou Anči. „Co se stalo?“ volal. „Já nevím,“
1140
+ vypravilo ze sebe děvče. „To v ordinaci…“ Doktor běžel do ordinace a viděl
1141
+ Prokopa, jak na všech čtyřech sbírá na podlaze střepy a papíry.
1142
+ „Co jste tu dělal?“ rozkřikl se doktor.
1143
+ „Nic,“ řekl Prokop a provinile vstával. „Praskla mně zkumavka.“
1144
+ „Ale co u všech všudy,“ hromoval doktor a zarazil se: z Prokopovy levice
1145
+ čurkem stékala krev. „Copak vám to utrhlo prst?“
1146
+ „Jen škrábnutí,“ protestoval Prokop a schovával levičku za zády.
1147
+ „Ukažte,“ křikl starý doktor a táhl Prokopa k oknu. Půl prstu viselo jen na
1148
+ kůži. Doktor se hnal ke skříni pro nůžky, a v otevřených dveřích zahlédl Anči
1149
+ na smrt bledou. „Co tu chceš?“ spustil. „Marš odtud!“ Anči se nehnula; tiskla
1150
+ ruce k prsoum a vypadala co nejslibněji na omdlení.
1151
+ Doktor se vrátil k Prokopovi; nejdřív dělal něco s vatičkou a pak cvakly
1152
+ nůžky. „Světlo,“ křikl na Anči. Anči se vrhla k vypínači a rozsvítila. „A
1153
+ nestůj tady,“ hřmotil starý pán a koupal jehlu v benzínu. „Co tu máš co dělat?
1154
+ Podej sem nitě!“ Anči skočila ke skříni a podala mu ampulku s nitěmi. „A teď
1155
+ jdi!“
1156
+ Anči se podívala na Prokopova záda a udělala něco jiného; přistoupila blíž,
1157
+ chopila oběma dlaněma tu poraněnou ruku a podržela ji. Doktor si zrovna myl
1158
+ ruce; obrátil se k Anči a chtěl vybuchnout; místo toho zabručel: „Tak, teď drž
1159
+ pevně! A víc u světla!“
1160
+ Anči zamhouřila oči a držela. Když nebylo slyšet nic než doktorovo supění,
1161
+ odvážila se zvednout oči. Dole, kde pracoval otec, to bylo krvavé a ošklivé.
1162
+ Pohlédla honem na Prokopa; měl odvrácenou tvář, a jeho víčkem cukala bolest.
1163
+ Anči trnula a polykala slzy a dělalo se jí nanic.
1164
+ Zatím Prokopova ruka narůstala: spousta vaty, Billrothův batist a snad
1165
+ kilometr fáče pořád navíjeného; konečně z toho bylo něco ohromného bílého.
1166
+ Anči držela, kolena se jí třásla, zdálo se jí, že ta strašná operace nikdy
1167
+ nebude u konce. Najednou se jí zatočila hlava, a pak slyšela, jak otec povídá:
1168
+ „Na, vypij to honem!“ Otevřela oči a shledala, že sedí v ordinační sesli, že
1169
+ tati jí podává skleničku s něčím, za ním že stojí Prokop, usmívá se a chová na
1170
+ prsou zavázanou ruku vypadající jako obrovské poupě. „Tak to vypij,“ naléhal
1171
+ doktor a jen cenil zuby. Spolkla to tedy a rozkuckala se; byl to vražedný
1172
+ koňak.
1173
+ „A teď vy,“ řekl doktor a podal skleničku Prokopovi. Prokop byl trochu bledý a
1174
+ statečně čekal, že dostane vynadáno. Nakonec se napil doktor, odchrchlal a
1175
+ spustil: „Tak co jste tu vlastně prováděl?“
1176
+ „Pokus,“ řekl Prokop s křivým úsměvem provinilce.
1177
+ „Co? Jaký pokus? S čím pokus?“
1178
+ „Jen tak. Jen – jen – jde-li něco udělat z chloridu draselnatého.“
1179
+ „Co udělat?“
1180
+ „Třaskavina,“ šeptal Prokop v pokoře hříšníka.
1181
+ Doktor se svezl očima na jeho ofáčovanou ruku. „A to se vám vyplatilo,
1182
+ člověče! Ruku vám to mohlo utrhnout, co? Bolí? Ale dobře na vás, patří vám
1183
+ to,“ prohlašoval krvelačně.
1184
+ „Ale tati,“ ozvala se Anči, „nech ho teď!“
1185
+ „A co ty tu máš co dělat,“ zavrčel doktor a pohladil ji rukou páchnoucí
1186
+ karbolem a jodoformem.
1187
+ Nyní doktor nosil klíč od ordinace v kapse. Prokop si objednal balík učených
1188
+ svazků, chodil s rukou na pásku a studoval po celé dny. Už kvetou třešně,
1189
+ lepkavé mladé listí se třpytí ve slunci, zlaté lilie rozvírají těžká poupata.
1190
+ Po zahrádce chodí Anči s obtloustlou kamarádkou, obě se drží kolem pasu a
1191
+ smějí se; teď sestrčily k sobě růžové čumáčky, něco si šeptají, zrudnou ve
1192
+ smíchu a začnou se líbat.
1193
+ Po létech zase cítí Prokop tělesné blaho. Živočišně se oddává slunci a mhouří
1194
+ oči, aby naslouchal šumění svého těla. Vzdychne a sedá k práci; ale chce se mu
1195
+ běhat, toulá se daleko po kraji a věnuje se náruživé radosti dýchat. Někdy
1196
+ potká Anči v domě či v zahradě a pokouší se něco povídat; Anči se na něj dívá
1197
+ po očku a neví co mluvit; ale ani Prokop to neví, a proto upadá do bručivého
1198
+ tónu. Zkrátka je mu lépe nebo se aspoň cítí jistější, je-li sám.
1199
+ Při studiu pozoroval, že mnoho zanedbal; věda byla už v mnohém dále a jinde,
1200
+ leckdy se musel nově orientovat; a hlavně se bál vzpomínat na svou vlastní
1201
+ práci, neboť tam, to cítil, se mu nejvíc potrhala souvislost. Pracoval jako
1202
+ mezek nebo snil; snil o nových laboratorních metodách, ale zároveň ho lákal
1203
+ jemný a odvážný kalkul teoretika; a vztekal se sám na sebe, když jeho hrubý
1204
+ mozek nebyl s to rozštípnout teninký vlas problému. Byl si vědom, že jeho
1205
+ laboratorní „destruktivní chemie“ otvírá nejpodivnější průhledy do teorie
1206
+ hmoty; narážel na nečekané souvislosti, ale hned zas je rozšlapal svým příliš
1207
+ těžkým uvažováním. Rozmrzen praštil vším, aby se ponořil do nějakého hloupého
1208
+ románu; ale i tam ho pronásledovala laboratorní posedlost: místo slov četl
1209
+ samé chemické symboly; byly to bláznivé vzorce plné prvků dosud neznámých, jež
1210
+ ho znepokojovaly i ve snách.
1211
+
1212
+
1213
+ XI.
1214
+
1215
+ Té noci se mu zdálo, že studuje veleučený článek v The Chemist. Zarazil se u
1216
+ vzorce AnCi a nevěděl si s ním rady; hloubal, kousal se do kloubů a najednou
1217
+ pochopil, že to znamená Anči. A vida, ona je vlastně tady a posmívá se mu s
1218
+ pažema založenýma za hlavou; přistoupil k ní, chytil ji oběma rukama a začal
1219
+ ji líbat a kousat do úst. Anči se divoce brání koleny a lokty; drží ji
1220
+ brutálně a jednou rukou z ní trhá šaty v dlouhých pásech. Už cítí dlaněmi její
1221
+ mladé maso; Anči sebou zběsile zmítá, vlasy padly jí přes tvář, teď, teď náhle
1222
+ ochabuje a klesá; Prokop se vrhá k ní, ale nalézá pod rukama jen samé dlouhé
1223
+ hadříky a fáče; trhá je, rve je, chce se z nich vyprostit, a probouzí se.
1224
+ Hanbil se nesmírně za svůj sen; i ustrojil se potichu, sedl u okna a čekal na
1225
+ svítání. Není hranice mezi nocí a dnem; jen nebe maličko pobledne, a vzduchem
1226
+ proletí signál, jenž není ani světlo ani zvuk, ale poroučí přírodě: vzbuď se!
1227
+ Tu tedy nastalo ráno ještě prostřed noci. Rozkřičeli se kohouti, zvířata v
1228
+ stájích se pohnula. Nebe bledne do perleťova, rozzařuje se a lehce růžoví;
1229
+ první červený pruh vyskočil na východě, „štilip štilip játiti piju piju já,“
1230
+ štěkají a křičí ptáci, a první člověk jde volným krokem za svým povoláním.
1231
+ Také učený člověk sedl k dílu. Dlouho kousal násadku, než se odhodlal napsat
1232
+ první slova; neboť toto bude veliká věc, úhrn experimentování a přemýšlení
1233
+ dvanácti let, práce opravdu vykoupená krví. Ovšem, to zde bude jen náčrt, či
1234
+ spíš jistá fyzikální filozofie nebo báseň nebo vyznání víry. Bude to obraz
1235
+ světa sklenutý z čísel a rovnic; avšak tyto cifry astronomického řádu měří
1236
+ něco jiného než vznešenost oblohy: kalkulují vratkost a destrukci hmoty. Vše,
1237
+ co jest, je tupá a vyčkávající třaskavina; ale jakékoliv budiž číslo její
1238
+ netečnosti, je jenom mizivým zlomkem její brizance. Vše, co se děje, oběhy
1239
+ hvězd a telurická práce, veškerá entropie, sám pilný a nenasytný život, to vše
1240
+ jen na povrchu, nepatrně a neměřitelně ohlodává a váže tuto výbušnou sílu, jež
1241
+ se jmenuje hmota. Vězte tedy, že pouto, jež ji váže, je jenom pavučina na
1242
+ údech spícího titána; dejte mi sílu, aby jej pobodl, i setřese kůru země a
1243
+ vrhne Jupitera na Saturna. A ty, lidstvo, jsi jenom vlaštovka, která si pracně
1244
+ ulepila hnízdo pod krovem kosmické prachárny; cvrlikáš za slunce východu,
1245
+ zatímco v sudech pod tebou mlčky duní strašlivý potenciál výbuchu…
1246
+ Ty věci Prokop ovšem nepsal; byly mu jenom ztajenou melodií, jež okřídlovala
1247
+ těžkopádné věty odborného výkladu. Pro něho bylo více fantazie v holém vzorci
1248
+ a víc oslnivé krásy v číselném výrazu. A tak psal svou báseň ve značkách,
1249
+ číslicích a děsné hantýrce učených slov.
1250
+ K snídani nepřišel. Přišla tedy Anči a nesla mu mlíčko. Děkoval a přitom si
1251
+ vzpomněl na svůj sen, a jaksi to nesvedl podívat se na ni. Koukal tvrdošíjně
1252
+ do kouta; bůhví jak je to možno, že přesto viděl každý zlatý vlásek na jejích
1253
+ holých pažích; nikdy si toho tak nevšiml.
1254
+ Anči stála blizoučko. „Budete psát?“ ptala se neurčitě.
1255
+ „Budu,“ bručel a myslel, co by tomu řekla, kdyby jí zničehonic položil hlavu
1256
+ na prsa.
1257
+ „Po celý den?“
1258
+ „Po celý den.“ Asi by ucouvla náramně dotčena; ale má pevná, malá a široká
1259
+ ňadra, o kterých snad ani neví. Ostatně, co s tím!
1260
+ „Chtěl byste něco?“
1261
+ „Ne, nic.“ Je to hloupé; chtěl by ji hryzat do paží či co; ženská nikdy neví,
1262
+ jak člověka vyrušuje.
1263
+ Anči pokrčila rameny trochu uraženě. „Taky dobře.“ A byla pryč.
1264
+ Vstal a přecházel po pokoji; zlobil se na sebe i na ni, a hlavně se mu už
1265
+ nechtělo psát. Sbíral myšlenky, ale naprosto se mu to nedařilo. Rozmrzel se a
1266
+ otráven chodil od stěny ke stěně s pravidelností kyvadla. Hodinu, dvě hodiny.
1267
+ Dole řinčí talíře, prostírá se k obědu. Sedl znovu k svým papírům a položil
1268
+ hlavu do dlaní. Za chvíli tu byla služka a přinesla mu oběd.
1269
+ Vrátil jídlo skoro netknuté a vrhl se rozmrzen na postel. Je zřejmo, že už ho
1270
+ mají dost, že i on má toho všeho až po krk a že je načase odejet. Ano, hned
1271
+ zítra. Dělal si nějaké plány pro příští práci, bylo mu neznámo proč stydno a
1272
+ trapno a konečně z toho všeho usnul jako zabitý. Probudil se pozdě odpoledne s
1273
+ duší zbahnělou a tělem zamořeným shnilou leností. Coural po pokoji, zíval a
1274
+ bezmyšlenkovitě se mrzel. Setmělo se, a ani nerozsvítil.
1275
+ Služka mu přinesla večeři. Nechal ji vystydnout a poslouchal, co se děje dole.
1276
+ Vidličky cinkaly, doktor bručel a náramně brzo po večeři práskl dveřmi u svého
1277
+ pokoje. Bylo ticho.
1278
+ Jist, že už nikoho nepotká, sebral se Prokop a šel do zahrady. Byla vlažná a
1279
+ jasná noc. Už kvetou šeříky a pustoryl, Bootes široce rozpíná na nebi svou
1280
+ hvězdnou náruč, je ticho prohloubené dalekým psím štěkáním. O kamennou zídku v
1281
+ zahradě se opírá něco světlého. Je to ovšem Anči.
1282
+ „Je krásně, že?“ dostal ze sebe, aby vůbec něco řekl, a opřel se o zídku vedle
1283
+ ní. Anči nic, jenom odvrací tvář a její ramena sebou nezvykle a neklidně
1284
+ trhají.
1285
+ „To je Bootes,“ bručel Prokop sdílně. „A nad ním… je Drak, a Cepheus, a tamto
1286
+ je Kassiopeja, ty čtyři hvězdičky pohromadě. Ale to se musíte dívat výš.“
1287
+ Anči se odvrací a něco roztírá kolem očí. „Tamta jasná,“ povídá Prokop váhavě,
1288
+ „je Pollux, beta Geminorum. Nesmíte se na mne zlobit. Snad jsem se vám zdál
1289
+ hrubý, že? Já jsem… něco mne trápilo, víte? Nesmíte na to dát.“
1290
+ Anči zhluboka vzdychla. „A která je… tamta?“ ozvala se tichým, kolísavým
1291
+ hláskem. „Ta nejjasnější dole.“
1292
+ „To je Sírius, ve Velkém psu. Taky Alhabor mu říkají. A tamhle docela vlevo
1293
+ Arcturus a Spica. Teď padala hvězda. Viděla jste?“
1294
+ „Viděla. Proč jste se ráno na mne tak zlobil?“
1295
+ „Nezlobil. Jsem snad… někdy… trochu hranatý; ale já jsem byl tvrdě živ, víte,
1296
+ příliš tvrdě; pořád sám a… jako první hlídka. Nedovedu ani pořádně mluvit.
1297
+ Chtěl jsem dnes… dnes napsat něco krásného… takovou vědeckou modlitbu, aby
1298
+ tomu každý rozuměl; myslil jsem, že… že vám to přečtu; a vidíte, všechno ve
1299
+ mně vyschlo, člověk už se stydí… rozehřát se, jako by to byla slabost. Nebo
1300
+ vůbec něco říci ze sebe. Takový okoralý, víte? Už hodně šedivím.“
1301
+ „Vždyť vám to sluší,“ vydechla Anči.
1302
+ Prokopa překvapila tato stránka věci. „Nu víte,“ řekl zmateně, „příjemné to
1303
+ není. Už by byl čas… už by byl čas svážet svou úrodu domů. Co by jiný udělal z
1304
+ toho, co já vím! A já nemám nic, nic, nic z toho všeho. Jsem jenom… ,berühmt‘
1305
+ a ,célčbre‘ a ,highly esteemed‘; ani o tom… u nás… nikdo neví. Já myslím,
1306
+ víte, že mé teorie jsou dost špatné; já nemám hlavu na teoretika. Ale co jsem
1307
+ našel, není bez ceny. Mé exotermické třaskaviny… diagramy… a exploze atomů… to
1308
+ má nějakou cenu. A publikoval jsem sotva desetinu toho, co vím. Co by z toho
1309
+ jiný udělal! Já už… ani nerozumím jejich teoriím; jsou tak subtilní, tak
1310
+ duchaplné… a mne to jen mate. Jsem kuchyňský duch. Dejte mně k nosu nějakou
1311
+ látku, a já zrovna čichám, co se s ní dá dělat. Ale pochopit, co z toho plyne…
1312
+ teoreticky a filozoficky…, to neumím. Já znám… jen fakta; já je dělám; jsou to
1313
+ má fakta, rozumíte? A přece… já… já za nimi cítím nějakou pravdu; ohromnou
1314
+ obecnou pravdu… která všechno převrátí… až vybuchne. Ale ta velká pravda… je
1315
+ za fakty a ne za slovy. A proto, proto musíš za fakty! až ti to třeba obě ruce
1316
+ utrhne…“
1317
+ Anči, opřena o zídku, sotva dýchala. Nikdy dosud se ten zamračený patron tolik
1318
+ nerozmluvil – a hlavně nikdy nemluvil o sobě. Zápasil těžce se slovem; zmítala
1319
+ jím ohromná pýcha, ale také plachost a zmučenost; a kdyby mluvil třeba v
1320
+ integrálách, chápala Anči, že se před ní děje něco naprosto niterného a lidsky
1321
+ zjitřeného.
1322
+ „Ale to nejhorší, to nejhorší,“ bručel Prokop. „Někdy… a tady zvlášť… i to, i
1323
+ to se mně zdá hloupé… a k ničemu. I ta konečná pravda… vůbec všecko. Nikdy
1324
+ dřív mně to tak nepřišlo. Nač, a k čemu… Snad je rozumnější poddat se… prostě
1325
+ poddat se tomu, tomu všemu – (Nyní ukázal rukou cosi kolem dokola.) Prostě
1326
+ životu. Člověk nemá být šťastný; to ho změkčuje, víte? Pak se mu zdá všechno
1327
+ ostatní zbytečné, malé… a nesmyslné. Nejvíc… nejvíc udělá člověk ze
1328
+ zoufalství. Ze stesku, ze samoty, z ohlušování. Protože mu nic nestačí. Já
1329
+ jsem pracoval jako blázen. Ale tady, tady jsem začal být šťastný. Tady jsem
1330
+ poznal, že je snad… něco lepšího než myslet. Tady člověk jenom žije… a vidí,
1331
+ že je to něco ohromného… jenom žít. Jako váš Honzík, jako kočka, jako slepice.
1332
+ Každé zvíře to umí… a mně to připadá tak ohromné, jako bych dosud nežil. A
1333
+ tak… tak jsem podruhé ztratil dvanáct let.“
1334
+ Jeho potlučená, bůhvíkolikrát sešívaná pravice se chvěla na zídce. Anči mlčí,
1335
+ i potmě je vidět její dlouhé řasy; opírá se lokty a hrudí o zděný plot a mžiká
1336
+ k hvězdičkám. Tu zašelestilo něco v křoví, a Anči se zděsila; až ji to mocí
1337
+ vrhlo k Prokopovu rameni. „Co je to?“
1338
+ „Nic, nejspíš kuna; jde asi do dvora, na kuřata.“
1339
+ Anči znehybněla. Její mladé prsy se nyní pružně, plně opírají o Prokopovu
1340
+ pravici, – snad, jistě o tom sama neví, ale Prokop to ví víc než cokoliv na
1341
+ světě; bojí se hrozně pohnout rukou, neboť, předně, by si Anči myslela, že ji
1342
+ tam položil schválně, a za druhé by vůbec změnila polohu. Zvláštní však je, že
1343
+ tato okolnost vylučuje, aby dále mluvil o sobě a o ztraceném životě. „Nikdy,“
1344
+ koktá zmateně, „nikdy jsem nebyl tak rád… tak šťasten jako tady. Váš tatík je
1345
+ nejlepší člověk na světě, a vy… vy jste tak mladá…“
1346
+ „Já jsem myslela, že se vám zdám… příliš hloupá,“ povídá Anči tiše a šťastně.
1347
+ „Nikdy jste se mnou takhle nemluvil.“
1348
+ „Pravda, nikdy dosud,“ zabručel Prokop. Oba se odmlčeli. Cítil na ruce lehké
1349
+ oddechování jejích ňader; mrazilo ho a tajil dech, i ona, zdá se, tají dech v
1350
+ tichém trnutí, ani nemrká a široce hledí nikam. Oh, pohladit a stisknout! Oh,
1351
+ závrati, prvý dotyku, lichotko bezděčná a horoucí! Zda tě kdy potkalo
1352
+ dobrodružství opojnější než tato nevědomá a oddaná důvěrnost? Skloněné poupě,
1353
+ tělo bázlivé a jemné! kdybys tušilo mučivou něhu té tvrdé chlapské ruky, jež
1354
+ tě bez hnutí hladí a svírá! Kdybys – kdyby – kdybych teď učinil… a stiskl…
1355
+ Anči se vztyčila nejpřirozenějším pohybem. Ach, děvče, tys tedy opravdu o
1356
+ ničem nevědělo! „Dobrou noc!“ povídá Anči tiše, a její tvář je bledá a
1357
+ nejasná. „Dobrou noc,“ praví trochu sevřeně a podává mu ruku; podává ji levě a
1358
+ chabě, je jako polámaná a dívá se široce nějak jinam. Není-liž pak to, jako by
1359
+ chtěla ještě prodlít? Ne, jde už, váhá; ne, stojí a trhá na kousíčky nějaký
1360
+ lístek. Co ještě říci? Dobrou noc, Anči, a spěte lépe než já.
1361
+ Neboť zajisté nelze teď jít spat. Prokop se vrhá na lavičku a položí hlavu do
1362
+ dlaní. Nic, nic se neudálo… tak dalece; bylo by hanebné hnedle myslet na
1363
+ bůhvíco. Anči je čistá a nevědomá jako telátko, a teď už dost o tom; nejsem
1364
+ přece chlapec. Tu se rozsvítilo v prvním patře okno. Je to Ančina ložnice.
1365
+ Prokopovi bouchá srdce. Ví, že je to hanebnost, tajně se tam dívat; jistě, to
1366
+ by jako host dělat neměl. Pokouší se dokonce zakašlat (aby ho slyšela), ale
1367
+ jaksi to selhalo; i sedí jako socha a nemůže odvrátit očí od zlatého okna.
1368
+ Anči tam přechází, shýbá se, něco dlouze a široce robí; aha, rozestýlá si
1369
+ postýlku. Teď stojí u okna, dívá se do tmy a zakládá ruce za hlavou: zrovna
1370
+ tak ji viděl ve snu. Teď, teď by bylo radno se ozvat; proč to neudělal? Už je
1371
+ na to pozdě; Anči se odvrací, přechází, je ta tam; ba ne, to sedí zády k oknu
1372
+ a zřejmě se zouvá hrozně pomalu a zamyšleně; nikdy se nesní líp než se
1373
+ střevícem v ruce. Aspoň teď by bylo načase zmizet; ale místo toho vylezl na
1374
+ lavičku, aby líp viděl. Anči se vrací, už nemá na sobě živůtek; zvedá nahé
1375
+ paže a vyndává si z účesu vlásničky. Nyní hodila hlavou, a celá hříva se jí
1376
+ rozlévá po ramenou; děvče jí potřese, hurtem si přehodí celou tu úrodu vlasů
1377
+ přes čelo a teď ji zpracovává kartáčem a hřebenem, až má hlavu jako cibulku;
1378
+ je to patrně velmi směšné, neboť Prokop, hanebník, přímo září.
1379
+ Anči, panenka bílá, stojí se skloněnou hlavou a splétá si vlasy ve dva copy;
1380
+ má víčka sklopena a něco si šeptá, zasměje se, zastydí se, až jí to ramena
1381
+ zvedá; pásek košile, pozor, sklouzne. Anči hluboce přemýšlí a hladí si bílé
1382
+ ramínko v nějakém rozkošnictví, zachvěje se chladem, pásek se smeká už
1383
+ povážlivě, a světlo zhaslo.
1384
+ Nikdy jsem neviděl nic bělejšího, nic pěknějšího a bělejšího než toto
1385
+ osvětlené okno.
1386
+
1387
+
1388
+ XII.
1389
+
1390
+ Hned ráno ji zastihl, jak drhne mydlinkami Honzíka v neckách; psisko zoufale
1391
+ vytřepávalo vodu, ale Anči se nedala, držela ho za čupřiny a náruživě mydlila,
1392
+ postříkaná, zmáčená na břiše a usmátá. „Pozor,“ křičela z dálky, „postříká
1393
+ vás!“ Vypadala jako mladá nadšená maminka; oj bože, jak je vše prosté a jasné
1394
+ na tomto slunném světě!
1395
+ Ani Prokop nevydržel zahálet. Vzpomněl si, že nefunguje zvonek, a jal se
1396
+ spravovat baterii. Zrovna oškrabával zinek, když se k němu tiše blížila ona;
1397
+ měla rukávy po loket vyhrnuté a mokré ruce, neboť se pere. „Nevybuchne to?“
1398
+ ptá se starostlivě. Prokop se musel usmát; i ona se zasmála a stříkla po něm
1399
+ mydlinkami; ale hned mu šla s vážnou tváří utřít loktem bublinku mýdla na
1400
+ vlasech. Hle, včera by se toho nebyla odvážila.
1401
+ K polednímu vleče s Nandou koš prádla na zahradu; bude se bílit. Prokop s
1402
+ povděkem sklapl knihu; nenechá ji přece tahat se s těžkou kropicí konví.
1403
+ Zmocnil se konve a kropí prádlo; hustá prška přeradostně a horlivě bubnuje na
1404
+ řásné ubrusy a na bělostné rozložité povlaky a do široce rozevřených náručí
1405
+ mužských košil, šumí, crčí a slévá se ve fjordy a jezírka. Prokop se žene
1406
+ zkropit i bílé zvonky sukének a jiné zajímavé věci, ale Anči mu vyrve konev a
1407
+ zalévá sama. Zatím si Prokop sedl do trávy, dýchá s rozkoší vůni vlhkosti a
1408
+ pozoruje Ančiny činné a krásné ruce. Soi de theoi tosa doien, vzpomněl si
1409
+ zbožně. Sebas m’echei eisoroónta. Já s úžasem na tebe hledím.
1410
+ Anči usedá k němu do trávy. „Nač jste to myslel?“ Mhouří oči oslněním a
1411
+ radostí, zardělá a kdovíproč tak šťastná. Rve plnou hrstí svěží trávu a chtěla
1412
+ by mu ji z bujnosti hodit do vlasů; ale bůhví, i teď ji tísní jakýsi uctivý
1413
+ ostych před tím ochočeným hrdinou. „Měl jste někdy někoho rád?“ ptá se
1414
+ zčistajasna a honem se dívá jinam.
1415
+ Prokop se směje. „Měl. Vždyť i vy jste už měla někoho ráda.“
1416
+ „To jsem byla ještě hloupá,“ vyhrkne Anči a proti své vůli se červená.
1417
+ „Študent?“
1418
+ Anči jen kývne a kouše nějakou travinu. „To nic nebylo,“ povídá pak rychle. „A
1419
+ vy?“
1420
+ „Jednou jsem potkal děvče, které mělo takové řasy jako vy. Možná že vám byla
1421
+ podobná. Prodávala rukavice či co.“
1422
+ „A co dál?“
1423
+ „Nic dál. Když jsem tam šel podruhé koupit rukavice, už tam nebyla.“
1424
+ „A… líbila se vám?“
1425
+ „Líbila.“
1426
+ „A… nikdy jste ji…“
1427
+ „Nikdy. Teď mně dělá rukavice… bandažista.“
1428
+ Anči soustřeďuje svou pozornost na zem. „Proč… vždycky přede mnou schováváte
1429
+ ruce?“
1430
+ „Protože… protože je mám tak rozbité,“ děl Prokop a chudák se začervenal.
1431
+ „To je zrovna tak krásné,“ šeptá Anči s očima sklopenýma.
1432
+ „K obědúúú, k obědúúú,“ vyvolává Nanda před domem. „Bože, už,“ vzdychne Anči a
1433
+ velmi nerada se zvedá.
1434
+ Po obědě se starý doktor jen tak trochu položil, jen docela málo. „Víte,“
1435
+ omlouval se, „já jsem se ráno nadřel jako pes.“ A hned začal pravidelně a
1436
+ pilně chrupat. Zasmáli se na sebe očima a po špičkách vyšli; a i v zahradě
1437
+ mluvili potichu, jako by ctili jeho sytý spánek.
1438
+ Prokop musel povídat o svém životě. Kde se narodil a kde rostl, že byl až v
1439
+ Americe, co bídy poznal, co kdy dělal. Dělalo mu dobře zopakovat si celý ten
1440
+ život; neboť, kupodivu, byl klikatější a divnější, než by sám myslel; a ještě
1441
+ o mnohém pomlčel, zejména, nu, zejména o jistých citových záležitostech, neboť
1442
+ předně to nemá takový význam, a za druhé, jak známo, každý mužský má o čem
1443
+ mlčet. Anči byla tichá jako pěna; připadalo jí jaksi směšné a zvláštní, že
1444
+ Prokop byl také dítětem a chlapcem a vůbec něčím jiným než bručivým a divným
1445
+ člověkem, vedle něhož se cítí taková nesvá a maličká. Nyní by se už nebála na
1446
+ něho i sáhnout, zavázat mu kravatu, pročísnout vlasy nebo vůbec. A poprvé
1447
+ viděla teď jeho tlustý nos, jeho drsná ústa a přísné, mračné, krvavě protkané
1448
+ oči; připadalo jí to vše nesmírně divné.
1449
+ A nyní byla řada na ní, aby povídala o svém životě. Už otevřela ústa a
1450
+ nabírala dechu, ale dala se do smíchu. Uznejte, co se může říci o tak
1451
+ nepopsaném životě, a dokonce někomu, kdo už jednou byl dvanáct hodin zasypán,
1452
+ kdo byl ve válce, v Americe a kdovíkde ještě? „Já nic nevím,“ řekla upřímně.
1453
+ Nuže, řekněte, není takové „nic stejně cenné jako mužovy zkušenosti?
1454
+ Je pozdě odpoledne, když spolu putují vyhřátou polní stezkou. Prokop mlčí a
1455
+ Anči poslouchá. Anči hladí rukou ostnaté vrcholky klasů. Anči se ho dotýká
1456
+ ramenem, zpomaluje krok, vázne; pak zase zrychlí chůzi, jde dva kroky před ním
1457
+ a rve klasy v jakési potřebě ničit. Tato slunečná samota je posléze tíží a
1458
+ znervózňuje; neměli jsme sem jít, myslí si oba potají, a v tísnivém rozladění
1459
+ soukají ze sebe plytký, potrhaný hovor. Konečně tady je cíl, kaplička mezi
1460
+ dvěma starými lípami; je pozdní hodina, kdy pasáci začínají zpívat. Tu je
1461
+ sedátko poutníků; usedli a jaksi ještě víc potichli. Nějaká žena klečela u
1462
+ kapličky a modlila se, jistěže za svou rodinu. Sotva odešla, zvedla se Anči a
1463
+ klekla na její místo. Bylo v tom něco nekonečně a samozřejmě ženského; Prokop
1464
+ se cítil chlapcem vedle zralé prostoty tohoto pravěkého a posvátného gesta.
1465
+ Anči konečně vstala, zvážnělá jaksi a vyspělá, o čemsi rozhodnutá, s čímsi
1466
+ smířená; jako by něco poznala, jako by něco v sobě nesla, přetížená,
1467
+ zamyšlená, bůhvíčím tak změněná; jen slabikami odpovídala sladkým a potemnělým
1468
+ hlasem, když se loudali domů cestičkou soumraku.
1469
+ Nemluvila při večeři a nemluvil ani Prokop; mysleli asi na to, kdy starý pán
1470
+ si půjde přečíst noviny. Starý pán bručel a zkoumal je přes brejličky;
1471
+ holenku, něco se mu tady netento, nezdálo jaksi v pořádku. Už se to trapně
1472
+ táhlo, když se ozval zvonek a člověk odněkud ze Sedmidolí nebo ze Lhoty prosil
1473
+ doktora k porodu. Starý doktor byl pramálo potěšen, zapomněl dokonce hubovat.
1474
+ Ještě s porodním tlumokem zaváhal ve dveřích a kázal suše: „Jdi spat, Anči.“
1475
+ Beze slova se zvedla a sklízela se stolu. Byla dlouho, velmi dlouho někde v
1476
+ kuchyni. Prokop nervózně kouřil a už chtěl odejít. Tu se vrátila, bledá, jako
1477
+ by ji mrazilo, a řekla s hrdinným přemáháním: „Nechcete si zahrát biliár?“ To
1478
+ znamenalo: se zahradou dnes nic nebude.
1479
+ Nu, byla to prašpatná partie; zejména Anči byla zrovna toporná, šťouchala
1480
+ naslepo, zapomínala hrát a stěží odpovídala. A když jednou zahodila
1481
+ nejvyloženějšího sedáka, ukazoval jí Prokop, jak to měla sehrát: pravá faleš,
1482
+ vzít trochu dole, a je to; při tom – jen aby jí vedl ruku – položil svou ruku
1483
+ na její. Tu Anči prudce, temně mu vzhlédla do tváře, hodila tágo na zem a
1484
+ utekla.
1485
+ Nuže, co dělat? Prokop pobíhal po salóně, kouřil a mrzel se. Eh, divné děvče;
1486
+ ale proč to tak mate mne sama? Její hloupá pusa, jasné blizoučké oči, líčko
1487
+ hladké a horoucí, nu, člověk není konečně ze dřeva. Což by bylo takovým
1488
+ hříchem pohladit líčko, políbit, pohladit, ach, růžové líce, a požehnat vlasy,
1489
+ vlasy, přejemné vlásky nad mladou šíjí (člověk není ze dřeva); políbit,
1490
+ pohladit, vzít do rukou, pocelovat zbožně a opatrně? Hlouposti, mrzel se
1491
+ Prokop; jsem starý osel; což bych se nestyděl – takové dítě, které na to ani
1492
+ nemyslí, ani nemyslí – Dobrá; toto pokušení vyřídil Prokop sám se sebou, ale
1493
+ tak rychle to nešlo; mohli byste jej vidět, jak stojí před zrcadlem se rty do
1494
+ krve rozkousanými a mračně, hořce vyzývá a měří svá léta.
1495
+ Jdi spat, starý mládenče, jdi; právě sis ušetřil ostudu, až by se ti mladá,
1496
+ hloupá holčička vysmála; i tenhle výsledek stojí za to. Jakžtakž odhodlán
1497
+ stoupal Prokop nahoru do své ložnice; jen ho tížilo, že musí tadyhle projít
1498
+ podle Ančina pokojíčku. Šel po špičkách: snad už spí, dítě. A najednou stanul
1499
+ se srdcem splašeně tlukoucím. Ty dveře… Ančiny… nejsou dovřeny. Nejsou vůbec
1500
+ zavřeny a za nimi tma. Co je to? A tu slyšel uvnitř cosi jako zakvílení.
1501
+ Něco ho chtělo vrhnout tam, do těch dveří; ale něco silnějšího jej tryskem
1502
+ srazilo se schodů dolů a ven do zahrady. Stál v temném houští a tiskl ruku k
1503
+ srdci, jež bouchalo jako na poplach. Kristepane, že jsem k ní nešel! Anči
1504
+ jistě. klečí – polosvlečena – a pláče do peřinky, proč? to nevím; ale kdybych
1505
+ byl vešel – nuže, co by se stalo? Nic; klekl bych vedle ní a prosil, aby
1506
+ neplakala; pohladil, pohladil bych lehké vlasy, vlásky už rozpuštěné – Ó bože,
1507
+ proč nechala otevřeno?
1508
+ Ejhle, světlý stín vyklouzl z domu a míří do zahrady. Je to Anči, není
1509
+ svlečena ani nemá vlasy rozpuštěné, ale tiskne ruce k skráním, neboť na
1510
+ palčivém čele ruce chladí; a štká ještě posledním dozvukem pláče. Jde podle
1511
+ Prokopa, jako by ho neviděla, ale dělá mu místo po svém pravém boku; neslyší,
1512
+ nevidí, ale nebrání se, když ji bere pod paží a vede k lavičce. Prokop zrovna
1513
+ sbírá nějaká slova chlácholení (u všech všudy, o čem vlastně?), když náhle,
1514
+ bác, má na rameni její hlavu, ještě jednou to křečovitě zapláče, a prostřed
1515
+ vzlyků a smrkání to odpovídá, že „to nic není“; Prokop ji obejme rukou, jako
1516
+ by jí byl rodným strýčkem, a nevěda si jinak rady bručí cosi, že je hodná a
1517
+ strašně milá; načež vzlyky roztály v dlouhé vzdechy (cítil kdesi v podpaží
1518
+ jejich horoucí vlhkost) a bylo dobře. Ó noci, nebešťanko, ty ulevíš sevřené
1519
+ hrudi a rozvážeš těžký jazyk; povzneseš, požehnáš, okřídlíš tiše tlukoucí
1520
+ srdce, srdce teskné a zamlklé; žíznivým dáváš pít ze své nekonečnosti. V
1521
+ kterémsi mizivém bodě prostoru, někde mezi Polárkou a Jižním křížem, Centaurem
1522
+ a Lyrou se děje dojatá věc; nějaký muž se zničehonic cítí jediným ochráncem a
1523
+ tátou tady té mokré tvářičky, hladí ji po temeni a povídá – co vlastně? Že je
1524
+ tak šťasten, tak šťasten, že má tak rád, hrozně rád to štkající a
1525
+ posmrkávající na svém rameni, že nikdy odtud neodejde a kdesi cosi.
1526
+ „Já nevím, co mne to napadlo,“ vzlyká a vzdychá Anči. „Já… já jsem tak chtěla
1527
+ s vámi ještě… mluvit…“
1528
+ „A proč jste plakala?“ bručel Prokop.
1529
+ „Protože jste tak dlouho nešel,“ zní překvapující odpověď.
1530
+ V Prokopovi něco slábne, vůle či co. „Vy… vy mne… máte ráda?“ vysouká ze sebe,
1531
+ a hlas mu mutuje jako čtrnáctiletému. Hlava zarytá v jeho podpaží prudce a bez
1532
+ výhrady kývá.
1533
+ „Snad jsem… měl za vámi přijít,“ šeptá Prokop zdrcen. Hlava rozhodně vrtí, že
1534
+ ne. „Tady… je mi líp,“ vydechne Anči po chvíli. „Tady je… tak krásně!“ Nikdo
1535
+ snad nepochopí, co je tak krásného na drsném mužském kabátě, čpícím tabákem a
1536
+ tělesností; ale Anči do něho zarývá tvář a za nic na světě by ji neobrátila k
1537
+ hvězdičkám: tak je šťastna v tomto tmavém a kořenném úkrytu. Její vlasy
1538
+ šimrají Prokopa pod nosem a voní přepěknou vůničkou. Prokop jí hladí schýlená
1539
+ ramena, hladí její mladičkou šíji a hruď, a nalézá jenom chvějící se oddanost;
1540
+ tu zapomínaje na vše, prudký a brutální popadne její hlavu a chce ji políbit
1541
+ na mokré rty. A hle, Anči se divoce brání, přímo tuhne hrůzou a jektá „ne ne
1542
+ ne“; a už zas se zavrtala tváří do jeho kabátu a je cítit, jak v ní buchá
1543
+ poplašené srdce. A Prokop náhle pochopí, že měla být políbena poprvé.
1544
+ Tu se zastyděl za sebe, zněžněl nesmírně a neodvážil se již ničeho více než ji
1545
+ hladit po vlasech: to se smí, to se smí; bože, vždyť je to docela ještě dítě a
1546
+ úplný pitomec! A nyní již ani slova, ani slovíčka, jež by se jen dechem dotklo
1547
+ neslýchaného dětství této bílé, veliké jalovičky; ani myšlenky, která by
1548
+ chtěla hrubě vysvětlit zmatené pohnutky tohoto večera! Nevěděl věru, co
1549
+ povídá; mělo to medvědí melodii a pražádnou syntaxi; týkalo se to střídavě
1550
+ hvězd, lásky, boha, krásné noci a kterési opery, na jejíž jméno a děj si
1551
+ Prokop živou mocí nemohl vzpomenout, ale jejíž smyčce a hlasy v něm opojně
1552
+ zvučely. Chvílemi se mu zdálo, že Anči usnula; i umlkal, až zase pocítil na
1553
+ rameni blažený dech ospalé pozornosti.
1554
+ Posléze se Anči vzpřímila, složila ruce v klín a zamyslela se. „Já ani nevím,
1555
+ já ani nevím,“ povídá sladce, „mně se to ani nezdá možné.“
1556
+ Po nebi světlou proužkou padá hvězda. Pustoryl voní, tady spí zavřené koule
1557
+ pivoněk, jakýsi božský dech šelestí v korunách stromů. „Já bych tu tak chtěla
1558
+ zůstat,“ šeptá Anči.
1559
+ Ještě jednou bylo Prokopovi svésti němý boj s pokušením. „Dobrou noc, Anči,“
1560
+ dostal ze sebe. „Kdyby… kdyby se vrátil váš tati…“
1561
+ Anči poslušně vstala. „Dobrou noc,“ řekla a váhala; tak stáli proti sobě a
1562
+ nevěděli, co počít nebo skončit. Anči byla bledá, rozčileně mžikala a
1563
+ vypadala, jako by se chtěla odhodlat k nějakému hrdinství; ale když Prokop –
1564
+ už nadobro ztráceje hlavu – vztáhl ruku po jejím lokti, uhnula zbaběle a dala
1565
+ se na ústup. Tak šli zahradní stezičkou dobře na metr od sebe; ale když došli
1566
+ tam, co je ten nejčernější stín, patrně ztratili směr či co, neboť Prokop
1567
+ narazil zuby na nějaké čelo, políbil chvatně studený nos a našel svými ústy
1568
+ rty zoufale semknuté; tu je rozryl hrubou přesilou, lámaje děví šíji vypáčil
1569
+ jektající zuby a ukrutně líbal horoucí vláhu otevřených, sténajících úst. Pak
1570
+ už se mu vydrala z rukou, postavila se u zahradních vrátek a vzlykala. Tu ji
1571
+ běží Prokop těšit, hladí ji, rozsévá hubičky do vlasů a na ucho, na šíj a na
1572
+ záda, ale nepomáhá to; prosí, obrací k sobě mokré líčko, mokré oči, mokrou a
1573
+ štkající pusu, má ústa plná slanosti slz, celuje a hladí, a náhle vidí, že ona
1574
+ se už ničemu nebrání, že se vzdala na milost a nemilost a snad pláče nad svou
1575
+ hroznou porážkou. Nuže, všechno mužské rytířství rázem procitá v Prokopovi;
1576
+ pouští z náručí tu hromádku neštěstí a nesmírně dojat líbá jenom zoufalé prsty
1577
+ smáčené slzami a třesoucí se. Tak, tak je to lépe; a tu zas ona složí tvář na
1578
+ jeho hrubou pracku a celuje ji vlhkou, palčivou pusou a horkým dechem a
1579
+ tlukotem zrosených řas, a nedá si ji vzít. A tu i on mžiká očima a tají dech,
1580
+ aby nevzdychl mukou něhy.
1581
+ Anči zvedla hlavu. „Dobrou noc,“ povídá tiše a nastaví zcela prostě rty.
1582
+ Prokop se k nim skloní, vdechne na ně polibek, jak jemný jen umí, a už se ani
1583
+ neodváží ji doprovodit dál; stojí a trne, a pak se klidí až na druhý konec
1584
+ zahrady, kam nepronikne ani paprsek z jejího okna: stojí a vypadá, jako by se
1585
+ modlil. Nikoliv, není to modlitba; je to jen nejkrásnější noc života.
1586
+
1587
+
1588
+ XIII.
1589
+
1590
+ Když svítalo, nemohl už vydržet doma: umínil si, že poběží natrhat květin; pak
1591
+ je položí na práh Ančiny ložnice, a až ona vyskočí… Okřídlen radostí vykradl
1592
+ se Prokop z domu málem už ve čtyři ráno. Lidi, je to krása; každý květ jiskří
1593
+ jako oči (ona má mírné, veliké oči kravičky) (ona má tak dlouhé řasy) (teď
1594
+ spí, má víčka oblá a něžná jako vajíčka holubí) (bože, znát její sny) (má-li
1595
+ ruce složeny na prsou, zvedají se dechem; ale má-li je pod hlavou, tu jistě se
1596
+ jí shrnul rukáv a je vidět loket, kolečko drsné a růžové) (onehdy říkala, že
1597
+ spí dosud v železné dětské postýlce) (říkala, že v říjnu jí bude už
1598
+ devatenáct) (má na krku mateřské znamínko) (jak jen je možno, že mne má ráda,
1599
+ to je tak divné), vskutku, nic se nevyrovná kráse letního jitra, ale Prokop se
1600
+ dívá do země, usmívá se, pokud to vůbec dovede, a putuje samými závorkami až k
1601
+ řece. Tam objeví – ale u druhého břehu – poupata leknínů; tu zhrdaje vším
1602
+ nebezpečím se svlékne, vrhne se do hustého slizu zátoky, pořeže si nohy o
1603
+ nějakou zákeřnou ostřici a vrací se s náručí leknínů. Leknín je květina
1604
+ poetická, ale pouští ošklivou vodu z tučných stvolů; i běží Prokop s poetickou
1605
+ kořistí domů a přemýšlí, z čeho by udělal na svou kytku pořádnou manžetu.
1606
+ Vida, na lavičce před domem zapomněl doktor svou včerejší Političku. Prokop ji
1607
+ chutě trhá, zhola přehlížeje jakousi balkánskou mobilizaci, i to, že se houpe
1608
+ nějaké ministerstvo a že někdo v černém rámečku zemřel, oplakáván ovšem celým
1609
+ národem, a balí do toho mokré řapíky. Když pak se chtěl s pýchou podívat na
1610
+ své dílo, hrklo v něm hrozně. Na manžetě z novin našel totiž jedno slovo. Bylo
1611
+ to KRAKATIT.
1612
+ Chvíli na to strnule koukal nevěře prostě svým očím. Pak rozbalil se zimničným
1613
+ spěchem noviny, rozsypal celou nádheru leknínů po zemi a našel konečně tento
1614
+ inzerát: „KRAKATIT! Ing. P. ať udá svou adresu. Carson, hl. p.“ Nic víc.
1615
+ Prokop si vytíral oči a četl znova: „Ing. P. ať udá svou adresu. Carson.“ Co u
1616
+ všech všudy… Kdo je to, ten Carson? A jak ví, hrome, jak může vědět…
1617
+ Popadesáté četl Prokop záhadný inzerát: „KRAKATIT! Ing. P. ať udá svou
1618
+ adresu.“ A pak ještě „Carson, hl. p.“ Víc už se z toho vyčíst nedalo.
1619
+ Prokop seděl jako praštěný palicí. Proč, proč jen jsem vzal ty proklaté noviny
1620
+ do rukou, mihlo se mu zoufale hlavou. Jakže to tam je? „KRAKATIT! Ing. P. ať
1621
+ udá svou adresu.“ Ing. P., to znamená Prokop; a Krakatit, to je právě to
1622
+ zatracené místo, to zamžené místo tadyhle v mozku, ten těžký nádor, to, nač si
1623
+ netroufal myslet, s čím chodil tluka hlavou do zdí, to, co už nemělo jména, –
1624
+ jakže to tu stojí? „KRAKATIT!“ Prokop vytřeštil oči vnitřním nárazem. Najednou
1625
+ viděl… tu jistou olovnatou sůl, a rázem se mu rozvinul zmatený film paměti:
1626
+ předlouhý, zuřivý zápas v laboratoři s tou těžkou, tupou, netečnou látkou;
1627
+ slepé a sviňské pokusy, když selhávalo vše, žíravý ohmat, když vztekem ji
1628
+ drobil a drtil v prstech, leptavá chuť na jazyku a čpavý dým, únava, jíž
1629
+ usínal na židli, stud, zarytost a najednou – snad ve snu či jak – poslední
1630
+ nápad, pokus paradoxní a zázračně jednoduchý, fyzikální trik, jehož doposud
1631
+ neužil. Viděl teninké bílé jehličky, jež konečně smetl do porcelánové krabice,
1632
+ přesvědčen, že to zítra pěkně bouchne, až to zapálí v pískové jámě tam v
1633
+ polích, kde byla jeho velmi protizákonná pokusná střelnice. Viděl svou
1634
+ laboratorní lenošku, z níž čouhá koudel a dráty; tam tehdy se stočil jako
1635
+ unavený pes a patrně usnul, neboť byla úplná tma, když za strašlivé exploze a
1636
+ řinkotu skla se skácel i s lenoškou na zem. Pak přišla ta prudká bolest na
1637
+ pravé ruce, neboť něco mu ji rozseklo; a potom – potom –
1638
+ Prokop vraštil čelo bolestně prudkým rozpomínáním. Pravda, tady je přes ruku
1639
+ ta jizva. A potom jsem chtěl rozsvítit, ale žárovky byly prasklé. Pak jsem
1640
+ hmatal potmě, co se to stalo; na stole plno střepů, a tuhle, kde jsem
1641
+ pracoval, je zinkový plech pultu roztrhán, zkroucen a seškvařen a dubová
1642
+ tabule rozštípnuta, jako by do ní sjel blesk. A pak jsem nahmátl tu
1643
+ porcelánovou krabici, a byla celá, a tehdy teprve jsem se zděsil. Tohle, ano,
1644
+ tohle tedy byl Krakatit. A potom –
1645
+ Prokop už nevydržel sedět; překročil rozsypané lekníny a běhal po zahradě
1646
+ hryže si rozčilením prsty. Potom jsem někam běžel, přes pole, přes oranice,
1647
+ několikrát jsem se svalil, bože, kde to vlastně bylo? Tady byla souvislost
1648
+ vzpomínek rozhodně porušena; nepochybná je jenom hrozná bolest pod čelními
1649
+ kostmi a jakási okolnost s policií, potom jsem mluvil s Jirkou Tomšem a šli
1650
+ jsme k němu, ne, jel jsem tam drožkou; byl jsem nemocen a on mne ošetřoval.
1651
+ Jirka je hodný. Proboha, jak to bylo dál? Jirka Tomeš řekl, že jede sem, k
1652
+ tátovi, ale nejel; hleďme, je to divné; zatím já jsem spal či co –
1653
+ Tu krátce, jemně zazněl zvonek; šel jsem otevřít, a na prahu stála dívka s
1654
+ tváří zastřenou závojem.
1655
+ Prokop zasténal a zakryl si obličej rukama. Ani nevěděl, že sedí na lavičce,
1656
+ kde této noci mu bylo hladit a konejšit někoho jiného. „Bydlí tady pan Tomeš?“
1657
+ ptala se udýchaně; asi běžela, kožišinku měla zrosenou deštěm, a náhle, náhle
1658
+ zvedla oči –
1659
+ Prokop málem zavyl útrapou. Viděl ji, jako by to včera bylo: ruce, maličké
1660
+ ruce v těsných rukavičkách, rosička dechu na hustém závoji, pohled čistý a
1661
+ plný hoře; krásná, smutná a statečná. „Vy ho zachráníte, že?“ Dívá se na něho
1662
+ zblízka vážnýma, matoucíma očima a mačká nějaký balíček, nějakou silnou obálku
1663
+ s pečetěmi, tiskne ji k prsoum rozčilenýma rukama a přemáhá se všemožně –
1664
+ Prokopa jako by udeřilo do tváře. Kam jsem dal ten balíček? Ať kdokoliv je ta
1665
+ dívka: slíbil jsem, že jej odevzdám Tomšovi. Ve své nemoci… jsem na všecko
1666
+ zapomněl; nebo jsem… spíš… na to nechtěl myslet. Ale teď – Musí se teď nalézt,
1667
+ toť jasno.
1668
+ Skokem vyběhl do svého pokoje a rozhazoval zásuvky. Není, není, není tu nikde.
1669
+ Podvacáté přehazoval svých pět švestek, list po listu a kus po kuse; pak usedl
1670
+ prostřed toho strašného nepořádku jako nad zříceninami Jeruzaléma a ždímal si
1671
+ čelo. Buď to vzal doktor nebo Anči nebo řehtavá Nanda; jinak to už není možno.
1672
+ Když toto nezvratně a detektivně zjistil, pocítil jakousi nevolnost nebo
1673
+ zmatek a jako ve snu šel ke kamnům, sáhl hluboko dovnitř a vyňal… hledaný
1674
+ balíček. Přitom se mu nejasně zdálo, že jej tam kdysi uložil sám, kdysi, když
1675
+ ještě nebyl… docela zdráv; nějak se upomínal, že v onom stavu mrákot a
1676
+ blouznění jej pořád musel mít v posteli a zuřil, když mu jej brali, a že se ho
1677
+ přitom hrozně bál, neboť pojil se k němu mučivý neklid a stesk. Patrně jej tam
1678
+ se lstivostí blázna ukryl sám před sebou, aby měl od něho pokoj. Čert se
1679
+ ostatně vyznej v tajemstvích podvědomí; teď je to tady, ta silná převázaná
1680
+ obálka s pěti pečetěmi, a na ní napsáno „Pro pana Jiřího Tomše“. Snažil se
1681
+ vyčíst něco bližšího z toho zralého a pronikavého písma; ale místo toho viděl
1682
+ zastřenou dívku, jak ždímá obálku v třesoucích se prstech; teď, teď zase zvedá
1683
+ oči… Přivoněl žíznivě k balíčku: voněl slabounce a vzdáleně.
1684
+ Položil jej na stůl a kroužil dokola. Hrozně by chtěl vědět, co je tam uvnitř,
1685
+ pod pěti pečetěmi; zajisté je to těžké tajemství, nějaký poměr osudný a
1686
+ palčivý. Říkala sice, že… že to činí pro někoho jiného; ale byla tak rozčilena
1687
+ – Nicméně že by ona, ona mohla milovat Tomše: toť neuvěřitelno. Tomeš je
1688
+ darebák, zjišťoval s temným vztekem; vždycky měl u ženských štěstí, ten cynik.
1689
+ Dobrá, najdu ho a odevzdám mu tu zásilku lásky; a pak ať už je konec –
1690
+ Najednou se mu rozbřesklo v hlavě: oč že je nějaká souvislost mezi Tomšem a
1691
+ tím, jakpak se jmenuje, tím zatraceným Carsonem! Nikdo přece nevěděl a neví o
1692
+ Krakatitu; jen Tomeš Jirka to asi bůhvíjak vytento, vyšpehoval – Nový obrázek
1693
+ se sám sebou vsunul do zmateného filmu paměti: kterak tehdy on, Prokop, něco
1694
+ brebentil v horečce (to je asi byt Tomšův), a on, Jirka, se nad ním sklání a
1695
+ něco si zaznamenává v notesu. Určitě a svatosvatě to byl můj vzorec! vyžvanil
1696
+ jsem to, vylákal to ze mne, ukradl mi to a prodal to asi tomu Carsonovi!
1697
+ Prokop ustrnul nad takovou špatností. Ježíši, a tomu člověku padlo to děvče do
1698
+ rukou! Je-li co na světě jasno, tož je to: že je nutno ji zachránit, stůj co
1699
+ stůj!
1700
+ Dobrá, nejprve musím nalézt Tomše, zloděje; dám mu tady ten zapečetěný balíček
1701
+ a mimoto mu vyrazím zuby. Dále, mám ho jednoduše v hrsti: musí mně říci jméno
1702
+ a pobyt toho děvčete a zavázat se – ne; žádné sliby od takového ničemy. Ale
1703
+ půjdu k ní a řeknu jí vše. A potom zmizím navždy z jejích očí.
1704
+ Uspokojen tímto rytířským řešením stanul Prokop nad nešťastnou obálkou. Ach,
1705
+ vědět jen to, jen to jediné, zda byla milenkou Tomšovou! Zase ji viděl, jak
1706
+ stojí, sličná a silná; ani pohledem, ani mžiknutím tehdy nezavadila o hříšné
1707
+ lože Tomšovo. Což bylo by možno tak lhát očima, tak lhát takovýma očima –
1708
+ Tu syknuv utrpením zlomil pečetě, přerval provázek a roztrhl obálku. Byly tam
1709
+ bankovky a dopis.
1710
+
1711
+
1712
+ XIV.
1713
+
1714
+ Zatím už doktor Tomeš sedí u snídaně funě a bruče po těžkém porodu; přitom
1715
+ vrhá na Anči pohledy zkoumavé a nespokojené. Anči sedí jako zařezaná, nejí,
1716
+ nepije, nevěří prostě svým očím, že se Prokop ještě neukázal; nějak se jí
1717
+ třesou rty, patrně užuž přijdou slzy. Tu vejde Prokop jaksi zbytečně rázně, je
1718
+ bledý a nemůže si ani sednout, jak má naspěch; jen taktak že pozdraví,
1719
+ přeběhne Anči očima, jako by ji ani neznal, a hned se ptá s popudlivou
1720
+ netrpělivostí: „Kde je teď váš Jirka?“
1721
+ Doktor se užasle otočil: „Cože?“
1722
+ „Kde je teď váš syn,“ opakuje Prokop a sžehuje ho umíněnýma očima.
1723
+ „Copak já vím?“ zavrčí doktor. „Já o něm nechci vědět.“
1724
+ „Je v Praze?“ naléhá Prokop zatínaje pěstě. Doktor mlčí, ale něco v něm prudce
1725
+ pracuje.
1726
+ „Musím s ním mluvit,“ drtí Prokop. „Musím, slyšíte? Musím jet za ním, ještě
1727
+ teď, hned! Kde je?“
1728
+ Doktor něco přemílá čelistmi a jde ke dveřím.
1729
+ „Kde je? Kde bydlí?“
1730
+ „Nevím,“ rozkřikl se doktor nesvým hlasem a práskl dveřmi.
1731
+ Prokop se obrátil k Anči. Seděla strnulá a upírala velikánské oči nikam.
1732
+ „Anči,“ drmolil Prokop zimničně, „musíte mi říci, kde váš Jirka je. Já… já
1733
+ musím za ním jet, víte? To je totiž… taková věc… Zkrátka jde tu o některé
1734
+ věci… Já… Přečtěte si to,“ řekl honem a strkal jí před oči sežmolený kus
1735
+ novin. Anči však viděla jenom jakési kruhy.
1736
+ „To je můj vynález, rozumíte?“ vysvětloval nervózně. „Hledají mne, nějaký
1737
+ Hanson – Kde je váš Jiří?“
1738
+ „Nevíme,“ šeptala Anči. „Už dva… už dva roky nám nepsal –“
1739
+ „Ach,“ utrhl se Prokop a vztekle zmačkal noviny. Děvče zkamenělo, jen oči jí
1740
+ rostly a rostly a mezi pootevřenými rty jí dýchalo něco zmateně žalostného.
1741
+ Prokop by se nejraději propadl. „Anči,“ rozřízl posléze mučivé ticho, „já se
1742
+ vrátím. Já… za několik dní… Tohle je totiž vážná věc. Člověk… musí konečně
1743
+ myslet… na své povolání. A má, víte, jisté… jisté povinnosti…“ (Bože, ten to
1744
+ zkopal!) „Pochopte, že… Já prostě musím,“ křikl najednou. „Raději bych zemřel
1745
+ než nejel, rozumíte?“
1746
+ Anči jen maličko kývla hlavou. Ach, kdyby byla pokývla víc, byla by jí, bum,
1747
+ hlava klesla na stůl v hlasitém pláči; ale takto se jí jen zalily oči a to
1748
+ ostatní mohla ještě spolknout.
1749
+ „Anči,“ bručel Prokop v zoufalých rozpacích a zachraňoval se ke dveřím, „ani
1750
+ se nebudu loučit; hleďte, nestojí to za to; za týden, za měsíc tu budu zas…
1751
+ Nu, hleďte –“ Ani se na ni nemohl podívat; seděla jako tupá, s plihými rameny,
1752
+ očima nevidomýma a nosem, jenž nabíhal vnitřním pláčem; žalno ji vidět.
1753
+ „Anči,“ pokusil se znovu a zas toho nechal. Nekonečná se mu zdála ta poslední
1754
+ chvilka ve dveřích; cítil, že by měl něco ještě říci nebo něco udělat, ale
1755
+ místo všeho vysoukal ze sebe jakési „na shledanou“ a trapně se vytratil.
1756
+ Jako zloděj, po špičkách, opouštěl dům. Zaváhal ještě u dveří, za nimiž nechal
1757
+ Anči. Bylo tam uvnitř ticho, jež ho sevřelo nevýslovnou trýzní. V domovních
1758
+ dveřích se zarazil jako ten, kdo na něco zapomněl, a vracel se po špičkách do
1759
+ kuchyně; bohudík, Nanda tam nebyla, i zamířil k poličce. „… ATIT!… adresu.
1760
+ Carson, hl. p.“ To stálo na kuse novin, jež veselá Nanda cípatě nastříhala na
1761
+ poličku. Tu tam pro ni položil plnou hrst peněz za všechnu její službu, a
1762
+ zmizel.
1763
+ Prokope, Prokope, tak nejedná člověk, který se chce za týden vrátit!
1764
+ „To to ’de, to to ’de,“ skanduje vlak; ale lidské netrpělivosti už ani nestačí
1765
+ jeho lomozný, drkotavý spěch; lidská netrpělivost se zoufale vrtí, pořád
1766
+ vytahuje hodinky a kope kolem sebe v posunčině nervózy. Jedna, dvě, tři,
1767
+ čtyři: to jsou telegrafní tyče. Stromy, pole, stromy, strážní domek, stromy,
1768
+ břeh, břeh, plot a pole. Jedenáct hodin sedmnáct. Řepné pole, ženské v modrých
1769
+ zástěrách, dům, psisko, jež si vzalo do hlavy předhonit vlak, pole, pole,
1770
+ pole. Jedenáct hodin sedmnáct. Bože, což ten čas stojí? Raději na to nemyslet;
1771
+ zavřít oči a počítat do tisíce; říkat si otčenáš nebo chemické vzorce. „To to
1772
+ ’de, to to ’de!“ Jedenáct hodin osmnáct. Bože, co počít?
1773
+ Prokop se vytrhl. „KRAKATIT,“ padlo mu odněkud do očí, až se lekl. Kde je to?
1774
+ Aha, to soused naproti čte noviny, a na zadní straně je zas ten inzerát.
1775
+ „KRAKATIT! Ing. P. ať udá svou adresu. Carson, hl. p.“ Ať mi dá pokoj ten pan
1776
+ Carson, myslí si Ing. P.; nicméně na nejbližší stanici shání všechny noviny,
1777
+ co jich plodí požehnaná vlast. Bylo to ve všech, a ve všech stejně: „KRAKATIT!
1778
+ Ing. P. ať udá…“ U všech rohatých, diví se Ing. P., to je po mně nějaká
1779
+ sháňka! Nač mne potřebují, když jim to už Tomeš prodal?
1780
+ Ale místo aby řešil tuto podstatnou záhadu, podíval se, není-li pozorován, a
1781
+ vytáhl snad už posté onu povědomou roztrženou obálku. S všelijakými okolky,
1782
+ jež mu působily silnou rozkoš odkladu, po různém potěžkávání a otáčení vyňal z
1783
+ jejího nitra napěchovaného penězi zas onen dopis, onen drahocenný dopis psaný
1784
+ písmem zralým a energickým. „Pane Tomši,“ četl znovu dychtivě, „toto nedělám
1785
+ pro Vás, ale pro svou sestru. Šílí od té chvíle, kdy jste jí poslal svůj
1786
+ strašlivý dopis. Chtěla prodat všechny své šaty a šperky, aby Vám poslala
1787
+ peníze; musela jsem ji vší mocí zdržet, aby neprovedla něco, co by pak nemohla
1788
+ utajit před svým mužem. Co Vám posílám, jsou mé vlastní peníze; vím, že je
1789
+ přijmete bez zbytečných rozpaků, a prosím, abyste mi neděkoval. L.“ K tomu
1790
+ chvatně připsáno: „Pro živého boha, nechte už M. na pokoji! Dala vše, co má;
1791
+ dala vám více, než bylo její; trnu hrůzou, co bude, vyjde-li to najevo. Prosím
1792
+ Vás pro vše na světě, nezneužívejte svého strašného vlivu na ni! Bylo by
1793
+ příliš podlé, kdybyste –“ Zbytek věty byl přeškrtán, a následovalo ještě jedno
1794
+ postskriptum: „Poděkujte za mne svému příteli, který vám toto doručí. Byl ke
1795
+ mně nezapomenutelně laskav ve chvíli, kdy jsem nejvíc potřebovala lidské
1796
+ pomoci.“
1797
+ Prokopa zrovna drtila přemíra těžkého štěstí. Nebyla tedy Tomšova! A nikoho
1798
+ neměla, o koho by se mohla opřít! Statečné děvče a ženerózní, čtyřicet tisíc
1799
+ sehnala, aby zachránila svou sestru před… patrně před nějakou ostudou! Těchto
1800
+ čtyřicet tisíc je z banky; jsou ještě opatřeny páskou, jak je vyzvedla, – u
1801
+ čerta, proč na té pásce není jméno banky? A dalších deset tisíc vymetla kdoví
1802
+ kde a jak; neboť jsou mezi nimi drobné bankovky, ubohé špinavé pětikoruny,
1803
+ zchátralé hadříky z bůhvíjakých rukou, zmuchlané peníze ženských tobolek;
1804
+ bože, co rozčilující sháňky ji muselo stát, než sehnala tuhle hrst peněz! „Byl
1805
+ ke mně nezapomenutelně laskav…“ V tu chvíli by Prokop rozmlátil Tomše, bídníka
1806
+ nesvědomitého a mrzkého; ale zároveň mu vše jaksi odpouštěl… neboť nebyla jeho
1807
+ milenkou! Nebyla Tomšova: to přece přinejmenším znamená, že je to svatosvatě
1808
+ anděl nejčistší a nejdokonalejší; a tu mu bylo, jako by se nějaká neznámá rána
1809
+ zacelovala v jeho srdci prudce a zrovna bolestně.
1810
+ Ano, nalézt ji; musím jí především… především vrátit tyhle její peníze (ani se
1811
+ nestyděl za záminku tak průhlednou) a říci jí, že… že zkrátka… že může na mne
1812
+ počítat, stran Tomše a vůbec… „Byl ke mně nezapomenutelně laskav.“ Prokop až
1813
+ sepjal ruce: bože, co vše jsem odhodlán učinit, abych si zasloužil tahle slova
1814
+
1815
+ Ó-ó, jak ten vlak pomalu jede!
1816
+
1817
+
1818
+ XV.
1819
+
1820
+ Jakmile přistál v Praze, hnal se do Tomšova bytu. U Muzea se zarazil:
1821
+ Zatraceně, kde vlastně Tomeš bydlí? Šel jsem, ano, šel jsem tehdy, otřásán
1822
+ zimnicí, na dráhu podle Muzea; ale odkud? Z které ulice? Zuře a klna bloudil
1823
+ Prokop kolem Muzea, hledaje pravděpodobný směr; nenašel nic, i pustil se na
1824
+ policejní ředitelství, oddělení dotazy. Jiří Tomeš, listoval zaprášený oficiál
1825
+ v knihách, inženýr Tomeš Jiří, to je prosím na Smíchově, ulice ta a ta. Byla
1826
+ to patrně stará adresa. Nicméně letěl Prokop na Smíchov do ulice té a té.
1827
+ Domovník kroutil hlavou, když se ho ptal po Jiřím Tomši. Toť že tu ten jistý
1828
+ bydlel, ale už víc než před rokem; kde bydlí teď, neví nikdo; ostatně nechal
1829
+ tu po sobě všelijaké dluhy –
1830
+ Zdrcen zalezl Prokop do nějaké kavárny. „KRAKATIT,“ padlo mu do očí na zadní
1831
+ stránce novin. „Ing. P. ať udá svou adresu. Carson, hl. p.“ Nuže, jistě ví o
1832
+ Tomšovi ten jistý Carson: už to tak je, že je mezi nimi jakási souvislost.
1833
+ Dobře tedy, tady je lístek: „Carson, hlavní pošta. Přijďte zítra v poledne do
1834
+ kavárny té a té. Ing. Prokop.“ Jen to napsal, a už ho napadla nová myšlenka:
1835
+ totiž dluhy. Sebral se a utíkal k soudu, oddělení pro pohledávky. A hle, zde
1836
+ tuze dobře znali adresu pana Tomše: celá hromada nedoručitelných obsílek,
1837
+ soudních upomínek a tak dále; ale zdá se, že ten jistý Tomeš Jiří zmizel beze
1838
+ stopy a zejména bez udání nynějšího pobytu. Přesto se vrhl Prokop za novou
1839
+ adresou. Domovnice, osvěžena slušnou odměnou, hned poznala Prokopa, že tu
1840
+ jednou přespal; i spustila přeochotně, že pan inženýr Tomeš je šejdíř a
1841
+ darebák; dále, že zrovna tehdy v noci odejel a nechal tu jeho, pána, jí
1842
+ domovnici na starost; že ona třikrát přišla nahoru se optat, potřebuje-li
1843
+ čeho, ale že on, pán, jen pořád spal a mluvil ze spaní, a pak odpoledne
1844
+ zmizel. A kdeže jářku je pan Tomeš? Inu, tenkrát tedy odejel a nechal tu
1845
+ všecko stát a ležet a ještě se nevrátil; jen poslal peníze odněkud z ciziny,
1846
+ ale je už zas dlužen za nový kvartál. Prý mu prodají v soudní dražbě svršky,
1847
+ nepřihlásí-li se do konce měsíce. Nadělal prý dluhů asi za čtvrt miliónu, nu,
1848
+ a utekl. Prokop podrobil výtečnou ženu křížovému výslechu: je-li jí co známo o
1849
+ nějaké paničce, která prý měla s panem Tomšem poměr, kdo sem chodíval a
1850
+ podobně. Domovnice nevěděla dohromady nic; co se týče ženských, chodilo jich
1851
+ sem asi dvacet, takové se závojem na hubě, i jinačí, našminkované a všelijaké;
1852
+ říkám vám, byla to ostuda po celé ulici. Prokop jí tedy zaplatil dlužný
1853
+ kvartál ze svého, a za to dostal klíč od Tomšova bytu.
1854
+ Bylo tam cítit jakousi ztuchlinu bytu dlouho neužívaného a skoro odumřelého.
1855
+ Teprve teď si Prokop všiml divné nádhery místa, kde zápasil s horečkou. Všude
1856
+ perské koberce a bucharské či jaké polštáře, na stěnách nahoty a gobelíny,
1857
+ orient a klubovky, toaletní stůl subrety a koupelna prvotřídní prostitutky,
1858
+ směs přepychu a sprostoty, smilstva a lajdáctví. A zde, uprostřed všech těch
1859
+ svinstev, stála tehdy ona tisknouc k prsoum balíček; upírá čisté, hořeplné oči
1860
+ k zemi, a teď, bože můj, je zvedá v statečné a ryzí důvěře… Proboha, co si
1861
+ musela o mně myslet, když mne potkala v tomhle pelechu! Musím ji nalézt,
1862
+ aspoň… aspoň proto, abych jí vrátil její peníze; i kdyby nešlo o nic jiného, o
1863
+ nic většího… Je naprosto nutno ji nalézt!
1864
+ To se lehko řekne; ale jak? Prokop si hryzl rty v úporném přemýšlení. Kdybych
1865
+ aspoň věděl, kde hledat Jirku, říkal si; konečně padl na hromadu
1866
+ korespondence, která tu čekala na Tomše. Většinou to byly, jak zřejmo,
1867
+ obchodní dopisy, patrně samé účty. Pak několik soukromých listů, jež obracel a
1868
+ očichával váhaje. Možná, možná že v některém je nějaká stopa, adresa nebo
1869
+ cokoliv, co by jej vedlo za ním… nebo za ní! Hrdinně odolával pokušení otevřít
1870
+ aspoň jeden dopis; ale byl tu tak sám za kalnými okny, a všechno tu zrovna
1871
+ vydechuje nějakou mrzkou a tajnou hanebnost. A tu, rychle polykaje všechny
1872
+ rozpaky, trhal Prokop obálky a četl list po listu. Účet za perské koberce, za
1873
+ květiny, za tři psací stroje; velmi důtklivé upomínky, aby vyúčtoval zboží
1874
+ dané do komise; jakési záhadné transakce týkající se koní, cizích valut a
1875
+ dvaceti vagónů kulatého dříví kdesi u Kremnice. Prokop nevěřil svým očím;
1876
+ podle těchto papírů byl Tomeš buď pašerák ve velkém, nebo agent s perskými
1877
+ koberci, nebo valutní spekulant, nejspíš ale všecko troje; vedle toho
1878
+ obchodoval s automobily, vývozními certifikáty, kancelářským nábytkem a patrně
1879
+ vším možným. V jednom dopise je řeč o jakýchsi dvou miliónech, zatímco druhý,
1880
+ usmolený a psaný tužkou, hrozí žalobou pro vylákanou starožitnost (staro bili
1881
+ ring podědovi). Úhrnem to vypadalo na celou řadu podvodů, zpronevěru,
1882
+ falšování vývozních listin a jiné paragrafy, pokud tomu Prokop vůbec rozuměl;
1883
+ je prostě úžasné, že to dosud neprasklo. Jeden advokát stručně sděloval, že
1884
+ firma ta a ta podala na pana Tomše trestní oznámení pro zpronevěru čtyřiceti
1885
+ tisíc korun; ať se pan Tomeš ve vlastním zájmu dostaví do kanceláře atd.
1886
+ Prokop se zhrozil; až tohle propukne, kam až stříkne hanba těchto nevýslovných
1887
+ špinavostí? Vzpomněl si na tichý dům v Týnici a na tu, jež tady stála, zoufale
1888
+ odhodlána zachránit toho člověka. I sebral celou tu obchodní korespondenci
1889
+ firmy Tomeš a běžel ji spálit v kamnech. Bylo tam plno zuhelnatělých papírů.
1890
+ Patrně sám Tomeš týmž způsobem zjednodušoval poměry, než ujel.
1891
+ Dobrá, to byly obchodní papíry; zbývá ještě několik zcela soukromých dopisů
1892
+ jemných anebo uboze umazaných, a nad nimi Prokop váhá znovu v palčivém studu.
1893
+ U všech všudy, co jiného mohu udělat? Dusil se sice hanbou, ale trhal chvatně
1894
+ další obálky. Zde pár lepkavých důvěrností, miláčku, vzpomínám, nová schůzka a
1895
+ dost. Nějaká Anna Chválová s dojemnými pravopisnými chybami sděluje, že
1896
+ Jeníček zemřel „na vyrážku“. Tady kdosi upozorňuje, že ví „něco, co by
1897
+ zajímalo na policii“, ale že by dal se sebou mluvit, a že pan Tomeš „jistě ví,
1898
+ jakou cenu má taková dikrétnost“; k tomu narážka na „ten dům v Břet. ul., kde
1899
+ pan Tomeš ví, koho má hledat, aby to zůstalo pod pokličkou“. Zas něco o
1900
+ jakémsi obchodě, o prodaných dluhopisech, podepsáno „Tvá Růža“. Táž Růža
1901
+ sděluje, že její muž odejel. Táž ruka jako na čísle 1, dopis z lázní: nic než
1902
+ kravské sentimentality, rozvalená erotika zralé a tučné blondýny, ocukrovaná
1903
+ samými ach, výčitkami a krasocity, a k tomu „drahouši“ a „divochu“ a podobné
1904
+ ohavnosti; Prokopovi se z toho obracel žaludek. Německý dopis, písmeno „G.“,
1905
+ valutní obchod, prodej ty papíry, erwarte Dich, P. S. Achtung, K. aus Hamburg
1906
+ eingetroffen. Táž „G“, uražený a chvatný dopis, mrazivé vykání, vraťte těch
1907
+ deset tisíc, sonst wird K. dahinterkommen, hm. Prokop se k smrti styděl vnikat
1908
+ do navoněného přítmí těchto spodničkových záležitostí, ale teď už se nelze
1909
+ zastavit. Konečně čtyři dopisy signované M.: listy slzavé, horečné a trapné, z
1910
+ nichž dýchala těžká a vášnivá historie nějaké slepé, dusné, otrocké lásky.
1911
+ Byly tu úpěnlivé prosby, plazení v prachu, zoufalé inkriminace, strašné
1912
+ sebenabízení a ještě strašnější sebetrýzeň; zmínka o dětech, o muži, nabídka
1913
+ nové půjčky, nejasné narážky a přespříliš jasná zbědovanost ženy usmýkané
1914
+ láskou. Tohle tedy je její sestra! Prokopovi bylo, jako by viděl před sebou
1915
+ výsměšná a krutá ústa, pichlavé oči, panskou a zpupnou, sebevědomou,
1916
+ sebejistou hlavu Tomšovu: byl by do ní udeřil pěstí. Avšak nic platno: tato
1917
+ žalostně obnažená láska ženina mu neřekla toho nejmenšího o… o té druhé, jež
1918
+ dosud nemá pro něho jména a kterou jest mu hledati.
1919
+ Nezbývá tedy než nalézti Tomše.
1920
+
1921
+
1922
+ XVI.
1923
+
1924
+ Nalézti Tomše: lidi, jako by tohle bylo tak lehké! Prokop provedl znovu
1925
+ generální prohlídku celého bytu; řádil ve všech skříních i zásuvkách,
1926
+ nenacházeje krom prašiviny starých účtů, milostných dopisů, fotografií a
1927
+ jiného mládeneckého neřádu nic, co by jakkoliv osvětlilo Tomšovu záležitost.
1928
+ Nu ovšem, má-li někdo tolik másla na hlavě, dovede už důkladně zmizet!
1929
+ Znovu vyslechl domovnici; zvěděl sice záplavu všelijakých historek, ale nic,
1930
+ co by ho uvedlo na stopu. Šel na pana domácího, odkudže poslal Tomeš ty peníze
1931
+ z ciziny. Bylo mu vyslechnouti celé kázání nevrlého a dosti nepříjemného
1932
+ staříka, který trpěl všemi možnými katary a nadával na zkaženost dnešních
1933
+ mladých pánů. Za cenu nadlidské trpělivosti zvěděl konečně jen to, že řečené
1934
+ peníze neposlal pan Tomeš, nýbrž jakýsi směnárník na konto Drážďanské banky
1935
+ „auf Befehl des Herrn Tomes“. Rozběhl se k advokátovi, který měl, jak výše
1936
+ sděleno, jistou rozpracovanou záležitost s pohřešovaným. Advokát se zbytečně
1937
+ halil v profesionální tajemství; ale když Prokop hloupě vybleptl, že má panu
1938
+ Tomšovi doručit nějaké peníze, oživl advokát a žádal, aby je složil do jeho
1939
+ rukou; i dalo Prokopovi mnoho práce, aby se z toho vymotal. To jej poučilo,
1940
+ aby nepátral po Tomšovi u lidí, kteří s ním měli jakékoliv obchodní řízení.
1941
+ Na nejbližším rohu zůstal stát: Co teď? Zbývá jen Carson. Neznámá veličina,
1942
+ jež o něčem ví a něco chce. Dobrá, tedy Carson. Prokop nahmatal v kapse
1943
+ lístek, jejž zapomněl poslat, a rozběhl se na poštu.
1944
+ Ale u poštovní schránky mu klesla ruka. Carson, Carson, – ano, ale tomu jde o
1945
+ cosi, co… také není maličkost. U čerta, ten chlap něco ví o Krakatitu a má za
1946
+ lubem – inu bůhsámví co. Proč vůbec mne shání? Patrně Tomeš neví vše; nebo
1947
+ nechtěl vše prodat; nebo si klade nestydaté podmínky, a já osel mám být
1948
+ lacinější. Tak asi to je; ale (a tu se Prokop poprvé zhrozil dosahu věci) což
1949
+ je vůbec možno vyrukovat s Krakatitem ven? Především by se muselo u sta hromů
1950
+ pořádně vědět, co to dělá a k čemu je to dobré, jak se s tím zachází a kdesi
1951
+ cosi; Krakatit, holenku, to není šňupavý tabák nebo zasýpací prášek pro děti.
1952
+ A za druhé, za druhé snad je to vůbec… příliš silný tabák pro tento svět.
1953
+ Představme si, co by se s tím mohlo natropit… řekněme ve válce. Prokopovi
1954
+ začalo být z celé věci až úzko. Který čert sem nese toho zatraceného Carsona?
1955
+ Prokristapána, musí se za každou cenu zabránit –
1956
+ Prokop se chytil za hlavu tak, až se zastavovali lidé. Vždyť, proboha,
1957
+ zanechal tam nahoře, ve svém laboratorním baráku u Hybšmonky, v porcelánové
1958
+ dózi skoro patnáct deka Krakatitu! tedy zrovna dost, aby to mohlo rozmlátit já
1959
+ nevím co, celé hejtmanství! Přímo ztuhl úděsem, a pak se pustil tryskem k
1960
+ tramvaji: jako by teď ještě záleželo na těch několika minutách! Trpěl pekelně,
1961
+ než se tramvaj dovlekla na druhý břeh; pak ztekl cvalem košířskou stráň a
1962
+ uháněl k svému baráku. Bylo zamčeno, a Prokop marně hledal po kapsách něco
1963
+ podobného klíči; i rozhlédl se soumrakem jako zloděj, rozbil okenní tabulku,
1964
+ otevřel závory a vlezl oknem domů.
1965
+ Jen rozškrtl sirku a už viděl, že je co nejmetodičtěji vyloupen. Totiž peřiny
1966
+ a takové krámy tu zůstaly; ale všechny lahvičky, kelímky a zkumavky, crushery,
1967
+ hmoždíře, misky a přístroje, lžíce a váhy, celá jeho primitivní chemická
1968
+ kuchyně, vše, co obsahovalo jeho pokusné hmoty, vše, na čem mohla být jen
1969
+ usazenina či nálet nějaké chemikálie, vše zmizelo. Pryč je porcelánová dóza s
1970
+ Krakatitem. Vytrhl zásuvku stolu: veškeré jeho zápisky a záznamy, každý
1971
+ počmáraný útržek papíru, sebemenší památka dvanáctileté pokusné práce, vše
1972
+ bylo to tam. Dokonce i s podlahy byly seškrabány skvrny a stopy jeho práce, a
1973
+ jeho pracovní hazuka, ta stará, potřísněná, lučebninami zrovna zkornatělá
1974
+ halena byla pryč. Hrdlo se mu sevřelo návalem pláče. Tohle tedy, tohle mi
1975
+ udělali!
1976
+ Dlouho do noci seděl na svém vojanském kavalci a strnule zíral do vypleněné
1977
+ pracovny. Chvílemi se utěšoval, že si snad vzpomene na vše, co během dvanácti
1978
+ let psal do svých poznámek; ale když namátkou vybral některý experiment a
1979
+ chtěl si jej popaměti v hlavě zopakovat, nemohl z místa přes úsilí
1980
+ nejzoufalejší; tu hryzal si rozbité prsty a sténal.
1981
+ Náhle se probudil zarachocením klíče. Je čiročiré ráno a do pracovny jakoby
1982
+ nic vchází cizí člověk a rovnou ke stolu. Tam teď sedí s kloboukem na hlavě,
1983
+ bručí a pečlivě oškrabuje na stole zinek. Prokop se posadil na kavalci a
1984
+ vyhrkl: „Člověče, co tu chcete?“
1985
+ Člověk se obrátil nesmírně překvapen a beze slova koukal na Prokopa.
1986
+ „Co tu chcete?“ opakoval Prokop podrážděně. Chlapík nic; ještě si ke všemu
1987
+ nasadil skla a brejlil na Prokopa s ohromným zájmem.
1988
+ Prokop zaskřípal zuby, neboť se v něm už vařila hrozná nadávka. Ale tu
1989
+ človíček vlídně zazářil, vymrštil se ze židle a vypadal najednou, jako by
1990
+ radostně vrtěl ocasem. „Carson,“ řekl honem a spustil po německu: „Bože, to
1991
+ jsem rád, že jste se vrátil! Četl jste můj inzerát?“
1992
+ „Četl,“ odpovídal Prokop tvrdou a centovou němčinou. „A co tu hledáte?“
1993
+ „Vás,“ povídal host báječně potěšen. „Víte, že vás honím už po šest neděl?
1994
+ Všecky noviny, všecky detektivní ústavy, haha, pane! co tomu říkáte? Hergot,
1995
+ to mám radost! Jak se vede? Zdráv?“
1996
+ „Proč jste mne vykradl?“ ptal se Prokop mračně.
1997
+ „Jak prosím?“
1998
+ „Proč jste mne vykradl!“
1999
+ „Ale pane inženýre,“ sypal blažený mužík pranic nedotčen. „Co to říkáte?
2000
+ Vykradl! Carson! To je ohromné, hahaha!“
2001
+ „Vykradl,“ opakoval Prokop umíněně.
2002
+ „Tatata,“ protestoval pan Carson. „Schoval. Všecko uložil. Pane, jak jste to
2003
+ tu mohl nechat ležet? Někdo vám to mohl ukrást, ne? Co? Ovšem že mohl, pane.
2004
+ Ukrást, prodat, publikovat, že? To se rozumí, pane. Mohl. Ale já jsem vám to
2005
+ schoval, rozumíte? Čestné slovo. Proto jsem vás hledal. Všecko vrátím. Všecko.
2006
+ To jest,“ dodával váhavě, a pod zářivými brýlemi to ocelově utkvělo. „Totiž…
2007
+ budete-li rozumný. Vždyť my se dohodneme, co?“ dodával rychle. „Musíte se
2008
+ habilitovat. Ohromná kariéra. Atomové výbuchy, rozbití prvků, báječné věci.
2009
+ Věda, především věda! My se dohodneme, že? Čestné slovo, dostanete všecko
2010
+ zpátky. Tak.“
2011
+ Prokop mlčel, ohromen tímto přívalem slov, zatímco pan Carson házel rukama a
2012
+ kroužil po pracovně náramně rozradován. „Všecko, všecko jsem vám schoval,“
2013
+ mlel jaře. „Každou třísku z podlahy. Roztříděno, uloženo, s vinětou, pod
2014
+ pečetí. Haha, mohl jsem se vším ujet, že? Ale já jsem poctivec, pane. Všecko
2015
+ vrátím. Musíme se domluvit. Ptejte se na Carsona. Rodilý Dán, dříve docent v
2016
+ Kodani. Taky jsem dělal vědu, božskou vědu. Jak to řekl Schiller? Dem einen
2017
+ ist sie – ist sie – Už nevím, ale je to něco o vědě; švanda, že? Nu, ještě mi
2018
+ neděkujte. Až později. Tak.“
2019
+ Prokopovi sice ani nenapadlo děkovat, ale pan Carson zářil jako šťastný
2020
+ dobrodinec. „Na vašem místě,“ drmolil nadšeně, „na vašem místě bych si zařídil
2021
+ –“
2022
+ „Kde je teď Tomeš?“ pře rušil ho Prokop.
2023
+ Pan Carson vysunul zkoumavý pohled. „Nu,“ vycedil obezřele, „my o něm víme. Eh
2024
+ co,“ obrátil hbitě. „Zařídíte si… zařídíte si největší laboratoř světa.
2025
+ Nejlepší přístroje. Světový ústav destruktivní chemie. Máte pravdu, katedra je
2026
+ hloupost. Odříkávat staré věci, no ne? Škoda času. Zařiďte si to po
2027
+ amerikánsku. Ohromný ústav, brigáda asistentů, všechno, co chcete. A o peníze
2028
+ se nemusíte starat. Punktum. Kde snídáte? Já bych vás ohromně rád pozval.“
2029
+ „Co vlastně chcete?“ vydralo se z Prokopa.
2030
+ Tu sedl pan Carson na kavalec vedle něho, vzal ho nesmírně vřele za ruku a
2031
+ povídal najednou docela jiným hlasem: „Jen se neplašte. Můžete vydělat celou
2032
+ hromadu miliónů.“
2033
+
2034
+
2035
+ XVII.
2036
+
2037
+ Prokop s úžasem vzhlédl na pana Carsona. Kupodivu, teď už to nebyla ta
2038
+ mopsličí tvář lesknoucí se blahem; všecko zvážnělo a zpřísnělo na horlivém
2039
+ mužíkovi, oči zapadly pod těžkými víčky a jen chvílemi se zařízly matným
2040
+ břitem. „Nebuďte blázen,“ pronesl důrazně. „Prodejte nám Krakatit, a je to.“
2041
+ „Jak vůbec víte…,“ zahučel Prokop.
2042
+ „Všecko vám povím. Čestné slovo, všecko. Byl u nás pan Tomeš. Přinesl patnáct
2043
+ deka a formuli. Bohužel nepřinesl taky postup. Ani on, ani naši chemikové
2044
+ dosud na to nepřišli, jak to dostat dohromady. Nějaký trik, že?“
2045
+ „Ano.“
2046
+ „Hm. Třeba se na to přijde i bez vás.“
2047
+ „Nepřijde.“
2048
+ „Pan Tomeš… něco o tom ví, ale dělá s tím tajnosti. Pracoval u nás při
2049
+ zamčených dveřích. Je hrozně špatný chemik, ale je chytřejší než vy. Aspoň
2050
+ nežvaní o tom, co ví. Proč jste mu to říkal? Neumí nic, jen pumpovat zálohy.
2051
+ Měl jste přijít sám.“
2052
+ „Já ho k vám neposlal,“ bručel Prokop.
2053
+ „Aha,“ spustil pan Carson, „ohromně zajímavé. K nám přišel ten váš pan Tomeš
2054
+ –“
2055
+ „Kam vlastně?“
2056
+ „K nám. Továrny v Balttin. Znáte?“
2057
+ „Neznám.“
2058
+ „Zahraniční podnik. Báječně moderní. Pokusná laboratoř s novými třaskavinami.
2059
+ Děláme keranit, metylnitrát, žlutý prach a takové věci. Hlavně armádní, víte?
2060
+ Tajné patenty. Vy nám prodáte Krakatit, co?“
2061
+ „Ne. A Tomeš je tam u vás?“
2062
+ „Aha, pan Tomeš; počkejte, to je švanda. Tak tedy k nám přijde a povídá: Tohle
2063
+ je odkaz mého přítele, geniálního chemika Prokopa. Umřel mně v náruči a
2064
+ posledním dechem, haha, mně svěřil, hahaha, ohromné, co?“
2065
+ Prokop se jen křivě usmál. „A je Tomeš dosud… v Balttinu?“
2066
+ „Počkejte. To se rozumí, nejdřív jsme ho zadrželi… jako špióna. K nám jich
2067
+ chodí spousta, víte? A ten prášek, Krakatit, jsme dali přezkoušet.“
2068
+ „Výsledek?“
2069
+ Pan Carson zvedl ruce k nebi. „Bá-báječný!“
2070
+ „Jaká je detonační rychlost? Jaké jste našli Q? Jaké t? Čísla!“
2071
+ Pan Carson spustil ruce, až to pláclo, a vyvalil užasle oči: „Člověče, jakápak
2072
+ čísla! První pokus… padesát procent škrobu… a crusher gauge se roztrhl na
2073
+ střepy; jeden inženýr a dva laboranti… taky na střepy. Věřil byste? Pokus
2074
+ číslo dvě: Trauzlův blok, devadesát procent vazelíny, a bum! sebralo to
2075
+ střechu a jeden dělník zabit; z bloku zůstal jen škvarek. Tak se do toho
2076
+ pustili vojáci; smáli se nám… že to umíme jako… vesnický kovář. Dali jsme jim
2077
+ trochu; nacpali to do dělové hlavně, s rozemletým dřevěným uhlím. Ohromný
2078
+ výsledek. Sedm kanonýrů i se setníkem… Jednu nohu pak našli tři kilometry
2079
+ daleko. Za dva dny dvanáct mrtvých, tu máte čísla, haha! Báječné, co?“
2080
+ Prokop chtěl něco říci, ale spolkl to. Dvanáct mrtvých za dva dny, u čerta!
2081
+ Pan Carson si hladil kolena a zářil. „Třetí den jsme si dali pokoj. Víte, dělá
2082
+ to špatný dojem, když… je mnoho takových případů. Dali jsme jen flegmatizovat
2083
+ Krakatit… asi tři decigramy… v glycerínu a podobně. Prase laborant nechal asi
2084
+ špetku volně ležet, a v noci, když byla laboratoř zamčena –“
2085
+ „– to vybuchlo,“ vyhrkl Prokop.
2086
+ „Ano. V deset třicet pět. Laboratoř byla na třísky, krom toho asi dva objekty…
2087
+ Vzalo to s sebou nějaké tři tuny metylnitrátu Probst – Zkrátka asi šedesát
2088
+ mrtvých, no. To se ví, náramné vyšetřování a kdesi cosi. Ukázalo se, že nikdo
2089
+ v laboratoři nebyl, že to muselo patrně vybuchnout –“
2090
+ „– samo od sebe,“ doplnil Prokop sotva dýchaje.
2091
+ „Ano. Vám také?“
2092
+ Prokop ponuře kývl.
2093
+ „Tak vidíte,“ řekl pan Carson rychle. „Není to k ničemu. Tuze nebezpečná věc.
2094
+ Prodejte nám to, a je to, máte to z krku. Co byste s tím dělal?“
2095
+ „A co byste s tím dělali vy?“ vycedil Prokop.
2096
+ „My už… my jsme na to zařízeni. Božínku, pár těch mrtvých – Ale vás by byla
2097
+ škoda.“
2098
+ „Ale Krakatit v porcelánové krabici nevybuchl,“ mínil Prokop úporně
2099
+ přemýšleje.
2100
+ „Chválabohu ne. Kdepak!“
2101
+ „A bylo to v noci,“ přemýšlel Prokop dál.
2102
+ „V deset třicet pět. Přesně.“
2103
+ „A… ta špetka Krakatitu ležela na zinkovém… na kovovém plechu,“ tvrdil Prokop
2104
+ dále.
2105
+ „Ten na to nemá vliv,“ vybleptl mužík trochu zmaten, kousl se do rtu a jal se
2106
+ přecházet po laboratoři. „Bylo to… bylo to asi jen okysličování,“ zamlouval to
2107
+ po chvíli. „Nějaký chemický proces. Směs s glycerínem taky nevybuchla.“
2108
+ „Protože není vodivá,“ zamumlal Prokop. „Nebo nemůže ionizovat, já nevím.“
2109
+ Pan Carson se nad ním zastavil s rukama na zádech. „Vy jste moc chytrý,“ řekl
2110
+ uznale. „Musíte dostat mnoho peněz. Tady je vás škoda.“
2111
+ „Je Tomeš pořád v Balttinu?“ ptal se Prokop, vší silou se přemáhaje, aby to
2112
+ vyznělo lhostejně.
2113
+ Panu Carsonovi to nějak blýsklo pod brejlemi. „Máme ho na očích,“ řekl
2114
+ vyhýbavě. „Sem se už jistě nevrátí. Přijeďte k nám… třeba ho najdete, když –
2115
+ tak – tuze – chcete,“ slabikoval důrazně.
2116
+ „Kde je?“ opakoval Prokop tvrdohlavě, dávaje najevo, že jinak nemluví.
2117
+ Pan Carson zamával rukama jako pták. „No, utekl,“ dodával na Prokopův
2118
+ nechápavý pohled.
2119
+ „Utekl?“
2120
+ „Vypařil se. Špatně hlídán, tuze chytrý. Zavázal se, že sestrojí celý
2121
+ Krakatit. Zkoušel to… asi šest neděl. Stál nás hrozné peníze. Pak zmizel,
2122
+ lump. Nevěděl si asi rady, co? Neumí nic.“
2123
+ „A kde je?“
2124
+ Pan Carson se naklonil k Prokopovi. „Lump. Teď nabízí Krakatit jinému státu.
2125
+ Přitom jim přinesl taky náš metylnitrát, ten taškář. Sedli mu na lep, teď dělá
2126
+ u nich.“
2127
+ „Kde?“
2128
+ „Nesmím říci. Na mou čest, nesmím. A když nám pláchl, jel jsem, haha,
2129
+ navštívit váš hrob. Pieta, co? Geniální chemik, a nikdo ho tady nezná. To byla
2130
+ práce, člověče. Musel jsem inzerovat jako blbec. To se ví, že si toho všimli…
2131
+ ti druzí, víte? Rozumíte mi?“
2132
+ „Ne.“
2133
+ „Tak se pojďte podívat,“ řekl pan Carson čile a zamířil k protější stěně.
2134
+ „Tady,“ řekl a ťukal na prkno.
2135
+ „Co je?“
2136
+ „Kulka. Někdo tu byl.“
2137
+ „A kdo po něm střelil?“
2138
+ „No já přece. Kdybyste byl sem lezl… oknem… takhle před čtrnácti dny, byl by
2139
+ vás třeba někdo… moc šeredně vzal na mušku.“
2140
+ „Kdo?“
2141
+ „To je jedno, ten nebo onen stát. Tady si, holenku, podávaly dvéře tuze velké
2142
+ mocnosti. A vy jste zatím někde, haha, chytal ryby, co? Báječný chlapík! Ale
2143
+ poslyšte, drahoušku,“ řekl najednou starostlivě, „neračte raději chodit sám.
2144
+ Nikdy a nikde, rozumíte?“
2145
+ „Nesmysl!“
2146
+ „Počkejte. Žádný granátník. Velmi nenápadní lidé. Dnes se to dělá… náramně
2147
+ diskrétně.“ Pan Carson se zastavil u okna a bubnoval na sklo. „Nemáte ponětí,
2148
+ co jsem na svůj inzerát dostal dopisů. Asi šest Prokopů se hlásilo… Pojďte se
2149
+ honem podívat!“
2150
+ Prokop přistoupil k oknu. „Co je?“
2151
+ Pan Carson jen ukázal krátkým prstem na silnici. Motal se tam na velocipédu
2152
+ nějaký mládenec v zoufalém zápase s rovnováhou, přičemž každé kolo jevilo
2153
+ umíněnou náklonnost jet jiným směrem. Pan Carson tázavě pohlédl na Prokopa.
2154
+ „Učí se asi jezdit,“ mínil Prokop nejistě.
2155
+ „Náramný nešika, že?“ řekl pan Carson a otevřel okno. „Bob!“
2156
+ Mladík na kole se zastavil jako přibitý: „Yessr.“
2157
+ „Go to the town for our car!“
2158
+ „Yessr.“ A přišlápnuv pedály svištěl mladý cyklista k městu.
2159
+ Pan Carson se obrátil od okna. „Ir. Velrni obratný hoch. Co jsem chtěl říci?
2160
+ Aha. Tedy asi šest Prokopů se mi hlásilo – schůzky na různých místech, zejména
2161
+ v noci – švanda, že? Přečtěte si tenhle lístek.“
2162
+ „Přijďte zítra v deset večer do mé laboratoře, ing. Prokop,“ četl Prokop jako
2163
+ ve snu. „Ale vždyť je to… bezmála… mé písmo!“
2164
+ „Tak vidíte,“ zubil se pan Carson. „Holenku, tady je horká půda. Prodejte to,
2165
+ ať máte pokoj!“
2166
+ Prokop zavrtěl hlavou.
2167
+ Pan Carson na něm spočinul těžkým, neodbytným pohledem. „Můžete žádat…
2168
+ řekněme… dvacet miliónů. Prodejte nám Krakatit.“
2169
+ „Ne.“
2170
+ „Dostanete všecko zpátky. Dvacet miliónů. Člověče, prodejte to!“
2171
+ „Ne,“ řekl Prokop těžce. „Nechci mít co dělat… s vašimi válkami. Nechci.“
2172
+ „Co máte tady? Geniální chemik a… bydlí v prkenné boudě! Krajani! Já to
2173
+ neznám. Velký člověk nemá žádné krajany. Nekoukejte na nic! prodejte to a –“
2174
+ „Nechci.“
2175
+ Pan Carson strčil ruce do kapes a zívl. „Války! Myslíte, že jim zabráníte?
2176
+ Pche! Prodejte a nestarejte se k čemu. Vy jste učenec… co je vám po ostatním?
2177
+ Války! Jděte, nebuďte směšný. Pokud mají lidé nehty a zuby –“
2178
+ „Neprodám,“ drtil Prokop mezi zuby.
2179
+ Pan Carson pokrčil rameny. „Jak chcete. Najdeme si to sami. Nebo to najde
2180
+ Tomeš. Taky dobře.“
2181
+ Bylo chvíli ticho. „Mně je to jedno,“ ozval se pan Carson. „Je-li vám to
2182
+ milejší, pojedeme s tím do Francie, do Anglie, kam chcete, třeba do Číny. My
2183
+ oba, víte? Tady by nám to nikdo nezaplatil. Byl byste osel, kdybyste to prodal
2184
+ za dvacet miliónů. Spolehněte se na Carsona. Tak co?“
2185
+ Prokop rozhodně zavrtěl hlavou.
2186
+ „Charakter,“ prohlásil pan Carson uznale. „Všecka čest. To se mně ohromně
2187
+ líbí. Poslyšte, vám to řeknu. Naprosté tajemství. Ruku na to.“
2188
+ „Neptám se po vašich tajemstvích,“ bručel Prokop.
2189
+ „Bravo. Diskrétní člověk. Můj typ, pane.“
2190
+
2191
+
2192
+ XVIII.
2193
+
2194
+ Pan Carson si sedl a zapálil si velmi tlusté cigáro, načež usilovně přemítal.
2195
+ „Tjaja,“ řekl po chvíli. „Tak vám to taky vybuchlo. Kdy to bylo? Datum.“
2196
+ „… Nevím už.“
2197
+ „Den v týdnu?“
2198
+ „… Nevím. Myslím… dva dny po neděli.“
2199
+ „Tedy v úterý. A v kolik hodin?“
2200
+ „Asi… po desáté večer.“
2201
+ „Správně.“ Pan Carson zamyšleně vyfukoval kouř. „Nám to poprvé vybuchlo… jak
2202
+ vy se račte vyjadřovat, ,samo od sebe‘… v úterý v deset třicet pět. Viděl jste
2203
+ přitom něco?“
2204
+ „Ne. Já jsem spal.“
2205
+ „Aha. Taky to vybuchuje v pátek, kolem půl jedenácté. V úterý a v pátek. My
2206
+ jsme to zkoušeli,“ vysvětloval na Prokopův vyjevený pohled. „Nechali jsme
2207
+ volně ležet miligram Krakatitu a hlídali jsme to ve dne v noci. Vybuchovalo to
2208
+ v úterý a v pátek, o půl jedenácté. Sedmkrát. Jednou taky v pondělí, v deset
2209
+ dvacet devět. Tak.“
2210
+ Prokop se omezil na to, že tiše žasnul.
2211
+ „To proběhne Krakatitem taková modrá jiskra,“ dodával pan Carson zahloubaně,
2212
+ „a pak to exploduje.“
2213
+ Bylo tak ticho, že Prokop slyšel tikání Carsonových hodinek.
2214
+ „Tjaja,“ vzdychl pan Carson a projel si zoufale zrzavý kartáč vlasů.
2215
+ „Co to znamená?“ vyrazil Prokop.
2216
+ Pan Carson jen trhl rameny. „A co vy,“ řekl, „co vy jste si vlastně myslel,
2217
+ když vám to… ,samo od sebe‘… vybuchlo? Nu?“
2218
+ „Nic,“ uhýbal Prokop. „Nepřemýšlel jsem o tom… tak dalece.“
2219
+ Pan Carson zabručel něco urážlivého.
2220
+ „Totiž,“ opravoval se Prokop, „tehdy mě napadlo, že to dělají… třeba…
2221
+ elektromagnetické vlny.“
2222
+ „Aha. Elektromagnetické vlny. My jsme si to taky mysleli. Výborná myšlenka,
2223
+ jenže pitomá. Bohužel docela pitomá. Tak.“
2224
+ Nyní si Prokop opravdu nevěděl rady.
2225
+ „Předně,“ uvažoval pan Carson, „bezdrátové vlny neběhají po světě jenom v
2226
+ úterý a v pátek o půl jedenácté, že? A za druhé, člověče, to si můžete myslet,
2227
+ že jsme to s nimi hned vyzkoušeli. S krátkými, s dlouhými, se všemi možnými. A
2228
+ váš Krakatit si z nich nedělal tohle,“ ukazoval na nehtu něco mizivě
2229
+ nepatrného. „Ale v úterý a v pátek… o půl jedenácté… si umane ,sám od sebe‘
2230
+ explodovat. A víte co ještě?“
2231
+ Prokop to ovšem nevěděl.
2232
+ „Ještě tohle. Od nějaké doby… asi půl roku nebo tak… mají evropské bezdrátové
2233
+ stanice děsný dopal. Víte, něco jim ruší hovory. Docela pravidelně. Náhodou…
2234
+ vždycky v úterý a v pátek od půl jedenácté v noci. Pravíte?“
2235
+ Prokop nepravil nic, jen si mnul čelo.
2236
+ „Nu ano, v úterý a v pátek. Říkají tomu smazané hovory. Začne to telegrafistům
2237
+ práskat do uší, a tu to máme; hoši se z toho mohou zbláznit. Trapné, co?“ Pan
2238
+ Carson si sundal brejle a jal se je čistit s velkými okolky. „Nejdřív… nejdřív
2239
+ mysleli, že to jsou nějaké magnetické bouře či co. Ale když viděli, že to
2240
+ úřaduje… pravidelně… v úterý a v pátek… Zkrátka Marconi, TSF, Transradio a
2241
+ nějaká ministerstva pošt a maríny, obchodu, vnitra a já nevím čeho všeho
2242
+ vyplatí dvacet tisíc liber chytrákovi, který tomu přijde na kobylku.“ Pan
2243
+ Carson si nasadil zas brejle a vesele vykoukl. „Myslí se, že existuje nějaká
2244
+ nezákonná stanice, která se baví tím, že v úterý a v pátek smazává hovory.
2245
+ Konina, že? Soukromá stanice, která by jen tak pro švandu posílala nejmíň sto
2246
+ kilowattů do vzduchu! Fi!“ Pan Carson si odplivl.
2247
+ „V úterý a v pátek,“ ozval se Prokop, „tedy současně… zároveň…“
2248
+ „Divné, že?“ šklebil se pan Carson. „Já to mám, panečku, napsáno: V úterý dne
2249
+ toho a toho v deset třicet pět a několik vteřin porucha na všech stanicích od
2250
+ Revalu a tak dále. A nám v tu samou vteřinu ,sama od sebe‘, jak vy račte
2251
+ říkat, exploduje jistá část vašeho Krakatitu. Eh? Co? Detto příští pátek v
2252
+ deset dvacet sedm a několik vteřin porucha a výbuch. Item příští úterý v deset
2253
+ třicet výbuch a porucha. A tak dále. Výjimečně, jaksi proti programu taky
2254
+ jednou porucha v pondělí v deset dvacet devět třicet sekund. Detto výbuch.
2255
+ Klape to na vteřinu. Osmkrát v osmi případech. Špás, že? Co o tom soudíte?“
2256
+ „N… nevím,“ mumlal Prokop.
2257
+ „Tak teda ještě něco,“ spustil pan Carson po delším hloubání. „Pan Tomeš u nás
2258
+ pracoval. Neumí nic, ale něco ví. Pan Tomeš si dal do laboratoře postavit
2259
+ vysokofrekvenční generátor a zamkl nám dvéře před nosem. Lump. Jakživ jsem
2260
+ neslyšel, že by se v obyčejné chemii pracovalo s vysokofrekvenčními mašinami,
2261
+ co? Co byste řekl?“
2262
+ „Nu… ovšem,“ uhýbal Prokop s neklidným pohledem na svůj vlastní zánovní
2263
+ agregát postavený v koutě.
2264
+ Pan Carson chytl čile tento pohled. „Hm,“ řekl, „taky tu máte takovou hračku,
2265
+ že? Pěkný transformátorek. Co vás stál?“
2266
+ Prokop se zamračil, ale pan Carson počal tiše zářit. „Tak si myslím,“ povídal
2267
+ s rostoucí blažeností, „že by to byla báječná věc, kdyby se povedlo v nějaké
2268
+ hmotě… dejme tomu pomocí vysoké frekvence… v jiskrovém poli nebo jak…
2269
+ rozkmitat, rozviklat, uvolnit vnitřní strukturu tak, že by stačilo ťuknout z
2270
+ dálky… nějakými vlnami… výboji… oscilacemi nebo čertví čím, aby se ta hmota
2271
+ rozpadla, co? Bum! Na dálku! Co tomu říkáte?“
2272
+ Prokop neřekl nic, a pan Carson cucaje s rozkoší cigáro se na něm jen pásl.
2273
+ „Já nejsem elektrikář, víte?“ začal po chvíli. „Mně to vysvětloval jeden
2274
+ učenec, ale ať se propadnu, jestli jsem to pochopil. Ten chlap šel na mne s
2275
+ elektrony, ionty, elementárními kvanty a já ani nevím, jak to jmenoval; a
2276
+ nakonec to katedrové světlo prohlásilo, že to zkrátka a dobře vůbec není
2277
+ možno. Člověče, vy jste si dal! Udělal jste něco, co podle světové autority
2278
+ není možno…“
2279
+ „Tak já jsem si to vyložil sám,“ pokračoval, „jen tak ševcovsky. Někdo si
2280
+ dejme tomu vezme do hlavy… udělat vratkou sloučeninu… z jisté olovnaté soli.
2281
+ Dotyčná sůl je neřád; ne a ne se slučovat, že? Tak ten chemik zkouší všechno
2282
+ možné… jako blázen; a tu si dejme tomu vzpomene, že v lednovém čísle The
2283
+ Chemist bylo povídání o tom, že dotyčná flegmatická sůl je báječný koherer…
2284
+ detektor pro elektrické vlny. Dostane nápad. Pitomý a geniální nápad, že by
2285
+ snad mohl tu zatracenou sůl přivést elektrickými vlnami do lepší nálady, ne?
2286
+ povzbudit ji, roztancovat ji, natřást ji jako peřinu, že? Tja, nejlepší nápady
2287
+ dostane člověk z blbosti. Tak tedy sežene takový komický transformátorek a dá
2288
+ se do toho; co prováděl, to je zatím jeho tajemství, ale koneckonců… dostane
2289
+ hledanou sloučeninu. Ať mne čert, dostane ji. Nejspíš to nějak slepil tou
2290
+ oscilací. Člověče, já se budu muset na stará kolena učit fyzice; říkám boty,
2291
+ že?“
2292
+ Prokop zabručel něco docela nesrozumitelného.
2293
+ „To nevadí,“ prohlásil pan Carson spokojeně. „Jen když to zatím drží
2294
+ dohromady; já jsem pitomec, já si představuju, že to dostalo nějakou
2295
+ elektromagnetickou strukturu nebo co. Kdyby se nějak porušila, tak… se to
2296
+ rozpadne, že? Naštěstí asi deset tisíc řádných radiostanic a několik set
2297
+ nezákonných udržuje v naší pozemské atmosféře takové elektromagnetické klima,
2298
+ takovou eh eh oscilační lázeň, která jde zrovna k duhu té struktuře. A tak to
2299
+ drží dohromady…“
2300
+ Pan Carson se maličko zamyslil. „A teď,“ začal zase, „teď si představte, že
2301
+ nějaký ďábel nebo holomek na tomto světě má prostředek, kterým může dokonale
2302
+ rušit elektrické vlny. Prostě je smazat či co. Představte si, že to – bůhsámví
2303
+ proč – tropí pravidelně v úterý a v pátek o půl jedenácté v noci. V tu minutu
2304
+ a vteřinu se poruší na tomto světě bezdrátové spojení; ale v tu minutu a
2305
+ vteřinu se nejspíš něco stane taky v té… labilní sloučenině, pokud není zrovna
2306
+ izolována… dejme tomu v… v porcelánové krabici; něco se v ní poruší… jaksi v
2307
+ ní lupne, a ona se… ona se…“
2308
+ „… rozpadne,“ vyhrkl Prokop.
2309
+ „Ano, rozpadne se. Exploduje. Zajímavé, co? Jeden učený pán mně to vysvětloval
2310
+ – hrome, jak to říkal? že – že prý –“
2311
+ Prokop vyskočil a popadl pana Carsona za kabát. „Poslyšte,“ koktal hrozně
2312
+ rozčilen, „kdyby se tedy… Krakatit… roztrousil dejme tomu tady… nebo kdekoliv…
2313
+ prostě po zemi…“
2314
+ „… tedy to nejbližšího úterku nebo pátku o půl jedenácté vyletí do povětří.
2315
+ Tja. Člověče, neuškrťte mne.“
2316
+ Prokop pustil pana Carsona a přebíhal po světnici hryže si hrůzou prsty. „To
2317
+ je jasné,“ mručel, „to je jasné! Nikdo nesmí Krakatit vy-vyrá–“
2318
+ „Krom pana Tomše,“ namítl Carson skepticky.
2319
+ „Dejte mi pokoj,“ utrhl se Prokop. „Ten na to nepřijde!“
2320
+ „Nu,“ mínil pan Carson s pochybami, „já nevím, kolik jste mu toho řekl.“
2321
+ Prokop se zastavil jako vražen do země. „Představte si,“ kázal horečně,
2322
+ „představte si dejme tomu… vvválku! Kdo má v rukou Krakatit, může… může…
2323
+ kdykoli chce…“
2324
+ „Zatím jen v úterý a v pátek.“
2325
+ „… vyhodit do povětří… celá města… celé armády… a všecko! Stačí… stačí jen
2326
+ roz-trousit – Dovedete si to představit?“
2327
+ „Dovedu. Báječně.“
2328
+ „A proto… v zájmu světa… nikdy… nedám nikdy!“
2329
+ „V zájmu světa,“ bručel pan Carson. „Víte, v zájmu světa by hlavně bylo přijít
2330
+ na kloub té – té –“
2331
+ „Čemu?“
2332
+ „Té zatracené stanici anarchistů.“
2333
+
2334
+
2335
+ XIX.
2336
+
2337
+ „Vy tedy myslíte,“ koktal Prokop, „že… že snad…“
2338
+ „My tedy víme,“ přerušil ho Carson, „že jsou na světě neznámé vysílací a
2339
+ přijímací stanice. Že si pravidelně v úterý a v pátek říkají nejspíš něco
2340
+ jiného než dobrou noc. Že disponují nějakými nám dosud neznámými silami,
2341
+ výboji, oscilacemi, jiskrami, paprsky nebo čím zatraceným a… a zkrátka
2342
+ nezachytitelným. Anebo nějakými antivlnami, antioscilacemi nebo jak to k čertu
2343
+ nazvat, něčím, co prostě přerušuje nebo smazává naše vlny, rozumíte?“ Pan
2344
+ Carson se rozhlédl po laboratoři. „Aha,“ řekl a popadl kus křídy. „Buď je to
2345
+ takhle,“ povídal rýsuje na podlaze asi půlloketní šipku křídou, „nebo takhle,“
2346
+ a přitom pokřídoval celý kus prkna a do toho vmázl nasliněným prstem temnou
2347
+ čáru. „Tak nebo tak, rozumíte? Pozitivně nebo negativně. Buď posílají nějaké
2348
+ nové vlny do našeho média, nebo vrhají do našeho kmitajícího, skrznaskrz
2349
+ protelegrafovaného prostředí umělé pauzy, chápete? Obojím způsobem se dá
2350
+ pracovat… bez naší kontroly. Obojí je dosud… technicky i fyzikálně… naprostá
2351
+ záhada. Zatraceně,“ křikl pan Carson v náhlém vzteku a praštil křídou, až se
2352
+ rozstříkla, „tohle je příliš! Posílat neznámými silami tajné depeše záhadnému
2353
+ adresátovi! Kdo tohleto dělá? Co teda myslíte?“
2354
+ „Třeba Marťané,“ nutil se Prokop zažertovat; ale opravdu, nebylo mu do žertu.
2355
+ Pan Carson po něm vražedně vykoukl, ale pak se rozřehtal přímo koňsky. „Dejme
2356
+ tomu, že Marťané. Bájecně! Dejme tomu, mistře. Ale dejme tomu, že spíš někdo
2357
+ na zemi. Dejme tomu, že nějaká pozemská moc rozesílá své tajné instrukce.
2358
+ Dejme tomu, že má tuze vážné příčiny vyhnout se lidské kontrole. Dejme tomu,
2359
+ že je nějaká… mezinárodní služba nebo organizace nebo čertví co, a že to má k
2360
+ dispozici neznámé síly, tajemné stanice a kdesi cosi. V každém případě… V
2361
+ každém případě má lidstvo právo zajímat se o ty tajemné depeše, ne? Ať jsou z
2362
+ pekla nebo z Martu. Je to prostě… zájem lidské společnosti. Můžete si myslet…
2363
+ Nu, nejspíš, pane, nejspíš to nebudou radiodepeše o Červené karkulce. Tak.“
2364
+ Pan Carson se rozběhl po světnici. „Předně je jisto,“ uvažoval nahlas, „že
2365
+ dotyčná vysílací stanice… je někde ve střední Evropě, přibližně uprostřed
2366
+ okruhu těch poruch, že ano? Je poměrně slabá, ježto hovoří jenom v noci.
2367
+ Saprlot, tím hůř; Eiffelka nebo Nauen se najde lehko, že? Pane,“ zvolal náhle
2368
+ a stanul jako přibitý, „považte, že v samém pupku Evropy existuje a chystá se
2369
+ něco divného. Je to rozvětvené, má to své úřady, udržuje to tajné spojení; má
2370
+ to technické prostředky nám neznámé, tajemné síly, a abyste věděl,“ zařval pan
2371
+ Carson, „má to Krakatit! Tak!“
2372
+ Prokop vyskočil jako blázen. „Jak-jakže?“
2373
+ „Krakatit. Devět deka a pětatřicet decigramů. Všecko, co nám zbylo.“
2374
+ „Co jste s ním dělali?“ rozzuřil se Prokop.