<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
 <description>
  <title-info>
   <genre>comp_programming</genre>
   <author>
    <first-name></first-name>
    <last-name>DarkGoodWIN</last-name>
    <id>118331</id>
   </author>
   <book-title>Рефакторинг. Зачем?</book-title>
   <date></date>
   <coverpage>
    <image l:href="#cover.jpg"/></coverpage>
   <lang>ru</lang>
  </title-info>
  <document-info>
   <author>
    <first-name>Иван</first-name>
    <last-name>Пономарев</last-name>
    <nickname>Ivan62</nickname>
    <email>ipatr@ro.ru</email>
   </author>
   <program-used>OOoFBTools-2.42 (ExportToFB21), FictionBook Editor Release 2.6.6</program-used>
   <date value="2016-06-16">16.06.2016</date>
   <id>ABA373C9-8EDC-4B42-860D-2A9AB29FD6DB</id>
   <version>1.0</version>
  </document-info>
  <publish-info>
   <year>2013</year>
  </publish-info>
 </description>
 <body>
  <section>
   <title>
    <p>DarkGoodWIN</p>
    <p>Рефакторинг</p>
    <p>Зачем?</p>
   </title>
   <section>
    <empty-line/>
    <p><image l:href="#img_0.png"/></p>
    <subtitle>Программы, мысли, темы</subtitle>
   </section>
   <section>
    <title>
     <p><strong>Введение</strong></p>
    </title>
    <p>Время от времени мне доводилось отвечать на вопросы, которые в конечном счёте можно сформулировать как: «что такое рефакторинг и для чего он нужен?». Конкретные вопросы могли быть разные, например, чем объектно–ориентированное программирование лучше функционального. Этот вопрос относится к рефакторингу куда больше, чем принято считать.</p>
    <p>Так что же такое рефакторинг? Это любое изменение программы, которое не изменяет её функциональности. Для чего же тогда делать это изменение? Дело в том, что в отличии от книг, где буковки прочно занимают свои места раз и навсегда, программный код — это нечто живое, постоянно изменяемое. В крупных проектах объём кода может составлять десятки или даже сотни мегабайт. Это сопоставимо по объему с домашней библиотекой средних размеров. Найти что–то среди такого количества информации — задача, вообще говоря, нетривиальная, ну а понять написанное — зачастую и вовсе неразрешимая. Так вот, рефакторинг направлен, прежде всего, на решение этих проблем.</p>
    <p>Задачи рефакторинга тесно связанны с задачами написания понятного, удобного кода. Соответственно, если я пишу как следует писать или чего лучше избегать — это к рефакторингу не относится. С одной стороны. Но ведь следуя этим рекомендациям, вы можете пересмотреть свой код и исправить потенциальные ошибки. А вот это уже чистой воды рефакторинг. Поэтому я не буду особенно зацикливаться именно на рефакторинге, а буду рассказывать о хорошем, понятном коде.</p>
    <p>Разумеется, моё представление о хорошем коде может коренным образом отличаться от вашего и тут я не претендую на статус непогрешимого. Хочу только заметить, что всё, что изложено в этой книге основано на многолетних наблюдениях и в целом, так или иначе, согласуется с общепризнанными подходами к программированию.</p>
    <p>Примеры я буду приводить на языке Object Pascal. В основном я работаю на нём, пишу на Delphi. Предвидя нападки со стороны поклонников C-подобных языков, скажу два тезиса:</p>
    <p>1. Подходы к организации программного кода от языка не зависят. Язык может лишь поддерживать или не поддерживать те или иные конструкции.</p>
    <p>2. Сугубо субъективно считаю Pascal более читабельным языком. То есть для программирования, возможно, большая локаничность C — плюс, а для обучения, я считаю, лучше годиться более развернутый, более приближенный к человеческой речи синтаксис Pascal.</p>
    <p>Ну что же, начнём, пожалуй.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Именование переменных и функций</strong></p>
    </title>
    <p>Первым делом проиллюстрируем то, о чем буду говорить примером:</p>
    <p><code>function func(i1, i2: Integer): Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= i1 * i2;</code></p>
    <p><code>end;</code></p>
    <p>Довольно простая функция, но сколько времени нужно, чтобы понять что она делает? А теперь представьте, что она куда больше по размеру и у вас таких десяток? Каждый раз, когда вы или кто–то ещё будет натыкаться на такую функцию — неменуемо будет тратиться лишнее время.</p>
    <p>Приведу два основных тезиса:</p>
    <p>1. Если по названию функции понятно, что она делает — есть высокая вероятность, что вы будете избавлены от необходимости анализа её содержимого.</p>
    <p>2. Если названия переменных отражают характер величины, которая в них хранится — код читать значительно проще, а значит быстрее и безопаснее. Неправильно истолкованный фрагмент кода может привести к серьёзной ошибке.</p>
    <p>Попробуем немного поменять нашу функцию:</p>
    <empty-line/>
    <p><code>function RectArea(Width, Height: Integer): Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Width * Height;</code></p>
    <p><code>end;</code></p>
    <p>Правда стало понятнее? Вообще говоря, исходя из того, что функция просто умножает два числа, можно было бы её просто Mult. Однако, в ряде случаев это хуже. Посмотрим на такой фрагмент кода:</p>
    <p><code>if Mult(Width, Height) &gt; 2 then</code></p>
    <p><code>WriteLn('Big rectangel')</code></p>
    <p><code>else</code></p>
    <p><code>WriteLn('Small rectangel');</code></p>
    <empty-line/>
    <p>И сравним его с таким:</p>
    <empty-line/>
    <p><code>if RectArea(Width, Height) &gt; 2 then</code></p>
    <p><code>WriteLn('Big rectangel')</code></p>
    <p><code>else</code></p>
    <p><code>WriteLn('Small rectangel');</code></p>
    <empty-line/>
    <p>На мой взгляд, последний читается проще. Всё–таки есть разница: «если ширина, умноженная на высоту больше двух, пишем «большой прямоугольник», иначе пишем «маленький прямоугольник» или «если площадь прямоугольника больше двух, пишем «большой прямоугольник», иначе пишем «маленький прямоугольник».</p>
    <p>Забегая вперёд, напишу, что для улучшения читабельности, чтобы при этом избежать дублирования кода, иногда делают что–то вроде этого:</p>
    <empty-line/>
    <p><code>function RectArea(Width, Height: Integer): Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Mult(Width, Height);</code></p>
    <p><code>end;</code></p>
    <p>Ещё одна рекомендация, связанная с именованием функций и переменных — не использовать сокращений. Исключения составляют очевидные, часто используемые сокращения (например, Rect — достаточно распространённое сокращение слова Rectangle). Надо понимать, что сокращение, очевидное для вас сейчас, может быть совершенно не очевидно для вашего коллеги или для вас через месяц.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Стандартные имена функций и переменных</strong></p>
    </title>
    <p>Не стесняйтесь использовать стандартные названия функций и переменных. Это позволяет не тратить слишком много времени на придумывание имён и улучшает воспоиятие кода. Даже если у вас будут свои собственные стандарты, которые кроме вас никто не соблюдают, постороннему человеку будет всё же проще разобраться за счёт того, что разобравшись с одной функцией, он сможет обоснованно предположить о назначении другой, благодаря схожему названию.</p>
    <p>Какие можно привести примеры:</p>
    <p>— практически все называют переменные цикла буквами i, j, k, для циклов первой, второй и третьей вложенности соответственно;</p>
    <p>— какие–то временные, короткоживущие переменные часто снабжают префиксом «temp» или «tmp», например, tempFileName для файла, который вскоре удалится;</p>
    <p>— логические переменные становятся куда нагляднее с префиксами типа is, has, can, например, isButtonVisible, canAddPoint, hasPoint;</p>
    <p>— в случае коптрования данных из одной переменной в другую, лучше использовать префиксы source и dest, а не суффиксы 1 и 2, «copy(array1, array2)» выглядит менее понятно, чем «copy(sourceArray, destArray)».</p>
    <p>Примеры можно приводить бесконечно, понимание таких вещей обычно приходит с опытом. Важно то, что если у функции или переменной есть какая–то особенность, которую можно подчеркнуть слегка поменяв название — почему не сделать это. Когда читаешь код — важна каждая мелочь. Это как в детективе — любой штрих может привести к разгадке. Только в отличии от преступников, программисты обычно делают что–то полезное или на худой конец безвредное, и большое количество деталей тут только в плюс.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Преобразование одной большой функции в две маленькие</strong></p>
    </title>
    <p>Сейчас мы добрались до куда более сложной и куда менее однозначной темы. Дело в том, что человеческое восприятие так устроено, что анализировать сразу большой объём информации ему крайне сложно. Именно по этому, книги принято разбивать на главы, а сами главы на абзацы.</p>
    <p>В программировании всё обстоит немного иначе и это может быть причиной путаницы. Тут текст разбит на функции (процедуры, методы, классы, сейчас это не так важно), а основное назначение функций — это возможность их повторного использования. То есть по сути, с их помощью суммарный объём кода уменьшается, они позволяют избежать многократного повторения одних и тех же фрагментов кода и тому подобное.</p>
    <p>Использование функций как инструмента для улучшения читабельности кода, на мой взгляд, сильно недооценёно. Как показывает практика, небольшое усложнение кода ухудшает его восприятие значительно.</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TRect = record</code></p>
    <p><code>Left: Integer;</code></p>
    <p><code>Right: Integer;</code></p>
    <p><code>Top: Integer;</code></p>
    <p><code>Bottom: Integer;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function RectsLength(Rects: array of TRect): Integer;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>Width, Height: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= 0;</code></p>
    <p><code>for I:= 0 to Length(Rects) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code> Width:= Rects[I].Right — Rects[I].Left;</code></p>
    <p><code>Height:= Rects[I].Bottom — Rects[I].Top;</code></p>
    <p><code> Result:= Result + 2 * Width + 2 * Height;</code></p>
    <p><code>end;</code></p>
    <p><code>end;</code></p>
    <p>Выше приведён простой пример, который рассчитывает сумму периметров прямоугольников в массиве. Пока он не выглядит сильно сложным, но, предположим, что задача немного изменилась и нам сказали не учитывать прямоугольники площадью меньше некоего числа MinLength.</p>
    <empty-line/>
    <p><code>function RectsLength(Rects: array of TRect; MinLength: Integer): Integer;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>Width, Height, Len: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= 0;</code></p>
    <p><code>for I:= 0 to Length(Rects) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code> Width:= Rects[I].Right — Rects[I].Left;</code></p>
    <p><code>Height:= Rects[I].Bottom — Rects[I].Top;</code></p>
    <p><code>Len:= 2 * Width + 2 * Height;</code></p>
    <p><code>if Len &gt;= MinLength then</code></p>
    <p><code> Result:= Result + Len;</code></p>
    <p><code>end;</code></p>
    <p><code>end;</code></p>
    <p>Не скажу, что намного сложнее, но взгляд спотыкается. А если бы мы сразу выделили функцию RectLenght, считающую площадь отдельного прямоугольника вышло бы несколько проще:</p>
    <empty-line/>
    <p><code>function RectLength(Rect: TRect): Integer;</code></p>
    <p><code>var</code></p>
    <p><code>Width, Height: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code> Width:= Rect. Right — Rect. Left;</code></p>
    <p><code>Height:= Rect. Bottom — Rect. Top;</code></p>
    <p><code>Result:= 2 * Width + 2 * Height;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function RectsLength(Rects: array of TRect; MinLength: Integer): Integer;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>Len: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= 0;</code></p>
    <p><code>for I:= 0 to Length(Rects) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code>Len:= RectLength(Rects[I]);</code></p>
    <p><code>if Len &gt;= MinLength then</code></p>
    <p><code>Result:= Result + Len;</code></p>
    <p><code>end;</code></p>
    <p><code>end;</code></p>
    <p>И пусть вас не смущает, что в сумме кода стало немного больше. Мне ещё ни разу не приходилось жалеть о такого рода рефакторинге. То есть были, конечно, случаи, когда он был не оправдан и только путал… У каждого бывали ошибки. Но никогда проблемы не были связаны с увеличением суммарного объема кода. Иногда, даже если вы смогли разделить функцию на две функции того же размера (суммарное увеличение кода в два раза), но, при этом хорошо разделили их логически — это бывает оправдано.</p>
    <p>Я не хочу сказать, что разбить большую функцию на две или несколько маленьких можно и нужно всегда. Принять решение об этом — задача, в ряде случаев, очень сложная. Поэтому, я хотел бы посвятить следующую главу признакам необъодимости такого рефакторинга.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Признаки необходимости выделения функции</strong></p>
    </title>
    <p>Как я уже написал выше — тема довольно сложная и неоднозначная. Подобных признаков может быть сколько угодно, у каждого они свои, но какие–то общие рекомендации на основании своего опыта я постараюсь дать.</p>
    <p>1. Размер функции. Первое, что должно насторожить — это слишком большой размер функции. Проще всего измерять их в экранах. Экран в данном случае — это количество кода, которое вы можете увидеть без использования прокрутки. Лучше всего читаются функции, влезающие на экран полностью.</p>
    <p>И это не связано с «лишней работой» в виде листания текста. Дело в том, что даже в художественной литературе, для полного понимания, приходится возвращаться к началу абзаца. Что уж говорить о коде, который, зачастую, куда менее линеен.</p>
    <p>Человек одновременно может держать в быстрой памяти довольно мало информации и лучше не забывать её ещё и тем, из какой строчки вы пришли и куда, соответственно надо вернуться. Я уже не говорю о том, что зачастую, один и тот же кусок длинной функции приходится искать снова и снова, а это ощутимые затраты по времени.</p>
    <p>2. Непонятный код. Если вы, разбираясь в том, как работает функция, наткнулись на кусок кода, в котором пришлось разбираться дольше, чем обычно — подумайте о том, чтобы вынести его в отдельную функцию с понятным названием.</p>
    <p>Действительно, если вы сейчас уже потратили время и разобрались в чём–то, почему бы не закрепить результат, чтобы оградить себя (и других в случае коллективной разработки) от совершения той же самой работы в бедующем? Как правило это не очень сложно и быстро окупается.</p>
    <p>3. Локальные переменные. Если в вашей функции есть фрагмент кода, в котором инициализируются и используются локальные переменные, которые не используются за пределами этого фрагмента — это также является сигналом к тому, чтобы попытаться вынести данный код в отдельную функцию.</p>
    <p>В качестве иллюстрации — можете посмотреть пример к прошлой главе. Там мы благополучно избавились от переменных <emphasis>Width</emphasis> и <emphasis>Height</emphasis> в функции <emphasis>RectsLength</emphasis>. Опятьь же из опыта скажу, что большое количество локальных переменных в функции усложняет восприятие.</p>
    <p>4. Внутри функции выполняется какое–то законченное, осмысленное действие. Даже если три строки, вычисляющие периметр не кажутся вам сложным фрагментом кода, рекомендую его всё равно вынести в отдельную функцию. Причин для этого можно назвать несколько:</p>
    <p>— Через какое–то время ваш фрагмент и функция в целом может стать значительно сложнее, в середину понятного ранее куска кода могут попасть посторонние, не относящаеся к нему строки. В результате этого на минутное изначально дело можно потратить в разы большее количество времени. При этом риск допустить ошибку будет также выше;</p>
    <p>— Возрастает вероятность повторного использования кода. Если вы один раз вычислили периметр квадрата внутри функции, то, вполне вероятно, что и в следующий раз вы не вынесете её наружу. В результате, вполне возможно, что одинаковый фрагмент кода будет встречаться у вас многократно. Это само по себе не очень хорошо и может значительно увеличить суммарный объём кода, но, если в этом коде ещё и допущена ошибка или его нужно поменять по какой–то другой причине — можно наткнуться на серьёзные, долгоживущие проблемы. Совершенно типичная ситуация — поменяли в одном месте, не поменяли в другом. Где–то в третьем месте поменяли, но иначе. В результате код расползается, происходит рассинхронихация и прочие весьма неприятные вещи.</p>
    <p>— Код станет проще читать.</p>
    <p>Следует отметить, что код выполняющий отдельное осмысленное действие в общем случае не обязан идти подряд.</p>
    <empty-line/>
    <p><code>function RectsLength(Rects: array of TRect; MinLength: Integer): Integer;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>Len: Integer;</code></p>
    <p><code>Widths, Heights: array of Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= 0;</code></p>
    <p><code>SetLength(Widths, Length(Rects));</code></p>
    <p><code>SetLength(Heights, Length(Rects));</code></p>
    <p><code>for I:= 0 to Length(Rects) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code>Widths[I]:= Rects[I].Right — Rects[I].Left;</code></p>
    <p><code>Heights[I]:= Rects[I].Bottom — Rects[I].Top;</code></p>
    <p><code>end;</code></p>
    <p><code>for I:= 0 to Length(Rects) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code> Len:= 2 * Widths[I] + 2 * Heights[I];</code></p>
    <p><code>if Len &gt;= MinLength then</code></p>
    <p><code> Result:= Result + Len;</code></p>
    <p><code>end;</code></p>
    <p>end;</p>
    <p>Это та же самая функция расчёта суммы периметров из прошлой главы. Мы уже видели несколько вариантов её реализации, но этот, пожалуй, наиболее сложный и избыточный. Понятно, что тут легко избавится от второго цикла, что значительно упростит конструкцию, но ведь между циклами может быть ещё много другого кода. Тогда всё станет куда менее очевидно. В этом случае, знание того, что для расчёта суммы периметров прямоугольников, надо так или иначе рассчитать периметр каждого из них, может сослужить хорошую службу.</p>
    <p>5. Сложные условия. Логические выражения по праву занимают одно из лидирующих мест по сложности восприятия. Именно по этому, по возможности, их следует выделять в отдельные функции. Единственный совет, при этом — старайтесь избегать отрицаний в названиях функций.</p>
    <empty-line/>
    <p><code>procedure AddPointToRect(x, y: Integer; Rect: TRect);</code></p>
    <p><code>begin</code></p>
    <p><code>if (x &gt;= Rect. Left) and (x &lt;= Rect. Right) and (y &gt;= Rect. Top) and (y &lt;= Rect. Bottom) then</code></p>
    <p><code>AddPoint(x, y);</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>Лучше заменить на:</code></p>
    <empty-line/>
    <p><code>function PointOnRect(x, y: Integer; Rect: TRect): Boolean;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= (x &gt;= Rect. Left) and (x &lt;= Rect. Right) and (y &gt;= Rect. Top) and (y &lt;= Rect. Bottom);</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>procedure AddPointToRect(x, y: Integer; Rect: TRect);</code></p>
    <p><code>begin</code></p>
    <p><code>if PointOnRect(x, y, Rect) then</code></p>
    <p><code>AddPoint(x, y);</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p>Однако для функции PointOutsideRect, добавляющей точку за пределами прямоугольника, лучше не писать «if PointOutsideRect(x, y, Rect) then», а написать «if not PointOnRect(x, y, Rect) then».</p>
    <p>6. Высокий уровень вложенности. Бывает функция как матрёшка. Блок кода, в нём ещё блок кода, в нём ещё и так далее. Читать это также довольно трудно. Пример приводить не буду, чтобы не захламлять текст, отмечу лишь, что блок целиком (текст между скобками «begin end» или «{}» для C-подобных языков) очень часто легко переносится в отдельную функцию.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Выделение функции в процессе написания</strong></p>
    </title>
    <p>Рекомендации прошлой главы хороши, когда вы смотрите ранее написанный или чужой код. Тогда да, чтобы разобраться в том, что написано — помогает разбить крупные функции на более мелкие.</p>
    <p>Согласитесь, если бы код сразу был написан в виде небольших, понятных, осмысленных функций — многих проблем можно было бы избежать.</p>
    <p>Как же писать «короткими фразами»? Разумеется, в первую очередь, это дело привычки. Не думаю, что мне будет по силам формализовать этот процесс, я лишь попробую передать свои ощущения о том, как можно себе помочь.</p>
    <p>1. Попробуйте проговаривать то, что должен делать ваш код. При этом, первое время, может потребоваться вдумываться в свои слова более внимательно.</p>
    <p>Например, вы говорите себе: «если точка внутри прямоугольника, то» и при этом пишите: «if (x &gt;= Rect. Left) and (x &lt;= Rect. Right) and (y &gt;= Rect. Top) and (y &lt;= Rect. Bottom) then». Кто мешает вам написать сразу «if PointOnRect(x, y, Rect) then»? И не важно, что у вас пока нет функции PointOnRect, вы её легко напишите следующим шагом. А если даже забудите — комптлятор вам подскажет.</p>
    <p>2. Попытайьесь ещё до того, как начнёте писать код, разбить большое действие на составляющие. Банальный пример, о котором мы уже говорили — рассчёт суммы периметров. Его очень просто разбить на два действия — расчёт периметра одного поямоугольника и вычисление суммы этих величин.</p>
    <p>3. Если объединить этот пункт с предыдущим, можно сформулировать такой приём программирования, как использование ещё не существующих функций.</p>
    <p><code>begin</code></p>
    <p><code>Rect:= ПолучитьПрямоугольник;</code></p>
    <p><code>Point:= ПолучитьТочку;</code></p>
    <p><code>if ТочкаВПрямоугольнике(Point, Rect) then</code></p>
    <p><code>ДобавитьТочку(Point); </code></p>
    <p><code>end;</code></p>
    <p>В приведённом примере, функции с названиями на русском языке не существуют в момент написания фрагмента (в реальном программировании стоит использовать те названия, которые будут работать в вашей среде программирования и которые вы собираетесь оставить насовсем, это просто пример, я в своей работе стараюсь именовать функции и переменные так, чтобы это было понятно англоговорящим представителям рода человеческого).</p>
    <p>Сам устыдился своих упрёков и решил перевести в тот код, который сам бы и написал:</p>
    <p><code>begin</code></p>
    <p><code>Rect:= GetRect;</code></p>
    <p><code>Point:= GetPoint;</code></p>
    <p><code>if PointOnRect(Point, Rect) then</code></p>
    <p><code> AddPoint(Point); </code></p>
    <p><code>end;</code></p>
    <p>Так вот, несуществующие функции — это не проблема. Во–первых — каждую из них гарантированно проще написать, чем исходную функцию целиком. Во–вторых, компилятор вам подскажет, если вы забыли реализовать какую–то из них. В случае, если вы забыли какое–то действие в основном коде, вы можете это не заметить. Ну и в-третьих — вы сразу делаете код понятным, вам не приходится делать два дела вместо одного.</p>
    <p>Пользуясь случаем, приведу ещё один довод в пользу коротких функций. Как правило, они более конкретны. То есть не «делают то, то и ещё это за одно», а делают что–то одно и только это. Так вот, если принять во внимание, что не бывает код без ошибок, а это вообще говоря так и есть, возникает проблема: как узнать правильно работает функция или нет. Разве легко это сделать, если назначение функции не совсем понятно? Чем больше у вас кода, правильную работу которого легко проверить, тем лучше.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Когда не следует выделять функцию</strong></p>
    </title>
    <p>Дабы не впадать в крайности, просто необходимо написать также и эту главу. Правила и рекомендации — это замечательно, но никогда не стоит забывать, что главное для нас не методичное соблюдение всех правил, а чистый, понятный код.</p>
    <p>Попробую привести несколько примеров, когда выделение функции, как правило, делает только хуже.</p>
    <p>1. Процедура выбора из однотипной информации. Как правило, такая проблема возникает в конструкциях <emphasis>case</emphasis> (<emphasis>switch</emphasis> для C-подобныхьязыков) или «if … then … else if … then … else if … then …». Данные блоки могу включать в себя десятки, сотни и даже тысячи условий, занимая, разумеется, значительно больше одного экрана, но, разбивать такие блоки всё–таки не стоит.</p>
    <p>Это справедливо для блоков с именно однотипными проверками. Если условия можно как–то сгруппировать, то можно каждую группу вынести в свою функцию (например, слова на букву «А» обрабатывает одна функция, на «Б» — другая и так далее).</p>
    <p>2. Функции с действительно сложной логикой, как правило, также не удаётся красиво разбить на более мелкие составляющие. И проблема тут даже не в сложности как таковой, а в том, что не всему можно дать название. Бывает, что совершается настолько специфичное действие, что как не назови, всё равно понятно не будет.</p>
    <p>3. Математические выражения также редко удаётся разбить на составляющие. Например, если вы что–то считаете по формуле — вам будет крайне сложно придумать адекватное название для расчёта части этой формулы.</p>
    <p>4. Когда функция вам не мешает. То есть не следует проводить рефакторинг ради рефакторинга, маниакально выискивая «плохие» места в коде. Куда разумнее улучшать код только после того, как наткнулся на него в рамках какой–то задачи или более крупного рефакторинга.</p>
    <p>Причин так говорить у меня сразу несколько. Во–первых, если вы раньше не натыкались на фрагмент кода, то может и в будущем никогда не наткнётесь, зачем же тратить на него время, если он нормально работает и пока никому не мешает? Во–вторых — не стоит забывать, что любой рефакторинг, как бы аккуратно он не проводился — это риск что–то испортить. Опять же, зачем рисковать просто так? Ну и наконец, всегда есть вероятность, что после рефакторинга вы через какое–то время поймёте, что логику надо поменять, а может и вовсе помножить на ноль эту ветку кода и что получится? Вы потратили время на улучшение уже устаревшего кода, то есть впустую, а могли, например, лишний раз протестировать функциональность или написать пару тестов.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Использование модулей</strong></p>
    </title>
    <p>Удобно когда всё в одном файле и ничего искать не нужно? С одной стороны, конечно, да. Но это справедливо только для весьма небольших проектов.</p>
    <p>Возможно повторюсь, но система каталогов — это по сей день самая удобная и понятная с система организации данных. Как я уже говорил — самое простое — организация данных по алфавиту. Нам это мало подойдёт. Не слишком удобно в случае программирования. Куда интереснее — тематический каталог.</p>
    <p>Классические примеры — разнесение функций для работы с графикой (интерфейсом) и непосредственно логики программы. Часто выносят в отдельные модули функции для работы со строками, модули, отвечающие за сериализацию.</p>
    <p>Стоит–ли говорить, что модулям следует давать мнемонические названия, чтобы было понятно, какие именно функции можно найти в том или ином файле.</p>
    <p>Признаки необходимости выделения части модуля в отдельный модуль практически те же, что и в случае с функциями. Разумеется, с поправкой на то, что для модуля совершенно нормально быть больше по объёму и на ряд других очевидных моментов.</p>
    <empty-line/>
   </section>
   <section>
    <title>
     <p><strong>Более сложные способы организации данных</strong></p>
    </title>
    <p>В программировании есть понятие — простые типы данных. Традиционно к ним относятся целые числа, числа с плавающей точкой, булевы (логические) типы данных, а также строки.</p>
    <p>Множество переменных простых типов могут объединяться в массивы, но это ещё не всё. По–настоящему гибким программирование стало с появлением классов.</p>
    <p>Это понятие, на мой взгляд, одно из самых трудных для понимания начинающих программистов, поэтому, я планирую уделить ему достаточно много времени, прежде чем перейти непосредственно к рефакторингу. Если вы знакомы с классами — вам может стать скучно, в таком случае — можете пропустить эту главу.</p>
    <p>Я уже писал, что название переменной должно отражать её содержимое. То есть переменная с названием Line — должна каким–то образом описывать отрезок или прямую. Чаще всего данную сущность описывают двумя точками. Если пользоваться только простыми типами — нам придётся завести 4 переменные, например, X1, Y1, X2, Y2. А в случае, если у нас несколько линий, для того, чтобы отличать одну от другой — нам придётся переназвать переменные, например: Line1X1, Line1Y1, Line1X2, Line1Y2. Не очень удобно, правда?</p>
    <p>Для решения подобных задач, уже давно, был придуман новый тип данных — record или struct, в зависимости от языка. Сейчас этот тип практически полностью вытеснен классами и его использование для большинства задач считается плохим тоном. Поэтому не буду останавливаться на этом, тем более, что рефакторинг к рекордам практически не применим.</p>
    <p>И так, мы решили создать класс для нашей линии. Вот так видит декларация (описание) класса:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TLine = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X1: Integer;</code></p>
    <p><code>Y1: Integer;</code></p>
    <p><code>X2: Integer;</code></p>
    <p><code>Y2: Integer;</code></p>
    <p><code>end;</code></p>
    <p>В данном случае — ключевое слово type — определяет начало блока объявлений новых типов данных. Стандартная конструкция языка Pascal. Для других языков синтаксис будет отличаться. <emphasis>TLine — н</emphasis>азвание нашего класса. “= class(TObject)» — означает, что мы определяем класс, наследованный от класса <emphasis>TObject</emphasis>. Это базовый класс в Object Pascal. Все классы так или иначе наследованы от него. Подробнее на эту тему поговорим, когда будем обсуждать наследование.</p>
    <p>Ключевое слово public определяет область видимости переменных и функций, объявленных в текущем блоке. Подробнее об этом также поговорим после. Ключевое слово end завершает определение класса.</p>
    <p>Мы создали новый класс, но как им пользоваться? Для этого надо создать экземпляр класса:</p>
    <empty-line/>
    <p><code>var</code></p>
    <p><code>Line: TLine;</code></p>
    <p><code>begin</code></p>
    <p><code>Line:= TLine. Create;</code></p>
    <p><code>end;</code></p>
    <p>В данном фрагменте кода мы объявляем переменную <emphasis>Line</emphasis> типа <emphasis>TLine</emphasis>, после чего, создаём новый экземпляр класса <emphasis>TLine</emphasis> и присваиваем его переменной <emphasis>Line</emphasis>.</p>
    <p>Часто путают понятия класс и объект, так вот, в нашем случае объект — это <emphasis>Line</emphasis>, а класс — <emphasis>TLine</emphasis>.</p>
   </section>
   <section>
    <title>
     <p><strong>Объединение данных и кода</strong></p>
    </title>
    <p>В прошлой главе мы создали новый класс, научились создавать экземпляры классов и на этом закончили. Давайте эту главу начнём с примера использования данной конструкции:</p>
    <empty-line/>
    <p><code>function CalculateLineLength(Line: TLine): Double; </code></p>
    <p><code>begin </code></p>
    <p><code>Result:= Sqrt(Sqr(Line. X2 — Line. X1) + Sqr(Line. Y2 — Line. Y1)); </code></p>
    <p><code>end; </code></p>
    <empty-line/>
    <p><code>var </code></p>
    <p><code>Line: TLine; </code></p>
    <p><code>LineLenght: Double; </code></p>
    <p><code>begin </code></p>
    <p><code>Line:= TLine. Create; </code></p>
    <p><code>Line. X1:= 10; </code></p>
    <p><code>Line. Y1:= 10; </code></p>
    <p><code>Line. X2:= 20; </code></p>
    <p><code>Line. Y2:= 20; </code></p>
    <p><code>LineLenght:= CalculateLineLength(Line); </code></p>
    <p><code>end; </code></p>
    <p>Тут мы создаём новую линию и рассчитываем её длину. Для этого мы завели вспомогательную функцию <emphasis>CalculateLineLength</emphasis>.</p>
    <p>Если приглядется, то в нашей новой функции слишком часто упоминается название переменной <emphasis>Line</emphasis>. Возможно есть способ сделать код несколько проще и наглядней? К счастью да. Дело в том, что функцию можно перенести непосредственно в класс:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TLine = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X1: Integer;</code></p>
    <p><code>Y1: Integer;</code></p>
    <p><code>X2: Integer;</code></p>
    <p><code>Y2: Integer;</code></p>
    <p><code>function CalculateLineLength: Double;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function TLine. CalculateLineLength: Double;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));</code></p>
    <p><code>end;</code></p>
    <p>В месте использования код также становтся наглядней. Строка <emphasis>LineLenght:= CalculateLineLength(Line);</emphasis> заменится на строку: <emphasis>LineLenght:= Line. CalculateLineLength;</emphasis>, что несколько короче и куда лучше подчёркивает тот факт, что функция относится именно к линии, а не к чему–то ещё.</p>
    <p>Отмечу, что на практике, глядя на исходный код, часто возникает потребность понять, что можно сделать с тем или иным классом. Так вот, значительно проще, удобнее и быстрее пройтись по членам класса, чем найти все функции, принимающие класс в качестве параметра.</p>
    <p>И немного из терминологии. Функцию член класса принято называть методом. В нашем случае, мы имеем класс с одним методом <emphasis>CalculateLineLength</emphasis>.</p>
   </section>
   <section>
    <title>
     <p><strong>Приватные члены класса</strong></p>
    </title>
    <p>В прошлой главе мы создали первый метод. Он вычисляет длину отрезка. На современных машинах это вычисление занимает совсем немного времени, однако, предположим, что действие это не такое быстрое и для каждой линии выполняется многократно.</p>
    <p>Есть много способов решения подобной проблемы, но один из самых простых и универсальных — это кэширование.</p>
    <p>Действительно, зачем считать длину каждый раз, если это можно сделать единожды, запомнить посчитанное значение и потом, в качестве результата функции, возвращать его.</p>
    <p>Вот как это могло бы выглядеть:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TLine = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X1: Integer;</code></p>
    <p><code>Y1: Integer;</code></p>
    <p><code>X2: Integer;</code></p>
    <p><code>Y2: Integer;</code></p>
    <p><code>LengthCalculated: Boolean;</code></p>
    <p><code>LineLength: Double;</code></p>
    <p><code>function CalculateLineLength: Double;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function TLine. CalculateLineLength: Double;</code></p>
    <p><code>begin</code></p>
    <p><code>if not LengthCalculated then</code></p>
    <p><code>begin</code></p>
    <p><code>LineLength:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));</code></p>
    <p><code>LengthCalculated:= True;</code></p>
    <p><code>end;</code></p>
    <p><code>Result:= LineLength;</code></p>
    <p><code>end;</code></p>
    <p>При всей иллюзии работоспособности, в данном коде присутствует целый спектр проблем. Во–первых, тому, кто будет использовать класс снаружи, будет неочевидно, что необходимо вызывать функцию <emphasis>CalculateLineLength</emphasis> и не корректно напрямую использовать поле <emphasis>LineLength</emphasis>. Ну а во–вторых — нет механизма пересчёта длины при изменении координат точек.</p>
    <p>Первую проблему мы решим в этой главе, а вторую оставим для следующей, так как для её решения потребуется познакомиться с ещё одним термином.</p>
    <p>Мы уже упоминали, да и не раз сталкивались с ключевым словом public, теперь пришло время рассказать, что оно означает. Члены класса, объявленные как public доступны как внутри класса, так и за его пределами.</p>
    <p>Кроме public, есть ещё и ключевое слово private, которое означает, что члены класса доступны только из методов данного класса и не доступны за его пределами. В Object Pascal реализации, используемой в компиляторе Delphi, у данной функциональности есть особенность. Видимость private распространяется не только на членов класса, но и на весь модуль, в котором объявлен класс, что является неким отклонением от общих принципов, но уж так сложилось исторически, ничего не попишешь.</p>
    <p>Так или иначе, private члены классов — это некие служебные поля и методы (переменные и функции), не предназначенные для использования за пределами класса.</p>
    <p>Давайте посмотрим, как будет выглядеть декларация нашего класса, если мы унесём в private секцию всё лишнее:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TLine = class(TObject)</code></p>
    <p><code>private</code></p>
    <p><code>LengthCalculated: Boolean;</code></p>
    <p><code>LineLength: Double;</code></p>
    <p><code>public</code></p>
    <p><code>X1: Integer;</code></p>
    <p><code>Y1: Integer;</code></p>
    <p><code>X2: Integer;</code></p>
    <p><code>Y2: Integer;</code></p>
    <p><code>function CalculateLineLength: Double;</code></p>
    <p><code>end;</code></p>
    <p>Данная реализация вполне себе красноречиво говорит, что поля <emphasis>LengthCalculated</emphasis> и <emphasis>LineLength</emphasis> трогать не надо. По крайней мере, если вы не планируете менять внутренней логики класса.</p>
   </section>
   <section>
    <title>
     <p><strong>Свойства</strong></p>
    </title>
    <p>Для того, чтобы можно было каким–то образом реагировать на изменения значений полей классов, были придуманы свойства (property). Они так же могут перекликаться с понятиями <emphasis>getter</emphasis> и <emphasis>setter</emphasis>.</p>
    <p>Сначала я приведу пример кода, а потом поясню что происходит. Думаю так будет понятнее:</p>
    <p><code>type</code></p>
    <p><code>TLine = class(TObject)</code></p>
    <p><code>private</code></p>
    <p><code>LengthCalculated: Boolean;</code></p>
    <p><code>LineLength: Double;</code></p>
    <p><code>FX2: Integer;</code></p>
    <p><code>FY2: Integer;</code></p>
    <p><code>FX1: Integer;</code></p>
    <p><code>FY1: Integer;</code></p>
    <p><code>procedure SetX1(const Value: Integer);</code></p>
    <p><code>procedure SetX2(const Value: Integer);</code></p>
    <p><code>procedure SetY1(const Value: Integer);</code></p>
    <p><code>procedure SetY2(const Value: Integer);</code></p>
    <p><code>public</code></p>
    <p><code>property X1: Integer read FX1 write SetX1;</code></p>
    <p><code>property Y1: Integer read FY1 write SetY1;</code></p>
    <p><code>property X2: Integer read FX2 write SetX2;</code></p>
    <p><code>property Y2: Integer read FY2 write SetY2;</code></p>
    <p><code>function CalculateLineLength: Double;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function TLine. CalculateLineLength: Double;</code></p>
    <p><code>begin</code></p>
    <p><code>if not LengthCalculated then</code></p>
    <p><code>begin</code></p>
    <p><code>LineLength:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));</code></p>
    <p><code>LengthCalculated:= True;</code></p>
    <p><code>end;</code></p>
    <p><code>Result:= LineLength;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>procedure TLine. SetX1(const Value: Integer);</code></p>
    <p><code>begin</code></p>
    <p><code>LengthCalculated:= False;</code></p>
    <p><code>FX1:= Value;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>procedure TLine. SetX2(const Value: Integer);</code></p>
    <p><code>begin</code></p>
    <p><code>LengthCalculated:= False;</code></p>
    <p><code>FX2:= Value;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>procedure TLine. SetY1(const Value: Integer);</code></p>
    <p><code>begin</code></p>
    <p><code>LengthCalculated:= False;</code></p>
    <p><code>FY1:= Value;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>procedure TLine. SetY2(const Value: Integer);</code></p>
    <p><code>begin</code></p>
    <p><code>LengthCalculated:= False;</code></p>
    <p><code>FY2:= Value;</code></p>
    <p><code>end;</code></p>
    <p>И так, что мы сделали. Мы добавили полям X1, Y1, X2, Y2 префик «F» и перенесли в private секцию. Префикс «F» — это стандартный, исторически сложившийся префикс для обозначения приватного поля (сокращение от Field, поле). После этого напрямую менять значения координат снаружи класса стало невозможно.</p>
    <p>Параллельно, также в private секции мы создали набор функций SetX1, SetY1, SetX2, SetY2 для корректной установки соответствующих значений. Помимо своих непосредственных обязанностей, они также сбрасывают флаг <emphasis>LengthCalculated</emphasis>, чтобы при последующем обращении некорректная уже длина пересчиталась заново.</p>
    <p>Для доступа к приватным полям снаружи — предусмотрены свойства. Строка «property X1: Integer read FX1 write SetX1;” означает, что мы свойство X1, при чтении которого будет возвращаться значение <emphasis>FX1</emphasis> (то, что после ключевого слова read), а при записи — будет вызываться функция <emphasis>SetX1</emphasis> (то, что после ключевого слова write).</p>
    <p>Таким образом, запись: «X:= Line. X1» эквивалентна записи «X:= Line. FX1», а запись «Line. X1:= X» эквивалентна записи «Line. SetX1(X)».</p>
   </section>
   <section>
    <title>
     <p><strong>Наследование</strong></p>
    </title>
    <p>Долго решался, прежде чем начать эту тему, обычно она достаточно сложна для понимания. Не уверен, что мне удасться уложиться в одну главу, но не беда. Главное быть последовательным. Давайте не уходить далеко от геометрических примитивов. Создадим два класса. Класс, описывающий круг и класс, описывающий прямоугольник:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TCircle = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X: Integer;</code></p>
    <p><code>Y: Integer;</code></p>
    <p><code>D: Integer;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>TRectangle = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X1: Integer;</code></p>
    <p><code>Y1: Integer;</code></p>
    <p><code>X2: Integer;</code></p>
    <p><code>Y2: Integer;</code></p>
    <p><code>end;</code></p>
    <p>Круг вполне описывается координатами центра (X, Y) и диаметром (D), а прямоугольник — двумя точками (X1, Y1 и X2, Y2).</p>
    <p>Допустим у нас есть программа для рисования кругов и прямоугольников. Каждый раз, когда мы рисуем новый круг, он кладётся в массив <emphasis>Circles</emphasis>: array of <emphasis>TCircle</emphasis>, а когда рисуем новый прямоугольник, он кладётся в массив <emphasis>Rectangles</emphasis>: array of <emphasis>TRectangle</emphasis>.</p>
    <p>Далее нам нужен код, который определит, находится–ли заданная координата внутри одного из нарисованных примитивов. Например, пользователь совершил клик мыши и нам нужно выделить приметив, если кликнули именно на него.</p>
    <p>Заведём для этого в каждом классе функцию <emphasis>HitTest</emphasis>, которая будет возвращать <emphasis>True</emphasis> в случае, если наша точка находится внутри графического примитива и <emphasis>False</emphasis> в противном случае:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TCircle = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X: Integer;</code></p>
    <p><code>Y: Integer;</code></p>
    <p><code>D: Integer;</code></p>
    <p><code>function HitTest(aX, aY: Integer): Boolean;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TRectangle = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>X1: Integer;</code></p>
    <p><code>Y1: Integer;</code></p>
    <p><code>X2: Integer;</code></p>
    <p><code>Y2: Integer;</code></p>
    <p><code>function HitTest(X, Y: Integer): Boolean;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function TCircle. HitTest(aX, aY: Integer): Boolean;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Sqrt(Sqr(X — aX) + Sqr(Y — aY)) &lt;= D;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>function TRectangle. HitTest(X, Y: Integer): Boolean;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= (X1 &lt;= X) and (X &lt;= X2) and (Y1 &lt;= Y) and (Y &lt;= Y2);</code></p>
    <p><code>end;</code></p>
    <p><code>Это была реализация классов, а тут реализация базовой функции HitTest, которая должна проверить все наши объекты:</code></p>
    <empty-line/>
    <p><code>var</code></p>
    <p><code>Circles: array of TCircle;</code></p>
    <p><code>Rectangles: array of TRectangle;</code></p>
    <empty-line/>
    <p><code>function HitTest(X, Y: Integer): Boolean;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= False;</code></p>
    <p><code>for I:= 0 to Length(Rectangles) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Rectangles[I].HitTest(X, Y);</code></p>
    <p><code>if Result then</code></p>
    <p><code>Exit;</code></p>
    <p><code>end;</code></p>
    <p><code>for I:= 0 to Length(Circles) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Circles[I].HitTest(X, Y);</code></p>
    <p><code>if Result then</code></p>
    <p><code>Exit;</code></p>
    <p><code>end;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p>Не слишком компактно получилось. А теперь представим, что разных типов примитивов у нас десятки и даже сотни. Получается для каждого нужен свой массив, и свой цикл для функции <emphasis>HitTest</emphasis>? Есть способ сделать проще, можно применить наследование.</p>
    <p>В чём тут смысл? Вместо нескольких массивов для каждого графического примитива отдельно, мы заводим класс, который описывает графический примитив, назовём его, например, TShape. Далее мы хотим хранить все наши примитивы, независимо от их типа в массиве «Shapes: array of TShape». Но так просто у нас это не получится, компилятор ругнётся, что типы не совместимы.</p>
    <p>Для того, чтобы мы смогли положить наши прямоугольники и круги в массив <emphasis>TShape</emphasis>, нам надо поменять их наследование. Заменим <emphasis>TObject</emphasis> на <emphasis>TShape</emphasis> в объявлении класса:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TShape = class(TObject)</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>TCircle = class(TShape)</code></p>
    <p><code>public</code></p>
    <p><code>…..</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>TRectangle = class(TShape)</code></p>
    <p><code>public</code></p>
    <p><code>…..</code></p>
    <p><code>end;</code></p>
    <p>Теперь наш круг одновременно и круг и графический примитив, равно как и в действительности. То же самое можно сказать и о квадрате. Что это значит с точки зрения программирования? То, что класс <emphasis>TCircle</emphasis>, наследник класса <emphasis>TShape</emphasis> можно использовать везде, где можно использовать класс <emphasis>TShape.</emphasis> Более того, все переменные и методы класса <emphasis>TShape</emphasis> (кроме private) будут также доступны в классе <emphasis>TCircle</emphasis>.</p>
    <p>Не буду сильно углубляться в теорию, всё–таки я предпочитаю объяснять на примерах, поэтому сразу перейдём к тому как изменится наша функция с попмощью этого нехитрого преобразования:</p>
    <empty-line/>
    <p><code>var</code></p>
    <p><code>Shapes: array of TShape;</code></p>
    <empty-line/>
    <p><code>function HitTest(X, Y: Integer): Boolean;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= False;</code></p>
    <p><code>for I:= 0 to Length(Shapes) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code>if Shapes[I] is TCircle then</code></p>
    <p><code>Result:= (Shapes[I] as TCircle).HitTest(X, Y)</code></p>
    <p><code>else if Shapes[I] is TRectangle then</code></p>
    <p><code>Result:= (Shapes[I] as TRectangle).HitTest(X, Y)</code></p>
    <p><code>if Result then</code></p>
    <p><code>Exit;</code></p>
    <p><code>end;</code></p>
    <p><code>end;</code></p>
    <p>На самом деле тоже не очень красиво. Приходится для каждого примитива делать проверку, поддерживает–ли он нужный нам тип (оператор <emphasis>is</emphasis>) и осуществлять приведение типов (оператор <emphasis>as</emphasis>). Операторы <emphasis>is</emphasis> и <emphasis>as</emphasis> предназначены для работы только с объектами и не работают с простыми типами. Подробнее о них можно прочитать в документации.</p>
    <p>Чтобы оценить мощь наследования нам остался всего один шаг. В класс <emphasis>TShape</emphasis> добавим строку «function HitTest(X, Y: Integer): Boolean; virtual; abstract;”, а в классы <emphasis>TCircle</emphasis> и <emphasis>TRectangle</emphasis> добавим после аналогичных строчек ключевое слово <emphasis>override</emphasis>:</p>
    <empty-line/>
    <p><code>type</code></p>
    <p><code>TShape = class(TObject)</code></p>
    <p><code>public</code></p>
    <p><code>function HitTest(X, Y: Integer): Boolean; virtual; abstract;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>TCircle = class(TShape)</code></p>
    <p><code>public</code></p>
    <p><code> …..</code></p>
    <p><code>function HitTest(X, Y: Integer): Boolean; override;</code></p>
    <p><code>end;</code></p>
    <empty-line/>
    <p><code>TRectangle = class(TShape)</code></p>
    <p><code>public</code></p>
    <p><code>…..</code></p>
    <p><code>function HitTest(X, Y: Integer): Boolean; override;</code></p>
    <p><code>end;</code></p>
    <p>Что это означает? Мы как бы говорим, что класс <emphasis>TShape</emphasis> в принципе может проверить, попали в него координаты мыши или нет, но конкретная реализация зависит от того, какой именно примитив используется. То есть абстрактно функциональность есть, но её реализация должна быть переопределена в классах потомках.</p>
    <p>Нашу многострадальную функцию теперь можно переписать так:</p>
    <empty-line/>
    <p><code>var</code></p>
    <p><code>Shapes: array of TShape;</code></p>
    <empty-line/>
    <p><code>function HitTest(X, Y: Integer): Boolean;</code></p>
    <p><code>var</code></p>
    <p><code>I: Integer;</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= False;</code></p>
    <p><code>for I:= 0 to Length(Shapes) — 1 do</code></p>
    <p><code>begin</code></p>
    <p><code>Result:= Shapes[I].HitTest(X, Y);</code></p>
    <p><code>if Result then</code></p>
    <p><code>Exit;</code></p>
    <p><code>end;</code></p>
    <p><code>end;</code></p>
    <p>При этом, в случаю кругов, в реальности будет вызываться функция <emphasis>TCircle. HitTest</emphasis>, а в случае прямоугольников — <emphasis>TRectangle. HitTest</emphasis>.</p>
    <p>Понятно, что в случае с одной абстрактной функцией выигрышь не совсем очевиден, но ведь можно расширить базовый класс, добавив в него функции:</p>
    <p><code>TShape. Move(dx, dy: Integer); virtual; abstract;</code></p>
    <p>для перемещения примитива,</p>
    <p><code>TShape. Rotate(x, y: Integer; angel: Double); virtual; abstract;</code></p>
    <p>для поворота вокруг точки,</p>
    <p><code>TShape. Flip(Line: TLine); virtual; abstract;</code></p>
    <p>для зеркального отображения вокруг прямой.</p>
    <p>Реализация данных методов уникальна для каждого из классов наследников, однако сама функциональность применима ко всем графическим примитивам.</p>
   </section>
  </section>
 </body>
 <binary id="img_0.png" content-type="image/png">iVBORw0KGgoAAAANSUhEUgAAAdQAAABdCAYAAAAc75fIAAAACXBIWXMAAA7EAAAOwwHaapjc
AABjcUlEQVR42u1dB4BsZXU+t0zd8vYVuopirME0S2JEUbEROx0VxA6IaGJietdooibR2BIj
CNLsgqIgYgGJURFFBcVoTKJS3uPt2327O/WW/N9/7zd79r6ZnZnd2fd237u/LjNv5s6t/3++
U7/jx7unYwkCqW2ekgUpSCkQ8cJYKkVHJA7Ejcyr+X/keoK3bpz8ibTNn3njeGL/ucIRO659
tcfBjmKzXyeW2BMJzIEj81nRHMPB56FI0y9J25zfOE6q2RQpl+z5rWyYi41byXWY6zNXbt55
5jDJOUU4r3RLx/5LOtcamW/sL/Bx3ZyY76Wfm9vpO+LgnpnvwlYoXskT8bgfvA3skSSO7fEW
jzLYcBxHDpQRx/Ee7/Vn3e7LMPdHb9ttv+v9XmfPOftv13UH+t2wcy6KomX3r4/T7Rl6nnfA
zOHAyFfcP9yrXvex1xz3fX/Zud9tfvab073mwaBzfZj9L3dt2Xmw3L7Wah32W/P9ri97Xr4U
KzJ+6KQsWKFvwCmsmhlgdlIwYNNqmH+HCQq45sEC/CI3BSLzB4QzYCeOu4or0r+N0j+cachb
Lgk6OQnw4FgWRM05hhFWdPL9ikaYAqqk1+An14NjumobgB/nfedzZ/Fr/BWrCcAXColSUIBG
YO5R0E6QtdWy72dr8zLpFTq7cFb40PORj14LfJTzpZcg6wek+vcHkgLYbRAUh1nLo36O+dhL
z3p7qSwL5aoc9ZpXy4wBEr/hStnzDW62xTemqBOFBk5caRkLLjCg48X4g4XV7lhq8UoXTJzs
L3KMXWcANHQjaVtr1JWSAaGCOTYM5emFhgH9+8nsXE02m21/8tFL5VmfvVLugVVYnpC2Wdyw
mmlBD/oKTPbNcTyLieY6DLyFqXIQO8n3rkXSuGOh8jtJz9stxBZjm/N12Tq5VUJjrcbGQg3L
LYnnZuQIo5wcsXtB/unJTxaZaxu8LoxMqzpQBVU3YXOgC+1cGG+cZ7Pcv8Mw3O/n9ErmJ7bv
dj/Wmyz0m/jv1CHSqEzKnEGKgrGw6gag5przxhA04BYG1i3b8Hzp+C3jUHxj2TkWUH0LQh4M
RvPBMK/2RlgLNZLADRL/qZNoc57B66IBOzcwRzhom/y0Dqu5ItOf+rg8/Utflp8fslnuaDYk
MJZh21mZ+wjnXwgXz6njznWWGqNOx3pe3FasImEUgMasSKUqlU0HS31mRsanNpn9tKTth7Kp
Oi6zs7vkI6edIOd/9CJ553Ofb13Cw/qoe02aXpNsf118y73vJoQOBGDh9Q6rYOQKyPocvVzh
2XBG1lW8kdfvKAyJXq7bvbn+cSx/Cu+md0t7x7RMbD1YonYkrbAtE+WSVCoFa3lZy9QCp5dY
dYgfOon1FkjRvCYxQ1dkqNcUlgyAmT24fgpogTmGsU6xnVM0hmBJ2gZMNxdc2fWZT8tjv/wV
+b4x8uotg7hu0bpoVxONiTwbykysziUAugiwsYLXWH2Oz7zKZgmDtrSMHlCdmpJGZBSQoCmT
Rinx2g35/oueKI/9yAUys7NlrOlQytY/7K/4gR2IgnAQIF0OWHOrPR/5WP/rdyVycLkY6N4G
U2uhegiFtg2AFnzZUZ+Xkls1RqInLactc7WmBU5YVSFP0v4ZEDRWauIMDa0FG3cFoX6vkXWb
Wusw9hN7N2obQMNekQQFpDMAH4VSu/wjcvxXPi+3FiO5s+hLoe3ancSh2dZN3LN00w7+6ux5
YktQdTEFqWucOE4eXtEvJEoCbmjbWPZOTaphQ35x+rEy9sF/lJ3BPXJI1WyxBalcTSmtEFBz
UB08/nQggkoOoPkYxHJb7+t3EKt0uSStlSRajer++p4DWKwZvGgaEAvFLZdld2NBWgZky2Nl
aRhLMIkrBh3LKoijNIYKMPRXnhQEVHNS10VkrFS4MeLAwljglGzcclMxltYnLpejr79avjPh
yA53QYrOmEixYPSA0CgAOKvYWLNpVu4Qr4EjVlFYms0bW6uZsdYETp2umcx4WEEzlkrJMaDf
lGK4IJPNWZkq1uTWk35dtlz4DonGZ4xiMi+N0LcAvNvcx/ERPcQ8hpqDST7ysT8rx/0Miaws
3NdywS96BkqKRdicUqqUpCWJxSjlojSCVnLxacwwOeMk5rkHMDI0OMxrZ8ACDNLP3E6yEizP
mY9eLE+87rPy44Om5C6cTwHwGdjYbblgLOkQLuIkMYjAOOgrwDRMlQTY2579JlyS1AtlIrHO
XfXr5Jy9yDe/AaiKjBkE3mquodyelVtf+BR50OXvlXtlhwRuJMWysbJnaiIrzEdabjIdaBbY
sGns+chHPjYukA4q79aLkeFbeGjB9WoAFEYnALZQTYDDLSD/yAAHwK2Qgh0Sc/y0CjOy4BjG
rqzI5xtHNoAJWHPd0AJXgLKddiSHlUty14c/JI/80vVy+1hR5lCxWahIyVp6njTNIetw3Xqs
00osymFfk0ze5M83mgOSpOgJhiu74Hqy0DLnWHCkbD6vB25S7gKgjZMKHmMvy6bZWLa5gdx0
qgHTi94qM4W6zJvrKjkt8c3vJwOzVZ1Zwytz5Q1aqrC/L8rlNNLVKBk5GOdjfxirrS3tta9u
g8lRvX7fL6u513c8bj+Z1y2JazWx2UGueblj+TZJ2/ENuPi2NMZxColFZutAo8QihYmKGGec
IE2SmRunVqW7CmIFYxybH3t+QertuliXMvZnQPKuSy6Vp1/3OfletSw7ikniE6xWJ0qJJFJL
N+5Ykit7dTrWcpwqCFEaJzaAaQ5Qb5rPCm4CpuBvMKcYmNdSGjRFcnLUaEg12C03nfh4efgl
75GZ4t2ySxoSmI0KOFBUNDssJ17zFcRP8xKIfOQjH+tZwc0VVA2oxiptO2kNJokS3BRMrVs0
BdUUOWOHNS+LwCQreYV1aCzTBrgVSlsSbWPe2HUfv0Iec9MX5bZKSWb9WAqomLHpuAVznskx
I1fta2hn7+KrhVF7PYEETpxES2Pci8g6gf1SoiHVGyIG22FkWs6GApzE7TnZYrbz2vfKrWc8
Qx5w8Zvl3rE5qW8yljaCtCifiTdJ22xd84rW5RtLaUUP6kBilslHPvKx963aUQFgv/0Mw960
ty36YUe2fMknyV4nT9cmCTmL9SGorYlRHuOqzNfAWqexs9paKOw3tu7XcuRIA8xHV31Knnz9
Z+X2alHu9hPawYL5uBh6NokIlIRRWnojdN9a+3Vlr8luInsHhP+1iUo21cnGR324dQ2YLiwY
aBwrGKu6KV7UlK3FppQW7pI7XvhEuf/F75FwrCatSkPmjHUq0rT3MUC5kQHRqGOZ5hZqPvKR
j95ru5/Ldq3kwSjikMv9dr0B6Urv/7KAau2esGWJGjyDVk7UNsDlpPHNSMpxEkN1wK9LaxCu
Xqdts3D9uJChDxx8ACADxEDDtlR375LGVVfJI79wtfxgoiI7XXNObtESLwBMAXUJ+2DbQBLK
a1yLrqiRDYZkSNKv9pps2Y+bEh8m1mvHCwwXrzFLAwOqFQOmQbMhUTgvFS8QL7hH7jjzGDnq
gjfJXZVfSL2CfGADphGCpdXkx+m98uH2bTOGmsdC85GPfOxf1upqwXTUx9zb1uoioNrCkKgD
KZYRKU7e28oWSej5EiuVNIE2IGjANtVqVlAHasdC02YUT3/6cjnx2s/KN8dKclcUyHhps8yH
NSnFZRt6jEjnm57rYiGLm5L1y9CvIqnnOU7pitP9ibZ+zW3wyun35lqLwbyMxTWZlJbccfJT
5GEXvE3mijvFGatYqxQsSdZtbhSTolu2NjjIJxwJ071He/0h5yMXivnIxzBW6Upqvpf7biMw
d61EzmaTpvy0Z0RqocEVypxXctpGNoZqLUF+jItPQ3ph4CUJSyuIoYJpsOIXZP6yK+S4r35J
vmOswFnz+ebiZtnVbEmhVJVGmDSCidIQrguL2JJJICs4Je5fscWXwKglZIgjW37jx1FqPXvm
WK41vsfTcy7GdSm7DdnmB3LLMx8vD7nofRJsnpPpsCQ1JFUVxhNCfA9lNGVZaNWkYNE4kNCr
W4PVWwGggg4yH/0X4oGoeOTKVj7WmwK20RS51ayhPQC1s1PrSAWNnyuabhZACpANliQBSQKi
knZosR1h0pNKAcm+dvKYOkgsTAbywoRcf/5jn5QnXnWV3FFw5Z5iUQoGyFpxS8qlYtLIxU2a
ubAzixu51sINnISnSTqWNW0/t0cKUqT+7aYQHFpOJnuasWe0C6+T9osmbgDsdhBJzZzABAgZ
3Jo4rZ1yy6lPk4de9h6Zi3bKQtyUZtncgwidZRZsxx7f3LOF5rxsLW2V3WHTHjGCRe8m8dp8
rD245iMf+ci9GisF05XGk33ia2Q7dCY1nkm5TFpC4iTWaQcI0yBsaC1FxD9T68lNSBF8AyzW
2pMk5tpE7BUmplNKgdf8tZpykPnZ3ZddIo+5/gb50fiYzBZcy+nbTK4ieU1dsRrIow5AF2xh
C7rF4CPrjnadTnpVlLqWO69JB1JZhOHktSh1aUUt848tUjKXM9dwra4QuQZs47ZUiwUZR25u
vSbjcU2+e/pxcp8L3y73Ttwjs7LbOs2REZyoJp7lIZbIgHSxItNxw14vOJATBSRVDvKRj3zk
w4x6vS5FY0joFm9aiCPphVYQO9Ew4x99Vvk+66kZlEh+tXWqGxmAcR/61bn2a0KwB/XgYuPs
xNpMGmAnzEEJU+/SOlM3JqAudp+xHViiOHVngmkp7rg2fYCpV5B2i/HZBKjvvuQiedY118i3
xytyV7lHKUmXZxV1PlM3Ik5AuJMcpSl6Ga/N9B5NPnKkZSxItFRDBHTO4GqhlNSblp2i/WEh
rKM3m1TjefnuCU+Q+170Tlnw7zVQWpOgZDS6OOyoJAmkRulxfNv0TZhMlSci5SMf+egCSN2E
dhYQAab4TIMoQBi/JYASIPD9viCIz4esgqXdPu3YWqYA03KUACU46+EebjuJ67gQF6XdFMty
VHaNDbywQ2Y/9lE59oYb5PbqhMz4xVWdQmATfhKKwEgBKdFzMdlocdLSNYwYadHdareZbc7I
WGmTNMy/Cn5yYxxjrR4MGsT6jPzwpU+Qgz/4d7JzfJfEVc8A8JjUm4ibxrZ+NR/5yEc+VmIl
afADYAIkAZYARny2e/duKZfL1pIFYLZaLfuev81S+uH3a5H9modU1hpQE90psUZt8lIS87TM
8yknb4xSHKNdVb3QAG9DZq/8mDzvC9fIrZWq/B9KZlZBWBDJokUaOd2NW5dOYGuSRorZydje
5twsYYMxT8dLUzLf3C5eaauNJBeNErDV9aUyPy3fPf3J8sDL3iqtiTlZKDnGNo1kPHYt/WKU
0B/lIx97uIoGEUC5kDqwR6lUWmKBYmgLE2N8fHyJaxJgao0JA77ZhMWVZusOCqrZYyy3/40w
t0fNDb46QI0jGzMFtMEyTcDU7YCpjcfGvpTjUEoL2+Xez3xCHnXt5+WbmzbLTnADm8mwemqI
9FS6ASkngKhEKdHOVw+nILWaeVuNpVg6WFoG9KVZk8mgJKXmDvnuy54kR134JpkpTEvLa5sH
4NgYcKs4LpEf5THRfCxVL41gpNWQj3z0G7RCYXUCNDVAtttt+/nY2Jg0m007p7AN/vAbbJvl
n9WW5FrNwfVira5Hq3nVFioSkBAzDTKWqUQFi3bBwryUyp7c+6lPyLOvvUZuntgkdxlQGi+W
pBEYLd5fXWwx7nI/NZhmv+lsHyc1tbBf/WoKxSCxaIYyFTSMBToj3z/9GHnwh94oC4V7xNvk
S9uSNsAd40orrEnBryRFrPnIRw/tNo9h5WOQeUJLlUDBeCjAlJYsP4fSRiDW4KljsaMCmtXU
qfbLoLUS2VwjLG18hmuiJa7vgVZW6fKGMrHaZiFrAcirtlAdSRKQ2o67FExDTyoRGpeHsv0j
F8sTv3aTfLtYkV1O0XxWkLl6IMWKL+1RTsweYGqzbFMQ5ZRznaSMJi4EMmYTiIyRaoztsbYv
20qRfOt5j5D7X/52aUw1ZNo88Hpjt4yXx2S+vWCUAF8qflHqwW5xUGe6zhOOsNCYvMBJnHMD
r72QzEc++g1Yodoq1XFUzCGuU4AJE5K4nrO/65bdO6oOVWtpDTK5igoBLXDcGyoT8/Pz1vWN
e4DteV2w3LOW/ca1UNMkoJCmIt28IGwwYIqylu2f/LAc95mr5Ha/LHcVqlI0D2UeWbQVf00q
MrNgyi6n9AnHnc/TCtWwLg1z3pNRRSbNbyv1e+Vbpz5BHnT5O2TavVNqZrsG+Bfb5rxbc4KM
Jc/1pN6ck6nSVplFacw6HmttISHtXy80JE8cyCNP3sjHMANAAOAgQBIcGo2GBZFvfvObcscd
d8if/dmfWfDAtpxfb3nLW6wFe+ihh8oDH/hAecADHiCbNm3qKNHYfpTrcS3nNq4bSgPLhHAs
vP/MZz4jP/rRj+SNb3yj/RzX/5znPEeOPfZYOfLII+W3f/u37T0YFlD7lcPsM0BtuCgdMZpU
aADSgGkcGeun3ZRt5jn+7MMfkt/84vXyg3Fk81bEM9uhvQ0Oiq5o0WIDm5FZp1kwLeAc28mV
VtCCrb1oSKNIteyVZNJsOTa/W7a4Nbn5jEfJAz/4FpkvL8hux2hJfmpDFyoJAEtTAmmJUzTW
qlEaPEm4hJeZheJ7yQRJ6mr3rrDlxMGEQzLD7/zO78gll1zScSWtZiwsLMi1114rJ554ol24
3/72t+UhD3nIAQso0J4rlcoS9xuEBO4NBCSFJ7VyfKfrD3s9P9Yf0oWMY8DtBYGZexo2/sAc
0GsG6+hDH/qQvOtd77LzBc8Yf5w7dPf+4R/+oVSrVanZJJBkjf/rv/6rPO95z5OJiQk7T/oB
x2opAfsRIHRT6LNWs07Gwly/88475YorrpDXv/719nPW6eI68fqJT3xCrr/+epmZmZEPfOAD
8tKXvnRorwDdy4P2ex3UK7XKGKpra0xhsQV1A6y2fAZctqH87LKL5PjrrpVbDZjeVRqzvA9e
vMjlS6N2FKJ3sUl43ElAgpsX72xrOIJpYN4Wkn6mRdAYuo4UoqbZaLeMR/Ny8/MfLw/+0N/L
vL/dWJ6hBGWnB3QvdqoJxVF27yDAv3fBBhPn5z//uX3YmKyf//zn5f/+7//kYQ972Ejcml/6
0pfsJAeYYL/QGrGQDzQg1QtTv6fAgwLDz7lI6d5bbuD3eG4AZL0/3OMcTDf+oCWJ54n5cOml
l8rZZ59tnzFcnVDGMEfw/PG8AZrMCMZ7eIj0PAQIfetb35J3vOMdG+L6ce2MH0Oe/Nd//Zf8
+q//ur0uXDuVCNwPACvuAa4TYIrrf+pTn9pxAw/jFVifFqolfTDCtBWKV6zIhIGwwvx22fHJ
K+SYr/6HfK86KbuMBQgwLaW0u7BKkcAUjRJXUtL8briGNqSOdU0m5THsZ4pHGLVqssUJxW3N
yPde/AS578Vvkl1juyQcMxa3AdsYtIEekwUo+CqdhCZbfxqv/wm7Y8cOu2AxKTFpf/CDH8iD
HvSgoSZht4H9XnjhhZ30/R//+MfWFZOPxYF7vnnzZtm1a5cFVdYP4p5BYOD59LMAIEzxO1il
2B9iSQTYfGzsASuJbtl/+qd/kt///d/vKF54xvij8sTYKt2j2uNB5RlAdNJJJ3WssL01VuoO
xjUQVG+//Xb55V/+ZdmyZYud77Ozs/YaMO8hq/CKf3M9/e7v/q7c9773tb8fRJbx3mn2qUGM
hmEs9FUCasqrFIPCL5JWVJeZz3xCnm3M8W9XxuTnBs08x00sU8KSm7RtE0dGb6s5GVCNbWe6
pJ+pwcGFeQP4466AJbhgwHKyFEhx7l750QueIve99G0GcXdLBKaktJdpQrEULdU/ohRgnYbI
BmjFhgm7ffv2jiBGXAZW6gknnLDqfd99993W7Ut3FNwwL3vZy4aasPvbyAoW3BssfnzGe8Us
Tb72A2RaLwRVJqhkE1rysTG9GwCDv/iLv5C///u/7zxnrCG8Ehjx3DEYPuDaxjoDiFKwA1yg
LHOu7M35sRL+W8qJnTt3yh//8R/b387NzS1xdX/kIx+RxzzmMXKf+9zHbjs9PW1lGuQZ1xsT
tnhsrBtcO127WDO33nqrXHXVVfJXf/VXHZAeRXhK72P1FirqSQ2Q+bUdMnflx2yd6bemNsu9
TlF8czHFIMElWqZBKmd1C7VoxMiacPemJTJw8Zr5FxhLtWLANGzOixssSNUPLAPSj856phx+
wT/IjsKMhAUjoOJAGq2GFEqVtKY2BVdYpuhpaoFW0yjKQP1g91VcEZPp+9//fgdMMWBVvulN
b5KtW7eueL+Y8F/4whc6mYiYsJ/+9KflrrvuksMOO2xJGcCBAKLdNHQIRQhACDx6CLjIcf9Y
KtBv3uD3vMcYjL3myU/7x7jpppvkzW9+c+f5EpgwX174whfK6aefLo9//OPtmsL8wXMHAAFY
4G36yle+Iv/+7/9uf/e6171OjjjiCDu/uhE/rDdrFeeJ60K8GGBnQSmd289+9rPlH//xH+31
aAUEFiz+sL7wexJd4N/4HjIPoRH8+7vf/a61fHEfsR2O9Zd/+ZedTOFREjuMIIZqAMVoE1L2
DZh+Sp53zTXyddSZGoQcrxRl3ihVRTcBuI5lmv7OJZDGq7dkFu1I15bDZL90ymmvGwOWJQOm
E9GCjBvT9YenPlnu+8G3Sc2fMZZrURoSSBy1xPONdhcYcPUL0iZ1Q4cnOOoczclkDve4y/tM
8DFr7oYbbliireI9Pnv+85+/B+H2IANUaNCS//qv/7rjQkF2IVw00C7hhjlQrVO+6hgNQBX3
hkX5tEqY8j+IwOHzIe1cPvaPgXlAMNWJMpgjf/Inf2ITj5BglJUhcHtu27ZNHvzgB8tzn/tc
ux2AFf+mIg1QWess/9X2U4VMghIOkKOFSe8LLNb73e9+S+Y8vTPYjlSMJFPh/mipI1npsssu
s9sxURByi8QrrGsd6fNczY/Rgm3Sa8muyy6S4776VflusSQzni8ThVKnzrQZKSvUSS3TlCow
otd4NLaYiAI/NyVtAA5W0y0qBjBLXlu2GePp1mceJ/e/+F3S2rpbZtsLEhhtcKI6LnOtmiA1
uOKXpB7UbJ1pnDZWF6fZAdNC6IkXe0ZRiJfP8t3HA1bp5z73uc4kwkSFgP/iF78oz3jGM4YS
zqxlhbWFRYD3EPbQpAEYGP/93/8tj3jEI+zEPdBLaDB00ggXL+Nhgygy2mWFfcHTgJHf3/1j
wHrCWqRVR9curDO4gZmEROFPwOC8oVJ2yCGHyCmnnNJJcsK6XgvAGIVVmpUpcMViPhMYsa9/
+Zd/kUc+8pF2Gy2jIG/o8rYWoYqd4vcEX9ynD3/4w3a9INTC5C693ga5NyuIoSY7dWhxdvak
rFDy4FpgTIVCuumuj31EnnbllXKHV5Q7C2XLzVuPF+tMLWG9JqqPFZiKKnWJ3RW6fqN0v67l
5k1axEWL5x6ExvKMZdwJperWxWvtkltPPV4edNm/yIxsl7loTkJ0jTHPaK42Lw7qTD1X6s0Z
W2eK0pjQupHjjpsXbz17LDdp19aHHL/z9T5IYPrf//3fTuICJysmJdLN//zP/3woty/rwLAf
uKloaSHZhlmIP/3pTzsTPx+LoEhPAN1ZZIHpt6h1SQHuKQUGi+EP1Fj1/jJQZ0qXPsEDz/WP
/uiPOmuo21yhpYZtdDwdv9VZs+vV1as9MABUgiOZkI455pjO3KfMoTKhFUkdQ8XvmcDH+wWD
grFoWv60UhmjHamFGtOis6xHacs2ApLNywGJfKI5GENbQrRja8eytVSQncacRj/T28YrtmtM
5CalKrinTQXM+hZHziKpPcC0GCWCJkjdv/YMBn4moRTNkcC/68VbpGJObXcT3BJm/76xAOKm
lM1DmEA/00ZNNjk1+d5px8kRF75Vpse3y7Qzk+RUmQM6xcWClgAt2UpjBnBx412FgyktFq7P
i80xAa7xksIZXI3nLOUWjoIoaRfr7F1UxTODe5aLFJMJ76Gx4f3XvvY1eeITn2i3ZUH4IOCA
CfnqV7/aAin2xc8xaZGleP755x+Q8T1NA0fhp+uACaq09Gl59tunZriiMNWf68xPurYGAet8
7Ptxyy23dJQsnbFL162OtWvhz39rpYrbaaupH5E9FTSGh3TMNauwcX7hM2anawpAghvLerIk
/xpw9b5giZNSkUonFH1uq2OkOF8CarZTD37Pkj3NtEQLH4MkEPpe8r7omHMv5UAzUuEvm13s
Ox2gS7vDONqsMiayW5CC6xuLLeRdtbiy85KL5anXXmvAdKx3P9Nu9qTT3YLLNhJPG5Yunoqz
9Ktkc/QzrXf6mS60jPZSTPuZwvg2VmkJ3zfnZSyel++dhH6m/9zpZxoXF4ti46yVmcZM4+xB
ZfFzcBj7cVJfu5zbd1+JNUxW1IbqekcKckwcxFGf/OQn2xjNMC6a//mf/1lStoEJzlgqJhgS
JuBq6VePyvrNPFN15QP3kJYKLeE8WWnjDCQTkeSDlhQG4qMErOz6Y+LNasveCFa07rRyR9IQ
fkbg5NzSXXJY9qLBjbXpBFXmFVBOkFoRpXfME6CliW2YWEUFQcsXrWwy9oz3OA/GjbXFq8Ea
cgv70ZSOWjGhApw9Vjf3brd15tv6SmORxjYrFqw/TurabFl7ywGYQhaXp6RsAGRi9h7Z8fEP
y7Ff/ar8aGxCZr3VPdR93c80LMR7gukqR6iVgyxO7+UFCysUE1NPcLpFkEH3hje8YShAxX5A
BaYnNf5IXgAXCwD3137t1/rfp70Y49lfB54HBQgVJwqo/N6u/wGLC8+MSX20orJkBXzG2ksx
iuerjwOZwJpOhheYVcy1TsDhuqelzJg+QZCZ7doqpheLeQGab5h0i/qeaMtUd9vJesy4Dngd
GtixL4IrrXANmhr09b71fc5a+/p9liDCtyIeHWPYLcb6Lw2Cw80bp4xAEZJyXGmEbWlcdaWc
8oXPy82Vgvzc0zbu8GNf9zN17JbBSDuaxs6eIdXh3NijG5jUF110UWfhcAKw7RMWLtLK4fYd
1ErExAbdIBcFFghZTegGQtwWbCf9BhatdnMtZxUvZ4V3c08dKIMWPpUmAim1bn0PKXDwnPDc
b7zxRvnP//xPW+6EfZx55pm2hvFRj3qU5UilG5Jzg+911iUF/Te+8Q1LGfed73zHZn9jsFQL
CSawuJCxicJ9WBE4F/JAM2FEC2meJ/avS4/oymO5BC0dvAdDEObezTffLO985zs7iS5wHyIL
FnWMOIeHP/zhNksW++J+tbWjWXp6rYteWazDegdI9EEwpRVFBVVno/K+0OrSFtUoBi1NHA+W
I8rtfvjDH9rEKZS10GLFPPnVX/1Vm3yIEjncT9wv3fCc1jZlDUu9dCgC8whVAbQu9UCOBuYg
5zMtWMaOaSBohZK1pdw/zgmfMcTCucS4M7bNzmPKER2T1nKmG22ings+E2Pblhsw7ABqIUqI
7puoOQH4LOyW+KpPyqOuvU6+OVmW7Z6Z+D7o71dnc+3LfqZBIRoJgIbOnp/tK4tULw4IOD5s
umVZBE7XCGq/jjvuuIH3CxcyeDa1EGegnwIbGcD4NzNS9cICoTcKq3X8Bq+gR4SWrjtK0P3T
T8PmxEa8GIIb+2R2Lfbzd3/3d/IHf/AH+yWgauq6bEsvggHuC110IFoH4F1++eVLlCI8rwsu
uMBuB65nxpPIZEMrgpR4tIYBYm9961ttJjlrHxlb5zN4zWte0wFNDJSJvOAFL7Ck7tgvPSYQ
rpgD3DeOg8/wHcMHFNZUGPBbKAeg2gPHK+c7Y9bYDvtAWQatd4z3vve9tmwM2bHaY0I+5m7s
O6NuRo2B0hAkB5JrG/cN5/GLX/zC8mJri5DPW7ssR+Hh0AouqP8+/vGP25IdkkjwWKyrvvji
i+09wne4J2BmQt4EamU1wPEZaPc056QuIaM8IhMS7gNCUVTIsu5Z/IbWM2ULntfk5OQSBZxy
RFcnaCWO10Z3u67zZsawtnbpBVruOftCM9Yia2DJ3BETlLiQxFRr4Owbk/hTH5fjrrlabhur
yt1mu6nipCwEDXF8Z9WAtIfVsRf7mbb3436VyLilS4PaPic2CbX/7d/+zWYUAogGycwF6w94
NDnJuUCwXwpcJCZBiBIwdRIDuDf/9m//dom1AwH89a9/vcPexO0HiRFxkuMP+9Agy/GUpzxl
v7ZQIYy0NUeQpLWFQYYsFLiT9pAuNj47bIs/WJF0z+FzfM/njWNhwHpBBxCUJmiBh8EyBS2w
mKiC8ad/+qdWwQGAn3XWWR13G8CUJR8UkhCqFMoUZlTefvKTn1jB/8lPfrLjKqVQ1kocLRdt
Lb32ta+Vc845R973vvd1yNUZT8Qc5nX2sgCziWLLzc3lBixmPgPcNwp7PCvSg9I1yUQfXZO5
2ng57ynuFwj5wXRGxYzgo2vV8W/cZyZL4Vw/9alPWcX8vPPOs3SAhx9++B4WL+8V5xITjDiw
P+wX957XSTBlfgD2p5Mr8Rta6ZQlOhZMUOcz1/NZZ8vjvY6z8ny0ctDtnmXdvwmgur7FolJk
hFDYlqJtdwbwKVpg21IMZfqKi+RxX7tJbi/6Mu2GMuFtkplm3bIJjdJdui/6mYpfXjW5xHqE
ZExAuL8IWFiseNUTmZRm3/ve9yzQDTJgiXB/1BCZGMOJjfdwGbEkh7yjWBBwBaPjzdVXX70k
UQCC+ZnPfGbHEtIlA/0sVApCuC4hgLEoSSSOfQ/ift7IMVQt2PkstOsU9xKeBTDu4HkjZg5h
RWWIwggDQHf/+99/SScbCjM+E5R6POEJT+h00GEMDSBEq0P3sqTbDd/TxQcFDsIb8XZYzNh/
9rnzOqhg4Ttay3AtP/rRj+7E+AimvBc6s5NeECqXupYRZPL33HOPzTTlMSiUe2V5DqLkDTrQ
do3dg3ANOAe8x3mhTRnuE0BLW3vaol5tYhKuB9YwyujgOWLzBVyDdrGznIVWIsvlaMXh+YKL
GHkZ6JaDHIqsgk7gJqjij94AAhrXLJiQOFcYvtIuZZ679srQoiWI0pLViUv8nPFUfVy6ePk+
y6Sk3btUtLKeAp+YXEAHltBoEA7ANKHXa5sdTn/0CnnSpz8lPzRm610gPDDgVY8NuhswXQsg
2dv9TFEasxogDZ31K2hhTVIYskYLFgHiqhQyGODgRRx1EDcSrEsKa1pBaN8GGkJMetZ4we2L
RaHdtpywcLXBrcREAkxS/BtCDdaRFhj9XL7U1nE8WBu6zRV+D9fm/tyjlPeXYJEtwyGXM7oL
4TvWDFP4ZFmd0Porm1CiY4sgIQAw003L+83ENJ38xmPRRQkBCYGN7UmDCQGMc0S/T50Jqgv0
CRxMtoI1BHYgWjT4jAoejkOFipa6Di2wtAJzE+sDx4OljYH5pxVSgvwwYDrswHPheeF4dLXj
vAG2UHbR55SWFV2+uDbGkFczcBxYllSUCZBUgLXngfeAbvpu8w3niBg8lC7EWKnc6HWsLUut
mBNw8XwQU9ZUjPQ6MVTFfWqXOOYnY9JMRCJAa2IbyjnulwCsZQcV9W50opoRbQ9AjdJs3opn
oLJtFkgJ2a/zsqnSkpkPXyqP/OKNckd1TGaL5gHCZRhZJ6v9VdvtUu6ySus0C6Zr3c90aZ3p
Kk6+17DaT0niMEp4JuydW9v2ZpxsEBDQbjExIMAwSdAaChMPlFyYnPjsn//5n61lgm0pPLmY
qGWyADu7gKBJIwYLQKQgYgwIC4raK/t64nsdH9HaJpoJo/6O8ZXsZO3WIo0LAokotI65sPH+
V37lV0aiyQ9ikThdaCZ17DqbRDNojJTAoF3s2uXH/WVja+xUApec5v+FNQKyccToGGPFsyU7
jb63PCaODxYssPEQOLXLDiD7kpe8RI4++mibqMLfYx797Gc/s0AMwc02XLQQIVARQ0T861Wv
elVnvmk3s47JIWYLMGXYgueG+wx2IZwDEmbgPqY1CuGM+YhWg3D1Mr5LtzT2jxgrwA1WIV2T
mmhAK6BaaOv1oOdyx0DIWJT8jK5pADsUXJw35y+FPtYI7ucHP/hBG6dk0ll27unEpSw1Jd2Z
TOqhFU63POLZV155ZWducA7hFff5jDPOkN/4jd/ouKZxHPwW4ZXrrrvOyg66UrUli/uJ60Ly
F61IZurqkAy9ZFS2GSPVjSN0LTeT67JZ0PS86dAAjQjec649etO6ueSzdbPZGLbTh0rWt85S
TDog1cSUJSBA7g/A9Elf+JzcNlaRHaWigPeogIuJHGsdtkaYULmv+plaBqQh+5kOb3Kbe1WH
1pUQJxRk7XlYMRmRXMD4GckXmPQDoYFFRMGIgWzPpz3taR3wpbbKxcK2bzowD0AGmEKD5uKg
lYAFd/zxx3fAVDO4IBEECw6xNC4cHAeCFW5AuLmohfazmpmUg44UtLzwGWO5yEDs13N0rS1I
XBsTtAgWXKz9rk+n+meFaTcLITswBwBU3BbZk1R0OPAckVACdhoqKDw3Cijcz7e97W17tI/D
fiDwTz311E6yknYL4g/ADYGM+YBs24997GMdlx8TyAB0z3rWs+Soo47qxFEp9ChA4Zr9h3/4
B3t8CmfORVi6UBa7uTQBHJgH+APoQgnEOWhLGnMeiVIAbChhvH5mE2sw5XXruHA2tqYHQSxL
zEBhjVAHrh2xYA1M9CzBq4T1ivjk4x73uD28NtnSF92sQccU+Rn2i2vGPtEkgyBGdyneQxnH
GqVFRmDG91B+ECKCYgzQfdKTntRZ+3iW2De8XlDcsAbxW2ZSE/h0di09LEw8o9yi1arDDVph
1p+PUjEe1H3ftQ4VTD/SCCQe3yK1ViybCuaEr/qY/Mp1n5fbxqsyV/QSRqPAaG1xwnRP+sG+
1tlQFt7e72caD8RuP6Dv11mqIHSSpxBEb0eya3radr7ZG4UdnPhcnEzsgKaORAedRk43CBYA
gJYCiAlMXGx4/8pXvnJJzRh+h1gJFwddQRjI/EQGIy0qaoYEEgg2JJTg3HBePI+vfvWrVrjg
fAdZLNg/M4+p7XLBnnzyyX0TR9Z60LJkViTBgRmH/QCRCSCa9Jsx40FLnXAsHAduOJ05yngR
hbEWbvr+43NYGwBOPmvGN5FZi+elBZwuP6CVBNCGIgXFB1YPPBq4flpqGLCQ3/72ty+hWOR8
wR8sbfxed9rBvcFneNZaUOvMZCpd2C+AnVmq8NLgO8w/xg5xjQBnHfvXCUu8b7SUdCZoN7cw
75MmStD1m3CDT01NWWUSgEpFgqVBbEyPnAN8jzWKjjII0TBOzHOkF0jz/9Itz++19Yo1Q4tS
e3UQ08b5UDHqRZOJ7xDHBtvTb/7mb3YUdMoAxGTh0QBJA5+Nri/lM+FzZqIkFXhdtkVA15Sb
oySEGbarTE8LNfGdmsXQNjdh2yEy+6FL5Heuv05umXRkGhqnJExAksYyI2eR6H7kYakN1s/U
kf4sScWCmTCFSI447BDLldGy57Z2Ll9muqF2jIOuVWTeYoJCU4e1AAGF7WERvv/977cAB6HH
GkHWa2HhIKuTcRMuGGjMSDyi6wrtpJiwhMUBiwKlEXTX0SWDvyOPPNLGUiEMaXHgWLAcEMcb
JEWdA648CkDGyHD+uM71EMuGwKCrU8e8BolZM9ZIoNPWI5OC+oEpxrvf/W6bnEWrT8fBtUAm
uNKKxjNDDBZCnNvTRYd94lkRRDQA6wxPJhMxfgrPBEpz9Llj33AfwnrEfORzx7Hwe/TehQXK
86OigkxhxPD5/HFs3DMci/vAPeB9pxscrk5ktfJ7xl1RvworGvNZuw+1i5fWJWPNgwyuHZ4T
nx8SxPBc4W4GMMFiRDyTFjjjqyyrgeKL5DtYhueee661DrP9dxleyHL6EtxxLVBcoQxpnm/8
4XkCTPX81G7lLLjic7iloQzBE6JdupADOA4sf03AQECkfNHWKN8TfOklydaLjqrXay/50s19
Pwjw+g23aP2oY+GCTH/wPfKIa74st22ekGk0MwvbUrW2oIecHou9lvzXSepVk7QgR0Ztd+3V
fqaJuFq1gR0r6xRTJ0g/aAdGA3eKMjszYw9XXGOXLzVf1BvqIDsmBqwT8mBCo8fCxeS+9957
7USB2xcLlYJbxx1Q64fFgN9TOCHTkwsBrh24iBjXwmeog9V1flo7xjYvf/nL7aIm4ON4H/3o
R63AhYAZzKPuWsuZFgY1aghsgLtOMNgXg914shaPzmIdxAonkDGOprNw+wE67i9AR7stKdSW
pPyniT98j+9wLCgsuqwA5wOF7BWveEUHiBl31x1AdAyUwhO/RRYxiAIQU9VuXyhWiNOCgAHH
wnnzWkFCQQsKFh0sO1hrENaMUWvuVx6LwM5sVdbDArTf8573WFCiF4eKIhKBEMqgQKfFyP1Q
8aDS0U/Q4hy47nQiDfbHfeFzKDwAJpSyIVGKYKPBjK9QhvEHCxC82liLBBuCfDZkonl3obgy
s5jXh9+jZlt7V7TLWFu6WeYm3i/OHc51lGlB1mgPC4Fec07r/AeepwZuPV91WdNa5kSsxIr1
7b0yVtTPrvq4PO36L8kPpibkZ+Z3Va8MLJM49ZSCSSlyEpIFz9LkJ0DkMgt3lR7TfdXPdK0Z
jGLEQZxkIQJp/TV0+lIYYuL/zd/8zZI4Fz5DbIhaPxINCEAUeogfoaRFx14oHAF8WAjs3oAB
dy8nPV2JZLXBQNkOXELaVaR5Q3E+FFoEDfzBHYisz0EGzlnHXWilwgWlF0CWRQUCGdbBWrdB
oxsM16VLOQaN61JBoGbPMiU+135ucVwn7ieSQ7JE6lSW+G9ag3Qd0qX54he/uKMkMa4OJSab
HMZzxD3Vrep0vJvJQKgNprWNzwj8SI7Cs6PiQEEMNzHfsw4aiTx0DxNEmPVMS0q7yfk9AR5u
U1pUuubytttuW2L5EUwJhHRPDkLvSADBPaE7nJmvui6c+0FCF+Y+1g3cz1AwqQxo0CcRAjw8
eL7IPcCaP/jgg7smsBEE8QprH+5uWpFcF1j7D33oQzvXrGvMs3Mym8eA2lMcnwQaeB4MGYG0
BUoSlRANqjxX3Shc1xIzFk9SfCpFy8Ws92kMdcxmA4XyzKuulh8bzS8s2VkgTc8IPYOgXhov
jVKLNCmqicDymwLTqNrf7Jt+pugasxYpSWwsU6qOSaldlBi+63CE7V97WDJYqBA4EKSMwdEy
QeNvTlLEUpFIgrgM4zrQThH31Jye3B9ZaJgZCa0Yi4iCGHESsovorNCsFaRrG2G9InEBwlkT
T6A0B4kY2Ge/BYOmykyQYpwFBftIbulmGXMATLulva9FPBvPAFmmzPildTpIRxgdo4MQ0skZ
Osu218B9geVDi1ZzlDJ2RYWEMT0KQwwkt+nEIHopkA1MC4hWHMFCN7KnMqEzZenyZ4mEBmDU
pdJNzJg4QJYhA7qN8QelkGCpk3CoeNDNynuedXEjHIHPYa3CS8Png3mrlVRayTgvkmhol/my
AtacT5YoQq+JbvSGBDdYnXA/I36NdUKiAwIriQlwPgBfWLawruHd0TWT2s2MgetDeAZrgHWv
GCS4AMhSUeH903Fj7k+79XENUFB0bSi9VVCskbiYTc7ifaBSS2WB7/W8I4jq0NEoM/dHF0NF
eUQYya5KVX5mgKdem7e8vfiqak66Fi/lprXglEKQm0iMDsfuRutnGpKMnxzByn3rqPNbasW6
/FH6Gi+5FioEoPwvhL6Mt4wAmnfk82e9Nuk3IGtXvkHLBQDIZBayr2ACYiHSDYbPAKggVGBB
ObaB8Pqt3/qtzqLA5IUVSMHIchq4EHXBNDRQvOdigABBLAYCgROQC4dWDIV9t2xekPojxtpv
0YDliZYgFzOE0SCJSDg+F662ErLdJLS1Q0s428ViucVHkCJbS9Yl2s9lrN2WurAc59/v+Lgv
ZMHS/SU11yqFmD4elSl2K6IVSSAHGNFaJqB1SzihsOX+2CaQQpznwOtgYhLnCnluuT3PA79h
vF+7JqmkaLcij0FvCO8jQQ5gyvc4LlzBoDLUFri2qHBejNPrOGO3wXMiSOnGBTrpJ3sNJCqA
4gJPDlynqKmGq5wcxYzLcx7iGqBkIDwDSzN7vTwem1swsZDJUvAy8RnqemI937Wix2fBbQ46
6KBOlr+uK4VMYZtIKkD0BmB7yh/ORdJX6jIZLSM4d9cjfzf8KmZlu9LyPQlKRQNqJZtsFJr/
1axrd6mTsuUUzDYF83nb1qSiS2ocuxuyn2msXcBpDpNnrgFA68VRx0UcSpQqEuk+EKSP/CQh
yVjHXrmY2tZtW3IUmu8qhTHZ1CzJoTs8+faJr5QHPv0l8pP3XWHv51omwGAgfkptTxe4w+2n
43rHHntsRyMlwMDiA8hRGOL3qA/lAqEVidILLkTsH64murYIHGzPBE2Ylg2tFi4OHAsxFqTw
UyPG92hrBdDWSTT4YyE4FhVivuQ/pVWMY+O6Bkmpp3KQ7SuadWfpz7TbT1savYr+NS0gAV/X
2Harc8seX7fK4nPWVGvLUaPRS6H3rRmStFWk5xGVM1iofM6MS9LFys/6xbiz904rG4wjA2jx
HGnxMdaJ4wEgdCyZCkG2r2U3koOsktTtHuukJJ4TzoXH4FympcZ5rLuv9LpmKhO6EwqzqGmB
cU3p+DOfI9cx3OD4gxIMRiKsSSoYPAZj9Sh5ufDCCzvx0Sx4Q0GhQsDac2zH0hbtTdLXp8MF
uDeMxXMbupsJhJzvOJ7uMkMlh0pct5ZqVHR1aCJ7LppgQbvRB0lopDzR+xjG69QbUFOQACsS
nLmxs9Q6c1NjzI3ZHDx5LcTukljkRuxnquOpdgKhCUCcJF6hlV3oaOt0MSPYiVy7LT7zzaQY
l5LMtO8xN8VMkDCWzd6kVGY9uU+4Sb5+6gvkoBPOlcousyN/ak3LZshziQ4R/DcmNxYKrEWt
ceJzCHtkVcIioKBE/IZ1i/hD0T+sBk4kgCNiarB6WI7AAnpo0XA9cdFggiN+Ai2b59PN/Qr3
LmJFTCzC33/8x39Y9xWK9LXFQ3DAuYKdKes6g7AZtHVZ1iXWrZOELvfRC5lWRT8rkwqGTuTQ
DcJ7HbPb4tX3VVMLruXQgEqwpbXTrZ3WsODK64BXBYMZ31SscCwQQ+jsZghiKlHdBL7ef5ZC
MGtp0SJiti0zbzVfrRb2uiyIYNtt7ujzYKauzlbN9h/tFROkS5y/R2z10ksvtSUviJvq7Fe2
gMNaOu2002w5E0GUiieu6/d+7/eW7JvuU9x7DaKDMJVxDjMcpJPUKG8QV0UFgc7QHjRJsBcf
8nplPlu1uRRY4HM2Zj/TTis4gD7AFG7a5GzbXneK3zL6q0MrM2Ab2D6ygbWEC4Ut0o5aUi1O
SXXWlQfc6cqNZ5wllTNeZyZ5W7ZWSjZd2VtjQMVERVIFJyKtGNTf6SxFLhQUaKNUgODADGEA
GbbDey5ULkAsVAoRuh3xh0QOlN/otkiI18BllWU1oRWE84SLGcdgti+Tn5CJyPOglUZgBW0c
Yr7U0LmIEXdiiUk/d7EGhF4LVNd70r1IS0Z3qBgkuUiXTQw6NGh2i7mOsn1Xt4HYHRNC8Ox1
38vl2pv10+x5XbTWeH+ZaER3Iq4PsUECLzOCdROAfvvXilPW48Dr4n4wD8H6RK+CJnLXrtDl
iEf0M6YrN8tBS0Wt3/2j1aXPA2vuRS96kS0Lw9rhXGedM9YpkrgAoBqk6YqFa5a0kzwGzoPk
I72UvV7PlNvjvLJN7nE8ZGXrtUhlgu7vQWOW8QZoZLIqQA0dchu5G7Kfqa0jjRIwxb/8KAF5
XMuetaVkcIqsG9mJ8RpK0FwwaqvRVCMzmcMxY4kaC3W2JDee9mrZcsIrZXbOkcM2Hyrxjrm1
zUiSxfo/ZP4xDkGLj9l7zN5kZiOtRwgLbA+gQqcLuJcw4FbFIiZVIAayewGwjIdxALQJbhQ6
iNdkS0WYdEJrCzV/yBBEPJRWAgbqHFH/CGYWasuMQyGuSwILCjfEXHGdsHawiPsNAsNy7pxs
DIqgluXA7QeIg3QeWY8Dc4SeAyoQmnB8tUNbv3i26IGpBS3BjkDIOTiocpK1TrOf6WfIkgyw
RhG4mWRFNzvdlUyw6qe0cTsCqO5g0u233RKJAJBUPhlCwL+hbIKsA3FTut5xviSVh2JNbmy6
qjHwPRUGHY/M9v/s5dLudr7ag0NFgQoQvQ9USrRXa9jEofW+hlZtoUYpA+9G7WcqtvAHic50
43qJpe3Ge7p648jyF+OvAIGCBCdkwyFN3N8iY/OeHL1zQr582mvEOeXVMt1yZKI8IfFus4+6
+XM9m5dUWqOHiUkMMgXWvTHrFQMu2qwgowsKGbtIxODER+IDMmUBdKgJZSIOQAoWBJJB2EpJ
92dEDEVr5hjofwoCCFrHjCcxLkKwBe0h+ITpOsLnAHdwwJLxiPvFgkWTc83NiX0y5orzHCSl
HkqBjgvppB8dV9VJM1RKdE1pP4FDEOqWCbveB5QsXru+31QuBrXQeyksnDu0wLJWEY5Py4rK
IF7hlsVc77f/7BzIxqp1KRIZxXidJGLnetHsTfSUZGPI3eZcNrtY0wr2qmPtFo6gIsNsb7yH
cgulE14m5kZQ2UAyEMlNCHTkV8a/KSOGiREO+ox1XJNrhl4rHTsdtmRtvYPqKnv/GNh092Tu
2yj9TPnLML0R+HdgTqvpLj1niY3wTMO1QaocWJcwkpCbbdnkTYi3qy2HzxswPfls2fTsV8ls
uyLlqc3SNCY4AOmgUtkS5a/VVOAC//GPf9yx8HQcBmBHq1JbWhhPf/rTLUsNJyyYcVC+gIQi
pqzjcwAusvXY/JkLlQIJAMxYDYUFLAocF8fXbrJsPSQsSxAFANgpsLEvEDQAKJl9yDR8WK/a
0sQ9hsuZ4EXroJ8CortHZAWCjrlRU6dVocn++1lgWQKH9d75hudMQcgEERImILlN36NVh41U
CZGOSWr6ObpmOR937tw5kHDtB6gE86xrXm+veXI5NIn/oMouS8o09aDm2e01NzhHs0oYzxPr
A52WNIEILVF9j9hrldvQbc9BhUEnGg3jAWByI8+ZyXf6WjUZ/iAejn4E9vudhbok+Ug2Yj/T
yCYgEUg7lmmExCsD3jG+j8x3ySuMYriDk9/guGU5NJiUg+8WufGMs8U/+VxpFbbIVGlKZhbm
pVAuyvTcLtkMAVUwAgMTdcSp3gQ4vKK+TIMFJjEo2zB52cCZMR0CK1xHzAgkYw2yfVEKw31w
kcIdpunDdCwSghaE2WBg0m4taMrIvKV7NpuJR5cTYlcASk02AZYe9L6EW4sWKvot6gQdbIdk
KlyDrnPTiS9MkNAdNTRgatDU50eriMXvuh3dIDFU3hve82xd7nofSCYBLzOEM3tSQiCirhal
M/0s7V7CkJ9rwgUdCtDzg0Tt/D0BCXMdStxy+x/UAtwrwlZlZA8aMtDt+XTiD3+Pe4YOTbok
jQAMy5V0gLoOF00OkKRIzxPXCpRf3E/N6dwP9PT9g8Kt47IkAsH80fFsun27KQkHdAy1qwN1
A/UzdTqAH0ngLUlvljIANcTZx7azTuwtWqy+PR0jGCNPjggnZWy6IDeeda5sfc45MhuWxauO
y8x801I6tuOWVMYrUBcxo6SyBnVTmtUInLtMIiKgsRuM1qwJKixsB6EDyKxJ5A0qQWQK6jgR
uIBpnTBBgskhBBm4bq+55polGYJYaGwkrOMmOuMVC4sZvRQ0WHgQ5MjmZWITtgMzDDVrLk6Q
7euOLgRL3fqJ55QVEtpq6SaIWR5CQNaNivsJZM3gpK3fvZGhu9o5RWuUJCHactUUkytx92YT
dKi0dGP5QYiBcVzG0HE/kf3LJva99q8zqrMA0K8V16iHPj9eX79M3yyjEhVZ5kBAiWT9JxPm
6M2h+5pzVzf11j1jOZcBqMhX0G74YSxUneik5Q2VfW3td3OX7w9j9YCasU6zYLq++5lGadeZ
SJnbaZzXWt6xsYjrUqyWbJw1RKkEJkzkyoRTki31khyyvSjfOPVVIoiZNs21OOOysLsuTrkk
MZTv0JwrrFvswFmbjEwNXtA8de0bJi16X+o6MGqLtLrwOTh8Aaj4DMILgAyuUC5UfIY2U9oN
pmnTCJYoDtdJPBhIbAI4d1ugpIHDACCSX1WzLiFZCbFbCA4kOek2VxRO2fIaDar6fXbBd7Mw
tTuaAiObpUyw7pYJqQU4kz40uI8STLu5XntZYysZqDcmmGkBCK8D+6lScGsQpMWUVT54H7UF
o7PPSTxCJiAIaShTurkAr++nP/1phwWKli3BQMd4tXtRA+vetni6zb9syRbPm5Zpts9ttotO
FiypwDHsoUt1mHGsn5tWYFFux76nOoGK+6ICpckndGgEyjz2RYWeiheOx31xHuhQi/YM6TU2
aKiL61PfJyZGcc7q+vfscXivSXGo2ciy67tXCGGkFupG7WcaWwILxcqUWqDk+MV3ANOKYzS6
5k5z0mV7qAlvQjbtjuXI9qTccPJLpXziedIISuKPbxavVTZGd03ihd0JQ34JZxoI29OthV3C
SYS4J609xlEx+ZGkk60Z1G2isD3cd1x0WAy6CTQnO4RrNy2a+6O1q12cLHuA20cnEFEI6o4e
GHAZ0+rFYmTcB8lJJ5xwgnzjG9/oCBwkpuB8Qc3GRaDBdJDEpKyg7bWwBxHAKykSX+8D3g0K
JZaN4Lmg1hEkA5otizE4xjwp/LN0hHT7aS5iTQjA70g2wLnJ2l8MCG10i8GcILsTn792JTKk
wP1n46N7c2SbaxMIdNs53ZWFnhGdUawBgfcd8WRaq7plI+kSdQgE+wMFKb5nkhL7waL2G2V0
2iLW3gqWMuk1hn3fdddd1lXM1no6qxlrFC5pPj9+r3m1VzOYnKWTBHWzdYYHNMezpjvk/eT8
pVKmO+sMM19WB6hOyuW7gfuZxuIqMI1SYodIGp50SC5qsiDF0jZpheYh+FNSWojl4B2R3PDC
M+Wg098gc3PmfM0Cb7diqYcghjYL3NyX0F5tYPdpE5Ijd00AVddmYuJQm2e5C9ximuhea8xM
BMHERx9EZPWSpUbXiiIOyyze5Uik2ftQD+wfix6CUZdIZC1IDGiz6EKDTGMdW8NiRXcRnAcB
lQwrqMUjCb1eqMOUVfQiU8iWVexPYDmI2xfCF1ngSFrTnLxw66MDDGLqtMA1uTndqUzGYe0x
hRvnI4kFtOWp61LxGVy+ICNAn1LdyBoeFDSyh3dCZ4tqgZjt96qtq/UwAGTk5iVrke5FzLlM
a0vHYXmfSHyBpCDsi5Y96BOZBKSfB3i8Qc+J0Am7+nD9IzEQa5jKrCaiYA4EZQJb0IHQH/Xq
2B8zjalQoQsN5lA3BXVUHhrtntYKhM4w1lYqyfo5T3TbQlrhuqXhMOc72hjqButnSos06waO
bdJR6oaARlxAaUxdvLgq/lwom+eKcssLXyljzzlH5nYZC3Dr4bKj1bTXG5j/tFsNGZssywJO
0YA/6ltBxo/Mpyxr1GoHSQ8wyVFGwH6knER4D0BlbFS7M3TsFd8j/glAzXbDwLZIKhokoxGg
qy1MTmjUxOE8BklCQNYiGJfwO9YCgpwfJAPMIGa8DUxPgyTHDJLc0MtK7eXO7bWPbuCsk7E2
0sD9R3wagEohTwpI1P0iQQwCk94OTfbB+LbmaGVtIoWZZh7SViSVMgpIhCSgZLF0BJYr/gDo
ABR6RbQ13et+E1izbuq9MbLufqxXZi7r9ambtevMeB0nJeCBphPvWeLEe8fac8ZTaWXivp15
5plWSdUuetKMIpGJSrW+R1rR4TnyPiMpkJnDBFqcEwn3tXKta3FXO7RrV1OaguGNIQfKMs4v
tJVEYw8dgtDMY5oUZthWbmtCLLtx+pku8vOCAQnJSagxRWlMUuJqLKHCmLGUQ1tnWp4X+aWZ
qnzztHPEed6rZaFZkLGpg2QeibtmHVewKCIz+cd8I3DmpWAs1SgwtmpkFkNkbnXsj7RdnI7h
YQJAS6S1iYWDiQFBSLcX40y6U4NenCgCZzcPJi7QLYuSlEHjuegWg5pS7IuAiFKXQYXXYx/7
2A6ZuGZeAdE+43lc8BC0LOeggB72Hi4Hpsul7fcDS97rjWzV4n4fc8wxtvH0VVddtcQ9C68D
YvZoig1XPy1CavyaHpCJRHhuWvAxRkeQpTVFJZHPEwxYbOZAwKB1C68FlC0ACpVDLRQZnx2U
f3lvu4Fxn6AwwgNDlzWTr7QioutW+T2ajZPNilzYrNNF7oRWIPR9B3EL2cl0eQvuJcheEJvO
clzrWlbKELyCmpRzQyca4lmTL1wrFJoXebVuXy3/tEKL5CpkM7/hDW/ozClcL8794osvthSO
kCOQc7yubNKibmQxCJiuHlBT1qMN28/UzhcviQFHCQNSOz0MSmMsp2+zLWPepPgzTTm0PiHf
POnlUn72q4ySUJbK5EEyB+LhYF4q1YrM1w3iFn1boOqBhadltCc0Eojhp48sRWN7hFpMNhsQ
afJswWWd42aykBA/W3OpO1FodweyfSEkyQaDxQ53GybooBo4LBYIYt378fbbb18ijJcbOC4m
Pdq6UTtndw1dHM82YlxQK2nn1AtIdfJKLwGcBVsNsL2SKjYiuDIxDOVQuoyI8WvULcNdiOQh
KFC6Mw5j8bojDV4xH0AtCYYsLfDZToyuWrqL8axhOQFQaTljbiPMAdcvtoUSp0FEWxvknea8
xDkh5wBAhvk+SDOFtYij4rjgrIYlB08AruHoo4+2gEhFhIQTuosOrh9ud3hz8BnuL5OScI0k
x+d60+545jqgRA0UhbQsufag0KJcDaCbrUnNrt33vve9cv7553fkDUEI14juONoVr/v6jsrt
q7v16Pg7js9kNtYw497g+pH4ePzxx3d6P1N+UOHSSZbdMsf3kst3I/YzdSztoGfpBiPLhAQG
JEvaAHA1f4UolvvEJRm7N5RbXvwycU48V3x3s4wXt8rs7qZMlSsyU6tLvWzM8MkSgiI28yqM
kHhlLCybORVKw48sRWEjsbVHPuDioDaJBAHU6GGhYHFq0M2m33OhcrJDoyRnL7uKIA4y6MDE
RkyF7l4OMLnAkhmUuxOLWtPesVsNsxjxGYQGW7Bx4ZIAfFgNtxeg9rNWD5QBoIK347zzzlvS
uxIDQHvddddZwIMSBNc+XP+kycOzQ+IKQhLwVEDQIlMbA3MLZCF0OWYFNt3GGI973ONsghuO
QYo9CnKAM84BhPFIVAJgMBmGwIo1AeITZIpjeyRW4XiY86TaHNbdmM0iH3ZgriL2iAFr88tf
/rK9LhA1wIrCWsb1kUkKZCtQRq6++mobU8Yx9bPAPQdQAJyZqKNbpmlyCjSzQJIflFeypDGZ
B88F9xnZ9cj8JdMazgHt7q6//nrrHsZ9JLBhbTJ3AwoYvEd8dmvZao3XhWPRE4c5B5YoTZlK
zwbWMOYILFicIyxXGAzsjIOWhahMwD144AMfOGwMFdpSYMtEFCRKpxBGdZpZ6tZldm1ou8Zs
xH6mTocQIiG6d5ykatYyIME1FBXk8KgiE7s8ufnM18jYs8+RRmA03LEJmZk3WrRnLGhjwTpm
wsfw+dYXzOquJjerxXIGJ7lLTtIiLlyDCYWJBCuBwXSSO2ACI6EjGztivEBnxjHGikXMGBVA
C++xQAcd2B7HpEVMty+EDxatPp/lrgcTGZMewppaqCawwHEAuswopatnEDBdri6xm9BcbdLE
RrVMswOACVAkyYKOWeJ5A+xg9VCo0jKi65exNQwm4CBuj33SA6KtMA4dV3zBC15gQxtvfvOb
O4KcVhiOg25DcEHyM8Zns+VRunfvM57xDLt+9oaFmo2jAhxxvhD8pDTEOaPmm+VqjEPrkhmt
gDBejevEmkUyUpYljFY5nwMtsDe+8Y1WyYHLFsdijgL2hZg14rPagtUt2HhPeSyWrYAq9LWv
fW0nv0M3KtfK76jiqNyPLp3Cv6HYoTPPSSed1JmndJXjPoASFcQluGadPU0X8A033NAB1EGH
uXMtZN7Y/p8Om4m7afZrnMRBo2zrNQCspR002gAIATdoP1O7r1Zd4rJ5EGarOKxblyyycSvu
pEw1K3LQjqLcfNI5Mn7C+RI1jcVZnTDAb4S4sZyLriM1Y4q6AMrYT/STZnqCtoAI1q55wHFg
LrONtGYpjmhR8uEzRgmtkfEo7WaBtchts9o/LVQsQiwmxliQEIQWbfgMNaHDDExYWAaMpTBG
g32jryWsgUEoATHgBsNCZ+yNNHj4PTRL1tOtxH3UDVC7gZ4WxHT/ZhmidDsqegFoTXMh6zjY
qIWzBjVdi4jnx+9GIbxI+AGNHsJIJwDhmCxj4meYi+wlqht8c3uWeKD8BZZlP2WIwhmJc/e/
//1tKIJ0dyzXoeuOyXmMr+vj6hget4MygGzmYUB1pfdU/wa1myz90BYU762uzeXz1tmrOhYN
9y8UDSTc6HOkB4rXRlc87xNAE8oS3N8EPnqndMY+rWRdA66BCK/oRAWXKuaCZhTj0LJJt33L
0qUOyvHbi6mM54TaeVjaF1xwQefZMxOZ/WZ5v5mkyaYZJMcZVH6kFmrciUd2d4oShhKqQEfR
/LlgMQrMSfobt58pwBT9TGdb25P4Zxv9TMdlbMaTI8NNctOpL5biiedJ2KoYAbVZmojr1BbM
dc9JwygOXslPrM/0fL3I7xzPAjuA2g1sI3aYvqN2ejCDD+UDqDfVBfgguB9kYPLTLYSBelNq
x3DHDTMILhBOsBa4WPAZ0tUH7YOI8bCHPcz+XncYoZUDDX6QFm1rMTQ1oe7SgXsISwMLlxYE
Y706FX+U8TrcA81/y5gbzoFsODq5ZzUD+wD4wO0LKkhwQGPfFLqMUeK4AF0mKelSLiqBtCyR
7AR38qBueoIAaCrh0kOyks4DoGVMq4OWdJbcQXc+gtWLeT7sPcrOvWEAVjNnscuNPledzct5
zvvPuUQrEfMLrQxxHXDNaqKLfueDOYPfwJ2P8iNYrFTKWXeqCWAwrzWZAu89tsU5AJjx7Hs1
O+imXOB4mkifsfNRKZyIkSOBDj1kNQAzAVOTjWB73GO42n/yk58MDei+gGc37WcaO4vu0sR1
GluyBtAJ2iZttq1ZChxIvDGI4Xpb7W82aj9TWJGzBt6LxS222XmlMCmV3a4cdacnN5x5loyd
8TpZQFh3ompAtyWlZiRlA6KNqtm5dUdHIvHeF+j6PRYcABUuVWqeeNCDuCu6aa9HHnmkXVCI
yyJuNSzAAwABhpiwupcp3Fv4jm5baMDUwrU2TfczC8658Gh5QZggC3GtYjK9rImsNautVZIQ
4HzphmPWMWJi+IwAN0qmJNZyMnGFFHIENk2eMIrQAkszAIKIRyIhCMoTE2B4TGj3vGb2x6WQ
xPdIvoFLH0Kc9Y2DgBETUKAEwuWPmCJij/Bm4DvWdOrepwQlbf1gG7iu4e591KMe1UmyGqaM
ZjVxQc6BU045xd7LW265xbommZGP68O8wX3DvOKaINjS8kdeAsgYcA3ZeaqZg/opwUgkRBY9
iFWQ+KU5tXU7xm5hDIAo/lCmQ1DSCmU/QNJZwTwfljUNAsj9FE64ftFkA3FyJF1SweR6pFdJ
ewYwV0Emw4SrXvJX31+rXFhAteT0XYr1bc9Sx4IpLK0wTkpWEC8Fxy2yV2sIG45t1H6mxkJt
ztlkoVZgNOhoTKozIlt2l+WG08+RrSe8SnbuCmV862EyD8onkOWb+9BAzenmqpEwLVnSu24v
gykFKiYEGntjIQxL36VLFhhTxWJGlh8WxSB9RbMLBMIcBeIgaNCuLHxOwQwhQSGqC6upXeOc
oCVqlhZa08gozfZiXQ1QDrudtlBZq0eNXLMDURDRUtB0kKMcABGSLmjwy3YOWa0CouNP2Ceo
IBESQLNruC7xB0pCuPwozPCcEE9D7BzJLRDceMW5sSQL84w1l4MoEAQXnAuE5VlnnWWTcJC1
i7ACamMRlyT44BWlXBDYKA3Db3AedEsyu3hY9+0oEm2wD7BRwYUNywj0f6iTRFzzpptusglc
jAXjfsIKxL2EF+mXfumX7DV0I2zpZkH3kiN8nniFkoIyKbjTQe2IxhRQ1j/72c92CCCQIQtF
G6EdKM5QwHGfSbJAi3PQ9oaUPZonW7u2VysveW0AR8wTzNGvfe1rNimJRgDOF5YsatrxLLCm
sgbJIJ2NfFsoilCq42aqOgGcABAnpRM0F8mkGoAShIT5X6nobuh+pnEpad5b9adkfLcnD59O
+pn6p7xadrYKMjW2zVjanvjmR4UyyO7b5gmYe1aftXFeaYYi4sq+HJh8mABYkAAtMoJojt9+
cSnGmjhpwD600qEbQjPjjnVyOslEL56sG42f83yYeYw/JElpqrm1HJrXN/vKxUq3Ff5NRYGf
a6DQHWxGnfVIy4DKiabvW0l9br/4tmbNgZCF9o+ENnwOMMO1Mb6vO8TQAmM8kwQNw8x1egYo
vNlJCSVUEPAAWGTA0uqgsGeskgodXb50TetyiUHvxWqTzTj3cR1Yu3Clw5UN8Iflj0x23e4t
+8xXGhfP/i5bLw2QB1DCYuWa1omMVCrp8tdUo8OEdahgZsF/0Ab2/a6f+6fihmtiwiO74Ohj
Zgki+oHpHlSSSTKvuwgK6fklXWPi1PFrc2JtPi9drbGTMOnaes2N3M+01ZZN7rgUdoZyeM2A
6Ulny6bnvEJm21WpbNomC/NtabdqUp1IXARSTHOhwevbau9VMO32UKmBU2BQiOuGvv0EMYUb
hdVKYnzU8GkV6d/T/aNr0LJJE3T98PcUbhTGtFChHWNBdNvXWrt8u4EqLU8CRzb5iAuUcWQq
B6PQvnuBKo/J/rearm7U94bWHWN/BHC61ag0YO1wXvBchgFSPd8517tZYPSCaKYbhiFIFEIX
qo4NDuu56OUByvK/DmP9a5c0nyVd5bpHsAbBUT5XbSHqcAYVRN1VSrtrdQcrDcyDuvAJyPp3
TIoaxTVRPlJBxx/rU7PsSFRKtcW8nCzeIykp7tiki2QJdpuURjB0VJ1e0u00BTHPbhz6xrpz
NnA/07gsBweb5LB7IrnhjHPEOfVV0vS3Jv1M5+pSHANw1qXWdqRaMaC6MGctVKdlJhxydnHz
96F1SmBh/ZV24WZJrpfTkDl5KQiHBVWCcdbVpDN0SRPGhuQsd+Hv6TLl71HrxqbiAAdsA+tD
Z+Wt9chq7llQ5fckNKCFqDvhMKbHxcxnRQttFIPMUZqfme3s1pruMNvdpxugEOi0lbuSMYz1
k3WLZ0FT080Nu39aJmsVx+d5LRcDX6vnSg+Krg6gBa+PrTOCed+wfqlQDmJlMkSUJfGn0jlM
P9Z+x2GCHN4zCY4hESqGPJ/ljJhlY6iRii+6qdmH14TPNvk0chYt08W+pq61WVFq0pCN2s+0
IIdGYzI+7csNZ50n2577ctkVlMWx/Uxb5m4VjBFqBOOYmdBRYMB0QcqVMYnMjXFbifbSpvKx
j4Z2p1EgUKMcRDjoom8N0MOWD2QZRqit6kbe2mVEa0ZTC5JInUw6bBdH1hxsA9ciF8be4sZd
jqqO91o3IGeSAxer7rzC7wZp3rwS5UrHjPKxtopsLyt1f7k2vb7oGchaydkyMp3cOIg7XFOg
ZsMso1ofWibpMJI2PqjkUhEe1EuoXb4WUO2p6/ITyicLno4FP3RRccBeZL6rtVPvrpPUi1Z9
lJ1szH6mU42kn+nNp54t3snnyEyzLBVvMulnWjKWqW+siqCNtGCkNZs/Y3kEkeXl9cKUEAHo
vMaAuly/S23h6e0G1bSz7c50rG+YxB1um42PZhtJ604ZOmVdW6iog0XGoebURJwOiRJs5UVA
XSlwLNcxp9f2g2ToZltbZT9fa6u6m9WVj7X1YOyvQ68HrrNuc6sbkbwmnl+L81mJByWby8Br
0ueZlSf9+p9mn3+qikRpL1NZ0g0lREyoCVPPFbQmrYVpP1MDyiXcVwNMvrFQpbkx+5k+AP1M
T3qZrTNtGYAsj2+WgrFQ43rNSPG5JF5aSmOmcYKpCba6NomLZUb5WN41RutSl03oukBQfSHG
hexMZIxqdxKJ+lFCgA4Z3M+ghd/5yEc+8rHXrHtnCSAtoqnNlEV5TClhMKo3RKrlpJ8p+A8s
5rdqMukE4mzgfqbbTv8jmZ8zAn5yTBqt0LJGlSvGEgXjUtTugCl84765KV6EOLIjdS/lZMzH
sha1Ts7RFGW0okkdyLo6cm8yTsrel+i9edRRRy1puLzSeFo+8pGPfKwJoCYmg3aZOkvMVGCi
7WdaBvF4WwpjBQHBkR/My+aCAZzaTrljg/YzrT73HJndFcjU1iNkpmVUhSiUthtK2G7K2HhV
Fuotq1l48SKYoubVJj75YXLfoig3U7sAaedppOCpG/YyvsrSEtKO0ZLVMUbsE4ThJJjQYLyv
mJLykY985KMroPbFAmMEwO0bFFwZM2DabDUkMmBadZritKflhy/ZuP1Ma82SVDdvkxrcuO0k
U7LumDceCL3nzL+racxUOmAKOsG2G6Xdb6KMwpCDaXYw2M+YJ3lErbKWlo6QuQbbwLXLpsug
uEMsFXzEuowga/3mIx/5yMf6sVDTrjKIZyZuUsY1I5se65USZiSJW+KGBkzjmoyZv9tOfaLc
D9y8hQ3czxTEDK15WxIzh9gp4r6gVayUjfIQmn0Ukpgp7o2xTAGmoRdYnmJ2rdmXxA5rmeW6
mqJ1/pYAyFKSLIk8gJOZxoyxvv71r7dto1CEzZipBtJRMf/kIx/5yMdIAbUvXbuT9O9ErLVk
rLcxty0HlWK57RnHyYMvfo8soJ9psDH7me6aa8q4sULnF3ZJreQk/UxrszbzKgpjc70lcQLP
7svGTL3UzWvA1Iua1nI1W0mQz6OeQEyQZD0prVaWvsA6BeUX6OjAEANKOFDDaRYY9jpkqQ2Z
l/IYaj7ykY91BageCZEyw40SKsIYbT4NgKD12oS7IFFru9x28jPl6A+9W2Zlu+wKZ1fcz9TS
BsboyhLvaXj2xvclG9rz7/QzDTP9TD05PBrbo5+pNzYhu+eMQHaNUDcWrBjr1CBn2s90HL3p
7HVHYNcQ0i3Gys2bZPvCAgaYep1sYze9voRogmccZVioDhQwtf4DVaCetaqzjEOMm2peYfLh
MvUdVimSlnShfj7ykY98rAtAtWjRjg04pElI6NsJZr2wkGTyGiNgzMDKuAGbre603Hzyo+Wh
H3iX1Cs7ZN4xAAsGohX2M016sMZpu7XFkwqXAR4vXoqoQXtBfDDugGQ/bJpLiWx7tqo7KZs7
/UzPlYkT0IKtLIXypMwutG39bMH2Mw3T04IVXUq5eZN/h4BJWNCd9jtR8pfY6wmpgyRNBMgc
0dEN4OJ2Ufua0Dom2cjuSPKXNGj1c/mulmt02P3vQcXVJc6Z/SzLsKTrPTV1GMegrb7ykY98
5GNQWdZNri1H6tJV3lk+WgMGZfC/tsA3WpGWINaVdHKJmuZHyHqNZw0wPUYecvE7Zd6dkVkj
75oVV1op2OzZgm0RPHt9HiBq6yyCJIE07maOph8GSwmRDJgWbT/TmdaMSKFoTcYpb0LGZn05
MpiSm049U4onnWcs0aSfacsDFdy81JqgPUT9j9+hWewAIetw3RRAdamsTYB2O3SD0EjizPV1
ADi9BsSnQyef0PtiYeQjH/nIxyhkzkDMT5apoejLrtl58e5zuHVc+gZ0rAvToOm2qCiF+k65
/SVPlSM++A75+cS8tKpINkoqPGVJHeiwZ5kS2juDbZvB1gRgzZ+Bd4OlW6RtzrdSOEjKcyIP
uNOTG898sVTO+D3ryS1MTMp0K7DZwIVSUdq2n2m4BOQ1CA70ClczOQ2dxAJNroWo73auMR85
mOYjH/nYv0EVqZdW8G/btEVu37Ug5c1wp7XEjxbkYN+Ryty98v3TnyQPufRtUt80I+2yGDBF
oonXAZV9NxAsrdtC2XbYNOdclYoxVLfOVuXG08+WLc8/V6Z3hVLdepjUGknqEOzJNmpObT/T
QFXvuKk7d4jXPSxvdxFtrSWbWL62b2saq/b2w0mWg2k+8pGPHFQBqJUC0i6lOd+SytZJCYOm
uK1dcrCBnsnWbvn2i58pD77gTTJd2C4Nr5G0YIsNIDlJHMsmGK0SVGknDlpCo73Lno++hpGM
+VtkYt6Vh++YkC+e/hrxTzrfWKQF2TK2ReIaOpxEUiyXpIl+pgWjFczPo8WK4HJQY6prWod5
TUp/6AJOSCCshxidetwEQAvITE2BO6+czIE0H/nIx8aXR92A1bdYWPDE9RwJ40BckDYYwByL
DJie9mR5yIXvkAV/pzhbIqkbyxTJP+J4lkKp4lUMwAYpwNH1O/irZTNC2YuDFmiuLXuJneV/
58TJq5fWtSb9TCelsDOQwxY2yxdPPjfpZxpUbD/TufmmAdMFGR+vyjz6mSLTChYmyO+RgBQX
ZJH/d7jXpVaqswfq26Qr26g9SWPKOSByMM1HPvKx/8qmpMF4uSJh0VimxnyajELZUozku895
tDzg8vdKbTyQe0JjmbanxS9UjTVrUMEtypTny3yzZq09S6bAZJ5hX0W9DmARxun2oS25sc5U
2RZNyOHbI7nxRehnerY0Ya2Wp2RuriH+uLFCZ+oyDx7fakEatXnw4IHuyPzSs5YlGJZseYwj
Q792rqPTUCA5SxJYgBAjYkccL8rjqfnIRz7ysZ8OH/WWMjcrhXbdWKah+OEu+eGpT5L7XPF+
mZV7pQaqvYTXT4LQAKg3IQW3YDBqVg6ubJYdcUsWk3C8lb/KEK9IBDLIVAx8OcT2M3Xlxhef
L1ue93KZjorilCoyt7Bgs3gDA6QyDg7hljTqNfHRPNbyB7KVWLi6DFyCqeN2MoJtba2wZjUw
YBomGcPmDxHrUj7v8pGPfORj/wNUK909VzbXW3LoeFtuP+UYKX/gLTJThlVXN+CZ8OLGzqSE
cdEYZI7tKeqUxwx4gdS8sEgruEI8QtwxC2odSy4t+o9rNSmPT0ij1bT94/xCUQ6SCTlohyc3
n/Jy8U99tcy3SjLhlqU2Ny9e2VxYMZawWU9oAkEXiAbQ7YbtZVoKEpadlhcaLEwjoOlBB391
0vrSxZP2rFvXEhVaMAWINg2YB/D7lhxpr8K9oJv2rqb+tFs/1VGPfvWp+chHPvKxXsdK5ZXf
sp7Jttyv0ZTPHP98OfoD75TIgOk9c7tlcsxYews1A0C+EZAFY9QVzZ9n8LNtbMUg4fxF9xUn
oQCMnWioVwCPH6W0hPHia+QsxkyLXlFcGKZOSdozLXHjkjE8y8Y6LUplVyA3P+9VcvCJ50qt
5Uu1XJVq2xe/UZPdzQVxi56UCg6KWZK2blFsAQ9kEk6UdKUpR6GNC5NXeKhXy4EcpzzIiWJQ
SHlmEzdvaDmNJ82/J9zElF0prKwV8OUjH/nIRz5GZaECt+pNec9Tni6vuOTd0mo05N47G3JQ
KRCv5sh4c7MBD1/aLjqtFCSOxhKaPm938hr7llrPTYFwmFcAptsFUGN38d+NGppJF2RhriZb
t0yZ82vbJja+48uVp79Sfvm5Z0u4I5QtE640d88ZgGxI1WDPNgOSbbOtY0DVBdl9nPAHuxGU
g1CaxjINzHF8ZP06KwTUNPZrdZKUjB/ZvDgeXLz48ytFA/7mGHdP27Tflbh7ezEjkbJvWPAd
1ModtcWaW6n5yEc+9mtAtSKu3RSZmZf3P/80kWLdmG0wqdIt4NUNZbHeI0jZbX1ZfZOVHjzC
PaBfrL9UZ8oWPLntnReZc94iggQpzWhkvrM1tm7KggTgRh2LAVSBtVgsJNtHrbSudCV+AVnC
rCSLdMWJ7zfp+5bEV41iIM1ISs3E9TvsYO9Q/uHfWeDsBqTL0RTubZDbF0Cej3zkIx97DVAL
BlBqC/NS94oSh4Fs9Y31FixIzS916BuSBmWeJFU2iVFbkKbBj9Bs466qGsTpgbP6+2Qbawd3
to/A3Wv+VbFMw4tpS63094ER3uVUcPN7J43VIg+rnm5XXKVeoM/Vk0U9I0zxv5YeAx17SnH6
4QqAqFfzbnLeDuISXi9WYm6t5iMf+dgfx/8D0BCt6cOLHHIAAAAASUVORK5CYII=</binary>
 <binary id="cover.jpg" content-type="image/jpeg">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
p/z1r39NT0//7LPPDh061GHm/v37u7q6Ukpt96dHo70iWH369PHz87OdEh4eXlxcPGzYsKFD
h8pTRFHkOC4hIaGgoODzzz9PSUm5dQYo3bJlCwCMGDHi/Pnzubm5kydPTk1NpZSmpaXZXkid
TvfRRx8dP358/PjxL7/88o4dO+QQ24qKiuJ5/tSpU0aj0d7ePisrq6KiYuzYsSqVSp7hyJEj
lZWVXl5e27dvB4DQ0FDrsjt37lyyZElSUlLnYK1cuXLo0KEWi2XQoEE1NTXdfb7vSW8IVmfP
PPPM3r17J06c+Otf/5rn+czMzAkTJqxcufL555/fsWPHsmXLduzYcfPmTZPJNGrUqMzMzJiY
mKVLl/I87+bmduDAgeXLl+fl5eXm5nYuacaMGTNgwIC9e/devHjRNhay/v37T548+csvv4yL
i/P29j516pRKpXrllVesESwpKYmMjPT19c3Ozvb09Jw9e7Z12djY2LfffrtzWH+m+OTkZLnW
/zmqqKhwcnKaNm2ak5OT7fSAgID4+Pja2tqioqKGhobIyMg5c+Z4eHjodLqpU6cKglBVVXXt
2jUACA4OXrBgwbp161xcXFQq1bBhwyorK8+fPx8TEzN//nxRFKdNm6ZUKktLS4ODgx9++GFB
EFxcXAwGQ1BQUP/+/QGguLg4KCho4sSJHMcRQh566CFHR8fq6mqDwRAbG/v+++/Hx8cDQFlZ
WVpa2qxZsx566KHS0tK4uLgNGzYEBgYCwLfffgsA7733Xp8+feSPkiRNmTLFzc1NLp+mTp2q
0+kAoLS01NfXd9KkSQqFoqioKCwsTL7n7e7r0NGegyd/3neFP5r1rtBsNt+fLcp3hfJNa6/3
1MupPS7sqHfonW2s7yUIwh//+EeVSmV7X8ZUSEhIamqq3Nn2S0Dy8/Nve+eM0I/29LK3sSpE
DOCjyYgFfMUesYLBQkxgsBATGCzEBAYLsYB/2wxiA4N1NwaD4caNGz968aampv3792dnZ9M7
vFXRi2Gw7igjI2PevHnjxo1bu3btj1tDUVFRaWnpU089tXfv3u4+mvuK/twfm2HKy8tr+vTp
HMdlZmYOGTLkhRde2LJli5eX11dffeXo6Jibm3vmzBm9Xr9s2bIvvvgiKChIpVKlpKS4u7vb
2dk9//zzfn5+kZGRMTExFy5cAADrI4e/BLsPnviFDkLfC4PBsHDhwmPHjm3YsEHOyu7duzdv
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
</binary>
</FictionBook>
