<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1010438963955161789</id><updated>2012-02-16T19:25:35.329-08:00</updated><title type='text'>SGerr's blog. SMSInside</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-7305064099304145636</id><published>2007-07-09T10:27:00.000-07:00</published><updated>2007-07-09T10:39:22.866-07:00</updated><title type='text'>README</title><content type='html'>Собственно, вот и оБубликовал. Процесс занял примерно 3 часа чистого времени, с правкой, постингом картинок, etc. Заодним вспомнил о существовании UUE. Надеюсь, оцените.&lt;br /&gt;Читать следует "с конца-в-начало", чтобы слвсем "по-блоггерски" получилось.&lt;br /&gt;Что сказать... I got a fun!... чего и Вам желаю. Будут комментарии -- не стесняйтесь!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-7305064099304145636?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/7305064099304145636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=7305064099304145636' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/7305064099304145636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/7305064099304145636'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/readme.html' title='README'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-2234130471676368752</id><published>2007-07-09T10:18:00.000-07:00</published><updated>2007-12-28T04:42:07.753-08:00</updated><title type='text'>Выше, дальше, сильнее.</title><content type='html'>&lt;h2&gt;Это все про SMS?&lt;/h2&gt; &lt;p align="justify"&gt; Предыдущую статью следует считать некоей точкой в повествовании об SMS. Была еще мысль сделать -- небольшой на пару статей -- обзор остальных протоколов, но потом я от нее отказался по двум причинам. Во-первых, такой обзор получиться бы мог весьма скомканным. А во-вторых, работа с различными протоколами, _по_сути_, одинакова (бес, как известно, в деталях :). Думается, что ознакомившись с предыдущими статьями, читатель сможет построить клиента, способного отсылать и принимать _текстовые_ короткие сообщения по спецификациям любого протокола. Что же дальше? Хороший вопрос, и не менее хороший ответ: а, собственно, дальше и начнется рассмотрение технологий используемых в _современных_ сервисах. Я имею ввиду технологии EMS/MMS, принимающие статус отраслевых стандартов,  и корпоративные технологии доставки rich media контента на мобильные устройства, то есть то что относится к так называемым сетям 2.5G.  Но сначала, для того, чтобы "закруглить тему" поговорим еще немного о тексте.  &lt;/p&gt; &lt;h2&gt;Кодировка.&lt;/h2&gt; &lt;p align="justify"&gt; Часто (точнее -- всегда) недостаточно передавать только латинский текст, да и передача собственно "иностранных" сообщений, содержащих специальные символы требует некоторых дополнительных усилий. Таким образом вполне закономерно теперь поговорить о кодировке текста в сообщениях. &lt;/p&gt; &lt;p align="justify"&gt; Видимо не секрет для читателей, уже разбиравшихся с протоколами SMS, что в  мобильной сети сообщения большей частью передаются в так называемой  кодировке GSM. Это семибитная кодировка -- каждый передаваемый символ предатавляется 7-ю старшими битами октета, младший бит относится уже к следующему символу. В следующем октете "отсекаются" уже два бита, и так далее, до тех пор, пока на 8-м октете символы опять не выровняются на границе. Не Бог весть какое сжатие, но позволяет сэкономить каждый восьмой октет, или, другими словами, впихнуть в 140 октетов пресловутые 160 символов. Приведем таблицу кодировки GSM (в сравнении с IA5): &lt;/p&gt; &lt;hr noshade="noshade"&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_vrrdow9KgWQ/RpJvYxw-kaI/AAAAAAAAABg/IM25D_mbOxQ/s1600-h/gsm_coding.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_vrrdow9KgWQ/RpJvYxw-kaI/AAAAAAAAABg/IM25D_mbOxQ/s320/gsm_coding.gif" alt="" id="BLOGGER_PHOTO_ID_5085249400721019298" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Кодировка GSM.&lt;/b&gt; &lt;hr noshade="noshade"&gt; &lt;p align="justify"&gt; Выбор кодировки осуществляется полем &lt;i&gt;data_coding&lt;/i&gt; в &lt;b&gt;submit_sm&lt;/b&gt;, о котором писано уже парой статей выше. Таким образом, при выборе кодировки 0x0, (SMSC default alphabet) можно надеятся, что центр воспримет текст сообщения именно в стандартной кодировке GSM. &lt;/p&gt; &lt;p align="justify"&gt; Вообще говоря кодировке сообщений посвящен документ GSM 03.38, в котором возможные значания параметра data_coding (DCS -- data coding scheme) рассмотрены весьма подробно. Посмотрим и мы на них, так как этим параметром регулируется еще одна вещь: так называемый &lt;i&gt;класс сообщения&lt;/i&gt;. &lt;/p&gt; &lt;h2&gt;Класс сообщения.&lt;/h2&gt; &lt;p align="justify"&gt; Класс сообщения является своего рода "указанием" для принимающей стороны (SME, или мобильного терминала), как с этим сообщением поступить (в основном это, разумеется, относится к Mobile Terminated -- MT -- "предназначенным для мобильного устройства" сообщениям). Приняв сообщение, устройство может поступить с ним следующим образом:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Немедленно отобразить. (Class 0)&lt;/li&gt;&lt;li&gt;Записать в память устройства. (Class 1)&lt;/li&gt;&lt;li&gt;Записать в память SIM-карты. (Class 2)&lt;/li&gt;&lt;li&gt;Передать на терминальное устройство. (Class 3)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Сообщения класса 3 описаны в GSM TS 07.05 и здесь мы не будем на них останавливаться. С остальными классами, надеюсь, все ясно без комментариев. Можно только добавить, что сообщения 0-го класса называются также "Flash messages" и могут быть потеряны сразу же после прочтения.  &lt;h2&gt;Спецификация DCS.&lt;/h2&gt; &lt;p align="justify"&gt; А теперь приведем, наконец, описание DCS из GSM 03.38. &lt;/p&gt;&lt;hr noshade="noshade"&gt; &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Биты 7..4 (Coding Group Bits) &lt;/th&gt; &lt;th&gt;Значение битов 3..0 &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;00xx &lt;/td&gt; &lt;td&gt; &lt;p&gt; Если бит 5 не установлен, то текст считается не сжатым, в противном случае используется стандартное сжатие GSM (в GSM 03.38 не описано). &lt;/p&gt;  Если бит 4 не установлен, считается, что биты 1 и 0 не несут смысловой нагрузки и зарезервированы, в противном случае биты 1 и 0 указывают на класс сообщения: &lt;table noshade="" align="justify" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Бит 1 &lt;/th&gt; &lt;th&gt;Бит 0 &lt;/th&gt; &lt;th&gt;Значение &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;Class 0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Class 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;Class 2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Class 3&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Биты 3 и 2 указывают на алфавит: &lt;table noshade="" align="justify" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Бит 3 &lt;/th&gt; &lt;th&gt;Бит 2 &lt;/th&gt; &lt;th&gt;Значение &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;Default alphabet (7 bit)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;8 bit&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;UCS 2 (16 bit) -- Unicode&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Зарезервировано&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Частный случай DCS = 0x0 -- 0000 0000(bin) -- означает Default alphabet с неуказанным классом. &lt;/b&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0100..1011 &lt;/td&gt; &lt;td&gt;Зарезервировано &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1100,1101,1110 &lt;/td&gt; &lt;td&gt;Эти группы используются, когда, наряду с передачей текста, пользователя необходимо уведомить о том, что на его адрес получены сообщения других типов (Message Waiting Indication group), напрмер сообщения Voice Mail, FAX, E-Mail или сообщение другого типа. Аппарат может уведомить пользователя с помощью иконки  на экране (индикатора) или другим способом. При этом: &lt;ul&gt;&lt;li&gt;&lt;b&gt;Группа 1100&lt;/b&gt; предписывает аппарату просто изменить состояние индикатора, не сохраняя при этом собственно текст SM&lt;/li&gt;&lt;li&gt;&lt;b&gt;Группа 1101&lt;/b&gt; предписывает изменить состояние индикатора и сохранить текст SM. Текст имеет кодировку Default alphabet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Группа 1101&lt;/b&gt; предписывает изменить состояние индикатора и сохранить текст SM. Текст имеет кодировку UCS2 -- Unicode.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Бит 3 при этом может принимать значения: &lt;ul&gt;&lt;li&gt;&lt;b&gt;0&lt;/b&gt; - отключить индикатор&lt;/li&gt;&lt;li&gt;&lt;b&gt;1&lt;/b&gt; - включить индикатор&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Биты 1 и 0 указывают на тип ожидающего сообщения: &lt;table noshade="" align="justify" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Бит 1 &lt;/th&gt; &lt;th&gt;Бит 0 &lt;/th&gt; &lt;th&gt;Значение &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;Voice Mail&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;FAX&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;E-Mail&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Другое&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1111 &lt;/td&gt; &lt;td&gt; Бит 3 не используется и устанавливается в 0.&lt;br /&gt;Бит 2 указывает кодировку и может принимать значения: &lt;ul&gt;&lt;li&gt;&lt;b&gt;0&lt;/b&gt; - Default alphabet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;1&lt;/b&gt; - 8 bit.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Биты 1 и 0 указывают на класс сообщения. &lt;table noshade="" align="justify" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Бит 1 &lt;/th&gt; &lt;th&gt;Бит 0 &lt;/th&gt; &lt;th&gt;Значение &lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;Class 0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Class 1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;Class 2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Class 3&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;hr noshade="noshade"&gt; Принимая во внимание вышесказанное приведем примеры: для передачи Flash сообщения, содержащего русское "Привет от Иванова!" нужно использовать DCS = 0x18, а для передачи двоичных данных (напрмер -- тех же картинок и мелодий) используется DCS=0xF5.   &lt;h2&gt;Заключение.&lt;/h2&gt; &lt;p align="justify"&gt; Вот мы и подошли вплотную к передаче rich media. Следующая статья будет посвящена передаче мелодий, логотипов, графики (точнее, с нее начнется обсуждение этих вопросов). Это еще не совсем 2.5G, но уже и не просто текст. Оставайтесь с нами! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-2234130471676368752?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/2234130471676368752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=2234130471676368752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/2234130471676368752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/2234130471676368752'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/blog-post_09.html' title='Выше, дальше, сильнее.'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_vrrdow9KgWQ/RpJvYxw-kaI/AAAAAAAAABg/IM25D_mbOxQ/s72-c/gsm_coding.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-3221256236588343732</id><published>2007-07-09T10:06:00.000-07:00</published><updated>2007-07-09T10:17:10.481-07:00</updated><title type='text'>SMS-приложение. Часть 5. "Разбор полетов"</title><content type='html'>&lt;h2&gt;Вопросы наших читателей.&lt;/h2&gt; &lt;p align="justify"&gt; Меня вот спросили: "А почему это Вы себя во множественном числе именуете?". Отвечаю: это не то что вы подумали (хотя, может и стоит у психоаналитика проконсультироваться на предмет мании величия ;), а издержки опыта "научнописания". В статьях считается хорошим тоном писать во множественном числе, имея ввиду коллектив авторов. Так и тут, предполагалось, что данный цикл я буду вести не в одиночку, посему и задан такой "околонаучный" тон. Однако так выходит, что заниматься этим мне приходится в "единственном числе", посему, принимая во внимание данное замечание, в дальнейшем обязуюсь повествовать от собственного лица (другого не имею :) пока-таки не появятся помощники. &lt;/p&gt;  &lt;h2&gt;Что же такое ESME?&lt;/h2&gt; &lt;p align="justify"&gt; В данной статье мы (&lt;b&gt;с Вами&lt;/b&gt; :) побеседуем о том, как на самом деле устроены эти так называемые ESME и для чего, собственно, они предназначены. Вообще говоря, это нужно было бы сказать с самого начала, но я решил, что сначала неплохо дать читателю (т. е. &lt;b&gt;Вам&lt;/b&gt;) присмотреться, а уж потом "делать строгое лицо". Итак, казалось бы чего проще -- подцепил к COM-порту радиопад, типа SIEMENS, и вещай себе прямо в эфир (по сути, такая конструкция эквивалентна  "домашнему" сервис центру). В некоторых случаях подобный "агрегат" представляется приемлемой альтернативой, пока речь не заходит об интенсивности траффика. Именно при построении "профессиональных" сервисов, рассчитанных на охват большой аудитории, ESME и будет являться компонентой сервисных систем. &lt;/p&gt; &lt;p align="justify"&gt; Так что же такое ESME? Для того, чтобы строго ответить на этот вопрос придется обратиться к известной OSI/ISO модели (рис. 1).&lt;br /&gt;&lt;/p&gt;&lt;hr noshade="noshade"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vrrdow9KgWQ/RpJsghw-kXI/AAAAAAAAABI/QLcmfEz9XHA/s1600-h/osi.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vrrdow9KgWQ/RpJsghw-kXI/AAAAAAAAABI/QLcmfEz9XHA/s320/osi.gif" alt="" id="BLOGGER_PHOTO_ID_5085246235330122098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Рис. 1. Модель OSI&lt;/b&gt;&lt;hr noshade="noshade"&gt;&lt;br /&gt;Ниже приведена таблица, показывающая, как на ней "размещается" ESME. Для примера приведены стэки протоколов для Microsoft Networking и регулярного TCP/IP приложения, например почтового клиента. Мы, по-прежнему, обсуждаем ESME, связывающееся с сервис центром по протоколу TCP/IP.  &lt;hr noshade="noshade"&gt; &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="4" cellspacing="0" width="99%"&gt;   &lt;tbody&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;       OSI&lt;br /&gt;Layer&lt;/b&gt;&lt;/td&gt;     &lt;td align="center"&gt;&lt;b&gt;       Microsoft&lt;br /&gt;Networking&lt;/b&gt;&lt;/td&gt;     &lt;td align="center"&gt;&lt;b&gt;       TCP/IP&lt;br /&gt;Internet&lt;/b&gt;&lt;/td&gt;     &lt;td align="center"&gt;&lt;b&gt;       &lt;i&gt;ESME&lt;/i&gt;&lt;/b&gt;&lt;/td&gt;     &lt;td align="center"&gt;&lt;b&gt;       OSI&lt;br /&gt;Protocols&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;       Application&lt;br /&gt;&lt;/b&gt;Layer 7&lt;/td&gt;     &lt;td colspan="4" align="center"&gt;Application        Programs and Protocols&lt;br /&gt;for file transfer, electronic mail, DB connectivity, etc.&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;       Presentation&lt;/b&gt; &lt;br /&gt;Layer 6&lt;/td&gt;     &lt;td align="center"&gt;       Server&lt;br /&gt;Message&lt;br /&gt;Block&lt;br /&gt;(SMB)&lt;/td&gt;     &lt;td rowspan="2" align="center"&gt;        (Telnet, FTP,&lt;br /&gt;SMTP,       etc.)&lt;/td&gt;     &lt;td align="center"&gt;        &lt;b&gt;Protocol packet&lt;br /&gt;composing/parsing&lt;br /&gt;module&lt;br /&gt;(for example SMPP)&lt;/b&gt;&lt;/td&gt;     &lt;td align="center"&gt;       ISO&lt;br /&gt;8823&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;       Session&lt;/b&gt; &lt;br /&gt;Layer 5&lt;/td&gt;     &lt;td align="center"&gt;       Network Basic&lt;br /&gt;Input/Output&lt;br /&gt;System&lt;br /&gt;(NetBIOS)&lt;/td&gt;     &lt;td align="center"&gt;       &lt;b&gt;Session management&lt;br /&gt;module,&lt;br /&gt;internal buffers&lt;br /&gt;management module&lt;/b&gt;&lt;/td&gt;     &lt;td align="center"&gt;       ISO&lt;br /&gt;8327&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;       Transport&lt;br /&gt;&lt;/b&gt;       Layer 4&lt;/td&gt;     &lt;td rowspan="2" align="center"&gt;       Network&lt;br /&gt;Basic        Extended&lt;br /&gt;User Interface&lt;br /&gt;(NetBEUI)&lt;/td&gt;     &lt;td align="center"&gt;       Transmission&lt;br /&gt;Control        Protocol (TCP),&lt;br /&gt;  Unacknowledged&lt;br /&gt;Datagram        Protocol (UDP)&lt;/td&gt;     &lt;td align="center"&gt;       Transmission&lt;br /&gt;Control        Protocol (TCP),&lt;br /&gt;  Unacknowledged&lt;br /&gt;Datagram        Protocol (UDP)&lt;/td&gt;     &lt;td align="center"&gt;       ISO&lt;br /&gt;8073&lt;br /&gt;TP0-4&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;        Network&lt;br /&gt;&lt;/b&gt;       Layer 3&lt;/td&gt;     &lt;td align="center"&gt;       Internet&lt;br /&gt;Protocol&lt;br /&gt;(IP)&lt;/td&gt;     &lt;td align="center"&gt;       Internet&lt;br /&gt;Protocol&lt;br /&gt;(IP)&lt;/td&gt;     &lt;td align="center"&gt;       ISO&lt;br /&gt;8473&lt;br /&gt;(CLNP)&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;Data        Link&lt;br /&gt;&lt;/b&gt;Layer 2&lt;/td&gt;     &lt;td colspan="4" align="center"&gt;Network        Interface Cards: Ethernet, Token-Ring, ARCNET, StarLAN, LocalTalk, FDDI,        ATM, etc.&lt;br /&gt;NIC Drivers: Open Datalink Interface (ODI), Network        Independent Interface Specification (NDIS)&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;     &lt;td align="center"&gt;&lt;b&gt;        Physical&lt;br /&gt;&lt;/b&gt;       Layer 1&lt;/td&gt;     &lt;td colspan="4" align="center"&gt;Transmission Media:&lt;br /&gt;Twisted Pair, Coax, Fiber Optic, Wireless       Media, etc.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;hr noshade="noshade"&gt; &lt;p align="justify"&gt; Теперь видно, что собственно ESME занимает то же положение на стэке, что и регулярный TCP/IP клиент. Правда, если ESME не оформлено в виде библиотеки, оно может простираться и на самый верхний -- седьмой -- уровень. Таким образом, самым верхним подлежащим уровнем для ESME будет реализация TCP/IP стэка операционной системы, что мы собственно и видели. К слову, сама программа (библиотека) может быть и не так жестко разбита на "слои", но здесь я явно их выделил. Давайте обсудим эти уровни по отдельности. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Session layer&lt;/b&gt; предназначен для решения задач, не относящихся собственно к передаче данных. В этот круг задач могут входить аутентификация сторон, восстановление физических или логических соединений, организация двунаправленных потоков (bidirectional traffic), token management, синхронизация и пр.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Presentation layer&lt;/b&gt; отвечает за преобразование данных.&lt;/li&gt;&lt;/ul&gt;  &lt;p align="justify"&gt; Общая структура dumb_esme представлена на картинке:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_vrrdow9KgWQ/RpJtYhw-kYI/AAAAAAAAABQ/RNETEK3dQgU/s1600-h/dumb_esme.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/_vrrdow9KgWQ/RpJtYhw-kYI/AAAAAAAAABQ/RNETEK3dQgU/s320/dumb_esme.gif" alt="" id="BLOGGER_PHOTO_ID_5085247197402796418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Перейдем к обсуждению назначения классов, вошедших в состав приложения опираясь на уровни модели OSI.  &lt;/p&gt;&lt;h2&gt;Session layer.&lt;/h2&gt; &lt;p align="justify"&gt; В нашем простом примере этот уровень не представлен со всей фундаментальной четкостью, часть функций (в т. ч. решение о закрытии соединений) делегирована основной функции (main), а восстановление соединений и поддержание внутренних циклических (FIFO) буферов и вовсе опущено. В реальных проектах приходится организовывать такие "очереди октетов" по той причине, что (в отличие от X.25) TCP/IP не гарантирует что одним вызовом &lt;b&gt;recv&lt;/b&gt; мы получим ровно один отправленный протокольный пакет и целиком. Типичная ситуация, проявляющаяся в частности при больших загрузках: за один вызов recv приходит два целых пакета и "кусок" третьего. Разумеется, в связи с гарантированной доставкой данных по TCP-каналу, недостающий "кусок" будет получен следующим вызовом, но, возможно, еще с чем-то "на хвосте". Ситуацию, как я уже сказал, решают созданием FIFO буфера: модуль, непосредственно оперирующий сокетом, пишет в "хвост" такого буфера, а вышестоящий модуль, "откусывает помаленьку" с "головы". Кроме того, в протоколе SMPP, в отличие, скажем, от EMI или SIMD, не предусмотрены маркеры начала и конца пакета, так что при возникновении "мусора" в канале "ловля" начала следующего неиспорченного пакета превращается в серьезную (вообще говоря -- неразрешимую) проблему и проще переустановить соединение, сбросив буфер. Вообще говоря, достаточно в заголовке пакета указать неверную длину, чтобы вывести канал из строя. &lt;/p&gt; &lt;p align="justify"&gt; В нашем простом примере проблема частично решена путем обработки входящих пакетов "в два удара": сначала обрабатывается заголовок пакета (длина которого строго фиксирована), а потом принимается из канала ровно столько октетов, сколько указано в заголовке. К слову, и при работе со внутренним буфером также приходится сначала обрабатывать заголовок, ибо именно в нем указан тип команды. Возвращаясь к модели OSI отметим, что все же многие функции обсуждаемого уровня инкапсулированы в нашем примере в двух классах. &lt;/p&gt;  &lt;h3&gt;class connector&lt;/h3&gt; &lt;p align="justify"&gt; Это простая классовая оболочка вокруг системной реализации протокола TCP/IP, именно он оперирует непосредственно с сокетом. В реальном проекте, скорее всего, здесь был бы реализован буфер FIFO. Интересной задачей могла бы являться реализация данного класса как наследника basic_iostream из стандартной библиотеки, что нибудь наподобие sockstream... &lt;/p&gt;  &lt;h3&gt;class smpp_connector&lt;/h3&gt; &lt;p align="justify"&gt; Наследник класса connector, выполняющий большинство функций, характерных для Session Layer, как то: аутентификацию (посредством SMPP bind), разбор и проверку заголовков пакетов, поддерживает внутреннюю нумерацию команд SMPP. Обращаясь к реальным проектам, следует сказать, что этот класс -- самое место для управления восстановлением соединения для ESME работающих в непрерывном (ждущем) режиме. Стоит также заметить, что есть все основания задуматься о вынесении функциональности данного класса в отдельный поток исполнения (thread). &lt;/p&gt;  &lt;h2&gt;Presentation layer.&lt;/h2&gt; &lt;p align="justify"&gt; Представлен двумя классами &lt;b&gt;transmitter&lt;/b&gt; и &lt;b&gt;receiver&lt;/b&gt;. Как явствует из названия, эти классы (будучи оба наследниками класса smpp_connector) инкапсулируют особенности сессий в состояниях &lt;b&gt;BOUND_TX&lt;/b&gt; и &lt;b&gt;BOUND_RX&lt;/b&gt;, занимаются распаковкой и упаковкой пакетов (я говорю пакеты, подразумевая, конечно же &lt;b&gt;PDU&lt;/b&gt;) и переправляют их "вверх" приложению и "вниз" -- в сокет. Интерфейс с приложением поддерживается с помощью двух структур данных: &lt;b&gt;message&lt;/b&gt;, являющейся абстракцией как для входящего, так и для исходящего сообщений, и &lt;b&gt;status_info&lt;/b&gt;, отображающей факт изменения состояния сообщения (принято/не принято, доведено/не доведено). &lt;/p&gt;  &lt;h2&gt;Заключение.&lt;/h2&gt; &lt;p align="justify"&gt; Вот, собственно, и вся реализация протокола. Остальные классы, вошедшие в проект являются вспомогательными, их суть видна из названий (и откомментирована в коде). &lt;/p&gt; &lt;p align="justify"&gt; Надеюсь, данным циклом статей, не затрагивающим, как я уже сказал, &lt;i&gt;все&lt;/i&gt; "интересные" вопросы мне удалось показать технику написания такого класса приложений. Я старался обсудить наиболее общие вопросы, не привязываясь к определенной платформе и не "отступая далеко" от реальных проектов, в создании которых мне удалось принять участие (один из таких, кстати, оправдывая описанный подход, в настоящее время трудится в непрерывном режиме, пропуская в пиках до 5 млн. сообщений в сутки). &lt;/p&gt; &lt;p align="justify"&gt; Что же "осталось за скобками"? Да довольно многое. Мы никак не обсудили передачу двоичных данных (графики, мелодий), сосредоточившись на SMPP, оставили без внмания другие протоколы, не коснулись интересных особенностей программирования под конкретные OS. Честно говоря, я не могу сейчас сказать, чем будет продолжен этот цикл статей, посему, это отличный повод для аудитории &lt;a href="http://smsinside.blogspot.com/"&gt;сделать заявки&lt;/a&gt;. Надеюсь на вашу активность. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-3221256236588343732?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/3221256236588343732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=3221256236588343732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/3221256236588343732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/3221256236588343732'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/sms-5.html' title='SMS-приложение. Часть 5. &quot;Разбор полетов&quot;'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_vrrdow9KgWQ/RpJsghw-kXI/AAAAAAAAABI/QLcmfEz9XHA/s72-c/osi.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-499936660913427290</id><published>2007-07-09T09:59:00.000-07:00</published><updated>2007-07-09T10:04:45.083-07:00</updated><title type='text'>SMS-приложение. Часть 4. Но не последняя...</title><content type='html'>&lt;h2&gt;И ни в чем себе не отказывать...&lt;/h2&gt; &lt;p align="justify"&gt; Наконец-то (с заметным перерывом), нам удалось выпустить следующую статью цикла. Собственно, как мы и обещали, она содержит код простого, но работающего SMS приложения (для нетерпеливых: &lt;a href="http://smsinside.blogspot.com/2007/07/dumbesme.html"&gt;брать тут  (см. заголовок ;)&lt;/a&gt; ).  &lt;/p&gt;  &lt;h2&gt;Некоторые детали.&lt;/h2&gt; &lt;p align="justify"&gt; Собственно, задержка обусловлена еще и тем, что мы достаточно долго решали, а &lt;i&gt;насколько&lt;/i&gt; простым должно быть это приложение. С одной стороны, это не &lt;i&gt;продукт&lt;/i&gt;, а нечто, что можно написать и отладить за пару дней и за столько же "разобрать" и осознать. Но, с другой, хотелось показать основные "подводные камни", с которыми приходится сталкиваться в реальных проектах. Как кажется, разумный компромисс найти удалось. &lt;/p&gt;  &lt;h2&gt;Что с этим делать.&lt;/h2&gt; &lt;p align="justify"&gt; Архив (в формате tar) содержит исходные файлы на C++ (содержащие, надеемся,  достаточные комментарии); файлы окружения (.dsw) и проекта (.dsp) для MS VC  6 -- в каталоге MSVC6. Под *NIX (тестировался на Linux RH 6.2, если кто  возьмет на себя труд собрать и потестировать на другой *NIX платформе -- будем благодарны за комментарии; фактически, должно работать на любой... но, как обычно -- as is) же проект собирается обычным образом: &lt;/p&gt;&lt;pre&gt;&lt;br /&gt;$./configure&lt;br /&gt;$make&lt;br /&gt;&lt;/pre&gt; Инсталлировать не надо -- надо положить рядышком конфигурационный файл. Вот пример такого файла: &lt;hr noshade="noshade"&gt; &lt;pre&gt;# This is a dumb_esme configuration file&lt;br /&gt;&lt;br /&gt;# Host and port&lt;br /&gt;host=192.168.0.5&lt;br /&gt;port=8200&lt;br /&gt;&lt;br /&gt;# Bound parameters&lt;br /&gt;system_id=System ID&lt;br /&gt;password=the password&lt;br /&gt;system_type=Dumb ESME&lt;br /&gt;&lt;br /&gt;# Lifetime in seconds&lt;br /&gt;lifetime=60&lt;br /&gt;&lt;br /&gt;# Time delay for select operation seconds...&lt;br /&gt;tv_sec=0&lt;br /&gt;# ...and microseconds&lt;br /&gt;tv_usec=100000&lt;br /&gt;# i. e. 0.1 sec&lt;br /&gt;&lt;/pre&gt; &lt;hr noshade="noshade"&gt;   &lt;h2&gt;Где брать эмулятор SMSC.&lt;/h2&gt; &lt;p align="justify"&gt;В googl'е наберите 'SMSC emulator'. Мы же тестировали на "внутреннем" эмуляторе и на реальном SMSC (поверьте на слово -- отправляет и принимает).  &lt;/p&gt;  &lt;h2&gt;Как это работает.&lt;/h2&gt; &lt;p align="justify"&gt; Само приложение совсем простое: будучи запущенным, оно "висит" указанное  количество времени (параметр "lifetime" в конфигурационном файле), открывая два соединения к центру (transmitter и receiver). Receiver принимает все, что успевает за это время (не забывая отвечать ACK-ами) и "складывает" принятое в файл с именем "inbox", а transmitter отправляет все, что смог прочитать из файла "outbox". Вот пример формата файла "outbox": &lt;/p&gt;&lt;hr noshade="noshade"&gt; &lt;pre&gt;1234 1 1 9672345 1 1 9872345 Message text&lt;br /&gt;&lt;/pre&gt; &lt;hr noshade="noshade"&gt; &lt;ul&gt;&lt;li&gt;Первая группа цифр -- идентификатор сообщения, присваиваемый пользователем, ни для кого, кроме него он значения не имеет (и никуда не передается), но служит для связи ответов SMSC с исходными сообщениями.&lt;/li&gt;&lt;li&gt;Далее, через пробел, TON, NPI и адрес оригинатора (т. к. ESME, в принципе, может обслуживать как отдельный номер, так и диапазон, или набор), т. е.  адрес ESME. &lt;/li&gt;&lt;li&gt;То же для получателя.&lt;/li&gt;&lt;li&gt;Все остальное до конца строки -- текст сообщения. Проверка на длину, кстати, для простоты, опущена (как и многие другие проверки, в т. ч. на длину адресов). &lt;/li&gt;&lt;/ul&gt;  &lt;p align="justify"&gt; После обработки "outbox" переименовывается. Далее, по приходу ACK'а заносится запись в файл "sent" (в случае, если код ACK'а рапортует положительный статус) или, в обратном случае, в файл "err". В файл "sent" помешается строчка, содержащая упомянутый пользовательский идентификатор и идентификатор, присваиваемый центром. В файл "err" -- только пользовательский. По приходу же delivery receipt'а (status report'а) в файл "deliv" помещается строчка с идентификатором сообщения, выданный центром, если, опять же, в рапорте сообщается об успешном доведении, и, в обратном случае, такая же запись помещается в файл "undeliv". &lt;/p&gt; &lt;p align="justify"&gt; Такой механизм работы позволяет связать исходное сообщение с ответами центра. Действительно, не сложно написать приложение (а, фактически, с этим может  справиться несложный скрипт) для анализа полученных файлов. На практике же, обычно "входом" и "выходом" часто является некая база данных, но механизм связывания остается примерно тем же. Это то, что мы между собой называем "чехордой идентификаторов" :). Но подробнее об этом в следующей статье. &lt;/p&gt;  &lt;h2&gt;Заключение.&lt;/h2&gt;  Подробный "разбор полетов" будет в следующей статье. А пока можно просто проанализировать код и, кому удастся, потестировать приложение. Мы, к слову, ввиду недостатка времени, тестировали не очень интенсивно, так что bug-report'ы направляйте в форум ;). Тем не менее, на стенде этот простенький (dumb!) SMS client показал устойчивую работу при нагрузках порядка 100 mess/sec в обоих каналах, что явилось некоторой неожиданностью. Для тех же, кто дочитал до конца, еще раз ссылка:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;  &lt;a href="http://smsinside.blogspot.com/2007/07/dumbesme.html"&gt;Dowload SMSC client sources (tarball ~45 Kb ) &lt;/a&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-499936660913427290?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/499936660913427290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=499936660913427290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/499936660913427290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/499936660913427290'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/sms-4.html' title='SMS-приложение. Часть 4. Но не последняя...'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-6745816840502903221</id><published>2007-07-09T02:35:00.001-07:00</published><updated>2008-09-17T06:02:58.909-07:00</updated><title type='text'>dumb_esme</title><content type='html'>А вот и способ борьбы с отсутствием возможности прикреплять файлы :). Давным-давно,&lt;br /&gt;когда компьютеры были большими, а диски маленькими, придуман был формат &lt;a href="http://www.google.ru/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Facronyms.thefreedictionary.com%2FUnix-to-Unix%2BEncoding&amp;amp;ei=KQKSRo5fjq7AAeOwlYAJ&amp;amp;usg=AFQjCNGpqKjYbtLsWAd8Vpdjkels3WZ2aA&amp;amp;sig2=3dJ-ZimU-L77xE7ZXKt-mA"&gt;&lt;br /&gt;UUE&lt;/a&gt;. Внизу -- примерчик. Для распаковки просто скопируйте все, что между линиями,&lt;br /&gt;в буфер обмена и вставьте в текстовый файл dumb_esme-0.1.tar.gz.uue&lt;br /&gt;&lt;br /&gt;Под Windows файл с расширением .uue открывают WinRAR, WinZip, 7-Zip etc.&lt;br /&gt;Под *NIX следует выполнить:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ uudecode -o dumb_esme-0.1.tar.gz dumb_esme-0.1.tar.gz.uue&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;br /&gt;begin 600 dumb_esme-0.1.tar.gz&lt;br /&gt;M'XL(`!ILX3L``^P\:7/;1I;YJJ[]$1V%-1*S)'59UIA:I4A3E,V-)*I(*K$W&lt;br /&gt;MGJ)!H$EB!0(&amp;lt;'**9S?SW?&amp;gt;_U@08/'[..9RLQJVPU^GC][O&amp;gt;ZT0TOFXV&amp;amp;(IF)&lt;br /&gt;MZF'MZ.";W^5W&amp;gt;/CD\.SL%/X&amp;gt;'IX]E7_AI__*\MG)V&amp;gt;'QT].SH^-O#H^.3P^?&lt;br /&gt;M?L-/?Q]TBK\L29V8\V\&amp;gt;',]YB!ZW]HNC*/T2^'SAGU&amp;gt;0_XWS(,9^(&amp;amp;I^^!GG&lt;br /&gt;M.#PZ/'SZ],D6^1^?'C\]T_)_&amp;lt;GR(\G]R&amp;gt;GKZ#3_\C#AL_?W)Y?\=MV3.)R(4&lt;br /&gt;ML9,*CSM9&amp;amp;LV&amp;lt;U'&amp;gt;=(%CRT5)5/`A^5'O"QW$TRP&amp;lt;Z,\:^XZUHOHS]R33E^ZTR&lt;br /&gt;M/WKV[$D%_S^M_I7^/N-7L1"\'XW3A1,+?A5EH0&amp;lt;31&amp;amp;&amp;amp;%=T*W!A`&amp;amp;4S\IH`./&lt;br /&gt;M8QR4J$'G/)V*K7``PL1_%`G/PL"?^4C%7,0S/TF@D:&amp;lt;1=P%#[H3&amp;gt;011SST_2&lt;br /&gt;MV!]EJ&amp;gt;!^6H&amp;amp;A"S^=&amp;lt;FC`OU&amp;amp;6\EGD^6,@'R$G%&amp;gt;XD/(C""?Y-$&amp;lt;TP`MX(Q'`&amp;gt;&lt;br /&gt;MBT3$C\*K,4W#/(XFL3/#UGP&amp;gt;CP-%B/\TF@LH."G,#-,%`1\)GB5BG`6("/3E&lt;br /&gt;M/W&amp;lt;&amp;amp;+[OW`]Z\?&amp;lt;U_;O9ZS=O!ZPJ2@./%NU2$J:0M1;@@G&amp;lt;!9G&amp;amp;O4`89X%'(N&lt;br /&gt;M?S8/?.@"K(J=,%WR:,QOVKW62X#8?-ZY[@Q&amp;gt;(]%7G&amp;lt;%MN]_G5]T&amp;gt;;\+XNV9O&lt;br /&gt;MT&amp;amp;G=7S=[_.Z^=]?MMY$X^&amp;gt;,/'H`/HKG$/7H4\2(&amp;amp;;DN^S)TX_?;;;_G^2$S\&lt;br /&gt;ML/R=^3'&amp;amp;^B_;U]?\@C&amp;gt;HT&amp;amp;`LB5W/C[%&amp;amp;EAHLC&amp;gt;;#O#9_:K"?[IJ#EW97X/O8&lt;br /&gt;M?X&amp;lt;ULM1@XIUPAWFU]0ASC?Q0096E!DORJD37!?X(AZGJ_*G!0,&amp;lt;&amp;lt;5:V*`&amp;amp;&amp;amp;9&lt;br /&gt;MN%$XUD#,$[1,03&amp;lt;]&amp;lt;"T@']5:J(&amp;amp;9(C`MNT.A@C#)L:`:/QQ'JDH5&amp;amp;VSF:!)D&lt;br /&gt;M"7NY0&amp;gt;8)TU$_-5@4&amp;gt;(7&amp;amp;@RR)#U0-8Y?M_N"RT^,7C,T?)CFUI7U5+A\T[IJM&lt;br /&gt;M'YLOV@WL8?`K[&amp;lt;OB2GMAJM)^_FCW(WF/,C_P9#_0LF;KNMMJDIJH8H,U[P?=&lt;br /&gt;M5O?VBBI56=;&amp;gt;-']LZUHLR]J7[&amp;gt;9ENZ?KY1-,UKGM#YI2`U6QH&amp;gt;N&amp;amp;=[WNBU[S&lt;br /&gt;MQFK350W`OGDS7*D=7ETW7_3+9OQE&amp;lt;]"T!^-S#KW?ZG7N!G:[K`&amp;amp;%![-,QE$\&lt;br /&gt;MDXI,?F-H*H&amp;gt;A,Q.`^6VW=].\'N8$U-E=KUU\[O8'A0HUYOYV==1*#8XK5K5:&lt;br /&gt;MB$RKU6"M5Z^H^.I5@R%[.[=77:S0Y093HL1*(U5P5]&amp;gt;=YU@E2V"\[5Z_T[W%&lt;br /&gt;M*E4$HOKWST'A^E!IDA#.6/O5H-&amp;lt;&amp;lt;7G;Z`[NAADYG'O\W!X&amp;amp;^[,*@5O?N=&amp;gt;?V&lt;br /&gt;M!6]-G7`BKJ,)UQ3T0-PW;3[H7G;YISHM$7J6RP*GI?5JV+T;`-:(+,A%^)-0&lt;br /&gt;M*^KPY@DI&amp;gt;.ZKR@&amp;gt;.2\9&amp;lt;FSUALP&amp;lt;_!*,.P/;BA#J2\RNOC"AT8ZC?G1=#H\;H&lt;br /&gt;M5OQ);:H;6M?MYNWPJG/=1H08,FO8ZM[&amp;lt;$(&amp;lt;U`VH'`'`VKTXQDGZ8;6^8%&amp;lt;\+&lt;br /&gt;M49@XZ;@:"9Y39Q##;F^8?,H@*)L217%)6369&amp;lt;@K&amp;amp;$$6+Y#*B0)-3VK?H03[U&lt;br /&gt;MN_&amp;gt;]5KN/1&amp;lt;D1*@[:KU`#J9SK3)FQ01-9-H&amp;amp;LCKWXK\[=L'W[$SQ7JR.1I`RF&lt;br /&gt;MK'-$)D97)-R4U?KW5U&amp;gt;=5^U^G97VM3@L\NMVGK,BM0*9X"6,1I0YVW&amp;amp;]8F_^&lt;br /&gt;ME[]@'Z509&amp;lt;!(:1*4E'&amp;gt;L&amp;gt;F*&amp;gt;9T#,2*3.-Z+&amp;amp;U03:@6J$:AA%LL1"P?0`*&amp;gt;UP&lt;br /&gt;MQ$1I$C']HM3@!97K6WI:6P'*"G36&amp;gt;5'6:LXBR;([B*8`R28JUYS2OL($M')P&lt;br /&gt;MWQ]&amp;gt;MN_:MY?MVU8'-(#M;$,+&amp;gt;`C2G`KW@6V`NG&amp;amp;J=9GIN&amp;gt;_!2:[,NX$J%8=R&lt;br /&gt;MLJ9UKBR.[33\,4]!X?BWO#KFI09EKF@C.SO@ZJ%*]3RGJM*^5`F[4@2)X/5S&lt;br /&gt;M/O:9JEZG0AK&amp;gt;9U*"514P]DZ].=^N$CL-8#WDIOY,$*K\!TT)/_Z!'X#G/0BS&lt;br /&gt;M(%B3#*%O4Y4[K(_@X*9A179N[6'Q=E.?^L&amp;gt;;&amp;gt;&amp;gt;X6WV?PDJ7E38S:-'^1:VP6&lt;br /&gt;M)6FP=`/AA-6I%]=!X:PR+C"LYYVJY(Y!"U)$/TSAGXBK]CBU5)%&amp;gt;,(J7&amp;gt;PE/&lt;br /&gt;MLI%^]&amp;amp;$9A:LK.3&amp;gt;X&amp;lt;/!,$!QAW7'.EU'&amp;amp;72?DK@=``#:M2F:XL.)Q%O*WN$K&amp;lt;&lt;br /&gt;M,^NH280./YW&amp;amp;43:9RG!K7!@B`&amp;lt;LRBD6T7'ET@@QFAD6*@O+HQ+XS"@1X"XP8&lt;br /&gt;MPO&amp;amp;P$7QWBE`UH`373?M'98XZ0V#D*%R`)2+%A=?;@LKN50C&amp;amp;:BU`P=_^8NJ[&lt;br /&gt;M4YDIN`ZLS`BHF0S78;!BBT6^6EZ@:B)?&amp;lt;@:4SQ&amp;amp;GXS*/8'"\\!-1@3PC20B6&lt;br /&gt;M)Q)@M&amp;amp;?HE8LU1;,;S3"9YP'(#!+B1K\]&amp;amp;,K&amp;lt;ELG(Y69Q`@M=$U@Q0=]0C4L7&lt;br /&gt;MJ_H-LV+NANYY31:NUV%X1_&amp;gt;Z/G"]&amp;gt;AQ9C]ZCGS^!?C90(.,PBM%:D"R92)]S&lt;br /&gt;M9S:^*)6.R4"]*!TF0H07843/$,PG(KUX2^8#T&amp;gt;HW$*O'DX,&amp;lt;\L'!6^H9@#E&amp;lt;&lt;br /&gt;M[(&amp;amp;KDLEE&amp;gt;&amp;gt;\&amp;lt;$S:EVJ@(I1)V.&amp;gt;=&amp;gt;)!T;@=P%X:)"E4IR)ME1#MH]EQVU/]HU&lt;br /&gt;M#9!6[-9V&amp;lt;\&amp;gt;$NF,P7XKD7%=2OC141.SJ2:K.3,,FA_3&amp;gt;SKKGV%&amp;gt;%?70W"A/I&lt;br /&gt;M:;33@\5)SE&amp;gt;DUP*H?#__[3?0;)@3X`/?=Y'&amp;gt;[R^^+W/Q#JSBZ/R&amp;lt;?_\`3V/'&lt;br /&gt;M#X@0&amp;gt;+;:1.*X2DRAH(+%&amp;amp;\T`XDX8%=BS#&amp;lt;&amp;lt;"2Q`W-16.0H()=O57[(&amp;lt;H[19]&lt;br /&gt;M8JYKJ\^Y;[3-8,TA_I_5,Q:/%WN@:9^L?#C0Z!.TPK,6]$9=0T&amp;amp;O:9B1PC81&lt;br /&gt;MX"B:J69/\?$VM4H#@/C=[.&amp;gt;/;"HX]YHJI\XD*6C@)RO1.E=KB/3'4HT(E`V.&lt;br /&gt;MC!"J\P&amp;amp;T,=:YK!=77=9:[+K3ORM;Z*ZOTO8(*D23OV?BXBT2X:_@+W6OY.,#&lt;br /&gt;M\.&amp;lt;W29"S&amp;gt;.![*-__X11P?RF5#O\&amp;amp;9(%#^(?)1CF'_!Q[`-A]@DM]RWP&amp;gt;@WES&lt;br /&gt;M`/F//:F^$'YA^OG"&amp;gt;XML*&amp;amp;3R.A&amp;amp;&amp;amp;]:@'65.IA'T/.I&amp;gt;`DT3;T,F0(75&amp;gt;E-86&lt;br /&gt;MWA23&amp;lt;QQ87$[DS$-P%RM(_A-AC&amp;amp;^QKIJR+4AU;;.1.C@VVG&amp;amp;`*))R(CID1Q-8&lt;br /&gt;M4?E&amp;lt;\:/0CZR+&amp;amp;^LRSN?_OQ[DIK??)J$T&amp;gt;Z#_EK"TT)5X)!]VY4S:H.Q%H"`^&lt;br /&gt;M%:!QQ;R""JSH$J]&amp;amp;FK,#VD,L1#,R/YWBJX&amp;lt;\CLD*G&amp;gt;23W#J7&amp;amp;W)\:Z#&amp;gt;@57;&lt;br /&gt;M&amp;lt;^5J:5_MP95I^]7NH\IELSQ0[CP#Z+%*7:$+L9@2_E2N%+C&amp;lt;G=&amp;lt;+)7II4N,`&lt;br /&gt;M0N!;&amp;amp;?"%D\S!]P\"LV=\\Z$AT:L1?#U#F7HPK@(((H3&amp;gt;:LQD5'%"RJ$!$F`A&lt;br /&gt;M%P[$$4P\ZP1&amp;amp;&amp;lt;20&amp;gt;VS3LX/;/16E?[P+1KE&amp;amp;S5^:_OK/[U0!H;?(KVYD]4!`V&lt;br /&gt;M#0&amp;lt;7M&amp;amp;+&amp;gt;U("I+^B^.U0Y\'`$$&amp;gt;+B+2E(L1?JB;'JE78";WQ0K69M@U2K4L\N&lt;br /&gt;M:C4HRY&amp;lt;8D'ZLS&amp;amp;C&amp;amp;;O/M'VJ'Y/R#?8C-'^RET/K8?A\'=+MH&amp;amp;R,G!&amp;amp;T'9[4J&lt;br /&gt;M1]2D&amp;amp;-:)2_((MH[)O,!SDJE(5-H#ODX"VC7I3^W@XF`BQ:6[R"&amp;amp;[A3HU;%,_&lt;br /&gt;M4DZIEX`7X.].9Q&amp;amp;$EQYW_CW^*`4%&amp;gt;+]N4-'"V`U&amp;lt;P4*5=CC_-7-#H:ZV;VE+&lt;br /&gt;M:7//-7,R6)Z=G16%C!(D5T.!-(&amp;gt;;YS[&amp;gt;A?'(*VEF%;,?#V(7`BCFF.Z&amp;lt;@TE9&lt;br /&gt;MS;95Z@%KR::)FJM]=0&amp;lt;($4'X7JB%C1UK&amp;amp;"'T_I'0JU[,:RE;6\W-3&amp;lt;*0L^C3&lt;br /&gt;M,P.O.+\"GZ.[Y@\W]+%6&amp;lt;,3R#0(VPTROCTY9\[`%#O(@!\DWUN;XF7XF&amp;gt;UA%&lt;br /&gt;MU68N[60XLSH5ZBL;&amp;amp;PPW-K`1_M:+NQQJIP0:Z56#,V,J5*ULE;#"#HJ&amp;lt;**^H&lt;br /&gt;M;]E@*6X"T2SY'N0VCA7&amp;amp;,%;8(K(FIHKZEAVD?!AM.-G#L**^93\J'V8Q9*?Q&lt;br /&gt;M@0"A4&amp;gt;,K&amp;lt;VI@]?5]*Y;O6R%NYJF^:4.+:83TME[.1/OU4)VO&amp;lt;MM0@X%E7M_.&lt;br /&gt;M\FWOC"^JB&amp;lt;;=WI$S!!6WYPJ;=DA6,5ND+4C?-0EC_ISGC*9.IXV&amp;amp;9/.RQ7JA&lt;br /&gt;M6%[=0G8=4$#]$$03L[&amp;gt;O_OYR6'WVM^\WY*!F7AMA9#E?V='FJ_DOWT!B@&amp;gt;XZ&lt;br /&gt;MW[@!I+E`D^3@+&amp;lt;`%D+R(F!I=7]U&amp;amp;LGE)D`M;[M83S;#&amp;amp;=Y[#-VWU35M3JXS7&lt;br /&gt;M+]S6&amp;amp;"MYN&amp;amp;%;?[V24,)W(MNDPVW:]`N*7&amp;lt;K]]3ZTC_J:XNZ_1SE5#HJVPK-$&lt;br /&gt;MG.^:D&amp;gt;!*/1$(""1&amp;lt;;99CNC]SEI"4_3T#F^+)7+B^$\#0*"``L:!$N+:[3FI]&lt;br /&gt;MG:(/LJMV][)[^[J^IF1%J;V'9UCYAFUV9I8K^=A=]WS$2M/F[7C3?:7^S&amp;lt;KF&lt;br /&gt;M_S^W&amp;amp;_^&amp;amp;%2+59C/:N&amp;amp;_Z*?NHM)&amp;amp;PNE&amp;gt;R9N1O5M:UMIUN5F2]5%6!F?XJDN`)&lt;br /&gt;M%S-R7:$#*E\)L,75QZIGMX2^&amp;amp;GSP&amp;gt;342%9YY'GER,-P.2/E#X?R!"HCXAQ==&lt;br /&gt;M??&amp;amp;%S2:7N-77Z*&amp;lt;-,BITM('FP-:8SV@[0`"&amp;amp;CV#S&amp;gt;!Z2_W)2.WU6.:D]/2GC&lt;br /&gt;M"[D7M_&amp;gt;&amp;lt;#H&amp;gt;".&amp;lt;-B'5*J&amp;gt;103;?D;/'S;U]7OPKC#DV62BAFGHYI\'QU+?YG\&lt;br /&gt;MQ,%;P)Q)6B:G,&amp;lt;+CCJX0'AZOK-UVVZ_NNKU!G?VKC\W^87[%\]_RZ-#GGN/]&lt;br /&gt;MY[_Q=Z3.?S\Y/CP[@_XG)Z='7\]_?XG?5TOZ&amp;lt;_^*]I^?0?F&amp;lt;&amp;lt;WS0_O'.C[S_&lt;br /&gt;M&amp;lt;7)\_!3O?YR&amp;lt;G7RU_R_Q,V&amp;gt;1OCJ"/^6O:/_JF/!GGN.#]O_T&amp;lt;#7^GSYY^M7^&lt;br /&gt;MO\2O+^*)6/)FC&amp;gt;^_$'%&amp;lt;YC]*/O#_2";PW'"#;#2/HUHR']7B[(&amp;gt;O7N(/]BO:&lt;br /&gt;MO[H&amp;gt;\)GG&amp;gt;+_]@ZV?G*S;_]?[GU_DMT/O07#]_J)]V^XUK_G=_?/K3HO#O_9M&lt;br /&gt;MO\UV]#&amp;amp;+G^3:GQ]7^']FH&amp;lt;`[G4&amp;gt;,K5W[_.LSNNYY]*'KGGSK[^G9*;_!D[+-&lt;br /&gt;M1U'A+6&amp;lt;VBGUO`L6;)C\\/CJ!"&amp;gt;[[3&amp;lt;;;CR)&amp;gt;XG$1O,%C+D-:]SSM2Y[0=P33&lt;br /&gt;MS[#1%PG#70LZC!SXK@@3P;W(S68B3"MT`9/.)./9`S_E\K8G;F9$"[KEN2-Y&lt;br /&gt;M&amp;lt;A&amp;lt;+P`WO:=!)!PTID9ND49*:&amp;gt;ZMTE!K/_$Y"B6&amp;amp;*&amp;gt;R7.PEGBH&amp;gt;&amp;amp;8X257+YIA&lt;br /&gt;M"UT3).35L6@_K7'^?(F[G&amp;amp;GL)(`?GIT@@='QXX#?92.8FETK0NSM6@!H3E[0&lt;br /&gt;M5/Q]4V$;TSA7J]"%]G02/)"`DQIR]+U&amp;lt;))0VKM($MX'CA,Y\^`DKHL8U:LX&amp;lt;&lt;br /&gt;M;Z/2IB_Q)QJO7^AEN:;@D73#P9"H&amp;lt;&amp;lt;*E/%!M[M@NIA%"SM)I%,L]:Q!9&amp;amp;K$L&lt;br /&gt;MD&amp;gt;(#E/;[T4RH8=NTLD"&amp;lt;B_?#Z`@*T\R^]D&amp;gt;Q$R_Y%LK4X?1:F?/7ZG@\$KOD&lt;br /&gt;M$AEBO&amp;lt;(XP8N\40VUYF=\!;N@+7'G`;E1N.U&amp;lt;P2;$*!9C",5TC#[2`JR@3K)Y&lt;br /&gt;M#/,#A5T`OQFS9$WW;)DZ*6H%FSJ/4L*6=EBV(TUF#3^^KW0GGI`J,+(GO`M-&lt;br /&gt;M-Z/'="!^X2?3&amp;lt;L5,!;2X`G&amp;gt;#$^"(BZ`]@1&amp;gt;0D6%T;C1E&amp;gt;J"#I[=2:RC=.&amp;lt;CO&lt;br /&gt;M"A@T8#B&amp;gt;T0&amp;lt;&amp;lt;78DE`@EY*!827\WW&amp;lt;ZE$&amp;amp;MQ#&amp;amp;"T,7(\N,=!)?^!S0M(91#@T&lt;br /&gt;MQ4U:DA]YN82D$@J+E[%`3KET45R"!V:,?(^!LJ)[0F:*D$Q=32(A(&amp;gt;*HTLF#&lt;br /&gt;M;(I0*C$:;DP$REXU-I!C"K/@!='`20FX*V+&amp;lt;K&amp;lt;4&amp;gt;&amp;lt;VCT1W[@I[[R0PA9&amp;lt;I1M&lt;br /&gt;ME*C-R0IBI-A/U]]1?8D55]`@WL$J,8!.JL=&amp;amp;&amp;lt;$GF3KFC65[!BQ%T=&amp;amp;N"9\*(&lt;br /&gt;M8O(9?"P`$,T#\9&amp;gt;N[4N2A&amp;gt;L#J!"8@WXEYP+Q%&amp;lt;V(HZ[6I)71V!5UAB%+,K"*&lt;br /&gt;M435+O:"569H'&amp;lt;)J@$@:/9`HJ09=9E#)`5$$?1%"EPD#)CYD6#=JPV*0E\G,"&lt;br /&gt;MZ0)DFHIY4J?;*:X)E46N@UHRNBDR!CM7:F)%)GD;17[:`!L#,0$S7_^T0&amp;lt;66&lt;br /&gt;ML/K,@1*C/1]AW0P2X!#*0C@H,7*?&amp;gt;XDF!:&amp;amp;BL0!!4N')&amp;amp;K7"*X5CQ'"AHW"&amp;amp;&lt;br /&gt;MB@O)5.CE9_RD.PVC_/L#."515P@V((C.&amp;gt;"W&amp;amp;R$\PR*.`";APG(5.JR!J&amp;gt;)&amp;lt;&amp;amp;&lt;br /&gt;MFC"?6`BFO$5B:Q"@JT0&amp;amp;R"RT&amp;lt;I`"Z9B.,T8@$C]T@@K,(4G"(`.,@-`^HU@:&lt;br /&gt;M1U[F2C0HB"3R:A`"`-&amp;lt;&amp;lt;H.C5#1X-BZEXM`&amp;lt;=YEDJ/R(A+0F;@V6%)K'=$Z*4&lt;br /&gt;M3B&amp;amp;E@-`-&amp;lt;T&amp;amp;X1UZF\N,;FBMLCLTIQEG0._2MY$$&amp;gt;(]^31RK1.\:28GS#I-0!&lt;br /&gt;M(R,8IR.9;B*G3^^&amp;lt;//_1]S+ZS$&amp;lt;T(D&amp;lt;B)S'Y3`5/%@G033?5)S+1CC08^`MA&lt;br /&gt;M2$`6O:PIIXF?GTA)S*0\Q/&amp;amp;9XV$R0R^&amp;gt;%(;``D60-+^1R:'DBV:M6GLJW4`O&lt;br /&gt;M#]7(=]//H&amp;lt;2LIG.P.&amp;lt;K?6"[%IRC$VV+H-1$F&amp;amp;@I04"F&amp;gt;/D4+M#_X`5TQVZNQ&lt;br /&gt;M?V,?3)"A==#NW?1Y\_82[U!&amp;gt;=N1-&amp;lt;?R6AEI/53B&amp;gt;7&amp;gt;MUGM]C$W6\Z5YVKCJM&lt;br /&gt;M)E8@\H&amp;lt;U&amp;gt;&amp;gt;!V0ZJDU)&amp;amp;8#13(/&amp;amp;81Q0_*,Z@CLPES]%=)YH&amp;amp;C]#6EHQO:[4RC&lt;br /&gt;M`(-+XBQ5:JM&amp;gt;L5D?*6&amp;amp;9B3^2ASI/WIQ&amp;gt;R$.^?/=.XK&amp;lt;+V;,`QE48Y2P&amp;amp;?0H+&lt;br /&gt;M%@V(/?D]T,E=(@6/LWK:C#0T-A,0Y[CPB62K!6$@7$#5?P2)@7X1%(E\3G#@&lt;br /&gt;M+.K2IGW"!2B':65?Q3:ES@7('-]&amp;gt;HAI0,E%A"@&amp;amp;SAE"?B2E^(T:[7!.;/7DY&lt;br /&gt;M4I]&amp;gt;#L`V,V&amp;gt;"+-M_"9X1',$86%PQ`]0Q:/VE#'.#DMZ0JN:0:&amp;lt;GP77OV7&amp;lt;P\&lt;br /&gt;MV^C*E660BW,\#Y(",I.$[T+LV,4/;(![?Y0)0J3XBHG5-KLH$$G))":&amp;gt;&amp;gt;88L&lt;br /&gt;MM4.IP[ETL92596GBD\E#!`7H6E4&amp;lt;])9C%F?A&amp;amp;NN54]:9CO`J*F,C:.!'Y7&amp;gt;'&lt;br /&gt;MK"',2M:C$-/M,4V(LJ480&amp;amp;[43RDB\C5%8WKF?&amp;gt;N"*PH=/!8B-Q(BE(X+Z-R`&lt;br /&gt;M&amp;lt;;G&amp;amp;?I8)#C=*%F&amp;gt;8;B,LNM&amp;gt;IXXXATHN$C`1'-9G$.,N/6;#J7$V!V4OL/`;%&lt;br /&gt;M:R?7F#;[(5G(#*)`!HD8&amp;amp;!^X&amp;gt;9'GOWAK/9G[;A9E22!G!Y]#OAQT%VKF:.@0&lt;br /&gt;M8(`(RA$4DG8OEEN:\CR*"#=P_!EP!9#6D?^&amp;lt;/P@Q1Y-PY*D'$H`&amp;lt;ENB(A?D/&lt;br /&gt;MW2&amp;gt;V/:%&amp;lt;^2'QSB@1(&amp;lt;R"L0QH,Z`9]J$D,E\?6HE`D76@"$2*=FQJ'N;0]YUD&lt;br /&gt;MWI;W!E$9*&amp;lt;F5#B6O*H\!5SM=)OB1+*77TICU&amp;lt;DW.)!.\I8+BJ#PQFBL/@S2;&lt;br /&gt;M],C*OS#HOM,K&amp;lt;YTTD^8&amp;lt;YYJC\CN"**F*-RN,]IC*LS'IV:!'1G%Q)M'=ZHHK&lt;br /&gt;M*I9*/;4337+M14&amp;gt;H'#S?$$KZBK@CYHPBW-Y9TTM0#4BX9T)()9%4),**XW5&amp;amp;&lt;br /&gt;MFT=..5\$Y+&amp;gt;T3&amp;lt;YHKFJ[P%MB+-"(YJU4CF#@F3%ITWJ-2?R6/D="T![(P]66&lt;br /&gt;M4CS9JR;Q&amp;amp;*WA0;J)##!@+7X!&amp;lt;Y1EJ:4M^'0$LX#@3*V4@,6I"&amp;gt;M4E\A0AW2M&lt;br /&gt;MN$`E6()!XRCMCL85=4T]SY3PGHZ&amp;lt;Q4$N:'W&amp;amp;$$76Z,&amp;gt;&amp;gt;@&amp;gt;+39]0V9P(Z]$OR&lt;br /&gt;MW;).W0WK=:`/0:\HK\3[&amp;amp;.8\H=R&amp;gt;BAT,0^!G%/'@:,'!6FM"R4K446K$75H,&lt;br /&gt;MJ=H+RW/O[I2&amp;amp;6P`I250?6I-[3/'_MO&amp;gt;O:VT&amp;lt;V0(P/'_IYYE[J,C$2$0(A`$G&lt;br /&gt;M8'D'"]G6'@P,@L39QA%":D!C2:U12S:,XWT3[W=CWWM%[SK5J=42V"8D&amp;gt;T::&lt;br /&gt;MB&amp;gt;FNKEIU7K76JG5HP4D[0&amp;amp;Q!C*'8A;%M"!!*N*!Y/?5ZT0BP"PH!Y1!FXR,7&lt;br /&gt;MXZE4C-&amp;lt;@`)(PF??)(DW;04&amp;lt;`0H&amp;amp;9]2&amp;amp;[@-MA"N2LP(*D:Z)&amp;amp;Z2PFPD`RVC1=&lt;br /&gt;M!"&amp;amp;Y8&amp;gt;08#3L=?7XA.$7,;J3&amp;gt;M\,/"9Q(4"R%EZU&amp;lt;-4-"5YO:PX(YLH=HM:5E&lt;br /&gt;MCGH.H&amp;amp;T!&amp;amp;\.'?*2;E&amp;lt;"#SU*"GC?D&amp;gt;49B'@;2O1FG$$B5M&amp;amp;6G,P&amp;amp;LD`/*7&amp;lt;M-&lt;br /&gt;M*&amp;amp;^7A0HDDY/3Q*Q7JM-N#V)&amp;amp;@S;2`O"=_$C$H0A&amp;gt;:("0G:0B3`Q-W)IY.I=0&lt;br /&gt;M]D#N(AIQU`-H),I%TFA`%**E.S!S',+NPW6&amp;amp;%&amp;lt;1"[W5AC-\C'T8F&amp;amp;^X&amp;gt;Y)E%&lt;br /&gt;MBH&amp;gt;V:![E6"2KMOV,X&amp;amp;@SS3=^*OPUU,7&amp;gt;^U6CT'DT-`6"Q**+&amp;amp;UUG5!KL0HMY&lt;br /&gt;M3$8QS)JT8^]0"9*'RI@9H!Q:#$,SA5)*8Z'`'P$6`%MQ"/-Y3`1H8CAFIXF:&lt;br /&gt;MD`AP:@=2C28R1W1:L#@$$HCYY&amp;amp;X-PHO&amp;amp;H`6'`&amp;lt;T_%%(?\)AFX=@1%,P[UP3D&lt;br /&gt;M=9&amp;amp;H3X,P99SH,$+"R)'_$:$:#P-7=`39F+L;X(T&amp;amp;4`'46!8$0+XM!;-T28R#&lt;br /&gt;MK8K8&amp;amp;W2`.&amp;amp;#V5PO.6#:$(HQ.ZF`[#%0T`'*N@](,S4[%J:0`]+G:0]:BS;&amp;lt;Y&lt;br /&gt;M7&amp;lt;1TC8L+'"4-5G@&amp;gt;[@&amp;gt;.2AJ@($EK$8*DQ"F42`[?&amp;amp;^I]U!FA4/\&amp;lt;N-YX&amp;amp;`V`&lt;br /&gt;ML5()&amp;gt;S^A?2T6.AMH_.&amp;gt;TCM$FK6GD4E)/N4?32?5D%Y*M1Q:2#U--_JRBG8N*&lt;br /&gt;MSOZ!,A4M`T&amp;lt;EX]&amp;amp;0\`TY!!P_?X.:WG%%:L.J(BIJ$A$%R`!%9K*G6*0!(V#I&lt;br /&gt;MI^TFG,E])%?($ZG,!J:A!C\\#%BF3`=A%W8&amp;amp;4%!+&amp;gt;)AC(YF`LDQ(7O:\WK6N&lt;br /&gt;MY]/)E""?-7YW:()E\IH`+&amp;gt;HV!FU8_R,M&amp;amp;+)"0CQTF!K;@B',&amp;amp;XILO&amp;amp;&amp;lt;-LY^(&lt;br /&gt;MY,ZC[YTV@],JQR1_XWY=AXT!7=18MH(()$((UWDAR(6"ZN%U%@N@&amp;gt;WRA1X21&lt;br /&gt;MW'!I#@%/OW"@:6T9.'&amp;gt;]YND4YK$G",D1=\[HY.1X\T"$'Q_`MYN#R&amp;gt;///?F"&lt;br /&gt;M.6A.6EVHLS_H,J9P&amp;gt;%:B3^5@I@GBLS]Q#S6ARTBCD/2LT8&amp;amp;V]!B?"1DCU[8L&lt;br /&gt;M'C@G\6$/*5'$E,"VC8D[M!@!#STL;]KGTEHW;U[JKR%0&amp;amp;V;5(5L.XS)@\8ZJ&lt;br /&gt;MC&amp;lt;[TZ7#&amp;amp;HU]`7Q.7_@79N44J+!'CMM"U($]'UYR&amp;lt;F`DOXT12ZW-F,)YT(_J&amp;lt;&lt;br /&gt;MF`:WT2R1,UN?:P^H=JY2W\&amp;gt;,M0O2H9(1\DIMR[4`9]&amp;lt;9Q&amp;lt;29-.(X:K:U0`RV&lt;br /&gt;M0`,7?GC&amp;gt;[K59UDH&amp;gt;O#@_X^%!N\\WRGA@!_K\PL:U14Y&amp;amp;9`];1S1&amp;lt;PL'V"'KY&lt;br /&gt;M$B;^/0XZTG:!MCL*-3&amp;amp;;'^N/NUWHB@]/#&amp;gt;TA%[I"EX-&amp;amp;U&amp;amp;.(6K=8%MEV%A&amp;lt;*&lt;br /&gt;M9!BC,^)``IRGG-T)W&amp;lt;8_B`+HPHHFZC3+/&amp;lt;06OX-E'':8-(D1C&amp;gt;&amp;gt;DAP&amp;amp;&amp;lt;40-F&lt;br /&gt;M6L6`@H1,B'C]_B.G!*,ZZA'=0FTV505"MC=DAY*@V1\]..3/QZ@%!SJ26,X.&lt;br /&gt;MP-L:D9/10H?V!0"=JA:%#**.&amp;amp;W(53:N!Q-1"U&amp;gt;I2"LEU0,W8R@2`L=6GR6TB&lt;br /&gt;M1@D8?!@1G1\':62EAR7%1[9V2R&amp;gt;X73N^8R%GMP],DZ-4X@!)B(N&amp;lt;P&amp;lt;!;`Z76&lt;br /&gt;M+,V`JX@%02RNR:/%=D?3K[XS&amp;lt;I&amp;lt;^XI6*JS&amp;gt;\0B_C,3%0&amp;lt;M1K=.Z0*GB;B0(F&lt;br /&gt;M6!7]86#\SIG[P93J)]&amp;gt;.^!/OE7@-TEV1[Q,&amp;gt;3Y$V3J1W[YG2K,#L0SW`2$+3&lt;br /&gt;MI9!!KBRSHL'0U^PTO7A":`K-D0F:^S&amp;gt;MN=`&amp;gt;6/4;TS#:.MIK.^%BW0#@!QOD&lt;br /&gt;MF5:=HR4^H;UV`YA'(O?6&amp;gt;&amp;gt;HT&amp;gt;^=RF[@D^\,$#Q:W42BI+Z=IZ8BZ!2%;TWTD&lt;br /&gt;MBFF)XQWF!;+X++;UKW)%I`&amp;lt;H?,+$H#QH&amp;amp;"?O/ECW!CG&amp;gt;AN;*!G1)=]D^:ULO&lt;br /&gt;M\&amp;gt;;V7AC%\?XP'#A&amp;lt;(KR;/KOFBS&amp;amp;25W@$=D)XGQ4!XT0A&amp;gt;XZ%.WCAV#2KANMO&lt;br /&gt;MB%#7F^,A$;!X38T21ZUF]#D7&amp;gt;]QBT_P@,8@)%D=4'38*?(^"BO%"H$PC]6_H&lt;br /&gt;M\=!5:DAL(%G\R"+KW:A16J`ODN4+:XKP)O9EB&amp;lt;X%OVX7[&amp;amp;["14.\S@XG7(9J&lt;br /&gt;M%0I!3VTX&amp;amp;41R&amp;gt;3X:T'V5IW`B/)@5JB\HPVP*&amp;lt;A4$0.L:AN*2KK@*@;^31$.%&lt;br /&gt;MJ23@;.'?)LZ3W8%RI&amp;gt;2@8^I'@B-[7%#5&amp;lt;S[829P"6]3&amp;lt;#.`A`%S[/T:M"Y+E&lt;br /&gt;M,9'B&amp;lt;*=\YXQ&amp;gt;'?#$"76F&amp;lt;YE/?7^`\AJ5Y=MF#B&amp;gt;!XJ:&amp;amp;\-OQ*(QS^&amp;lt;!9A40,&lt;br /&gt;MTSC20L"UDQ7]%^P4MPHH/Z)(@%W6%5M,G=/G-*KZP389"J5OJDCLD3Q?M_%&amp;gt;&lt;br /&gt;MQN,"A9]8KSD:)Y=EE0O1?\+BKDP_$FH\1JT=6%YQNSOJP#8-^;*(+S#@#+D0&lt;br /&gt;MNM)B_&amp;lt;"]MG&amp;amp;T]4*82Q*_.\7DZ!^;1"2]]&amp;lt;*&amp;lt;L/?DVG]&amp;lt;,ZFA9]=HST2C#A-R&lt;br /&gt;MK".J!M$UL`G72Z12X&amp;amp;QNAT[0M0#R8[(W(C6&amp;lt;R%RPR14+F_!VKEEL;]ZTLUOH&lt;br /&gt;M!W&amp;gt;1,`\Q%J+RB8L!6J6']PP&amp;amp;"8EG%D2YYQQE.T-DB#?J`SRTC#B()GE*\YF&amp;amp;&lt;br /&gt;M&amp;lt;RY]Q@12\'@9=I"29F88-&amp;gt;EZO"E#HO+XZ"40N!F;HTX#,&amp;amp;U[T!QU8\+:C.'.&lt;br /&gt;M&amp;amp;AV+PD,7O*.)&amp;amp;K!04M^GZ$S.M41"&amp;lt;U44*'N\A`*W6KQ!K7HBM_YH0!@L1&amp;gt;8&amp;amp;&lt;br /&gt;M,S.2\YG&amp;gt;&amp;gt;-&amp;lt;[VB&amp;gt;Q5:M`03\LU6N1GI&amp;amp;X3BOJB:R.!0=MCJ6"0$B:S3FW_,HO&lt;br /&gt;M&amp;amp;\+18.^&amp;lt;%NI;/M&amp;amp;DP4Y?#`3B4-0P+8/M33$3_7DC7PTPP@MA$C[B^ZR&amp;gt;H5=_&lt;br /&gt;MGT3R.&amp;amp;!*O:)Y#"/(;U5R`C((AVW-6$&amp;gt;J,:SX![S"']`=)&amp;amp;KWC34I;`76M3-L&lt;br /&gt;M2N%)2!M1\'G48X%W3(B3]%J:#L_6&amp;amp;`9&amp;lt;:$N$J*.^N&amp;gt;XE):KE5M3C"6C!Z=,B&lt;br /&gt;MS5)2M5+Q):T9)`;I&amp;gt;/&amp;gt;$!::MNGT6&amp;amp;4DC6?W$Z$L(&amp;amp;I23D!'Q9=0FFO`HL6O&amp;lt;&lt;br /&gt;M9&amp;lt;IV[]!0K`6E^Z3@]$&amp;amp;8Q#,8AO`];X"S&amp;lt;/RTXE,U'HZA9V(BOB_HR[6DG&amp;amp;)9&lt;br /&gt;MM%X3&amp;amp;(N&amp;lt;GVGU";P^T,JAQ!B1LS[A3G&amp;amp;MV-5_=FUOMEP^G7&amp;amp;T)4?&amp;amp;=(D0*Q+K&lt;br /&gt;M%7OM&amp;amp;&amp;amp;&amp;lt;#"*,W6BV6.^`B0+&amp;gt;`(6;O7](-NM=%1^D%SC6^BPL8$9NNY%DULS'T&lt;br /&gt;MBWKF`"S.Z1$1T`56(+`#P:AC%$L%80N/Q!Y?3J''U[R/BX'(CV`'XQ5)3`C=&lt;br /&gt;M:2+L&amp;lt;UB56L`HUX]G46M,RX"(EQ\*I`DS414=1TIK7PS"]VVZO&amp;gt;4I1Z5F[80A&lt;br /&gt;MD+F?H)+.-`!2L4-V.0_=JV'?7!BT&amp;gt;7!AP@G?1N0.;8_[[0&amp;amp;IK6LQ4XP;5TJP&lt;br /&gt;M&amp;gt;02V$.A.5%V``JT0EEB'4#PK'%$51H.2KSE@(9(*)!'7`@RG"N6K*&amp;amp;_$*80Y&lt;br /&gt;M'D&amp;amp;G$2_J'+U1]RP&amp;lt;6/U0S1N3-.&amp;gt;&amp;lt;G4_Z&amp;gt;&amp;lt;&amp;lt;8"4:5CD*=G+091-ZHJ#70$#)Y&lt;br /&gt;MR\71D:UU-*SPW!&amp;amp;@^@2U5A+3-X2Z4=%`:PUX5&amp;gt;D)MFIZN!R"E.4PUG=[H&amp;lt;&amp;amp;#&lt;br /&gt;M&amp;lt;)TV!(E+LFNCPQ)I.E\70=XTO35I-AFLNK12T,2CUD%U=@?1"F/Z)Z0+Q_C7&lt;br /&gt;MU4*-Y?[.V\$)HII7&amp;amp;MT12]`&amp;gt;]WP(1(&amp;lt;&amp;gt;R7?+20MI:$X!&amp;lt;Q_IHKD;1CY1W:3]&lt;br /&gt;MND4F'%$W)%OJ@,X#(V2,C&amp;lt;:SF&amp;amp;G@(4;CKB._P9)OV;:@ROA%U.C0[I;0&amp;lt;GK9&lt;br /&gt;M,5G`\4YP34%Y*P2@)&amp;amp;WAX]G-,*2H&amp;amp;QF&amp;gt;'2U_6+&amp;gt;A!0A&amp;amp;CA%3A,,:`(=J39WV&lt;br /&gt;M]DT8.IK_8D$]JY2WCVL5=?2RHG3PK&amp;amp;I-:\7NJ.&amp;gt;'E8K:?Z[*+[&amp;lt;/7U3RF.^P&lt;br /&gt;M@CE&amp;lt;6*@CZP"`7/OT7GE]5-D[4@&amp;gt;5PU?5HR.`]NP7M7UP`,"WG^U6U.[VSS":&lt;br /&gt;ME=?ERL&amp;amp;1^OEE92_81_`_5Z$]&amp;amp;#&amp;lt;&amp;amp;"E3WU,^'U2.,=80`41'WL/KBY9%ZN;^+&lt;br /&gt;M3HE1"7&amp;lt;9:J&amp;gt;"'.^N4@N@'3]5=_Q.9;9KT.R,B&amp;lt;FG&amp;amp;X^=P_A\?ZON[&amp;gt;15I4J`&lt;br /&gt;M*J\/#BLUZ'\`L*NOH,45^%C=*^\&amp;gt;[Y`B\#.`L+=_!.,$/8-V'NW3T.B\&amp;amp;CHT&lt;br /&gt;M!N`'R5!]J#GLQ&amp;gt;I+B]2G&amp;gt;`@!"`SX8;7V-[5="V1@_WZ\;0#!Z#['&amp;amp;&amp;amp;%[99JH&lt;br /&gt;MQ$1B=]4O^\=X:D"_=W&amp;lt;P0Z`SX$!5U$[E&amp;gt;:5\5/T)IA=R0C6UXU&amp;lt;5&amp;amp;&amp;gt;_:$0W0&lt;br /&gt;M[J[:JY2AO=N'OZA:Y?"G:AG'(3BL'&amp;amp;Q78?A11_KP$*'L[S%N62W@Y,$JJ?R$&lt;br /&gt;M:^!X;Q=[&amp;gt;UCY^S'T)V4E((SM%[#:&amp;lt;#"=&amp;gt;0]^KD+E.$/)R&amp;lt;]3$?A@)_\76$;[&lt;br /&gt;MZM7V+ZR8_8LL#VBFT=SV5P4L"KLZMY_MXQ@\@_94J5G0$!P0G**=[5?;+RJU&lt;br /&gt;M?&amp;amp;`6`54MRN1Y53NHE*OX`-]AZ&amp;lt;%&amp;lt;[_*HP"[Z^S'.(B0($+4-TXE=PW4H4X9[&lt;br /&gt;M$-?:GEXC4'=R7V9MW8GUA^MB=[^&amp;amp;BTU1"#MJ,?Q]5L'&amp;lt;A^BT_)"VTW:Y?'P(&lt;br /&gt;M6PMS8`EH3&amp;gt;T8-EMUCR8EP/[2;JX&amp;gt;[NC]1..LGF]7=X\/Q]88U+P/0X@@::V9&lt;br /&gt;M"=&amp;amp;+K);+TQI0U&amp;gt;=05?FES)[R=NTOZB5,Q;,*9-O&amp;gt;^:F*F(?KP&amp;lt;!VM:J,R;Y`&lt;br /&gt;MD'$DQ&amp;amp;9\AV/^%`7^_PQ3]X3]MPX+=Z=UW.S_*&amp;gt;G_80V&amp;gt;9O;?]_'SYU\&amp;lt;EMYQ&lt;br /&gt;M'=/GO[B^]GAUW/Y_;3;_]_%[UHB!9ZPZ5^E!:&amp;gt;Q'*AURN:0)Q';3OX#'E\&amp;amp;H&lt;br /&gt;M:2W=B,&amp;lt;]-2[M%U!&amp;lt;`Q0KW^[K6\J83=219R3MCN90Q\1"'0;T'8BB*1;8+%E5&lt;br /&gt;M2&amp;gt;-4D)4$6J.!OD00!0%DFDAK-A:A@4!%,1[9V`'/=*K]X"Z0KCWRI28:FN9&amp;gt;&lt;br /&gt;M^HWF.[3906DC"3!0KTH@D&amp;amp;[5@%5_3@N7"Z(P[M@5)=L=6*T'9`&amp;gt;,+2#J31!,&lt;br /&gt;MY&amp;amp;:]84H$*%/&amp;amp;#!:U2C'8F,@:SD=#,H$E$34WC\3_9%`\]`,SH)X1Q9?4P,G#&lt;br /&gt;M[X((\!KO190#O,&amp;gt;H,Q2#ZIA&amp;lt;@_.=0!\U(T;]`&amp;amp;H2L'3OQN(T\BNL`7&amp;gt;BBP5W&lt;br /&gt;M/+1^@YCS!%F.&amp;gt;DT.)T4[IQ6&amp;gt;C2[(\X*S='*\H(3EU,;7K4B-&amp;gt;J-XU"#E]=Z%&lt;br /&gt;M:`I0%&amp;gt;[DH6I)B-$2AH-K9!8EQ`*:5J$*M+M$62S/[D'UU0W7A%JRW$=H;"=`&lt;br /&gt;MEI0U\YUE;_A2D8*P:$-FZ)1]*RX8&amp;lt;V*8012\.,K`VJ:D%U[A71DUFKE_G!CT&lt;br /&gt;M8="/4-G9G[?`&amp;amp;`KH&amp;amp;&amp;gt;/[W=["T)CMHNF-%0(,PF[$=M$4!$\N/FF_NM/'`0\7&lt;br /&gt;M2"8;BQ($+RUWR#`TO-:+"O!B$W*&amp;gt;XD4GYEF0:T:2PM&amp;amp;\)6$[QOY#'0HP:--]&lt;br /&gt;MG`VPYU7(CAT:*&amp;amp;-RQ"D8,M#6*BI4)!N/AW3KXJT-BOE+BP-ZMRG66*?-UH*&amp;gt;&lt;br /&gt;M0HL($F:"4HQ&amp;lt;4SCV5WBI&amp;lt;=UGI3M`!LM.&amp;gt;_GF0!:=`T*;YVMYM+F06Q@('.[I&lt;br /&gt;M:3,&amp;amp;W$)27Q7!ZG1Z7&amp;amp;-!]D\RM6R6(+O#:4Y\J;P6Z4B*0VNKRY6PR'!P+:XF&lt;br /&gt;M6-U'0W$!D/J0&amp;amp;("H0S')&amp;lt;'.@@Q.^V&amp;amp;F3*M;/^%&amp;lt;;;Q#"([W]F)8U@^G"EH%A&lt;br /&gt;MB8VA`HMLSF'%`&amp;lt;A8;@=H;XH!B#:&amp;amp;.H*NZN")Z2A`:_':G/KP6F#A%3OF=53\&lt;br /&gt;M8G.!2&amp;gt;Y]C2T0MU4[B[$B,5'W(;3,V\O5%R0%L+98$XFJ$(,T-_XJH4[K+$$4&lt;br /&gt;M#5WW:8C9_AZ=\N+6"H*R8%2&amp;amp;O,\BIY037!_BY`F%UUML/')K+!HY$BM7V2Y"&lt;br /&gt;MY9K&amp;gt;.ZW[1L)O[V#GL\J()&amp;lt;GJOG$&amp;amp;"+9@W:&amp;amp;0'JU3*J"#L-%QSGOG6$&amp;gt;;]W"H&lt;br /&gt;M!59=C43#WOOV(.J1B8=2QS&amp;amp;IF:EG,&amp;amp;J]&amp;lt;(ETV8:D7$!G:-[W[M$P5OIN@$WX&lt;br /&gt;MYUU(PM)-GH)RN=3\_@=5%E_]^ZO`*C^#ATX_BMM7[D8*@OV!,E=RHF-G9,&amp;gt;G&lt;br /&gt;MT-8%ZPC#:4I[2)4JIU+(J\H'!U)G=7D4#Y8I%MVR:!^JW1T3/,!K`B\`'"&amp;lt;4&lt;br /&gt;M=[X"_-_&amp;amp;^[WM0?.RC7&amp;gt;,N'72UT/:\M"3E;*%Q*N15G-&amp;amp;X@=6!(5CQ=PCE&amp;amp;TW&lt;br /&gt;MQ,,&amp;amp;ZN.A,#1/MTR=1M/HW7M+WWB?&amp;lt;!HK,]T&amp;gt;!-&amp;amp;'GMT#[%F@Q::ACI48F=MY&lt;br /&gt;MAX"@`;I7'/7QYIO)F5,*464CRN;%"BDFVWXN5E#N(1#8'?B!S+GL297L"AF,&lt;br /&gt;M&amp;amp;.5()FHC'1%WPGXI^#C5UPTB-*=EQY[/$KT5;.-HW7GH.6;KWQ8%OBT4%CSR&lt;br /&gt;MB5=H)$/GC)=SKY`R&amp;lt;($=.!?*I)6"Z\.;5]38H$412`=2&amp;lt;1WJ,*)5O*U#&amp;lt;+-6&lt;br /&gt;MP+95!,DJ\M0E1I'&amp;amp;F3D0**3)ICQJ571]6+'`A4'&amp;amp;+0Y7L]?HINX?&amp;amp;M!GZ(#@&lt;br /&gt;MO`%[+I\\5,2WAG.L&amp;amp;+J!5TR[%YPZVQP.B`4`XJ0`AL(HQ&amp;lt;.F@T/-?4\O\'@O&lt;br /&gt;MC@_FFO,[D(A$`^P[=D23,C&amp;amp;5/S4AQFBJ"QXNT)4:^["4JH5?&amp;lt;T=R26[HFLX6&lt;br /&gt;M\;Z[IF^4Q1!`0?*L&amp;lt;"_CH*WDG=]M&amp;lt;-Y;&amp;amp;S3VL!0"BDG7L-KR,$3G0K(WF,3P&lt;br /&gt;M#OL.N?AJHW+)CGN^\Z%-8^O0`E1+/)2ZA&amp;amp;.Z(`49KLML.K=M9F&amp;gt;UA_9,8%-7&lt;br /&gt;MTQ:VVS7KGLVDZ-9\.&amp;amp;B8N4;SUW-Z$H2I&amp;gt;KA6;SG95)49P\/*\^KK!83I?&amp;amp;3P&lt;br /&gt;MI=KQ&amp;lt;_P(O6'J`D[LYT*2C&amp;gt;\+2V-(AY'.9I7DGE;'P0E$.\APZ7EE^^CX$%@B&lt;br /&gt;M37@,H\!I=%[0KF0SFJ,Q4&amp;lt;*Z,=KPT*/VCI#!,OQZ6A-P4)&amp;lt;D)*)I@*Y1TM&amp;amp;[&lt;br /&gt;M!-WKT8TTG=FG%[W14B/FL;I:X+@%6/5K]3.T#^@&amp;gt;ILESK$4;6*[ODEC+KC0"&lt;br /&gt;M"4L[$`NTQ'2KG/$04^)`+Q]$8A&amp;gt;]]K_$A02=^6:DM:%P6GOR/IL+`T@D7^&amp;lt;Z&lt;br /&gt;M.&amp;amp;^+0M9K;&amp;gt;G@;(9KO7G=PXE5`,C3!AT9P&amp;amp;CFC4Q"U^]6I[L#';Q:DDKBTD[U&lt;br /&gt;MD/H=4++9?)S.&amp;lt;H:FJ+:B=G?4-%Z4:OQ%$Q7"!2%M/X72T2PN!K5GKS?$41OV&lt;br /&gt;M(CD^&amp;gt;`Y:24&amp;amp;0,@+(:&amp;lt;6LE\0JYZ&amp;amp;YQ+UF0\++*!ZZ"S,@I(%B&amp;amp;Y)0'?,4C%5M&lt;br /&gt;M&amp;gt;$4D64=#=[R9:PH:FEMR?/GH1K,T#6OEZJ$M&amp;gt;::^V[R88+SQ2^GHEP.S]'&amp;amp;Y&lt;br /&gt;MPBL!T0I"%*3C$N-X(&amp;amp;8QT@DF=P.&amp;amp;JVFHTWC46UO(L_&amp;lt;&amp;lt;`!+U2*6'"HJ-!#F,&lt;br /&gt;M;(&amp;gt;=EJ&amp;amp;T#XZ7RONO#K;W?EFJ_5([JKR"J0W%$:$K1HI'9PO6X484LP*Q\`UH&lt;br /&gt;MEH)$)(%FTVVO7!O7IW6JT^YY[+]K4ZTWF:SI0'/2VN^;'4^/GD*)*`4P\B1&amp;lt;&lt;br /&gt;M'-V(.*D!M'BIJ&amp;gt;ETB_81-P5FORPM21QK=UIH'X3D8&amp;lt;Q=5Z+`1F(D4N#ILXLR&lt;br /&gt;MQRI+-C6`I;;=`FJ0M"?2G3--3W#4-=$BV&amp;amp;$::/PX&amp;lt;$=)2W@PO+H032[G-TX&amp;gt;&lt;br /&gt;MQ\9%J44N1G0;HUJ&amp;amp;)RC5DB&amp;lt;]]9!!J%IRG!&amp;gt;DU&amp;amp;FY34;MY3*28"14JY-8F.5]&lt;br /&gt;MIWQ*P@GH-K(314*?G_+QN4QM7?;JYST;7@$Q*LK.@&amp;lt;X-A-WDO*@J,K`+)1;/&lt;br /&gt;MA:&amp;lt;2K:U6/8*Y='AATQ4MOM+8TFCDTG@QVQ%LHX,)E,-L:K^VJ&amp;lt;.//13+0Z\X&lt;br /&gt;MT`$A"Y)5F2WS)A+(+EA[=/$&amp;amp;-PI5]O`WENHHEFT/Q=2-SCI8QS0Q2S@Q)0Q4&lt;br /&gt;MM\!(Y%A4S&amp;gt;.&amp;amp;&amp;lt;2%IQ-:LJH5B:]CU6,9(OF"U^Y(ZD:6BL@,,-N5%.L$$ZUP0&lt;br /&gt;M4U0VPR6[W`NR`A9Y4)K4FIL-B[0O;3U@5Q6`-+O=AKUC&amp;lt;`;`HWZ8J23I+,#Y&lt;br /&gt;MYZ@=#A?P*6ZC=1P^_E,`[[`Q#[O",'(T.1K$21PSE(2L0C;G1DLU@L&amp;gt;1AO'&amp;lt;&lt;br /&gt;M97"[&amp;gt;N8G"SS;#F^NH*0]S&amp;lt;:EA23V,$&amp;gt;DZ&amp;amp;OJLMZYRNT1;MX;-&amp;amp;R)P^5OBZ37&lt;br /&gt;M"*:-I#A!&amp;gt;XA8C9:N/Z(NZXU$(ELB,&amp;lt;''U#X9;)$&amp;amp;--L]GX\Z&amp;gt;3U9`.&amp;amp;/OKF[&lt;br /&gt;MFY]__ZMOQ`J-[AW60?&amp;gt;_:Y/O_Q_AG2_'?UG96*7[_]G][SW]'O!/O0-,%W:B&lt;br /&gt;M/O.UZ%)/=!^9,AH,O_GF&amp;amp;Y4]"P')Y1Z8'Q`!'&amp;amp;]8E91922H(*J^/#K?KJ#KE&lt;br /&gt;M?BA@)?W!/Y2$&amp;amp;='N,951.U&amp;amp;B@*"8;5)'^SO[`.[S&amp;amp;AGV6DX3H9%0W3X&amp;amp;9JWO&lt;br /&gt;M'[!KSA)BM[!]T?LWV&amp;lt;1?\?/W/X[WW=?Q!?'?BANS^&amp;amp;_W\IOM@/_LG[__T2$$&lt;br /&gt;M1\&amp;amp;^RSIN.O]7UQ_]!1#$^LKCE0W(@&amp;gt;&amp;lt;_((+9_K^/W_(B\N](F(MGO_)WWUDI&lt;br /&gt;MAA%7/]O?WU6+R\$#-.PZ5R^W?ZK4,2W0*3]5#FODREK&amp;gt;M0@U\"JPZCN7'%:#&lt;br /&gt;MW++%EO_CRR1;41TRU6O[QX?ER@Q3_1Z_Y/ZG*Z-"=^TNZ[A!_W,%J'U#_Z\6&lt;br /&gt;M.?[CVNS\OY=?JX&amp;gt;NB_6L&amp;SZZE;B/1BTOSJ6*A;4@P&amp;amp;+)R$\_K%'DI_6E[^GO&lt;br /&gt;M#S=%@$(89%A+PEX=4TB;(6U-M;FBPAP28]33[AG&amp;amp;0V)HLTG'+AB=\6%ADDJ+&lt;br /&gt;MOT%4!?0&amp;lt;99%G"&amp;gt;TYAK@+&amp;lt;&amp;gt;Z*?`8;95$D*-,%)XB#ZPU*KKHOT;$@NXT:&amp;amp;KLO&lt;br /&gt;MD2@0#!3P:_LBM(/0-D9Y+=`C/#ET[%K9F\N6;CY!$8]&amp;amp;Y(6B0XY-M&amp;gt;?9Z%PE&lt;br /&gt;M38F@ZYXE$4%(L2;"V-^[*!_=+M=%_O@2F#.THL%6)]066$!+`45I6M'??+F^&lt;br /&gt;M4WE^O)?=?I4`$+R!;P&amp;gt;'E&amp;lt;/*W[-O5@O%U;&amp;gt;Y(%E+]LU\$9*Q&amp;lt;10MR=.'-&amp;lt;L5&lt;br /&gt;M5&amp;lt;TNPP:YUO@@CD-'_986"$E86VF1O^Y@-MLMNI#GK'ACX8BG8M$8PEJE"@*@&lt;br /&gt;MG8"9#&amp;lt;,A.3B,#,Q_GQV(\M5AOR'W0.?M`3QE-C,\[&amp;lt;;/:");!Q\RRYD"#@&amp;gt;L&lt;br /&gt;MB8/C(QB55Z^V]W9J6=:1_.&amp;lt;H&amp;amp;H;9)T_R3Y_F`%30/D&amp;gt;O0ME^8QB/SN(A?)DO&lt;br /&gt;M/GV:5T^&amp;gt;O/E5O&amp;gt;4GR,I_\L&amp;amp;3)^3*8.E?*@,YGS[UQKR64;_]IL+F)=L-\VP^&lt;br /&gt;M52FP?SW)OOEU\^WB\DGNOPJ+G'8"WW(RXE@9M(YK;'3K[5[KJE0,2*K&amp;lt;K?.^&lt;br /&gt;M[RF&amp;amp;MZ5:4:#(\EIE5$JK()5\92_*5PTAL_CD2&amp;gt;[I4Q+UC37ZE%*\_+\I%!HN&lt;br /&gt;MA6HA_G:SL/CMMPOR\N;7Y;&amp;gt;+\_!^*LV?ER83Z*TM^!/&amp;amp;C2;\T5TY1&amp;lt;=&amp;lt;,H22&lt;br /&gt;MEE'?J&amp;gt;)IT(IZH&amp;gt;E]+G`G[4W^;2X':QHVUDYD_.IIQWTDVT1E$HFEAEX@!RB&amp;gt;&lt;br /&gt;M'/)E(2GI#*,(EEKS4BTM`10263H"7J-MBQCHG'5,W&amp;lt;LM$S%*![MZ0+Y^"&amp;lt;_Q&lt;br /&gt;M=1EL8ZRKH&amp;lt;Y@U;?@A=``H#U4V"LRWCM&amp;amp;*?,F/&amp;lt;+.KNY5C^I:T)+5MVO&amp;amp;:/Q-&lt;br /&gt;M+UHBY?&amp;lt;0.^ZB!*\@HP2Q]&amp;lt;LR&amp;gt;MA_41&amp;gt;I$!05LK*$6`'!U(Z?U8ZRDIH+A`J%&lt;br /&gt;MSZO.9TEE+$+KGBZBB")EX3?,`CK9O+::NBV,0T9Y,Z?-EIJ7?`\?JOZ'UFE&amp;amp;&lt;br /&gt;M?5."#_P(:;R9SG6V90]+;?'-CT(,^JKVHEXY/-P'O&amp;amp;8\@!I&amp;lt;,]:&amp;amp;+;HKSO@:&lt;br /&gt;M31D$-Q!&amp;lt;`D-RWM:;_\W\H[?YO(QN=:]2/][[^_'^465'#U!&amp;gt;9&amp;gt;;E,0-S@LI-&lt;br /&gt;M[`^)9HNQ;[*H#!X6E4&amp;lt;L^M.8R;T!0E#L%+ZJU[9ABG^IEU]6RG][F_A:KF\?&lt;br /&gt;MOJB+P9_@^&amp;gt;?5URCZX]6(`35@)5[@)6HAH..]=U''^PJ:ED:SWAA=U9VI":#&amp;amp;&lt;br /&gt;M5]4:FDD2W.QV&amp;gt;7&amp;gt;_C`:60L#DU;P#)C&amp;gt;&amp;gt;']8B(IZ\TOKDMRE!JU=.PW?A;4KH&lt;br /&gt;M4Q3+Z+-K&amp;gt;BFLH[KW?#]//D?0D&amp;gt;I8B93-0Y+/6N7H+&amp;gt;,&amp;lt;V,=ELF\8#P5(3BOP&lt;br /&gt;MMMB[6T0EF$8/SLT'_L9UIY7W+2YN&amp;gt;H469]\8UU&amp;gt;3($)S'JC_Q@,3_9,TT$]Y&lt;br /&gt;M!T.$%(,Q+(ZS@'N,S%8(;9[&amp;amp;X9#L=O`Z[4RN@B,\_-GR`&amp;gt;;Z[$S\W6HK&amp;amp;,JU&lt;br /&gt;M$`.`QN""]+O(+0ZV8`C[;VE7SF=ICJ.VCZYE-0)N(":\[J)&amp;amp;]!:C7JT`3-$$&lt;br /&gt;M/H3HN^R"=+&amp;amp;LJ\^HQ:XXZ/*&amp;gt;RF(SLN$%4;C/:CN`&amp;lt;H&amp;gt;C@;AV=;.SR@4567"-&lt;br /&gt;MBZ"X01VY`F*K+!Y3&amp;gt;%?\6IUV8NC.,(&amp;amp;/1H/0&amp;amp;TFU^E29&amp;amp;\Y3+&amp;amp;UPWIOYMW#,&lt;br /&gt;M`HY[G3'H"W\/&amp;lt;)1:[189E\")I&amp;gt;.X.M7&amp;gt;5"M5!$AKO#K$J:]O*)U1)U*E1KM&amp;gt;&lt;br /&gt;M8:][8Y!T7TQGJN=P3K*Z"Q"Q&amp;lt;(2V1"%$1RV#$W`0O8.$CHYM2M&amp;gt;9EXU^WQF3&lt;br /&gt;M]GG&amp;gt;:A:25RQ]4_^RLKM+;H`:\:7XZH=&amp;lt;4!^:5#4,`%,)'`+MAK4*2"B\4_WH&lt;br /&gt;M5$HO1@.`&amp;amp;T14:(U#,(HV1].X/_-MC3*X`S-Z^OR3B6&amp;lt;1(38XA-=YH]TA!U).&lt;br /&gt;M-%@=WF)HQBC@MK?9![;;=-CI/.?XQTS:*BXP;V?#UUR@5]L#M&amp;lt;_+:S/`TRT8&lt;br /&gt;M:V8O_&amp;amp;!8CI9A(MDM$2G!NIP8Z;%]$S#J&amp;lt;ZQN$%$TW_$Q.NCB&amp;amp;:Y;M!A(=8&amp;gt;5&lt;br /&gt;MVO'N4?8ZC`F#"L'C8&amp;gt;:][5&amp;gt;`_8T7BYTJ&amp;gt;C38/_PE)\R&amp;amp;M00A!H&amp;amp;]C*%C(NV\&lt;br /&gt;M2YEK[X*'9-U:4I#LN;BQ1.YA?A7QZ2$0##3"'FH41&amp;amp;6\_B`:NF1.U,3/"`&amp;lt;#&lt;br /&gt;M"O^)Z-%S#2W3?([,M[C-1&amp;lt;)I".,\8(=3C(B0(X8&amp;amp;R!MF:!,CC@8`9"]),^.V&lt;br /&gt;M01^PN&amp;K;%Y&amp;gt;,Q&amp;gt;97[6#DU!.+H92#K0!U/2Q:S#1?+,VO.BM$IHR:G#/+!W)E&lt;br /&gt;MYA\MRXD)`Y89+R(?:3T8`G*^2#/_1\MJ?H^?+__3TO]"NW&amp;gt;'==QT_[&amp;gt;ZMF[N&lt;br /&gt;M_XJ87EQ;+\[D?_?R6UY4SJ3#1GPQ00)(1Y)KO$DR04.[0LG%99+V)[@*1YCO&lt;br /&gt;MW@E,9""&amp;lt;_.9.X8\&amp;gt;I'_C7]K^A_F]TSIP_S]^O)Z^_XMKJX^-_P^4__/]WVS_&lt;br /&gt;MW\_OP3&amp;lt;*C8^6XTN4\+P@W7%'1W:*YP5R?\?R7JTV1J*D20A$[+:UYI[6YELM&lt;br /&gt;M%!\I9$J3MPFK&amp;gt;?7#(_AO#?Y;A_\V;KI/0-:6*73#.8AR\&amp;amp;?&amp;gt;+3RXQ&amp;lt;V"YX?;&lt;br /&gt;MA$F5@.D/C$[T9M!HUE$%M(0/HH1&amp;lt;%[L;:Z,%)&amp;lt;AU?\MX-$]BVTV$6F63V?:_&lt;br /&gt;MQ'C!3@;R7QA[06LG/B"BTWXW9JDDWV9+(9%M6]L78(20JP16!66$.A)BQ,X\&lt;br /&gt;MT5@6`+,V^=[^7B6PFM(E7XT6XU`U=2&amp;lt;I*]D;T%,OJO.B*&amp;lt;%C#^HVR4`TCFA)&lt;br /&gt;ME`*WJ!#.];0T,5'RTC@`9S3HUK&amp;amp;7I3A_!?\+6&amp;amp;&amp;gt;V%*`F,_S+&amp;amp;J^!:-Q3&amp;gt;8RW&lt;br /&gt;M&amp;amp;L7P\:IN3%3HPU7=VJ90PAFY&amp;gt;BXMS']T^OF)3/B"&amp;gt;,+'F+X"($Q-RR"?%@(T&lt;br /&gt;M,9,,IC!JEB^@?CZ.&amp;lt;N)C.(1"E*.%XL8P\;D9=:%&amp;gt;7&amp;amp;-I7V&amp;amp;!4*LFM`B-M-EN&lt;br /&gt;MPB\FJ0M!A%8/-@&amp;lt;M:/,1!51C!&amp;lt;^CA0"-K_UT-'9,6^!L=6&amp;gt;6&amp;lt;2$`A@:*QJ7@&lt;br /&gt;M%9M#*Y1N\6-`S'9I_J/+&amp;gt;R\)&amp;lt;OL$P%\UKMK=4=&amp;lt;A.6A-$XLRT@P3"9*(N]4V&lt;br /&gt;M_@7&amp;lt;N=W&amp;amp;51U3ZU2D5%P-,!6])Y3X-J-9YWT4M"+D&amp;lt;A\8PS]TX(H^;,3T@HV&amp;amp;&lt;br /&gt;MT/I#1%!XU8C1(@AS6)'(4D]EYJ4*5P03`G*V7THG\Z;F#$&amp;lt;:TJW"%Y06M7LC&lt;br /&gt;M9'Z8^&amp;gt;;+%:&amp;lt;,WZ@L+986&amp;lt;](':%&amp;gt;)+TV\?'QILA`OOUFJ-Y;^M;WT/RM+/[Q=&lt;br /&gt;M+"TO+YSRU8@'P;DMH='8UG$FV$7^`$/;J_+U16_DHFN#BEB21XKC[&amp;lt;9%CQPR&lt;br /&gt;M7_&amp;lt;CMGI+[03V@O&amp;lt;&amp;gt;-'5I[-$\Z0?YF_,&amp;amp;34I1VP5$:=&amp;amp;!Y[XXS_;1/,%X&amp;lt;B@R&lt;br /&gt;M+J=;"T.30?`$G^2BE-U[T@_R-]%"RBH-)%2\:$$XS_;1/)DF4=:T%ED+"RHR&lt;br /&gt;MZ=5[(W&amp;amp;&amp;lt;D^`\VT?SI!_D+__Q&amp;gt;VA/%&amp;gt;FF8_&amp;gt;QF&amp;amp;A7,B'Q#J^)UGD9W!?GV3Z:&lt;br /&gt;M)_V@A]`Y^=+&amp;amp;45`XE1E_MH_F23_(7W]`-`0&amp;gt;#7T\++K0O3?WQ7FVC\ZPM!JZ&lt;br /&gt;M2QI2:G_8[F5)(.@WTTRQH12T83?F;^:&amp;gt;=7EI41=#A!&amp;amp;PT/(P)!&amp;lt;*3(W0#80.&lt;br /&gt;M%,+A"!@9&amp;amp;]LFRL&amp;lt;22Q=+VEJE'0ZJ,IBJ_G9Y^6+AU!=F?^3KXHQ!0)LL!-MT&lt;br /&gt;MH6V:Z`B20.W(J.+3AZM;9$VBBEOJ$X%DJ7;ZD"0;M[1&amp;lt;QQ8Y2)V-@&amp;gt;OS'VWN&lt;br /&gt;M3Z5&amp;gt;9*9!C(5Y%O3+YTV"E((YD*128?%&amp;gt;)\0Y._[,$S+AG,0?'96T%^G-/?2N&lt;br /&gt;M8=3DB^@)3)W:!;O5%NPD6]\&amp;amp;/,^6)#/OR&amp;gt;_\;C:U2?+&amp;gt;W!?GV3YZY?6#_/4Q&lt;br /&gt;MDMLFQDJN1X;%9+N=E/$\G.*@)).8R.2_&amp;gt;F_N2P*2_62&amp;gt;-,9S6YB&amp;amp;]2Z`/\(2&lt;br /&gt;M]B__R&amp;lt;EFV3_#L!Y#8";1AE=L]R$S;PA\J\.;7A0($?E`@N$^R%\#%4/4$.U+&lt;br /&gt;M,1C0PP&amp;amp;%VN.Z7%M!B3N!'HQB#&amp;amp;`*C#O%K@`NNR#`6']$+,7;K#9"6FWL8J)!&lt;br /&gt;MFDIH/&amp;lt;ZZ3]O+QZ_5HT(1]GE!ML%0/7FB*OO/`];V&amp;lt;&amp;amp;BU-]*4M^H-&amp;lt;G=OQ3U$&lt;br /&gt;MO*G&amp;gt;")M+5T'`.37?A7C916Y=@*LBEIQ*!F77+2%:A8]9&amp;gt;?(NXP.7,8RV[Q23&lt;br /&gt;M3BI$XSGVZXOEH!T#RMR+ED1LX?XD'IIV[4C^"?G2B`J1]65&amp;gt;:&amp;gt;-+OQ!7='*J&lt;br /&gt;M?9,5"H4%8X9)Q;6P([V!GFFC$9!P!!*YW;(&amp;gt;GW:LODA/;KT(#_/P&amp;gt;1X]3$7:&lt;br /&gt;M$&amp;lt;UT_RLXI%PP&amp;amp;!],_7LS/R;'&amp;gt;$LUN]N[8NI/K3FEWLK-%9/DHA$KMU(AKW&amp;gt;J&lt;br /&gt;MAVY6BF[ONF.""C#+&amp;amp;ZD%&amp;gt;4(N'Z&amp;lt;"T/%A6MUV;RJ&amp;lt;V`!R.'L'EK[TFP9#2C(8&lt;br /&gt;M387Y[4&amp;amp;UH"52ZIHX@41%,NAI8^B:JLL(6*&amp;amp;"4ZFM$=$)4`P2BMBMQT`+A]+Z&lt;br /&gt;MA!1"X+%B+1$,=]3\9M254??D&amp;amp;KK]3H6W:#U0,V8*4]:2&amp;amp;^34R('2)I&amp;amp;!.-(0&lt;br /&gt;M!U!9-$?M&amp;gt;G=;(&amp;amp;48@"]1T3`2`"2,\=)%LVF`N;(7W1:6O_@]PE3??^%X&amp;gt;\XC&lt;br /&gt;MAB""FL20=,F-W10`D$$6Q""Y(_!G/,ZP!IP=#WNX(+\#?2P4W@I62_%7A(@`&lt;br /&gt;MUX_@+,&amp;gt;/(PIL9&amp;gt;&amp;lt;1:O1@&amp;gt;&amp;amp;Z-2,D!0,C;+4$8$&amp;gt;,2B1CEVG_*PD4M/J0RM&amp;gt;M[&lt;br /&gt;M&amp;lt;9&amp;gt;&amp;lt;5@^&amp;gt;M5C$.7I?:K&amp;lt;CC.*9?W]V7-W=&amp;lt;:JP8X&amp;gt;+P_@C@9HXYQOZ4WJY7SOB&lt;br /&gt;M,261++YZ+?7!T.&amp;lt;WY%`F;'$Q[:0$@WH&amp;lt;32@F']_P7ZE3.XVB8TO[+.(&amp;gt;:=90&lt;br /&gt;M.WKBGQRNVBF1_IC5YT#2C12P2CD^B;SD-R5HQ5LU!N&amp;lt;-)"-QQMURW4'I$G20&lt;br /&gt;MZ$O+E/Q`).@B?I/=8DYSW3I,8WV'2'H\K2\F\;_$CA$9/8ZY2S*%$DZ;;"&amp;amp;]&lt;br /&gt;MJI+2122&amp;lt;?!:,&amp;amp;3`]B#19W')#&amp;gt;AI''JU-`\)EMH@#6S$T+R[&amp;gt;WV2]Z0?YZW,5&lt;br /&gt;ME('9"5J;BZ:8?31/FHBGSVG4NT6B5&amp;amp;+2J_?FOA@N@M_MHWG2#WXOG(JX+PXV&lt;br /&gt;M7TPT)9F0&amp;gt;/=?'&amp;lt;:&amp;amp;4]S/SK-]U&amp;amp;/D5)@^4G1,2*GDLWTT3_HAV7$NJGO-9\^B&lt;br /&gt;M"]9[&amp;lt;U^&amp;lt;9_MHF\^%T]K.9S:52#Z:)[^9DHU;*4?^H@/`?7&amp;amp;&amp;gt;=6,DTX2V"`FH&lt;br /&gt;M2Z6^&amp;gt;F_NBYE&amp;gt;?K&amp;gt;/YFFL)[H"TQM-@RXFFI!,2+S[K\Y*XQ3WL_/LC(FN)G5&amp;lt;&lt;br /&gt;M7"*-"T]-22;8QI@T_]5[&amp;lt;U\2)&amp;gt;VC&amp;gt;=(/\C&amp;lt;QP%XS98P]BG-QO#LI:&amp;gt;-)[@B;&lt;br /&gt;MU&amp;amp;2VQ+O_.@;!_&amp;gt;P\VT?S9*;-:W;:S#'Y1\62C^9)/\A?_N./HY3E`122&amp;lt;M&amp;amp;!&lt;br /&gt;MZKXXS_;1/.D'W04IG];VWCE+6.S?:7(;/,K/^X[DYKP/)[2!920&amp;amp;OWGR`_?-&lt;br /&gt;M?7&amp;amp;&amp;gt;S2S1JWGBMMB[&amp;lt;$=(!)_-3;C./S$A\&amp;gt;[6QDG&amp;gt;F_OB/-M'\V3:9R_EG29Z&lt;br /&gt;M/`J5F9Z23##-M&amp;amp;G^J_?FOCC//A#SI!_D+__QUZ/?6%Z6/MNU.-ZIE+3Q)&amp;amp;=7&lt;br /&gt;MVM1DML2[_^J])&amp;lt;$Y'^VC&amp;gt;=(/&amp;gt;G/XS4_;(XX8.?EHGO2#_.4__GAZDF!/P#O^&lt;br /&gt;MXCS;1_.D'W07IDAG?990RD]/&amp;amp;DLQH^LD)M[]UV2_7&amp;lt;T4TW^/55U,:5E:HC/5&lt;br /&gt;M;OIXUK&amp;amp;49((=.T]O9MH8BB-A%\RDI+&amp;amp;4L69#8N+=?TT?0ZG/'T-AU1=36I:6&lt;br /&gt;MF#*&amp;amp;F#Z&amp;gt;=2PEF9`&amp;lt;0ZESVACZ,@$/7.)3LHW&amp;gt;YXE?IA6;D#ZY2&amp;amp;KJI.PI:&amp;gt;E9&lt;br /&gt;MQU+\;)B4R.*_IJ\,7Y\KL4(2DIC%*&amp;gt;.&amp;gt;LCJ\#%,*3R\ZL&amp;gt;"T8A,*32Z26F!2&lt;br /&gt;M]I3,R:R8.)8MF9#&amp;lt;!PG=NK3]\$^$0+&amp;lt;E!,I_T@_RE__H=LG-"J8E'\V3?N!F&lt;br /&gt;MB5*?0YG$CM[/^+-]-$_Z0?[Z2S#V](%B3P&amp;lt;H[&amp;lt;U]&amp;lt;9Z=H8_/;"8]N/$4'2%?&lt;br /&gt;MHLX%;TBR=3FIR83$N_\Z!L%]&amp;lt;9[MHWERB\K?Q)#ZK9&amp;gt;1]&amp;gt;\-%E/ZF9;HCJN3&lt;br /&gt;M/IYU+"69D`+)S^*]N2_.LP_$?##3[/&amp;lt;G=;;;&amp;gt;F:&amp;lt;A\3XX1&amp;lt;9M;;MF?=H:L34&lt;br /&gt;MU'H&amp;amp;1BR1?#1/^D'^)EHQ&amp;lt;,0.(N1?=."Y+\ZS?31/IJV#B?(#&amp;gt;T/%92:\&amp;gt;F_N&lt;br /&gt;MBYT5&amp;gt;K&amp;gt;/YDD_R-]$7VU]TE][8[:8:%$R(?'NO[KKA5+&amp;lt;S\ZS?31/9M1LS6DC&lt;br /&gt;MQ[)Z*I-\-$_Z0?[R'W\$I"SW7N3_BPY4]\5YMH_F23_H]DOYM+:_QYRBDTV%&lt;br /&gt;MQI_MHWEBL%J5VSD8]`6[9$P\VT?S)#HBOCJ2XQY)C)_&amp;amp;3!DR*3)P$OQSU_G1&lt;br /&gt;MCB_?@TQ7VJ(R]Z6R)2VZ(Y4M@695MK21UVU4ML8')]FXWU-EB\1`I+`EM4Y0&lt;br /&gt;MV-+B(SN_]/;Y4XS%[G5BOT8Y\AXG=N)T.*J12U=3M;*N',G&amp;gt;E8L6[.T;S=ZD&lt;br /&gt;M5^_-?3$8_,I&amp;gt;"=&amp;amp;C&amp;gt;=(//DJU-B:"5IUKP,5$4Y()B7?_U3E4KMSKH"N^$#+/&lt;br /&gt;M]E'C8L?L)0T?.U&amp;gt;.4G+2N__J-(=3W!?GV3Z:)_V0'#I;L1X[&amp;gt;QNZF&amp;amp;S&amp;lt;6$HR&lt;br /&gt;MP1LQ3O.S&amp;gt;&amp;amp;_NB_-L'^UPVB:DC2=@H&amp;gt;D[C+&amp;amp;$W6#\KI&amp;lt;U:;Q1@(SH`R3!?DC?&lt;br /&gt;M=%R;ODE+10R"CCR\`$BAD(84QAIL(DFD-=G$2^&amp;amp;VN5C`&amp;gt;/ZXFF&amp;lt;S,'+@&amp;lt;87V&lt;br /&gt;M5;?$0DT*0MBY3N@&amp;gt;8%`XJI&amp;gt;"=F&amp;amp;\`:9&amp;gt;3/BYJ&amp;lt;A)3-+&amp;lt;8\091CHAT+%7$$PW&lt;br /&gt;MTYG&amp;lt;:NU[0%O_X!PN+3F($.`H,Q=U0(0X!V--1FL&amp;gt;8,;[:H%\5@RLTPIZ:H7G&lt;br /&gt;M,3Z1[Y1!6%A4BP5ZPRK(B109+\0:Y((JJE557$&amp;lt;3K.?(9FLU31C0$;OY&amp;gt;@#D&lt;br /&gt;M##HW:34&amp;amp;Z-80HS&amp;lt;_@%*D?TB7&amp;amp;&amp;amp;PXN&amp;lt;H=92T/61SHZ&amp;gt;:1[RD'(S!%?70D02-`&lt;br /&gt;M;AV&amp;amp;PVO(N,8A'212Y]]&amp;amp;9Q$0I4=MJ!D^;OCA7PL%&amp;amp;^R"8BVR:BAD7+&amp;lt;N;)UP&lt;br /&gt;M&amp;amp;._9(Z,-3FU]?,VS+`$]DER'UF,7W&amp;lt;MN/#5N)[0K"4E_6,29H)?UI\8&amp;amp;$@&amp;amp;S&lt;br /&gt;M"Z/,26`=#9HPS1C[R[1*(O&amp;lt;00:G;''/8W$#"Y=H53NX@&amp;amp;["S;+R1]KFS`;H2&lt;br /&gt;M=1=6&amp;amp;0;@+02T&amp;lt;FA::^23$!U=NC=8K-[AW3#I\-1:MQ6;/NJC1&amp;gt;DVALD@%W;4&lt;br /&gt;M!5C"?K!S(DBZX;#1!%:WT1Q"1\AVSK2OCD6,O1R\!(['OWE.TA9IO\.=FQP7&lt;br /&gt;M?XX+-K&amp;amp;9RZC,XF^+F3G\]\W)FY.W)_][\N!D_N37DX&amp;lt;GBR?9D]S)QY-/)R&amp;lt;G&lt;br /&gt;MOYULG3PY&amp;gt;7KR7V\)EX^/*HV?GZ869$R96-64[RT*FKFP5GR,]AZHO=V:ZHW:&lt;br /&gt;M,;HY(COC?=(2Y0A%,04@*N.BU,[LX`N'PHO%.::X(L(2HQ[4RQ;/Y,SH`7S@&lt;br /&gt;M6(@Z+I'&amp;amp;%V2!3.A'A86+@MK=WGM1*JLLY`/J]UK5RONY`B&amp;amp;O*UR*N^7ZJTJM&lt;br /&gt;MMOVB4M,1KF-5BSIP',?H^$;B7#=Z,4:QA`)`1FNK=PR9BK[%OL'.1KVE,D(K&lt;br /&gt;M4W`TR7$&amp;amp;/7O'CL4H=!;AI(*#2SYB\[X#()\R&amp;lt;':4L*^,4:3=6\0AHA4D)6SQ&lt;br /&gt;M^&amp;gt;.6+]&amp;gt;W=W&amp;lt;%@E&amp;gt;&amp;gt;/B`$79X2ML;+Z_ZG`]%??4@Z-04&amp;lt;#8#I4A(&amp;lt;?&amp;gt;5^.&amp;gt;`H&lt;br /&gt;M=4M.5QA-?3(5+E7C?=1NQ6J_EHC%'/8NAI&amp;gt;*K.Z%Z=FI/*]Q5+JK9H@&amp;gt;AO#`&lt;br /&gt;M&amp;amp;YRG''@%-%[?KKY6S7Y?=8#_CR5H&amp;gt;MCM#UDGC@Q+K=,[#)IGD#*:4*#;50HL&lt;br /&gt;MCZTI,`Y_ZE:`-1`DNHL8]=K_'$G,+3&amp;gt;DW"#$9?7&amp;gt;1.-J&amp;gt;:%Z922,8[EV+R\Q&lt;br /&gt;MFL3DU03&amp;gt;0L];%&amp;amp;*9P_^)U(T&amp;lt;'`P0(F%7;@0;(SKA&amp;gt;_@H]Q1M62TPCZ!,?+`/&lt;br /&gt;M#8GXR\%:&amp;lt;8`-:?,O/!:I3DO90(6&amp;lt;I&amp;amp;T`PA;R4P%9FPRN$]UU3@&amp;lt;:(1V'B=8-&lt;br /&gt;M3G&amp;amp;_,2`+:R'OHXO2_(I%;^3ET2&amp;amp;-HHO?F##Z=AE=M5IWK8$RU*0M2N[KKG1)&lt;br /&gt;M&amp;lt;M/IP,4Z1&amp;gt;CHE`DL9?H-+#/C06[&amp;gt;'VB'1!48!82'M`#3!VG#U(L"9UO="KS=&lt;br /&gt;M@RD`D[3*3&amp;lt;0R![3$4&amp;amp;E6[=KI.NM;IU''VGW6E\"7]9,"%&amp;lt;8"_B_#IPW./_+[&lt;br /&gt;M)VMO_BUZ&amp;amp;%Y^&amp;gt;Y);AJD^*&amp;gt;)DP\H^&amp;amp;(3G9./1[[2;[2&amp;amp;=0!UR0&amp;lt;:T%I))GO,1&lt;br /&gt;M\SDB+Q;&amp;gt;&amp;amp;G&amp;gt;BZF7&amp;amp;A_YJGF_04QD4IR@&amp;lt;I)QQ/!"@TE\20?\R[N#ZH,:,;-*@&lt;br /&gt;MCF=*J8#'66@N3#1NE]V.B_-E,RX#67,ZO^&amp;gt;"@.:J$S5(P]R)#:C\(I2YD`3$&lt;br /&gt;M34IP45B=-:JVE?E5L168FS'`"IP$0Y_S.B6^9%+!IUY!/**@G&amp;gt;'5L-1$;S3D&lt;br /&gt;M4T*[OD/7$+!1X%S1!,K215XM[4M\;E\PA]F,'Q8N5EJ8+Q\&amp;lt;*/R'X"XP64S4&lt;br /&gt;M/KK!*)&amp;gt;7FLU/:JD)6;ABD]4&amp;lt;=(5Y;AY1]`0`78*ZI2.3E^1DP)9`]D\I(.=W&lt;br /&gt;M=R;`GM^M/JM)#12WM&amp;amp;Z"?S*:?$_(M-Z$1_PL8X85D8,;M):!QX@&amp;lt;^?$D('PH&lt;br /&gt;M?M*$6:648GXU_R@'&amp;amp;_QB$/954UGNRDP[LBO`9R)__!-ZV6FHVD^':UR@TT`W&lt;br /&gt;MUTMXEC&amp;gt;N8W5QV?A7^\=FH]TO#$;#"^0YPM9(/&amp;amp;EP$Y;8(R(T(MD"1#'Q\E)O&lt;br /&gt;M^:JWK!MTU4MK$:'T7HF606DA6,"'86EA;L'=PI1EB==*B7,D3P4#XJ0I,&amp;amp;CE&lt;br /&gt;M\:]AG!D;)HD.?(-'S8$!G*]]A/\GM^\Y(X&amp;lt;V6@21G&amp;lt;E2?.GW15&amp;lt;D^72R9*_'&lt;br /&gt;MEXR$))L#!E8I[VPB@ZG[DZLMW$VUA91J-1+Q4+DM&amp;gt;AMAC'=J.3VT,&amp;gt;*QXEL,&lt;br /&gt;M?ZJ`QK!5=3*@*;G]$AQ-'YR,\&amp;gt;@L+1LD&amp;gt;WQT2AZD)&amp;lt;7&amp;gt;5R*-`X^5]*]2,$1A&lt;br /&gt;M0UU$D&amp;gt;FSUN_@$`9]/EL;P,=ITZ3L.5#&amp;amp;X2"7)V?S)%:SGK6`@B1@Z):V1PY[&lt;br /&gt;M``[ZDR&amp;lt;BGYU*LWO;:`#EVSU$*8"7*8:S.`-%^5+M.OY)T0DFS&amp;lt;HKLFE#_0B=&lt;br /&gt;MA-E&amp;amp;/6`;Z(N3%WT''0+MG\R-_,#R&amp;gt;-(:`W`^G,4M389+_&amp;amp;?VR*_#@S0`Y:OS&lt;br /&gt;M3@/]+F\_EP8TSN,/L0M%@^BVX;CNM=`*IP&amp;gt;CA4%]$9DA&amp;lt;XU=0&amp;amp;1&amp;amp;`$;-LV31&lt;br /&gt;M(4FVT&amp;gt;N61(9V`5P,HE%?9:#`^7D&amp;amp;(!62I7%)P\SC`N^%T2AV'.2&amp;gt;73/K0\QO&lt;br /&gt;MP=E:PNC@HNK!-G$D;-!K=$WM3)B4RF10^$8G`JW]C2"YQ]8WBIOJ=K`4BJB\&lt;br /&gt;M;2S^_O4&amp;gt;AF]\"40Y3D1VO3"_L/!Q00ZEQO!2(Y$%8E,73D^$ZTU0$]+-+)W]&lt;br /&gt;MK9S?"8W)J\]K@(@^XA\U]PD@(`G3&amp;gt;!_6^0/\"VGTO$D$C8^L#[:/7@I&amp;amp;%M]'&lt;br /&gt;MT0B-G2%7/XSZT/4/E^QS"HXVCJP==]CK&amp;amp;II@0VE`JB'[)T_&amp;lt;;&amp;gt;*.-S&amp;gt;;R[\5&lt;br /&gt;M\/_+O]%.6/S-;A=YEF0WR2Y92&amp;lt;`E:*]'Y::`;M)JSXLD(*R5]]7^SI%Z5%@Q&lt;br /&gt;M?N207_C0D]O)&amp;lt;P=AFN([Y(8=%['=8;SV`#`:YC9#=H9-'P%M#5&amp;amp;;%)`(.EHT&lt;br /&gt;M4"HFK(&amp;lt;M8(VK"T;K0."QN1OBH`9KQ]RX^[`&amp;amp;E^4)9'',VD_X"JT?#?OC0&lt;br /&gt;M@,(?T0FMN-^-+\;@.&amp;lt;2#ZZ-X3I9"];49*5AE0W;FW?.1(G(L(O9%R17YA*;R&lt;br /&gt;MF_B'UNB&amp;lt;G)N)I5_*C#4'C\TY&amp;lt;VZJ57R!PVE.+CS09K$7RJ-_$2X?&amp;gt;,4[ZS\3&lt;br /&gt;M!%38$1"-MV1&amp;lt;[,3[BC&amp;gt;V"!W](AXW!$.%@FP*A#,(XV@PS!N$&amp;amp;'&amp;gt;B#U[P=SZW&lt;br /&gt;MQ.\_D?H-`8+P:&amp;lt;7HN+*(SMG16R+Z1MZ0]B1V0M?8`H,'CCW1:;M5&amp;lt;69),D"J&lt;br /&gt;ML'V&amp;gt;#&amp;amp;S=CJ7\(.Q&amp;amp;[]&amp;amp;Q/'G7EIC:T"SRG,V"HL+XX%B*R#)QUBO;,&amp;amp;.1)*,N&lt;br /&gt;M.`PP%+K&amp;H;HS=%JNH&amp;lt;S3.9+0)X?PYQ_?-P9+@%L_H?2T2MXR&amp;gt;N]B)U91$R5I&lt;br /&gt;M7$*%O19_,EH'%`^H/1SQ(AU#X#JP!PE?$FG(N4C2IX4@I6RM?%@]./**&amp;lt;I)3&lt;br /&gt;M4@-+A["S?;3ME&amp;lt;&amp;lt;$MUZUU%4;:VL+0?H)&amp;gt;&amp;amp;,$BYN/P8WBFG,,W@R0SL)95(P_&lt;br /&gt;M:52,^?N,B3'_Y1$QYF?Q,+XN'L9DGO'.8V.DZB-XH3+F/S]0QN3VWV'0C%2N&lt;br /&gt;M-QE#PSNSKL-8\*1=Y&amp;gt;FV!40ZD.M&amp;gt;L]4F&amp;amp;"'H/B/^&amp;amp;['+@FMU@H?M?$%(_BZY&lt;br /&gt;ME29_6L#&amp;lt;PLRC"(D)[D*@76V&amp;lt;5/:?UVN5'0&amp;gt;OQF$KB/,G)_!_^`=(17B9S\_/&lt;br /&gt;MYR\"R3RY65K!)OTS*_^=NS6=XCGOCQ[6#T.:&amp;amp;"A''(W2:"9.)[4BSO^:1S&amp;gt;[&lt;br /&gt;M;M%/,*:3AEW(B`:&amp;lt;%S28\^;&amp;amp;K'W1B]!]![JI3;2(S:-NW:*3&amp;gt;1S%CW[IJ8VB&lt;br /&gt;MV',M/CAZ$:]:NJ@&amp;gt;A/\&amp;lt;M&amp;lt;FIB)%A)!LWOJXR1!-,;A^NNLP-),'\1W0\O(0C&lt;br /&gt;M\PD1?:Q...G3+6B"Q\44FF`*1"(*\#1IC;K=:R\G&amp;lt;:;X9*Y05LW=R?6WA&amp;gt;7O&lt;br /&gt;MEKZMU_MUO#:Y!1&amp;gt;-HET$QHJ65$$=*8JOYJAQB]E]1&amp;gt;N)=QS@Q0ZP-3]R6Z12&lt;br /&gt;MP#!]9+^Y]PODO&amp;gt;0!A8OFNUN@+H@,8@=J,0?(&amp;gt;U-\NZDJN,?9`UO&amp;amp;W*H2QL&amp;gt;Z&lt;br /&gt;MD2`&amp;gt;P9:G83CU!MS9=53'JL/&amp;amp;B6"86G4ZIOFE&amp;amp;^P,"H*?/J)T9ZKO*FZ1G&amp;gt;\.&lt;br /&gt;M?&amp;gt;R`7^5&amp;amp;,75&amp;gt;DR`7?)@\FXB1$[&amp;lt;M8[@:CM#*$861*_GW*Y(3]7"3&amp;amp;3/TKSO$&lt;br /&gt;M&amp;amp;19T:_\W)NY$8((VKA2*P&amp;gt;\0=7'R67@G$1A33T%:[Z[F`"QW6L4&amp;lt;`]-X![+A&lt;br /&gt;M&amp;amp;&amp;amp;F1WUA.ALJ)Q&amp;lt;CE@EM%1IPHYM,AI"1"XLTH[''Q&amp;lt;4*ZEP0AC,S__7!4.NSU&lt;br /&gt;M9\&amp;gt;DDKB3)0&amp;amp;`2=ZVH0XD!(^Z3,8-ZV@"5NFQ'0,E&amp;amp;008[K.;IUKZ&amp;gt;HNY?K0R&lt;br /&gt;M::XUC'^?R=8F/9\_VQ(UM*1!W&amp;amp;Z^=:D)$ZX'^*YF'/'8+69\[=&amp;amp;4&amp;amp;2&amp;lt;8_U8S&lt;br /&gt;M3MC]BV:&amp;lt;3CD-XM8SSB?DQ!FG`;ZK&amp;amp;6&amp;gt;_D;&amp;gt;8\_6-*7,N4/ZM9ET\:G[1O'/L&lt;br /&gt;MWI(%&amp;lt;^NYEY*39U^&amp;amp;^B[F7T&amp;lt;)OL7L;_PP8?8-C'^;N=&amp;lt;]^OR9U_&amp;amp;72QK$K6;=&lt;br /&gt;ME$J?&amp;lt;S/`MYAQ9(0K5T-4KG=$]#!5+&amp;gt;QMYJ+9S)"**RJV\D5PPW,ORAPT&amp;lt;LX%&lt;br /&gt;MAY^$8L1&amp;amp;(AP,HSEQ7&amp;lt;U+IENLI^^3V,24U;&amp;gt;]M^%%R^6O9ST]?JU&amp;lt;]E19;3TE&lt;br /&gt;M^J8&amp;gt;J%W69&amp;amp;&amp;lt;?TA$LD$&amp;amp;[Q==.I"BEH4Z\(&amp;amp;Z?QRD7Q'@KAV-=RM#E&amp;lt;,J=L&amp;lt;YA&lt;br /&gt;M[BT]I1;2H60%5JV\.O%6$T?9DT\G.HJK1+YH71J1/:?&amp;gt;^$&amp;amp;'B'6#_],P&amp;gt;=`R&lt;br /&gt;MP&amp;lt;3A]2^K&amp;lt;'#=64EG('&amp;amp;-^ZJ9#L"I2__+5O[=+_SOB[.%GUCX5-&amp;amp;`K)E9"_H/&lt;br /&gt;MW@Z&amp;gt;4K6;BV2#1B&amp;gt;BV?1O&amp;gt;5+Z@D*&amp;lt;.2?&amp;amp;EME(*;ON"S9=4B'!5)Q0_'Z`M]]T&lt;br /&gt;M\N!U0W3!#KGU/7/"YN%#J'IPQ`Y8,X.T*AS)HM=H_'39/A\Z:VG^@5JZ&amp;amp;*H5&lt;br /&gt;M9V2H=EB2+#5NGY^'=*MH[._,U0VT#,.@]4(=G&amp;gt;)E]`%;DL=-&amp;gt;RG!",E;\EDC&lt;br /&gt;M)@.+O!BC2:&amp;gt;(G#B3RG3E&amp;lt;C=YCAW#CI3+2!+\@VXO+RVH+:,]&amp;lt;([GN@F;P&amp;amp;W1&lt;br /&gt;MW73'(F5Y9.9_S"3R)_?2CX[*]?WA3&amp;amp;?Q)[&amp;amp;F5AXZ'1$:7(I/C?K0XH=V[]$J&lt;br /&gt;M6BXO_ES=@R&amp;gt;K^S,-TW:^"--V[AS3;B1%4/_QF/9/0V(T.W]B"B.AYD3M\O8.&lt;br /&gt;MCL*4"]0(&amp;gt;HO!#(EW:38%\\(`G_#`IQIK3[U,PJDO6XR9A498K7W1U&amp;lt;\11Q;?&lt;br /&gt;M8E_\\$/*[=+G5$';9V8,\07&amp;amp;$/XUEP$D&amp;lt;1R"!V3D^$-QQ9FO3/!`.QG)6+%_&lt;br /&gt;M)@BZC78OF_O("C#9E=S6)Q+UPV[XJ+*$V6CF[&amp;lt;3_4%S?!#PW+X-QDLE1V[&amp;lt;D&lt;br /&gt;MMT[/(5,+J9_L#4J&amp;lt;.E9I6*Q)&amp;gt;_]=;&amp;amp;S^JN=BM;@PI)N2!NHOOV\WC$YY'K_C&lt;br /&gt;MFH#W,[+5E3C0BL;,+$EML&amp;lt;%6]-@6WD(Y]RK.MR5(CC_3EJXUQE@.;K:UR!C;&lt;br /&gt;MY*C-X&amp;lt;3D^-"(-WD_\!WFV-3RI[01&amp;lt;J[L'/&amp;lt;,LVWU!=O*1_0I@YU0*DG+`F=[&lt;br /&gt;M+[K%G:#H7;)U;#0P^XL3&amp;lt;!%WPNZFBTMA\3N1PYQ03^EF(7=P$J#&amp;gt;'6^?)9WU&lt;br /&gt;MYG/AA[4TK8,OKY"6_K29H?S2F,^8YTE#(VB$L0?J`I1OT^&amp;gt;-E#ZG0/H&amp;lt;BO&amp;amp;B&lt;br /&gt;MV;QKA8A"4]_SMO$`4/4Z-*M&amp;lt;KT-&amp;amp;9/2"!V$/."N+_W&amp;amp;\!]?NOJPXL!:V)AX1&lt;br /&gt;MZ^:(@/)I)P0DFP,"SXC?5$C*#^@S*UVSW&amp;lt;-^,#:N:D/B"Z-$0PZEK1L43HE"&lt;br /&gt;M&amp;lt;]INQH!7/O/[`DA&amp;amp;IT9\U;:&amp;lt;6+K.:QD):7YBQ?1`TY[F,S]D`DFX2?M'QITI&lt;br /&gt;MP1A0]2T6X^,T5&amp;gt;`T4)^S&amp;amp;F'W7'S]&amp;lt;F389*]U#D3'IP5O&amp;lt;7HRN5.[Z-"ZP%W#&lt;br /&gt;MN"I.4[D?;.6$A4&amp;amp;?TO1;%H/I2P4+CFD3^M.&amp;gt;-$`PL^U/?R:P-HS)&amp;amp;A++S=;T&lt;br /&gt;M`CF%I`6^K@"'9G_5M^\VGS(&amp;gt;"7);B.G@C+0A2-C%`"('O/[==^H"_X-M@Z]7&lt;br /&gt;M5\"PP'NS@YYWIK+Y6NCT)&amp;lt;R^+GO7+']QI9A41?@RGO_UZ[MF^E^_3N?Z7[\N&lt;br /&gt;M\==_?[Z?NJI7S1&amp;gt;R_QJ&amp;amp;`S0I`'!'.B$!P&amp;amp;&amp;amp;^G&amp;lt;#,AX?=YY92`Q,??_M-4;OH&lt;br /&gt;MWN0VG#QN,(&amp;gt;@&amp;gt;OU:X3]?R,X75]96)]%MGU.1Q]27D?O0.&amp;gt;^0_WC]&amp;gt;CH+\OKU&lt;br /&gt;M$J`C84),2S^'#3$0)C(BXV#O@!6YNOHL%K^XLO[H-CP^WHQ_-I\/P+___1E]&lt;br /&gt;MZ/&amp;amp;?D-/7\S"%U3=9[H'7-X,T8_;O@=G7HSV-V]=Y[IK==U'MG3/\M\/C7\3U&lt;br /&gt;M%U&amp;gt;^3^,ZOK+:&amp;amp;WA_O05OP_Q;S/J9W/]WW]VJ]VG"\%1@GR4"N+JZ&amp;lt;Q%`^8M%&lt;br /&gt;M`.9,=(0`Y&amp;lt;E"@.+*#]__SE*`JZM)4@#X&amp;lt;ALIP-755"D`\#$)*0`0:*X4`%Y]&lt;br /&gt;M*8"L:Y(#R'-2$F"SZ,=,8!)OE`?H2?@&amp;lt;B4"QZ*G13X?V64(!V%6_NU1@7"Q@&lt;br /&gt;M%F)",#!5,H!-G20:H&amp;amp;]?)!O`DI.%`WI^D^(!NP22JV*BB``KFBPC0/YAC*,W&lt;br /&gt;MM:1)"9R/$^4$-T"=!-+*"J9R_H-&amp;amp;K],^^Q*^GTO&amp;gt;.==?7$^ZDODBKO]P&amp;gt;P^(&lt;br /&gt;MD3MF_!EHZLKF3R63Y]]&amp;gt;`J`[+`OH&amp;lt;T4`B5;Y4(W[SD1=FUIT8$9[O&amp;amp;@P=&amp;lt;9\&lt;br /&gt;M'*)KNYT8`7_LAMUX4+&amp;gt;G.CL&amp;amp;$3-'\&amp;lt;VE[:T;GO\2=AU"^5D+2AR9XW8T^P!`&lt;br /&gt;MD$TP,5_D'AU]1K`YMO;9+7M5PG.=A&amp;lt;,/8=CS0'"%["[=NA,`D#'[HQ'^!!;H&lt;br /&gt;M^:B#U;#?$_'E0$Y"SCV_N;JIU]%(?$Q\:+!;^W=AV,]3.GI[9R\H2&amp;amp;*'+;3Y&lt;br /&gt;MA]7^`*`],_Y]\DY[1NB\U_A3%Y&amp;lt;NL&amp;gt;-NA9SYHB-=[&amp;gt;&amp;amp;Q33I@\"\Z[Z(ND,\L&lt;br /&gt;M;=$'G?L%&amp;amp;H+C&amp;lt;X&amp;amp;.&amp;gt;;U1O43C#X*[1%YTGU=W*\)P:3]&amp;lt;GF:;:&amp;lt;$63UP;G59\&lt;br /&gt;MN!26D7M`S?C`;F[)H8_CALU,0AM]VL&amp;gt;C,VV`V$;OO'HN.;":Z3(._0O@MZ&amp;amp;O&lt;br /&gt;M7F,M-=9JQ\2%4'[(QRX8K*=XQPV&amp;lt;]D`LII(&amp;lt;1Z&amp;amp;/[A0;PR&amp;amp;['-*^BVUO&amp;lt;8!Q&lt;br /&gt;M-FD`VX3(`-`2.C@G_P!VQ`8AKE&amp;amp;WOD#O`514['2B#T3O8!"`&amp;lt;_5AT![ZSG1&amp;lt;&lt;br /&gt;M[VGLBYD\)[#[;9SVL]$0B?AWO&amp;gt;@#0NA%).1J#$@31^9$Q&amp;gt;UN'UT^HSMJ')@\&lt;br /&gt;M+?KP_+S=;)/3X0&amp;gt;J%N5ET:(S+K&amp;lt;N;HCV&amp;lt;Q,O2.58Z+@S'+2OT+X!3SYL/?MK&lt;br /&gt;M$X,%VEDD)3D+'=,%L3+M7.?)_J'%)M[8Y\OVQ:4Z(S\8R1$?]:#NF/B5.&amp;amp;Y?&lt;br /&gt;MF$F!=D%3L@""R/2B^BT0/;_3+.+4?J,9EA84\``Q!?TBXEU_X"*GK`6X:+*?&lt;br /&gt;M:-]?#\2+C-E)[/)??$Y#!W")-EHM3H]5EET%+'$VUR.0@&amp;amp;,/+NA#`7TP1/"4&lt;br /&gt;MEQ%HF6_R)2?ZF.@=H6?\FBR%*A,O+RPO((R%A&amp;gt;6+3.+3KR&amp;lt;GV3=..*-%/`*\&lt;br /&gt;MA).37`DR%?!A^&amp;gt;2D6#J9_XA_`.3JPJ?EO@GSH9+#(+TTW2&amp;lt;79&amp;gt;QV@'SJ'&amp;gt;S7&lt;br /&gt;MJJ]I3"1B@AT:KS,&amp;lt;ZNG7&amp;amp;QL*[&amp;lt;1F0BN+)6@CM'05VK=@VX=Z:]I(F-8*GF_-&lt;br /&gt;M;A_%&amp;gt;XY'6_O=''6;8R3,![?$F(O?4;\UQ7^NE9+Q9]^?KD.`,C`Z5C3`40_W&lt;br /&gt;M#6O0I&amp;lt;'F,]W2_-S/WR?D"5/5ULVS&amp;gt;'EF'Q$4.YD((,_1&amp;lt;L"T'*E5AU=]0BQ7&lt;br /&gt;M85.^%@Q,)]$#[*0C"R]^.1;(OSR&amp;amp;UJ#=KN/#_$0&amp;gt;`4E,&amp;amp;*-#+ZYV&amp;amp;#':9OF3&lt;br /&gt;M/LB8EL==#WA1-F8SZ@!&amp;gt;'HPZ&amp;lt;KS(4&amp;lt;Q')DY++PQ;;%Q5/;?N:QJ*"WJZY*0^&lt;br /&gt;MCON6SW&amp;lt;ZQQU7V=K=-W2UX-+$[_OHVG1A^=&amp;lt;W:N[M(G6(GDIO?MU\NSB_W%I(&lt;br /&gt;MAK2QWJF/MH^.K61Q&amp;lt;7P",41`:6GGY?9/E;H4&amp;gt;HDC^;.X[L369PK+Q-&amp;amp;@7RJD&lt;br /&gt;MO&amp;amp;+VLJ_=+9X;T9\&amp;lt;B85@$_EPMPFE@N]@X)/PGX8&amp;amp;\5L&amp;lt;I'5#R,-$WT3P\PU[&lt;br /&gt;M*HTQCL$+$VC0]V-^=NV?XV2.9RA+.GM%+CET7'QY4LV")D:MWP.,`F!]'B"&amp;amp;&lt;br /&gt;MXU.:#EM8`A10Z32+?SBZ]6]*U,E[N82K#,1VQ7^&amp;gt;;A)U-[]B/,S;Z"+TI:P%&lt;br /&gt;MCS!!&amp;gt;/;Z87!,N!NA0SU"QHV?D.&amp;lt;`"LJ-O2.$(-%_,(\D&amp;amp;8_K%,:HE#FF:$;)&lt;br /&gt;M"7ACJ)BW^"QF@?2,@;;&amp;gt;9O3M.M,X;MB:D_E&amp;amp;(N*@(8A^&amp;lt;X@C^VP?S9-^D+_\&lt;br /&gt;MQPU`J0,!G=@EB8ZTEF2]?$H?:"]NCA_F1D&amp;gt;IA#KO#*:$U_GL2)OZ0?[R'[?W&lt;br /&gt;MB&amp;lt;GZ_!B&amp;lt;T"J*E_:;#IPF#_*7_[@UTJ3J19/9\D`MYJ9E*HZ%S(%,2#'WZCK:&lt;br /&gt;M!/^UZ=;MH_;HF#CHQ+./#NZAC.N499,DJ_]2^_X!FFCSS:_J[&amp;gt;(R$$NG4Y`G&lt;br /&gt;M(AYQ.I**E"C6`M`R3:!K+AKD8/4LQ*4H`;H&amp;amp;Y%H+G:B1O2U[5$&amp;lt;2T`FTI3&amp;amp;J&lt;br /&gt;M!#7[]L?E'W]&amp;lt;!M)T^&amp;lt;=O]=.W%R?SRS]&amp;gt;P#/\"X_Q\AND]1Y^^W:9_BY?P*C&amp;amp;&lt;br /&gt;MF/M;*?HCEJ8GS/_MQ;(GG,0F(.M]4L9.S.L3*(`#&amp;amp;886G^)O?Z3U_N.W\_3W&lt;br /&gt;MVPM,XILM2.,'291K+DR61_D@DC7\((_\X;E.?NXDXC$%2?B'$^2*!=+D29*K&lt;br /&gt;MSR@-_G""0RQ`NO/&amp;amp;G\T7/S'-NQ5E2OO`A3@0.63B!TZ,36KL)G?:9]@2_F)?&lt;br /&gt;M^"-0&amp;gt;0W^(D\"RH0K1FCF13YZ\;$Q@Y&amp;lt;@M:+_$R&amp;gt;/]VX:9AIE$N7ZG3_8%_X8&lt;br /&gt;M=5K&amp;gt;=^]=ES^/=&amp;amp;%ZXF2,7$2I_,")"=&amp;gt;D\#61XF=CGZ9.+D[P,Z'C4B&amp;lt;+OG(&amp;amp;&lt;br /&gt;M&amp;lt;1\$W^2)D\4[$"3+$R&amp;gt;+&amp;gt;QE(EB=)%B\DF"Z/]@.:K\L'?+0?V).!?.(7_J@-&lt;br /&gt;MWN&amp;amp;3?N0/VCL4[CEYE(U4QBU4-KN*-Q2_LD0.4O@!$@/:U*Z_I#'4=2*XJ];O&lt;br /&gt;ML*3"XTMCYC:!YPZ7XO:_4`&amp;gt;@'3;%D76,0&amp;gt;Y1O(VRF2YZ?]8AJGJ`=^&amp;amp;8XNA4&lt;br /&gt;M&amp;gt;?@+5#B@P9WV!;`R'71KO&amp;lt;P.LU\&amp;gt;+!V_IJOZ;N.J#@#KS6XK+OVP`DSEJ\95&lt;br /&gt;MNSOJ:F"`-%GF,&amp;amp;2'X.Q5`9$H&amp;gt;S9&amp;amp;("3G*4+9/5-&amp;amp;$W84[`GSG(47E.4YT?^D&lt;br /&gt;MA$(T;3)?V&amp;amp;L1.^,V#`736*`!N'/`+I&amp;lt;G`^@"3U6G)I&amp;lt;VZ&amp;gt;Y,]RZ3"2AJ(1$-&lt;br /&gt;M-E&amp;lt;B,L4\MY6L2!W/"GQH%?.D9P#?/[6V%.L&amp;lt;]%J?_IE)('87T&amp;lt;_+`+D,)P'[&lt;br /&gt;M[.*&amp;gt;4^MO7&amp;amp;49F\U72W'&amp;amp;XKRA*_&amp;lt;OJM(;F(Q9H0&amp;lt;QDQ2MV]%-.(RT&amp;lt;(78T:`3&lt;br /&gt;MQ5SH0AM,@6)#--.:.P76EB];B,CX3A5/]7=&amp;lt;;_,\P#H)EY8M`6]0(+G43H/)&lt;br /&gt;M@3O&amp;amp;!\'M"&amp;gt;QT9!&amp;amp;G[GKZ*(DHQ*V5+'%+[TO3B*C,IZG4$*$480-T!"6\N7+A&lt;br /&gt;MXV)W(T?IP:70407+$6,4BSZ%R&amp;lt;L`_X-9WFS"P&amp;gt;+\+10*;]\"QRIB!Q)QTX&amp;gt;2&lt;br /&gt;M+E%H]S*%P(T-P%6Q6&amp;amp;^38SUB4KW=,\XA=2X=1XW8[TT)H:;\N4\OL5E8Q.QN&lt;br /&gt;M0$E="6\Y?/N$C7,H8&amp;gt;KR=HNLLALV/!Y3PAC4M%_7SX@_M;-V0L&amp;gt;&amp;gt;&amp;gt;+S`H`Y9&lt;br /&gt;M@D&amp;amp;HBARY4C'$U23\%&amp;gt;85A1-*[25"29(;8P"IK;_EULO&amp;amp;F&amp;lt;,.3(XSE_0&amp;gt;P#X)&lt;br /&gt;M[?!;'\S.]X*SKT4*+A=!VHN.X&amp;lt;4+]GX.&amp;lt;%#+OZ'KOL,;/9.D=QZ&amp;amp;A6,OJJ7,&lt;br /&gt;MLNT().M^_'I26,8.9*0)VRI3*"QG:(3#!L8\L7[K&amp;gt;[JPP"R8:J)A7/+`2PYO&lt;br /&gt;MM!:_!&amp;lt;C?&amp;lt;O!V5T'/::0!%FA/QW81N[R2+.9"SH;9DV6:Q!T(3?"&amp;amp;LYI,=FR'&lt;br /&gt;MF^YT`@J:YM,&amp;lt;8_!+7KH8%D,*C#7-'P"LVD)/Z8?&amp;gt;+;AT9?&amp;amp;C/$T$Q$XQ;,\-&lt;br /&gt;M=?$"25275BZQ`Y-C;.('T""_69Y_"PWT8A`D\NE.&amp;gt;'G\BOV\NF9?3&amp;amp;8W2Z!/&lt;br /&gt;M2R_)"APHS'0I,TD61IXE_'T+1?1L%A9IQ?L2L\Q$A*E/`1TCMXL"RTRQ?7*"&lt;br /&gt;M&amp;lt;JQ$FQ+Q="FOWV7;'L@&amp;gt;E]);29&amp;lt;7W_[Z;7+BEK_-R+?-;]7X1^#H`[E6D(YP&lt;br /&gt;M$Y!:3C04R.9$BC!;`^'&amp;lt;^($3[9J"#_;%XT0L$P+)&amp;amp;;='V$^@,%B)S#_0&amp;lt;RCR&lt;br /&gt;MU&amp;amp;30&amp;gt;7N+E0"2A-)BP#&amp;gt;$&amp;lt;4A]$ZH[9I7B1ARSU#EF^61F6^UMOZJH9_RGK'[:&lt;br /&gt;MWCVNJ!WR^AO2O2Y]:,NM&amp;lt;;^ONHWF(!+I!;M3;=&amp;amp;QP27;.K)%9\2B\5BRTMCS&lt;br /&gt;M934N=WMO)UE[*J.]LU*-!"[#5#U1S*WM$F'@+$F\3W(/Y(D+X:-\(!W&amp;lt;UK/2&lt;br /&gt;M`F&amp;gt;0U#&amp;gt;_XM]O3XH/3E8Y1QER/.+'G=("H%INVD@NTS(/,%KR.;4F(\$6=)BA&lt;br /&gt;MLTX#PWL0^Y/6;(XH.Z'!)SD"[+6.FC$R;3[)&amp;lt;4,9LK1R5,:[2'J"]IZLF1:'&lt;br /&gt;M$UL&amp;lt;N;&amp;amp;1;M7H\',;'4*CYU-:&amp;amp;YK6AC*Z;BAD?;]`[*X.KOR-JT9VDT3-1/H4&lt;br /&gt;M&amp;amp;*6,$=[=@OYL3R%!!&amp;gt;",")U(A";N:S1*"L:XMO-!X\*^B2B3GJ'C]X+&amp;gt;&amp;lt;1DD&lt;br /&gt;ML&amp;gt;M3MTE!(#*.(RW)&amp;lt;]U&amp;amp;TV9Q)0FV*.`MB:UM9")A+-&amp;gt;'_4'4#YU0Z,/(B)8+&lt;br /&gt;MXFR1+VILLE+;O1;?.V[&amp;gt;I;1X$J@VQ?0&amp;gt;]&amp;gt;B*O:7HMK(5-4&amp;lt;&amp;lt;1F&amp;lt;,3&amp;amp;)BL?-)&lt;br /&gt;M&amp;amp;Y[+UD#O+Y([L]3YX3*&amp;gt;&amp;gt;_`Z?_KV6TS$5XU]`)UL+_U/8^E?];?RH&amp;amp;_OU2)?&lt;br /&gt;MWW]+Z["U_&amp;gt;FDR$_/S%/YT\DJ/^U\^O:B#V#Q&amp;amp;?\9F=&amp;lt;1_A/B*S5+5`C._48[&lt;br /&gt;M\_TTT&amp;lt;5$MR%WH*_]G,,56#%TG@E3+1B83@O\*%&amp;amp;`J`#JA*%X+&amp;amp;Y@F*QSBN(8&lt;br /&gt;M7C58N\8HK&amp;lt;0TIW52AZC7]H\/RQ7M@1]CHP]"]\S5"A1\O&amp;gt;B%"Z+CVU&amp;amp;6(J]?&lt;br /&gt;M&amp;gt;$O="IND+1G)Z4UWSX[#=+NX]61^R]?-#^A?ZJ`Y!$3G`J9/'F#^X)1=7E0/&lt;br /&gt;M%1".&amp;gt;F\]H]A?HWZB`FVTX]XG2W@&amp;lt;D@Y"IV1#H7@1Q\5;IC&amp;amp;SN5&amp;amp;GQ=)&amp;amp;*LJR&lt;br /&gt;M1A8N0B&amp;lt;C8'43DSB$\U!D;)M\!=EHBOCIE#1\EIJJX+?TE/"\_HAX)E9AMS^\&lt;br /&gt;MUO&amp;gt;N=)KT)(W.%#T?&amp;amp;*K.J/V-&amp;lt;UQ4+QE'6G97TI;"?VH/&amp;lt;:S]N&amp;lt;6"I0?J9U26&lt;br /&gt;MTH,4MDCXFMC!P\C'P@6-MA?&amp;amp;+"8(23]Y@M+@A?$C4TAD"7IP5&amp;lt;=JN(6?_IF8&lt;br /&gt;MSK2R7&amp;amp;&amp;gt;93^RDV&amp;amp;SL&amp;gt;'B:/"`24T?G8?&amp;gt;]E\O[.KD#(A1-=*&amp;amp;5[$)BF8RU@+""&lt;br /&gt;MWP;,F,B01IC3A^EDR0WGYZ51HH7]I0\UP"ZW4G*``WXYXZ'K(&amp;amp;&amp;amp;?A^.?^)XV&lt;br /&gt;M_(Z6E*:?;)D)MH&amp;lt;^_8&amp;amp;(;-1K7C9Z%V$KDR;MO72%'G&amp;lt;KI[)BE%O+JEQ)R1?+&lt;br /&gt;MJVXIL?HLF97(F45#Q@K(_?5YZ7XBC3#A'&amp;amp;^^M;Z9DK;(S*&amp;gt;&amp;gt;":71^+J1]NCO&lt;br /&gt;MTF40L"8`@[_$@'3?7:7J_=C#&amp;gt;3&amp;amp;I@:8#%/6B.NM1B#$'5CQ1%\/O`S:1[O&amp;amp;#&lt;br /&gt;MX"]?^3-R\*650M%&amp;amp;AH,M\[60[6^EN+*RL;;VEQ7X/=Y8I[_PTW]7-A[!M\&amp;gt;/&lt;br /&gt;M'J^LKJVN/'X,^==7BFM_42MWUX3)OQ',[4"IO[QKM!KOHO&amp;lt;3\V%8VOMHSSW_&lt;br /&gt;M6KT.$MI(WCF*9&amp;amp;S&amp;gt;HW5K'+*_,:;&amp;amp;7@BVR_7J7O4HJT5HA48W%P3;K^K&amp;gt;SLIJ&lt;br /&gt;MCH&amp;amp;_88FZOE3.FE68AU4(&amp;amp;;!5%'6.[V1%:2&amp;amp;FNO`6';W3FL?7K\TSWQ$GBW?:&lt;br /&gt;M9X.&amp;amp;7!\D/DD0`-J8XU^'UWTD6U%M&amp;lt;C@8-8?0:Z'=K#'P90,-J&amp;lt;)!&amp;amp;UBI9@H,&lt;br /&gt;MKAR(*S@YQ(8;F[M_?'1P;,&amp;lt;LY3XJ]]5[^U;S[^U_,8=&amp;gt;BB_OL@[&amp;lt;_X_7UR?L&lt;br /&gt;M_^+JXU5XW@`LL/IX;07S%=?6B\79_K^/WX-OC-(IL"PZX/62&amp;gt;6I8]PZ\WRF.&lt;br /&gt;M,:KU2-19C@$:41QP%,B_+A8/UU46"/SET;#=619C%R?&amp;gt;?*X@*J#]:Q8(%'_X&lt;br /&gt;MH8A$'S),KQK`9S8O@;L:`A]4[8F``GFH(SB6&amp;gt;U$GNKBF\@?A@"(D&amp;amp;"L=M"#J&lt;br /&gt;M`X&amp;lt;*QW+['/[:2);:WH`(+V2!H_/A!Y0K&amp;lt;P12E'YH!H0-_YDMNE;]T:"/GJTQ&lt;br /&gt;MS"@0W]!&amp;amp;&amp;amp;(K&amp;gt;4&amp;amp;(1(A%_'J*)R2!Z#[PIVYX(Y]&amp;lt;XB\C02'&amp;lt;26-@V(E"*'$I4&lt;br /&gt;M%*F6]-LA6V,117@646A&amp;lt;`C)&amp;gt;E'(A,VU[/@8U9IF&amp;gt;A,)U.Y6WU6#[2'\71O55&lt;br /&gt;MH5HX*NB(J",D)K%QK?&amp;lt;A0"$+&amp;gt;6+X^Z.S3KO9!BX1:I=@N\2+ZT$F!PH2F%&amp;lt;/&lt;br /&gt;MKQZDN`^\^WF[B&amp;gt;K$J/@_#-&amp;amp;W0ALQN^D*QE#EIJ!Z.UJ&amp;gt;H'0"$*YN?XQ#.M)V&lt;br /&gt;M1_$([0?:'6P15&amp;gt;M.:V+ZC&amp;amp;F;F:&amp;lt;,QF*-,=JE;B(J+N`9B"%*NOU.&amp;amp;Z&amp;gt;X,&amp;lt;#)&lt;br /&gt;MOI;E*E'9N2:6J5ET*3*.\W"`"M1HVJGL@L_S"8J137!B3[&amp;amp;#"UP-C"AKYO/F&lt;br /&gt;M,;+)!I_#R`_1A/!FI#SM(9F;A3VKJ@]C90Y?:NR1VTAVO2+!Y4WP98RNK.'J&lt;br /&gt;MG4UV53`T,D&amp;lt;`B&amp;amp;J$SQ@,F(&amp;lt;1;&amp;gt;C(\$`7CGK"'#3P&amp;lt;A^IYCQ=\N.ZH!,/9XLM&lt;br /&gt;M$JGR+L[,?FTA-A#L\&amp;lt;Z1/H=J9[]ZA`&amp;lt;Z#AP3XQ'S%\[H!Q3R&amp;amp;@VM4!2SN:1@&lt;br /&gt;ML&amp;lt;)66"L\PJZ1249C`!,YT!(:MO0BM2T4';6B]A#%Q;JNI4\9JE^K89W%40&amp;lt;Q&lt;br /&gt;M#U[4QMKXC6$0;P:#V#4!?3'3%BX&amp;gt;;$O8&amp;gt;U\0&amp;amp;ZV@^QY[1]$L?Z):NN^AGF9?&lt;br /&gt;MIY8/*+79QU3D*,R'EZ_V=_@;)M/GZ$//?M[_&amp;gt;4\^0S)]OAA8L"]?'`ID3(;/&lt;br /&gt;M.!WF&amp;lt;^WHL,J?*1D^#[KZV^$K^C#H0BHQ;Z8#?]NI'G(?,/D3ZRFS[%G[V4&amp;lt;U&lt;br /&gt;M,*M:VAA&amp;lt;8`+.&amp;lt;[/;P@`X[]D[&amp;amp;'6)DTRG%=((TDOZ)%V29VJH/`^Z7)8;#&amp;gt;P6&lt;br /&gt;MM/2]7T,\:&amp;amp;+.5CRD/^V!;HQ(T-ZHJ\Q\D2]%U%MC&amp;amp;$URS/DB7F#,+35SRC:=&lt;br /&gt;MIRP3S-&amp;amp;5/04`H,&amp;gt;FQ'_8V@J@2"NG=%U`,88WY.[F5.I(S*^.US,12(1`])C-&lt;br /&gt;MFT7R&amp;gt;4`N$(@&amp;gt;['FSE#X/2)Q3=I;FS8*[:&amp;lt;R&amp;amp;I&amp;lt;6&amp;lt;,HL&amp;amp;ATX$'$4=R39&amp;gt;ADS+&lt;br /&gt;MRPNG-T`Z\R"9-9D"[NP6X``6;GM:*;"&amp;lt;R*I)O&amp;gt;6,)!Z9F\-5-E_D))+[S,T]&lt;br /&gt;M8!PEME.DV(G&amp;amp;J4JL4QOJT?&amp;lt;;B*"$[`*&amp;lt;&amp;gt;P&amp;amp;E-N$_7*L:V'E[6MNH.FMBD-)(&lt;br /&gt;M;A^+KP3-;L[!,4$W28RNY5!&amp;amp;2=:&amp;lt;2!.X"[1P)10/P945;3&amp;lt;+0Z?V0IW!G&amp;amp;RV&lt;br /&gt;MN6".BBRUU#Q\M#GG]#:";LHPZ11")&amp;lt;&amp;amp;&amp;lt;]G.!9EL-M@&amp;lt;F!NR21Q`HDU8X9$-:&lt;br /&gt;M(10S\P*"PK]2A&amp;lt;-N/Z.O-@`0A_UF2;VC0R;P)`2Z'R48TD,:%Y9#-EH*B6*.&lt;br /&gt;M,*NR3#^-8EU9SIK!+RPN`+*7[DO^I8A&amp;amp;`A]AU&amp;lt;A(,%:00?#G1W%&amp;gt;WX(]@]EX&lt;br /&gt;M=G"0]!#CK&amp;amp;#L65F2`GQ\OEMP:+9[3-2Z$VY@2DNX6&amp;gt;P;I'KN%2-30"/MRQ.M&lt;br /&gt;M20,1.JN)8ZSP(:G=!1`!*GVA4U=BBDOH=3P[=='8.@K0YH5H1DL7$4#PMYM!&lt;br /&gt;M&amp;lt;FF9/A.&amp;amp;I\%8/M4[G@;R=+QSU#_9H.XU6-@==1I#&amp;lt;;X@,E&amp;gt;SD%H8:,X(7;'R&lt;br /&gt;MW[3RS4*&amp;lt;9X%K/K\5YY?YSZ_S^4(&amp;gt;&amp;lt;$OP@(@R#KMCR&amp;amp;YW9*W2G396&amp;gt;Z"$PF\,&lt;br /&gt;MB'`;`H`&amp;gt;$V%[4&amp;gt;-2/8&amp;lt;%W()6`?'4?2?S#%!&amp;lt;DJCVKMV',6/O$7@+*NX'Y*)N&lt;br /&gt;M%(\:'3KF"KR_16++O&amp;lt;R8/2MW_NBG8V$N6`BL3Y*E^8_VXR&amp;gt;D`B+[\5.&amp;amp;S.KI&lt;br /&gt;M6FPA%D-X-N8GGQ_+K-2)&amp;amp;6#_Q6B-2%5\NT!^9):T/M=';L\G=ZS1Y.?'BP5Y&lt;br /&gt;M^17MB&amp;amp;"8I&amp;gt;Z(*P^0$$-RM[2P8(]Z#%L$5.J*&amp;gt;JOHI)\SN:"D?OXT_[$($.88&lt;br /&gt;MY&amp;lt;IZD]&amp;amp;QF3((0^LI:/0V;^@D/V_*]DJO&amp;gt;CG#J'P*UA64/H]DJ[*X#]?CPX&amp;gt;!&lt;br /&gt;M10N:%O"QM9)R^BL5W!+%2&amp;amp;B&amp;lt;(K5'`.3`87)@$AS^&amp;gt;C,&amp;lt;31&amp;amp;DP]%?;],&amp;gt;)I0F&lt;br /&gt;MM8&amp;gt;_IL(Q1POYL%R`[7@1"?LZ8'S!IM,]=)9FW/GEZ&amp;lt;@!]K076H:Y%WTH.(/M&lt;br /&gt;M4BV"C)6+F5B+Q:(E2+)H*?V[FA\C8&amp;amp;`30/8YNLYT:SP=SZIQ./,I#;Q?8I;&amp;lt;&lt;br /&gt;MP79TQ8JW]\,0[&amp;lt;?Q,K:G+88U0@Z\&amp;lt;X:OBCZS&amp;gt;^Z10H@0F,.PV[&amp;gt;QMXQE.2N=&lt;br /&gt;M.!=*1%O``5L2M+3\`-=[87[^`0$31S(H(#&amp;amp;-9HCB'X/JD6XD-XQ#+/#&amp;amp;(5O+&lt;br /&gt;MC-Q%?&amp;gt;0OL,U7Z*OQU4'R!/'"21I6?/U#5WO,W&amp;lt;?AX#W%(!NU6VA;%,N*HX(D&lt;br /&gt;M&amp;amp;($UB3Y'V5'J&amp;amp;6I&amp;gt;86,_7$9HNHTN6Y##)C&amp;gt;KXD,'B8^+'GHQ('&amp;gt;5(B1P`&amp;gt;8Y&lt;br /&gt;MU)F-[X:'+;2'BZ&amp;amp;BAE/0BJ4R4T;%D%"%+\,J`,+9@%M?CE:F`_H,O')3BVZ-&lt;br /&gt;M6%(!H:HI[#(/DW3,4H13KN,&amp;gt;^@6[)(F+I54GJUQO-6J&amp;gt;9"*^UBS8L9SH!X\:&lt;br /&gt;MH6\F/U?^Z\O_)&amp;gt;3L'&amp;lt;N8I]__%==65U;_LK+Q&amp;gt;'7ET&amp;lt;9Z\?$CE/^O/)[=_]W+&lt;br /&gt;MS_,Z48:-CXS"&amp;lt;'3&amp;amp;,E1U'GY0.E(Q&amp;gt;DK5HCK%I)60H(BZ/(E^MIQ#J?Y&amp;amp;'O]]&lt;br /&gt;M#&amp;amp;1K&amp;amp;`)5*-+9Y\@(BTBZVFMBR&amp;gt;=PCC7S$5"\![!/!BWUI$]_?VP/HL((VC3$&lt;br /&gt;M?51H-IX2Q(V"T6;37@GQYA)KT3+@+6(H4%B)/ICT10!J=@-F6X:^\2T!8MBA&lt;br /&gt;M0MVP@9P&amp;lt;@VZLY=C88=91Z:@#DG^KW78S[,7DC8PDXL#(($&amp;lt;J,O])_02DT28_&lt;br /&gt;M:L9+`=VB9($X)WZ)SY4&amp;lt;G3;7"ED1DS6UI[9#+7V(7L(9*JZOAB92)KO/T!ZS&lt;br /&gt;M?JX&amp;gt;O=P_/E+;&amp;gt;[^HG[&amp;lt;/#[?WCG[9L@+P]RQ1'A-_PVC@H5LY++^$$MO/JKO5&lt;br /&gt;MHU^P^&amp;lt;^K1WN56DT]WS]4V^I@^_"H6C[&amp;gt;W3Y4!\&amp;gt;'!_NU"D;=#D.1UT\9RW.:&lt;br /&gt;MC0&amp;amp;Q^'`\QM1E=-&amp;lt;67Q)33M)6H`W"]GM4%&amp;gt;)S_\8IPL'L1.AFC"7&amp;gt;=@2WQ.]-&lt;br /&gt;MGIUW:4SM31ZNR&amp;lt;0RS:OU']11B(23.D"M2&amp;gt;!6:B,$\.C12EX]B^(A9GVU#657&lt;br /&gt;M5HO%XE+QT&amp;lt;KCO#JN;1&amp;lt;&amp;lt;/[8/7/TXK1B%;J-5Y@@XP9/3^15Q4[%@1P:MS@==&lt;br /&gt;M:@SY]F3F'6DKT;PNDLXU&amp;gt;;KX;8G_"^F?#O_;]]Q;!%#'F_V#H^K^WEMTORF&amp;amp;&lt;br /&gt;MZ&amp;gt;K-]N&amp;amp;+XU&amp;gt;5O2-,#8*7S+&amp;gt;=G*9^Y^;1183^#F,LR(+6-_NTAS4=&amp;lt;.QW\3;7&lt;br /&gt;M=IP,]2+RXM9C'E&amp;amp;+?00&amp;gt;-&amp;amp;&amp;amp;?*:Y-ZEE&amp;gt;^^^@'VR"?J=QS5-+R&amp;gt;R&amp;amp;J3TD-R1Y&lt;br /&gt;MQ_^(TNJ..L$93ULJ$'UX6&amp;amp;2Z0ZP(O4FJEN1K0-B^:-2\Y&amp;amp;/^Y%2^%+IKZ*3+&lt;br /&gt;M*$V,Y3.*$SJ;Z!ZD9B-]:YV1J#L+#Z],3D[-A0_D8_T%R'W6CJF[]!,O+2&amp;gt;G&lt;br /&gt;MUP5@:`IOFI=O%_(X^OT(YH@X'"(+2?B`0T]94-&amp;gt;J$UZI,2B06+B^+C1O@($Q&lt;br /&gt;M-=WR7P0`&amp;gt;XQSY/0:MZA66F65L.M&amp;amp;LSE&amp;gt;RV=UUKA]HR4#6X7^"^F?`?\;RY^V&lt;br /&gt;M_AN9AYZ[J?0IN40XJ=-&amp;amp;CWXKA16OAD6G`&amp;amp;_Y^95-==SC+0!;O[@@9T$FF?'6&lt;br /&gt;MN,%@!UNOK-"QRD\".`;VJGLO-J5NNW]1#=@1Y8G_3$'(=/U'&amp;lt;CKR(6:D(2S#&lt;br /&gt;MPW,5SP_&amp;lt;&amp;amp;&amp;gt;)'`_&amp;lt;&amp;amp;(@1G$^"R%:@LIT66QT)"%D9N!W'B3TZW91\LT'X%E!0.&lt;br /&gt;M.@NJWVB^:UR$J*K^8M`XXSLYG&amp;amp;&amp;lt;+"4]4G)'&amp;amp;H'E)1L&amp;gt;`L0O:B)*VD]F_[I#)&lt;br /&gt;M-K[W,9L^0(EQL5!X@+"P'B#L,P[[Q"'2(^,,U:0ALNY2_1%B#/8'K"N-).]B&lt;br /&gt;M5=UVT"P8=_32!HVP&amp;lt;&amp;gt;E4K#;0Z^,;]79Q^TWYU=N$3MR;7W-H^W2"#V@]DBLL&lt;br /&gt;M+I\4EV%[NUUB75Y/`Y^J\-U%W+[6$ZEW&amp;gt;GUJK#K4.^5:)`4MK'CRK?L):89H&lt;br /&gt;M3NN"5HJ[O+FLEB]$/UD4@&amp;lt;&amp;lt;J&amp;gt;OA05^0&amp;lt;A^Z*G-&amp;lt;GGKL&amp;lt;$3_&amp;lt;^V)TM![AP+D%&lt;br /&gt;MTK.0IN[MFW&amp;amp;&amp;gt;!92^L=.7)D`JJ"74;%3GL%!09N%T02WU!QB52/M7-3&amp;gt;FO[)9&lt;br /&gt;M$V297^8I."E"=Y87W*R7SH00*?(;GM'W/"4-`%JX9II(XP)SKT3C^@R;9@;2&lt;br /&gt;M@FEC"!A2!Z6K1U3\8JA-44!"3H%&amp;lt;?IZ?A\VAZU0Z'+JX6"JX:3)8YL@$2U/^&lt;br /&gt;M7NJ];FXMBN9.1E=`)M:[V[4C(,=+F9/YC_,/\*Y!6`'Y0`S!W&amp;amp;+A.L?7Q[7#&lt;br /&gt;M,OHH,3O39#-3?#V_W#27XOHF,S,O!&amp;gt;W5T)SI:;/O?I&amp;gt;.^!?8MZKV\NNKO72K&lt;br /&gt;MA14X)^'=#8[1USEZP"\M8&amp;amp;K:4W?\)Y1I)LHL&amp;lt;/`N]5&amp;amp;S.L#6890,/1(.*-X4&lt;br /&gt;M0`+_AM3U'[$E.M.VQ'-HU.^Y(QC^[3:$YA/N&amp;gt;B=T;KT3.E^Y$TP/;KTF=8E;&lt;br /&gt;M+C!OB+P5ICFG/V*%#8'SD"./GJ$9O.9(&amp;amp;D#7%B0%,]8^LL:T:W35H%6DG&amp;lt;$W&lt;br /&gt;M4&amp;amp;%AJ"4]W49O!%2Z(F.DN#\:M*-1;*'@);&amp;lt;&amp;lt;IHU.3!H&amp;gt;9)&amp;lt;*BS3\YRA$S4``&lt;br /&gt;MI"/2H2M9Y*?X=,UN5U_G+:B=X[RJ'E9?YVXBOP'`D&amp;gt;ZF;!U4EC6`.`O1E%2/&lt;br /&gt;MY-%$I&amp;lt;@$;T--FK6Z:&amp;amp;@I(O$*BTL1&amp;amp;B.CJ\\30\Q-H!?'R&amp;lt;5QL`330E2+\PC2&lt;br /&gt;M6)-Q(5W_\J\_QN%07QDNPRI-+;VE^EOJG[1PJ1T^Z6?).6&amp;lt;5CS/*:&amp;lt;N7_5:S&lt;br /&gt;M7C,K9]+U5QP"(00S17+#-JL?7.LU;F?'6^P\QU3"K&amp;amp;G24B`ZTPA)(8.L3@M'&lt;br /&gt;MKB^'4=1ABX_ST8`FUHBTD#*#&amp;gt;L@H1!;%(5#BKRJR.YR]@,L=M:.'I+&amp;amp;*G3)*&lt;br /&gt;MS])=O&amp;amp;H4\VFR):8JK1S&amp;gt;77VD2**7G$;ZM#OZ8?B.]'53EEV&amp;gt;XQ_$3A=I)'CO&lt;br /&gt;MZG7.^E*B_\1U:6S"\R/"UD*:3(+],7SAC=7L=Y&amp;gt;_Q/V?JU1T9W5,M_]9*3Y"&lt;br /&gt;M^S_/_F?]47%U=O]W'S_O_L_7*5M:6F+%`JNG=MD.!X@K\,(+N--+#*'I*::I&lt;br /&gt;M)^?RA'Z)^X5&amp;amp;N]!M#PMA:_04+PA9YW(3[_`&amp;gt;+:VL+Q4WT)"'[VU:$1([&amp;gt;/&amp;lt;S&lt;br /&gt;M7X4L7EOR[U6Q4%RAN[_EE?7EE4=JY?'FH\&amp;gt;;ZZM*5Z@J5WTU'^!=`U\TE%8X&lt;br /&gt;M*CJ=+:S?C8H&amp;lt;YSV,="8GWR:?C.90Y2`=FR?+RP^6M_!I&amp;amp;?_`JUJ^P/&amp;lt;'^+PE&lt;br /&gt;M1ZQHBN$9H)6Z\(6\U&amp;gt;.#Z)0K1^5+/\Z+_;CVG*/3Q74._9865&amp;lt;Z6+2R;3$I4&lt;br /&gt;M@(U?&amp;amp;^4Y+FVY\)($,\NJR2;;J13/V,!DTB;;]OMOOY&amp;amp;F"PQM:?Z_;,8;*P6Z&lt;br /&gt;MUT['O(`PQ84$$!^`Z0.UG.&amp;amp;1[(6B[$RGQKR!&amp;amp;HPMVQ"=AI$/L#]Z;_U?^/GX&lt;br /&gt;MW[P5WK7"]_W!/^ZD#M+_V)AH_[U1?%P4^^^-1ZN`^%&amp;gt;*&amp;amp;RN/5F;X_SY^#]3?&lt;br /&gt;M=BJJ3!)*]1PQY9OR_L$O0&amp;amp;B_#617U?%^!-G]4H"*!VS8(M_$\3&amp;amp;*$TOHE3QX&lt;br /&gt;M8PV94&amp;gt;S9B?"&amp;amp;H-#L]S\;'/L0@N9PVQ"K/FOWM*QRN_LVZ+3..XV+N(0^/8)&amp;amp;&lt;br /&gt;MJ]6\NN($^`*OI&amp;lt;`D8)Q-M?0SU!#`85&amp;lt;7VK1DVIIH=H^.N\+E9[&amp;gt;9!&amp;gt;PN-(Q6&lt;br /&gt;M&amp;lt;85!7.\$6MSM][\"$',==S"QJ";T%&amp;gt;W8??X3L,#1J!^_#8#]*&amp;amp;T?'[W&amp;lt;/ZSE&lt;br /&gt;M9&amp;gt;7ER^1B93&amp;gt;ZR(NSR3RW/'^TO[.?WZO\7,L'^\B.Q*7%?'!!D$HOZ3(JSM&amp;gt;`&lt;br /&gt;MRVN&amp;amp;&amp;lt;1X`YSE3/I"TTB*NQ#S\B__A/V5\N+J"?\,F_4.?.Y32^&amp;gt;X[_+&amp;gt;#_^0#&lt;br /&gt;M`0\@+B'ADOZA;)=4Y&amp;amp;7&amp;gt;'2%'HOXVX)L,^Q')'&amp;amp;K'^(CF)^V&amp;gt;]`^)_'K9.JD6&lt;br /&gt;MH6.Q?.JZ=%([T&amp;lt;5%`JXHWB1;89+=O+P\$PEUVS(?1.+C6+EV#ZB%\T8S]#Z1&lt;br /&gt;MRG,7[5.3\-PO;HE1KQU'S7&amp;gt;0%L2C,_1"`QB"UB-%"26J\TUZA[\8:8T=I%^]&lt;br /&gt;MZ;S&amp;gt;W1$J&amp;lt;8?X#D#ZBRT%H)_AR_M_)S/C;:0O[KU!55\]P&amp;gt;-[Y0[Z:-;^%W=0&lt;br /&gt;MM.O&amp;gt;!L@*2J0K/%#_4:041FX.OLNG8D$7)47-&amp;gt;-JGL.=]#437!H=F.(@ZI3UD&lt;br /&gt;M`QK$?)9JX&amp;gt;`BO%;;!95]`2Q!3OV-J;@`=O8_8!SKU)4&amp;gt;ZL=TZC"B&amp;amp;@$XV#CH&lt;br /&gt;MG+^';H6]NIPC^LR0&amp;gt;DM`%QMP9$ZZ8ZB&amp;amp;[5&amp;lt;\_2T9N!C:-*RC0+B4#T)`+)U2&lt;br /&gt;M#/AT\&amp;amp;.S,SH#&amp;amp;(6X?U88C`+!"75=1;&amp;amp;P&amp;amp;OAQMDH!ZZ&amp;gt;^,D-,\_0&amp;amp;#\`O7&amp;amp;ER&lt;br /&gt;ME'[U.K68_PY0ACX+[V"I)X^3NT!HB:7Z-GF`\,IRB^@3](MKGT8ZZ,,D_WD$&lt;br /&gt;MDVVU];/DMU_@??7:2-G`D\;LCV9\9C_Z3&amp;gt;#_E^^RCI65M97'CR?*?_F9^?^U&lt;br /&gt;MU16R_UA;`_Y__2X;,&amp;gt;GW'\[_3YI_1[WXJ^N8+O]975DMKB?F?V-]92;_OY??&lt;br /&gt;M`^7,M!-;&amp;lt;\PCJU%$+Q;6^,[:0?)!FO7/&amp;amp;MGJK"]]3W]_N-D*B,Q&amp;lt;W.:,&amp;amp;_5,&lt;br /&gt;ML[(!".SA&amp;gt;-03!\.NIRRR&amp;gt;NU?:_,?SR8H+XZ@4$U!7_5Z&amp;gt;BYY-/@A:Y*&amp;amp;N$D4&lt;br /&gt;MQUOL]HE,/UN_LZE.7ANJA%=#])1,?1N*1XQ.XX,QY4&amp;amp;KSRG&amp;amp;/#&amp;gt;:\N"5S+@Q&lt;br /&gt;M#WI.H)]"(B3L1'UN._JZ$CL:[;G@FV^^4=FS\*+=RSTPOR`(R*FI*BF)O!D$&lt;br /&gt;M[/(&amp;gt;4R3N2&amp;amp;##CF"J$Y$DX"C83E8.=XDI$@$S&amp;lt;$)C8K(;-S,(.'@EIDM`RR"V&lt;br /&gt;M23K(96`C66*R$^0RD$B6F*S#6P8VAB4!L&amp;gt;$M`S]X)7WUXUL&amp;amp;7NA*JLR+;1EP&lt;br /&gt;M^$II!:5(Z$E,TO$H`PX\B4D2BS*PH2LYHPEL&amp;amp;7AQ+&amp;gt;'C\B@&amp;gt;+$L*1M&amp;amp;N'&amp;gt;U4&lt;br /&gt;M#U4I"/KO+FQOY[/RG%LVT28QAVG??)8?$]^]JN:S]M7-1_-]-FIW6IRO0,XQ&lt;br /&gt;M*30EME['JPQT6$I*U-$J`^T^5*=2;,G`AJ/4Z1*I,@AT8#%(U_%L@D1P3N&amp;gt;;&lt;br /&gt;MB&amp;gt;`)S2&amp;gt;/I5YJG4*VY@(W)J=;F$)V!GY03_&amp;gt;[Q/VTWK)X):&amp;gt;&amp;amp;;0V"O?W#5]N[&lt;br /&gt;M==N!S&amp;gt;#@L.*_[]&amp;gt;.O`0I&amp;lt;[R7+)5(P7)^4KF,C2F7?PS*KU_3X^O7/P8ZF"&amp;lt;F&lt;br /&gt;MF!B?@&amp;lt;PE)III93&amp;gt;LF"31.P,)0XI).C;IYR*4L-=RT`D@%)3DRV34`+`5YILG&lt;br /&gt;MB4.`7Q/B(S4N;5&amp;amp;NX$_YXE&amp;gt;E^53E`-_=V=[9`=!!4'E]=+A=WZG6&amp;lt;(9-5BW4&lt;br /&gt;M3&amp;lt;)RY4[*85B5+QY3CHA6:;;2;Z1EQ16+7M.ZE&amp;gt;2+55+R-S8VGJA1&amp;amp;1&amp;amp;2"OR+&lt;br /&gt;M5MS6A,ES\&amp;amp;!1=&amp;lt;[7(@D\VP/:XSI8^Z7^5MZM;.]Q"$4&amp;lt;3V=2`;([S;D`$=5S&lt;br /&gt;M_,+QE-52M0#_S6&amp;gt;E;GPO!#I,,RU=';TYD"C+F*A#+P&amp;lt;899D2,.BR,[?[S_Z[&lt;br /&gt;M4CZB%KBC$25',[)S$*F3P)G:B!="Y`#=J1Q4]G8J&amp;gt;^4J]]-=2KII@8XD+=M.&lt;br /&gt;MV@E/Y?U7!S!"-.SPBH..0X!_JWOEW6-`X#G&amp;amp;5+K+^.H^XR&amp;gt;!F&amp;amp;,@@L/@:7?'&lt;br /&gt;M`*;7ZM[?=,+NSK3"\"RMSZ''J_D?`]P'=6CM*]KOGG6!0]SA3$)&amp;amp;/&amp;gt;G0&amp;amp;5L,&lt;br /&gt;M@&amp;lt;K6Q4=QS8Z/1Y77B';HV&amp;gt;XZ6!9'V[BV+H"6#U[\3_6@7MG["=Z7EL["&amp;gt;!A8&lt;br /&gt;M-#"?'4,.N&amp;lt;!.MOM94@$V.&amp;gt;="/Y]H2HZJ,$&amp;amp;A=OS\&amp;gt;?5UI;;I/*I"316:BK80&lt;br /&gt;M3'\A#LRR=-FI36]$_)WC6HK@F//Y5W^UEE/!7+/EYT8K&amp;amp;&amp;lt;@C!Q^,_M)%;P3_&lt;br /&gt;MRE&amp;amp;[U`K[&amp;lt;8I?Z2#03YLJM8%*JM'GLFZ6Q-1Q&amp;amp;F)RP-*?4]@&amp;gt;+_HJ0!\Q93#_&lt;br /&gt;M8S+JE&amp;lt;4=A03X(.A&amp;amp;\;!S32[SEV#WZ\V_&amp;amp;00I:7-+5LO5QQ6DMB)^79)8!,GR&lt;br /&gt;MM`IPSZ)&amp;amp;8SA82ONL';ZZJ6/`YWZ&amp;lt;S_KG-:3-9SVLR+N7**X&amp;lt;E&amp;lt;=A@I(=E+8M&lt;br /&gt;M)"`N;+$7=(K-.8]9R`,-C;G1\H5.SO?%=\F)&amp;gt;"0D91]%",*C77*8-ZT%.GKH&lt;br /&gt;M?%^B2BSC-JO`3LO-SR\O+W`J3+ZF3W(+)N.\S;N\&amp;lt;)K9TJWX0ZJ7VLE7RR;Z&lt;br /&gt;M@*($UB""`RUE&amp;amp;MUI,]003,EGSXA&amp;gt;&amp;lt;;]W[[@SA68AVL3E)&amp;lt;=##@/]S#^!#_&amp;amp;D&lt;br /&gt;M#[4)']QM)_[M&amp;lt;7MQ?Q8+R#\#O[U8P#]Z*YI\SHY**&amp;lt;OF,..[RRFN\=1F*A+V&lt;br /&gt;M$MUS%#&amp;lt;-UV+IOSD^MN`(\\N9&amp;lt;^K&amp;amp;&amp;amp;HBTHZ,-Z()&amp;lt;@"A=#YHYB,VX#1L7\:8Z&lt;br /&gt;M`LC`8&amp;gt;QL^@&amp;gt;6&amp;lt;XSM5FL'SH)*.&amp;gt;`6:&amp;amp;)A??YS%)9.2;$[L&amp;lt;)D!4DD%/4;+[G&amp;amp;&lt;br /&gt;MAW&amp;lt;8'TFICZRO_F9^?N4M'&amp;amp;?%+?7);$.E8-`P!WH&amp;gt;:6OOBX")V.*OC0KZO+)0&lt;br /&gt;M&amp;gt;:YTVO_0.D643MA&amp;gt;'SD:SP,R0]=%\_.8=[FZ`VWB9IM^!C@@Z-,R=33P*(?O&lt;br /&gt;M_E3:,&amp;lt;(A+27:0J]__L%S3J,*=7'[$):&amp;lt;'A[IX?P\]C##X.&amp;amp;4RGJ##.,;XG?E&lt;br /&gt;M@5!&amp;lt;2(T--9%=/!%'1,YY.YE6I]ZN\F+W*B?HC8K%574G9:,Z!35'[Y,(\UGA&lt;br /&gt;M_G)+\UEA\3!5*(`@X`&amp;gt;/3]/@-H7Z(ZH!-[36VJ7Y&amp;lt;SY9)-LJF&amp;gt;':2AR$,)+S&lt;br /&gt;M+&amp;lt;"8",`_#YM]-&amp;amp;]U/N.&amp;gt;YR;D3`%[;D@I&amp;lt;[PF\^H,J!S;FPI5K3Y5)KR44XP:&lt;br /&gt;M-+TDY-J41KF'F,MH;$YE,%TN4G.D`;,FFY97=9@RA^$S7&amp;amp;&amp;lt;:*WN)C7&amp;amp;A3^4K&lt;br /&gt;MQUA3*IYD2UT&amp;amp;]S*PK-7F5+[7@YJHP78F;2"DTB#)U6W&amp;gt;BI'^HJH\=G+S!M[[&lt;br /&gt;MIC&amp;amp;[794D.5QJ=#?I85/):]!ZWZ94^+NI^"5HHI$2IA+#HQ-@B4FZ)H%-/B]A&lt;br /&gt;M4R4^&amp;amp;XH9Y:@$-H7V\C+9'%+$4MTHB'2KI`2;7S[;_$XOD+AC+HDX67P46B!1&lt;br /&gt;MVQ@TXYW90G4H2*PBE9ZT&amp;gt;=P,4%:7,I%_`',:UL%E,DW;390)]&amp;amp;E(1$AZ3R;)&lt;br /&gt;M*$M+)M1"X+`@FRE,22I7XI\G=$74;IHCQ;[;4\6DZ8/%Z&amp;gt;RXR"=GL@D*:C::&lt;br /&gt;MER;"+.`@'7Y-_WU#P3I33BE3K]M@'&amp;amp;PU@:54*30O[K&amp;amp;YY`FJ4H;`&amp;amp;Y=-Y=&amp;gt;I&lt;br /&gt;MAX=J'Z_7K]&amp;amp;IQZMAK"D&amp;amp;[J:R"7;&amp;lt;J;)4UE:-D&amp;gt;?*)P*HJK$93*ME4[D5ILP"&lt;br /&gt;M#_@41IJ[-8$7&amp;amp;"]IFC=IOOT&amp;amp;S?W(?*\.3$0^;REPX3#LH0$E&amp;gt;4XRH&amp;amp;*)'K25&lt;br /&gt;M,27;&amp;amp;&amp;amp;P6W&amp;gt;/&amp;amp;8OY)EW5H/"F&amp;amp;ETI\Q(O1)_D1)E*HD!D?C\WQ'N&amp;amp;P%0Y&amp;gt;[N_]&lt;br /&gt;MLCEQ9:9/8]I83AWJ5.24AH014,IF&amp;amp;%\WR&amp;lt;TR&amp;lt;2+']@TEC"T[=Y.E3KTF.N78&lt;br /&gt;MHK]R7.$?/IH0D)PYR3/(&amp;gt;Y^([_$=@"30OW&amp;lt;&amp;lt;.$&amp;gt;`,0-W&amp;lt;;M]`4`N*A=,3I[;&lt;br /&gt;M7`EZ"E*!DI-VH7Z;N`WHS9]'.]QCQ2C8S1'&amp;amp;Q!(UQ%B]&amp;gt;518_R'_J+#Q*(&amp;lt;7&lt;br /&gt;MQ=IR'1&amp;lt;X!R2@&amp;lt;/'8B_&amp;gt;-01N=9)//&amp;gt;M*8_-!&amp;amp;MYAB52UAD+.XU6K7\4]H:PQU&lt;br /&gt;MQL,&amp;lt;;2,,LP#$"IHS%X+"WG[E]&amp;lt;'^X='F3"?L_G\WZO\TNE]=QPWQ/XLK5O]G&lt;br /&gt;M96,5XW]NK#V&amp;gt;Z?_&amp;lt;R^\KE3K^''&amp;gt;PBFYA_V.N87^WB_,_&amp;gt;C'.?O?^FX3_$XOQ&lt;br /&gt;MJ^JXP?[W\5IQP\1_?DSZGX_75S=F^/\^?LN+=_&amp;gt;S#F/&amp;amp;?DG&amp;lt;II841D6@J$6H&lt;br /&gt;MNCFY)#I"&amp;amp;/]1`3J-DIDWU='E2.U%[U51K0)Q03EM+%4O)RJJ8A[4H)QH2D0W&lt;br /&gt;MJ6C+,UY3JG&amp;amp;/NL,170Z"NYV@Q:D#_3D_`7873O@-L+MPQ6^`?9Y#?EV10"6/&lt;br /&gt;M94XWDZ[Z4QSUWW[,[FX"[NX'*^V!*(ZHC$=Y9(+@?=1NN5MX&amp;lt;Q-(GO=9HF#8&lt;br /&gt;M!_!#BJ2&amp;gt;%Q?O9`+W4+$?NH\4:B6+WPLBCJD#N&amp;amp;]*JG;\[%7UJ%Y[53^LT+7?&lt;br /&gt;MW/!R$'U0PL_6F&amp;gt;R"L&amp;lt;UFC!RGA6ZFNAB.-I/#((U81R$._UGO14#*4"7\MA4X&lt;br /&gt;M]8KG^5))56JO*O7#_;_E%+1K#J.WJ[/1^9N-C;=;_+".=W\+)RL+6_A=TVO2&lt;br /&gt;M8\B1YTHZ8&amp;gt;]B&amp;gt;(DA`%X=')!62[U6_9]*;DLM+\-*'4)ZK0S-I5"'V,1NW,1N&lt;br /&gt;ME["6+9,J[:+&amp;lt;]&amp;gt;URN7)P5-F!SY_X"BHETV$%[ZLQTZ&amp;gt;TB8F!VLNBU[NAZH9Q&lt;br /&gt;MW+@('])#'G96W+[HD1KZ\*'B0:+9,8-P6"G_5']V_!PZ\A;:X$RONL3AA)[5&lt;br /&gt;MH&amp;amp;=,4"OY&amp;lt;MX..ZTXF+O40U)*#,D6?G,FWIEW^F2ZMX)UFIFTDPKD][#.;]F&amp;lt;&lt;br /&gt;MM*,&amp;lt;=2DP]UG4NI:&amp;amp;#=ZC0CXYMEU:(GD%NU7/4H0D#HC4RA6H"\-([1WO[@9S&lt;br /&gt;MV&amp;amp;W=\N^^&amp;gt;\NM8(#D,@##$%)&amp;lt;Z*/]O;3&amp;lt;.+2%&amp;gt;-"L#P&amp;amp;II!;&amp;lt;.ZA.+=CKMU,+&lt;br /&gt;M.B/ZG9,=OQ;P.,.UJ+Y3.E.&amp;gt;0J_V+C8W&amp;gt;S`P,$Q3NK;CQ""\3?]:\=#I7UKI&lt;br /&gt;M:9W$TK:3*:53&amp;gt;HIE[J*G0,K6FYT&amp;amp;M%!"%NI-P&amp;gt;OD-YL&amp;lt;`=[+M@LJA`4R1#V7&lt;br /&gt;MAW!&amp;lt;#.#8:.6F50`G'WH0[RA:V"L:!*Q;'?-&amp;lt;G8&amp;gt;PO@=HEA*'-P%K1\"_74\&amp;lt;&lt;br /&gt;M2IU!\L=-./)&amp;amp;**0-.\A_7E/T;97%VO6G]BWJ?=_HM%L2VKT=M0IJU,&amp;lt;=4E2M&lt;br /&gt;MQK7*&amp;lt;IQ&amp;amp;%/:A$B*BU&amp;amp;^H,&amp;gt;_[&amp;gt;#FM'Y^J[S?65E9RB/Z@?DB1F@'5I=9,8&amp;gt;((&lt;br /&gt;M"&amp;lt;-TQAC?IPNE&amp;amp;#,.@5Y`_EWWF](!&amp;lt;+//NQZ@PZG___SRRZM7.SN7E]UN'`]7&lt;br /&gt;M5@[_?\$#F$^,UU&amp;gt;O_W2@LI#MR1/T^?4ANYJ3QW/@E+,+*PLY:NE_(VJ@B)1-&lt;br /&gt;MH!0P1"K&amp;amp;=1D-VYWVOWB-;N&amp;amp;Q1."@_`IA]U]^001S'38&amp;amp;\=BW5Z_P&amp;amp;P8LNG2^&lt;br /&gt;M9:4[RS)(6[9_\O`M?R$8.SL(`\8^3@7Q:(,@I(#`+P3A\A(A7`(^20&amp;gt;QD=Z$&lt;br /&gt;M#2[=[5(?VCV@U=SRG(^RQ.@=#H83#AK`_0^0:#M7-.J0GX&amp;gt;=80TQ'YHK75(X&lt;br /&gt;M4BI@LF1@SC*4;1`"+84.*&amp;amp;'9T&amp;lt;')"WEEA5$YO?X+=7:`7#P/!^C.%&amp;gt;?%Q1N,&lt;br /&gt;M%&amp;amp;#.X4`99'.Y=-11W$"$\0GCZ%*U%VUT20:'HMY"$_?&amp;gt;($3A=QUO@`"%;1D(&lt;br /&gt;M?0H%A(%&amp;amp;T`X,EBYZ'(*F0RDXEM5I+]*9%J9N0KI@:`(]W(MI]V+_UP3(?G,(&lt;br /&gt;MA];W&amp;amp;%40_NLU8*?#::[#^::"933:C/79@H.:Q('5'&amp;lt;(50)\C6:!3;X,Q:J_,&lt;br /&gt;MF%[@2I]0_Q!.[D+&amp;lt;_E=HSFV#?N$+D/MQV#E/0?]4[C:HGV!NMUI"C"`H=%"*&lt;br /&gt;MQ7*&amp;amp;8@&amp;amp;R$0&amp;lt;W&amp;lt;*DY(I.8FA/8.22H_FAN_/Y_D^0_XQ+,+Z_C)O]OJ^N/M/QG&lt;br /&gt;M?75CXR]D$CSS_W8OOWN2_Z0(Q&amp;amp;&amp;lt;BH%O]9B*@F0AH&amp;amp;K"[^WDBH.1U58:6(7I@&lt;br /&gt;M;*G]/CH)P#&amp;amp;#,B2"\'-O;J+JF$@A^,1^B(H!P/WGE9_:!][LPU@JYD4&amp;amp;S1=/&lt;br /&gt;MK*ZCD`:)".3/2+'7\B9$J$^26'RYJ")+?&amp;amp;()B.3F^YSZ+_6LNK=31SD);'UZ&lt;br /&gt;M/CK&amp;lt;&amp;amp;Y=BW""\J+&amp;amp;.1'7')WUXA+Z6Y3W`$8T&amp;amp;+1\VC_/7PI:&amp;amp;XYB,-QU3O[:"&lt;br /&gt;MJKX.-;L2Z/_WCPIKJ86N'JU).93JD3@!Y1A?*_Z92X#&amp;lt;.ZC&amp;gt;,&amp;lt;B0^:&amp;gt;OEE'=&lt;br /&gt;MFO)-)7&amp;lt;I$XHJM\M_DP`O@.(BO;GI\UXT%%\5PH6A:PR2%S`"0,P/,Q8-NH!Y&lt;br /&gt;MLS&amp;amp;@VE,4E"Y0#`$2O!BL`-UB\4'62")S*?)58-03NQ+6DFP-9B7@O9A+2`Z0&lt;br /&gt;M;4#9`?XE7C&amp;gt;Y&amp;lt;3/ZDGY396#ONB)N&amp;gt;,NY93/M'O50R?J&amp;amp;8P%FK$^A#\)A(8-Y&lt;br /&gt;MM("8!=:([AQI-0OKB`LE9I,EEJ1]!D.]('A(@HOB/$.S\`RD]3&amp;amp;DV"48[AC]&lt;br /&gt;MKN!QY&amp;gt;,U:$0=&amp;lt;-L&amp;lt;_2V,&amp;gt;MZLX_#R!U_2/C8&amp;lt;!H^1Z-U!9BR*_SV']S*\\D;Y&lt;br /&gt;MU#9U`?CF*QK?L4Y@B1R/'*ZMKYT0.U""J;^Q(N=[[3Q7F&amp;gt;RX-.KWZS2?5M#I&lt;br /&gt;ME9MZJUOL=4K*-U%J&amp;gt;NJWG+]@B075BD+RE$,Q?IH8GS4&amp;gt;-9O8KL]O_G\B&amp;lt;WX/&lt;br /&gt;MOTG\OZO@]+5UW,C_KQ:-_L&amp;lt;Z^H(O;CQ&amp;gt;G^G_W&amp;lt;OOGOA_3U]NQOG?ZC?C_&amp;amp;&amp;gt;&amp;lt;&lt;br /&gt;M_S1@=_?S.'^KS:HU/PQY,U'M(Z%J\%E:(#N5W&amp;gt;I/E&amp;lt;-Z[=67:(#,3=)?H-NX&lt;br /&gt;M%$&amp;amp;!Y%_LBRH&amp;amp;W5*%W7XTP&amp;amp;N5?D0:N8K@?KGRA[[F(/4$(O^/B5`7?87OONM3&lt;br /&gt;MUMJ[=E_%K+E`_/-DU0-7T0!:OMC_[KLI^@:N=L&amp;amp;TW$Y.8G5+&amp;amp;*JO/ZYP8!DO&lt;br /&gt;MVVX@"-L4W@[)N!L4"UPU`K\]$[4)7-V!&amp;amp;XLXV=/Z8=0);MD/JS8`7'H;U\80&lt;br /&gt;MHS]J0IQIV5A]N`P)CV!@S!AM7YCVY9M"66&amp;lt;6E#\-6+-6'JBCFA"N"9'@`&lt;br /&gt;M[](_!0!:X@@S.40-\%;&amp;lt;#.:HVUHPLF-N%2_D5E$/53.M1=!8N22L=^,+:I?-&lt;br /&gt;M`1]YX:.ILW#PU$=(]6&amp;amp;]2KOELS=[,!I0.MMG1`';O-F(AT^TE`CGB#;#TRP`&lt;br /&gt;MSAF-'^*?;QARTD[(VC%_J/YWY6H-V5F&amp;lt;;CJNJ!C[H-;;5+2QH`_5O9^V=ZNP&lt;br /&gt;MFX^VCXYK=70UA0P*!U^U:ED):(E&amp;amp;)'32^")\+R)$..C*NJ6HCC"O0,1`0YBI&lt;br /&gt;M$Z6L.&amp;lt;`]+`Q+YM=H12K$PQ&amp;lt;OEHDYE&amp;amp;]U&amp;amp;G/#,B*$30:7:;&amp;lt;VJ^8'G-C99JU6&lt;br /&gt;M4ZW.^T%K&amp;lt;V=G!U/0:`L.R7#3JE:PKXQD(H/$=F!1_&amp;amp;&amp;amp;@K\V*.H+J-U4A^;_,&lt;br /&gt;MN!Z&amp;lt;&amp;lt;T,\.D-&amp;amp;[U'&amp;gt;2&amp;lt;-`Y=D%M9`#+/N(6&amp;amp;A&amp;gt;'U1G6NE$T0RU+8-[?3VO'A,$&lt;br /&gt;M7!U&amp;lt;O*0R=.P&amp;lt;[F1R:4IV&amp;lt;B:1*AXKJGAE*Z\/JO`QO&amp;gt;SQGI3&amp;gt;?K9;22\/&amp;amp;2I'&lt;br /&gt;M7U%&amp;gt;LGQQ&amp;gt;58TG%"_HX686O7?]O9_WALK*NGIA5AG&amp;lt;4)]5J%QQN7?_V\2_^\;&lt;br /&gt;M2WU='3?P_^N0Z/#_*VC_L?IX=O]_+[][XO\3MG&amp;lt;S"&amp;lt;"M?C,)P$P",`W8W?T\&lt;br /&gt;M"8!K&amp;amp;:ME`#9M&amp;lt;Q.CA\OM/O/2Z*1:6'RY18"'+*6B3C\3;L,N$/S]!BR4/%]]&lt;br /&gt;M;0F+U-P*2.&amp;lt;753"[\MQ!+5[TP18@-8S$!$`LG,,VS`(UST(";)(K(8#-B([]&lt;br /&gt;M1U0;1G3"OV3#SG&amp;lt;PP1QY;[L(AP@=`&amp;gt;:Q4&amp;lt;"U?X/`P^@\"\]CG_/JN^\PA2]*&lt;br /&gt;MOJ`I,"`M:1+?K!;8=(4H:.2Z4+1!H=Q1OG'6:?3&amp;gt;4?]CJ0X:H1G7$NJ8D[\X&lt;br /&gt;M-*?N]M^LO*7$A0&amp;lt;+Y$^,GK&amp;gt;`:,9@6&amp;gt;T&amp;gt;C;%P$S#RL%L0KH#-TG@S'**9Z^?M&lt;br /&gt;M`3#*,`R94@:Z]DU)+&amp;lt;E%ZQS-F^05@GLESS-&amp;amp;8SM',^IG8/C`:^&amp;gt;5TX4EMQ0O&lt;br /&gt;MC?@-@&amp;lt;&amp;gt;;;;TP#*&amp;lt;EN1*74_:NED&amp;lt;:.Z=G6YW2Y1*N/KF&amp;amp;PD[CU1R\T;IRKI[F&lt;br /&gt;M4N?/OWM"=6'2&amp;amp;,9Y;W:BF-19/[%"#"P7#@S!`P`;B3&amp;lt;&amp;amp;I;F;!C+6,=';.-!N&lt;br /&gt;M(QISQN(M4&amp;lt;V9W,W=IX$+$0_A-=LY8KA-&amp;amp;0#XQ/W/?&amp;amp;Z'H;/,\:+FQC#J&amp;gt;$TK&lt;br /&gt;M-.N4,:]@`117_)&amp;amp;0K9X8"^[KV&amp;amp;B(QO;_@?&amp;amp;8&amp;lt;P=D;"3,",1C:V$,=&amp;lt;835D'&amp;gt;&lt;br /&gt;M%*3^VR["SMG"?[#-\-6@4STNO+7&amp;amp;FI&amp;amp;&amp;lt;B-2&amp;amp;I$^`5L;B!*=%;JW4E!FS]G__&lt;br /&gt;M-XG_T^XS[J*.Z?S?H^)J\;&amp;amp;)_UU\1/Y?D"6&amp;lt;\7_W\+LG_L]X8YEQ?K?ZS3B_&lt;br /&gt;M&amp;amp;&amp;gt;&amp;lt;W#=C=_8CS.T?[O?K/U;U'J\&amp;amp;#_J!QT6U@R##DH-`C,=Z;;JX]_GXC%SP(&lt;br /&gt;M&amp;gt;S!S&amp;gt;*,AV77IE]L_5&amp;gt;HZR(-E)I]HM\)/I:C#:#X1;O&amp;amp;IDV0H'S?QGZ-P%+H)&lt;br /&gt;MJ(E*()URK7;D)66,QZ2,DZ@].&amp;amp;4F\KL)'7C'0Q/KP-&amp;lt;PIEK(%HH?\!HZ1)?@&lt;br /&gt;M0#$!FT?VB?1E*P?X8_%'CE,\#&amp;lt;&amp;lt;@E4QW53'!K6/I@?JH@CE\JJ,&amp;gt;,%T@X&amp;gt;`A&lt;br /&gt;M%PV)`2U[=*_JE@'&amp;gt;ZN.G1!)3&amp;lt;LA0BZTFY`'*+ZO?MJ``*_!#8EKF(=Y@(:SL&lt;br /&gt;M"EZER`&amp;lt;L=A9%'?'BAS4+?9R%`DNFP!/4+X3,GX#=I?P?8C@'VL,LDI3^JIO[&lt;br /&gt;MN;9-(;3P;V/8V"+T2_\L+ZH:G-'#45_A?"*1W3ZCVWH8.\R@ZX:BDI$\Y/Z\&lt;br /&gt;M?[B3+&amp;gt;:+P*H\%*C,00.I_`"Y2T/58WC;+6=IZT9]0E_"0_)PF&amp;lt;5Q:0PNFGDA&lt;br /&gt;MC!?AY3V1QKRDT#=8-F-]A\$KB1WLXB+Z&amp;amp;QE_=&amp;amp;E+ULCO,=!7D]G46LAQ"I$&amp;lt;&lt;br /&gt;M&amp;amp;88MUI"$%G7D_O,0EY&amp;gt;.#\.7@A3-96X(`_&amp;amp;1?56&amp;lt;%T@TD_$]F%$S/@$VAK6J&lt;br /&gt;M-+7O\3L/E4@WI&amp;amp;69&amp;lt;J.W@!$&amp;amp;PW&amp;lt;I5:J%0B+4^X)PUV'APV4#9M&amp;lt;V7=^=DB1'&lt;br /&gt;M:T+#]A[B6D9Q!]:!SR-]FXW^5GLA*HG&amp;amp;,,6)$NW&amp;gt;670E_8Z,K`D3LQGZD\FK&lt;br /&gt;M=A1O;C;Z?&amp;gt;PUW0?3A[3^-1%LZ``MJ.VS:(`UN&amp;lt;,_M0^G:/.[D&amp;amp;P2)F8S^&amp;amp;]:&lt;br /&gt;M@S!]2GL&amp;lt;D%_2(,`O8^V!-!)*I;6&amp;amp;\-'DQAAP7](6L:H.6V,MHB^P4O%/6JOH&lt;br /&gt;MP[1V48;?HV5(B%#;Y"&amp;amp;M=?)I6OLDR^&amp;gt;V\,#NAV@TU`N3M@JZ+N!-`"=2SZHO&lt;br /&gt;MJ#Z@5D?VRN6R&amp;amp;?Y+NY\.T"&amp;gt;2_ZDN&amp;amp;-/!,A$&amp;lt;])-!Y&amp;amp;PG$6&amp;lt;A84`=WG&amp;lt;::,0M&lt;br /&gt;M!;09N:2CBBP9&amp;lt;#%[G;8:%`&amp;lt;BM&amp;gt;-:Q/.#*_G55_YY5FC0:NG82"WZ^7")M1NA&lt;br /&gt;M+H/*JUA,&amp;amp;.;:5I2"C]G8RJ]BT&amp;gt;,2*1^+=N&amp;amp;;&amp;gt;OJ4Z\NQED$#J0#46#"-L+XK&lt;br /&gt;M4@=&amp;amp;92J&amp;gt;5-*9R`+0F6/"2+T:YN;.H*'OZ/'3M!99/3!*?;/R]L_2*E;6^K.U&lt;br /&gt;M2G3"_C3S9S7A_DPC997M_FRM^N/F+_N-N0^"MCD*2EJG;!N(%G:,0J@9U&amp;lt;%&amp;lt;&lt;br /&gt;M'Q&amp;gt;_&amp;gt;Q-3?)-P["(B&amp;amp;?D]J9\VIE&amp;gt;H5=1(*&amp;lt;YZ(9IS5077*(]X(EE*]T2B3)GW&lt;br /&gt;MJ%ZKW=$45QQO,AJ#0P-&amp;amp;\25)VG-;&amp;lt;L4FERU,[O8:W&amp;lt;3(P!=^L[&amp;lt;PD&amp;amp;(1?$1^&lt;br /&gt;M633?1'IKAGF1K'1N"9!,TB50PEL0!62FX@\15F[IZ;!;[[8:UPZLSRX.N_X[&lt;br /&gt;M/MR^$`+Z'0(6J[BR\A5`T#70U_2BW?N*TL!$NC&amp;lt;P`YSIT)`K&amp;gt;9S&amp;amp;,&amp;gt;O)*G"-&lt;br /&gt;M[4:G_:\PR0-F?V[W6M&amp;amp;'6$6]SG5.Z!;#9Z91:.U)L&amp;amp;ZBS5XUB#230J(&amp;gt;3H[S&lt;br /&gt;MM=LBNL!%$_DSH(&amp;amp;,WCPE._9SJ!S'+`YR.',F&amp;amp;TZ)FVV(K)]F[]`7&amp;amp;E68)4;/&lt;br /&gt;MN4#+7,*(97)T;\,?Z(8I@[L]P[3-H*`M\OV2[*T?J!NON/[:%U-R`9+"MF8.&lt;br /&gt;M==L!\Y&amp;amp;Q*@X%W[=-:*8#*;/I9W2;+5&amp;gt;WC7@2-*?IG-?GF*VC,L(U8;&amp;lt;_O-;+&lt;br /&gt;M86[X-6,)I&amp;gt;]@,%-'\\A=(Y\SH+_7B#K;X9,O0V#+B!M%")+SQD[&amp;lt;KO%P*#K+&lt;br /&gt;MYR9I@VZM;U@ZH:&amp;amp;T:V4;?Y8T8R=L=E#&amp;amp;3%R0OMF(!C&amp;amp;B0=;H0/SW'@Y6Z/&amp;amp;H&lt;br /&gt;MB:X`R=@&amp;gt;N/P.C,P"M+(#[-9YJX[WMJ@K&amp;lt;MY"SD82PBM^K&amp;gt;V7_U8Y4MT&amp;amp;O&amp;amp;M?&lt;br /&gt;MF03/@!^^3TGK]NN8;M'(\'UA^)Y0&amp;lt;"DYTIS^^=(BEZYQQRP#7&amp;amp;\&amp;lt;C^@47]&amp;amp;B&lt;br /&gt;M0Q_'NJU9D3&amp;amp;]74M'OUM3BW0K"11+&amp;lt;Q!-:?2(6\:Y'0G#96-P$?(]!HI@?8$L&lt;br /&gt;MIVTYG&amp;lt;3W@DA?W2YVVN&amp;lt;A?F1T&amp;lt;?&amp;gt;=%(HLT3/3FHT5UW5!)(%C:.$"'HN:;3%+&lt;br /&gt;MZ/&amp;lt;[:`P#STOL&amp;gt;K'EN7EKMW@+H)V4U7]:0$.'$3KQ4[U1]RQ$+X7=1O^)ZZ%6&lt;br /&gt;M&amp;gt;PUYBC"T"0C%!4,](FH($`P7$79&amp;amp;8WF4-:"0G%7(*(I8G7*S.&amp;amp;'*B:"G8\XK&lt;br /&gt;ME)@2^XV1[NTFY?-F!6@!."/0IX:K+J82&amp;gt;%C\B1RPYPVZ7`52*^H'6ASR#&amp;lt;^D&lt;br /&gt;M%L]S2YBP?C:5,FD-HGZ?9P`-5MA)`?(/(4Q(Q!`^A.JR\9Y$/EK.TXKP7@S]&lt;br /&gt;M\A0*!3E\!ZRO9DQJ&amp;amp;($]?*B&amp;amp;:1]R2A@;KJ/&amp;lt;03(742B\/]^I_T_E&amp;lt;#_[4+`C&lt;br /&gt;MC;Y))`Q)28SM+-8PSUO*?AJYW_!ERPR-)F:&amp;lt;#GPSWDZ:5*B]5CG*DAS):8&amp;amp;?&lt;br /&gt;M[C9W3F/N05;KE$FMSJ$O%0]OKG@XH&amp;gt;+AY(KA+[=K:-3:N`$_-]KL!)5]Q;#R&lt;br /&gt;M%1U.62Y+*GP:*.E]&amp;lt;&amp;lt;WPE\&amp;gt;5YI-T!&amp;gt;&amp;gt;H5^3LAOC;J-F$`Z]5@`EE=\VP^)A^&lt;br /&gt;MCC73/V&amp;amp;8!RZ3-VU8AEY&amp;amp;?:IS!X3GA05-&amp;gt;H*3Q+"6J;;34M$[F3UOW+PR&amp;lt;&amp;amp;G#&lt;br /&gt;M+%1KR87AXX%,F`98,Q7&amp;gt;&amp;gt;+'RJ)&amp;lt;AT6YOD":T?7B[]&amp;gt;4U?WC+YKNH8U(/QO,D&lt;br /&gt;M.C'T.\%=V.%X:U\Z\GH':()?XW??11C\8:'*H(#/9)ULC7C%*$\[6,+"']J$&lt;br /&gt;M\!-6S%()'!ZPQ*TY\R9+B*H]R.D&amp;lt;4ZA@8!PV4_?Z0[:5,C*:G!Y%`CLF\R8=&lt;br /&gt;M2&amp;amp;-A3395DCPHD*6R-&amp;lt;K.L_FUZ9-L&amp;lt;2UOP^+?I)H]BGBKEA0=P2^;]:RXDB9S&lt;br /&gt;MZ!&amp;amp;'^J&amp;lt;VE;DG@?GVS/\\D99G5ID&amp;lt;+JF4+^EP`9+6@LHD0#@9G@^BKI#PO@1X&lt;br /&gt;M8HFC")5Z;`DC&amp;lt;YQ&amp;lt;@LP&amp;lt;32-,2;*^G%@JT?3D*.@Y1(]./(4F6H&amp;amp;&amp;amp;-3&amp;gt;G))N5&lt;br /&gt;M`_*ZJ^S]_;AZ6*ECV/M-',A*CV-5=MJ]=TI$@S?7D`1[O(&amp;gt;&amp;gt;H0C@&amp;lt;8^8I%N#&lt;br /&gt;M2KWF/C2NDABRWF6RS],PGQ6T%)*S[A\2XZW?/SYRFC^*1\B&amp;amp;M8&amp;lt;CHJORZFPT&lt;br /&gt;M9'J%0)UW4"!I&amp;lt;&amp;lt;!S?-?MLQO'XI([DJO,C9&amp;amp;2/L&amp;lt;*B#AG:M1HV(XC\Z^#&amp;lt;$EF&lt;br /&gt;M1PMD&amp;gt;H!H2*4JTL.@IZ[`;+0#3A.DB&amp;gt;2,F8PI&amp;lt;S`V";Q`Q8Y\,YC0[.-&amp;gt;&amp;gt;-4'&lt;br /&gt;MD'`V_UY+@!HR3J5/%%VD-7-,$I"YY=&amp;amp;&amp;lt;:-BGE+/MRT_FSSS&amp;gt;AG=WO/DQ6^2(&lt;br /&gt;M\T^6"6?3T#V;^%1R3J)6_,8QF_&amp;lt;5_N?2KY]YX6MV-$1F5#.AQAH&amp;gt;=N#8FH9&amp;gt;&lt;br /&gt;M7B8XTB1#:MRQN:;\6#@WMOJ=]:8QN#Y:DT&amp;gt;DMJS.25%R%X^5)#N/TG'XWZ1#&lt;br /&gt;MD^Z=FKAZ-87`VDS\.!A,@FD*'X;_H)UG#I6[.%6&amp;amp;=W&amp;gt;J3`.5&amp;gt;JH&amp;lt;N&amp;lt;[I;CI8&lt;br /&gt;M7()T"F(9WMW9,OR_=;9XH_E_ZGCQU\$M3IBO7PM??LAXC9URSMS(0"6:YQXU&lt;br /&gt;MY`,V*2C+QKE@\@4)7&amp;gt;*ZHCBE`VI!.EE08EJ;KXW;ZHDC:,-[W+;NYK!`7F=-&lt;br /&gt;M#&amp;gt;&amp;gt;#J$&amp;gt;GEWC9Y*8CGC(X7R4SB^X-9[47QU'?ZZJ64]8N1WCM^\'E&amp;amp;F\0Y`P*&lt;br /&gt;M(\(_V4DW7,J[XH+,I./D7Q2ZHW\C",KK0QAKOD&amp;lt;8W"`1&amp;amp;MH&amp;gt;J$GU)^Z54GLQ&lt;br /&gt;MO+$7"2BI'9F[0;MUO)!1PEV9&amp;amp;93]`;_)_C\X:O)=U'&amp;amp;#_X_5U?45X__CT6J1&lt;br /&gt;M[;]F_C_OY7=O_C\D"/?,_NM6OYG]U\S^:QJPN_LMHR$.Q6\K[[]ZM;]7?_G7&lt;br /&gt;MX*^.896A8)_^U3?3PLO9OZ9:;KFI[:C;Z+7[3Q'HB,A9U/;B.'OQL+5%E4G4&lt;br /&gt;M/ML`:XJCT_YH//GO^KN%_Z^OI@%N./\?/=IXG/#_M?'XT&amp;lt;S^^UY^]^__:T8#&lt;br /&gt;MW/(WHP%F-,`T8'?W8QMP(0+VGN_N;^]4#M&amp;amp;*VQS,3N(7F(N[-M_=1O_I5!/P&lt;br /&gt;M##K_)J(C87&amp;amp;=8HG**.7VEM:I)$@0B-:DK\$%6YSMK,&amp;gt;]D5-8,M]CD.LSAVP:&lt;br /&gt;MH/BX%W/^\I$MHDU\)&amp;amp;T?_%$;=JM@#AWYL,LNZBBTG0VUTWVOD8+&amp;lt;!!],&amp;lt;V[N&lt;br /&gt;M"7Z74.B3[LUJSG%GE&amp;gt;K"BGVP3_([9*S+QVM==!T-F1:,^U"R(!)U+[+3)"C9&lt;br /&gt;M'[3?HX-B5B/DFJP"H;@NVJ)!EP7Y1Q^[?YK?%/I/A_[[ZCINBO^R\6C=Q'\M&lt;br /&gt;MKJTB_;=1?#2C_^[C=W_TGUY.,_+O=K\9^3&amp;lt;C_Z8!N[N?3_[M5&amp;lt;I'^PGJSZ1]&lt;br /&gt;M'?&amp;amp;7[I)GC-X[@KD8-#ZHH_+!&amp;lt;O7`X@Z595L*]6'0Z/?#P6&amp;gt;XV'%(O.3-[!0Z&lt;br /&gt;M3PFAERSR1=0&amp;gt;%?'N5;=W=^O;/VU7=]%3/P:;];[FEHI;4HI#8B@GO@T:Y*[\&lt;br /&gt;ML$&amp;amp;Z!&amp;OJ;V&amp;gt;%U%@W:C/GD)DRB`Z5J933O2QV`F8G.W;+^"F8^U\WVT?2$(^:&lt;br /&gt;M:5&amp;gt;2^A+QDU"D8J,0.[?KEJASK/#,&amp;lt;*(]6)X&amp;amp;@#5A\8Y38K?TZN&amp;gt;-;KN#%LO;&lt;br /&gt;MS^O5O&amp;lt;K1EKGF'I`U@XX&amp;amp;8TOP@[8@A^7,FIU9K(:N.FUI47$U1?$=REP.H759&lt;br /&gt;M:HRQ3M!N1/@Z7B[3:4A*DI8]X!;F%8Y,O79T6-E^E5?5@X/#_:/].BSM7)H5&lt;br /&gt;M!&amp;amp;ES:8^D8\LN8T,2(6:UWD:X3HF'Y)J&amp;amp;V%&amp;amp;71FYNZD&amp;amp;',GGRLHK[`@'0&amp;amp;"WF&lt;br /&gt;MU$-\R-.BB\ZS^,)-Y2;6*X&amp;gt;'^X&amp;gt;?WU!.8%?,GS3+P%8!B'M%&amp;gt;QR7!AGO\#)2&lt;br /&gt;M'T4%#CV@TM!N*1YE?]RVM`\HZ!Z6E#D@[\Z?N"H3#=?40&amp;gt;H)[M*C`$^RU_`/&lt;br /&gt;M+\/S3N."`CN+`VA(&amp;amp;F`+T(&amp;lt;J`*!A-"7SG-V$&amp;amp;QDTDR.'?IH'M'5(CR*'I6X:&lt;br /&gt;MS5!L*5`E7'N5CDFSPW,I;&amp;lt;P3!TT&amp;gt;9.RWZ![X72=-O/1.X^9R\=+X()"5`0^#&lt;br /&gt;M;"!=!WIP:HER(T"'GG1D'!AR`K1HBLAH&amp;lt;FPQ,YH.LG,'58_J-XGUJ-RNBX.(&lt;br /&gt;MSQQ141H9&amp;amp;U14,K'ZZ;JOY^VKT(0(;EZ.&amp;gt;N^P7AE(K6A$_&amp;gt;9VBV66_H+CZ,57&lt;br /&gt;M1I(DI)`^D-1#`_4.^59HG+LM,AI[J"D_5%VB:S-0^T4&amp;amp;8R/U,$PSG(V#"%AB&lt;br /&gt;M1`S2/JMAQD7%O,"9)X:&amp;lt;/A6ZS=X\Z(EX^%"E30=4LJ*Z80.-X[%[#OJ_!*KM&lt;br /&gt;M+`RU,HA50IR;4U@N&amp;lt;X%J(^&amp;lt;C&amp;amp;(",Z/A*`]1224\PSXAH9]T\S[&amp;gt;::-;ETIZ&amp;gt;&lt;br /&gt;M49_)4R]"X0AW4DM%^.VA`$(")&amp;gt;?XPD-L]&amp;lt;G()N:,#2^F&amp;amp;TM=C7CK;0YF=M]2&lt;br /&gt;MBDG\O^_@[&amp;gt;OJN('_7UDS]S\;:\7'ZQ3_96/&amp;amp;_]_+[X$3Q\S,&amp;gt;9J?P&amp;gt;"!&amp;gt;HD.&lt;br /&gt;M/\AI'U)*2$&amp;amp;5BC^L%HH;WQ=6"NL!II:^!YX:\SXCWP7&amp;amp;'7L&amp;lt;&amp;amp;+754HV&amp;gt;5'4G&lt;br /&gt;MT,JJ):0`](O.B2'@2CO0)%(!1IB[8A.-:$LLLP-M)UW:H&amp;amp;J/\',K[#2NR:)1&lt;br /&gt;MK`!=/6\VZ"X4`C8-+:U`*7C%;KDFWX%8AY;8P!LRM0LJ+"C8)0CDCYZV._M-&lt;br /&gt;MVO\.4_;5==RD_[6^LIZ\_UT'-##;__?PNR?YG[.&amp;lt;9O*_V_UF\K^9_&amp;amp;\:L+O[&lt;br /&gt;M.?*_%Y6]RFNT4G+D?V[:5\K_M!IH1HNEQD5N1AIGDXS$"FCH&amp;lt;2E;FBRN:V5O&lt;br /&gt;M&amp;lt;^_;@R':YKCYQ,R"DS2]WC4!73XY-XIRH]EU"7.R&amp;gt;7-&amp;amp;Y8]&amp;amp;XE_QFW3^:S_I&lt;br /&gt;M=U''#&amp;gt;&amp;lt;_D/]C^E_%E9G^U[W\[NG\U\MI=OC?[C&amp;lt;[_&amp;amp;&amp;gt;'_S1@=_=S#O_=_1&amp;lt;O&lt;br /&gt;M/+TOF^#H&amp;lt;X^'YT@)XV$#='CD@JLL#B7.1N=/)11#RB&amp;lt;;,V2LO$M(P#[9C2[0&lt;br /&gt;M"=8P[#70AIM(BZ]6"D/Y`[8][(W0H3_,-CK+_0@4@;%L*ZF5/+\C`22/9)&amp;lt;:&lt;br /&gt;M?&amp;amp;(#.*/F)4$B/MK8'9RRN&amp;lt;E_7;TF:@J2,1A2`I\=#_1H/OD^:^H1QV^-L[#S&lt;br /&gt;M9@4M*!&amp;gt;.R*DJIQ0IY6&amp;lt;G9952GB_P_8!NPO]*&amp;amp;^1J#]YR6'?!7N:QPS$]"KJD&lt;br /&gt;M(_E\\D1Z0-U6'&amp;amp;CD/=[9F+N9Q2&amp;amp;@C"T,IL?02,,K#N:&amp;amp;8;&amp;gt;/.^H)C]314S49&lt;br /&gt;M^M%#BI$'P-%5]!..B9&amp;gt;H@*6U9'8PZF#Q.!EK)`T^C'#]K!&amp;amp;'#U5V\3QG7M7#&lt;br /&gt;MG%/;^5A=$DAD`D0+[&amp;amp;8XR;@ZJ3!E]PE&amp;lt;&amp;gt;6/8&amp;lt;M-RCK)X-*W,Z=L2/9U&amp;lt;L;D=&lt;br /&gt;M:;I)?+]!OKO$?7(O^N![3S;&amp;gt;^(%$;K)/7\B3,]_0"W4'=@5&amp;gt;*5(\T&amp;gt;S"26\!&lt;br /&gt;M%FPQCZX&amp;lt;.)OTGWW_N@UT+:-YJ&amp;lt;+R&amp;lt;3TA2,F,F$HC)/82['&amp;gt;+[?._$I!N:@$/&lt;br /&gt;MM7^%V?,&amp;amp;0+8]*,1A^*YOAH67N=Z1CB&amp;lt;N;XKI&amp;amp;L&amp;amp;R%2;&amp;lt;!#1URPWXB!5L"9)!&lt;br /&gt;MJ%MS$B:7._/H[=W&amp;gt;$$RB_[4%]5UP`#?)_S965I+T_]I,_^]^?O=$_]OE-.,`&lt;br /&gt;M;O&amp;gt;;&amp;lt;0`S#F`:L+O[.1S`8:5&amp;lt;(&amp;gt;^%E@=PDI*A\1RE7C'40*=*QHOJ[0EP)OR,&lt;br /&gt;M;QDC`O1K46,&amp;amp;$K(&amp;lt;B#3$VW3(@QHN&amp;amp;A!KM'DPLO[KYN:@^5XTW)Q2'XV"TF%2&lt;br /&gt;M5&amp;lt;`JK[&amp;amp;2A/6W]5!9MXN-"Z`CV?^BXPWKH79[]2&amp;lt;R1)AT_F/'[D;Z=]/Y7UPO&lt;br /&gt;MXC?O_%]??_QX=O[?Q^^&amp;gt;SG]&amp;gt;3K.S_W:_V=D_._NG`;N[GW/VX^&amp;amp;-A[PG]_H8&lt;br /&gt;MS*%KMSIJ8Z*XZZJ8EY2CP[T\GI$J?M&amp;lt;FE_$K5]J&amp;gt;G^(-#J[K&amp;lt;1&amp;gt;*!'-X8AJW&lt;br /&gt;MD01D#4I:/\GPPB[[/'AXC),\`&amp;lt;$8V(^!&amp;amp;4897\=+_3Z8([=VY#=+B`CS\0=N&lt;br /&gt;M@792A_4_@YI&amp;lt;SX;&amp;lt;L_4\GOIXKW=8+=?WMLN&amp;lt;_KW`R3M#0&amp;lt;XOG9'0[V[S]1C4&lt;br /&gt;M!V'&amp;lt;MW`&amp;gt;)0:$BKH5^8.C(?,(I=5CARE1DSM6B4\I`Y;(0:,VYP]3LJG%];G@&lt;br /&gt;MD]*.0E'6:?R^-R-`\XI(R#9A&amp;gt;DU.:G&amp;gt;.=GY6U/+R7L3E$MFJ&amp;gt;S^]JKW8K&amp;gt;S9&lt;br /&gt;MW$7(_4K\8&amp;gt;^R&amp;lt;BNJKW&amp;amp;D@O'BY5&amp;lt;[7O%5*%[F!M^R&amp;gt;'7'6=E0NBI!$324ZLYX&lt;br /&gt;ML6=[.[6CFBVW1N6:T6"`VFBT#,6Q-BJI7&amp;lt;#P]W`8EQ!@`MKV[B\`S8):!U#X&lt;br /&gt;M16UWT`GL-&amp;gt;K"L:X=0@S'VW)P&amp;gt;/1\]X4%L.'TX4"'@'O&amp;gt;:5R,%SVLO-C9_&amp;lt;DK&lt;br /&gt;M_=@I?0CG&amp;lt;#S$&amp;amp;*IJ1_LS3P%4^Z56.3QT-BN`$!7`"7-&amp;gt;.RQO[S@EMIU*:X"-&lt;br /&gt;MFZ':%DN/L;(P\%[99T[9'0R&amp;amp;AR53EYD[T65GE4'ZQ"6"4_E\N[IK2^Y`R6?H&lt;br /&gt;M*?,YD`YARI(ZV*[][-14&amp;lt;:=#:T".C\@O-;=YS]T!,=J4?JGR]EZYLNLUKHB;&lt;br /&gt;MITPH`;!]&amp;gt;@L/*P&amp;gt;[V^6*7P[7_2&amp;amp;CF8D%803__OS8*;3FC.'?,?ZL&amp;gt;C[J=%+Z&lt;br /&gt;M5CD\^N7`EEMW.Q&amp;lt;.WL/)K([@3!HON7?\:J?B;K1'[@853[YPP`,J&amp;amp;K9[1`&amp;amp;D&lt;br /&gt;MK9C=O6W83P;&amp;amp;FKMB-/6"Q,(NO-#53`H,:,;SW6V[4=80J^W8&amp;gt;DESWEE'*AN/&lt;br /&gt;MSKKM8;T[Z@S;N911.7X&amp;amp;4V'AK3JM^O]S679D+.C__]7&amp;gt;5U6V70@+2L##*&amp;gt;GF&lt;br /&gt;MJK?/ZWW8.&amp;amp;%O6*&amp;lt;6Q&amp;gt;$PI7)X*.]NU^S`KKD#"_QAG3EV"LC)Q@6)Q;=W!!W8&lt;br /&gt;ML:MA;8V7'H8)KG'KA]'X\"91!QV2WEI&amp;lt;P^5A.X&amp;lt;ZOLY`JO,)NPY0RM&amp;amp;^/0?6&lt;br /&gt;MOA]'*6(\IB!?:OF]@ZHM_\/D\I`O%2VY]:^O)-"27B93&amp;amp;P%`W$:L%V\`DMH2&lt;br /&gt;M0"7N=EMW9];1O.:Y33L3#KR%ONYNE_%51NL^=&amp;gt;&amp;lt;"OK#K:WT]=&amp;gt;-JCZ\)`$&amp;lt;O&lt;br /&gt;M#_&amp;gt;/CG8K%B.NXWP&amp;gt;70ZBX9!"9+/91Y8.2C0WX4!(&amp;lt;%`U.IWH@_4/KCIM6#MQ&lt;br /&gt;MVOXKOW3@;[A#76L"RS'JN,&amp;lt;&amp;gt;JIVG;*/7!]7#7RP0=P_K!M`;'L']$`YCP`N5&lt;br /&gt;MJWX;(.(%6TJS=IX?^4?5!L[?P2#4CL_-J27UP##LP9XC'B@![G7]J+Y]&amp;lt;&amp;amp;!7&lt;br /&gt;MY&amp;lt;::)BZ,P]JCL-N/*,[F=K\_5OX@47Y]K/P!&amp;lt;'.-'BX$*"^T81EHPS%0APE0&lt;br /&gt;M&amp;amp;V.@V&amp;amp;FYZ&amp;gt;!$6'\_KAS^XN&amp;amp;,#:1:#$NB\&amp;gt;0D5+%_&amp;lt;'2P?&amp;lt;@&amp;amp;FP9$&amp;amp;3&amp;lt;L5XF.&lt;br /&gt;M^R]#X0@Q7FYC,-1LY,'.,5!CK&amp;gt;M"DMXEF'O[1]N[N\[I7\9EM:\!'6AC"0JF&lt;br /&gt;M+BLU2*,@#EV:MKSJD1`:!E.WR8:\JM9JU;T7W!ZW?[B,*MI==DJ3NNT8M20F&lt;br /&gt;M#=?VJY^V[8"77:20`NPGO/E/@!*6AV;N^-"&amp;gt;Q\\K=))J^A(F#2,H9D&amp;lt;QM%,'&lt;br /&gt;MK=(,3G+#'._];6__YSV7_'R.M--Q[UT/_2PS_2GB9T&amp;gt;4&amp;amp;SAJ&amp;amp;DYRUE&amp;lt;H_=_Q&lt;br /&gt;M3]I)#[JO-^:51L\TF)M;'(3M'@P!H,=AO=F(AS;H'7F]67R:I1)L=MS)LOT&amp;gt;&lt;br /&gt;M733?KJCZ3JW9XDX0A\\"\;T%P?+KSRM&amp;gt;7'7*&amp;amp;V_?J)A!PS/J\0#YIK&amp;gt;BRL),&lt;br /&gt;M64GUAM%E)[N83521H_&amp;amp;AYMC.W9"=QH2*Z(`,-V7_7K)SX(&amp;lt;;LT-_=0?]'-R;&lt;br /&gt;MK62R;?G8)V[A&amp;gt;+*X8+&amp;gt;&amp;gt;!-``ET4VE&amp;gt;V=&amp;gt;JWZ/^A!H+C!3+C(RFBVSEFE26*/&lt;br /&gt;MQF/R':4`+]4/#O?+E&amp;lt;I.9:&amp;gt;TDE?H%T#Y,2M*Q3R)G\R'P\I_5\KX814_S-D/&lt;br /&gt;M)A!4:2WOE3C&amp;gt;DT]H^UOZ/H\?9(?F@T^JJ[NN?37H(_*C4&amp;lt;(6;_`4_V(\\J03&lt;br /&gt;M]$-4)C#RTQ#%?FCD/T[EV4R]?CLM$Q)01NU%HDBEY!-`*US:)IK,Y=963&lt;br /&gt;M"#==KXY%-2FS@/1#P&amp;amp;^-Q&amp;gt;ZR`3;(M8(P_I3OP`1\Y\8U8ZX+#;GA?*7.`\D#&lt;br /&gt;M%`Z5?=^7&amp;amp;"(=:,?[&amp;lt;0K&amp;amp;&amp;amp;N&amp;gt;I[)L5M*U3WV^LK:R\S8L)W:B/M'\1,#?&amp;amp;ZY9N&lt;br /&gt;M8N`L@JO/=XJD!;19V#FG5:_M99W@,K0PS*N@8#&amp;lt;%FDM7@+1YLBLY?1N7]58\&lt;br /&gt;M)G.$E2R%G/DT:??1H"8"Q&amp;lt;#!#X-WT69*@+U!R$K6&amp;gt;]GM%2?91&amp;lt;7U,F0,(&amp;amp;X#&lt;br /&gt;MIZ(-.-#@@V#N+(HZ5@GLFY)6M',O%J.^&amp;gt;\J(XM$WV:BO@]&amp;gt;42M(+--C&amp;amp;9!.:&lt;br /&gt;M1IXD64+-8#H_,F*S&amp;gt;,&amp;gt;=@)2X&amp;lt;:0598YAD2D;Y39^_Z/OO&amp;amp;8_^YMV_^M&amp;gt;\']-&lt;br /&gt;M'3?H?ZVO;Q03][^0JSB[_[V/WSW&amp;gt;_[K+:783?+O?["9X=A,\#=C=_9(WP0FO&lt;br /&gt;M;];PPM'Y\O7!2`M,R+1$E+$;7*SYN;_$NYI6/BOKYGVV]EE"U\RT.,5Q&amp;amp;JN&amp;amp;&lt;br /&gt;MT2W/_KA&amp;gt;F([:%FMON`]1K@J4E/9WJU/)X&amp;lt;58*N8E`6Q)98SWBXQVCWO&amp;lt;FU"K&lt;br /&gt;M#@)%]!\-';"F;WP&amp;amp;\2WQM&amp;amp;Z$2"(\RU&amp;amp;WCVZX&amp;amp;(2A8N&amp;lt;N"X89]^%LT4&amp;gt;/_&amp;gt;;K&lt;br /&gt;M:?Y@F.P5&amp;gt;3=&amp;lt;-)#T=2'&amp;amp;&amp;lt;_R-!`'(T3.[#3T@CT.ZZIS0W%Z`0%*\HVS%#&amp;lt;YP&lt;br /&gt;M,(()5@#*&amp;gt;+TZ)A&amp;amp;#!+&amp;gt;THT1A,,=T]FX&amp;gt;-%=AT-3NY^,.8&amp;gt;1,$6](KUSW8ZA2&lt;br /&gt;M8-IB12`I2H3D`RUJA=:N(Q&amp;amp;44STM*5=5@3PN[44(E&amp;lt;1B\!&amp;lt;YKW\`&amp;gt;6-\H^6L&lt;br /&gt;M&amp;gt;R,ROG"7`N2G1Y3;2-Q0,R#%QV^W^&amp;amp;'C+8=]@[K^&amp;amp;R&amp;amp;?VUC66@:''O0$EET)&lt;br /&gt;MV)4M]XO3D=]**KN*MA&amp;gt;/V*#"Y#&amp;amp;K+YM6K*07'3I4FY#!55[`L-3%#=C7Q&amp;lt;=&amp;gt;&lt;br /&gt;M+1-68*(5SDSR8I/EF'`!1K&amp;gt;-O@,T.^$&amp;lt;`W+"E#MK$(5AM%L^$`Y\XP[&amp;amp;DDI9&lt;br /&gt;MG79)3LM*'83)"H?AF[&amp;lt;XG=0E.+F')/0EG=IE!]TA$@KFV/H-6TM(Z&amp;gt;-PT,NK&lt;br /&gt;M0?/]IZU`Y]&amp;gt;ZMR(K3&amp;gt;C:4K$D&amp;amp;XZ)V:$HWB9*4:K`9A6+1'#68$)T0B_5PS7&amp;amp;&lt;br /&gt;MQ#]K&amp;lt;%'VN^_D^:E:N7K\G'^X2%9,4Q..`&amp;amp;QOX!]1XG7Y7,]WJC'G2G[ZHPG^&lt;br /&gt;MQ&amp;amp;\J_V?DA[\K_[&amp;gt;Z6DS:_SS&amp;gt;6)G9_]S+[S[Y/V&amp;lt;YS?B_V_UF_-^,_YL&amp;amp;[.Y^&lt;br /&gt;M2?ZONG=4.7R^7:[X_)\3FM;G`*V%7R9Q+KJ0?$FP\^6/QH/_J;])Y[\WSU]9&lt;br /&gt;MQTWG_^/5I/^_Q\7'L_/_7G[W=/Y[RVEV^-_N-SO\9X?_-&amp;amp;!W]W,._Z/#[;W:&lt;br /&gt;MJ^K1D6&amp;lt;%[*?&amp;gt;SA#8B1?_V=)8!U],-`&amp;gt;^E34P?'-@W&amp;lt;8B&amp;gt;#CHB6#"+_A1A[2H&lt;br /&gt;M&amp;gt;9[WN0Z)468DOPDC8%&amp;lt;T\=!(%X(OMC&amp;amp;^.Z/B2&amp;gt;&amp;gt;_B=1R!V?,3?%?5]9M_*^5&lt;br /&gt;M#8K_OKHQ\_][+[][.O_-&amp;lt;IJ=_;?[S&amp;lt;[^V=D_#=C=_9RSOWZ\5Z5P12_K@9,J&lt;br /&gt;M#LD&amp;lt;%WW7\3(*P6-V\&amp;gt;&amp;lt;E&amp;amp;\=_;BK'X_'3&amp;amp;X-^8QD#,OG)D(")\&amp;amp;amp;4LO77F)R%2&lt;br /&gt;M&amp;amp;;8PS2BUDE8LAP0R:&amp;lt;D01_A]&amp;gt;V?G&amp;lt;&amp;amp;(.C,6A,]6K&amp;gt;ZZ&amp;lt;WPWDLU0TZ7XT(OQB&lt;br /&gt;MBY#%,+I001UT-[E6(&amp;lt;/.HIOV;/_H):2MVO)N/*-8Q]&amp;gt;*&amp;lt;X%XGG.&amp;amp;XT.[A_E6&lt;br /&gt;M:9"D-"9TPEZ=](6#%"]S.J,[]3K7HIN*1,D??5C-?G?^\^F_5[6?RAO+=UT'&lt;br /&gt;MFD,^?KP^,?[+BO'_MK'^^!'0B&amp;lt;5'C]97_J+6[[HA:;__&amp;lt;/HO;?YM[)]6W+^#&lt;br /&gt;M.HC^7YOH_V=UM;ANXO^LKI/_/U@R,_K_/GX/U"N*&amp;gt;@.4DMH)WX&amp;lt;=Y$)5;3AJ&lt;br /&gt;MM2-U,(C(YNXYABY;4GN-;EC*F-61@:2#!AR9%Z':_P`46NG)VM._!E,A,B6'&lt;br /&gt;M:A//1NU.BR#G@3P;=(',^DE(LHW"R@K"`=YX9Q^M4U1EIWH$KW\-,/EH^_#%&lt;br /&gt;MT2\'%97YN=U[M*JR5]]OY%#S*XZ@F8YA2`9/W.+*(RQ6?OZB9.,;+2DNNA.&amp;gt;&lt;br /&gt;MC2[^&amp;amp;GSSJE*K;;^HF%A(9("GQ%*S\2[$"$@%=12I,VKU4$A?&amp;amp;ASV'KSW:OMO&lt;br /&gt;ME;P#:B2!#2M79'[Q2J`8I0;\;S#J.26&amp;lt;1X*FEL^5'&amp;gt;T"M"-32,_^B]#:&amp;lt;3]L&lt;br /&gt;M(E7=2`1PHLAP4%G/M-0I#(0S^^E`*PQH&amp;lt;+&amp;lt;!LZ=@O%3$EHZZQ1V@$PHX5RJ\&lt;br /&gt;M:F`&amp;lt;ULW/:SS"=)://PF9=%@'41RW,9)I\S("^IP=9OB=`_I^0D-2ZCH,.V$C&lt;br /&gt;MAJ6;1&amp;gt;&amp;gt;^+&amp;gt;SBC:LH-QTD-_]+`?*2?D;\K&amp;amp;PW3#@XW#]0VV@"&amp;gt;A`.RM3?G;`/&lt;br /&gt;M=%G8:[9A&amp;amp;%9,IEJS6&amp;lt;&amp;gt;"N#E5)N.E[T;-1N&amp;gt;@,;RD#^6#@U*S4PBOPK\&amp;amp;A[5R&lt;br /&gt;M:=#D9VA-];E2F?DL3%`N@XI34T:.&amp;amp;TQ5/-NN5=1Q'-9?/2\[+3+)-#+UW?;9&lt;br /&gt;MH#'P&amp;amp;TU9]D?#_FA8WVD/5,9"=W-446&amp;amp;@"PPD8(QI^8X:P,$+)/MIO&amp;amp;73&amp;amp;S6U&lt;br /&gt;M/;=H2O6B%PW".F]XK,&amp;amp;!/=9"X"VX[3`K:KD7=:*+2"W__$@MOWBMEO=7U?(.&lt;br /&gt;M+"2DT3/TN+=3&amp;gt;7;\@I]1G:BVOUN1MU?/RC5X_`7*/=]1RTT-_O&amp;gt;#3`V'):26&lt;br /&gt;M.^C-J?B#6FX90#K3Y._/:N5'JZ6SN(FHE=&amp;gt;@`Y&amp;gt;^ZH:;+WXB*O0!",!([\;*&lt;br /&gt;M\S?U+ASTPLZCU4(')@*0\4`&amp;gt;+UIM&amp;gt;4)^J1]%'7H!)-?J7,B71NM]HZ^SQ9=A&lt;br /&gt;M1\.!G6R?&amp;amp;J.A!C]JMSBU==;4&amp;amp;&amp;gt;"QV9&amp;gt;7/U=KS**(1V?L\@&amp;amp;#`A.:6@;L?PEX&lt;br /&gt;M?K/ZZ/L-/:Q_QA']@)SM9_&amp;lt;'4%UEMU:Y!;K3A](7([OB9&amp;amp;2G84]'=6FYO@;1&lt;br /&gt;M%5,17:*6&amp;amp;YMQ5TBNR^CH?ZJ`DEI)E%2_-4IZ\3]J*L;[7:I)1W_U&amp;amp;]!??8;^&lt;br /&gt;M_ARMF88N6KC:?:RAEONM,Y04;L9A?_CO@!-OT4E$E'L[@"==^I3W-Z&amp;lt;PN3F-&lt;br /&gt;M3)R&amp;lt;QZ(4AOMB$(WZ*B-&amp;amp;]&amp;lt;@2QB[FW0DIL$(=/J#4/=/L][&amp;gt;:6\VKJZU!&amp;lt;PM8&lt;br /&gt;MEZW!5M3J;+7AO\O^/[;.&amp;amp;D,'M@,40=;VCP_+E5*A&amp;lt;&amp;amp;*:=8+L1"?"Z]4"@,:B&lt;br /&gt;ME5[++_@9T+J-=N\NX!A]NCN`E;BDOP.(KC[/9'"81),[-M&amp;lt;OV&amp;gt;KDQKF^A"GM&lt;br /&gt;M;UW"7%]VM]J]SN?.+$&amp;lt;)^MK&amp;gt;.BOD+F!I78FO!&amp;gt;4$5?U:4#H^VYVMVJ^&amp;amp;Q!:%&lt;br /&gt;M=[SR[P:&amp;gt;H\=^E_OHJX&amp;amp;92_;/WHZ'87Q+Y-MN1EO-T6#KK-O?@J,,4/`J_#?&amp;lt;&lt;br /&gt;M.FOWM@87\=9%^WSK'_T+^"^D?S)C%&amp;gt;.+/DGXS&amp;lt;@]_FAAZ'_@[R;Y_X&amp;lt;[J&amp;amp;.Z&lt;br /&gt;M_!\EM(^-_+](]S\;*\69_/]&amp;gt;?E-D]3]'@W&amp;lt;&amp;lt;$&amp;amp;^JE/[G[&amp;lt;.]ZMZ+34]6OW^H&lt;br /&gt;M=BJ[E2-@65]6:^KG_&amp;lt;._U0ZVRQ7UO+I;^8;PR]W^$*3@D4V'YLR4,@Z&amp;amp;Q/NL&lt;br /&gt;M";&amp;lt;64)H32T_6X?7CQX]_#3Y]^N1]6$M\^!VZ\*(3G34ZF[=KSZ/?OSU_]/*&amp;lt;&lt;br /&gt;M_6:_V6_VF_UFO]EO]IO]9K_9;_:;_6:_V6_VF_UFO]EO]IO]9K_9;_:;_6:_&lt;br /&gt;IV6_VF_UFO]EO]IO]9K_9;_:;_6:_V6_VF_UFO]G/^?U_@$8")0!(`P``&lt;br /&gt;`&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-6745816840502903221?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/6745816840502903221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=6745816840502903221' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/6745816840502903221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/6745816840502903221'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/dumbesme.html' title='dumb_esme'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-2733738013731122851</id><published>2007-07-08T23:07:00.001-07:00</published><updated>2007-07-08T23:10:53.378-07:00</updated><title type='text'>SMS-приложение. Часть 3</title><content type='html'>&lt;h2&gt; Отправка/прием сообщений.&lt;/h2&gt; &lt;p align="justify"&gt; Мы продолжаем обсуждать команды протокола. Нам осталось рассмотреть две самые интересные команды, с помощью которых, собственно, и осуществляется прием/передача сообщений. Это команды &lt;b&gt;submit_sm&lt;/b&gt; и &lt;b&gt;deliver_sm&lt;/b&gt;. Первая служит для отправки SMS от ESME в PLMN, а вторая -- для приема SMS из PLMN. &lt;/p&gt; &lt;h3&gt;submit_sm. command_id = 0x04&lt;/h3&gt; &lt;p&gt;Тело пакета submit_sm состоит из следующих полей:&lt;/p&gt; &lt;hr noshade="noshade"&gt; &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Field name &lt;/th&gt; &lt;th&gt;Size (octets) &lt;/th&gt; &lt;th&gt;Type &lt;/th&gt; &lt;th&gt;Description &lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;b&gt;service_type&lt;/b&gt; &lt;/td&gt; &lt;td&gt;Var. max 6&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Используется для доступа к специальным   функциям SMSC. Может принимать значения:   &lt;ul&gt;&lt;li&gt;““ (NULL) Default&lt;/li&gt;&lt;li&gt;“CMT” Cellular Messaging&lt;/li&gt;&lt;li&gt;“CPT” Cellular Paging&lt;/li&gt;&lt;li&gt;“VMN” Voice Mail Notification&lt;/li&gt;&lt;li&gt;“VMA” Voice Mail Alerting&lt;/li&gt;&lt;li&gt;“WAP” Wireless Application Protocol&lt;/li&gt;&lt;li&gt;“USSD” Unstructured Supplementary Services Data&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;Если не используется (в большинстве   случаев), выставляется в NULL. &lt;/p&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;source_address_ton&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Тип номера источника (см. пред. статью) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;source_address_npi&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Индикатор плана номеров источника (см.   пред. статью) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;source_address&lt;/b&gt; &lt;/td&gt; &lt;td&gt;20&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Адрес источника, если неизвестен   выставляется в NULL &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;dest_address_ton&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Тип номера получателя (см. пред. статью) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;dest_address_npi&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Индикатор плана номеров получателя (см.   пред. статью) &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;dest_address&lt;/b&gt; &lt;/td&gt; &lt;td&gt;20&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Адрес получателя. Для mobile-terminated (т. е.   предназначенных для передачи   непостредственно на сотовый телефон)   сообщений это в точности номер телефона. &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;esm_class&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Указывает на тип сообщешия и его режим   (mode). Может принимать следующие значения:&lt;br /&gt;&lt;b&gt;   Bits 7 6 5 4 3 2 1 0 Meaning &lt;/b&gt;&lt;br /&gt; &lt;u&gt;Messaging Mode (bits 1-0)&lt;/u&gt;&lt;br /&gt; x x x x x x 0 0 Default SMSC Mode (e.g. Store and Forward)&lt;br /&gt; x x x x x x 0 1 Datagram mode&lt;br /&gt; x x x x x x 1 0 Forward (i.e. Transaction) mode&lt;br /&gt; x x x x x x 1 1 Store and Forward mode (use to select Store and Forward mode if Default SMSC Mode is     non Store and Forward)&lt;br /&gt;&lt;br /&gt; &lt;u&gt;Message Type (bits 5-2)&lt;/u&gt;&lt;br /&gt; x x 0 0 0 0 x x Default message Type (i.e. normal message)&lt;br /&gt; x x 0 0 1 0 x x Short Message contains ESME Delivery Acknowledgement&lt;br /&gt; x x 0 1 0 0 x x Short Message contains ESME Manual/User Acknowledgement&lt;br /&gt;&lt;br /&gt;&lt;u&gt;GSM Network Specific Features (bits 7-6)&lt;/u&gt;&lt;br /&gt;0 0 x x x x x x No specific features selected&lt;br /&gt;0 1 x x x x x x UDHI Indicator (only relevant for MT short messages)&lt;br /&gt;1 0 x x x x x x Set Reply Path (only relevant for GSM network)&lt;br /&gt;1 1 x x x x x x Set UDHI and Reply Path (only relevant for GSM network)&lt;br /&gt;&lt;br /&gt;При   работе в т. н. Store and Forward mode и отказе от   использования дополнительных свойств (что   верно в большинстве случаев) это поле   будет содержать 0.   &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;protocol_id&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Идентификатор   протокола (специфично для сети). В   стандарте GSM этот параметр регулируется   документом GSM 03.40 (т. н. "Библией SMS") и   используется для указания на низлежащий   протокол связи ESME с SMSC. В простейшем случае   -- 0.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;priority_flag&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;При передаче по GSM   сетям: 0 -- приоритет отсутствует, 1-3 --   приоритет (равноправны). &gt;3 -- не   используется&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;schedule_delivery_time&lt;/b&gt;&lt;/td&gt; &lt;td&gt;1 или 17&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Время отложенного   доведения (в формате SMPP -- см. ниже) или 0 для   немедленного доведения.&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;validity_period&lt;/b&gt;&lt;/td&gt; &lt;td&gt;1 или 17&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Срок годности (в   формате SMPP -- см. ниже) или 0 для срока   годности, установленного SMSC по умолчанию&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;registered_delivery&lt;/b&gt; &lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Запрос на   подтверждение доставки от SMSC (delivery_receipt). 1 --   требуется, 0 -- не требуется &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;replace_if_present_flag&lt;/b&gt;&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Флаг, указывающий,   должно ли сообщение заместить уже   имеющееся с совпадающими полями source address,   destination address и service_type&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;data_coding&lt;/b&gt;&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;   Указывает   на то, каким образом представлены данные.   Может принимать значения:&lt;br /&gt;&lt;b&gt;Bits 7 6 5 4 3 2 1 0 Meaning&lt;/b&gt;&lt;br /&gt;0 0 0 0 0 0 0 0 SMSC Default Alphabet&lt;br /&gt;0 0 0 0 0 0 0 1 IA5 (CCITT T.50)/ASCII (ANSI X3.4) (b)&lt;br /&gt;0 0 0 0 0 0 1 0 Octet unspecified (8-bit binary) (b)&lt;br /&gt;0 0 0 0 0 0 1 1 Latin 1 (ISO-8859-1) (b)&lt;br /&gt;0 0 0 0 0 1 0 0 Octet unspecified (8-bit binary) (a)&lt;br /&gt;0 0 0 0 0 1 0 1 JIS (X 0208-1990) (b)&lt;br /&gt;0 0 0 0 0 1 1 0 Cyrllic (ISO-8859-5) (b)&lt;br /&gt;0 0 0 0 0 1 1 1 Latin/Hebrew (ISO-8859-8) (b)&lt;br /&gt;0 0 0 0 1 0 0 0 UCS2 (ISO/IEC-10646) (a)&lt;br /&gt;0 0 0 0 1 0 0 1 Pictogram Encoding (b)&lt;br /&gt;0 0 0 0 1 0 1 0 ISO-2022-JP (Music Codes) (b)&lt;br /&gt;0 0 0 0 1 0 1 1 reserved&lt;br /&gt;0 0 0 0 1 1 0 0 reserved&lt;br /&gt;0 0 0 0 1 1 0 1 Extended Kanji JIS(X 0212-1990) (b)&lt;br /&gt;0 0 0 0 1 1 1 0 KS C 5601 (b)&lt;br /&gt;0 0 0 0 1 1 1 1 reserved&lt;br /&gt;:&lt;br /&gt;1 0 1 1 1 1 1 1 reserved&lt;br /&gt;1 1 0 0 x x x x GSM MWI control - see [GSM 03.38] (d)&lt;br /&gt;1 1 0 1 x x x x GSM MWI control - see [GSM 03.38] (d)&lt;br /&gt;1 1 1 0 x x x x reserved&lt;br /&gt;1 1 1 1 x x x x GSM message class control - see [GSM 03.38] (e)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notes:&lt;/b&gt;&lt;br /&gt;a. These coding schemes are common to GSM, TDMA and CDMA. The SMPP protocol   allows ESME applications to use the same DCS value (i.e. the GSM 03.38 value) for all   three technologies.&lt;br /&gt;b. In cases where a Data Coding Scheme is defined for TDMA and/ or CDMA but not   defined for GSM, SMPP uses GSM 03.38 reserved values.&lt;br /&gt;c. There is no default setting for the data_coding parameter.&lt;br /&gt;d. The data_coding parameter will evolve to specify Character code settings only. Thus the   recommended way to specify GSM MWI control is by specifying the relevant settings in   the optional parameters &lt;i&gt;_ms_msg_wait_facilities &lt;/i&gt;and &lt;i&gt;ms_validity.&lt;/i&gt;&lt;br /&gt;e. The data_coding parameter will evolve to specify Character code settings only. Thus the   recommended way to specify GSM message class control is by specifying the relevant   setting in the optional parameter &lt;i&gt;dest_addr_subunit&lt;/i&gt;.   &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;sm_default_msg_id&lt;/b&gt;&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Указывает на "предопределенное"   ("canned") сообщение, т. е. заранее   сохраненное на SMSC. Может принимать   значение 0-254 (0 если не используется).&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;sm_length&lt;/b&gt;&lt;/td&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Integer&lt;/td&gt; &lt;td&gt;Длина в октетах следующего поля&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;short_message&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Var 0-254&lt;/td&gt; &lt;td&gt;Octet String&lt;/td&gt; &lt;td&gt;Собственно,   сообщение :). Обратим внимание, что это поле   расширено до 254 остетов (против 160-ти). Это   связано с тем, что возможна передача   сообщений в различных кодировках.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;hr noshade="noshade"&gt; &lt;p align="justify"&gt; Далее в пакете могут быть необязательные параметры в TLV формате. Все они связаны с использованием дополнительных возможностей, предоставляемых SMPP и в нашем конкретном случае не надобны. Еще раз хотим обратить внимание, что в этой статье мы не собирались давать подробный перевод спецификации протокола, равно как и документов GSM.  Напротив, мы хотели "спроецировать" тот необходимый минимум, который позволит создать работающее SMS-приложение. Дальнейшее его развитие -- дело ума чести и совести каждого :). Посему мы сейчас не станем детально останавливаться на описании каждого поля (там, где было возможно, мы посторались указать на наиболее употребительные значения). Позже мы приведем пример работающего кода и многое станет более понятно. Вопросы можно задать в комментариях. &lt;/p&gt;  &lt;h3&gt;submit_sm_resp. command_id = 0x80000004&lt;/h3&gt; &lt;p align="justify"&gt;Тело пакета submit_sm_resp состоит из следующих полей:&lt;/p&gt; &lt;hr noshade="noshade"&gt; &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Field name &lt;/th&gt; &lt;th&gt;Size (octets) &lt;/th&gt; &lt;th&gt;Type &lt;/th&gt; &lt;th&gt;Description &lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;b&gt;message_id&lt;/b&gt;&lt;/td&gt; &lt;td&gt;Var. max 65&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Идентификатор сообщения, назначенный SMSC &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;hr noshade="noshade"&gt; &lt;p align="justify"&gt; В том случае, если поле &lt;b&gt;command_status &lt;/b&gt;заголовка пакета не содержит нулевого значения (т. е. указывает на ошибку), тело пакета не передается.  Идентификатор, назначенный SMSC используется для дальнейших операций с сообщениями, как то: запросы, удаление, замещение. Кроме того, он же будет фигурировать в delivery_receipt-е. От внимательного читателя не укрылось, что длина идентификатора в 65 октетов (символов), вообще говоря, не позволяет хранить его ни в каком из цифровых форматов. Тем не менее, на практике почти всегда это поле содержит значение, укладывающееся в 32-х битное целое (по крайней мере, другого не наблюдалось). Так что выбор формата хранения smsc_id целиком на совести разработчика ESME ибо чаще всего эти значения хранятся в поле таблицы базы данных, а поиск цифрового значения гораздо более эффективен, нежели строки.&lt;/p&gt;  &lt;h3&gt;Формат представления даты в SMPP.&lt;/h3&gt;  &lt;p align="justify"&gt; В данной версии протокола все поля, связанные с датой и временем должны быть представлены в формате &lt;b&gt;“YYMMDDhhmmsstnnp”&lt;/b&gt; где:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;‘YY’ последние две цифры года  (00-99)&lt;/li&gt;&lt;li&gt;‘MM’ месяц  (01-12)&lt;/li&gt;&lt;li&gt;‘DD’ день месяца  (01-31)&lt;/li&gt;&lt;li&gt;‘hh’ час (00-23)&lt;/li&gt;&lt;li&gt;‘mm’ минута (00-59)&lt;/li&gt;&lt;li&gt;‘ss’ секунда (00-59)&lt;/li&gt;&lt;li&gt;‘t’ десятая секунды (0-9)&lt;/li&gt;&lt;li&gt;‘nn’ различие в четвертях часа между локальным временем     и временем  UTC(Universal Time Constant) (00-48).&lt;/li&gt;&lt;li&gt;‘p’ =  “+”локальное время опережает UTC.&lt;/li&gt;&lt;li&gt;‘p’ =  “-” локальное время отстает от UTC.&lt;/li&gt;&lt;li&gt;‘p’ = “R” локальное время задано относительно времени SMSC.&lt;/li&gt;&lt;/ul&gt; &lt;p align="justify"&gt; В зависимости от значения параметра "p" (+/- или R) различают абсолютный (+/-) или относительный (R) формат даты. Абсолютный формат указывает на точно специфицированный момент времени (как показано выше), а относительный -- промежуток времени относительно текущего времени SMSC. Например, '020610233429000R' будет истолковано как 2 года, 6 месяцев, 10 дней, 23 часа, 34 минуты и 29 секунд от текущего времени SMSC.&lt;/p&gt; &lt;p align="justify"&gt;В ответах SMSC дается его локальное время в формате “YYMMDDhhmmss”. &lt;/p&gt;  &lt;h3&gt;deliver_sm. command_id = 0x5 &lt;/h3&gt; &lt;p align="justify"&gt; Формат пакета &lt;b&gt;deliver_sm&lt;/b&gt; полностью совпадает с форматом пакета &lt;b&gt;submit_sm &lt;/b&gt; (в части описанных обязательных параметров), посему мы не будем здесь его еще раз повторять. Упомянем только о специфике в значениях некоторых полей: &lt;/p&gt; &lt;ol&gt;&lt;li&gt; schedule_delivery_time не используется и выставляется в 0.&lt;/li&gt;&lt;li&gt; Поле &lt;i&gt;validity_period &lt;/i&gt;не используется и выставляется в 0.&lt;/li&gt;&lt;li&gt; Поле &lt;i&gt;registered_delivery &lt;/i&gt;указывает что необходимо     подтверждение ESME (ESME acknowledgement). Для     отправки подтверждения ESME   должно     использовать пакет &lt;i&gt;submit_sm&lt;/i&gt; со     специальным значением (см. выше) поля &lt;i&gt;esm_class&lt;/i&gt;.&lt;/li&gt;&lt;li&gt; Поле &lt;i&gt;replace_if_present_flag &lt;/i&gt; не используется и выставляется в 0.&lt;/li&gt;&lt;li&gt; Поле &lt;i&gt;sm_default_msg_id &lt;/i&gt;не используется и выставляется в 0.&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt; Напомним, что SMSC использует этот пакет как для доставки входящих (для ESME) сообщений так и для передачи подтверждений доставки (delivery_receipt).  Тип сообщения (входящее/подтверждение) указывается, как и для submit_sm, в поле &lt;i&gt;esm_class&lt;/i&gt;: &lt;/p&gt; &lt;hr noshade="noshade"&gt; &lt;b&gt; Bits 7 6 5 4 3 2 1 0 Meaning&lt;/b&gt;&lt;br /&gt;&lt;u&gt;Message Mode (bits 1-0)&lt;/u&gt;&lt;br /&gt;x x x x x x x x not applicable - ignore bits 0 and 1&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Message Type (bits 5-2)&lt;/u&gt;&lt;br /&gt;x x 0 0 0 0 x x Default message Type (i.e.  normal message)&lt;br /&gt;x x 0 0 0 1 x x Short Message contains SMSC Delivery Receipt&lt;br /&gt;x x 0 0 1 0 x x Short Message contains SME Delivery Acknowledgement&lt;br /&gt;x x 0 0 1 1 x x reserved&lt;br /&gt;x x 0 1 0 0 x x Short Message contains SME Manual/User Acknowledgment&lt;br /&gt;x x 0 1 0 1 x x reserved&lt;br /&gt;x x 0 1 1 0 x x Short Message contains Conversation Abort (Korean CDMA)&lt;br /&gt;x x 0 1 1 1 x x reserved&lt;br /&gt;x x 1 0 0 0 x x Short Message contains Intermediate Delivery Notification&lt;br /&gt;&lt;i&gt;all other values reserved&lt;/i&gt; &lt;hr noshade="noshade"&gt;  &lt;h3 align="justify"&gt;deliver_sm_resp. command_id = 0x80000005 &lt;/h3&gt; Формат пакета &lt;b&gt;deliver_sm_resp &lt;/b&gt;в точности совпадает с форматом пакета &lt;i&gt;submit_sm_resp &lt;/i&gt;с тем исключением, что поле &lt;i&gt;message_id&lt;/i&gt; не используется и выставляется в 0.   &lt;h3 align="justify"&gt;Формат подтверждения доставки. &lt;/h3&gt; &lt;p align="justify"&gt; Как уже говорилось, для поттверждения доставки SMSC использует пакет &lt;b&gt;deliver_sm&lt;/b&gt; со специальным (см. выше)  значением поля &lt;i&gt;esm_class. &lt;/i&gt;Обычно оно содержит значение 0x4, но, как видно, младшие два бита могут содержать любое значение. Сама информация подтверждения содержится в поле &lt;i&gt;short_message&lt;/i&gt;. Точное значение этого поля зависит от производителя и модели SMSC, но, в большинстве случаев, подчиняется рекомендованному формату: &lt;b&gt;“id:IIIIIIIIII sub:SSS dlvrd:DDD submit date:YYMMDDhhmm done date:YYMMDDhhmm stat:DDDDDDD err:E text: . . . . . . . . .” &lt;/b&gt;Где: &lt;/p&gt; &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Field name &lt;/th&gt; &lt;th&gt;Size (octets) &lt;/th&gt; &lt;th&gt;Type &lt;/th&gt; &lt;th&gt;Description &lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;b&gt;id&lt;/b&gt;&lt;/td&gt; &lt;td&gt;10&lt;/td&gt; &lt;td&gt;C-Octet String (Decimal)&lt;/td&gt; &lt;td&gt;Идентификатор сообщения, назначенный SMSC &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;sub&lt;/b&gt; &lt;/td&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;C-Octet String (Decimal)&lt;/td&gt; &lt;td&gt;Количество посланных сообщений.   Используеся, если сообщения послано   нескольким получателям. Дополняется   ведущими нулями &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;dlvrd&lt;/b&gt; &lt;/td&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;C-Octet String (Decimal)&lt;/td&gt; &lt;td&gt;Количество доведенных сообщений.   Используеся, если сообщения послано   нескольким получателям. Дополняется   ведущими нулями &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;submit date&lt;/b&gt;&lt;/td&gt; &lt;td&gt;10&lt;/td&gt; &lt;td&gt;C-Octet Fixed Length String&lt;/td&gt; &lt;td&gt;Время, когда сообщение было отправлено в   формате 'YYMMDDhhmm'&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;done date&lt;/b&gt; &lt;/td&gt; &lt;td&gt;10&lt;/td&gt; &lt;td&gt;C-Octet Fixed Length String&lt;/td&gt; &lt;td&gt;Время, когда сообщение достигло   финального состояния (доведено/не может   быть доведено) в формате 'YYMMDDhhmm'&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;stat&lt;/b&gt;&lt;/td&gt; &lt;td&gt;7&lt;/td&gt; &lt;td&gt;C-Octet Fixed Length String&lt;/td&gt; &lt;td&gt;Состояние. (см. ниже)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;err&lt;/b&gt;&lt;/td&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;C-Octet Fixed Length String&lt;/td&gt; &lt;td&gt;Может содержать код   ошибки (если необходимо)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;b&gt;text&lt;/b&gt;&lt;/td&gt; &lt;td&gt;20&lt;/td&gt; &lt;td&gt;C-Octet String&lt;/td&gt; &lt;td&gt;Первые 20 символов   исходного сообщения.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th&gt;State &lt;/th&gt; &lt;th&gt;Stat field value  &lt;/th&gt; &lt;th&gt;Description &lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;DELIVERED&lt;/td&gt; &lt;td&gt;DELIVRD&lt;/td&gt; &lt;td&gt;Сообщение доведено получателю &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;EXPIRED&lt;/td&gt; &lt;td&gt;EXPIRED&lt;/td&gt; &lt;td&gt;Истек срок годности сообщения &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;DELETED&lt;/td&gt; &lt;td&gt;DELETED&lt;/td&gt; &lt;td&gt;Сообщение было удалено &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;UNDELIVERABLE&lt;/td&gt; &lt;td&gt;UNDELIV&lt;/td&gt; &lt;td&gt;Сообщение не может быть доведено &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ACCEPTED&lt;/td&gt; &lt;td&gt;ACCEPTD&lt;/td&gt; &lt;td&gt;Было прочитано вручную от имени   подписчика &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;UNKNOWN&lt;/td&gt; &lt;td&gt;UNKNOWN&lt;/td&gt; &lt;td&gt;Сообщение в некорректном состоянии &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;REJECTED&lt;/td&gt; &lt;td&gt;REJECTD&lt;/td&gt; &lt;td&gt;Сообщение отвергнуто &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;h3&gt;Unbind.&lt;/h3&gt; &lt;p align="justify"&gt; Команды &lt;b&gt;unbind&lt;/b&gt; и &lt;b&gt;unbind_resp&lt;/b&gt; имеют значения &lt;i&gt;command_id&lt;/i&gt; 0x6 и 0x80000006 соответственно и не содержат тел (т. е.  состоят из одного header'а)&lt;/p&gt;  &lt;h2&gt;Заключение &lt;/h2&gt; &lt;p align="justify"&gt; Теперь, думается, мы знаем достаточно для того, чтобы написать наше первое настоящее SMS-приложение, чем мы и займемся в следующей статье.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-2733738013731122851?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/2733738013731122851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=2733738013731122851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/2733738013731122851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/2733738013731122851'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/blog-post.html' title='SMS-приложение. Часть 3'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-728304250152687302</id><published>2007-07-08T23:02:00.000-07:00</published><updated>2007-07-08T23:05:04.780-07:00</updated><title type='text'>SMS-приложение. Часть 2</title><content type='html'>&lt;h2&gt;Процедура авторизации.&lt;/h2&gt;  &lt;p align="justify"&gt;  Мы начинаем обсуждать команды протокола. В нашем, самом первом, приложении нам  их понадобится совсем немного. Начнем с процедуры авторизации, выполняемой  одной из команд семейства &lt;b&gt;BIND&lt;/b&gt;.  &lt;/p&gt;  &lt;h3&gt;Команды BIND.&lt;/h3&gt;  &lt;p align="justify"&gt;  Как уже говорилось, это семейство включает три команды:   &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;bind_receiver&lt;/b&gt; -- сообщает SMSC, что ESME подключается для приема  сообщений. Такой режим (только прием) характерен, например, для пэйджинговых  шлюзов. &lt;/li&gt;&lt;li&gt;&lt;b&gt;bind_transmitter&lt;/b&gt; -- сообщает SMSC, что ESME подключается для  передачи сообщений. Данный режим используется, в частности, при организации  рассылок (в том числе, к сожалению, и спама).&lt;/li&gt;&lt;li&gt;&lt;b&gt;bind_transceiver&lt;/b&gt; -- сообщает SMSC, что ESME подключается для приема  и передачи (т. е. в полнодуплексной моде). Этот режим удобен для создания  полнофункциональных шлюзов.&lt;/li&gt;&lt;/ul&gt;    &lt;p align="justify"&gt;  Ниже мы рассмотрим каждую из команд в отдельности и приведем формат пакетов.  Как уже отмечалось, все команды (пакеты) SMPP должны предваряться заголовком.  В заголовке команды поле command_id должно содержать соответствующее значение.   &lt;/p&gt;  &lt;h4&gt;bind_receiver. command_id = 0x01&lt;/h4&gt;  &lt;p align="justify"&gt;  Тело пакета &lt;b&gt;bind_receiver&lt;/b&gt; состоит из следующих полей:  &lt;/p&gt;&lt;hr noshade="noshade"&gt;  &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr&gt;  &lt;th colspan="3"&gt;Field name  &lt;/th&gt;  &lt;th colspan="3"&gt;Size (octets)  &lt;/th&gt;  &lt;th colspan="3"&gt;Type  &lt;/th&gt;  &lt;th colspan="3"&gt;Description  &lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;system_id&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;Var. max 16&lt;/td&gt;  &lt;td colspan="3"&gt;C-Octet String&lt;/td&gt;  &lt;td colspan="3"&gt;Идентифицирует ESME. Можно рассматривать это поле, как  "username". &lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;password&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;Var. max 9&lt;/td&gt;  &lt;td colspan="3"&gt;C-Octet String&lt;/td&gt;  &lt;td colspan="3"&gt;Пароль для аутентификации.&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;system_type&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;Var. max 13&lt;/td&gt;  &lt;td colspan="3"&gt;C-Octet String&lt;/td&gt;  &lt;td colspan="3"&gt;Необязательное. Используется для указания категории ESME,  например "WWW", "E-MAIL" и т. д. Если не используется, должно содержать один  октет NULL (0x0)&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;interface_version&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;1&lt;/td&gt;  &lt;td colspan="3"&gt;Integer&lt;/td&gt;  &lt;td colspan="3"&gt;Идентифицирует версию протокола SMPP, поддерживаемую ESME.  0x00-0x33 указывают, что поддерживается версия 3.3 или более ранняя. 0x34  указывает, что поддерживается версия 3.4&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;addr_ton&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;1&lt;/td&gt;  &lt;td colspan="3"&gt;Integer&lt;/td&gt;  &lt;td colspan="3"&gt;Указывает тип адреса (TON - Type Of Number) ESME. (см.  ниже). Если неизвестен, выставляется в NULL&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;addr_npi&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;1&lt;/td&gt;  &lt;td colspan="3"&gt;Integer&lt;/td&gt;  &lt;td colspan="3"&gt;Указывает индикатор плана номеров (NPI -- Numbering Plan  Indicator). (см. ниже). Если неизвестен, выставляется в NULL&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;address_range&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;Var. max 41&lt;/td&gt;  &lt;td colspan="3"&gt;C-Octet String&lt;/td&gt;  &lt;td colspan="3"&gt;Адрес или диапазон адресов, обслуживаемых ESME. Если  неизвестен, выставляется в NULL&lt;/td&gt;  &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;  &lt;hr noshade="noshade"&gt;    &lt;h4&gt;bind_receiver_resp. command_id = 0x80000001&lt;/h4&gt;  &lt;p align="justify"&gt;  Тело пакета &lt;b&gt;bind_receiver_resp&lt;/b&gt; состоит из следующих полей (*):  &lt;/p&gt;&lt;hr noshade="noshade"&gt;  &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr&gt;  &lt;th colspan="3"&gt;Field name  &lt;/th&gt;  &lt;th colspan="3"&gt;Size (octets)  &lt;/th&gt;  &lt;th colspan="3"&gt;Type  &lt;/th&gt;  &lt;th colspan="3"&gt;Description  &lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;system_id&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt;Var. max 16&lt;/td&gt;  &lt;td colspan="3"&gt;C-Octet String&lt;/td&gt;  &lt;td colspan="3"&gt;Подтвержденный идентификатор ESME.&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;&lt;b&gt;sc_interface_version&lt;/b&gt; &lt;/td&gt;  &lt;td colspan="3"&gt; - &lt;/td&gt;  &lt;td colspan="3"&gt;TLV&lt;/td&gt;  &lt;td colspan="3"&gt;Необязательное поле в формате TLV. Информирует о версии  протокола SMPP, поддерживаемой SMSC&lt;/td&gt;  &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;  &lt;hr noshade="noshade"&gt;  &lt;i&gt;(*) -- В том случае, если поле command_status заголовка содержит ненулевое  значение (т. е. информирует об ошибке) тело пакета не передается.&lt;/i&gt;      &lt;h4&gt;bind_transmitter. command_id = 0x02&lt;/h4&gt;  &lt;p align="justify"&gt;  Формат и назначение полей тела пакета &lt;b&gt;bind_transmitter&lt;/b&gt; совпадает с форматом и   назначением полей тела пакета &lt;b&gt;bind_receiver&lt;/b&gt;.  &lt;/p&gt;    &lt;h4&gt;bind_transmitter_resp. command_id = 0x80000002&lt;/h4&gt;  &lt;p align="justify"&gt;  Формат и назначение полей тела пакета &lt;b&gt;bind_transmitter_resp&lt;/b&gt; совпадает с форматом и   назначением полей тела пакета &lt;b&gt;bind_receiver_resp&lt;/b&gt;.  &lt;/p&gt;    &lt;h4&gt;bind_tranceiver. command_id = 0x03&lt;/h4&gt;  &lt;p align="justify"&gt;  Формат и назначение полей тела пакета &lt;b&gt;bind_transceiver&lt;/b&gt; совпадает с форматом и   назначением полей тела пакета &lt;b&gt;bind_receiver&lt;/b&gt;.  &lt;/p&gt;    &lt;h4&gt;bind_tranceiver_resp. command_id = 0x80000003&lt;/h4&gt;  &lt;p align="justify"&gt;  Формат и назначение полей тела пакета &lt;b&gt;bind_transceiver_resp&lt;/b&gt; совпадает с форматом и   назначением полей тела пакета &lt;b&gt;bind_receiver_resp&lt;/b&gt;.  &lt;/p&gt;    &lt;h3&gt;Параметры TON и NPI.&lt;/h3&gt;  &lt;p align="justify"&gt;  Параметры TON и NPI не являются специфичными для протокола SMPP, поэтому мы  здесь не будем останавливаться на них подробно, а просто приведем их возможные  значения (подробнее об этих параметрах можно прочитать в документации GSM):  &lt;/p&gt;&lt;hr noshade="noshade"&gt;  &lt;table&gt;  &lt;/table&gt;&lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr&gt;  &lt;th colspan="3"&gt;TON  &lt;/th&gt;  &lt;th colspan="3"&gt;Value (bin)  &lt;/th&gt;  &lt;/tr&gt;&lt;tr&gt;  &lt;td colspan="3"&gt;Unknown&lt;/td&gt;  &lt;td colspan="3"&gt;00000000&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;International&lt;/td&gt;  &lt;td colspan="3"&gt;00000001&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;National&lt;/td&gt;  &lt;td colspan="3"&gt;00000010&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Network Specific&lt;/td&gt;  &lt;td colspan="3"&gt;00000011&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Subscriber Number&lt;/td&gt;  &lt;td colspan="3"&gt;00000100&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Alphanumeric&lt;/td&gt;  &lt;td colspan="3"&gt;00000101&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Abbreviated&lt;/td&gt;  &lt;td colspan="3"&gt;00000110&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Reserved&lt;/td&gt;  &lt;td colspan="3"&gt;All others&lt;/td&gt;  &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt;  &lt;tbody&gt;&lt;tr&gt;  &lt;th colspan="3"&gt;NPI  &lt;/th&gt;  &lt;th colspan="3"&gt;Value (bin)  &lt;/th&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Unknown&lt;/td&gt;  &lt;td colspan="3"&gt;00000000&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;ISDN (E163/E164)&lt;/td&gt;  &lt;td colspan="3"&gt;00000001&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Data (X.121)&lt;/td&gt;  &lt;td colspan="3"&gt;00000011&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Telex (F.69)&lt;/td&gt;  &lt;td colspan="3"&gt;00000100&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Land Mobile (E.212)&lt;/td&gt;  &lt;td colspan="3"&gt;00000110&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;National&lt;/td&gt;  &lt;td colspan="3"&gt;00001000&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Private&lt;/td&gt;  &lt;td colspan="3"&gt;00001001&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;ERMES&lt;/td&gt;  &lt;td colspan="3"&gt;00001010&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Internet (IP)&lt;/td&gt;  &lt;td colspan="3"&gt;00001100&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;WAP Client Id (to be&lt;br /&gt;defined by WAP Forum)&lt;/td&gt;  &lt;td colspan="3"&gt;00010010&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;  &lt;td colspan="3"&gt;Reserved&lt;/td&gt;  &lt;td colspan="3"&gt;All others&lt;/td&gt;  &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;  &lt;hr noshade="noshade"&gt;      &lt;h3&gt;Generic Negative Result (generic_nack)&lt;/h3&gt;  &lt;p align="justify"&gt;  Как уже отмечалось, любая из команд, испущенная той или иной из сторон должна  квитироваться ACK'ом (за единственным, упомянутым в прошлой статье  исключением). При этом поле command_id заголовка ACK'а должно содержать  соответствующее значение (равное command_id оригинальной команды с  выставленным 31-м битом), а поле sequence_number заголовка должно указывать  номер транзакции оригинальной команды. Однако в некоторых случаях, в  частности, когда принимающая сторона не может распознать заголовок  оригинальной команды -- например, при возникновении "мусора" в TCP/IP канале  -- информация, необходимая для формирования корректного ACK'а может оказаться  недоступной. В таких случаях принимающая сторона отвечает специальным пакетом,  называемым &lt;b&gt;generic_nack&lt;/b&gt; (command_id = 0x80000000). Данный пакет состоит  из одного заголовка с указанным command_id. Поле command_status содержит  соответствующий код ошибки, а поле sequence_number может содержать NULL (0x0),  если не удалось распознать номер транзакции оригинальной команды.  &lt;/p&gt;    &lt;h3&gt;Замечания.&lt;/h3&gt;  &lt;p align="justify"&gt;  Несколько слов по поводу направления передачи данных по соединениям, т. к. могут  возникать недоразумения, связанные с названиями сессий. Например, если ESME  авторизовалось с помощью команды &lt;b&gt;bind_transmitter&lt;/b&gt; и сессия перешла в  состояние &lt;b&gt;BOUND_TX&lt;/b&gt;, не следует думать, что SMSC &lt;i&gt;не может&lt;/i&gt;  передавать данные в такое соединение (т. е., что программист избавлен от  вызова &lt;b&gt;recv(2)&lt;/b&gt; с этим сокетом). Напротив, еще раз подчеркнем, что ACK'и  передаются &lt;b&gt;в рамках того же&lt;/b&gt; соединения (т. е. в тот же сокет), что и  оригинальные команды. С другой стороны, разумеется, входящие сообщения (т. е.  от SMSC к ESME) не могут быть переданы по соединению, находящемуся в &lt;b&gt;BOUND_TX&lt;/b&gt;.  Это важный момент и вот почему: как мы договорились, мы будем работать в т. н.  &lt;b&gt;Store And Forward Mode&lt;/b&gt;, при этом сообщения сначала помещаются в базу  данных SMSC, а потом предпринимаются попытки их доведения. Таким образом, факт  помещения в базу данных (подтверждаемый ACK'ом) еще не означает, что конечный  пользователь &lt;i&gt;получил&lt;/i&gt; данное сообщение, кроме того, оно вообще может  быть не доведено до истечения срока годности в том случае, например, если  аппарат пользователя остается отключенным не протяжении нескольких дней.   SMSC сигнализирует о переходе сообщения в финальное состояние (доставлено/не  может быть доставлено) с помощью (специального вида) команды &lt;b&gt;deliver_sm&lt;/b&gt;,  т. е. той же команды с помощью которой передаются &lt;i&gt;входящие&lt;/i&gt; сообщения, и  которая ... &lt;i&gt;не может&lt;/i&gt; быть передана в соединение находящееся в &lt;b&gt;BOUND_TX&lt;/b&gt;!  В действительности, такие сообщения, называемые &lt;b&gt;delivery receipts&lt;/b&gt;  некоторое время хранятся на SMSC и передаются в &lt;i&gt;первое же, авторизовавшееся  с помощью &lt;b&gt;bind_receiver&lt;/b&gt;, соединение с тем же system_id&lt;/i&gt;. Таким образом,  достаточно время от времени открывать сессию с помощью &lt;b&gt;bind_receiver&lt;/b&gt; и  "снимать" delivery receipt'ы и входящие сообщения, буде таковые найдутся, или  просто сразу же открывать две сессии. Понятно, что для сессий в состоянии  &lt;b&gt;BOUND_TRX&lt;/b&gt; таких проблем не существует. Однако, в случаях больших  загрузок предпочтительней иметь отдельные сессии на прием и передачу  (возможно, в разных потоках исполнения -- threads) чтобы распараллелить эти  операции.  &lt;/p&gt;    &lt;h2&gt;Промежуточный итог 2&lt;/h2&gt;  &lt;p align="justify"&gt;  В данной главе мы обсудили процедуру авторизации поверх сокетного соединения.  Как мы видим, она не слишком сложна, хотя здесь есть некоторые интересные  моменты. Нам осталось обсудить команды передачи и приема сообщений и мы  вплотную приблизимся к кодированию.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-728304250152687302?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/728304250152687302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=728304250152687302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/728304250152687302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/728304250152687302'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/sms-2.html' title='SMS-приложение. Часть 2'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-2427641997607401247</id><published>2007-07-08T23:00:00.000-07:00</published><updated>2007-07-08T23:01:43.912-07:00</updated><title type='text'>SMS-приложение. Часть 1</title><content type='html'>&lt;h2&gt;Выбор протокола.&lt;/h2&gt; &lt;p align="justify"&gt; Что ж, вот и настала пора написать наше первое реально работающее SMS-приложение, чем и займемся. Для "удобоварения" мы разбили эту статью на несколько частей: сначала займемся некоторыми теоретическими вопросами (так, сущие пустяки -- опишем протокол :), а затем, не отвлекаясь, займемся кодированием. &lt;/p&gt; &lt;p align="justify"&gt; В прошлый раз мы показали, как устанавливать связь с Сервис-центром, теперь же необходимо научиться работать собственно с протоколом -- формировать и "разбирать" пакеты. Но прежде, как легко догадаться, необходимо выбрать протокол. Эту сложнейшую задачу мы возьмем на себя ;) и остановимся на &lt;b&gt;SMPP&lt;/b&gt; (Short Messages Peer-to-Peer). В пользу такого выбора говорят не только личные пристрастия, но и то, что данный протокол является наиблее широко распространненым, отлично проработан и превосходно документирован. Кроме того, не исключая возможности того, что читателям в реальности придется столкнуться с другими протоколами, отметим, что здесь ситуация сродни изучению иностранных языков: второй изучать легче чем первый, третий, чем второй и т. д. &lt;/p&gt; &lt;h2&gt;Протокол SMPP.&lt;/h2&gt; &lt;h3&gt;Обзор.&lt;/h3&gt; &lt;p align="justify"&gt; Протокол &lt;b&gt;SMPP&lt;/b&gt; позволяет , как не трудно догадаться, "внешним" устройствам обмениваться сообщениями с мобильной сетью (&lt;b&gt;PLMN&lt;/b&gt;) посредством &lt;b&gt;SMSC&lt;/b&gt; и определяет: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Набор операций для обмена между SMSC и ESME, называемых также "командами" (command).&lt;/li&gt;&lt;li&gt;Формат передаваемого пакета (&lt;b&gt;PDU&lt;/b&gt; -- Protocol Data Unit), ассоциированный с каждой из операций.&lt;/li&gt;&lt;li&gt;Формат ответного пакета (&lt;b&gt;ACK&lt;/b&gt; или responce) для каждой PDU.&lt;/li&gt;&lt;li&gt;Данные, которыми ESME должна обмениваться с SMSC в ходе таких операций.&lt;/li&gt;&lt;/ul&gt;  &lt;p align="justify"&gt; Таким образом, вызову команды соответствует отправка PDU, поэтому мы иногда вместо "вызвать submit_sm" будем говорить "послать submit_sm" и наоборот. Следует также обратить внимание на то, что каждая из команд в рамках сессии &lt;i&gt;&lt;b&gt;должна&lt;/b&gt;&lt;/i&gt; быть подтверждена ответным пакетом (&lt;b&gt;ACK&lt;/b&gt;), единственное исключение -- &lt;i&gt;alert_notification PDU&lt;/i&gt; (впрочем, эта команда нам на первых порах не понадобится). &lt;/p&gt; &lt;h3&gt;Сессии SMPP.&lt;/h3&gt; &lt;p align="justify"&gt; Обмен сообщениями с SMSC в формате протокола SMPP (кстати говоря -- не только) носит  сессионный характер. Это означает, что обмен должен предваряться некоторой процедурой инициализации сессии и, в безошибочном варианте, за обменом должна следовать процедура закрытия сессии. В ходе процедуры открытия сессии &lt;b&gt;ESME&lt;/b&gt; открывает соединение на уровне сокета, авторизуется и сообщает о  цели открытия сессии: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Прием сообщений. (приемник -- &lt;b&gt;RECEIVER&lt;/b&gt;)&lt;/li&gt;&lt;li&gt;Передача сообщений. (передатчик -- &lt;b&gt;TRANSMITTER&lt;/b&gt;)&lt;/li&gt;&lt;li&gt;Прием и передача сообщений. (приемо-передатчик -- &lt;b&gt;TRANCEIVER&lt;/b&gt;)&lt;/li&gt;&lt;/ul&gt;  &lt;p align="justify"&gt; Процедура инициализации выполняется с помощью вызова одной из команд &lt;b&gt;bind_*&lt;/b&gt;: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;bind_receiver&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;bind_transmitter&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;bind_tranceiver&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt; формат которых мы рассмотрим чуть ниже. Таким образом, сессия может находиться в следующих состояниях: &lt;ul&gt;&lt;li&gt;&lt;b&gt;OPEN&lt;/b&gt; -- Установлено сокетное соединение и послан один из запросов &lt;b&gt;bind_*&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;BOUND_RX | BOUND_TX | BOUND_TRX&lt;/b&gt; -- Выполнена одна из команд &lt;b&gt;bind_*&lt;/b&gt;. Соединение готово к &lt;b&gt;приему | передаче | приему и передаче&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;CLOSED&lt;/b&gt; -- Выполнена команда &lt;b&gt;unbind&lt;/b&gt; (рассмотрим позже) и соединение закрыто.&lt;/li&gt;&lt;/ul&gt; Кроме того, SMSC в любой момент может послать команду &lt;b&gt;outbind&lt;/b&gt;. В ответ на эту команду ESME обязана снова выполнить один из запросов &lt;b&gt;bind_*&lt;/b&gt;. Правда, в реальной практике эта команда встречается редко, но к ее обработке следует быть готовым.  &lt;h3&gt;Команды (PDU) SMPP&lt;/h3&gt; &lt;p align="justify"&gt; Протокол SMPP версии 3.4 предоставляет следующий набор команд: &lt;/p&gt;&lt;hr noshade="noshade"&gt; &lt;table noshade="" border="1" bordercolor="#000000" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;th colspan="3"&gt;SMPP PDU Name &lt;/th&gt; &lt;th colspan="3"&gt;Required SMPP Session State  &lt;/th&gt; &lt;th colspan="3"&gt;Issued by ESME  &lt;/th&gt; &lt;th colspan="3"&gt;Issued by SMSC  &lt;/th&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;bind_transmitter&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;bind_transmitter_resp&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;bind_receiver&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;bind_receiver_resp&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;bind_transceiver &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;bind_transceiver_resp &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;outbind&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;OPEN &lt;/td&gt; &lt;td colspan="3"&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;unbind&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_RX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;unbind_resp&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_RX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;&lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;submit_sm&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;submit_sm_resp&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;submit_sm_multi &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;submit_sm_multi_resp &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;data_sm &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_RX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;data_sm_resp &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_RX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;deliver_sm&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_RX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;&lt;b&gt;deliver_sm_resp&lt;/b&gt; &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_RX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;query_sm &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="3"&gt;query_sm_resp &lt;/td&gt; &lt;td colspan="3"&gt;BOUND_TX&lt;br /&gt;BOUND_TRX &lt;/td&gt; &lt;td colspan="3"&gt;No&lt;br /&gt;No &lt;/td&gt; &lt;td colspan="3"&gt;Yes&lt;br /&gt;Yes &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;hr noshade="noshade"&gt;  &lt;p align="justify"&gt; Команды с суффиксом &lt;b&gt;_resp&lt;/b&gt; означают responce, т. е. &lt;b&gt;ACK&lt;/b&gt; (мы также употребляем термин квитанция, и говорим, что ACK "квитирует" команду). Жирным помечены команды, которые мы рассмотрим (остальные в нашем простейшем случае нам пока не понадобятся). &lt;/p&gt; &lt;h3&gt;Режимы (Modes) сообщений.&lt;/h3&gt; &lt;p align="justify"&gt; Протокол SMPP v3.4 поддерживает три режима обмена сообщениями. Мы не будем на этом особо останавливаться, просто упомянем, что в дальнейшем будем работать в т. н. &lt;b&gt;Store and Forward Message Mode&lt;/b&gt;. В данном режиме сообщение сначала сохраняется в базе данных SMSC, а потом предпринимаются попытки его доведения, и, в зависимости от запроса, ESME уведомляется о достижении сообщением финального состояния (доведено/не доведено). Поддерживаются также &lt;b&gt;Datagram Mode&lt;/b&gt; и &lt;b&gt;Transaction Mode&lt;/b&gt;, о которых можно прочесть в соответствующей документации. &lt;/p&gt; &lt;h3&gt;Типы данных SMPP&lt;/h3&gt; &lt;p align="justify"&gt; Все определяемые протоколом PDU представляют собой совокупность полей определенных типов, выстроенные друг за другом в определенном порядке. При работе в сети принято использовать понятие &lt;b&gt;октет (octet)&lt;/b&gt; --  совокупность восьми битов (то что принято называть в программировании  &lt;b&gt;байтом&lt;/b&gt;) для того, чтобы подчеркнуть "восьмибитовость". Все определяемые SMPP типы привязаны к октету. Вот они: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Integer&lt;/b&gt; -- Беззнаковое целое с указанной в каждом конкретном случае  длиной в октетах.&lt;/li&gt;&lt;li&gt;&lt;b&gt;C-Octet String&lt;/b&gt; -- Серия ASCII литер, завершенная нулем.&lt;/li&gt;&lt;li&gt;&lt;b&gt;C-Octet String (Decimal)&lt;/b&gt; -- Серия литер (0-9), завершенная нулем&lt;/li&gt;&lt;li&gt;&lt;b&gt;C-Octet String (Hex)&lt;/b&gt; -- Серия литер (0-F), завершенная нулем.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Octet String&lt;/b&gt; -- Серия октетов, не обязятельно завершенная нулем.&lt;/li&gt;&lt;li&gt;&lt;b&gt;TLV&lt;/b&gt; -- Tag-Length-Value. Используется для необязательных параметров.  Данный тип возник из-за необходимость расширять уже существующие команды с сохранением  обратной совместимости.Поскольку мы не собираемся таковые использовать :), то и останавливаться на этом не будем, хотя вопрос, вообще говоря, важный. Про TLV можно прочитать в спецификации протокола.  &lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;Формат PDU&lt;/h3&gt; &lt;p align="justify"&gt; Каждый пакет (&lt;b&gt;PDU&lt;/b&gt;) состоит из двух частей: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Заголовок (header). Обязательная.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Тело (body). Необязательная.&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt; Формат заголовка общий для всех PDU.  &lt;h4&gt;Заголовок (header)&lt;/h4&gt; &lt;p align="justify"&gt; Заголовок имеет длину 16 октетов и состоит из 4-х полей: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Command length&lt;/b&gt; -- Длина. 4 октета. Должен содержать общую длину пакета, включая и это поле.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Command id&lt;/b&gt; -- Идентификатор команды. 4 октета. Указывает на тип команды.  Принимает значения от 0x0 до 0x1FF для команд и от 0x800000000 до 0x8000001FF для ответов (ACK). Каждый пакет, представляющий собой ACK имеет command_id такой же, как и квитируемая команда, но с выставленным 31-м битом&lt;/li&gt;&lt;li&gt;&lt;b&gt;Command status&lt;/b&gt; -- Статус команды. 4 октета. Используется в ACK'ах, в командах выставляется в 0x0.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sequence number&lt;/b&gt; -- Номер последовательности. В каждом конкретном случае содержит уникальный номер отдельной команды (не путать с command_id) и позволяет ассоциировать ACK с командой. Назначается испускающей стороной произвольно из диапазона 0x1-0x7FFFFFFF. Повтор данного номера в рамках одной сессии, вообще говоря, не допустим. ACK должен иметь тот же номер, что и квитируемая команда.&lt;/li&gt;&lt;/ol&gt; Некоторые PDU (в частности, большинство ACK'ов) состоят только из заголовка и этой информации оказывается достаточно.  &lt;h2&gt;Промежуточный итог&lt;/h2&gt;  В данной части мы обсудили исключительно важный вопрос, а именно: структуру протокола. Надеемся, пока недоразумений не возникло. В случае возникновения вопросов вы можете задать их в комментариях. В следующей части мы перейдем к рассмотрению собственно конкретных команд.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-2427641997607401247?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/2427641997607401247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=2427641997607401247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/2427641997607401247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/2427641997607401247'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/sms-1.html' title='SMS-приложение. Часть 1'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-7887413710283937937</id><published>2007-07-08T22:33:00.000-07:00</published><updated>2007-07-08T22:35:17.927-07:00</updated><title type='text'>Связь с SMSC</title><content type='html'>&lt;h2&gt;Установка связи с SMSC.&lt;/h2&gt; &lt;p align="justify"&gt; В предыдущей статье мы вкратце остановились на описании общего механизма работы &lt;b&gt;SMS&lt;/b&gt;, упомянули некоторые протоколы и наметили основные задачи, которые придется решить при написании SMS клиента. Однако прежде, чем приступить к обсуждению данных вопросов, вернемся ненадолго к терминологии. В тот момент, когда предыдущая статья уже версталась, к нам поступило ценное замечание. В статье мы (произвольно!) использовали аббревиатуру ``MT'' для обозначения сотового телефона, приравняв ее к &lt;b&gt;MS&lt;/b&gt; (Mobile Station). Однако, в стандарте ``MT'' используется применительно к сервисам и обозначает Mobile Terminated (в противоположность Mobile Originated). Мы принимаем это замечание и в дальнейшем будем использовать MS для данных целей (в литературе также встречается аббревиатура &lt;b&gt;SMT&lt;/b&gt; -- Short Messages Terminal -- для обозначения MS и ESME).&lt;/p&gt; &lt;p align="justify"&gt; Итак, мы выделили следующие задачи: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Установка соединения по   &lt;b&gt; TCP/IP&lt;/b&gt; с сервис-центром.&lt;/li&gt;&lt;li&gt;Формирование пакетов в формате выбранного нами протокола.&lt;/li&gt;&lt;li&gt;«Разбор» (parse) пакетов в формате выбранного протокола.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;p align="justify"&gt; В данной статье мы сосредоточимся на первой задаче. Вообще-то, мы не собирались здесь вдаваться в детали программирования сокетов (&lt;b&gt;sockets&lt;/b&gt;), полагая, что читатели знакомы с данным вопросом. Однако думается, что несколько слов сказать все же стоит. Тем не менее мы настоятельно (а как же :) советуем тем, кто не знаком с данным вопросом, изучить его подробнее применительно к той ОС под которой придется программировать. &lt;br /&gt;(для UNIX см. например&lt;a href="http://world.std.com/%7Ejimf/papers/sockets/sockets.html"&gt; http://world.std.com/~jimf/papers/sockets/sockets.html&lt;/a&gt;)&lt;br /&gt;мы же приведем простую реализацию, которая нам понадобится в дальнейшем. Те же, кто уже сталкивался с программированием сокетов могут запросто пропустить данную статью, обратившись, может быть, к нескольким последним абзацам. &lt;/p&gt;  &lt;h2&gt;Использование сокетов.&lt;/h2&gt; &lt;h3&gt;2.2 Общие принципы.&lt;/h3&gt; &lt;p align="justify"&gt; Связь по &lt;b&gt;TCP/IP&lt;/b&gt; устанавливается по принципу "точка-точка"; инициирующая сторона называется клиентом, принимающая -- сервером. Сервер постоянно находится в ожидании входящих соединений (как говорят, "слушает" -- listening), клиент же посылает запрос на установление связи, используя &lt;b&gt;IP-номер&lt;/b&gt; (&lt;b&gt;IP-адрес&lt;/b&gt;) сервера и номер &lt;b&gt;порта&lt;/b&gt;. &lt;b&gt;IP-адрес&lt;/b&gt; это тридцатидвухразрядное число, представляемое обычно в т. н. dotted нотации: &lt;/p&gt;&lt;dir&gt;&lt;b&gt;XXX.XXX.XXX.XXX&lt;/b&gt;&lt;/dir&gt; (байты разделены точками, кажда из групп XXX может принимать значения от 0 до 255). Номер же прота можно рассматривать как указание на конкретный сервис данного узла. Таким образом, для установки соединения клиенту необходимо знать пару чисел &lt;b&gt;IP-адрес:порт&lt;/b&gt; (например  &lt;a href="http://192.18.97.241/"&gt;192.18.97.241:80&lt;/a&gt; дает нам www-сервер компании  Sun Microsystems :). Мы не станем здесь останавливаться на службе доменных имен (предыдущий пример можно записать проще: http://www.sun.com:80), URL и прочем, полагая, что читателю это знакомо. Заметим только, что существуют стандартные соглашения на присваивание номеров портов сервисам (в предыдущем примере использован порт 80 -- http; можно упомянуть порт 21 -- ftp, 23 -- telnet и 25 -- smtp), посему для "нестандартных" сервисов рекомендуется брать "большие" номера (мы предпочитаем номера начиная с 8100). Кстати, из вышесказанного видно, что работа с сокетами на клиентской и серверной сторонах различна. Мы начнем (сюрприз!) с серверной части.  &lt;h3&gt;2.2 Сервер.&lt;/h3&gt; &lt;p align="justify"&gt; Простейшая реализация &lt;b&gt;TCP/IP&lt;/b&gt; сервера может быть представлена следующим кодом (socktest.c):&lt;/p&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;winsock.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;unistd.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/types.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/socket.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;arpa/inet.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;netinet/in.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;netdb.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr SOCKADDR;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr_in SOCKADDR_IN;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SOCKET_ERROR -&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define INVALID_SOCKET -&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define closesocket(s) close(s)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _WIN32 */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;stdio.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;main(&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; argc, &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt;** argv)&lt;br /&gt;{&lt;br /&gt; SOCKADDR_IN sockaddr;&lt;br /&gt; SOCKADDR_IN descr;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; addr_len = &lt;b&gt;&lt;span style="color:#804040;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;(SOCKADDR_IN);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt; SOCKET sock;&lt;br /&gt; SOCKET newsock;&lt;br /&gt; WSADATA WSAData;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;/* Startup socket library */&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (WSAStartup(MAKEWORD(&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;,&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;), &amp;WSAData) != &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;)&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't initialize socket library"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#else &lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; sock;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; newsock;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _WIN32 */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;/* create socket */&lt;/span&gt;&lt;br /&gt; sock = socket(PF_INET, SOCK_STREAM, &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;);&lt;br /&gt; &lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (sock == INVALID_SOCKET) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't open socket"&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;/* filling up sockaddr structure */&lt;/span&gt;&lt;br /&gt; sockaddr.sin_family = AF_INET;&lt;br /&gt; sockaddr.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt; sockaddr.sin_port = htons(&lt;span style="color:#ff00ff;"&gt;8100&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;/* bind socket */&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (bind(sock, (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;const&lt;/span&gt;&lt;/b&gt; SOCKADDR *)&amp;sockaddr, &lt;b&gt;&lt;span style="color:#804040;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;(SOCKADDR_IN))) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't bind socket"&lt;/span&gt;);&lt;br /&gt;  closesocket(sock);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;/* start listening */&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (listen(sock, &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;) == SOCKET_ERROR) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't start listening"&lt;/span&gt;);&lt;br /&gt;  closesocket(sock);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;else&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;/* accept connection (note that accept() is the blocking call) */&lt;/span&gt;&lt;br /&gt;  newsock = accept(sock, (SOCKADDR *)&amp;descr, &amp;amp;addr_len);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (newsock != INVALID_SOCKET) {&lt;br /&gt;   printf(&lt;span style="color:#ff00ff;"&gt;"Connection is accepted. Peer: %s&lt;/span&gt;&lt;span style="color:#6a5acd;"&gt;\n&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"&lt;/span&gt;, inet_ntoa(descr.sin_addr));&lt;br /&gt;   &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (send(newsock, &lt;span style="color:#ff00ff;"&gt;"Hello from server"&lt;/span&gt;,&lt;br /&gt;    strlen(&lt;span style="color:#ff00ff;"&gt;"Hello from server"&lt;/span&gt;), &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;) == SOCKET_ERROR)&lt;br /&gt;    perror(&lt;span style="color:#ff00ff;"&gt;"Send operation failed"&lt;/span&gt;);&lt;br /&gt;  }&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;   perror(&lt;span style="color:#ff00ff;"&gt;"Can't accept connection"&lt;/span&gt;);&lt;br /&gt;  closesocket(sock);&lt;br /&gt;  closesocket(newsock);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;p align="justify"&gt; Мы постарались сделать код переносимым (по крайней мере между Windows и Linux. Для того, чтобы собрать данный пример под Windows мы должны указать компоновщику на библиотеку wsock32.lib). Как видно из предыдущего примера, "открытие порта на прослушку" -- операция достаточно простая: необходимо создать сокет (&lt;b&gt;socket(2)&lt;/b&gt;), заполнить и связать с сокетом структуру sockaddr_in (&lt;b&gt;bind(2)&lt;/b&gt;), после чего вызвать &lt;b&gt;listen(2)&lt;/b&gt;. В данном примере сервер начинает "слушать" по порту 8100. По приходу запроса отрабатывает функция &lt;b&gt;accept(2)&lt;/b&gt;, которая создает новый сокет, оставляя "старый" готовым к приему нового соединения. Новый сокет готов к приему-передаче данных, мы посылаем приветствие и закрываем оба сокета (тонко, правда? ;).  &lt;/p&gt; &lt;p align="justify"&gt; Обратим внимание на то, что accept является блокирующим вызовом, т. е. поток исполнения не проходит ниже этой строчки, пока не принято входящее соединение, и наша программа не может в это время делать ничего, кроме как "болтаться в accept'е". Кроме того, данный пример написан так, что принимает только одно соединение. Мы могли бы не закрывать первый сокет, а снова вызвать с ним accept для приема второго соединения, однако проблема блокировки вызовом accept все равно не была бы решена (несколько забегая вперед, заметим, что и функция приема данных из сокета &lt;b&gt;recv(2)&lt;/b&gt; также является блокирующей). Часто данную проблему снимают организуя многопоточное (multithreaded) приложение, в котором каждое соединение обрабатывается в собственном потоке или, под UNIX, используют вызов разделения процесса &lt;b&gt;fork(2)&lt;/b&gt; (кстати, ежели кто не понял, зачем двойки в скобках, -- это означает вторую секцию руководства). Добиться переносимости такого кода -- задача совсем нетривиальная, мы же пока не хотим привязываться к платформе, насколько это возможно, и потому воспользуемся вызовом &lt;b&gt;select(2)&lt;/b&gt;, который присутствует и в UNIX и в Windows. Функция select ожидает изменения статуса набора дескрипторов (в Windows поддерживаются только сокеты, а в UNIX -- файловые дескрипторы, коими сокеты и являются). Кроме того, нам потребуется перевести наши сокеты в неблокирующее состояние (non-blocking mode). &lt;/p&gt; &lt;p align="justify"&gt; Все вышесказанное отражено в следующем примере, состоящем из трех файлов (по прежнему, в Windows следует подключать библиотеку wsock32.lib):  &lt;/p&gt; &lt;b&gt;smsce.h&lt;/b&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#ifndef _SMSCE_H_&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;winsock2.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define socklen_t &lt;/span&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"unisock.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;fcntl.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/time.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define _SMSCE_H_&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _SMSCE_H_ */&lt;/span&gt; &lt;/pre&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;b&gt;smsce.cpp&lt;/b&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;iostream&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;list&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;stdio.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"smsce.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SERVER_PORT &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;8200&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define RECVBUFSIZ &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;4096&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;bool&lt;/span&gt;&lt;/b&gt; process_data(SOCKET sock)&lt;br /&gt;{&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; buf[RECVBUFSIZ];&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; received;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((received = recv(sock, buf, RECVBUFSIZ, &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;)) != SOCKET_ERROR) {&lt;br /&gt;  buf[received] = &lt;span style="color:#6a5acd;"&gt;'\0'&lt;/span&gt;;&lt;br /&gt;  cout &lt;&lt; (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; *)buf &lt;&lt; flush;&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;true&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;void&lt;/span&gt;&lt;/b&gt; shutdown_socket(SOCKET *s)&lt;br /&gt;{&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (*s != INVALID_SOCKET) {&lt;br /&gt;  shutdown   (*s, SD_BOTH);&lt;br /&gt;  closesocket(*s);&lt;br /&gt;  *s = INVALID_SOCKET;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; main(&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; argc, &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; **argv)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt; WSADATA WSAData;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;/* Startup socket library */&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (WSAStartup(MAKEWORD(&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;,&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;), &amp;WSAData) != &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;)&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't initialize socket library"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// list for server clients&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; list&lt;socket&gt; CL;&lt;br /&gt; CL clients;&lt;br /&gt; CL::iterator ii;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt; struct timeval&lt;/span&gt;&lt;/b&gt; tv;&lt;br /&gt; fd_set readfds;&lt;br /&gt; fd_set exfds;&lt;br /&gt; &lt;br /&gt; SOCKET ssocket;&lt;br /&gt; SOCKET accepted;&lt;br /&gt; SOCKET maxfd;&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;bool&lt;/span&gt;&lt;/b&gt; true_value = &lt;span style="color:#ff00ff;"&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt; struct sockaddr_in&lt;/span&gt;&lt;/b&gt; addr;&lt;br /&gt; addr.sin_family = AF_INET;&lt;br /&gt; addr.sin_port = htons(SERVER_PORT);&lt;br /&gt; addr.sin_addr.s_addr = htonl(INADDR_ANY);&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Creating the socket and setting it's optioins&lt;/span&gt;&lt;br /&gt; ssocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (ssocket == INVALID_SOCKET) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't create socket"&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; setsockopt(ssocket, SOL_SOCKET, SO_REUSEADDR, (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; *) &amp;true_value, &lt;b&gt;&lt;span style="color:#804040;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; (true_value));&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt; ioctlsocket(ssocket, FIONBIO, (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;unsigned&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;long&lt;/span&gt;&lt;/b&gt; *)&amp;true_value); &lt;span style="color:#0000ff;"&gt;// Set to non-block mode&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#else&lt;/span&gt;&lt;br /&gt; fcntl(ssocket, F_SETFL, O_NONBLOCK); &lt;span style="color:#0000ff;"&gt;// Set to non-block mode&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;// _WIN32&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Binding&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (bind(ssocket, (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr *) &amp;addr, &lt;b&gt;&lt;span style="color:#804040;"&gt;sizeof&lt;/span&gt;&lt;/b&gt; (addr)) == SOCKET_ERROR) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't start listening"&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// sockaddr for client socket&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt; struct sockaddr_in&lt;/span&gt;&lt;/b&gt; ca;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; cal = &lt;b&gt;&lt;span style="color:#804040;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;(ca);&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Start listening&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (listen (ssocket, SOMAXCONN) == SOCKET_ERROR) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't start listening"&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;while&lt;/span&gt;&lt;/b&gt; (&lt;span style="color:#ff00ff;"&gt;true&lt;/span&gt;) {&lt;br /&gt;  &lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;// Trying to accept connection (non-blocking mode)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;// Please note that if no incoming connection presents at non-blocking&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;// socket accept returns with some error like EAGAIN or EWOULDBLOCK&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((accepted = accept(ssocket, (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr *) &amp;ca, (socklen_t *)&amp;amp;cal)) != SOCKET_ERROR)&lt;br /&gt;   clients.push_back(accepted);&lt;br /&gt;  &lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;// Preparing descriptor sets&lt;/span&gt;&lt;br /&gt;  FD_ZERO(&amp;readfds);&lt;br /&gt;  FD_ZERO(&amp;exfds);&lt;br /&gt;  FD_SET(ssocket, &amp;exfds);&lt;br /&gt;  tv.tv_sec = &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt;  tv.tv_usec = &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;  maxfd = ssocket;&lt;br /&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;for&lt;/span&gt;&lt;/b&gt; (ii = clients.begin(); ii != clients.end(); ++ii) {&lt;br /&gt;   FD_SET((SOCKET )*ii, &amp;readfds);&lt;br /&gt;   FD_SET((SOCKET )*ii, &amp;exfds);&lt;br /&gt;   maxfd = max(maxfd, (SOCKET )*ii);&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;// select failing breaks the work&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (select(maxfd + &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;, &amp;readfds, NULL, &amp;amp;exfds, &amp;tv) == -&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;) &lt;b&gt;&lt;span style="color:#804040;"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;  &lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;// On exception in server socket also breaks immediately&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt;(FD_ISSET(ssocket, &amp;exfds)) &lt;b&gt;&lt;span style="color:#804040;"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt; &lt;br /&gt;  &lt;span style="color:#0000ff;"&gt;// Test events on client sockets&lt;/span&gt;&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;for&lt;/span&gt;&lt;/b&gt; (ii = clients.begin(); ii != clients.end(); ++ii) {&lt;br /&gt;   &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (FD_ISSET(*ii, &amp;exfds)) {&lt;br /&gt;    &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (*ii != INVALID_SOCKET) shutdown_socket(&amp;amp;(*ii));&lt;br /&gt;    &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((ii = clients.erase(ii)) == clients.end()) &lt;b&gt;&lt;span style="color:#804040;"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (FD_ISSET(*ii, &amp;readfds) &amp;amp;&amp; !process_data(*ii)) {&lt;br /&gt;    &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (*ii != INVALID_SOCKET) shutdown_socket(&amp;amp;(*ii));&lt;br /&gt;    &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((ii = clients.erase(ii)) == clients.end()) &lt;b&gt;&lt;span style="color:#804040;"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="color:#0000ff;"&gt;// Send data&lt;/span&gt;&lt;br /&gt;   &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (*ii != INVALID_SOCKET)&lt;br /&gt;    &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (send(*ii, &lt;span style="color:#ff00ff;"&gt;"Connection is established "&lt;/span&gt;,&lt;br /&gt;     strlen(&lt;span style="color:#ff00ff;"&gt;"Connection is established "&lt;/span&gt;), &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;) == SOCKET_ERROR)&lt;br /&gt;     &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((ii = clients.erase(ii)) == clients.end()) &lt;b&gt;&lt;span style="color:#804040;"&gt;break&lt;/span&gt;&lt;/b&gt;;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;for&lt;/span&gt;&lt;/b&gt; (ii = clients.begin(); ii != clients.end(); ++ii)&lt;br /&gt;   &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (*ii != INVALID_SOCKET) shutdown_socket(&amp;(*ii));&lt;br /&gt; &lt;br /&gt; shutdown_socket(&amp;ssocket);&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;b&gt;unisock.h&lt;/b&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#ifndef _UNISOCK_H_&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifndef _WIN32&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/types.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/socket.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;arpa/inet.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;netinet/in.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;netdb.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;unistd.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; SOCKET;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr SOCKADDR;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr_in SOCKADDR_IN;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SOCKET_ERROR -&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define INVALID_SOCKET -&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SD_RECEIVE &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SD_SEND &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0x1&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SD_BOTH &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0x2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define closesocket(s) close(s)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _WIN32 */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define _UNISOCK_H_&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _UNISOCK_H_ */&lt;/span&gt; &lt;/pre&gt; &lt;hr noshade="noshade"  style="font-size:78%;"&gt; &lt;p align="justify"&gt; В этом примере мы получили возможность обрабатывать несколько входящих соединений (хотя, если в канале нет данных от клиента, то select ждет 1 секунду; таким образом, мы не можем отправлять данные клиентам чаще,  но этого нам в дальнейшем будет достаточно) и не останавливаться на блокирующих вызовах. Интервал в 1 секунду выбран произвольно. Мы можем испытать наш сервер, набрав команду: &lt;/p&gt;&lt;pre&gt;telnet localhost 8200&lt;/pre&gt; Остановить выполнение сервера можно с помощью Ctrl-C :). Разумеется, в приведенном примере еще многое можно "подрихтовать" (например, можно проверять, доступен ли сокет для записи перед вызовом &lt;b&gt;send&lt;/b&gt; или проверять код ошибки &lt;b&gt;accept&lt;/b&gt;), но мы объявим серверную часть готовой и перейдем, наконец, к клиенту.  &lt;h3&gt;2.3 Клиент.&lt;/h3&gt; &lt;p align="justify"&gt; Программирование клиентских сокетов несколько проще, чем серверных. На клиенте достаточно создать сокет с помощью &lt;b&gt;socket(2)&lt;/b&gt; и соединить с удаленной стороной с помощью &lt;b&gt;connect(2)&lt;/b&gt;. После этого сокет готов к приему и передаче данных. Просто приведем пример. &lt;/p&gt; &lt;b&gt;sockclient.h&lt;/b&gt; &lt;hr noshade="noshade" size="1"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#ifndef _SMSCE_H_&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;winsock2.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define socklen_t &lt;/span&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"unisock.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;fcntl.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/time.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define Sleep(x) usleep((&lt;/span&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;unsigned&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;long&lt;/span&gt;&lt;/b&gt;&lt;span style="color:#a020f0;"&gt; )(x * &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1000&lt;/span&gt;&lt;span style="color:#a020f0;"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define _SMSCE_H_&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _SMSCE_H_ */&lt;/span&gt; &lt;/pre&gt; &lt;hr noshade="noshade" size="1"&gt; &lt;b&gt;sockclient.cpp&lt;/b&gt; &lt;hr noshade="noshade" size="1"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;iostream&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;stdio.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"sockclient.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SERVER_ADDR &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;"127.0.0.1"&lt;/span&gt;&lt;span style="color:#a020f0;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;// localhost&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SERVER_PORT &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;8200&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define RECVBUFSIZ &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;4096&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color:#008080;"&gt;main&lt;/span&gt;(&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; argc, &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; **argv)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifdef _WIN32&lt;/span&gt;&lt;br /&gt; WSADATA WSAData;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Startup socket library&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (WSAStartup(MAKEWORD(&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;,&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;), &amp;WSAData) != &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;)&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't initialize socket library"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; SOCKET soc;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt; struct sockaddr_in&lt;/span&gt;&lt;/b&gt; addr;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;static&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; buf[RECVBUFSIZ];&lt;br /&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; received;&lt;br /&gt;&lt;br /&gt; addr.sin_family = AF_INET;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Server address&lt;/span&gt;&lt;br /&gt; addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Server port&lt;/span&gt;&lt;br /&gt; addr.sin_port = htons(SERVER_PORT);&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Creating socket&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((soc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't create socket"&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Perform connection&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (connect(soc, (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr *) &amp;addr, &lt;b&gt;&lt;span style="color:#804040;"&gt;sizeof&lt;/span&gt;&lt;/b&gt;(addr)) == SOCKET_ERROR) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Can't connect"&lt;/span&gt;);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; cout &lt;&lt; &lt;span style="color:#ff00ff;"&gt;"Connection is established"&lt;/span&gt; &lt;&lt; endl;&lt;br /&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Try to receive greeting.&lt;/span&gt;&lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Note thar receive is the blocking call&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; ((received = recv(soc, buf, RECVBUFSIZ, &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;)) != SOCKET_ERROR) {&lt;br /&gt;  buf[received] = &lt;span style="color:#6a5acd;"&gt;'\0'&lt;/span&gt;;&lt;br /&gt;  cout &lt;&lt; (&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;char&lt;/span&gt;&lt;/b&gt; *)buf &lt;&lt; flush;&lt;br /&gt; }&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;else&lt;/span&gt;&lt;/b&gt; {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Receive operation failed"&lt;/span&gt;);&lt;br /&gt;  closesocket(soc);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;// Try to send greeting&lt;/span&gt;&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (send(soc, &lt;span style="color:#ff00ff;"&gt;"Hello from client "&lt;/span&gt;,&lt;br /&gt;  strlen(&lt;span style="color:#ff00ff;"&gt;"Connection is established "&lt;/span&gt;), &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;) == SOCKET_ERROR) {&lt;br /&gt;  perror(&lt;span style="color:#ff00ff;"&gt;"Hello from client "&lt;/span&gt;);&lt;br /&gt;  closesocket(soc);&lt;br /&gt;  &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; closesocket(soc);&lt;br /&gt; &lt;b&gt;&lt;span style="color:#804040;"&gt;return&lt;/span&gt;&lt;/b&gt; &lt;span style="color:#ff00ff;"&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; &lt;hr noshade="noshade" size="1"&gt; &lt;b&gt;unisock.h&lt;/b&gt; остался без изменений: &lt;hr noshade="noshade" size="1"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;#ifndef _UNISOCK_H_&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#ifndef _WIN32&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/types.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;sys/socket.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;arpa/inet.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;netinet/in.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;netdb.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#include &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;&lt;unistd.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;int&lt;/span&gt;&lt;/b&gt; SOCKET;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr SOCKADDR;&lt;br /&gt;&lt;b&gt;&lt;span style="color:#2e8b57;"&gt;typedef&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color:#2e8b57;"&gt;struct&lt;/span&gt;&lt;/b&gt; sockaddr_in SOCKADDR_IN;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SOCKET_ERROR -&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define INVALID_SOCKET -&lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SD_RECEIVE &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0x0&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SD_SEND &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0x1&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define SD_BOTH &lt;/span&gt;&lt;span style="color:#ff00ff;"&gt;0x2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define closesocket(s) close(s)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _WIN32 */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#define _UNISOCK_H_&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;#endif &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/* _UNISOCK_H_ */&lt;/span&gt; &lt;/pre&gt; &lt;hr noshade="noshade" size="1"&gt; &lt;p align="justify"&gt; В этом примере мы устанавливаем соединение с нашим сервером, дожидаемся приветствия, посылаем ответное и закрываем соединение. Напомним, что &lt;b&gt;recv(2)&lt;/b&gt; является блокирующим вызовом, что нас, вообще говоря, не устраивает. Тем не менее, мы снова можем перевести наш сокет в неблокирующее состояние и воспользоваться &lt;b&gt;select&lt;/b&gt;. Мы так и поступим в дальнейшем, а этот пример просто показывает технику написания простейшего клиента, и мы с удовольствием обнаруживаем, что это не слишком сложно. В завершение обратим внимание на вызовы &lt;b&gt;inet_addr(3)&lt;/b&gt; и &lt;b&gt;htons(3)&lt;/b&gt;. Первая функция дает &lt;b&gt;IP-адрес&lt;/b&gt; по символьному его представлению, а вторая переводит &lt;i&gt;short int&lt;/i&gt; в целое с порядком байтов, принятых в сети. Часто этот порядок совпадает с порядком байтов в машинном представлении, но может и не совпадать (имеется ввиду т. н. LSB и FSB представления). Впрочем, это уже тонкости, о которых можно почитать и в другом месте :). И наконец, можно на досуге взглянуть на функцию &lt;b&gt;gethostbyname(3)&lt;/b&gt;, которая выполняет т. н. разрешение (resolving) по имени хоста. Используя ее, мы могли бы обратиться к нашему серверу не по IP-адресу, а по его имени ("localhost"). &lt;/p&gt; &lt;h2&gt;Заключение.&lt;/h2&gt; &lt;p align="justify"&gt; Итак, в данной статье мы выяснили, как обращаться с сокетами. Те, кто уже имел с ними дело (и набрался терпения дочитать до этого места), наверное обратили внимание на то, что мы использовали "классическую" Берклиевскую реализацию. Она хороша тем, что в большинстве случаев переносима между платформами, однако нам бы не хотелось подталкивать разработчиков к использованию именно такого подхода, тем более, что, как мы в дальнейшем увидим, для работы с SMS-протоколами  это совсем необязательно, ибо они абстрагированы от деталей установки соединения. Например, те, кто программирует под Windows, могут воспользоваться функциями из семейства WSA* (если, конечно, не уснут, читая их перечень :), а программисты, привыкшие работать с MFC, возможно найдут полезным класс &lt;b&gt;CSocket&lt;/b&gt; (правда, если Вы собираетесь использовать его в мультипоточном приложении с &lt;b&gt;CWinThread&lt;/b&gt;, не забудьте включить заклинание: &lt;/p&gt;&lt;hr noshade="noshade" size="1"&gt; &lt;pre&gt;&lt;span style="color:#a020f0;"&gt;   #ifndef _AFXDLL&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;   #define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;   #define _afxSockThreadState AfxGetModuleThreadState()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;&lt;br /&gt;     &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (pState-&gt;m_pmapSocketHandle == NULL)&lt;br /&gt;        pState-&gt;m_pmapSocketHandle = &lt;b&gt;&lt;span style="color:#804040;"&gt;new&lt;/span&gt;&lt;/b&gt; CMapPtrToPtr;&lt;br /&gt;     &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (pState-&gt;m_pmapDeadSockets == NULL)&lt;br /&gt;        pState-&gt;m_pmapDeadSockets = &lt;b&gt;&lt;span style="color:#804040;"&gt;new&lt;/span&gt;&lt;/b&gt; CMapPtrToPtr;&lt;br /&gt;     &lt;b&gt;&lt;span style="color:#804040;"&gt;if&lt;/span&gt;&lt;/b&gt; (pState-&gt;m_plistSocketNotifications == NULL)&lt;br /&gt;        pState-&gt;m_plistSocketNotifications = &lt;b&gt;&lt;span style="color:#804040;"&gt;new&lt;/span&gt;&lt;/b&gt; CPtrList;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#a020f0;"&gt;   #endif&lt;/span&gt; &lt;/pre&gt; &lt;hr noshade="noshade" size="1"&gt; в код thread'а &lt;b&gt;до&lt;/b&gt; самой первой сокетной операции; возможно, это сэкономит Вам выходные ;). И, в конце концов, Вы можете воспользоваться компонентами (Привет, Михаил! ;), которых достаточно много и которые достаточно "бросить" на форму, особенно это касается поклонников продуктов от &lt;i&gt;Borland&lt;/i&gt;.  &lt;p align="justify"&gt; Мы же на этом закончим обсуждение вопроса, еще раз напомнив о предложении внимательно его изучить, а то что-то мы увлеклись сокетами; пора переходить к содержательной части дела. В следующей статье мы попробуем построить наше первое "настоящее" &lt;b&gt;SMS-приложение&lt;/b&gt; и добавим функциональности нашему эмулятору. Оставайтесь с нами! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-7887413710283937937?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/7887413710283937937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=7887413710283937937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/7887413710283937937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/7887413710283937937'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/smsc.html' title='Связь с SMSC'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1010438963955161789.post-7190887586035300611</id><published>2007-07-08T22:10:00.000-07:00</published><updated>2007-07-08T22:26:18.856-07:00</updated><title type='text'>SMS в двух словах</title><content type='html'>&lt;span style="color: rgb(61, 79, 154);"&gt;&lt;h1&gt;SMS в двух словах&lt;/h1&gt; &lt;/span&gt; &lt;hr /&gt;  &lt;h2&gt;От авторов.&lt;/h2&gt; &lt;p&gt; Этой статьей мы открываем цикл, посвещенный сервису  SMS, набирающему  сейчас все большую популярность. Основной причиной, побудившей нас взяться  за их написание, явилась необходимость просуммировать «для себя» опыт  общения с различными SMS протоколами, накопленный при разработке  различных же приложений. В процессе написания небольшие заметки «на  полях», стали принимать вид достаточно развернутых статей, которые хотелось  бы систематизировать, для того, чтобы они пригодились и еще кому-то. Таким  образом, на данные статьи предлагается смотреть, как на mini-howto, которое  позволит сориентироваться изучающему данный вопрос. Основной трудностью, с которой мы столкнулись «на старте» стала, как ни  странно, труднодоступность простой для понимания информации по данному  вопросу. Т. е. не то чтобы ее не было, а ее слишком много и разного качества:  нам не попадалось документа, который внятно бы, step-by-step, показывал, как  например, написать приложение с  возможностью посылки и приема SMS.  Пытаемся восполнить этот пробел, не претендуя на всеохватность изложения. &lt;/p&gt; &lt;h2&gt;SMS Basics&lt;/h2&gt; &lt;h3&gt;2.1 Что такое SMS?&lt;/h3&gt; &lt;p&gt; SMS (Short Messages Service) — услуга, предоставляемая операторами  цифровых стандартов мобильной связи (GSM, CDMA, DAMPS), заключающаяся в  отправке коротких текстовых (и не только) сообщений на мобильный телефон,  называемый также Mobile Terminal (MT) или Mobile Station (MS).  В силу некоторой  специфики, данный сервис не приобрел в России такой же популярности, как на  западе, однако, постепенно начинает ее завоевывать. Причина «западной»  популярности сервиса проста: его дешевизна по сравнению с голосовыми  пререговорами, а также то, что обмен короткими сообщениями хорошо поддается  автоматизации. Вообще, с точки зрения SMS, сотовый телефон можно  рассматривать, как двусторонний пейджер, с одним большим преимуществом:  сообщение будет обязательно доставлено (как говорят «доведено»), вне  зависимости, находится ли абонент в зоне приема в момент его отправки (а  точнее будут предприниматься попытки его доведения до тех пор, пока не  истечет его «срок годности», validity period). А длины в 160 символов обычно  достаточно, чтобы сказать что-нибудь типа «Я выезжаю» или «Свяжись со мной  по телефону 02». &lt;/p&gt; &lt;h3&gt;2.2 Причем здесь программирование?&lt;/h3&gt; &lt;p&gt; Резонный вопрос, ведь написание софта для «мобильников» не самая  распространенная область программистской деятельности. Но вся штука в том,  что большинство (а скорее всего — все) операторов предоставляют возможность  обмена короткими сообщениями между MT и внешними, по отношению к  мобильной сети (PLMN – Private Local Mobile Network) устройствами, т. н. ESME  (External Short Messages Entity), в качестве которого может выступать любое ПО,  поддерживающее определенный протокол. Делается это с помощью определенных устройств, называемых SMSC (Short  Messages Service Center), одним «концом» подключенных к PLMN, а другим — в  сеть общего назначения, например TCP/IP (Internet). Вот как это выглядит: &lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vrrdow9KgWQ/RpHE7hw-kUI/AAAAAAAAAAw/26vvuJlx8xg/s1600-h/image001.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_vrrdow9KgWQ/RpHE7hw-kUI/AAAAAAAAAAw/26vvuJlx8xg/s320/image001.gif" alt="" id="BLOGGER_PHOTO_ID_5085061981233123650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; Не обращайте пока внимание на аббревиатуру SMPP (к ней мы вернемся чуть  позже), а вместо нее читайте «некоторый протокол для связи с SMSC». Хорошим примером ESME является последняя версия «аси». Что? Уже кидали  «мессаги» подружке на трубку? Так не пора ли теперь разобраться, как все это  устроено?&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;h3&gt;2.3 Протоколы SMS.&lt;/h3&gt; &lt;p&gt; Вот тут мы затронули достаточно скользкую тему. Дело в том, что хоть они и  называются «протоколами», таковыми на деле не являются: это отраслевые  рекомендации разработчиков SMSC, которых довольно много. И если в части  передачи сообщений по мобильным сетям особых разногласий не наблюдается:  работает «настоящий» протокол SS7 (Signaling System Seven, тема для  отдельного большого разговора), то в части доведения сообщений от ESME до  SMSC каждый разработчик придумывает свой «протокол»; единственное  требование к разработчику: публикация спецификаций. Упомянем самые  популярные протоколы, кратко перечислив их отличительные черты. &lt;/p&gt; &lt;h4&gt;2.3.1 SMPP&lt;/h4&gt; &lt;p&gt; SMPP (Short Messages Peer-to-Peer) является, видимо, самым распространенным  протоколом и разрабатывается SMPP Developers Forum (ничего общего с Open  Source, просто организация такая). Один из, на наш взгляд, самых удобных  протоколов, много возможностей, достаточно хорошо проработан. SMPP  предлагает бинарную кодировку пакетов (впрочем, к этому мы еще вернемся).  Используется многими операторами, в т. ч. British Telecom. &lt;/p&gt;  &lt;h4&gt;2.3.2 EMI&lt;/h4&gt; &lt;p&gt; Протокол EMI (External Machine Interface) продвигает ETSI (кажется  расшифровывается как European Telecommunication Standards Institute).  Предлагает текстовую кодировку пакетов, также имеет развернутые  возможности, но, на наш взгляд, неэстетичен :). В различных диалектах   используется многими провайдерами, точно — Swisscom'ом, вроде как —  NWGSM'ом. &lt;/p&gt;  &lt;h4&gt;2.3.3 SMS2000 aka SEMA&lt;/h4&gt; &lt;p&gt; Тяжелый протокол, разрабатывается SEMA Group. Однако, возможности  большие. Предлагает на выбор бинарную, шестнадцатиричную и IA5 кодировку  пакетов. Используется Vodafone. Оставляет неприятные воспоминания. &lt;/p&gt;  &lt;h4&gt;2.3.4 CIMD&lt;/h4&gt; &lt;p&gt; Тоже протокол... Напоминает EMI... :) &lt;/p&gt;  &lt;h3&gt;2.4 Общий знаменатель.&lt;/h3&gt; &lt;p&gt; Несмотря на такое изобилие, суть работы всех протоколов сводится, что  очевидно, к нескольким простым функциям (смотрим со стороны ESME): &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Организация соединения с SMSC&lt;/li&gt;&lt;li&gt;Отправка сообщений в PLMN&lt;/li&gt;&lt;li&gt;Прием сообщений из PLMN&lt;/li&gt;&lt;li&gt;Прием подтверждений доставки (delivery receipts)&lt;/li&gt;&lt;/ul&gt;  &lt;h4&gt;2.4.1 Установка связи&lt;/h4&gt; &lt;p&gt; Фактически, порядок работы следующий: соединяемся с SMSC и, поверх  сетевого протокола, начинаем слать пакеты (называемые часто «командами» или  «операциями») в формате выбранного нами SMS-протокола. Для простоты,  будем опираться на самый распространенный случай, связь по TCP/IP, хотя  многие модели SMSC поддерживают связь через, например, X.25 или PSTNA, а  SMS-протоколы абстрагированы, насколько возможно, от деталей установки  соединения. &lt;/p&gt; &lt;h4&gt;2.4.2 Транзакционный механизм&lt;/h4&gt; &lt;p&gt; Для того, чтобы предоставить гарантию доставки, все SMS-протоколы  используют транзакционный механизм, а проще говоря, подтверждения для  каждой, испущенной (invoke) любой из сторон, команды. Получив команду,  участник обмена (SMSC или ESME) обязан ответить на нее специальным  пакетом, называемым в разных протоколах по-разному: response, result или ACK  (от acknowledgement). Мы будем называть такие пакеты ACK (опять же, чтобы не  путаться в терминах). Различают два типа ACK'ов: собственно ACK —  положительный ответ и NACK — отрицательный (negative) ответ. NACK кроме  указания на тот факт, что приключилась ошибка, передает еще и ее код,  прописанный в спецификации протокола. Вот как это выглядит в графике:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_vrrdow9KgWQ/RpHGHRw-kVI/AAAAAAAAAA4/cbA_RdBzrtI/s1600-h/image003.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp2.blogger.com/_vrrdow9KgWQ/RpHGHRw-kVI/AAAAAAAAAA4/cbA_RdBzrtI/s320/image003.gif" alt="" id="BLOGGER_PHOTO_ID_5085063282608214354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;И в обратную сторону:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_vrrdow9KgWQ/RpHGkhw-kWI/AAAAAAAAABA/ZTyrXU_ezp8/s1600-h/image005.gif"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_vrrdow9KgWQ/RpHGkhw-kWI/AAAAAAAAABA/ZTyrXU_ezp8/s320/image005.gif" alt="" id="BLOGGER_PHOTO_ID_5085063785119388002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; Каждая транзакция нумеруется иницирующей стороной, принимающая сторона  использует переданный ей номер в ACK'е. Правила нумерации обычно  свободные, указывается только диапазон допустимых номеров, для каждого  протокола он, естественно, разный. Однако открытие двух транзакций с одним  номером в рамках одной сессии, как правило, недопустимо. В случае неприхода  ACK'а за определенное время (настраиваемое как на SMSC, так и на ESME)  команда считается неуспешной и, в зависимости от логики работы, повторяется.  Если противоположная сторона продолжает «молчать» в ответ на испущенные  команды, соединение обычно разрывается. &lt;/p&gt; &lt;h2&gt;Итоги&lt;/h2&gt; &lt;p&gt; Теперь мы знаем о предмете достаточно, чтобы сформулировать задачи  требующие решения для написания ESME клиента. Необходимо: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Иметь возможность установки соединения по TCP/IP с сервис-центром.&lt;/li&gt;&lt;li&gt;Уметь формировать пакеты в формате выбранного нами протокола. (В  скобках заметим, что, как правило, выбор протокола определяется не  пристрастиями программиста, а жестко закреплен предоставляемым  сервисом.)&lt;/li&gt;&lt;li&gt;Уметь «разбирать» (parse) пакеты в формате выбранного протокола.&lt;/li&gt;&lt;/ol&gt;  Мы здесь не упомянули одну важную «административную» задачу — подписание  договора на обслуживание с поставщиком услуг сотовой связи. Однако, решение  таких вопросов обычно лежит вне рамок программистской компетенции.  &lt;p&gt; В дальнейшем (в следующих статьях) мы покажем, как написать простое SMS- приложение, для отладки которого воспользуемся написанным нами же  примитивным эмулятором сервис-центра. Оставайтесь с нами. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1010438963955161789-7190887586035300611?l=smsinside.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smsinside.blogspot.com/feeds/7190887586035300611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1010438963955161789&amp;postID=7190887586035300611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/7190887586035300611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1010438963955161789/posts/default/7190887586035300611'/><link rel='alternate' type='text/html' href='http://smsinside.blogspot.com/2007/07/sms.html' title='SMS в двух словах'/><author><name>SGerr</name><uri>http://www.blogger.com/profile/11341009775313653292</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_vrrdow9KgWQ/RpHE7hw-kUI/AAAAAAAAAAw/26vvuJlx8xg/s72-c/image001.gif' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
