Implements an image recognition captcha.

"; break; case 'admin/modules#description': case 'admin/modules/textimage': case 'admin/textimage': $output = t('Implements an image recognition captcha.'); break; } return $output; } function textimage_captchachallenge(&$form) { $form['captcha_response'] = array ( '#type' => 'textfield', '#title' => t('Captcha Validation'), '#default_value' => '', '#required' => TRUE, '#validate' => array('_captcha_validate' => array()), '#description' => t('Please type in the letters/numbers that are shown in the image above.'), '#prefix' => 'Captcha Image: you will need to recognize the text in it.', ); return $form; } function textimage_captchavalidate(&$captcha_word, &$correct) { $captcha_word = drupal_strtolower($captcha_word); if (($_SESSION['captcha'] != '') && $captcha_word == $_SESSION['captcha']) { $correct = true; } else { $correct = false; form_set_error('captcha_response', t('The image verification code you entered is incorrect.')); } } /** * Implementation of hook_menu(). */ function textimage_menu($may_cache) { $items = array(); $suffix = ''; if (arg(2)!=null) $suffix='/'.arg(2); $items[] = array( 'path' => '_textimage/image'.$suffix, 'title' => t('textimage'), 'callback' => '_textimage_image', 'access' => user_access('access textimages'), 'type' => MENU_CALLBACK ); return $items; } function textimage_perm() { return array('access textimages'); } function textimage_settings() { $fonts_path = variable_get("textimage_fonts_path", ""); $images_path = variable_get("textimage_images_path", ""); //check for GD if (!function_exists(imagecreate)) drupal_set_message(t('Image library not available. Textimage needs the GD library extension to be installed. Please install GD.')); //check for TTF support elseif (!function_exists(imagettftext)) drupal_set_message(t('Your image library does not seem to have TrueType font support. Textimage will work, but will use the default inbuilt font.'),'status'); //check for valid font path elseif ($fonts_path!="" && !is_dir($fonts_path)) drupal_set_message(t('The current font path is invalid. The default font will be used.')); //check for valid image path if ($images_path!="" && !is_dir($images_path)) drupal_set_message(t('The current images path is invalid. No images will be used.')); //Fonts settings $form['fonts'] = array( '#type' => 'fieldset', '#title' => t('Fonts settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['fonts']['textimage_use_only_upper'] = array( '#type' => 'checkbox', '#title' => t('Use only Uppercase'), '#default_value' => variable_get('textimage_use_only_upper',0) ); $form['fonts']['textimage_fonts_path'] = array( '#type' => 'textfield', '#title' => t('TrueType Fonts Path'), '#default_value' => $fonts_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the Truetype (.ttf) fonts are stored. If you do not provide any fonts, the module will use the default font for text. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['fonts']['textimage_font_size'] = array( '#type' => 'textfield', '#title' => t('Font Size'), '#default_value' => variable_get('textimage_font_size',24), '#size' => 5, '#maxlength' => 2, '#description' => t('Font size of Captcha text (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_font_size")), ); $form['fonts']['textimage_char_spacing_max'] = array( '#type' => 'textfield', '#title' => t('Character Spacing'), '#default_value' => variable_get('textimage_char_spacing_max',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the kerning between letters in Captcha. Higher numbers indicate more spacing.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_spacing_max")), ); $form['fonts']['textimage_char_jiggle_amount'] = array( '#type' => 'textfield', '#title' => t('Character Jiggle'), '#default_value' => variable_get('textimage_char_jiggle_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of up and down movement in the Captcha letters. Higher numbers indicate more jiggling.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_jiggle_amount")), ); $form['fonts']['textimage_char_rotate_amount'] = array( '#type' => 'textfield', '#title' => t('Character Rotation'), '#default_value' => variable_get('textimage_char_rotate_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of rotation in the Captcha letters (in degrees, only works with non-default fonts).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_rotate_amount")), ); $form['fonts']['textimage_char_size_amount'] = array( '#type' => 'textfield', '#title' => t('Character Size Adjustment'), '#default_value' => variable_get('textimage_char_size_amount',2), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of variation in size between the different letters in the Captcha (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_size_amount")), ); //Image settings $form['images'] = array( '#type' => 'fieldset', '#title' => t('Image settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['images']['textimage_images_path'] = array( '#type' => 'textfield', '#title' => t('Background Images Path'), '#default_value' => $images_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the background images are stored. If you do not provide a directory, solid colors will be used. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['images']['textimage_image_noise'] = array( '#type' => 'textfield', '#title' => t('Image Noise (pixels)'), '#default_value' => variable_get('textimage_image_noise',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random pixels) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_noise")), ); $form['images']['textimage_image_lines'] = array( '#type' => 'textfield', '#title' => t('Image Noise (lines)'), '#default_value' => variable_get('textimage_image_lines',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random lines) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_lines")), ); $form['images']['textimage_image_margin'] = array( '#type' => 'textfield', '#title' => t('Image Margin'), '#default_value' => variable_get('textimage_image_margin',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Set a distance between the Captcha letters and the edges of the image.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_margin")), ); $form['info'] = array( '#type' => 'fieldset', '#title' => t('Image and font information'), '#collapsible' => TRUE, '#collapsed' => FALSE ); if (isset($fonts_path)) { $imagefontinfo .= t('Number of fonts found: ').count(_textimage_font_list()); } if (isset($images_path)) { $imagefontinfo .= '
'.t('Number of background images found: ').count(_textimage_image_list()); } $gdinfo = gd_info(); $imagefontinfo .= '
'.t('GD Version: ').$gdinfo["GD Version"]; $imagefontinfo .= '
'.t(' FreeType Support: '); $imagefontinfo .= ($gdinfo["FreeType Support"]==true) ? 'True' : 'False'; $imagefontinfo .= '
'; $form['info']['captcha_info'] = array ( '#type' => 'item', '#value' => $imagefontinfo, ); return $form; } function textimage_settings_form_validate ($form_id,$form) { //check for valid font path if ($form['textimage_fonts_path'] !="" && !is_dir($form['textimage_fonts_path'])) form_set_error('textimage_fonts_path', t('The entered font path is invalid')); //check for valid image path if ($form['textimage_images_path'] !="" && !is_dir($form['textimage_images_path'])) form_set_error('textimage_images_path', t('The entered image path is invalid')); } function _textimage_number_validate ($field,$fieldName) { if (!is_numeric($field['#value'])) { form_set_error($fieldName,t("The value for")." ".t($field['#title'])." ".t("must be a number")); } } /** * Prints an image containing a textimage code. */ function _textimage_image() { //if we don't have GD2 functions, we can't generate the image if (!function_exists('imagecreatetruecolor')) return; // Set headers header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); header('Content-type: image/png'); $string = _textimage_code(); // Get truetype font list $fonts = _textimage_font_list(); // Get the background images list $images = _textimage_image_list(); // Randomization amounts: $charSpacingMax = variable_get('textimage_char_spacing_max',10); // Letter spacing max (pixels) $charSpacingMin = max($charSpacingMax*.5,0); // Letter spacing minimum (pixels) $charJiggleAmount = variable_get('textimage_char_jiggle_amount',5); // Up and down randomization (pixels) $charRotateAmount = variable_get('textimage_char_rotate_amount',5); // Character rotation amount (degrees) $charSizeAmount = variable_get('textimage_char_size_amount',2); // Character size amount (pixels) $imageRotateAmount = variable_get('captcha_image_rotate_amount',12); // Image rotation amount (degrees) // Static amounts: $charInitialSize = variable_get('textimage_font_size',24); // Initial Font $imageNoise = variable_get('textimage_image_noise',4); // Amount of noise added to image $imageLines = variable_get('textimage_image_lines',4); // Amount of noise added to image $imageMargin = variable_get('textimage_image_margin',10); // Margin around image (pixels) // write text using a truetype font if (function_exists(imagettftext) && count($fonts) > 0) { // Initialize variables for the loop $characterDetails = array(); // contains the final info about each character // Build a list of character settings for the captcha string for ($i=0;$i $charSize, "angle" => $charAngle, "x" => $x, "y" => $y, "color" => $foreground, "font" => $font, "char" => $char ); // Increment the image size $imageWidth = $x + $charWidth; $imageHeight = max($imageHeight,$y+$charJiggleAmount); } // Create the image based off the string length and margin if (count($images) > 0) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Specify colors to be used in the image $foreground = imagecolorallocate($im, rand(0, 80), rand(0, 80), rand(0, 80)); foreach($characterDetails as $char) { // draw character imagettftext($im,$char['size'],$char['angle'],$char['x']+$imageMargin,$char['y']+$imageMargin,$foreground,$char['font'],$char['char']); } } else { // write text using a built-in font $x = 0; $y = 0; $imageWidth = 60 + drupal_strlen($string)*$charSpacingMax*.35; $imageHeight = 30 + $charJiggleAmount; // Create the image if (count($images) > 0 && function_exists(imagecolorallocatealpha)) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth, $imageHeight); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth, $imageHeight); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Add the text for ($i=0;$i 0) { // Prepare a larger image with a background image $im2 = _textimage_create_transparent_image($imageWidth, $imageHeight); } else { // Prepare a larger image with a solid color $im2 = imagecreatetruecolor($imageWidth, $imageHeight); imagefill($im2, 0, 0, $background); } $result = imagecopyresampled ($im2, $im, $imageMargin, $imageMargin, 0, 0, $imageWidth, $imageHeight, imagesx($im), imagesy($im)); $im = $im2; } // strikethrough imageline($im, rand(0, 120), rand(0, 120), rand(0, 120), rand(0, 120), $foreground); // Add Noise for ($x=0; $x<$imageWidth; $x++) { for ($row=0; $row<$imageNoise;$row++) { $y = rand(0,$imageHeight); imagesetpixel($im, $x, $y, $noisecolor); } } // Add Lines and Ellipses for ($x=0; $x<$imageLines;$x++) { imageline($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); imageellipse($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); } // Fill image with a random background image if available if (count($images) > 0) { $image = $images[rand(0,count($images)-1)]; _textimage_apply_background_image($im,$image); } //output to browser imagepng($im); imagedestroy($im); } /** * Returns a random string for use in a captcha */ function _textimage_code() { $consts='bcdgjxvmnprst'; $vowels='aeiou'; for ($x=0; $x < 6; $x++) { mt_srand ((double) microtime() * 1000000); $const[$x] = drupal_substr($consts,mt_rand(0,drupal_strlen($consts)-1),1); $vow[$x] = drupal_substr($vowels,mt_rand(0,drupal_strlen($vowels)-1),1); } $string = $const[0] . $vow[0] .$const[2] . $const[1] . $vow[1] . $const[3] . $vow[3] . $const[4]; $string = drupal_substr($string,0,rand(4,6)); //everytime we create a new code, we write it to session $_SESSION['captcha'] = drupal_strtolower($string); if(variable_get('textimage_use_only_upper',0)) $string = drupal_strtoupper($string); return $string; } /** * Returns an array of files with TTF extensions in the specified directory. */ function _textimage_font_list() { $fontdir = variable_get("textimage_fonts_path", ""); $filelist = array(); if (is_dir($fontdir) && $handle = opendir($fontdir)) { while ($file = readdir($handle)) { if (preg_match("/\.ttf$/i",$file) == 1) $filelist[] = $fontdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Returns an array of files with jpg, png, and gif extensions in the specified directory. */ function _textimage_image_list() { $imagesdir = variable_get("textimage_images_path", ""); $filelist = array(); if (is_dir($imagesdir) && $handle = opendir($imagesdir)) { while ($file = readdir($handle)) { if (preg_match("/\.gif|\.png|\.jpg$/i",$file) == 1) $filelist[] = $imagesdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Overlays an image to the supplied image resource */ function _textimage_apply_background_image (&$imageResource,$imageFile) { $backgroundResource = image_gd_open($imageFile,substr($imageFile,-3)); // Copy the text onto the background $backX = imagesx($backgroundResource); $backY = imagesy($backgroundResource); $textX = imagesx($imageResource); $textY = imagesy($imageResource); $randomBackX = rand(0,$backX-$textX); $randomBackY = rand(0,$backY-$textY); // Place the text onto a random location of the background image imagecopyresampled($backgroundResource,$imageResource,$randomBackX,$randomBackY,0,0,$textX,$textY,$textX,$textY); // Crop the background image to the original image size imagecopyresampled($imageResource,$backgroundResource,0,0,$randomBackX,$randomBackY,$textX,$textY,$textX,$textY); } /** * Creates transparent image resources for images with graphic backgrounds */ function _textimage_create_transparent_image($x, $y) { $i = imagecreatetruecolor($x, $y); $b = imagecreatefromstring(base64_decode(_text_image_blankpng())); imagealphablending($i, false); imagesavealpha($i, true); imagecopyresized($i, $b ,0 ,0 ,0 ,0 ,$x, $y, imagesx($b), imagesy($b)); return $i; } function _text_image_blankpng() { $c = "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m"; $c .= "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg"; $c .= "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN"; $c .= "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ"; $c .= "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA"; $c .= "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII="; return $c; } ?> Одеський Листок | Щомісячна газета для всіх хто любить і пам'ятає Одесу<br>Телефони редакції: (415) 305-3456, (310) 904-3501, (303) 669-1526

user warning: Table './odessapage/cms_sessions' is marked as crashed and last (automatic?) repair failed query: SELECT COUNT(sid) AS count FROM cms_sessions WHERE timestamp >= 1601184250 AND uid = 0 in /home/hepa/public_html/new/includes/database.mysql.inc on line 121.

Кустанайская история (Часть 2)

[Продолжение. Начало в № 156]

Стали расходиться. Семиволов попросил меня задержаться. Без особых предисловий он сказал:
- Лариса Михайловна, здесь не город. Здесь все и все на виду. Я перехватил ваши взгляды с Константином Летучим. Поверьте мне, через десять минут его жена будет об этом знать, а через двадцать – вся деревня. Не сделайте ошибки и держитесь от него подальше. Все. Я вас предостерег.
Он встал и вышел из кабинета.
«Недурственно, - подумала я. - Он, я и Марья. Забавный треугольник».
Предупреждение директора явно запоздало. Оно только подстегнуло зародившееся желание обладать этим детиной. Ну до чего же он хорош и натурален. Прямо от сохи, ничего городского. Высшее образование (скорее всего, вечернее) в провинциальном Кустанае его не испортило. И я захотела получить его тут же, немедленно, всего и без остатка. Я закрыла глаза и почувствовала тепло его крепкого тела, играла его пушистыми золотистыми волосами, покусывала его губы, целовала его сине-голубые глаза цвета ясного неба в солнечный день. Он был мой и ко всем чертям его Марью. И плевать мне на Семиволова, хоть он и дважды Герой Социалистического Труда.
У двери меня встретил Николай. Говорить о картошке я не могла. Я чувствовала приближение прекрасного увлечения, как чувствуют приближение грозы. Мой милый чуткий Максименко сказал:
- Не беспокойтесь, я завтра все организую и отвезу девочек в поле. А вы подключитесь потом.
Мои глаза меня выдали, я сияла.
- Спасибо, Коленька! Ты чудесный марксист.
Я чмокнула его в щеку. Он зарделся.
Костя поджидал меня у входа в правление. Пошли рядом. Посмотрели друг другу в глаза – не надо слов. Скоро мы вышли за околицу. Было прекрасное сентябрьское утро.
Что может сравниться с запахом степи! Какое раздолье. Воздух чист и прозрачен. Солнце только встало. Его лучи ласкают тело, легкий ветерок играет волосами, утренняя прохлада позволяет дышать всей грудью, и дышится вольно и легко.
Перед нами расстилалось необъятное золотое море спелой пшеницы до самого горизонта. Над пшеницей кружились перепела, а высоко в небе пели жаворонки. Ветер шевелил колосья. Здесь росла пшеница особая, сортовая. Каждое зерно крупное, тяжелое, стебель упругий и высокий. Ни одного сорняка. Этот участок назывался «Майлаб». Среди этого необозримого поля протоптаны едва заметные тропинки. Вдали работали комбайны, но их шум не долетал до нас. Уборка хлеба шла полным ходом. По краям поля были сложены большие стога соломы.
О ветерке Кустанайских полей слагались песни. Он свеж и ласков, то дует слева направо, то меняет направление, и от этого пшеница колышется и колосья звенят. Они поют самую чудесную в мире песню – песню о хлебе. Одно это зрелище сводит с ума, завораживает.
Мы шли по тропинке между колосьями. Косточка взял меня за руку, и от этого прикосновения тут же вспыхнуло желание. Сильное и неудержимое. Страсть захлестнула нас. Поцеловались. Он увлекал меня за собой все дальше и дальше, резко свернул в сторону. Мы вышли к делянкам, где уже скосили сено. Кругом – высокие аккуратные стога. Скошенная трава еще была зеленой, но сухой. Сено изумительно пахло, лучше самых дорогих французских духов. Вдыхая этот аромат, хотелось жить. Жить и… любить.
Мы побежали к стогу. Прав был Семиволов: все, как на ладони, поле ровное, и видно все аж до самого горизонта. И как бы ты ни старался спрятаться, – все напрасно. Мы видели вдали работающие комбайны, а комбайнеры видели нас. Мы обошли стог и упали под ним.
Ах, Семиволов, если бы ты видел! Ах, Мария Ивановна, хорошо, что ты не видишь!!
Ласки Косточки были весьма примитивны, но свежи и вкусны. Он не был искусен в игре, но отдавался весь. Можно ли сравнить хлеб, привезенный из городской булочной, с хлебом, который только что испекли в русской печи? Конечно, нет. Деревенский хлеб с хрустящей корочкой, душистый, ноздреватый, с особым вкусом и запахом можно есть и есть и хочется еще. Так и мы ласкали друг друга: он – по-деревенски, а я – по-городскому. Я любовалась им. Когда он поцеловал мои губы первый раз, я ужасно удивилась. Это был целомудренный девственный поцелуй. Так мать целует ребенка в лобик перед сном. Я сказала: «Дурачок, открой рот и возьми меня к себе. Я научу тебя, как надо целовать женские губки».
Теперь удивился он, но послушно открыл рот и почувствовал мой язык. Наука несложная. Он оказался способным учеником, но ему нужна была практика. Потом я куснула его мочку уха и пососала ее, как леденец. Он немедленно повторил. Ему все больше и больше нравилась эта игра. Прелюдия гораздо важнее и приятней, чем конец игры, и чем дольше она длится, тем большее наслаждение испытывают и женщина, и мужчина. А уж потом все остальное. Кошка сначала играет с мышкой, перекидывает ее из лапки в лапку, и только наигравшись всласть, съедает ее. В этом и есть прелесть любовной игры. Я открывала постепенно завесу, за которой были не изведанные им досель наслаждения.
Кончиком языка я облизывала контур его губ. Сначала верхнюю губу и замирала, дойдя до уголка рта. Он ждал. Тогда я медленно переходила на нижнюю губу, и опять остановка. И так долго и много раз. Он лежал с закрытыми глазами и блаженно улыбался, говоря: «еще». Насладившись, он покусывал мой язык, жадно неистово целовал мои губы. Затем кончиком языка, мокрым и горячим, я щекотала его ресницы. Он жмурился и постанывал от восторга, которого никогда раньше не испытывал. Не думаю, что уставшая за день Мария дарила ему такую радость.
Многие думают, что ласки нужны только женщине. Ничего подобного! Мужчины нуждаются в ласке и нежных словах еще больше. За этим они пойдут на край света, т.е. за женщиной, которая дарит ему физическое наслаждение и с которой ему хорошо. Женщина может отказываться от близости, сколько ей вздумается, часто не столько из порядочности и скромности, сколько из боязни забеременеть. Но если ты уже легла в постель, то нечего скрещивать ноги, сопротивляться и кричать: «Нет! Нет!» Такая, с позволения сказать, скромность выглядит лживо. И никому не нужна. Отдайся ему со всей страстью, на которую ты способна.
Солнце начало припекать. Мы зарылись еще глубже в стог. Господи! Пахучее сено приятно щекотало наши тела, а неповторимый его запах проникал во все клеточки. Потом я стала бегать в одной сорочке вокруг стога, а он меня догонял и «наказывал». На мне была тончайшая немецкая нейлоновая комбинация, голубая, вся в кружевах, какую он отроду не видел, а он бегал в семейных трусах до колен, сатиновых в голубенький цветочек. Наверное, Марья купила их в сельпо. Он не мог понять, почему мне так смешно, а я так хохотала, что без конца падала на сено.
Мы играли и резвились. Ну, скажите, в городе можно бегать в ночной рубашке и трусах вокруг пахучего стога сена? Почти голышом, да еще дышать свежим воздухом? Под солнцем кожа стала влажной, а запах пота еще больше возбуждал нас. Косточка так вкусно пахнул, его волосы под мышками, тоже золотистые, сводили меня с ума. Мы опять смешивали наш пот.
Что за прелесть эта деревенская любовь! Ничего на свете не может быть слаще! Даже самые шелковистые белоснежные простыни на удобной кровати не могут соперничать со стогом. Задернутые шторы, полумрак, ночник в изголовье… У кровати столик с бокалами шампанского, сигареты, тихая музыка… Все это чушь собачья! Тут все продумано заранее и создано руками человеческими. А делать любовь в поле на сене – это сама природа, это создал Бог! Впрочем, зимой неплох и городской вариант. Всему свое время. Но представить Косточку в такой спальне, где на кресле будут развешаны трусы в цветочек, просто немыслимо, нелепо.
Однако Константина ждали на стройке. Он все забыл. Он говорил ласковые слова, которые никогда в жизни раньше не произносил. Смеясь, он называл меня «пшеничкой». А я говорю:
- Сладкая моя Косточка! Вот я разгрызу тебя и съем.
А он в ответ:
- Ты мое спелое зернышко. Я тебя и так проглочу, целиком.
Он поглаживал мои плечи, бедра и приговаривал:
- Ты моя перепелочка. Ласковая, вкусненькая.
Подумайте, многие ли женщины слышали такие слова? Городские мужчины тоже не лыком шиты, но их комплименты стандартны, избиты и стары, как мир. И у всех одинаковые. А вот «зернышко» и «перепелочка» звучат совсем неплохо. Ново и от всего сердца. Для меня это была музыка, произведение, никогда раньше не исполнявшееся и созданное только для меня одной. Костя сиял от счастья, никогда у него не было такой женщины. Опять и опять мы отдавались друг другу. Стог сена мы растащили полностью, сровняли с землей.
Солнце стало садиться. Рассветы и закаты в степи – зрелище потрясающее. Багряные и черные полосы появляются над горизонтом. Они ждут заходящее солнце, готовые принять его в свои объятия, поглотить и спрятать до завтра. Золотой шар катится по темнеющему небу и, дотронувшись до линии горизонта, исчезает. Глядя на это, ты соприкасаешься с вечностью. Так было и будет всегда. Ночь наступает внезапно, почти без сумерек, и тут же появляются первые звезды.
Мы шли по стерне, не разбирая дороги. Два ненасытных грешника, вкусивших запретный плод. Не евши и не пивши целый день, мы были сыты. Не хотелось думать, что будет завтра и какая нас ждет расплата. На подходе к деревне мы расстались.
О том, что мы ушли в поле вдвоем, о том, что Костя даже не показался на работе за целый день, Семиволову доложили очень скоро.
Я тихонько пробралась в свою комнатушку. Выпила воды и завалилась на койку. Я испытывала блаженную усталость, не думала ни о чем и сразу заснула.

Глава IV
Меня разбудил стук в окно. Часы показывали 6 утра. Выглянула – шофер Вася и голубая «Волга».
Спросила:
- Ты что, с ума спятил? Почему ты меня разбудил так рано? Пожар?
А он, такой молодой и развязный, довольный тем, что возит «самого», говорит:
- Вставайте, Семиволов требует. Поехали.
- Да пошли вы оба к чертовой матери!
И повалилась на кровать. Уехал он и, стервец такой, так и передал своему начальнику мои слова. Рассвирепел начальник, яко лютый зверь, и кричит:
- Достань мне эту командиршу живую или мертвую!
Через 10 минут опять стук в окошко. Вася, мерзавец, слезно просит:
- Пожалуйста, поехали в правление, не злите его.
Делать нечего. Быстро собралась и вышла к машине. И пока то да се, время к семи. Ждала я семиволовского гнева без страха. Думала спокойно – отобьюсь.
Начал собираться народ. Вопросы, вопросы. Семиволов занят по горло. Кончилась планерка – я за дверь. Разговор не состоялся. Мой Летучий на планерку не пришел.
А в поле уже собирали картошку мои студенты – их привезли автобусы. Николай распределил участки, и работа началась. А я прохлаждалась. Пришла к себе, разделась и завалилась спать. Предварительно я написала на бумаге: «Прошу не беспокоить» и приклеила с наружной стороны двери. Однако уже через час начался стук то в окно, то в дверь. Я молчу. Не открываю. «Волга» отъехала. Накося, выкуси! Выспалась и пошла в столовую.
Марья встретила меня, как ни в чем не бывало. Хорошо покормила, составили заявку на два дня вперед. Думаю, не посмеет она скандалить, ведь я ее повязала по рукам и ногам. Ей нужны деньги. Пусть, думает, молодой муж побалуется, ведь только один месяц. А за махинации с продуктами могут отдать под суд запросто, и она потеряет все. Не резон ей рот открывать.
На уборку хлеба в совхоз, кроме студентов, приезжали солдаты из ближайшей воинской части. Размещали их в палаточном городке, километрах в 10 от совхоза. Солдатики молодые очень охочи до девочек, и это было опасно. Когда девушки вернулись после ужина из столовой, уставшие от непривычного труда, я обошла все общежитие и предупредила, чтобы ночью из домов не выходили. А удобства-то только дворовые. Как быть? Вопрос непростой, солдаты тут же узнали о приезде студенток, и что для них 10 километров. Придут ночью в поселок, уволокут девочку подальше и изнасилуют. А потом ищи ветра в поле.
От этих мыслей меня бросило в дрожь. Мы с Николаем это обсудили и напечатали в конторе Приказ № 1, который гласил: «Ночью девушки не должны выходить из дома. Двери держать закрытыми. Писать в ведро».
Барак, в котором жила я и 75 студенток, запирался мною лично на ключ. Однако спать мне не давали. Девочки, которым требовалась уборная, стучали в мою дверь, и я их сопровождала. Мне это надоело, и я оставляла ключ возле двери.
Приказ № 2 гласил: «В ночное время выходить из помещения только группами не менее 10 человек. При виде солдат кричать дикими голосами». Может быть, это смешно для тех, кто не отвечал за каждую душу своей головой…
Накануне первого рабочего дня каждой девушке вручили по жестяному ведру. По картофельным полям прошлись картофелеуборочные машины. Чудо техники. Они разворошили землю и собрали двадцатую часть урожая, а восемьдесят процентов (?Ред.) остались в земле либо на поверхности земли. Теперь студенткам предстояло бежать с ведром по полю. И руками подбирать картофелины. А наполненные ведра тащить на край поля, где стояли контейнеры на 100 килограммов вместимостью. Нам дали норму выработки. Все, как у людей. После завтрака к столовой подъезжали машины и развозили девчат по участкам. Начались трудовые будни. Пока было тепло и сухо.
Вскоре организационные дела были закончены. Мне же для объезда бригад и контроля за работой Семиволов пообещал выделить двуколку с лошадкой. Николай помогал мне во всем, все решения мы принимали совместно, не возникало никаких разногласий. Зато наш второй помощник Мекишев перво-наперво начал выпивать и к вечеру лыка не вязал. Целыми днями он валялся в кровати, но регулярно приходил пожрать в столовую. А съесть он мог вагон и маленькую тележку: 15 котлет и буханку хлеба за раз. Он приехал отдыхать и растолстел, как боров, за первую неделю. Я пообещала ему, что его отзовут в Алма-Ату, и он получит по заслугам. Кроме того, что сыт и пьян, – его потянуло к девочкам. Такая оказалась скотина! Свое обещание я выполнила, и эта сладкая жизнь кончилась для него через 10 дней. Мы от него избавились, наконец.

Глава V
Не знаю, то ли Мария Ивановна не знала, то ли притворялась, но через несколько дней Косточка тихонько постучал в окно. Я вышла к нему.
Ночью в степи страшно, какие-то шорохи, вроде кто-то крадется. Я прижалась к нему, было зябко.
Начиналась осень. Мы дошли до первой копны. Я слышала, как в сене копошатся полевые мыши. Я боялась мышей и не хотела садиться на сено. Костя сказал:
- Я тосковал по тебе. Все валится из рук, ничего не соображаю. Что ты сделала со мной? Мне видится твое лицо, губы, и хочется тебя целовать и ласкать. Опять и опять.
Через несколько часов я вернулась домой. Записки на двери не было, кто-то оторвал ее.
Перед сном я подвела итоги. Так, работа налажена. Марья, я и Костя всем довольны.
Довольны все, кроме Семиволова. Он искал встречи со мной для серьезного разговора. На очередной оперативке я увидела на его столе мою записку «Прошу не беспокоить». Это Васькина работа. Пока я миловалась с Косточкой, Васька приезжал за мной, оторвал записку и отвез ее начальнику. Ну, погоди, Васек. Придет коза до воза.
После окончания оперативки Семиволов указал мне на стул возле его стола. Я сказала:
- Поздно.
И ушла. Он был взбешен.
К правлению подъехала лошадка с двуколочкой, предназначенная для меня. Она представляла собой большую сплетенную из ивовых прутьев корзину. Народное искусство – плетение корзин – предстало во всей своей красе. Внутри скамеечка, под ноги побросали сено. Опять сено, куда ни глянь. Лошадка очень симпатичная, серая с черными пятнами по крупу. Она не похожа была на колхозную клячу, красивая кобылка. Конюх спросил, умею ли я править.
- Конечно, - ответила я и залезла в корзину. Конюх торжественно вручил мне кнут. Кобылку звали Серая. Она загарцевала, и конюх сказал ей:
- Не балуй, стерва.
Потом я лихо крутанула над головой кнутом, готовая отправиться в путь. Конюх пошептал что-то на ухо Серой, та поняла, кивнула, и я укатила.
Выехав за деревню, я встала на ноги и, размахивая вожжами, понеслась по проселочной дороге. Пела какие-то русские песни, гикала и цокала языком. Вот это удовольствие! Мчалась я на картофельное поле. Мои девчонки сбежались, окружили нас. Посудачили, повосхищались лошадкой.
После первой остановки я хотела поехать в другую бригаду, но не тут-то было! Стала я ласково говорить Серой:
- Ну, пошла, милая! Но-но! Давай!
Я уговаривала ее долго и ласково, но безрезультатно. Кнут применить я боялась. Лошадка может понестись и перевернуть мою тачку. Убьюсь ненароком. Сижу и думаю, как заставить Серую тронуться с места. Конюх что-то шептал на ухо ей, но что, я не знала. Ну, думаю, я не дурней конюха, да как заматерюсь: мать твою так и разэдак, растуды и туды – настоящим семиэтажным матом. Моя лошадка покосила глазом, запрядала ушами и соизволила двинуться по дороге. Колхозные лошади и клячи приучены к такому обращению, интеллигентного обхождения они не понимают, так воспитаны с детства.
Проверила я все бригады. Хорошо работают, не ленятся. Подъезжаю к русской бригаде – мать моя! Все сидят на перевернутых ведрах, не собран даже один контейнер! Не стала я их уговаривать, обратилась примерно с такой же речью, как к Серой. И что бы вы думали – универсальное средство! Все бегом пустились подбирать картофелины. Со мной ведь шутки плохи: подам рапорт ректору и прощай КазГУ. Тю-тю!
В основном совхоз возделывал пшеницу. Сдавал государству по четыре-пять планов. Но особенной гордостью совхоза был участок, который назывался «Майлаб». Я уже о нем упоминала. Журналисты из московских газет «Известия», «Правда», «Труд» и т.д. обычно приезжали в Кустанайский обком партии. Там им оказывали соответствующий прием. Вместе с журналистами из областной газеты они обязательно добирались до этого совхоза. Приезжали на «Волгах» и «Москвичах». Хотели полюбоваться пшеницей «Майлаба». Но в первую очередь их водили поесть в столовую. Красивую посуду и рюмки держали для заезжих гастролеров из газет. Пригласили и меня с Колей.
Приехало в этот раз пять человек. Тут же появились две бутылки «Столичной» и три бутылки армянского коньяка. Для Марии Ивановны это было не впервой. Приготовили прекрасный обед. Ели-пили на халяву до- отвала. Все они скоро стали косыми. Почему-то пропал интерес к пшенице на «Майлабе». Пришел главный агроном и принес все цифры: сколько посеяно, сколько убрано, фамилии ударников труда. Каждому вручили по пакету, видимо, вино и дорогие консервы. Через два часа после приезда машины укатили в Кустанай, увозя пьяненьких журналистов. А через неделю в центральных газетах появились очерки собкоров о том, какая дивная пшеница уродилась в совхозе «Путь к Коммунизму». Семиволов их презирал.
Был в селе магазин без продавца. В нем было вино, сигареты, конфеты, печенье в пачках, крупы и другие продукты в упаковке. Рядом стояли таблички с ценой. У входной двери на столике стояла коробка для денег и тарелочка для мелочи. Жители опускали деньги в коробку и брали сдачу. Никакого воровства никогда не было. Все сходилось. Но уже через неделю после приезда студентов полки опустели. Исчезли винно-водочные изделия. Когда подсчитали выручку, оказалось, что все просто разворовано. Магазин закрыли, и больше он не работал. Позор, да и только.
Я перестала ходить на планерки, поручив это Николаю. Семиволов меня не звал. Все шло своим чередом: работа и любовь. С 10 сентября резко похолодало. Мерзли руки, земля стала сырой, картошка мокрой. А работы был еще непочатый край. Мои девочки дрожали от холода. Николай вел переговоры с директором. Привезли брезентовые куртки и грубые рабочие рукавицы. Их раздали моим бедным курочкам. Они приезжали в поле и садились на перевернутые ведра. И какая работа в рукавицах? То, что раньше собирали за день, теперь удавалось собрать за три дня. Многие простудились, и я их оставляла дома. Днем солнышко еще пригревало, но темнело рано, часов в 6. Одно радовало: студентов кормили сытно и вкусно. Мария Ивановна свои обязательства выполняла честно.
Константин каждый вечер стучал в окошко. Я выходила к нему на пять минут. Один поцелуй, и – «до завтра». Какая любовь в такую холодину? Завтра я говорила: «завтра». Время шло, и чем больше я охладевала к нему, тем больше он хотел меня.
Кто сказал, что делать любовь на сене в поле хорошо? Чепуха. Солнце печет. Сено колется, пахнет пылью, в стогу шныряют полевые мыши и еще какие-то твари. А после дождичка сено мокрое и пахнет гнилью. Нет, это не для меня.
Вот мягкие белоснежные шелковистые простыни, упругая кровать – это да! Горит ночник, можно отпить глоточек вина, закусить шоколадом или апельсином, или поцелуем. Слушать хорошую музыку… Рядом лежит голый мужчина, расслабленный, утомленный, но готовый ответить на новый призыв. Никакого тебе ветра, не кусаются надоедливые мухи, не жужжат пчелы. На стуле рядом кучка кружев – скинутый женский пеньюар. Он пахнет французскими духами. Никаких семейных трусов в цветочек. Симпатичные импортные плавки. А на полу мягкий ковер. Все располагает к нежности и ласке. Телефонные звонки остаются без ответа – нас нет дома. Захотелось цивилизации, Я человек городской от макушки до пят. Свой деревенский голод я утолила сполна. Боже! А какие дикие сельскохозяйственные комплименты! Осточертели мне «косточки», я захотела мясца. Слова «спелое зернышко» и «перепелочка» такие глупые и ничего не выражающие. Просто противно. А чего стоит «пшеничка»? Разве я похожа на зерно? Я считала дни до отъезда, но месяц оказался таким длинным.

[Продолжение следует]


Відповісти

Ця інформація зберігається приватно і не буде оприлюднена.
  • Дозволені HTML теґи: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br> <tr> <td> <table>
  • Рядки та параграфи відокремлюються автоматично.
  • Images can be added to this post.
Детальніше про опції форматування