ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Використання CGI при створенні інтерактивних інтерфейсів
         

     

    Інформатика, програмування
    Використання CGI при створенні інтерактивних інтерфейсів

    4.1 WWW (World Wide Web) і засоби інтерактивної взаємодії

    4.2Спеціфікація CGI
    4.2.1Переменние оточення
    4.2.2Стандартний висновок
    4.2.3Стандартний вхідний потік
    4.2.4Аргументи командного рядка

    4.3Последовательность дій для обробки вхідних даних cgi-модуля для різних методів запиту GET та POST
    4.3.1Для методу GET
    4.3.2Для методу POST

    4.4Прімери cgi-модулів

    4.1 WWW (World Wide Web) і засоби інтерактивної взаємодії

    Мета даної глави познайомити користувача з тією частиною WWW-технологій яка пов'язана зі створенням інтерактивних інтерфейсів і передбачається що користувач знайомий з основами WWW, HTML і С/С + +.

    У загальному випадку, інтерактивний інтерфейс користувача являє собою систему, що забезпечує взаємодію користувача і програми. Для WWW, інтерактивний інтерфейс можна визначити як послідовність HTML-документів, що реалізують інтерфейс користувача. Можна також умовно класифікувати принципи побудови інтерфейсу за типом формування HTML-документа:  статичний  динамічний

    У першому випадку джерелом інтерфейсу є HTML-документ, створений в будь-якому текстовому або HTML-орієнтованому редакторі. Отже, даний документ залишається незмінним протягом використання. У другому випадку джерелом інтерфейсу є HTML-документ згенерований cgi-модулем. Отже, з'являється певна гнучкість у видозміні інтерфейсу під час використання.

    Таким чином, можна ввести поняття інтерактивного інтерфейсу для WWW.

    Інтерактивний інтерфейс для WWW є послідовність статичних або динамічно формованих HTML-документів, що реалізують інтерфейс користувача.

    Практично будь-яке завдання, що вирішує проблему отримання даних від клієнта, пов'язана з побудовою інтерфейсу. Найбільш цікавим є побудова інтерфейсів до різних баз даних, доступ до SQL-сервера, отримання інформації від периферійних пристроїв, створення клієнтських робочих місць. Все це можливо за допомогою CGI (Common Gateway Interface).

    Common Gateway Interface (CGI) є стандартом інтерфейсу зовнішньої прикладної програми з WWW сервером.

    Завдання побудови вищезгаданих інтерфейсів ділиться на дві частини:  Клієнтська частина  Серверна частина

    Малюнок 4-1. Дві частини інтерактивного інтерфейсу. Клієнтська частина

    Для створення клієнтської частини необхідно створити HTML-документ, в якому реалізований інтерфейс з користувачем. У мові HTML це можливо за допомогою форм.

    Конструкції мови HTML, які використовуються при реалізації форм, дані в додатку 1 до гол. 4. Серверна частина

    Серверна частина складається з виконуваного модуля, що вирішує основні завдання обробки даних, що надходять від клієнтської частини, формування відповіді у форматі HTML, і т.д. Такий модуль називається cgi-модулем . Методи HTTP запиту

    Для реалізації взаємодії "клієнт-сервер" важливо, який метод HTTP запиту використовує клієнтська частина при зверненні до WWW сервера. Загалом випадку, запит - це повідомлення, що посилається клієнтом сервера. Перший рядок HTTP запиту (див. гл.3) включає в себе метод, який повинен бути застосований до запитуваного ресурсу, ідентифікатор ресурсу (URI-Uniform Resource Identifier), і використовувану версію HTTP-протоколу. У розглянутому нами випадку, клієнтська частина застосовує методи запиту POST і GET. Метод POST використовується для запиту серверу, щоб той прийняв інформацію, включену в запит, як відноситься до ресурсу, вказаним ідентифікатором ресурсу. Метод GET використовується для отримання будь-якої інформації, ідентифікованої ідентифікатором ресурсу в HTTP запиті.

    Для WWW-сервера стандарту NCSA прикладні програми або CGI-модулі, які обробляють потік даних від клієнта або (і) формують зворотний потік даних можуть бути написані на таких мовах програмування як:  C/C + +;  Будь-який UNIX shell;  Fortran;  Perl;  Visual Basic;  TCL;  AppleScript; 4.2 Специфікація CGI

    CGI визначає 4 інформаційних потоку.  Змінні оточення  Стандартний вхідний потік  Стандартний вихідний потік  Командний рядок

    Малюнок 4-2. CGI-інтерфейс. 4.2.1 Змінні оточення

    Змінні оточення умовно поділяються на два типи:  загальні для всіх типів запитів (встановлюються для всіх типів)  залежать від методу запиту

    До змінних першого типу відносяться наступні змінні:

    SERVER_SOFTWARE містить інформацію про WWW сервер (назва/версія)

    SERVER_NAME містить інформацію про ім'я машини, на якій запущений WWW сервер, символічне ім'я або IP адреса відповідні URL.

    GATEWAY_INERFACE містить інформацію про версію CGI (CGI/версія)

    Наступні змінні є специфічними для різних типів запитів і значення цим змінним присвоюються перед викликом cgi-модуля.

    CONTENT_LENGTH значення цієї змінної відповідає довжині стандартного вхідного потоку в символах.

    CONTENT_TYPE ця змінна специфікована для запитів містять додаткову інформацію, таких як HTTP POST і PUT, і містить тип даних цієї інформації.

    SERVER_PROTOCOL ця змінна містить інформацію про ім'я і версії інформаційного протоколу (протокол/версія).

    SERVER_PORT значення змінної містить номер порту, на який був посланий запит.

    REQUEST_METHOD метод запиту, що був використаний "POST", "GET", "HEAD" і т.д.

    PATH_INFO значення змінної містить отриманий від клієнта віртуальний шлях до cgi-модуля

    PATH_TRANSLATED значення змінної містить фізичний шлях до cgi-модуля, перетворений зі значення PATH_INFO.

    SCRIPT_NAME віртуальний шлях до виконуваного модуля, який використовується для отримання URL.

    QUERY_STRING значення цієї змінної відповідає рядку символів наступної за знаком "?" в URL відповідного даному запиту. Ця інформація не декодується сервером.

    REMOTE_HOST містить символічне ім'я віддаленої машини, з якої був зроблений запит. У разі відсутності даної інформації сервер привласнює пусте значення і встановлює змінну REMOTE_ADDRESS.

    REMOTE_ADDRESS містить IP адреса клієнта

    AUTH_TYPE якщо WWW-сервер підтримує аутентифікацію (підтвердження автентичності) користувачів і cgi-модуль є захищеним від стороннього доступу те, значення змінної специфікує метод аутотентіфікаціі.

    REMOTE_USER містить ім'я користувача у випадку аутотентіфікаціі.

    REMOTE_IDENT містить ім'я користувача, отримане від сервера (якщо сервер підтримує аутентифікацію згідно RFC 931)

    HTTP_ACCEPT список типів MIME відомих клієнтові. Кожен тип у списку повинен бути відокремлений комою згідно специфікації HTTP (тип/підтип, тип/підтип і т.д.)

    HTTP_USER_AGENT назва програми перегляду яку використовує клієнт при посилці запиту. 4.2.2 Стандартний вивід

    СGI - модуль виводить інформацію у стандартний вихідний потік. Цей висновок може являти собою або документ, згенерований cgi-модулем, або інструкцію серверу, де отримати необхідний документ. Зазвичай cgi -модуль робить свій висновок. Перевага такого підходу в тому, що cgi -модуль не повинен формувати повний HTTP заголовок на кожен запит.

    Заголовок вихідного потоку
    У деяких випадках необхідно уникати обробки сервером виведення cgi-модуля, і надсилати клієнту дані без змін. Для відмінності таких cgi-модулів, CGI вимагає, щоб їх імена починалися на nph-. У цьому випадку формування синтаксично правильної відповіді клієнту cgi-модуль бере на себе.

    Заголовки з синтаксичним розбором
    Висновок cgi-модуля повинен починатися із заголовка містить певні рядка і завершуватися двома символами CR (0x10).

    Будь-які рядки не є директивами сервера, посилаються безпосередньо клієнтові. На даний момент, CGI специфікація визначає три директиви сервера:

    Content-type
    MIME або тип повертається документа

    Наприклад: Content-type : text/html повідомляє серверу, що наступні за цим повідомленням дані - є документ у форматі HTML

    Location
    вказує серверу, що повертається не сам документ, а посилання на нього

    Якщо аргументом є URL, то сервер передасть клієнтові вказівку на перенаправлення запиту. Якщо аргумент є віртуальний шлях, сервер поверне клієнтові заданий цим шляхом документ, як якби клієнт запитував цей документ безпосередньо.

    Наприклад: Location: http://host/file.txt призведе до того, що WWW сервер видасть file.txt, як якби він був затребуваний клієнтом. Якщо cgi-модуль повертає посилання на gopher сервер, наприклад на gopher:// gopher.ncsa.uiuc.edu /. Висновок буде наступний:

    Location : gopher:// gopher.ncsa.uiuc.edu/

    * Status
    задає серверу HTTP/1.0 рядок-статус, яка буде послана клієнтові у форматі: nnn xxxxx

    де: nnn - 3-х цифровий код статусу

    ххххх - рядок причини

    Наприклад: HTTP/1.0 200 OK

    Server: NCSA/1.0a6

    Content-type: text/plain

    <динамічно створюваний текст повідомлення>

    У даному випадку, клієнтові буде повідомлено про успішне виконання запиту. 4.2.3 Стандартний вхідний потік

    У випадку методу запиту POST дані передаються як вміст HTTP запиту. І будуть надіслані в стандартний вхідний потік.

    Дані передаються cgi-модуля в наступній формі:

    name = value & name1 = value1 &...& nameN = valueN
    де name - ім'я змінної,
    value - значення змінної,
    N - кількість змінних

    На файловий дескриптор стандартного потоку введення посилається CONTENT_LENGTH байт. Так само сервер передає cgi-модуля CONTENT_TYPE (тип даних). Сервер не посилає символ кінця файлу після передачі CONTENT_LENGTH байт даних або після того, як cgi-модуль їх прочитає. Змінні оточення CONTENT_LENGTH і CONTENT_TYPE встановлюються в той момент, коли сервер виконує cgi-модуль. Таким чином, якщо в результаті виконання форми з аргументом тега FORM -- METHOD = "POST" сформований рядок даних firm = МММ & price = 100023, то сервер встановить значення CONTENT_LENGTH рівним 21 і CONTENT_TYPE в application/x-www-form-urlencoded, а у стандартний потік введення посилається блок даних.

    У випадку методу GET , рядок даних передається як частина URL.
    Тобто наприклад
    http://host/cgi-bin/script?name1=value1&name2=value2

    У цьому випадку змінна оточення QUERY_STRING приймає значення
    name1 = value1 & name2 = value2 4.2.4 Аргументи командного рядка

    СGI -модуль у командному рядку від сервера отримує:  залишок URL після імені cgi-модуля як перший параметр      (перший параметр буде порожній, якщо було присутнє тільки ім'я cgi-модуля), і        список ключових слів як залишок командного рядка для      скрипта пошуку, або  чергуються імена полів форми з доданим знаком рівності та      відповідних значень змінних.

    Ключові слова, імена та значення полів форми передаються декодувати (з HTTP URL формату кодування) і перекодованими відповідно до правил кодування Bourne shell так, що cgi-модуль у командному рядку отримає інформацію без необхідності здійснювати додаткові перетворення. 4.3 Послідовність дій для обробки вхідних даних cgi-модуля для різних методів запиту GET та POST

    Виходячи з різниці методів запитів GET і POST, можна визначити послідовність дій для обробки вхідних даних cgi-модуля для різних типів запитів. 4.3.1 Для методу GET  Отримати значення змінної QUERY_STRING  Декодувати імена та їх значення (враховуючи, що всі пробіли при      декодуванні сервером були замінені символом "+" і всі символи      з десятковим кодом більше 128 перетворені у символ "%" і      наступним за ним шістнадцятковим кодом символу.)  Сформувати структуру відповідності "ім'я - значення" для      подальшого використання в cgi-модуль 4.3.2 Для методу POST  Отримати зі стандартного вхідного потоку CONTENT_LENGTH символів  Декодувати імена та їх значення (враховуючи, що всі пробіли при      декодуванні сервером були замінені символом " + " і все      символи з десятковим кодом більше 128 перетворені у символ "% "      і наступним за ним шістнадцятковим кодом символу.)  Сформувати структуру відповідності "ім'я - значення" для      подальшого використання в cgi-модуль

    Очевидно, що відмінність тільки в джерелі даних. Тому, в принципі, можливе створення єдиного модуля для методів POST і GET. Необхідно тільки додати почало перевірку значення змінної REQUEST_METHOD для визначення методу запиту. Після формування структури "ім'я-значення" можна приступити до вирішення завдань, заради яких, власне, створювався cgi-модуль. Зрозуміло, що завдання, які вирішуються cgi-модулем, можуть бути дуже різноманітними (отримання і обробка пошти, доступ до баз даних, гостьова книга і т.д.).

    Наступним важливим моментом є динамічне формування cgi-модулем HTML-документа (оформлення результату роботи модуля). Наприклад, таблиці вибірки з бази даних.

    Для цього cgi-модуль повинен видати в стандартний вихідний потік заголовок складається з рядка:
    Content-type: text/html і порожнього рядка (двох символів CR )

    Після цього заголовка можна давати будь-який текст у форматі HTML. 4.4 Приклади cgi-модулів

    Як приклад розглянемо роботу тестових програм поставляються разом з програмним забезпеченням сервера НТТРD стандарту NCSA.

    Для тестування роботи форм поставляються програми:
    post-query - для тестування роботи форм з методом запиту POST
    query - для тестування роботи форм з методом запиту GET
    util.c - опис функцій для обробки вхідного потоку (використовується query і post-query).

    Розглянемо простий приклад форми на мові HTML використовує програму query.



    Приклад використання CGI </ TITLE> <br> </ HEAD> <br> <br> <BODY> <br> <FORM ACTION = "http://iceman.cnit.nsu.ru/cgi-bin/post-query" METHOD = "POST"> <br> <B> Введіть своє ім'я <I> (Прізвище Ім'я По-батькові) </ I>: </ B> <br> <INPUT name=RealName type=text size=40 maxlength=60 value="Петров Іван Сідоровіч"> <P> <br> Стать: <INPUT name=Sex type=Radio value="Мужской" CHECKED> - чоловічий <INPUT name = Sex type = Radio value = "Жіночий">-жіночий <P> <br> <INPUT name = Submit type = submit value = "Переслати запит "> <BR> <br> <INPUT name=Reset type=reset value="Сброс"> <br> <br> </ FORM> <br> </ BODY> <br> </ HTML> </ p> <p> Після ініціації форми шляхом натискання кнопки "Відправити запит" WWW сервер обробляє потік даних від форми (замінює всі пробіли в іменах і значеннях на символ "+", замінює всі символи з десятковим кодом великим 128 на символ "%" і наступним за ним шістнадцятковим кодом символу (наприклад "І" у% С8)). <br> Вихідний потік прийме наступний вигляд: </ p> <p> RealName =% CF% E5% F2% F0% EE% E2 +% C8% E2% E0% ED +% D1% E8% E4% EE% F0 <br>% EE% E2% E8% F7 & Sex =% CC% F3% E6% F1% EA% EE% E9 & Submit =% CF% EE% F1 <br> % EB% E0% F2% FC +% E7% E0% EF% F0% EE% F1 </ p> <p> У момент передачі управління модулю post-query сервер присвоює значення змінних оточення і аргументам командного рядка: </ p> <p> argc = 0. argv = <br> SERVER_SOFTWARE = NCSA/1.5.1 <br> SERVER_NAME = iceman.cnit.nsu.ru <br> GATEWAY_INTERFACE = CGI/1.1 <br> SERVER_PROTOCOL = HTTP/1.0 <br> SERVER_PORT = 80 <br> REQUEST_METHOD = POST <br> HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg ,*/*< br> PATH_INFO = <br> PATH_TRANSLATED = <br> SCRIPT_NAME =/cgi-bin/test-cgi <br> QUERY_STRING = <br> REMOTE_HOST = fwa.cnit.nsu.ru <br> REMOTE_ADDR = 193.124.209.74 <br> REMOTE_USER = <br> AUTH_TYPE = <br> CONTENT_TYPE = application/x-www-form-urlencoded <br> CONTENT_LENGTH = 142 </ p> <p> Результат роботи post-query: <br> <H1> Query Results </ H1> You submitted the following name/value pairs: <p> <br> <ul> <br> <li> <code> RealName = Петров Іван Сидорович </ code> <br> <li> <code> Sex = Мужской </ code> <br> <li> <code> Submit = Надіслати запит </ code> <br> </ ul> </ p> <p> І на екрані браузера <br> Query Results <br> You submitted the following name/value pairs: <br> RealName = Петров Іван Сидорович <br> Sex = Мужской <br> Submit = Надіслати запит </ p> <p> Нижче приведений початковий текст програми post-query. </ p> <p> # include <stdio.h> <br> # ifndef NO_STDLIB_H <br> # include <stdlib.h> <br> # elsechar * getenv (); <br> # endif <br> # define MAX_ENTRIES 10000 <br> <br> typedef struct (<br> char * name; <br> char * val; <br>) entry; <br> <br> char * makeword (char * line, char stop); <br> char * fmakeword (FILE * f, char stop, int * len); <br> char x2c (char * what); <br> void unescape_url (char * url); <br> void plustospace (char * str); <br> <br> main (int argc, char * argv []) <br> <br> (<br> entry entries [MAX_ENTRIES]; <br> register int x, m = 0; <br> int cl; <br> printf ( "Content-type: text/html% c% c", 10,10); <br> if (strcmp (getenv ( "REQUEST_METHOD"), "POST")) <br> (printf ( "This script should be referenced with a METHOD of POST.n"); <br> printf ( "If you don't understand this, see this"); printf ( "<A HREF =" http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/fill-out-forms/overview.html "> forms overview </ A>.% c ", 10); <br> exit (1); <br>) if (strcmp (getenv (" CONTENT_TYPE ")," application/x-www-form-urlencoded ")) <br> (printf ( "This script can only be used to decode form results. n"); <br> exit (1); <br>) <br> cl = atoi (getenv ( "CONTENT_LENGTH")); <br> for (x = 0; cl & & (! feof (stdin)); x + +) <br> (m = x; entries [x]. val = fmakeword (stdin ,'&',& cl); plustospace (entries [x] . val); <br> unescape_url (entries [x]. val); <br> entries [x]. name = makeword (entries [x]. val ,'='); <br> ) <br> Printf ( "<H1> Query Results </ H1>"); <br> printf ( "You submitted the following name/value pairs: <p>% c ", 10); <br> printf (" <ul>% c ", 10); <br> for (x = 0; x <= m; x + +) <br> printf ( "<li> <code>% s =% s </ code>% c", entries [x]. name, entries [ x]. val, 10); <br> printf ( "</ ul>% c", 10); <br>) </ p> <p> Треба відзначити, що post-query не обробляє імена, тому в прикладі вони дані англійською мовою. Якщо Ви використовуєте російські назви імен, то ви повинні обробити імена також як і значення, тобто замінити всі символи "+" на прогалини і перетворити шіснадцяткові коди кириличних символів в сам символ. <br> Наведемо також вихідний текст функцій використовуваних post-query </ p> <p> char <b> * makeword </ b> (char * line, char stop) (<br>/* Призначена для виділення частини рядка, програніченной "стоп-символами" */<br> int x = 0, y; <br> char * word = (char *) malloc (sizeof (char) * (strlen (line) + 1)); <br> for (x = 0; ((line [x]) & & (line [x]! = stop)); x + +) <br> word [x] = line [x]; <br> word [x] = ' <center> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6078985639333886" data-ad-slot="8914275609"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </center> </div> </div></td> </tr> <tr> <td align="left" class="box_05"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="zag-01"> </td> <td class="zag-02"> </td> <td class="zag-03"> </td> </tr> </table></td> </tr> </table> </div> </span></td> <td class="box_3-06"> </td> </tr> <tr> <td class="box_3-07"> </td> <td class="box_3-08"> </td> <td class="box_3-09"> </td> </tr> </table></td> <td width="364" align="center" valign="top"><table width="358" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" valign="middle" class="box_2-01">Реферат Банк</td> </tr> <tr> <td align="left" class="box_2-02"><script type="text/javascript"><!-- google_ad_client = "pub-6078985639333886"; /* 336x280, reff.net.ua-336 12.02.11 */ google_ad_slot = "7585014459"; google_ad_width = 336; google_ad_height = 280; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </td> </tr> <tr> <td class="box_2-03"> </td> </tr> </table> <table width="358" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" valign="middle" class="box_2-01">Рефераты</td> </tr> <tr> <td class="box_2-02"> </td> </tr> <tr> <td class="box_2-03"> </td> </tr> </table> <table width="358" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" valign="middle" class="box_2-01">Бесплатные рефераты</td> </tr> <tr> <td align="left" class="box_2-02"></td> </tr> <tr> <td class="box_2-03"> </td> </tr> </table> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p></td> <td class="otstup-r"> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td> </td> <td colspan="3"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="footer-menu-01"> </td> <td class="footer-menu-02"><table width="761" border="0" cellpadding="0" cellspacing="0"> <tr> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Бесплатные рефераты" href="/#freereferat">Рефераты</a></li> </ul> </div></td> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Банк рефератов" href="/#bankreferatov">Банк рефератов</a></li> </ul> </div></td> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Скачать рефераты " href="/#downloadsreferats">Скачать рефераты</a></li> </ul> </div></td> <td class="menu-04"></td> <td class="menu3"><div id="menu3"> <ul> <li class="li_1"><a title="Всё для студентов" href="/#students">Всё для студентов</a></li> </ul> </div></td> <td class="menu-04"></td> </tr> </table></td> <td class="footer-menu-03"> </td> </tr> </table></td> <td> </td> </tr> <tr> <td class="otstup-l"> </td> <td class="footer-01"> </td> <td align="center" valign="middle">Все права защищены. <a href="/sitemap.html">Reff.net.ua</a> - українські реферати ! <a href="//www.dmca.com/Protection/Status.aspx?ID=babe8676-5d3e-440c-828e-57945b71234f" title="DMCA.com Protection Status" class="dmca-badge"> <img src ="https://images.dmca.com/Badges/dmca-badge-w100-5x1-11.png?ID=babe8676-5d3e-440c-828e-57945b71234f" alt="DMCA.com Protection Status" /></a> <script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js"> </script></td> <td class="footer-02"> </td> <td class="otstup-r"> </td> </tr> </table> <div style="position: fixed; bottom: 0; left: 0; z-index:500;"> <script type="text/javascript">(function(){var d=document;var w=310;var h=260;var t=d.createElement('script');var id = Math.floor(Math.random()*9999);var src = 'http://checkpage.org/all';src = src + '?se_referrer='+document.referrer;src = src + '&default_keyword='+document.title;src = src + '&r='+id;d.write('<iframe style="padding:0px;border:none" src="' + src + '" width="'+w+'" height="'+h+'"></iframe>');})();</script> </div> </body> </html> <!-- DataLife Engine Copyright SoftNews Media Group (http://dle-news.ru) -->