. Дополнительные события порождаются действиями пользователей системы. Например, пользователь или администратор может внести изменения в конфигурацию системы, отсоединить от компьютера шнур питания или выключить систему. Каждое из этих действий порождает одно или несколько событий. Возможность перехвата и аудита этих событий открывает значительные перспективы с точки зрения управления. Например, можно написать сценарий, который уведомлял бы вас о том, что кто-то внес в систему определенные изменения. Путем отправки соответствующих запросов на языке WQL (Windows Management Instrumentation (WMI) Query Language) можно организовать перехват событий.

Отправка запросов

Отправить представленные здесь запросы WQL можно с помощью любого приложения, способного принимать события WMI. Разработчики приложений Microsoft .NET могут воспользоваться для этого классом System.Management, доступным через Windows .NET Framework. Администраторы, имеющие некоторые познания в области сценариев, могут использовать несложные сценарии WMI. Если у вас нет навыков программирования, можно обратиться к утилите wbemtest.exe, которая имеется в любой WMI-совместимой версии Windows (Windows NT 4.0 и более поздних). Если же в Windows-инфраструктуре вашей компании уже развернута какая-либо корпоративная система управления предприятием, например, Microsoft Operations Manager (MOM) или HP OpenView, то с помощью этих программных инструментов также можно перехватывать события WMI.

В данной статье описывается GenericEventAsyncConsumer.wsf – сценарий, который я написал специально для отправки запросов WQL на события (см. Листинг 1). Для отправки запроса WQL на события используется следующая команда:

GenericEventAsyncConsumer.wsf
  "WQL event query"
  [/NameSpace:Value]
  [/Machine:Value]
  [/User:Value]
  [/Password:Value]

где – WQL event query строка, представляющая собой текст запроса WQL. Остальные параметры являются необязательными. Ключ /NameSpace определяет пространство имен WMI, где осуществляется отправка запроса. По умолчанию сценарий подключается к пространству имен rootcimv2. Ключом /Machine определяется система, к которой необходимо подключиться. По умолчанию сценарий подключается к локальной машине. При подключении к удаленной системе требуется указать ключи /Machine, /User (имя пользователя) и /Password (пароль). Когда отправка запроса выполняется локально, административных прав не требуется, однако в случае обращения к удаленному компьютеру система безопасности WMI по умолчанию требует административных прав для извлечения информации из WMI.

Если вы хотите использовать для обработки событий не сценарий, а утилиту Wbemtest, выберите в меню Start системы Windows Server 2003 или Windows XP команду Run, после чего введите в строке команды:

wbemtest.exe

В появившемся окне нажмите кнопку "Подключить"(Connect). В открывшемся диалоговом окне (см. Рисунок 1) укажите пространство имен, к которому хотите подключиться. Если нужно подключиться к локальной машине, тогда следует просто изменить имя установленного по умолчанию пространства имен с rootdefault на rootcimv2. При подключении к удаленному компьютеру в описании пути к соответствующему пространству имен следует указывать имя компьютера в формате UNC (Universal Naming Convention) в виде machinename ootcimv2, а также задавать имя и пароль соответствующего пользователя в разделе "Учетные данные"(Credentials) этого же диалогового окна. Нажмите кнопку "Подключить"(Connect). После того как Wbemtest подключится к нужному пространству имен, выберите способ вызова "Асинхронно"(Asynchronous), а затем нажмите кнопку "Запрос уведомления"(Notification Query). После этого на экране отображается окно, в котором можно вводить текст соответствующего WQL-запроса уведомлений о событиях.

Рисунок 1

Запрашиваемые события

Итак, мы выяснили, как выполнять отправку запросов на перехват системных событий; теперь, вероятно, перед вами встал вопрос о том, какие события нужно перехватывать. Служба WMI системы Windows 2003 содержит более 600 классов и 3000 свойств, поддерживаемых более 80 провайдерами. В Windows 2000 этих классов меньше и провайдеров всего 30. Очевидно, что в рамках одной статьи мы не сможем обсудить все это в полном объеме. Поэтому я остановлюсь только на следующих типовых событиях, поддерживаемых провайдерами событий WMI (специально разработанными Microsoft для обработки системных событий):

  • События системного таймера (clock events), поддерживаемые провайдером таймера (clock provider) (Windows 2003 и Windows XP).
  • События состояния электропитания (power state events), поддерживаемые провайдером управления питанием (power management provider) (Windows 2003, Windows XP, Windows 2000 и Windows NT 4.0).
  • События-уведомления о случаях выключения системы (shutdown) и завершениях сеанса (logoff), поддерживаемые провайдером выключения системы (shutdown provider) (Windows 2003 Windows XP).
  • События-уведомления об изменениях конфигурации (configuration change), поддерживаемые провайдером изменений конфигурации (configuration change provider) (Windows 2003 и Windows XP).
  • События изменения объема диска (disk volume modification), поддерживаемые провайдером изменений объема диска (volume change provider) (Windows 2003 и Windows XP).

Перехват событий системного таймера

Возможность доступа к системной информации о времени бывает полезной во многих случаях. Например, некоторая программа должна запускать другое приложение, причем это должно происходить каждый день в строго определенное время, либо выполнять некоторые операции через фиксированные интервалы времени (например, процесс очистки (cleanup), который должен запускаться раз в час). В этом случае для выполнения задач по установленному расписанию программа должна иметь возможность обращаться к системному времени.

В составе систем Windows 2003 и Windows XP имеется Win32-провайдер системного таймера (Win32 clock provider), позволяющий организовать через WMI простой доступ к информации о системном времени. Компания Microsoft реализовала данный компонент в виде провайдера экземпляров (instance provider) и провайдера событий (event provider). В качестве провайдера экземпляров он обеспечивает отображение системного времени в экземпляры WMI. Для этого провайдер использует три класса WMI, расположенных в пространстве имен rootcimv2: Win32_CurrentTime, Win32_LocalTime class и Win32_UTCTime.

Класс Win32_CurrentTime является родительским (или суперклассом) для классов Win32_LocalTime и Win32_UTCTime, таким образом, Win32_CurrentTime используется в качестве шаблона при создании двух подчиненных классов. Все три класса являются одноэлементными; это означает, что внутри каждого из них имеется только один экземпляр, доступный для системы. Данное ограничение имеет большое значение, поскольку в одной операционной системе не может существовать несколько вариантов времени. Класс Win32_LocalTime предоставляет данные о локальном времени системы. Класс Win32_UTCTime возвращает данные о мировом времени UTC (Universal Time Coordinate), что соответствует времени по Гринвичу (Greenwich Mean Time (GMT)). Более подробные сведения о классах, предоставляющих данные о времени, можно найти в документации Microsoft (http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_currenttime.asp).

Как упоминалось выше, реализация провайдера системного таймера Windows позволяет использовать его и в качестве провайдера событий, который обеспечивает доставку уведомлений о событиях в ответ на запросы WQL, взаимодействуя с классом событий __InstanceModificationEvent. Запросы WQL:

Select * From
  __InstanceModificationEvent
  Where TargetInstance ISA
  'Win32_LocalTime'

и

Select * From
  __InstanceModificationEvent
  Where TargetInstance ISA
  'Win32_UTCTime'

инициируют уведомление при каждом изменении локального времени и времени UTC. А поскольку оба экземпляра целевых объектов изменяются каждую секунду, WMI будет уведомлять подписчика (subscriber) (приложение, имеющее отправку на запрос уведомлений) каждую секунду.

Обратите внимание на то, что в этих запросах не используется условие WITHIN, хотя в принципе оно могло бы здесь применяться. Однако запросы WQL, содержащие конструкцию WITHIN, не могут использовать функциональность провайдера событий. Если в запросе WQL задано условие WITHIN, то для его выполнения производится обращение к ядру подсистемы WMI. В этом случае ядро подсистемы WMI с помощью провайдера, поддерживающего соответствующий целевой объект, запрашивает данные об изменениях состояния и ожидает окончания цикла опроса, для того чтобы отправить подписчику уведомление о выявленных изменениях. И хотя данная технология работает хорошо, это происходит медленнее, чем при использовании запросов уведомлений, поддерживаемых провайдером событий. Если вы исключите из запроса условие WITHIN, тогда данный WQL-запрос будет обрабатываться провайдером событий WMI, который и будет отправлять уведомления о произошедших изменениях. При этом провайдер событий не ждет окончания цикла опроса, поэтому уведомления будут отправляться сразу же после внесения изменений.

Рассмотренные выше запросы можно доработать, чтобы получать уведомления не каждую секунду, а каждую минуту. Результирующий запрос будет выглядеть следующим образом:

Select * From
  __InstanceModificationEvent
  Where TargetInstance ISA
  'Win32_UTCTime'
  AND TargetInstance.Second=0

Каждый раз, когда значение свойства WMI Second (секунды) становится равным 0, т.е. каждую минуту, подписчик будет получать уведомление. Данный результат можно получить для каждого из трех классов, поддерживаемых Win32-провайдером системного таймера.

Если нужно организовать получение уведомления в заданный момент времени, следует еще немного модифицировать текст запроса. Например, с помощью показанного ниже запроса:

Select * From
  __InstanceModificationEvent
  Where TargetInstance ISA
  'Win32_UTCTime'
  AND TargetInstance.Second=17
  AND TargetInstance.Minute=23
  AND TargetInstance.Hour=15
  AND TargetInstance.DayOfWeek=2
  AND TargetInstance.WeekInMonth=2
  AND TargetInstance.Quarter=2

уведомление будет генерироваться в 17:23 по времени UTC каждый вторник во вторую неделю апреля, мая и июня.

Для доступа к информации о времени WMI также поддерживает два системных класса – __IntervalTimerInstruction и __AbsoluteTimerInstruction – сведения о которых содержатся в документации Microsoft (см. http://msdn.microsoft.com/library/en-us/wmisdk/wmi/__intervaltimerinstruction.asp и http://msdn.microsoft.com/library/en-us/wmisdk/wmi/__absolutetimerinstruction.asp, соответственно). Здесь я не буду вдаваться в подробности относительно возможностей этих классов, поскольку их использование требует большего опыта работы с WMI, чем применение классов провайдера системного таймера.

Перехват событий, связанных с состоянием электропитания

Провайдер управления питанием имеется в Windows 2003, Windows XP, Windows 2000 и Windows NT 4.0. Данный компонент является провайдером событий для класса событий Win32_PowerManagementEvent пространства имен rootcimv2. Провайдер управления питанием инициирует отправку уведомлений каждому подписчику, зарегистрированному на получение уведомлений о событиях данного типа. Класс Win32_PowerManagementEvent описывается в следующем документе: http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_powermanagementevent.asp. Провайдер управления питанием не является провайдером экземпляров, поэтому он не предоставляет информацию об устройствах электропитания как таковых. Для того чтобы собирать данные об этих устройствах, нужно обращаться к другим классам, таким как Win32_Battery, Win32_CurrentProbe, Win32_PortableBattery и Win32_UninterruptiblePowerSupply.

В строке, обозначенной на Рисунке 2 меткой A, приведен запрос WQL, предназначенный для перехвата всех событий, происходящих в системе электропитания. Проверить, как работает данный запрос, проще всего, запустив сценарий GenericEventAsyncConsumer.wsf или утилиту Wbemtest на переносном компьютере. Отправив запрос, переведите компьютер в режим экономии энергии (standby) или "спящий" (hibernate) режим, а затем опять включите его. Вы увидите три события (см. Рисунок 2). Каждый раз, когда в системе управления питанием что-либо происходит, сценарий принимает это событие, отображаемое в виде экземпляра класса Win32_PowerManagementEvent. Данный класс имеет свойство EventType, значение которого определяет тип события, произошедшего в системе питания (например, Entering Suspend=4 (переход в спящий режим), Resume from Suspend=7 (выход из спящего режима), Power Status Change=10 (изменение состояния питания), OEM Event=11, Resume Automatic=18 (автоматический выход из спящего состояния)).

Например, если вы выдернете шнур питания из портативного компьютера, в результате чего он перейдет на питание от аккумуляторных батарей, то система управления питанием сгенерирует событие типа 10. События данного типа могут использоваться приложениями, которые должны выполнять те или иные операции при изменении состояния питания компьютера.

Перехват событий, связанных с выключением системы

Провайдер выключения системы, как и провайдер управления питанием, поддерживает только один класс событий: Win32_ComputerShutdownEvent. Данный класс имеется только в Windows 2003 и Windows XP и размещается в пространстве имен rootcimv2. Документация по классу Win32_ComputerShutdownEvent имеется в MSDN, адрес: http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_computershutdownevent.asp.  Данный класс позволяет отображать события, происходящие в начале процесса выключения компьютера. Чтобы получать уведомления о выключении какого-либо компьютера, подписчик должен использовать на соответствующей удаленной системе WQL-запрос, показанный на рисунке 4. Понятно, что локальный мониторинг этих событий невозможен, поскольку сама локальная система в этом случае выключается.

На рисунке 4 также приведены результаты выполнения запроса, после того как вы запросили уведомление о перезагрузке или выключении системы. Первое событие относится к типу 0 (завершение сеанса (logoff)), второе имеет тип 1 (выключение (shutdown) или перезагрузка (reboot)). Отсюда видно, что провайдер выключения системы уведомляет подписчиков не только о завершении работы компьютера, но и о событиях, связанных с завершением сеансов. Как и в случае провайдера управление питанием, провайдер выключения может быть полезен для тех приложений, которые должны выполнять специфические задачи на некоторой центральной системе при завершении пользователем сеанса или выключении компьютера.

Перехват событий, связанных с изменением конфигурации

В системах Windows 2003 и Windows XP компания Microsoft реализовала в виде провайдера событий провайдер изменения конфигурации. Данный провайдер и поддерживаемый им класс событий Win32_SystemConfigurationChangeEvent индицируют изменения, происходящие в аппаратных средствах системы. Класс Win32_SystemConfigurationChangeEvent размещается в пространстве имен rootcimv2 и является единственным классом, поддерживаемым провайдером изменения конфигурации. Документацию по данному классу можно найти по адресу http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_systemconfigurationchangeevent.asp. Класс Win32_SystemConfigurationChangeEvent является подчиненным для суперкласса Win32_DeviceChangeEvent, который также является родительским и для класса Win32_VolumeChangeEvent (этот класс будет рассмотрен ниже).

Чтобы подписаться на класс событий Win32_SystemConfigurationChangeEvent. следует использовать WQL-запрос, показанный на Рисунке 3. После этого вы будете получать уведомления при добавлении, удалении или изменении конфигурации какого-либо из устройств системы. Например, если вы с помощью сценария GenericEventAsyncConsumer.wsf выполните отправку запроса, после чего подключите к системе с Windows XP или Windows 2003 какое-либо USB-устройство, то вы результат, аналогичный показанному на Рисунке 3. При этом свойство EventType будет содержать значение, показывающее тип имевшего место изменения ("Конфигурация изменена"(Configuration Changed)=1, "Подключение устройства"(Device Arrival)=2, "Удаление устройства"(Device Removal)=3, "Установка в базовый блок"(Docking)=4).

Однако с помощью свойства EventType нельзя понять, какое именно устройство породило событие. К тому же следует отметить, что если значение EventType равно 1, это может отображать практически любые действия, касающееся конфигурации системы, в том числе настройку прерываний (IRQ), последовательных (COM) портов или BIOS. Если же вам нужно получать более детальную информацию о текущем состоянии аппаратных средств системы, тогда придется разрабатывать соответствующее приложение или сценарий, опрашивающие классы Win32_Processor, Win32_PhysicalMemory, Win32_DMAChannel и Win32_IRQResource, запускать его до и после внесения изменений, после чего сравнивать полученные результаты.

Перехват событий, связанных с изменением объема диска

Провайдер изменения объема диска имеется только в Windows 2003 и Windows XP. Он поддерживает единственный класс событий Win32_VolumeChangeEvent, находящийся в пространстве имен rootcimv2 и описанный в документации Microsoft: http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_volumechangeevent.asp. Данный класс, как и класс Win32_SystemConfigurationChangeEvent, является дочерним для суперкласса Win32_DeviceChangeEvent и имеет свойство EventType. Свойство EventType определяется на уровне Win32_DeviceChangeEvent и наследуется обоими классами, both Win32_SystemConfigurationChangeEvent и Win32_VolumeChangeEvent.

Класс Win32_VolumeChangeEvent отвечает за события, происходящие при добавлении или удалении буквенных обозначений дисков, а также при монтировании и демонтировании томов на компьютере. Данный класс событий не поддерживает работу с сетевыми дисками. Запрос, используемый для получения уведомлений об изменениях буквенных обозначений, показан на рисунке 5. Здесь также приведены результаты, которые вы увидите при изменении буквы дискового тома с E на Z. Значение EventType, равное 3, указывает на то, что диск был удален, а значение EventType, равное 2, говорит о добавлении диска.

Рассмотренные в данной статье WQL-запросы уведомлений - это лишь несколько примеров из многих тысяч вариантов запросов, которые могут быть созданы с помощью WMI. Понятие управления системой включает в себя не только аспект сбора информации об управляемых компонентах, но и отслеживание значимых событий в ходе жизненного цикла компьютерной системы или приложения. Четкое понимание механизма работы оповещений WMI при возникновении тех или иных событий в системе принесет свои плоды, когда перед вами встанет вопрос о повышении степени управляемости вашей корпоративной сети Windows.


Рисунок 2

#BEGIN CALLOUT A
"Select * From Win32_PowerManagementEvent"
#END CALLOUT A
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Waiting for events...

BEGIN - OnObjectReady.
Friday, 05 December, 2003 at 00:04:23:
'Win32_PowerManagementEvent' has been triggered.
EventType = 4
OEMEventCode = (null)
SECURITY_DESCRIPTOR = (null)
TIME_CREATED = 04-12-2003 23:04:23 (20031204220423.156425+060)
END - OnObjectReady.

BEGIN - OnObjectReady.
Friday, 05 December, 2003 at 00:05:06:
'Win32_PowerManagementEvent' has been triggered.
EventType = 18
OEMEventCode = (null)
SECURITY_DESCRIPTOR = (null)
TIME_CREATED = 04-12-2003 23:05:06
(20031204220506.482851+060)
END - OnObjectReady.

BEGIN - OnObjectReady.
Friday, 05 December, 2003 at 00:05:07:
'Win32_PowerManagementEvent' has been triggered.
EventType = 7
OEMEventCode = (null)
SECURITY_DESCRIPTOR = (null)
TIME_CREATED = 04-12-2003 23:05:06
(20031204220506.603024+060)
END - OnObjectReady.


Рисунок 3

C:>GenericEventAsyncConsumer.wsf
"Select * From Win32_SystemConfigurationChangeEvent"
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Waiting for events...

BEGIN - OnObjectReady.
Friday, 05 December, 2003 at 00:23:05:
'Win32_SystemConfigurationChangeEvent' has been triggered.
EventType (wbemCimtypeUint16) = 1
SECURITY_DESCRIPTOR (wbemCimtypeUint8) = (null)
TIME_CREATED (wbemCimtypeUint64) = 04-12-2003 23:23:05 (20031204222305.780212+060)
END - OnObjectReady.


Рисунок 4. Перехват событий выключения системы

C:>GenericEventAsyncConsumer.wsf "Select * From Win32_ComputerShutdownEvent" /Machine:RemotePC /User:Administrator /Password:Password Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. Waiting for events... BEGIN - OnObjectReady. Friday, 05 December, 2003 at 00:16:31: 'Win32_ComputerShutdownEvent' has been triggered. MachineName = PPC10284346 SECURITY_DESCRIPTOR = (null) TIME_CREATED = 04-12-2003 23:17:18 (20031204221718.396129+060) Type = 0 END - OnObjectReady. BEGIN - OnObjectReady. Friday, 05 December, 2003 at 00:16:55: 'Win32_ComputerShutdownEvent' has been triggered. MachineName = PPC10284346 SECURITY_DESCRIPTOR = (null) TIME_CREATED = 04-12-2003 23:17:41 (20031204221741.499350+060) Type = 1 END - OnObjectReady.


Рисунок 5.Перехват событий изменения дисков

C:>GenericEventAsyncConsumer.wsf
"Select * From Win32_VolumeChangeEvent"
Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

Waiting for events...

BEGIN - OnObjectReady.
Friday, 05 December, 2003 at 00:25:52:
'Win32_VolumeChangeEvent' has been triggered.
DriveName = E:
EventType = 3
SECURITY_DESCRIPTOR = (null)
TIME_CREATED = 04-12-2003 23:25:52 (20031204222552.540001+060)
END - OnObjectReady.
BEGIN - OnObjectReady.
Friday, 05 December, 2003 at 00:25:53:
'Win32_VolumeChangeEvent' has been triggered.
DriveName = Z:
EventType = 2
SECURITY_DESCRIPTOR = (null)
TIME_CREATED = 04-12-2003 23:25:53 (20031204222553.801816+060)
END - OnObjectReady.


Листинг 1. GenericEventAsyncConsumer.wsf.

























** SIG ** MIIWNwYJKoZIhvcNAQcCoIIWKDCCFiQCAQExDjAMBggq
** SIG ** hkiG9w0CBQUAMGYGCisGAQQBgjcCAQSgWDBWMDIGCisG
** SIG ** AQQBgjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIB
** SIG ** AAIBAAIBAAIBAAIBADAgMAwGCCqGSIb3DQIFBQAEEKjI
** SIG ** N6Ot0Pyap9DeJQZeO0SgghIXMIIDxDCCAy2gAwIBAgIQ
** SIG ** R78Zld+NUkZD99ttSA0xpDANBgkqhkiG9w0BAQUFADCB
** SIG ** izELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
** SIG ** Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNV
** SIG ** BAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRp
** SIG ** ZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3Rh
** SIG ** bXBpbmcgQ0EwHhcNMDMxMjA0MDAwMDAwWhcNMTMxMjAz
** SIG ** MjM1OTU5WjBTMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
** SIG ** VmVyaVNpZ24sIEluYy4xKzApBgNVBAMTIlZlcmlTaWdu
** SIG ** IFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EwggEiMA0G
** SIG ** CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpyrKkzM0g
** SIG ** rwp9iayHdfC0TvHfwQ+/Z2G9o2Qc2rv5yjOrhDCJWH6M
** SIG ** 22vdNp4Pv9HsePJ3pn5vPL+Trw26aPRslMq9Ui2rSD31
** SIG ** ttVdXxsCn/ovax6k96OaphrIAuF/TFLjDmDsQBx+uQ3e
** SIG ** P8e034e9X3pqMS4DmYETqEcgzjFzDVctzXg0M5USmRK5
** SIG ** 3mgvqubjwoqMKsOLIYdmvYNYV291vzyqJoddyhAVPJ+E
** SIG ** 6lTBCm7E/sVK3bkHEZcifNs+J9EeeOyfMcnx5iIZ28Sz
** SIG ** R0OaGl+gHpDkXvXufPF9q2IBj/VNC97QIlaolc2uiHau
** SIG ** 7roN8+RN2aD7aKCuFDuzh8G7AgMBAAGjgdswgdgwNAYI
** SIG ** KwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v
** SIG ** b2NzcC52ZXJpc2lnbi5jb20wEgYDVR0TAQH/BAgwBgEB
** SIG ** /wIBADBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vY3Js
** SIG ** LnZlcmlzaWduLmNvbS9UaGF3dGVUaW1lc3RhbXBpbmdD
** SIG ** QS5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDgYDVR0P
** SIG ** AQH/BAQDAgEGMCQGA1UdEQQdMBukGTAXMRUwEwYDVQQD
** SIG ** EwxUU0EyMDQ4LTEtNTMwDQYJKoZIhvcNAQEFBQADgYEA
** SIG ** Smv56ljCRBwxiXmZK5a/gqwB1hxMzbCKWG7fCCmjXsjK
** SIG ** kxPnBFIN70cnLwA4sOTJk06a1CJiFfc/NyFPcDGA8Ys4
** SIG ** h7Po6JcA/s9Vlk4k0qknTnqut2FB8yrO58nZXt27K4U+
** SIG ** tZ212eFX/760xX71zwye8Jf+K9M7UhsbOCf3P0owggP/
** SIG ** MIIC56ADAgECAhAN6Svw1NgpiBgyBQlemnaIMA0GCSqG
** SIG ** SIb3DQEBBQUAMFMxCzAJBgNVBAYTAlVTMRcwFQYDVQQK
** SIG ** Ew5WZXJpU2lnbiwgSW5jLjErMCkGA1UEAxMiVmVyaVNp
** SIG ** Z24gVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBDQTAeFw0w
** SIG ** MzEyMDQwMDAwMDBaFw0wODEyMDMyMzU5NTlaMFcxCzAJ
** SIG ** BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j
** SIG ** LjEvMC0GA1UEAxMmVmVyaVNpZ24gVGltZSBTdGFtcGlu
** SIG ** ZyBTZXJ2aWNlcyBTaWduZXIwggEiMA0GCSqGSIb3DQEB
** SIG ** AQUAA4IBDwAwggEKAoIBAQCyUChI3dNoeoQYRGZ1XX7E
** SIG ** uJ9jJv89Q5x8ETgQJVVz2XUnaf1OuSBc0wr5oBsq7VVW
** SIG ** IWHYHtvkvDNrx+/dozdljhuTDLZTHlx8ZjVfBYpF/nZO
** SIG ** 31OAooEgna6IXKII9+Uw+e4iN0xCCs7fxh/E1lXpgT+1
** SIG ** UqMsqgF68qKqjTX+n+ZdagWfPWvjv5bA/sxg+UDnB6BE
** SIG ** 64FRbqUq8raKECjtj9wGoIZQmntKCA0wHcoQnmv36Viu
** SIG ** BKlAmbIo6I8WrDzjU29L0zWdtW9kHbOWLLs953nrbXr5
** SIG ** FuYmra/vmVO3QCyVuHmq/tRSqyl0fkLsOR6iahbmWbsk
** SIG ** aNgAgEMQh4BrAgMBAAGjgcowgccwNAYIKwYBBQUHAQEE
** SIG ** KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJp
** SIG ** c2lnbi5jb20wDAYDVR0TAQH/BAIwADAzBgNVHR8ELDAq
** SIG ** MCigJqAkhiJodHRwOi8vY3JsLnZlcmlzaWduLmNvbS90
** SIG ** c3MtY2EuY3JsMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI
** SIG ** MA4GA1UdDwEB/wQEAwIGwDAkBgNVHREEHTAbpBkwFzEV
** SIG ** MBMGA1UEAxMMVFNBMjA0OC0xLTU0MA0GCSqGSIb3DQEB
** SIG ** BQUAA4IBAQCHeHDaTlIBIFvgecmCMMT9uRmWvZEAw73N
** SIG ** zcb0Dtj/+U3AM2IwEcX1dBvUkt5fnCATsXxFvlDNg+eA
** SIG ** F4OnJ5NnE0b7yriYQQPMm1FbBYt/qG/zG1AbJC7yaY1s
** SIG ** Ive7yhaV7Qx0wGh32euZYofBc5D4iXR6I6ujmHuXsfeP
** SIG ** KXFNLnUbSEHa8LUNIFTWd6CXgmNp/QnPivB1uwmb2fkR
** SIG ** VSaaYTK+egKwe4a+osOLIix40TV2vJJzXPm55kwVCiPM
** SIG ** 5NLUNC5JQBU8D2B6JMalZu+Wz3DrPuf0DX7c0XyjdnFp
** SIG ** wZxPRzA1IbGirxpiPCvZjqoqB3vYGLNce+KdpW/+PImt
** SIG ** MIIEaDCCA1CgAwIBAgIQFFQ7XnzRqrNN8MQhICku7TAN
** SIG ** BgkqhkiG9w0BAQUFADBFMRMwEQYKCZImiZPyLGQBGRYD
** SIG ** TkVUMRgwFgYKCZImiZPyLGQBGRYITGlzc1dhcmUxFDAS
** SIG ** BgNVBAMTC0xpc3NXYXJlTkVUMB4XDTAzMTExOTA3MzUx
** SIG ** OVoXDTA4MTExOTA3NDMwMFowRTETMBEGCgmSJomT8ixk
** SIG ** ARkWA05FVDEYMBYGCgmSJomT8ixkARkWCExpc3NXYXJl
** SIG ** MRQwEgYDVQQDEwtMaXNzV2FyZU5FVDCCASIwDQYJKoZI
** SIG ** hvcNAQEBBQADggEPADCCAQoCggEBALv3WpK0zphP6+v2
** SIG ** Se91OOAGTJ5rMXWdd2S9nK0HFLLEK30xUrRPnHwmf/ej
** SIG ** VTZ6/QirEi2zh6tgZ6aPL9FkMW20YmQGEXFKCZCdikdl
** SIG ** iu56suWF5RpP4LeHS5mn4qV2oRPPLJ0AMRaGItAAB9wr
** SIG ** PAwVJBGysv56lmtBi7f4SOSbRulGgRQpJeJTe+LgjNvQ
** SIG ** Kb7YKM8GMwFIdV6aPy14JEuux6TEDl/QMfX3CoaaH6Oo
** SIG ** n7MNx9xGIvOv0uj4eKIreWWJARVLzIAIv3oWyECJKiGM
** SIG ** /y4U6WVfVkrIALQKQA3vTYwkSj7dDaG9KC515QFpZwI9
** SIG ** 8FT480KlcB8b5eG1Is8CAwEAAaOCAVIwggFOMAsGA1Ud
** SIG ** DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
** SIG ** BBTj1q8dplfo4jGkKmtyNoCWfK2RnjCB/AYDVR0fBIH0
** SIG ** MIHxMIHuoIHroIHohoGwbGRhcDovLy9DTj1MaXNzV2Fy
** SIG ** ZU5FVCxDTj1kYzAxLENOPUNEUCxDTj1QdWJsaWMlMjBL
** SIG ** ZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25m
** SIG ** aWd1cmF0aW9uLERDPUxpc3NXYXJlLERDPU9yZz9jZXJ0
** SIG ** aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0
** SIG ** Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnSGM2h0dHA6
** SIG ** Ly9kYzAxLmxpc3N3YXJlLm9yZy9DZXJ0RW5yb2xsL0xp
** SIG ** c3NXYXJlTkVULmNybDAQBgkrBgEEAYI3FQEEAwIBADAN
** SIG ** BgkqhkiG9w0BAQUFAAOCAQEADDwB0F+dSUof0gR0MysG
** SIG ** tZIqnofYeRRGtXF4H8VIjlCWtQpxBxpNxarWm0XQ3BnS
** SIG ** sH1BPRGOGwipLpGw4UEOyav8m4Yp0TdUsQOvPWQa7ikK
** SIG ** V1YSqF2yfQKAUBjnkr1k7mU6ldABFc50+tXCCHp2mvtO
** SIG ** zSoh+2+kham3n12upGWnlScH16WN0MAQJWWeK3jpFRZ5
** SIG ** HMYhrU0EOahw4OEU3LRaqQP/BoO4Glg7OxlgRZPtaQW9
** SIG ** YleDUgB5H54UPiaKja1vXLjpfSS1MI4W2BcmKcIPHbmF
** SIG ** cvTclk6A0XQTtp6sjtyg5iNQQuJB2WciSlqopO2kDJyQ
** SIG ** wv6Ok3XqpZpieDCCBdwwggTEoAMCAQICCmGn78cAAAAA
** SIG ** AAwwDQYJKoZIhvcNAQEFBQAwRTETMBEGCgmSJomT8ixk
** SIG ** ARkWA05FVDEYMBYGCgmSJomT8ixkARkWCExpc3NXYXJl
** SIG ** MRQwEgYDVQQDEwtMaXNzV2FyZU5FVDAeFw0wNDA1MjYw
** SIG ** NzMyMTFaFw0wNTA1MjYwNzMyMTFaMIGVMRMwEQYKCZIm
** SIG ** iZPyLGQBGRYDT3JnMRgwFgYKCZImiZPyLGQBGRYITGlz
** SIG ** c1dhcmUxETAPBgNVBAsTCEludHJhbmV0MQ4wDAYDVQQL
** SIG ** EwVVc2VyczEWMBQGA1UEAxMNTElTU09JUiBBbGFpbjEp
** SIG ** MCcGCSqGSIb3DQEJARYaQWxhaW4uTGlzc29pckBMaXNz
** SIG ** V2FyZS5OZXQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
** SIG ** AoGBAKo3pT3XB7A6d403GIQhgvby3UzlRfKvwGMQS/8G
** SIG ** YxxsflJn+RABX8sYnYruNqEpbIumMttw1g1KlPFNf4XJ
** SIG ** Yt1kxXzfjEoU/r4EnSfS71e9sjraDh1P7Mv/P5/qV5TQ
** SIG ** WOYrWh9n5IfXG3ZJwFJv93/uYwnKywCo3ZJBu8dsOH7z
** SIG ** AgMBAAGjggL/MIIC+zALBgNVHQ8EBAMCB4AwHQYDVR0O
** SIG ** BBYEFFqvwLoHasEOYy113ZSEsuk7Yxm1MD0GCSsGAQQB
** SIG ** gjcVBwQwMC4GJisGAQQBgjcVCIS+i1ODw5ZXgvmfEYTe
** SIG ** oiiF57xHgRGBu/lsv8lAAgFkAgEGMB8GA1UdIwQYMBaA
** SIG ** FOPWrx2mV+jiMaQqa3I2gJZ8rZGeMIH8BgNVHR8EgfQw
** SIG ** gfEwge6ggeuggeiGgbBsZGFwOi8vL0NOPUxpc3NXYXJl
** SIG ** TkVULENOPWRjMDEsQ049Q0RQLENOPVB1YmxpYyUyMEtl
** SIG ** eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZp
** SIG ** Z3VyYXRpb24sREM9TGlzc1dhcmUsREM9T3JnP2NlcnRp
** SIG ** ZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RD
** SIG ** bGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludIYzaHR0cDov
** SIG ** L2RjMDEubGlzc3dhcmUub3JnL0NlcnRFbnJvbGwvTGlz
** SIG ** c1dhcmVORVQuY3JsMIIBEwYIKwYBBQUHAQEEggEFMIIB
** SIG ** ATCBqwYIKwYBBQUHMAKGgZ5sZGFwOi8vL0NOPUxpc3NX
** SIG ** YXJlTkVULENOPUFJQSxDTj1QdWJsaWMlMjBLZXklMjBT
** SIG ** ZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0
** SIG ** aW9uLERDPUxpc3NXYXJlLERDPU9yZz9jQUNlcnRpZmlj
** SIG ** YXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlmaWNhdGlv
** SIG ** bkF1dGhvcml0eTBRBggrBgEFBQcwAoZFaHR0cDovL2Rj
** SIG ** MDEubGlzc3dhcmUub3JnL0NlcnRFbnJvbGwvZGMwMS5M
** SIG ** aXNzV2FyZS5PcmdfTGlzc1dhcmVORVQuY3J0MBMGA1Ud
** SIG ** JQQMMAoGCCsGAQUFBwMDMBsGCSsGAQQBgjcVCgQOMAww
** SIG ** CgYIKwYBBQUHAwMwJQYDVR0RBB4wHIEaQWxhaW4uTGlz
** SIG ** c29pckBMaXNzV2FyZS5OZXQwDQYJKoZIhvcNAQEFBQAD
** SIG ** ggEBALRhWJokPd2od+DK1b8uD9S6cI05Vh9eb81KeF6t
** SIG ** zu4t260XhpLlUUm86Szcusj56V/DMks0w+avK40NIY9U
** SIG ** SZ9nwW8oKGatySbwVRTtp35qNeSSWAT+1QwHZYNBzhkJ
** SIG ** aa7LjBsscier0uw/bVhqoGqJHE1i95Ssfk9wFnpLrwe0
** SIG ** wpRkY3REzUaAMAezorowWhSA7MrAm/PgGEyYeLWVnfiz
** SIG ** vgRHfvxYzV3YbKNCP5T9t1EdFetWKVXj4KHEvQbX9z+m
** SIG ** AgE1cKwX0GjKW4+Qk2vM9QSAz2m0oaM+7ii1PHqPaSn/
** SIG ** ang2bSza9PbGdD4eXAMLfmSK3t1iVE7dSDxT8OgxggOK
** SIG ** MIIDhgIBATBTMEUxEzARBgoJkiaJk/IsZAEZFgNORVQx
** SIG ** GDAWBgoJkiaJk/IsZAEZFghMaXNzV2FyZTEUMBIGA1UE
** SIG ** AxMLTGlzc1dhcmVORVQCCmGn78cAAAAAAAwwDAYIKoZI
** SIG ** hvcNAgUFAKCBiDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGC
** SIG ** NwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB
** SIG ** FTAfBgkqhkiG9w0BCQQxEgQQolTabBPbi5wgE8SlGFA/
** SIG ** rjAsBgorBgEEAYI3AgEMMR4wHKEagBhodHRwOi8vd3d3
** SIG ** Lkxpc3NXYXJlLk5ldCAwDQYJKoZIhvcNAQEBBQAEgYB7
** SIG ** /3/rUrx4kTXiTDiRQsfOro6Ryk4Mb8uteeISlShTetSI
** SIG ** jyIC4ZZ0xIkrLG/bDtHft1iO46TBjCZR7WAEC++fTxG7
** SIG ** ZCoL+RaHfzRhKlfHDmUI9BQOppJYswSQM/73gzuxxfjJ
** SIG ** kdDb3yZAmQcoovSb+le+vCVE7EMbeBR9CbL0lqGCAf8w
** SIG ** ggH7BgkqhkiG9w0BCQYxggHsMIIB6AIBATBnMFMxCzAJ
** SIG ** BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j
** SIG ** LjErMCkGA1UEAxMiVmVyaVNpZ24gVGltZSBTdGFtcGlu
** SIG ** ZyBTZXJ2aWNlcyBDQQIQDekr8NTYKYgYMgUJXpp2iDAM
** SIG ** BggqhkiG9w0CBQUAoFkwGAYJKoZIhvcNAQkDMQsGCSqG
** SIG ** SIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMDQwNTI3MTAz
** SIG ** MjU4WjAfBgkqhkiG9w0BCQQxEgQQm8a35xuSbZCpv63p
** SIG ** 3hOgAjANBgkqhkiG9w0BAQEFAASCAQBzdxn4SsQ3IVYQ
** SIG ** jHts2B69RSd4Pg6NDatcpIleC1u/Ttttbb7eVsucB1yb
** SIG ** Xu1u8+fV5Kpx3ToIdES/d19v9FjFXa+aCP+TMqNAWeCS
** SIG ** NZE1n9lDNHW6fMcbMV9RUYt2Td+o6NiGsicWeu4pWRlQ
** SIG ** dMXr1meroulyBAQ+eCQwFWDGogGIUg6lJDFPQ85UPLQr
** SIG ** iGmLdmK8D2DPFs95fKJs4TW/3UNksFCDW2srYDx5Svf2
** SIG ** XqQjEX8a9DaGL4dKr9DrTdpUGmUK9gm0jBP/JysRs588
** SIG ** sACpGzqpDKSNfSP14rDK2Nnspm4Ix93ua6lg7tLscBnu
** SIG ** Mr0EwtcT/DcaLTMDVr1D