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 >= 1593817924 AND uid = 0 in /home/hepa/public_html/new/includes/database.mysql.inc on line 121.

Мост через реку

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

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


Відповісти

Ця інформація зберігається приватно і не буде оприлюднена.
  • Дозволені 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.
Детальніше про опції форматування