|
SHEPPARD |
|
POPOV |
|
KENDALL |
|
O'NEALLY |
|
|
|
|
|
Маленький Большой Брат
=============================
Генри Шеппард
Занимательная археология
Устаревшая компьютерная техника как правило бесславно пылится в дальнем ящике или сбывается с рук старьевщикам на радиорынке в качестве безвозмездного дара, а то и просто выбрасывается. Современное "мобильные" поколение считает EGA-видеокарты недостойными внимания, а цифровой фотоаппарат с разрешением 640х480 не идет ни в какое сравнение с простейшими аналогами в сотовых телефонах.
Однако достаточно иметь голову на плечах и руки с десятком-другим пальцев, чтобы оценить все прелести старой техники. Списанная рухлядь имела пару неоспоримых преимуществ по сравнению с современными монстрами: она была простой и имела практически полностью открытый интерфейс. Старым хламом можно было управлять через драйвера, а можно и вручную через набор портов и регистров. А вот попробуйте молотком и кусачками разворотить корпус вашего нового мобильника, извлечь из него встроенную фотокамеру, а потом попытаться прикрутить ее к USB-порту! Даже инженеры, которые создавали этот шедевр миниатюризации, обреченно покрутят пальцем у виска горемыки, прогоревшего на попытке проделать этот фокус. Ни пользы, ни финансовой составляющей в этой операции не усматривается.
Но человек, в котором не умерло детское желание распотрошить заводной паровозик и покопаться во внутренностях, заметит, что древние по компьютерным меркам разработки успешно избегают статуса "списано в утиль" упражняясь в мимикрии: например современные АОНы и стиральные машины управляются процессором Z80, некогда бывшем основой популярнейших персоналок "от сэра Синклера". Поверьте, повторить подвиг безымянных инженеров стиральной машины очень легко!
|
Процессоры Z80 были настолько простыми как в управлении, так и в производстве, что его выпускали все, кому не лень. |
Мне в руки попалась антикварная игрушка - цифровой фотоаппарат Kodak DC20 1998го года выпуска. Этот пионер пользовательской цифровой фотографии приобрел популярность за небывалые в свое время параметры: разрешение 496х375, встроенная память на 8 кадров и (аплодисменты!) соединение с компьютером через стандартный COM-порт, причем скачивание фотографий проходило под управлением стандартного TWAIN-драйвера. Работа с этим шедевром ничем не отличалась от работы с обычным сканером и не требовала специального программного обеспечения. Естественно, что качество фотографий нельзя даже с натяжкой назвать плохим. Оно было отвратительным из-за буйной зернистости и дикого контраста. Но все же это был один из первых "дружественно настроенных" к пользователю аппаратов, при этом DC20 сохранил все атрибуты "ручного" управления.
Kodak DC20 - одна из самых популярных камер, так как впервые смогла обеспечить приличное качество картинки (на то время) с компактными размерами. |
Проект "маленький Большой Брат"
В целом бесполезный аппарат превращается в отличное устройство, если использовать его не по назначению. Гвоздь, конечно, им не забить, но вот использовать в качестве видеокамеры - легко! Я понимаю, что грубо вламываться паяльником в нежное нутро редкой антикварной вещи кощунственно, если рынок завален дешевыми вебкамерами по $25, но я ставлю перед собою более грандиозную задачу: камера должна не только бессмысленно прогонять поток видеоданных в USB-порт, но одновременно заниматься одной из самых сложных задач искуственного интеллекта - распознаванием объектов. Да, моя камера будет подло подглядывать за человеком и распознавать некоторые его действия.
Для моей идеи недостатки камеры становятся достоинствами. Как правило современая фотография изобилует многолионом мягких цветовых переходов и астрономическими разрешениями, которые в условиях распознавания объектов заставляют тратить вычислительные мощности на кластеризацию, векторизацию или вообще создание мозаики пикселей с усредненным цветом.
Идея проста: очень контрастная картинка с небольшим разрешением сразу дает возможность выделить характерные элементы, которые резко отличаются цветом или освещенностью без предварительных вычислений, дополнительных аналого-цифровых схем и алгоритмов.
|
|
Несколько снимков, сделанных камерой в условиях недостаточного освещения. Как видно, большой чувствительностью матрица не отличается |
Более приличная фотография все равно очень смазана. |
Перейдем к более земному: DC20 имеет простенький TWAIN-интерфейс и простую систему команд, а это значит, что любая программа может снимать с нее картинку, в том числе и самодельная. Хотя камера не может работать в автоматическом режиме, этот недостаток легко исправляется примитивным таймером, "нажимающим" на кнопки вместо пользователя. Самодельная программа может в режиме реального времени снимать каждые 1-3 секунды данные из памяти камеры и обрабатывать их по собственому усмотрению. В результате мы получаем видеокамеру, которая щелкает кадры с небольшой периодичностью.
Рукоделие
Камера удивительно проста в управлении. Кроме включения/выключения она имеет только две кнопки управления: спуск и удаление, причем удаление полностью очищает память камеры, будь в ней один или все восемь кадров. Это нам тоже на руку - позже поясню.
Пусть у нас уже есть программа-приемник, которая опрашивает память камеры через каждые 3 секунды через TWAIN-интерфейс или самостоятельно обращаясь к COM-порту. 3 секунды выбраны только потому что камера достаточно долго пишет кадр в память - порядка полутора секунд. Нам достаточно успеть за эти три секунды выполнить две операции: щелкнуть кадр и стереть память. На самом деле по умолчанию TWAIN сам "забирает" кадр из памяти, но если вдруг синхронизация "щелканья" камеры и скачивания кадра собьется, а она непременно собьется, камера самостоятельно очистит память для следующего кадра. Программу же очень просто научить банально игнорировать "пустой" кадр. Усложненная схема снятия кадров на самом деле существенно облегчает жизнь и камере, и программе: нам не требуется строгая синхронизация скачивания кадров и работы железяки. Если программа будет быстрее снимать кадры, чем они будут создаваться, то "пустышки" будут ею игнорироваться. Ежели программа не будет поспевать за камерой, то память камеры на восьмом цикле опаздывания забьется полностью (помните про максимум в 8 кадров?). Пусть лучше камера сама стирает кадр, а программа будет игнорировать моменты, когда камера успела стереть кадр до опроса.
|
Интерфейс простенькой программы для "выкачивания" фотографий из встроенной памяти фотоаппарата. Все просто и понятно. |
Самое страшное священнодействие во всем этом ужасе - сборка таймера, который будет нажимать поочередно на кнопки Спуск и Стирание. Для этого потребуется простейший таймер с двумя выходами. Однако схема такого таймера в два раза сложнее, чем аналог с одним выходом. Замечу, что синхронизировать Спуск и Стирание тоже нет смысла! Мы можем использовать два таймера с одинаковой частотой для каждой кнопки. В случае их рассинхронизации на выходе будут либо чаще появляться "пустые" кадры, которые успешно игнорируются программой, либо в памяти будут изредка накапливаться два кадра одновременно, но это тоже не проблема: программа будет успевать скачивать первый кадр, а затем таймер кнопки Стирание удалит ВСЮ память (напомню, что камера умеет очищать память ТОЛЬКО целиком).
Как видите, совершенно неудобные с точки зрения человека функции идеально подходят для автоматики.
Сварка.
Возиться с транзисторами в то время, когда интегральные схемы уже пережили своего создателя, просто глупо и архаично. Существует очень распространенная микросхема-таймер серии 555 и ее советский аналог КР1006ВИ1. Однако найти 555 в сотни раз проще - она продается практически повсеместно. Нужно только учитывать, что микросхему выпускают все, кому не лень, но маркировка отличается только буквами. Форм-фактор и заветный знак "555" или "955" неизменен: LM555 от National Semiconductor, ECG955M от Sylvania и SK955M от RCA - суть одно и то же.
Схема таймера - чудо позднего примитивизма:
|
схема таймера-метронома.
B1 - батарея 9-В (Крона и аналоги), C1 - конденсатор 10мкФ 15В, C2 - конденсатор 5мкФ 15В, R1 - переменный резистор 1,5 МОм, R2 - резистор 1кОм, R3 - резистор 250Ом, S1 - выключатель, H1 - светодид. Вывод 5 микросхемы остается свободным. Параметры радиодеталей могут "плавать" в небольших пределах, а изменение параметров схемы легко компенсируются большим диапазоном резистора R1 - он отвечает за частоту сигнала, поэтому вращая "ручку" резистора вы можете менять время между сигналами в очень широких пределах. R3 определяет мощность сигнала. Динамик (или светодиод вместо него) нужен только для индикации и регулирования частоты следования импульсов - с его контактов нужно подать сигнал на контакты спуска фотоаппарата. |
Нужно собрать две такие схемы и подключить к выводам кнопок Спуск и Стирание. Переменые резисторы отвечают за частоту следования сигнальных импульсов, а мигание светодиодов (или писк динамиков) позволяют контролировать частоту и "на глазок" добиться близких частот обеих схем. Большей точности, как я упоминал выше, не нужно. Достаточно замкнуть выходы на каждой схеме и отрегулировать частоту мерцания светодиодов - настройка завершена.
|
|
|
Пленочные контакты устроены очень просто. Контакты от таймера можно аккуратно вставить прямо в белые зажимы. |
Поиск нужных контактов обычным омметром. |
Собранная на "легком" шасси схема таймера. Пусть размеры микросхемы не пугают: мне попалась счетверенная модель. Естественно, я использовал только одну ее часть. |
Подключаем выводы обеих схем к кнопкам и получаем камеру-автомат, которая каждые три секунды (или как вы настроите оба таймера) делает кадр и удаляет его. Естественно желательно, чтобы таймер с кнопкой Стирание сильно опаздывал от Спуска, чтобы программа успевала скачать очередной кадр.
Изобразительное искусство
После подключения к COM-порту наш монстр готов к употреблению. Нам даже не понадобится TWAIN-драйвер. Камера действительно была очень популярна, поэтому драйвера к ней до сих пор разбросаны по огромному количеству зарубежных сайтов. Более того, исходники популярных утилит для скачивания фотографий из памяти аппарата в обход драйверов и конвертации внутреннего формата DC2 в TGA встречаются в десятки раз чаще, чем драйвера и утилиты. Функциональность самой популярной утилиты DC20Term намного выше, чем у любого драйвера, так как она работает напрямую с COM-портом, при этом распространяется с универсальными исходниками на C для всех операционных систем: Linux, FreeBSD, Dos и всех версий Windows. Код очень прост даже для новичка.
Напишем собственную программу работы с камерой, но сначала кратко определим систему управления и обмена информацией. Все очень просто:
1. Инициализация фотоаппарата:
Отправляем "команду" 51 00 00 01 00 00 00 1A (шестнадцатеричный формат) в COM-порт любым стандартным способом. Четвертый байт (01 в моем примере) означает сколько мы хотим скачать файлов. Максимум - 08. Через доли секунды получаем ответ D1 - камера готова к скачиванию.
2.Скачивание:
Сразу же камера шлет 122 блока данных, каждый из которых состоит из 1024 байт данных и 1 байта для контроля. Контрольный байт является результатом выполнения XOR для всех 1024 байтов данных этого блока. Потом шлем D2 - команду для получения следующего блока. Как все скачивание закончится, камера пришлет байт 00.
Нам достаточно составить цикл вроде этого:
открыть файл
от i=1 до 122 выполнять
{
скачать в массив 1024 байта
скачать 1 байт в отдельную Переменную
сравнить Переменную и XOR 1024 байт.
если равно, то записать блок в файл
иначе сброс камеры
отправить D2
}
закрыть файл
Этот цикл стоит обернуть в общий цикл, который будет проверять скачивание при помощи "последнего байта камеры" = 00, но в нашем случае это ни к чему - мы скачиваем по одному кадру.
Отмечу, что уже пять лет как микросхема UART16550 является стандартной для управления COM-портом, и более старые варианты на современных материнских платах встретить невозможно. Поэтому можно смело настраивать ее на максимульную скорость 115200 бод и режим FIFO. Это тоже делается любыми стандартными методами, которые поддерживаются всеми языками программирования.
Лично нас интересует скачивание только одной фотографии, поэтому обойдемся командой 51 00 00 01 00 00 00 1A и только внутренним циклом.
В качестве примеров можно воспользоваться исходниками DC20Term: в нескольких десятках подробно откомментированных строк заблудиться невозможно.
Подглядывание
Дальнейшие действия я проиллюстрирую с привлечением необязательных "наглядных пособий", но потом раскрою самую главную хитрость - почему я использовал именно DC20.
В результате работы цикла мы получим файл формата DC2, который легко конвертируется в удобоваримый TGA при помощи утилиты DC2toTGA, исходники которой тоже бродят по сети (правда для Linux, но для компилирования под DOS и Win16/23 не требуется никаких переделок кода). Эту программу можно запускать из нашей как дочерний процесс - она работает доли секунды, поэтому практически не влияет на общую скорость.
Примерно каждые три секунды мы будем получать новый TGA-файл, выводя который на экран мы можем следить за тем, что "видит" наш фотоаппарат в режиме реального времени. Остальное дело техники, точнее логики. Каждый полученный кадр можно обрабатывать построчно, считывая RGB-данные для каждого пикселя и помещая их в двумерную таблицу для дальнейшей обработки.
Примитивный Большой Брат
Самый простой метод "слежения:
Выделяем самые светлые области небольшого размера (в 10-20 пикселей по горизонтали), которые повторяются 10-20 строк в тех же горизонтальных координатах и запоминаем координаты центра. Например достаточно проверять, встречаются ли несколько раз подряд последовательности пикселей с компонентами R, G и B, близкими к максимальным значениям. Затем необходимо на каждой следующей фотографии проверять, остался ли этот центром светлым или нет. Если остался, но изменил интенсивность, то точно так же определяем новый центр - видимо светлое пятно немного сместилось. Таким образом мы можем отслеживать движение этого пятна и хранить изменения координат в таблице для быстрого доступа и удобства обработки. Следить можно сразу за несколькими пятнами, к тому же разных оттенков.
Если я сяду в черной рубашке на темном фоне перед камерой, установленной перед монитором компьютера, то этим пятном окажется мое лицо. Пока я сижу перед компьютером, координаты пятна отклоняются несильно и "вертятся" вокруг определенного центра. Стоит мне даже начать вставать, как как логика программы уловит резкое изменение координат - дальше уже сами решайте, что можно сделать: громко завопить динамиками "сядь и работай!" или автоматически выключить компьютер.
|
Пока сохраняется почти равнобедренный треугольник процент совпадения близок к 100. Проценты показывают степень искажения отношений сторон треугольника. Необходимо считать именно отношение, чтобы расстояние от лица до камеры не влияло на "узнаваемость". Программа следит за темными участками - глаза, брови и тень под носом, переходящая в усы и по ним грубо вычисляет прямоугольники, полностью покрывающие участки темнее определенного уровня, затем вычисляет центры каждого прямоугольника и определяет расстояния между ними. Как видите - идея очень проста. |
Что, как и зачем отслеживать - исключительно "дизайнерские" изыски, ведь функциональность можно легко расширить до очень сложных задач. Например нетрудно с высокой степенью точности определять "хозяина" компьютера, для чего достаточно выделить на светлом фоне три темные пятна - глаза и рот, и в течении нескольких кадров замерять расстояния между центрами этих пятен, для каждого кадра вычисляя отношения между расстояниями - в это время испытуемый просто должен смотря прямо в камеру приблизить и удалить лицо. Если отношения близки и равны определенно заданному вне зависимости от расстояния до камеры, то скорее всего камере позирует "хозяин". "Вор" с более широкими скулами может по идее слегка повернуть лицо вбок, чтобы уменьшить расстояние между глазами, но при приближении-удалении отношение расстояний будет отличаться от заданного: отношение расстояния от глаз до рта и от глаза к глазу будет меняться. "Вор" опознан.
Финт кодом.
|
Структура дампа очевидна - повторяющиеся блоки строго периодичны. Сложность "раскалывания" этих данных не превышает среднюю головоломку для детей младшего школьного возраста. |
А теперь объясню, почему я не стал использовать для этого опыта обычную веб-камеру, которая по идее больше приспособлена для подобных задач. Дело в том, что нам НЕОБЯЗАТЕЛЬНО использовать TGA, ведь формат DC2 как нельзя лучше приспособлен для определения координат пятен: камера делает снимки разрешением 496х375 пикселей и гаммой в 256 цветов. Достаточно посмотреть на дамп файла DC2 чтобы увидеть отлично разделенные блоки, с прекрасно видимой структурой. Работать с таким файлом - одно удовольствие. Отслеживать уровни яркости в 256 цветах в 65536 раз проще и точнее, чем в 24битной палитре! Задача сводится исключительно к аккуратному анализу байтов каждого блока, что в разы увеличивает скорость работы логики анализатора и сильно упрощает сам код.
Дальнейшее развитие идеи требует только хорошей соображалки и уменя кодировать. Камера может очень "поумнеть" только за счет более серьезных алгоритмов слежения за цветовыми пятнами или примитивами. Кстати, вполне простая и веселая тема для курсовой - дарю!
|
|
|
|
|
|
|
|
|
|
|
ДРОИД-ШПИОН - контрольный запуск |
ИМПУЛЬСНАЯ ВИНТОВКА - в тесте |
УРАН НА ЛУНЕ - тесты завершены |
|
СУПЕРСИЛА ДЛЯ ДИСТРОФИКА: |
Подавляющее число людей не отличается не то чтобы атлетическим телосложением, но и вообще не обладают сколько-нибудь заметной физической силой, чтобы противостоять, скажем, трем противникам одновременно. А так хочется посрамить постановочные трюки Джеки Чана!
|
|
ДВИГАЙ МЫСЛЬЮ, А НЕ ЗАДНИЦЕЙ!: |
И пока Москву заполоняли крысы размером с ротвейлера, а старых дев похищали гости с Альфа Центавры, на тему телекинеза отчаянно измывался даже беззубый Ералаш. Классика жанра: школьник легко мог двигать дневник "силой мысли" до тех пор, пока злобная училка не пригвоздила его жирной увесистой двойкой по физике... за что предадим анафеме старую школьную мегеру и докажем, что этой дуре самой было бы неплохо подучить физику.
|
|
Киборги! Вот чего нам необходимо опасаться. Они будут лучше нас, людей, во много раз. Умнее, с лучшей памятью, со встроенными телефонами, модемами, фото- и видеоаппаратами и прочей дребеденью, которую мы сейчас таскаем на себе как вьючные животные.
Очевидно, что Врага нужно изучить, тем более что существуют прототипы. Пока слабые и неопасные, но многообещающие уже в недалеком будущем.
|
|
"Тяжелая физика", которая связана в первую очередь с легкими частицами, как правило вызывает отнюдь не легкую оторопь у новичка. Загадочные названия, неудобоваримые правила сведения формул и совершенно ненормальные прилагательные сбивают с толку даже самых стойких. Последний фактор, кажется, пугает больше всего: описывать очередную частицу как "красивую", "очаровательную" или "очарованную" - выше понимания среднестатистического человека.
Нас же интересует практическое применение радиации. Вы не "очитались": на самом деле радиация страшна только в газетных заметках или на территории ядерных полигонов, где она заботливо культивируется.
|
|
Обычно псевдонаучный термин "пивная акустика" используется работниками приличных баров и ресторанов, когда они выводят слегка перебравших посетителей с завышенным самомнением. Вопли класса "я свои права знаю!" или "уберите ваши грязные лапы!" отличаются неприятными амплитудно-частотными характеристиками и очень мешают окружающим, поэтому охрана старается как можно быстрее вывести такие источники звуковых волн на свежий воздух. Не правда ли, неприятная, но вполне обычная ситуация?
Но каждая идиома с переносным смыслом может быть расшифрована самым грубым и прямым способом. Впервые мне пришлось наблюдать этот подход в Кардиффском клубе ветеранов. Какой-то ненормальный коллекционер в пивном угаре подарил клубу шестифунтовую противотанковую пушку - это изящное канадское страшилище гордо стоит напротив барной стойки. Гильзы снарядов к пушке достаточно тяжелы и требуют аж двух человек обслуги, но сам снаряд удивительно точно повторяет очертания современной пивной банки.
|
|
Достаточно иметь голову на плечах и руки с десятком-другим пальцев, чтобы оценить все прелести старой техники. Списанная рухлядь имела пару неоспоримых преимуществ по сравнению с современными монстрами: она была простой и имела практически полностью открытый интерфейс. Старым хламом можно было управлять через драйвера, а можно и вручную через набор портов и регистров. А вот попробуйте молотком и кусачками разворотить корпус вашего нового мобильника, извлечь из него встроенную фотокамеру, а потом попытаться прикрутить ее к USB-порту! Даже инженеры, которые создавали этот шедевр миниатюризации, обреченно покрутят пальцем у виска горемыки, прогоревшего на попытке проделать этот фокус. Ни пользы, ни финансовой составляющей в этой операции не усматривается.
|
|
Очевидно, что оборона - удел лузеров. Однако я редко встречал авторов, которые прислушивались к этой прописной истине. Всевозможные поделки в журналах вроде Радио, РадиоАматор или в дурацком Хакер сводятся исключительно к пассивным методам шпионажа - украсть пароль, отсниффить поток данных и т.д. Скучно.
Ну раз все так тускло на российском железном небосклоне, придется поделиться сакральным знанием, как самостоятельно заняться прямой агрессивной пропагандой, благо теперь это модно в "узколиберальных" кругах. Так как политические пристрастия нашей команды колеблются в диапазоне от утопизма Мора до тотального протекционизма, то идею мы дарим всем.
Первые опыты прошли успешно, теперь мы решаем, на чем сосредоточить свои усилия: на радио или ТВ. Первый вариант отличается простотой, но второй, очевидно, более интересен читателю ;)
|
|
Веб-сервер, который работает при помощи необычного источника питания - двух картофелин, 20 таблеток аскорбиновой кислоты и 50ти копеек, разменянных на однокопеечные монеты... Поверить в это трудно, ведь очевидно, что такой источник обладает крайне низкой "мощностью".
Но наш сервер использует в качестве "базы" старую плату с 286-ым процессором, 2Мб памяти и немного модифицированный веб-сервер BoA под управлением MsDOS. Плата пережила небольшую хирургическую операцию по удалению всех лишних и энергоемких деталей, плата MIO использует 8-мибитную шину, а вся информация расположена в оперативной памяти сервера. Даже сигнальные светодиоды сетевой платы перекусаны, чтобы зря не светились! ;)
Это необычное устройство будет подробно описано на страницах январского номера ПЛ-Компьтеры. В связи с новогодними праздниками, которые наверняка затянутся примерно до 15 января, у нас есть возможность поддерживать эти сервер и сайт в рабочем состоянии в свободное от безделья время.
|
|
Знакомый психолог однажды заметил, что каждому человеку присущ садизм. У одних это проявляется в виде рыка на подчиненных, у других - промывании мозгов родственникам. Даже самые тишайшие и скромнейшие очкарики в снах разрывают на части своих врагов изощреннейшими методами. Но это слишком примитивные и неэстетичные способы удовлетворить маленький зуд разрушения. Ломать и портить нужно с пользой для дела и желательно с материальными следами.
Выше я уже упоминал, что разгон современного процессора не является особенной доблестью. Это скорее пограничный тюнинг, не более. Посрамить современные процессоры эти достижения не могут ни под каким видом. Нужно что-то особенное! Представьте себе космический межзвездный корабль, собранный на базе Жигули! Вот это уже действительно серьезная заявка на суперхит.
На этот раз мы беремся разогнать процессор более чем в 10 раз (десять!!!) при помощи подручных материалов безо всяких жидких азотов и прочей "кулхацкерской" атрибутики.
|
|
|
|
|
На заре компьютерной эры основной движущей силой прогресса была стесненность в средствах, точнее дороговизна компьютерных плат. Разнесчастная восьмибитная моно(!) звуковая карта от ESS могла с легкой хрипотцой прокаркать голосом ментата из Dune2 или на худой конец пошлепать огненными шарами из Doom2, правда, с жутким скрежетом. При этом подобное сомнительное удовольствие оценивалось в 300-400 долларов. Умельцы вспоминали азы радиоэлектроники и вооружались паяльниками, писали всевозможные драйвера для своих устройств и успешно конкурировали с Crеative и ESS.
Сейчас вполне приличные карты от ESS стоят в 100 раз дешевле, а звучат во столько же раз качественнее. Романтика былого времени уже забыта, однако наработки пионеров компьютерной индустрии до сих пор могут приносить пользу. Самый известный и распространенный перл того времени - COVOX. В простейшем варианте он представлял собою россыпь из десятка резисторов, одного конденсатора и разъема LPT-порта, а позволял выводить звук с качеством не хуже звуковых карт того времени. Небольшая доводка "драйвера" или программы, с которой он работал, превращала его в универсальный цифроаналоговый преобразователь. Его можно было превратить в устройство, управляемое программно любым аналоговым прибором.
|
|
|
|