From c9cb2187eed2bd478c9c4b73fba7c36c748680bb Mon Sep 17 00:00:00 2001 From: Laurent Bigonville Date: Mon, 18 Jul 2016 02:11:41 +0200 Subject: [PATCH] Imported Upstream version 2.7.4 --- ChangeLog | 1100 ++++++++++++++++++++++ INSTALL.nut | 24 +- Makefile.am | 3 +- Makefile.in | 4 +- NEWS | 120 ++- UPGRADING | 18 +- clients/Makefile.in | 1 + clients/nutclient.cpp | 5 + clients/upsrw.c | 5 + common/Makefile.am | 4 +- common/Makefile.in | 14 +- common/common.c | 41 - common/str.c | 607 ++++++++++++ conf/Makefile.in | 1 + configure | 98 +- configure.ac | 11 +- data/Makefile.in | 1 + data/cmdvartab | 40 +- data/driver.list.in | 38 +- data/html/Makefile.in | 1 + docs/FAQ.txt | 4 +- docs/Makefile.am | 9 +- docs/Makefile.in | 17 +- docs/config-notes.txt | 60 +- docs/configure.txt | 8 +- docs/documentation.txt | 4 +- docs/download.txt | 12 +- docs/features.txt | 8 +- docs/images/nut_layering.png | Bin 83521 -> 231026 bytes docs/man/Makefile.in | 1 + docs/man/al175.8 | 6 +- docs/man/apcsmart-old.8 | 6 +- docs/man/apcsmart.8 | 6 +- docs/man/apcupsd-ups.8 | 6 +- docs/man/asem.8 | 6 +- docs/man/bcmxcp.8 | 6 +- docs/man/bcmxcp_usb.8 | 6 +- docs/man/belkin.8 | 6 +- docs/man/belkinunv.8 | 6 +- docs/man/bestfcom.8 | 6 +- docs/man/bestfortress.8 | 6 +- docs/man/bestuferrups.8 | 6 +- docs/man/bestups.8 | 6 +- docs/man/blazer_ser.8 | 6 +- docs/man/blazer_usb.8 | 6 +- docs/man/clone.8 | 6 +- docs/man/dummy-ups.8 | 6 +- docs/man/etapro.8 | 6 +- docs/man/everups.8 | 6 +- docs/man/gamatronic.8 | 6 +- docs/man/genericups.8 | 6 +- docs/man/hosts.conf.5 | 6 +- docs/man/isbmex.8 | 6 +- docs/man/ivtscd.8 | 6 +- docs/man/libnutclient.3 | 6 +- docs/man/libnutclient_commands.3 | 6 +- docs/man/libnutclient_devices.3 | 6 +- docs/man/libnutclient_general.3 | 6 +- docs/man/libnutclient_misc.3 | 6 +- docs/man/libnutclient_tcp.3 | 6 +- docs/man/libnutclient_variables.3 | 6 +- docs/man/libupsclient-config.1 | 6 +- docs/man/liebert-esp2.8 | 6 +- docs/man/liebert.8 | 6 +- docs/man/macosx-ups.8 | 16 +- docs/man/macosx-ups.txt | 32 +- docs/man/masterguard.8 | 6 +- docs/man/metasys.8 | 6 +- docs/man/mge-shut.8 | 6 +- docs/man/mge-utalk.8 | 6 +- docs/man/microdowell.8 | 6 +- docs/man/netxml-ups.8 | 6 +- docs/man/nut-ipmipsu.8 | 6 +- docs/man/nut-recorder.8 | 6 +- docs/man/nut-scanner.8 | 6 +- docs/man/nut.conf.5 | 6 +- docs/man/nutdrv_atcl_usb.8 | 10 +- docs/man/nutdrv_atcl_usb.txt | 12 +- docs/man/nutdrv_qx.8 | 11 +- docs/man/nutdrv_qx.txt | 2 +- docs/man/nutscan.3 | 6 +- docs/man/nutscan_add_device_to_device.3 | 6 +- docs/man/nutscan_add_option_to_device.3 | 6 +- docs/man/nutscan_cidr_to_ip.3 | 6 +- docs/man/nutscan_display_parsable.3 | 6 +- docs/man/nutscan_display_ups_conf.3 | 6 +- docs/man/nutscan_free_device.3 | 6 +- docs/man/nutscan_get_serial_ports_list.3 | 6 +- docs/man/nutscan_init.3 | 6 +- docs/man/nutscan_new_device.3 | 6 +- docs/man/nutscan_scan_avahi.3 | 6 +- docs/man/nutscan_scan_eaton_serial.3 | 6 +- docs/man/nutscan_scan_ipmi.3 | 6 +- docs/man/nutscan_scan_nut.3 | 6 +- docs/man/nutscan_scan_snmp.3 | 6 +- docs/man/nutscan_scan_usb.3 | 6 +- docs/man/nutscan_scan_xml_http.3 | 6 +- docs/man/nutupsdrv.8 | 6 +- docs/man/oneac.8 | 6 +- docs/man/optiups.8 | 6 +- docs/man/powercom.8 | 6 +- docs/man/powerman-pdu.8 | 6 +- docs/man/powerpanel.8 | 6 +- docs/man/rhino.8 | 6 +- docs/man/richcomm_usb.8 | 6 +- docs/man/riello_ser.8 | 6 +- docs/man/riello_usb.8 | 6 +- docs/man/safenet.8 | 6 +- docs/man/snmp-ups.8 | 26 +- docs/man/snmp-ups.txt | 13 + docs/man/solis.8 | 6 +- docs/man/tripplite.8 | 6 +- docs/man/tripplite_usb.8 | 6 +- docs/man/tripplitesu.8 | 6 +- docs/man/ups.conf.5 | 20 +- docs/man/ups.conf.txt | 12 +- docs/man/upsc.8 | 6 +- docs/man/upscli_add_host_cert.3 | 6 +- docs/man/upscli_cleanup.3 | 6 +- docs/man/upscli_connect.3 | 6 +- docs/man/upscli_disconnect.3 | 6 +- docs/man/upscli_fd.3 | 6 +- docs/man/upscli_get.3 | 6 +- docs/man/upscli_init.3 | 6 +- docs/man/upscli_list_next.3 | 6 +- docs/man/upscli_list_start.3 | 6 +- docs/man/upscli_readline.3 | 6 +- docs/man/upscli_sendline.3 | 6 +- docs/man/upscli_splitaddr.3 | 6 +- docs/man/upscli_splitname.3 | 6 +- docs/man/upscli_ssl.3 | 6 +- docs/man/upscli_strerror.3 | 6 +- docs/man/upscli_upserror.3 | 6 +- docs/man/upsclient.3 | 6 +- docs/man/upscmd.8 | 6 +- docs/man/upscode2.8 | 6 +- docs/man/upsd.8 | 6 +- docs/man/upsd.conf.5 | 6 +- docs/man/upsd.users.5 | 6 +- docs/man/upsdrvctl.8 | 6 +- docs/man/upsimage.cgi.8 | 6 +- docs/man/upslog.8 | 6 +- docs/man/upsmon.8 | 6 +- docs/man/upsmon.conf.5 | 6 +- docs/man/upsrw.8 | 9 +- docs/man/upsrw.txt | 9 + docs/man/upssched.8 | 6 +- docs/man/upssched.conf.5 | 6 +- docs/man/upsset.cgi.8 | 6 +- docs/man/upsset.conf.5 | 6 +- docs/man/upsstats.cgi.8 | 6 +- docs/man/upsstats.html.5 | 6 +- docs/man/usbhid-ups.8 | 6 +- docs/man/victronups.8 | 6 +- docs/net-protocol.txt | 12 +- docs/new-clients.txt | 4 +- docs/new-drivers.txt | 8 +- docs/nut-names.txt | 318 +++++-- docs/nut-qa.txt | 3 + docs/nutdrv_qx-subdrivers.txt | 77 +- docs/packager-guide.txt | 4 +- docs/scheduling.txt | 2 +- docs/snmp-subdrivers.txt | 3 +- docs/user-manual.txt | 4 + drivers/Makefile.am | 7 +- drivers/Makefile.in | 18 +- drivers/apc-ats-mib.c | 447 +++++++++ drivers/apc-ats-mib.h | 29 + drivers/apc-hid.c | 7 +- drivers/apc-mib.c | 12 +- drivers/baytech-mib.c | 8 +- drivers/bcmxcp.c | 4 +- drivers/bcmxcp.h | 1 + drivers/bcmxcp_usb.c | 76 +- drivers/bestpower-mib.c | 4 +- drivers/blazer.c | 2 +- drivers/blazer_ser.c | 2 +- drivers/blazer_usb.c | 2 +- drivers/compaq-mib.c | 14 +- drivers/cyberpower-mib.c | 4 +- drivers/delta_ups-mib.c | 8 +- drivers/dstate.c | 6 +- drivers/dummy-ups.c | 10 +- drivers/dummy-ups.h | 3 +- drivers/eaton-ats-mib.c | 245 +++++ drivers/eaton-ats-mib.h | 30 + drivers/eaton-mib.c | 334 ++++++- drivers/hidparser.c | 28 +- drivers/hidtypes.h | 11 +- drivers/huawei-mib.c | 234 +++++ drivers/huawei-mib.h | 9 + drivers/ietf-mib.c | 20 +- drivers/ietf-mib.h | 1 + drivers/libhid.c | 10 +- drivers/libshut.c | 17 +- drivers/libshut.h | 13 +- drivers/libusb.c | 30 +- drivers/macosx-ups.c | 144 +-- drivers/mge-hid.c | 8 +- drivers/mge-mib.c | 28 +- drivers/mge-xml.c | 20 +- drivers/netvision-mib.c | 8 +- drivers/nut-libfreeipmi.c | 15 +- drivers/nutdrv_qx.c | 146 ++- drivers/nutdrv_qx.h | 28 +- drivers/nutdrv_qx_bestups.c | 128 +-- drivers/nutdrv_qx_blazer-common.c | 6 +- drivers/nutdrv_qx_blazer-common.h | 6 +- drivers/nutdrv_qx_mecer.c | 82 +- drivers/nutdrv_qx_megatec-old.c | 72 +- drivers/nutdrv_qx_megatec.c | 72 +- drivers/nutdrv_qx_mustek.c | 72 +- drivers/nutdrv_qx_q1.c | 58 +- drivers/nutdrv_qx_voltronic-qs-hex.c | 219 +++-- drivers/nutdrv_qx_voltronic-qs.c | 76 +- drivers/nutdrv_qx_voltronic.c | 552 +++++------ drivers/nutdrv_qx_zinto.c | 72 +- drivers/powercom.c | 137 ++- drivers/powerp-bin.c | 2 +- drivers/powerp-txt.c | 4 +- drivers/powerpanel.c | 2 +- drivers/powerware-mib.c | 242 ++++- drivers/powerware-mib.h | 1 + drivers/raritan-pdu-mib.c | 8 +- drivers/snmp-ups.c | 872 ++++++++++++----- drivers/snmp-ups.h | 22 +- drivers/solis.c | 346 ++++--- drivers/solis.h | 108 ++- drivers/tripplite-hid.c | 71 +- drivers/tripplitesu.c | 9 +- drivers/upscode2.c | 4 +- drivers/usb-common.h | 13 +- drivers/usbhid-ups.c | 19 +- drivers/xppc-mib.c | 4 +- include/Makefile.am | 2 +- include/Makefile.in | 3 +- include/common.h | 6 +- include/config.h.in | 6 + include/str.h | 129 +++ lib/Makefile.in | 1 + lib/README | 2 +- m4/nut_check_libnss.m4 | 7 +- scripts/Makefile.in | 1 + scripts/Solaris/Makefile.in | 1 + scripts/augeas/Makefile.in | 1 + scripts/augeas/README | 2 +- scripts/augeas/nutupsconf.aug.in | 7 + scripts/augeas/nutupsconf.aug.tpl | 5 + scripts/devd/Makefile.in | 1 + scripts/devd/nut-usb.conf.in | 20 + scripts/hotplug/Makefile.in | 1 + scripts/hotplug/libhid.usermap | 6 + scripts/python/Makefile.in | 1 + scripts/subdriver/gen-snmp-subdriver.sh | 42 +- scripts/systemd/Makefile.in | 1 + scripts/systemd/nut-server.service.in | 2 +- scripts/udev/Makefile.in | 1 + scripts/udev/nut-usbups.rules.in | 6 + scripts/upower/95-upower-hid.rules | 14 +- server/Makefile.in | 1 + server/netget.c | 5 +- server/upsd.c | 2 +- tests/Makefile.in | 1 + tools/Makefile.am | 5 +- tools/Makefile.in | 6 +- tools/driver-list-format.sh | 32 + tools/nut-scanner/Makefile.in | 1 + tools/nut-scanner/README | 2 +- tools/nut-scanner/nut-scan.h | 11 +- tools/nut-scanner/nut-scanner.c | 39 +- tools/nut-scanner/nutscan-device.c | 11 +- tools/nut-scanner/nutscan-device.h | 11 +- tools/nut-scanner/nutscan-display.c | 10 +- tools/nut-scanner/nutscan-init.c | 79 +- tools/nut-scanner/nutscan-init.h | 11 +- tools/nut-scanner/nutscan-ip.c | 10 +- tools/nut-scanner/nutscan-ip.h | 11 +- tools/nut-scanner/nutscan-serial.c | 11 +- tools/nut-scanner/nutscan-serial.h | 11 +- tools/nut-scanner/nutscan-snmp.h | 43 +- tools/nut-scanner/nutscan-usb.h | 2 + tools/nut-scanner/scan_avahi.c | 208 ++-- tools/nut-scanner/scan_eaton_serial.c | 10 +- tools/nut-scanner/scan_ipmi.c | 21 +- tools/nut-scanner/scan_nut.c | 111 ++- tools/nut-scanner/scan_snmp.c | 39 +- tools/nut-scanner/scan_usb.c | 126 +-- tools/nut-scanner/scan_xml_http.c | 94 +- tools/nut-snmpinfo.py | 19 +- tools/nut-usbinfo.pl | 9 +- 290 files changed, 7473 insertions(+), 2607 deletions(-) create mode 100644 common/str.c create mode 100755 drivers/apc-ats-mib.c create mode 100755 drivers/apc-ats-mib.h create mode 100644 drivers/eaton-ats-mib.c create mode 100644 drivers/eaton-ats-mib.h create mode 100644 drivers/huawei-mib.c create mode 100644 drivers/huawei-mib.h create mode 100644 include/str.h create mode 100755 tools/driver-list-format.sh diff --git a/ChangeLog b/ChangeLog index 96dc998..2a1df65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,1090 @@ +2016-03-09 Arnaud Quette + + * configure.ac: Fix autoreconf on Debian For some reason, Automake + doesn't search the current directory correctly when searching for + helper scripts, when 'nut' is running as a git-submodule, as it is + the case with the website repository + * configure.ac: update version to 2.7.4 + * drivers/apc-ats-mib.c: snmp-ups: add APC ATS input.source + * drivers/snmp-ups.c: snmp-ups: fix the matching OID tests For both + sysOID and classic methods, we used to test one of the two OIDs + provided in the mib2nut structures. However, these two OIDs + (oid_pwr_status and oid_auto_check) tend to be redundant and + confusing. Replace these matching by an extraction of + {ups,device}.model + * drivers/nut-libfreeipmi.c: nut-ipmipsu: fix compilation warnings + * NEWS, UPGRADING, docs/FAQ.txt, docs/net-protocol.txt, docs/new- + drivers.txt, docs/nut-names.txt, docs/nutdrv_qx-subdrivers.txt, + docs/packager-guide.txt, docs/snmp-subdrivers.txt, lib/README, + scripts/augeas/README: Fix spelling and typo errors Following the + spell-checking scope expansion, do a spell-checking pass + * docs/documentation.txt: Update documentation as per the new devices + scope + * docs/features.txt, docs/user-manual.txt: Update documentation as + per the new devices scope + * docs/Makefile.am: Expand spell-checking scope Add more documents, + outside of the docs/ directory Closes: + https://github.com/networkupstools/nut/issues/222 + +2016-03-08 Arnaud Quette + + * configure.ac, tools/Makefile.am, tools/driver-list-format.sh: Check + driver.list[.in] format at make dist time Instead of checking + driver.list.in at configure time, move the checking and + modification into a script that is called at make dist time. The + script can also be called manually, and will try to fix both + driver.list.in and driver.list + +2016-03-07 Arnaud Quette + + * drivers/powerware-mib.c: Remove an erroneous test This was made + test the enumerated values registration in snmp-ups, and should not + have been committed + * data/driver.list.in: HCL: APC ATS AP7724 supported by snmp-ups + These Automatic Transfer Switch should be supported by snmp-ups, + however this was not tested at all Reference: + https://github.com/networkupstools/nut/issues/260 + * NEWS, UPGRADING: Update for release 2.7.4 + * drivers/Makefile.am, drivers/apc-ats-mib.c, drivers/apc-ats-mib.h, + drivers/snmp-ups.c: snmp-ups: support APC Automatic Transfer Switch + Following the recent extension of NUT scope and variable namespace, + to support Automatic Transfer Switch (ATS), implement SNMP support + for APC ATS (with help from "maaboo" through github) Reference: + https://github.com/networkupstools/nut/issues/260 + +2016-03-04 Arnaud Quette + + * drivers/baytech-mib.c, drivers/bestpower-mib.c, drivers/compaq- + mib.c, drivers/cyberpower-mib.c, drivers/eaton-mib.c, drivers/mge- + mib.c, drivers/netvision-mib.c, drivers/powerware-mib.c, drivers + /raritan-pdu-mib.c: snmp-ups: fix mib2nut structures Non existent + OIDs, for testing MIB selection, must be expressed as NULL and not + as empty string ("") for the algorithm to work + +2016-03-03 Daniele Pezzini + + * docs/download.txt: docs: update several download links + +2016-03-03 Arnaud Quette + + * docs/man/upsrw.txt, docs/net-protocol.txt: Clarification on NUMBER + type float values Clarify a bit more documentation on how to + express float values, when using upsrw. That is to say, using + decimal (base 10) english-based representation, so using a dot, in + non-scientific notation. So hexadecimal, exponents, and comma for + thousands separator are forbiden + * clients/upsrw.c, docs/net-protocol.txt, server/netget.c: Prefer + NUMBER to NUMERIC for variable type As per discussion on the + Github pull request, NUMBER would be more suitable than NUMERIC + +2015-11-22 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: increase timeouts in 'sgs' USB + subdriver Apparently the previously used timeouts in the 'sgs' USB + subdriver were not always enough, so increase them. + +2015-11-11 Daniele Pezzini + + * data/driver.list.in: HCL: various TS Shara UPSes supported by + nutdrv_qx Protocol: 'megatec' USB subdriver: 'sgs' + * drivers/nutdrv_qx.c: nutdrv_qx: make sure 'sgs' USB subdriver uses + only what it reads Since, in 'sgs' USB subdriver, we read only 8 + bytes at a time and we expect the first byte to tell us the length + of the data that follows, make sure we don't use more than what we + read from the device in case the first byte is not what we expect + it to be. + +2015-03-04 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: increase verbosity of 'sgs' USB + subdriver In 'sgs' USB subdriver: - be more verbose when + debugging, - always print the return code when dealing with an + error. + +2014-01-31 Daniele Pezzini + + * docs/man/nutdrv_qx.txt: nutdrv_qx: update man page for new 'sgs' + USB subdriver + +2014-01-31 Ronaldo Yamada + + * drivers/nutdrv_qx.c: nutdrv_qx: add new 'sgs' USB subdriver to + support TS Shara units + +2016-03-02 Arnaud Quette + + * data/driver.list.in: HCL: added Eaton Powerware 9125-5000g + Supported with the additional USB card, with the bcmxcp_usb driver + * docs/man/upsrw.txt, docs/net-protocol.txt: Clarification on NUMERIC + type float values Clarify documentation on how to express float + values, when using upsrw. That is to say, using decimal english- + based representation, so using a dot + * drivers/mge-xml.c: netxml-ups: fix Eaton XML published data Some + raw protocol data were wrongly published, and are now commented. + Also add some R/W flags to ambient thresholds Closes: + https://github.com/networkupstools/nut/issues/201 + * tools/nut-scanner/nut-scanner.c: nut-scanner: fix thread attachment + Add a test to have the right thread waiting for the scan to be + complete (patch from Michal Hlavinka, Red Hat) + * configure.ac, tools/nut-scanner/nutscan-init.c, tools/nut- + scanner/scan_avahi.c, tools/nut-scanner/scan_ipmi.c, tools/nut- + scanner/scan_nut.c, tools/nut-scanner/scan_snmp.c, tools/nut- + scanner/scan_usb.c, tools/nut-scanner/scan_xml_http.c: nut-scanner: + don't depend on development libraries nut-scanner was previously + trying to use directly libXXX.so (libusb-0.1, libfreeipmi, + libnetsnmp, libavahi-client, libneon, libupsclient}. However, these + files are generally provided by the development packages. nut- + scanner now tries to look at some known paths, including the one + provided through --libdir, to find the correct libraries Closes: + https://github.com/networkupstools/nut/issues/233 + +2016-03-01 Arnaud Quette + + * clients/upsrw.c, docs/net-protocol.txt, server/netget.c: Default to + type NUMERIC for variables Any variable that is not STRING, RANGE + or ENUM is just a simple numeric value. The protocol documentation + (net-protocol.txt) was previously stating that "The default , + when omitted, is integer." which was not fully true, since a + variable could also be a float. Hence, the wording was changed to + advertise this, and that each driver is then responsible for + handling values as either integer or float. Moreover, instead of + returning a TYPE "UNKNOWN", return "NUMERIC", which is more + suitable, and aligned with the NUT protocol specification + * tools/nut-snmpinfo.py: SNMP subdriver generator: fix output + formatting + * tools/nut-snmpinfo.py: SNMP subdriver generator: discard commented + lines Discard any commented mib2nut_info_t declaration, which + should thus not be taken into account + +2016-02-26 Arnaud Quette + + * data/driver.list.in, drivers/Makefile.am, drivers/eaton-ats-mib.c, + drivers/eaton-ats-mib.h, drivers/snmp-ups.c: snmp-ups: support + Eaton Automatic Transfer Switch Following the recent extension of + NUT scope and variable namespace, to support Automatic Transfer + Switch (ATS), implement SNMP support for Eaton ATS. Note that this + device can also be supported through Eaton XML/PDC (XML over HTTP) + protocol, supported by the NUT netxml-ups driver + * data/cmdvartab, docs/nut-names.txt: Extend namespace for Automatic + Transfer Switch (ATS) Extend NUT namespace to support a new type + of power device: ATS - Automatic Transfer Switch. These devices + are used to setup 2 power systems, such as UPS, to power a single + power supply system, and be able to automatically transfer between + the input sources in case of failure of the primary one. The added + variable are for now limited to 'input.source' and + 'input.source.preferred', but may be extended if needed + +2016-02-25 C Fraire + + * docs/scheduling.txt: Fix docs location of upssched to sbin + +2016-02-25 Arnaud Quette + + * scripts/subdriver/gen-snmp-subdriver.sh: snmp-ups: add the last + missing element in the structure + * drivers/apc-mib.c, drivers/bestpower-mib.c, drivers/compaq-mib.c, + drivers/cyberpower-mib.c, drivers/delta_ups-mib.c, drivers/huawei- + mib.c, drivers/ietf-mib.c, drivers/mge-mib.c, drivers/netvision- + mib.c, drivers/powerware-mib.c, drivers/xppc-mib.c, + scripts/subdriver/gen-snmp-subdriver.sh: snmp-ups: fix values + lookup terminating element The terminating element should really + be NULL, and not the string "NULL", as it was originally done, back + in 2002 + * drivers/snmp-ups.c: snmp-ups: revert order of the NULL/"NULL" test + Fix a segfault when doing first the string comparison test + * drivers/snmp-ups.c: snmp-ups: register values enumerations + Whenever there is a values lookup structure for read/write data, + push the values as enumerations for upsrw + * drivers/snmp-ups.c: snmp-ups: try to lookup values for numeric + elements Numeric elements can also use the value resolution + mechanism + * drivers/snmp-ups.c: snmp-ups: counter test sysOID with a test OID + Some devices have buggy sysOID exposed. Allow to counter test + another OID, to be able to select between different mapping + structures + +2016-02-24 Arnaud Quette + + * scripts/subdriver/gen-snmp-subdriver.sh: SNMP subdriver creation + script: allow sysOID override Allow to use -s to override buggy + sysOID in some device FW. In this case, the sysOID entry in the + mib2nut structure should be set to NULL + +2016-02-11 Arnaud Quette + + * drivers/raritan-pdu-mib.c: snmp-ups: fix macaddr support for + Raritan PDU Raritan MIB was fixed to expose macaddr on + device.macaddr instead of ups.macaddr + * drivers/baytech-mib.c: snmp-ups: fix macaddr support for Baytech + PDU Baytech MIB was fixed to expose macaddr on device.macaddr + instead of ups.macaddr + * drivers/eaton-mib.c: snmp-ups: fix and complete macaddr support for + Eaton Eaton G2 and G3 can now expose the MAC address of the + device, using device.macaddr. Eaton G1 Aphel was fixed to expose + this data on device.macaddr instead of ups.macaddr + * drivers/snmp-ups.c: snmp-ups: add support for hexadecimal octet + strings + * drivers/snmp-ups.c: snmp-ups: fallback for classic MIB detection + If the sysOID matching has failed, then snmp-ups uses ups.model to + get an OID to test. In case ups.model is not available, fallback to + trying to use device.model instead + * docs/images/nut_layering.png, docs/images/nut_layering.svg: Refresh + and complete NUT architecture diagram + +2016-02-08 Arnaud Quette + + * drivers/powerware-mib.c: snmp-ups: extend Eaton 3ph outputSource + values map Add the new status values for xupsOutputSource + (.1.3.6.1.4.1.534.1.4.5.0), that maps to both ups.status and + ups.type + +2016-02-03 Arnaud Quette + + * drivers/powerware-mib.c: snmp-ups: improve support for Eaton 3ph + Improve support for temperature and humidity data, including: - + ups.temperature now available - fixing ambient.temperature + (previously pointing at a wrong OID) - ambient.humidity now + available - the following settings now available: * + ups.temperature.low * ups.temperature.high * ambient.humidity.high + * ambient.humidity.low * ambient.temperature.high * + ambient.temperature.low + +2016-02-01 Daniele Pezzini + + * data/driver.list.in: HCL: various APCUPSD-controlled APC devices + via apcupsd-ups Originally reported by GitHub user @Thermionix. + Reference: https://github.com/networkupstools/nut/pull/215 + +2016-01-31 Charles Lepple + + * docs/man/nutdrv_atcl_usb.txt: man/nutdrv_atcl_usb: point to + nutdrv_qx (fuji) for 0001:0000 Also update best guess for the USB- + to-serial converter situation. + * docs/FAQ.txt: FAQ: udevadm for fixing permissions + +2016-01-30 Charles Lepple + + * drivers/nut-libfreeipmi.c: FreeIPMI: do not split function + arguments with a conditional Alternate approach to suggestion by + Romero B. de S. Malaquias Closes: + https://github.com/networkupstools/nut/pull/250 + +2016-01-24 Charles Lepple + + * docs/config-notes.txt: Documentation: fix formatting Put syntax + examples in verbatim mode, and remove spaces from ends of lines. + * drivers/apc-hid.c: usbhid-ups: handle missing USB strings in APC + code Closes: https://github.com/networkupstools/nut/issues/258 + Might fix: + https://bugs.launchpad.net/ubuntu/+source/nut/+bug/1483615 + +2016-01-23 Charles Lepple + + * data/driver.list.in: HCL: added NHS Laser Senoidal 5000VA Source: + http://article.gmane.org/gmane.comp.monitoring.nut.devel/7123 + Closes: https://github.com/networkupstools/nut/issues/254 + +2016-01-14 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: fix staleness detection With some + ePDUs or devices using template for outlet and outlet.group, + communication loss with the device were not detected, due to the + handling mechanism. Simply skipping commands for templates, after + the init time, is sufficient to avoid this issue + +2016-01-05 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: improve stale communication recovery + Disable the 10 iterations to retry communicating with stale device. + This was leading up to 10 x 30 seconds, so 5mn, before being able + to get data again + * docs/new-drivers.txt, docs/nut-names.txt: Document + battery.charger.status This will in time replace the historic CHRG + and DISCHRG flags published in ups.status. Closes + https://github.com/networkupstools/nut/issues/196 + +2016-01-03 Charles Lepple + + * data/driver.list.in: HCL: Sweex model P220 via blazer_usb + Reference: https://github.com/networkupstools/nut/issues/251 + +2016-01-04 Arnaud Quette + + * drivers/ietf-mib.c, drivers/ietf-mib.h, drivers/snmp-ups.c: snmp- + ups: add support for Tripplite units on IETF mib These devices + expose ".1.3.6.1.4.1.850.1", which could be supported through this + specific MIB. For now, just link that to the IETF MIB, to provide + a first level of support Reference: + https://github.com/networkupstools/nut/issues/171 + +2015-12-30 Arnaud Quette + + * configure.ac: First stab at checking driver.list.in format + +2015-12-29 Charles Lepple + + * scripts/upower/95-upower-hid.rules: upower: update for AEG + +2015-12-29 Arnaud Quette + + * drivers/powercom.c: Fix the processing of output voltage for KIN + units The processing of output voltage requires to also take into + account the line voltage, as reported by Patrik Dufresne. This may + still need some further adjustments Reference: + https://github.com/networkupstools/nut/issues/187 + * drivers/powercom.c: Fix the processing of input voltage for KIN + units The processing of input voltage requires to also take into + account the line voltage, as reported by Patrik Dufresne. Also bump + the driver version to 0.16, since 0.15 was already used, but not + set Reference: https://github.com/networkupstools/nut/issues/187 + * drivers/mge-hid.c: Fix letter case for AEG USB VendorID The letter + case of this VendorID may be important for generated files, such as + the udev ones (reported by Charles Lepple) + +2015-12-28 Arnaud Quette + + * data/driver.list.in, drivers/mge-hid.c: HCL: AEG PROTECT B / NAS + supported by usbhid-ups Reference: + https://github.com/networkupstools/nut/issues/249 + +2015-12-17 Daniele Pezzini + + * data/driver.list.in: HCL: Legrand Keor Multiplug supported by + nutdrv_qx Reference: + https://github.com/networkupstools/nut/issues/248 + +2015-12-09 Andrey Jr. Melnikov + + * drivers/bcmxcp_usb.c: Don't call usb_close() after reset + +2015-12-08 Andrey Jr. Melnikov + + * drivers/bcmxcp_usb.c: Call usb_reset() when driver unable to claim + device + * drivers/bcmxcp.h, drivers/bcmxcp_usb.c: Refactor get_answer() + routine, make it properly deal with multi-packets responses. Lower + stack usage. + +2015-07-27 Daniele Pezzini + + * common/common.c, common/str.c, drivers/bcmxcp.c, drivers/blazer.c, + drivers/blazer_ser.c, drivers/blazer_usb.c, drivers/libhid.c, + drivers/mge-xml.c, drivers/nutdrv_qx.c, drivers/powerp-bin.c, + drivers/powerp-txt.c, drivers/powerpanel.c, drivers/tripplitesu.c, + drivers/upscode2.c, include/common.h, include/str.h, server/upsd.c, + tools/nut-scanner/scan_usb.c: common: consolidate some string- + related functions Move *trim*() functions from common to str. + Prepend the 'str_' common prefix. Bailout early if string is NULL + or empty. In *trim_m() functions, make sure the string containing + characters to be removed is not NULL and bailout early if empty. + Add new str_trim[_m]() functions to remove both leading and + trailing characters at the same time. Update all the tree + accordingly; versioning where appropriate. + * common/Makefile.am, common/str.c, include/Makefile.am, + include/common.h, include/str.h: common: add some string-related + functions + +2015-11-10 Charles Lepple + + * data/driver.list.in: HCL: Electrys UPS 2500 (nutdrv_qx and + blazer_ser) Closes + https://github.com/networkupstools/nut/issues/241 + * data/driver.list.in: HCL: Eaton E Series DX UPS 1-20 kVA uses + blazer_ser Closes + https://github.com/networkupstools/nut/issues/238 + +2015-11-09 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: add number of outlets in Eaton ePDU + groups + * docs/nut-names.txt: Add a variable for the number of outlets in a + group Added 'outlet.group.n.count' which provides the number of + outlets in the outlet group 'n' + +2015-11-06 Daniele Pezzini + + * drivers/nutdrv_qx_voltronic-qs.c: nutdrv_qx: update 'voltronic-qs' + subdriver Since, for devices supported by 'voltronic-qs' + subdriver, in reality: - invalid commands or queries are echoed + back, - accepted commands are followed by action without any + further reply, update the subdriver interface accordingly. Also: - + change slightly the way we publish protocol as ups.firmware.aux, - + update F's reply examples and some info_type (ratings; + output.frequency) in QX to NUT table to reflect reality, - increase + version number. + +2015-10-19 Daniele Pezzini + + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: improve 'T' + protocol support in 'voltronic-qs-hex' subdriver Since the last + byte of the reply to the QS query (before the trailing CR) of + devices that implement the 'T' protocol holds in reality ratings + informations (nominal output frequency/voltage and nominal battery + voltage) in its bits, change the 'voltronic-qs-hex' subdriver + accordingly. Also: - change slightly the way we publish protocol as + ups.firmware.aux, - increase version number. + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: simplify + {in,out}put voltage conversion in 'voltronic-qs-hex' In + 'voltronic-qs-hex' subdriver, instead of calculating separately the + fractional and integer part of input and output voltage, do it at + once. Also, increase version number. + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: improve protocol + identification in 'voltronic-qs-hex' Since 'V' protocol, in + reality, never happens to use the encoded version of the reply to + the QS query, but it always uses the plain version already + implemented in 'voltronic-qs' subdriver, remove it from the + identification process of 'voltronic-qs-hex' subdriver. Also, + remove some non-significant entries from the testing table and + increase version number. + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: harmonize + declarations/definitions in 'voltronic-qs-hex' In 'voltronic-qs- + hex' subdriver, the scope of support functions is limited to the + subdriver as rightly stated in forward declarations, so correct + their definitions to reflect that. Also, increase version number. + +2015-10-09 Arnaud Quette + + * docs/nut-qa.txt: Reference Black Duck OpenHUB in QA documentation + Closes networkupstools/nut#192 + +2015-10-08 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: also use __func__ for additional + traces + * drivers/powerware-mib.c: powerware-mib: more comments for RFC + device.event Add more comments on the need to RFC device.event for + some data that are currently published under ups.alarm + * drivers/powerware-mib.c: snmp-ups: improve Eaton 3-phase UPS alarms + reporting Eaton 3phase UPS, using the Powerware MIB, can expose + many new alarms. Also use the standard driver "X.YY" versioning, + and bump subdriver release to "0.85" + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups: fix and improve + the ups.alarms mechanism This mechanism allows to walk a subtree + (array) of alarms, composed of OID references. The object + referenced should not be accessible, but rather when present, this + means that the alarm condition is TRUE. Both ups.status and/or + ups.alarm values can be provided + * drivers/snmp-ups.c: snmp-ups: fix on some snprintf calls Some + snprintf calls are using dynamically allocated variables, which + doesn't work with sizeof + * drivers/snmp-ups.c: snmp-ups: use __func__ in debug messages + * drivers/snmp-ups.c: snmp-ups: nut_snmp_get_oid() returns TRUE on + success + * drivers/snmp-ups.c: snmp-ups: only use snprintf calls instead of + sprintf + * drivers/eaton-mib.c, drivers/snmp-ups.c: snmp-ups: simplify + handling of other alarms outlet, outlet groups and phase alarms + are now using a simplified approach that does not require specific + lookup structure to adapt alarm messages. This applies to Eaton + ePDU G2/G3 + +2015-09-22 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: fix a typo error in debug message + Unknown is spelled with an ending N (reported by Evgeny "Jim" + Klimov, from Eaton) + * drivers/snmp-ups.c: snmp-ups: optimize phase number extraction + efficiency Since we know that we are processing an alarm for a + phase "Lx", don't use strchr, but simply index (reported by Evgeny + "Jim" Klimov, from Eaton) + * docs/nut-names.txt, drivers/eaton-mib.c: snmp-ups: use dash- + separator for out-of-range For the sake of coherence with other + status relative to thresholds, "out of range" frequency status now + also use dash as separator, instead of space + * drivers/eaton-mib.c: Fix a spelling error in comments + * drivers/eaton-mib.c: snmp-ups: fix a typo error on Eaton ePDU G2/G3 + MIB Critical is really spelled critical, and not cricital, as used + in the various status thresholds value-lookup structures (reported + by Evgeny "Jim" Klimov, from Eaton) + * data/cmdvartab: Mention the unit for ambient humidity information + Add an explicit mention that ambient information related to + humidity use the "(percent)" unit + * data/cmdvartab, docs/nut-names.txt: Mention the unit for input + voltage information Add an explicit mention that input information + related to voltage use the "Volts (V)" unit + * data/cmdvartab: Mention the unit for ambient temperature + information Add an explicit mention that ambient information + related to temperature use the "degrees C" unit + +2015-09-18 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: add outlet group identifier for + Eaton ePDU Eaton ePDU can now publish the parent group of each + outlet + * docs/nut-names.txt: Extend outlet collection namespace with group + ID An outlet can now publish the group to which it belongs to + * drivers/snmp-ups.c: snmp-ups: complete nut_snmp_get_{str,int} + These methods now allow to get the value of an OID returned by the + source OID (as for the sysOID). In case of failure (non existent + OID), the functions return the last part of the returned OID (ex: + 1.2.3 => 3) + * drivers/snmp-ups.c: snmp-ups: create a nut_snmp_get_oid() function + This method allows to get the value of an OID which is also an OID + (as for the sysOID), without trying to get the value of the pointed + OID. This will allow to use nut_snmp_get_{int,str}() the get the + value of the pointed OID + +2015-09-17 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: outlet groups type handling for + Eaton ePDU Eaton ePDU can now publish the type of outlet group + * docs/nut-names.txt: Extend outlet group collection namespace with + type The type of outlet group can now be published, part of the + new outlet.group data collection + * drivers/eaton-mib.c: snmp-ups: outlet groups commands for Eaton + ePDU Eaton ePDU can now handle commands outlet groups, including + on, off and reboot (cycle) + * drivers/snmp-ups.c: snmp-ups: fix commands handling for outlet + groups The su_instcmd() function of snmp-ups is now adapted to + support outlet groups + * drivers/eaton-mib.c: Advanced outlets groups alarm handling for + Eaton ePDU Eaton ePDU can now handle alarms on outlets groups, for + voltage and current, relative to the configured thresholds + * drivers/snmp-ups.c: snmp-ups: improvements for outlet groups and + alarms Improve the code for general template management, including + outlets and outlets groups for now, and add alarm management for + outlet groups, the same way as for outlets + +2015-09-16 Arnaud Quette + + * drivers/snmp-ups.c: snmp-ups: fix set variable for outlet groups + The setvar() function of snmp-ups is now adapted to support outlet + groups + * drivers/eaton-mib.c: snmp-ups: outlet groups handling for Eaton + ePDU Eaton ePDU can now handle outlet groups, including voltage + and current (with thresholds and status relative to the configured + thresholds), along with power and realpower. A subsequent commit + will address the alarms, settings and commands. Bump subdriver + version to 0.30 + * drivers/snmp-ups.c: snmp-ups: update debug message The template + guestimation function name was changed, but the debug message was + left with the old function name + +2015-09-15 Arnaud Quette + + * docs/nut-names.txt: Extend NUT namespace with outlet.group + collection A new data collection, called "outlet.group", is now + available. It provides grouped management for a set of outlets. The + same principles and data than the outlet collection apply to + outlet.group + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups: adapt template + mechanisms for outlet groups The template handling mechanisms, + originally created for outlets, is now adapted to also manage + outlet groups + +2015-09-14 root + + * docs/nut-names.txt: Add a note on the outlet.count variable + +2015-09-14 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: add nominal input current for Eaton + ePDU snmp-ups now provides input.[Lx.]current.nominal for Eaton + ePDU G2/G3, both for 1phase and 3phase + * drivers/eaton-mib.c: snmp-ups: better input.power handling for + Eaton ePDUs Improve the way we declare and process input.power, as + previously done for input.realpower, in order to address the + variations between Eaton ePDUs G2 and G3 + +2015-09-11 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: publish part number for Eaton ePDU + device.part was standardized in NUT namespace, so enable the + declaration for Eaton ePDU + * drivers/eaton-mib.c: snmp-ups: 3-phase alarm handling for Eaton + ePDU Eaton ePDU can now handle alarms on 3-phase, currently + limited to voltage and current, relative to the configured + thresholds + * drivers/snmp-ups.c: snmp-ups: implement 3-phase alarm handling + snmp-ups now allows to publish 3-phase alarms in ups.alarm, the + same way as with outlet. Declaration of such alarms are done using + "Lx.alarm". info_lkp_t structures messages are shared templates + with outlets, and use the string formats to include the context + (outlet or phase) and the number (of the outlet or phase) in alarm + messages. These alarms are then published in "ups.alarm", with the + standard mechanism for alarm publication + * docs/nut-names.txt: Extend 3-phase collection namespace with alarms + 3-phase data collection now allows to specify alarms, the same way + than with the outlet collection ("outlet.n.alarm"), but using + "Lx.alarm" (for example "L1.alarm"). These alarms are then + published in "ups.alarm", with the standard mechanism for alarm + publication + * drivers/eaton-mib.c: Advanced threshold handling for Eaton 3-phase + ePDU Eaton ePDU can now handle warning and critical thresholds + settings and status for input voltage and current on 3-phase units. + Alarms are however still to be implement + * docs/nut-names.txt: Extend 3-phase collection namespace with + threshold 3-phase data collection now allows to specify low / high + warning and critical thresholds for voltage and current. Status + relative to the thresholds also exist for these data + +2015-09-07 Arnaud Quette + + * drivers/snmp-ups.c, drivers/snmp-ups.h: snmp-ups: fix loss of + precision when setting values su_setvar() was losing precision + when converting and casting the provided values to send to the SNMP + agent. As an example, with an OID in millivolt (multiplier set to + 0.001), when providing 238 (V) using upsrw, the value sent to the + SNMP agent was 237999, so leaking 0.1 volt + +2015-09-04 Arnaud Quette + + * drivers/dstate.c: Extend ups.alarm internal buffer to 1024 chars + Currently, ups.alarm can hold up to 256 chars to expose alarms. + With the recent outlet alarms handling addition, the buffer may + quickly be to small. Thus, increase to 1024, which may still not + be sufficient but already provides a bit more room + * drivers/eaton-mib.c: snmp-ups: outlet alarm handling for Eaton ePDU + Eaton ePDU can now handle alarms on outlets, currently limited to + outlet voltage and current, relative to the configured thresholds + * drivers/snmp-ups.c: snmp-ups: implement outlets / PDU alarm + handling snmp-ups now allows to publish outlets and PDU alarms in + ups.alarm, the same way as with ups.status. Declaration of such + alarms are done using the outlet template mechanism + ("outlet.%i.alarm"). info_lkp_t structures messages can also use + the string formats to include the outlet number in alarm messages. + These alarms are then published in "ups.alarm", with the standard + mechanism for alarm publication + * docs/nut-names.txt: Extend outlet collection namespace with alarms + Outlet data collection now allows to specify alarms, using the + template definitions ("outlet.n.alarm"). These alarms are then + published in "ups.alarm", with the standard mechanism for alarm + publication + +2015-09-02 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: outlet threshold handling for Eaton + ePDU Eaton ePDU can now handle warning and critical thresholds + settings and status for outlet voltage and current + * docs/nut-names.txt: Extend outlet collection namespace with + threshold Outlet data collection now allows to specify low / high + warning and critical thresholds for voltage and current. Status + relative to the thresholds also exist for these data + +2015-09-01 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: alarms handling for Eaton ePDU + Eaton ePDU can now publish alarms, related to input status + (voltage, frequency and current) and ambient status (temperature + and humidity). Note that alarms are still published under + ups.alarms, though these should belong to either pdu.alarms or + better device.alarms + * drivers/eaton-mib.c: Advanced input threshold handling for Eaton + ePDU Eaton ePDU can now handle warning and critical thresholds + settings and status for input voltage and current, along with the + frequency status + * data/cmdvartab, docs/nut-names.txt: Extend input collection + namespace with threshold Input data collection now allows to + specify low / high warning and critical thresholds for voltage and + current. Status relative to the thresholds also exist for these + data, and for the frequency + +2015-08-31 Arnaud Quette + + * drivers/eaton-mib.c: snmp-ups: ambient dry contacts support for + Eaton ePDU Eaton ambient modules, connected on ePDU, now publish + the status of the connected dry contacts sensors + * data/cmdvartab, docs/nut-names.txt: Extend ambient collection + namespace with dry contacts Ambient data collection now allow to + specify dry contacts sensor status + * drivers/eaton-mib.c: snmp-ups: fix Eaton Pulizzi Switched PDU + multiplier As per the previous commit, to well handle integer RW + variables + * drivers/eaton-mib.c: snmp-ups: ambient threshold handling for Eaton + ePDU Eaton ePDU can now handle warning and critical thresholds and + status for both humidity and temperature + * data/cmdvartab, docs/nut-names.txt: Extend ambient collection + namespace with threshold Ambient data collection now allow to + specify warning and critical thresholds + * drivers/eaton-mib.c: snmp-ups: publish presence of Eaton ambient + sensor Publish the actual presence of ambient sensor for Eaton + ePDU G2 and G3 + * data/cmdvartab, docs/nut-names.txt: Publish the actual presence of + an ambient sensor A new data was created (ambient.present) to + publish the actual presence of an ambient sensor + +2015-10-06 Charles Lepple + + * data/driver.list.in: HCL: Asium P700, Micropower LCD 1000 and Eaton + 5E1100iUSB + +2015-10-06 Daniele Pezzini + + * data/driver.list.in: HCL: LYONN CTB-800V supported by nutdrv_qx + Protocol: 'voltronic-qs-hex' Reference: + https://github.com/networkupstools/nut/pull/230 + +2015-08-22 Mariano + + * drivers/nutdrv_qx_voltronic-qs-hex.c: nutdrv_qx: add support for + LYONN CTB-800V Small protocol validation change in 'voltronic-qs- + hex' subdriver to add support for the protocol used by the LYONN + CTB-800V UPS. + +2015-09-28 Arnaud Quette + + * docs/new-drivers.txt: Fix spacing error + +2015-09-22 Charles Lepple + + * drivers/solis.c, drivers/solis.h: solis: remove additional warnings + The "Waiting" flag is always zero, and several other variables were + not used. + * drivers/solis.c, drivers/solis.h: solis: clean up warnings Comment + out unused constants, and add 'static' and 'const' wherever + possible. + +2015-09-20 Charles Lepple + + * drivers/Makefile.am, drivers/solis.c: solis: math fixes As + mentioned here: https://github.com/networkupstools/nut/pull/235 + +2015-09-19 bsalvador + + * drivers/solis.c, drivers/solis.h: solis: patch for Microsol Back- + Ups BZ1200-BR patch for correct reading for Microsol Back-Ups + BZ1200-BR (rebased onto solis_debug branch, and cleaned up + whitespace. -- CFL) Closes + https://github.com/networkupstools/nut/pull/235 and Closes + https://github.com/networkupstools/nut/pull/236 + +2015-09-16 Arnaud Quette + + * data/driver.list.in, docs/man/snmp-ups.txt, drivers/powerware- + mib.c, drivers/powerware-mib.h, drivers/snmp-ups.c: snmp-ups: add + Eaton Power Xpert Gateway UPS Card This newer generation of SNMP + card is used for BladeUPS or other UPS, and is serving the same + XUPS MIB, as in the "pw" subdriver + * scripts/subdriver/gen-snmp-subdriver.sh: Update SNMP subdriver + generation script Complete the documentation, by adding some notes + and examples ; Fix the MIBs directories list and the "keep + temporary files" option + +2015-09-11 Arnaud Quette + + * drivers/snmp-ups.c: Improve log/debug output trace + +2015-09-08 Charles Lepple + + * drivers/solis.c: solis: resync with end-of-packet character (0.64) + Suggested by @rpvelloso in https://github.com/networkupstools/nut/i + ssues/231#issuecomment-134795747 Note that the driver could + possibly get out-of-sync after initial detection. + +2015-09-07 Charles Lepple + + * docs/man/macosx-ups.txt, drivers/macosx-ups.c: macosx-ups: + gracefully handle disconnection of UPS Tested on 10.9.5 and + 10.10.5. Returns "data stale" when UPS disappears. + +2015-09-07 Arnaud Quette + + * drivers/powerware-mib.c: Bump Powerware SNMP subdriver version + +2015-09-04 Charles Lepple + + * Makefile.am, docs/configure.txt, docs/new-clients.txt, tools/nut- + scanner/README: doc: correct remaining `--with-lib` references + Credit: Paul Vermeer + +2015-09-01 Arnaud Quette + + * drivers/snmp-ups.h: Minor updates to TODO comments + * drivers/snmp-ups.c: Implement ups.alarm for SNMP snmp-ups now + allows to publish alarms in ups.alarm, the same way as with + ups.status + +2015-08-31 Arnaud Quette + + * drivers/snmp-ups.c: Proper handling of integer RW variables RW + variables were previously supposed to always be strings. Thus, the + multiplier (using the info_len field) was not applied. Also allow + setting float values, not only integer + * drivers/snmp-ups.c, drivers/snmp-ups.h: Fix default SNMP retries + and timeout The previous patch was using the default values from + Net-SNMP, which are set to -1. When the user was not providing + overriden values, this was causing the driver to not be able to + establish the communication with the device. The default values are + now fixed, as per documented (i.e. 5 retries and timeout of 1 + second). Also bump the driver version to 0.74 + * docs/man/ups.conf.txt, drivers/dstate.c: Make more obvious the + socket write failure Document the error that require the use of + the 'synchronous' flag. Also use debug level 1 instead of 2 for the + debug message + +2015-08-23 Charles Lepple + + * drivers/solis.c: solis: Add upsdebug*() and upslogx() calls for + diagnostics + +2015-08-18 Kenny Root + + * drivers/powerware-mib.c: Add ups.start.auto for Powerware SNMP Use + the IETF UPS MIB to indicate to Powerware devices that it should + restart when mains power is applied. + * drivers/powerware-mib.c: Fix some indentation problems in PowerWare + SNMP + * drivers/powerware-mib.c: Add shutdown.return for Powerware SNMP + The Powerware MIB supports the concept of shutting down with a + delay and then returning when line power is restored. The delay is + set to 0 seconds currently. + * drivers/powerware-mib.c: Add load.{off,on}.delay for Powerware SNMP + The commands to shut down with delay have existed since the first + version of the Powerware MIB so add the newer commands + "load.off.delay" and "load.on.delay" to aid in shutdown scripts. + +2015-08-07 Arnaud Quette + + * drivers/dummy-ups.c, drivers/dummy-ups.h: Fix dummy-ups for + external value changes dummy-ups allow to change the values of the + publicated variables through the standard upsrw tool. This method + is handy to script value changes, in a controlled way, compared to + the dynamic version (using the TIMER keyword in .dev files), which + changes the values in a non controlled way. Bump driver version to + 0.14 + * m4/nut_check_libnss.m4: Fully check for a working Mozilla NSS + Rework the NSS tests so that just having runtime libraries + installed is not enough. Moreover, since GNU libc6 also provides a + nss.h header, the test now checks for both nss.h and ssl.h Closes + networkupstools/nut#184 + * docs/download.txt: Fix Red Hat / Fedora packages repository URL + +2015-08-03 Tomas Halman + + * clients/nutclient.cpp: Problem: nutclient library sometimes reads + socket closed by server. Solution: proper read return value + evaluation + +2015-08-04 Arnaud Quette + + * tools/nut-scanner/scan_snmp.c: Fix a crash on a 2nd call to + libnutscan on behalf of Tomas Halman, from Eaton Opensource Team + +2015-07-24 Nash Kaminski + + * drivers/tripplitesu.c: tripplitesu: Fix initialization when + tripplite firmware is buggy With some Tripplite SU1000RT2U (and + possibly more) UPS's, a firmware bug causes a malformed response to + the very first command that is sent after the serial port is opened + following a warm or cold boot of the system. My theory is that this + related to either the RS232 data lines or handshaking lines being + pulled high once the server's UART is powered however I have not + determined precisely if this is related to the data line being + pulled high or the handshaking lines being asserted. However, I + have been able to consistently reproduce the issue where the driver + fails to start on the first attempt after a cold/warm boot across 3 + different machines and 2 SU1000RT2U UPS's. To workaround this, the + initial enumeration is repeated a 2nd time after 300ms(to allow all + garbage data to arrive) if the first attempt fails, which allows + the driver to consistently startup successfully on the 1st attempt. + Closes networkupstools/nut#220 + +2015-07-24 Tim Smith + + * INSTALL.nut: Spelling fixes Spelling fixes and capitalization of + SUSE + +2015-07-23 Arnaud Quette + + * scripts/augeas/nutupsconf.aug.tpl: Update Augeas lens for ups.conf + Add the various missing global directives and ups fields + +2015-07-20 Daniele Pezzini + + * data/driver.list.in: HCL: fix case and spacing + +2015-07-18 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: when targeting 'UPS No Ack' + consider also the trailing CR In 'fabula' and 'krauler' USB + subdrivers, take into account also the trailing CR in the reply + while looking for a 'UPS No Ack'. + * drivers/nutdrv_qx.c: nutdrv_qx: stay true to return code in + 'fabula' USB subdriver In 'fabula' USB subdriver, when reading + 'UPS No Ack' from device, since we already mimic a timeout, also + empty the reply. + +2015-07-11 Charles Lepple + + * data/driver.list.in: HCL: Fideltronic INIGO Viper 1200 supported by + nutdrv_qx + +2015-07-02 Charles Lepple + + * drivers/usbhid-ups.c: usbhid-ups: bump version to 0.41 Both the + eaton_dual_reportdesc and usbhid_ups_input_vs_feature branches + claimed version 0.40, so let's disambiguate the merged version. + +2015-07-02 Arnaud Quette + + * drivers/libhid.c: Add a debug trace for the number of HID objects + found + * drivers/hidtypes.h: Fix testing typo MAX_REPORT is really 500 (HID + objects), not 50! + * drivers/hidparser.c: Report when there are further unprocessed HID + objects Following the last commits, and especially the MAX_REPORT + one, warn whenever there are remaining HID objects that were not + processed. This may serve + * drivers/hidtypes.h: Increase the maximum number of HID objects The + previous value (300) was causing a trim of the remaining objects. + Increase the value to 500, which should give a bit of time + * drivers/libshut.c, drivers/libshut.h, drivers/libusb.c, drivers + /usb-common.h, drivers/usbhid-ups.c: Add support for Eaton dual HID + report descriptor All devices use HID descriptor at index 0. + However, some newer Eaton units have a light HID descriptor at + index 0, and the full version is at index 1 (in which case, + bcdDevice == 0x0202). This dual report descriptor approach is due + to the fact that the main report descriptor is now too heavy, and + cause some BIOS to hang. A light version is thus provided at the + default index, solving this BIOS issues + +2015-06-27 Charles Lepple + + * drivers/macosx-ups.c: macosx-ups: fix for 10.10 (Yosemite); v1.1 + In OS X 10.9 and earlier, IOPSGetPowerSourcesInfo() returned a + CFDictionary. In 10.10 it returns a CFArray. Programmers are + supposed to use IOPSGetPowerSourceDescription() to gloss over this + distinction. However, this does not make it easy to distinguish + between a laptop battery and an UPS. So the "port" driver option no + longer has any effect. https://developer.apple.com/library/mac/doc + umentation/IOKit/Reference/IOPowerSources_header_reference/#//apple + _ref/c/func/IOPSGetPowerSourceDescription + +2015-06-22 Arnaud Quette + + * scripts/upower/95-upower-hid.rules, tools/nut-usbinfo.pl: Update + UPower HID rules and generator + +2015-06-11 Charles Lepple + + * drivers/usbhid-ups.c: usbhid-ups.c: fall back to HID Input type if + not a Feature + +2015-06-07 Charles Lepple + + * drivers/tripplite-hid.c: tripplite-hid.c: device.part is static + (version 0.82) + +2015-06-04 Daniele Pezzini + + * drivers/nutdrv_qx.c: nutdrv_qx: make sure processed item's + boundaries are not wrong + +2015-04-26 Nick Mayerhofer + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h: nutdrv_qx: improve documentation for some + methods + +2015-06-04 Daniele Pezzini + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h: nutdrv_qx: remove redundant comments and + update docs + +2015-04-28 Nick Mayerhofer + + * drivers/nutdrv_qx_voltronic.c: nutdrv_qx: move var declaration in + 'voltronic' subdriver Move variable declaration to fulfill + condition '3.3. Portability' of the developer guide. Bump version. + * drivers/libhid.c: libhid: replace "flush loop" with memset Move to + the C way of setting memory (memset), replacing a for loop with a + few anti-patterns in it: - for (...; ; i++) - for (...; i < + MAGIC_NUMBER; ...) - for (...) array[i] = 0 + +2015-05-18 Daniele Pezzini + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h, drivers/nutdrv_qx_bestups.c, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs-hex.c, + drivers/nutdrv_qx_voltronic-qs.c, drivers/nutdrv_qx_voltronic.c, + drivers/nutdrv_qx_zinto.c: nutdrv_qx: give subdrivers a last chance + to process the command Add (and document) a new function + ('preprocess_command()') to preprocess the command to be sent to + the device, just before the actual sending and, in case of instant + commands/setvars, after the 'preprocess()' function has been + triggered (if appropriate). As an example, this function can be + useful to add to all commands (both queries and instant + commands/setvars) a CRC or to fill the command of a query with some + data. Also, in qx_process(), address buf size vs item->answer size + earlier. Update all subdrivers accordingly, bump versions. + +2015-06-01 Arnaud Quette + + * docs/man/snmp-ups.txt, drivers/snmp-ups.c, drivers/snmp-ups.h: + Provide access to Net-SNMP timeout and retries Two new extra + arguments are now available to allow overriding Net-SNMP number of + retries (snmp_retries) and timeout per retry (snmp_timeout). These + respectively maps to snmpcmd "-r retries" and "-t timeout" + +2015-05-29 Arnaud Quette + + * scripts/upower/95-upower-hid.rules: Update UPower HID rules + * tools/nut-usbinfo.pl: Fix UPower device matching for recent kernels + As per the UPower patch below referenced, hiddev* devices now have + class "usbmisc", rather than "usb". See + http://cgit.freedesktop.org/upower/commit/rules/95-upower- + hid.rules?id=9f31068707fc79744961cea7258b0eb262effbf1 + +2015-05-28 Arnaud Quette + + * tools/nut-scanner/nut-scan.h, tools/nut-scanner/nut-scanner.c, + tools/nut-scanner/nutscan-device.c, tools/nut-scanner/nutscan- + device.h, tools/nut-scanner/nutscan-display.c, tools/nut-scanner + /nutscan-init.c, tools/nut-scanner/nutscan-init.h, tools/nut- + scanner/nutscan-ip.c, tools/nut-scanner/nutscan-ip.h, tools/nut- + scanner/nutscan-serial.c, tools/nut-scanner/nutscan-serial.h, tools + /nut-scanner/scan_avahi.c, tools/nut-scanner/scan_eaton_serial.c, + tools/nut-scanner/scan_ipmi.c, tools/nut-scanner/scan_nut.c, tools + /nut-scanner/scan_snmp.c, tools/nut-scanner/scan_usb.c, tools/nut- + scanner/scan_xml_http.c: Fix legal information on source-code + headers Copyright and author were not mentioned as it should be. + Most of the nut-scanner copyright belongs to EATON, apart from few + parts. Files descriptions are now also in Doxygen format + +2015-05-18 Daniele Pezzini + + * docs/nutdrv_qx-subdrivers.txt, drivers/nutdrv_qx.c, + drivers/nutdrv_qx.h, drivers/nutdrv_qx_bestups.c, drivers + /nutdrv_qx_blazer-common.c, drivers/nutdrv_qx_blazer-common.h, + drivers/nutdrv_qx_mecer.c, drivers/nutdrv_qx_megatec-old.c, + drivers/nutdrv_qx_megatec.c, drivers/nutdrv_qx_mustek.c, + drivers/nutdrv_qx_q1.c, drivers/nutdrv_qx_voltronic-qs-hex.c, + drivers/nutdrv_qx_voltronic-qs.c, drivers/nutdrv_qx_voltronic.c, + drivers/nutdrv_qx_zinto.c: nutdrv_qx: make preprocessed value's + size_t a const There's no need to intervene on the passed-to-the- + function value of a preprocessed value's size_t, so clarify it is a + const. Update all subdrivers accordingly, bump versions. + * drivers/nutdrv_qx.c: nutdrv_qx: make sure an answer is not reused + if preprocess_answer() fails If an item's preprocess_answer() + function fails, the answer should not be considered valid and + inherited by the following items with the same command. Therefore, + on failure, clear the answer so that the following items are forced + to query the device and preprocess the answer anew, if appropriate. + +2015-05-13 Arnaud Quette + + * docs/download.txt: Update NUT packages for Windows to 2.6.5-6 + +2015-05-07 Arnaud Quette + + * scripts/systemd/nut-server.service.in: Restore systemd relationship + with nut-driver service The Requires directive from nut-server to + nut-driver was previously removed, since it was preventing upsd + from starting whenever one or more drivers, among several, was + failing to start. Use the Wants directive, a weaker version of + Requires, which will start upsd even if the nut-driver unit fails + to start. closes https://github.com/networkupstools/nut/issues/200 + +2015-04-23 Arnaud Quette + + * Makefile.am: Cleanup GPG signature before generation + 2015-04-22 Arnaud Quette + * configure.ac: bump version back to 2.7.3.1 * configure.ac: Restore version 2.7.3 for release * docs/security.txt: Missing link reference update The filename of the previous GPG release key was not updated, leading to pointing @@ -146,6 +1231,17 @@ historic CHRG and DISCHRG flags are not published anymore in ups.status +2015-03-26 Stuart Henderson + + * data/driver.list.in, docs/man/snmp-ups.txt, docs/snmp- + subdrivers.txt, drivers/Makefile.am, drivers/huawei-mib.c, drivers + /huawei-mib.h, drivers/snmp-ups.c: snmp-ups: new subdriver for + Huawei "Hi, the [commit] below adds a new subdriver for snmp-ups + to support Huawei UPS, based on an observed walk from a UPS5000-E + with a few bits filled in from the MIBs (copy at + http://junkpile.org/HUAWEI_UPS_MIB/)." http://news.gmane.org/find- + root.php?message_id=slrnmh6npf.tg7.stu%40naiad.spacehopper.org + 2015-03-25 Daniele Pezzini * drivers/nutdrv_qx_voltronic.c: nutdrv_qx: add support in @@ -1051,6 +2147,10 @@ * NEWS, UPGRADING, configure.ac: Update for release 2.7.2 Complete the release information for NUT 2.7.2 +2014-04-17 Stephen J. Butler + + * drivers/tripplite-hid.c: Scale for SMART1500LCDT + 2014-04-07 Arnaud Quette * drivers/compaq-mib.c: Fix erroneous status in HP/Compaq SNMP MIB diff --git a/INSTALL.nut b/INSTALL.nut index 160b558..202d1af 100644 --- a/INSTALL.nut +++ b/INSTALL.nut @@ -207,8 +207,8 @@ Debian, Ubuntu and other derivatives NOTE: NUT is packaged and well maintained in these systems. The official Debian packager is part of the NUT Team. -Using your prefered method (apt-get, aptitude, Synaptic, ...), install -the 'nut' package, and optionaly the following: +Using your preferred method (apt-get, aptitude, Synaptic, ...), install +the 'nut' package, and optionally the following: - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-snmp', if you need the snmp-ups driver, @@ -233,32 +233,32 @@ Mandriva NOTE: NUT is packaged and well maintained in these systems. The official Mandriva packager is part of the NUT Team. -Using your prefered method (urpmi, RPMdrake, ...), install one of the two below +Using your preferred method (urpmi, RPMdrake, ...), install one of the two below packages: - 'nut-server' if you have a 'standalone' or 'netserver' installation, - 'nut' if you have a 'netclient' installation. -Optionaly, you can also install the following: +Optionally, you can also install the following: - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-devel', if you need the development files. -[[Suse]] -Suse / Opensuse +[[SUSE]] +SUSE / openSUSE ~~~~~~~~~~~~~~~ NOTE: NUT is packaged and well maintained in these systems. -The official Suse packager is part of the NUT Team. +The official SUSE packager is part of the NUT Team. -Install the 'nut-classic' package, and optionaly the following: +Install the 'nut-classic' package, and optionally the following: - 'nut-drivers-net', if you need the snmp-ups or the netxml-ups drivers, - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-devel', if you need the development files, -NOTE: Suse and Opensuse users can use the +NOTE: SUSE and openSUSE users can use the link:http://software.opensuse.org/search?baseproject=ALL&p=1&q=nut[one-click install method] to install NUT. @@ -270,13 +270,13 @@ Red Hat, Fedora and CentOS NOTE: NUT is packaged and well maintained in these systems. The official Red Hat packager is part of the NUT Team. -Using your prefered method (yum, Add/Remove Software, ...), install one of the +Using your preferred method (yum, Add/Remove Software, ...), install one of the two below packages: - 'nut' if you have a 'standalone' or 'netserver' installation, - 'nut-client' if you have a 'netclient' installation. -Optionaly, you can also install the following: +Optionally, you can also install the following: - 'nut-cgi', if you need the CGI (HTML) option, - 'nut-xml', if you need the netxml-ups driver, @@ -306,7 +306,7 @@ To install it, use the following command: You have to define WITH_NUT_CGI to build the optional CGI scripts. -Optionaly, you can also install the following ports: +Optionally, you can also install the following ports: - sysutils/nut-snmp, for the SNMP driver, - sysutils/nut-usb, for the USB drivers, diff --git a/Makefile.am b/Makefile.am index aebe618..dd9ec33 100644 --- a/Makefile.am +++ b/Makefile.am @@ -56,6 +56,7 @@ ChangeLog: tools/gitlog2changelog.py dummy-stamp # ---------------------------------------------------------------------- # Maintainers targets: distribution signature and hashes dist-sig: + rm -f nut-@PACKAGE_VERSION@.tar.gz.sig gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz dist-hash: @@ -107,7 +108,7 @@ install-cgi-man install-cgi-conf install-cgi-html: @echo "Use './configure --with-cgi' instead." install-lib: @echo "Error: 'make $@' no longer exists." - @echo "Use './configure --with-lib' instead." + @echo "Use './configure --with-dev' instead." usb build-usb install-usb: @echo "Error: 'make $@' no longer exists." @echo "Use './configure --with-usb' instead." diff --git a/Makefile.in b/Makefile.in index 44ffd6b..6b39990 100644 --- a/Makefile.in +++ b/Makefile.in @@ -273,6 +273,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ @@ -931,6 +932,7 @@ ChangeLog: tools/gitlog2changelog.py dummy-stamp # ---------------------------------------------------------------------- # Maintainers targets: distribution signature and hashes dist-sig: + rm -f nut-@PACKAGE_VERSION@.tar.gz.sig gpg --detach-sign nut-@PACKAGE_VERSION@.tar.gz dist-hash: @@ -976,7 +978,7 @@ install-cgi-man install-cgi-conf install-cgi-html: @echo "Use './configure --with-cgi' instead." install-lib: @echo "Error: 'make $@' no longer exists." - @echo "Use './configure --with-lib' instead." + @echo "Use './configure --with-dev' instead." usb build-usb install-usb: @echo "Error: 'make $@' no longer exists." @echo "Use './configure --with-usb' instead." diff --git a/NEWS b/NEWS index 1e6fbde..216c835 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,124 @@ If you're upgrading from an earlier version, see the UPGRADING file. For a complete and more detailed list of changes, please refer to the ChangeLog file. +--------------------------------------------------------------------------- +Release notes for NUT 2.7.4 - what's new since 2.7.3: + + - New class of device supported: ATS - Automatic Transfer Switch are now + supported in NUT. Eaton ATS are supported, and APC ones should be too. Users + are welcomed to test and provide feedback + + - NUT command and variable naming scheme: + * Document battery.charger.status, which will in time replace the historic + CHRG and DISCHRG flags published in ups.status + * Many extensions to support outlets groups, thresholds / alarms (ambient, + input, output, outlet and outlet.group) + + - support for new devices: + AEG PROTECT B / NAS + APC ATS AP7724 (should be supported) + Asium P700 + Eaton ATS + Eaton 5E 1100iUSB + Eaton E Series DX UPS 1-20 kVA + Eaton Powerware 9125-5000g + Electrys UPS 2500 + Fideltronic INIGO Viper 1200 + Legrand Keor Multiplug + LYONN CTB-800V + Micropower LCD 1000 + NHS Laser Senoidal 5000VA + Sweex model P220 + TS Shara + Various APCUPSD-controlled APC devices + + - snmp-ups: + * Improve automatic detection algorithm + * Provide access to Net-SNMP timeout and retries + * Proper handling of integer RW variables + * Implement support for alarms, through ups.alarm and outlet.n.alarm + * Improve log/debug output trace + * Fix loss of precision when setting values, using upsrw + * Support for outlets group management + * Many improvements and simplification + * Add support for Tripplite units using IETF mib + * Improve communication staleness detection and recovery + * Add devices MAC address publication + * Register values enumerations, when available + * Many improvements and fixes to the SNMP subdriver creation script + + - Eaton: + * 3ph SNMP: + Many improvements to Powerware / XUPS MIB, for data and commands + Add support for Eaton Power Xpert Gateway UPS Card + Improve support for temperature and humidity, including low / high values + Alarms handling + * ePDU (G2 and G3): + Improve support for ambient sensor, including thresholds and dry contacts + Outlet groups handling, including data, thresholds, settings and commands + Alarms handling + * XML/PDC (netxml-ups): + Fix Eaton XML published data + Add some settings (R/W flags) on ambient thresholds + + - bcmxcp_usb: improvements for device claiming and multi-packets responses + + - dummy-ups: allow any variable to be modified + + - libnutclient: Fix for reads when the socket was closed by NUT server + + - macosx-ups: + * fix for 10.10 (Yosemite), v1.1 + * gracefully handle disconnection of UPS (return "data stale") + + - nutdrv_atcl_usb: point to nutdrv_qx (fuji) for 0001:0000 + + - nutdrv_qx: + * Add new 'sgs' USB subdriver to support TS Shara units + * various improvements and simplification, to the code and documentation + + - nut-ipmipsu: improve FreeIPMI support + + - nut-scanner: + * Don't depend on development libraries, by looking at some known paths, + including the one provided through --libdir, to find the correct libraries + * Fix a crash on a 2nd call to libnutscan with SNMP method + + - powercom: fix the processing of input and output voltage for KIN units + + - solis: + * many improvements and cleanup + * resync with end-of-packet character + * fixes for Microsol Back-Ups BZ1200-BR + + - tripplitesu: Fix initialization when tripplite firmware is buggy (for + Tripplite SU1000RT2U and possibly more) + + - usbhid-ups: + * various minor improvements + * support for Eaton UPS with dual HID report descriptor in HID Parser + * handle missing USB strings in APC code + + - SSL support through Mozilla NSS: Rework the NSS tests to ensure that NSS is + actually installed and usable for enabling SSL support in NUT + + - Augeas support: Augeas lens for ups.conf was updated to add various missing + global directives and ups fields + + - scripts/systemd/nut-server.service.in: Restore systemd relationship since it + was preventing upsd from starting whenever one or more drivers, among several, + was failing to start + + - Fix UPower device matching for recent kernels, since hiddev* devices now have + class "usbmisc", rather than "usb" + + - Network protocol information: default to type NUMBER for variables that are + not flagged as STRING . This point is subject to improvements or change in + the next release 2.7.5. Refer to docs/net-protocol.txt for more information + + - As usual, more bugfixes, cleanup and improvements, on both source code + and documentation. + --------------------------------------------------------------------------- Release notes for NUT 2.7.3 - what's new since 2.7.2: @@ -323,7 +441,7 @@ Release notes for NUT 2.6.4 - what's new since 2.6.3: - bestups has also received some care, though users are encouraged to switch to blazer_ser, since bestups will soon be deprecated. - - newmge-shut has been heavilly improved. However, replacement of the + - newmge-shut has been heavily improved. However, replacement of the current mge-shut has been postponed to the next release, due to the CVE issue. diff --git a/UPGRADING b/UPGRADING index 3b14a40..03cf410 100644 --- a/UPGRADING +++ b/UPGRADING @@ -7,6 +7,22 @@ This file lists changes that affect users who installed older versions of this software. When upgrading from an older version, be sure to check this file to see if you need to make changes to your system. +Changes from 2.7.3 to 2.7.4 +--------------------------- + +- scripts/systemd/nut-server.service.in: Restore systemd relationship since it + was preventing upsd from starting whenever one or more drivers, among several, + was failing to start + +- Fix UPower device matching for recent kernels, since hiddev* devices now have + class "usbmisc", rather than "usb" + +- macosx-ups: the "port" driver option no longer has any effect + +- Network protocol information: default to type NUMBER for variables that are + not flagged as STRING . This point is subject to improvements or change in + the next release 2.7.5. Refer to docs/net-protocol.txt for more information + Changes from 2.7.2 to 2.7.3 --------------------------- @@ -191,7 +207,7 @@ automake). Refer to packaging/debian/ for an example of migration. ie not using upsdrvctl. - Developers of external client application using libupsclient are encouraged to rename the "UPSCONN" client structure to "UPSCONN_t" -since the former will disapear by the release of NUT 2.4. +since the former will disappear by the release of NUT 2.4. Changes from 2.0.4 to 2.0.5 --------------------------- diff --git a/clients/Makefile.in b/clients/Makefile.in index 7e58b62..0a7949e 100644 --- a/clients/Makefile.in +++ b/clients/Makefile.in @@ -366,6 +366,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/clients/nutclient.cpp b/clients/nutclient.cpp index dcf0c2d..8304473 100644 --- a/clients/nutclient.cpp +++ b/clients/nutclient.cpp @@ -374,6 +374,11 @@ std::string Socket::read()throw(nut::IOException) // Read new buffer size_t sz = read(&buff, 256); + if(sz==0) + { + disconnect(); + throw nut::IOException("Server closed connection unexpectedly"); + } _buffer.assign(buff, sz); } } diff --git a/clients/upsrw.c b/clients/upsrw.c index 8113690..3a0efb4 100644 --- a/clients/upsrw.c +++ b/clients/upsrw.c @@ -366,6 +366,11 @@ static void do_type(const char *varname) } + if (!strcasecmp(answer[i], "NUMBER")) { + printf("Type: NUMBER\n"); + return; + } + /* ignore this one */ if (!strcasecmp(answer[i], "RW")) { continue; diff --git a/common/Makefile.am b/common/Makefile.am index f85244c..2bfc6e0 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -9,8 +9,8 @@ libparseconf_la_SOURCES = parseconf.c # 'dist', and is only required for actual build, in which case # BUILT_SOURCES (in ../include) will ensure nut_version.h will # be built before anything else -libcommon_la_SOURCES = common.c state.c upsconf.c -libcommonclient_la_SOURCES = common.c state.c +libcommon_la_SOURCES = common.c state.c str.c upsconf.c +libcommonclient_la_SOURCES = common.c state.c str.c # ensure inclusion of local implementation of missing systems functions # using LTLIBOBJS. Refer to configure.in -> AC_REPLACE_FUNCS libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@ diff --git a/common/Makefile.in b/common/Makefile.in index 6a5149e..8710560 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -82,8 +82,8 @@ build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = common -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am strerror.c \ - atexit.c setenv.c snprintf.c $(top_srcdir)/depcomp +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am atexit.c \ + snprintf.c setenv.c strerror.c $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ @@ -114,14 +114,14 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libcommon_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@ -am_libcommon_la_OBJECTS = common.lo state.lo upsconf.lo +am_libcommon_la_OBJECTS = common.lo state.lo str.lo upsconf.lo libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libcommonclient_la_DEPENDENCIES = libparseconf.la @LTLIBOBJS@ -am_libcommonclient_la_OBJECTS = common.lo state.lo +am_libcommonclient_la_OBJECTS = common.lo state.lo str.lo libcommonclient_la_OBJECTS = $(am_libcommonclient_la_OBJECTS) libparseconf_la_LIBADD = am_libparseconf_la_OBJECTS = parseconf.lo @@ -241,6 +241,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ @@ -382,8 +383,8 @@ libparseconf_la_SOURCES = parseconf.c # 'dist', and is only required for actual build, in which case # BUILT_SOURCES (in ../include) will ensure nut_version.h will # be built before anything else -libcommon_la_SOURCES = common.c state.c upsconf.c -libcommonclient_la_SOURCES = common.c state.c +libcommon_la_SOURCES = common.c state.c str.c upsconf.c +libcommonclient_la_SOURCES = common.c state.c str.c # ensure inclusion of local implementation of missing systems functions # using LTLIBOBJS. Refer to configure.in -> AC_REPLACE_FUNCS libcommon_la_LIBADD = libparseconf.la @LTLIBOBJS@ @@ -456,6 +457,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseconf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upsconf.Plo@am__quote@ .c.o: diff --git a/common/common.c b/common/common.c index d7c74d3..6637113 100644 --- a/common/common.c +++ b/common/common.c @@ -584,47 +584,6 @@ char *xstrdup(const char *string) return p; } -/* modify in - strip all trailing instances of */ -char *rtrim(char *in, const char sep) -{ - char seps[2] = { sep, '\0' }; - - return rtrim_m(in, seps); -} - -/* modify in - strip all trailing instances of each char in */ -char *rtrim_m(char *in, const char *seps) -{ - char *p; - - if (in && strlen(in)) { - p = &in[strlen(in) - 1]; - - while ((p >= in) && (strchr(seps, *p) != NULL)) - *p-- = '\0'; - } - return in; -} - -/* modify in - strip all leading instances of */ -char* ltrim(char *in, const char sep) -{ - char seps[2] = { sep, '\0' }; - - return ltrim_m(in, seps); -} - -/* modify in - strip all leading instances of each char in */ -char* ltrim_m(char *in, const char *seps) -{ - if (in && strlen(in)) { - while ((*in != '\0') && (strchr(seps, *in) != NULL)) - memmove(in, in + 1, strlen(in)); - } - - return in; -} - /* Read up to buflen bytes from fd and return the number of bytes read. If no data is available within d_sec + d_usec, return 0. On error, a value < 0 is returned (errno indicates error). */ diff --git a/common/str.c b/common/str.c new file mode 100644 index 0000000..092efcf --- /dev/null +++ b/common/str.c @@ -0,0 +1,607 @@ +/* str.c - Common string-related functions + * + * Copyright (C) + * 2000 Russell Kroll + * 2015 Daniele Pezzini + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +#include "str.h" + +char *str_trim(char *string, const char character) +{ + return str_rtrim(str_ltrim(string, character), character); +} + +char *str_trim_m(char *string, const char *characters) +{ + return str_rtrim_m(str_ltrim_m(string, characters), characters); +} + +char *str_ltrim(char *string, const char character) +{ + char characters[2] = { character, '\0' }; + + return str_ltrim_m(string, characters); +} + +char *str_ltrim_m(char *string, const char *characters) +{ + if ( + string == NULL || + *string == '\0' || + characters == NULL || + *characters == '\0' + ) + return string; + + while ( + *string != '\0' && + strchr(characters, *string) != NULL + ) + memmove(string, string + 1, strlen(string)); + + return string; +} + +char *str_rtrim(char *string, const char character) +{ + char characters[2] = { character, '\0' }; + + return str_rtrim_m(string, characters); +} + +char *str_rtrim_m(char *string, const char *characters) +{ + char *ptr; + + if ( + string == NULL || + *string == '\0' || + characters == NULL || + *characters == '\0' + ) + return string; + + ptr = &string[strlen(string) - 1]; + + while ( + ptr >= string && + strchr(characters, *ptr) != NULL + ) + *ptr-- = '\0'; + + return string; +} + +char *str_trim_space(char *string) +{ + return str_rtrim_space(str_ltrim_space(string)); +} + +char *str_ltrim_space(char *string) +{ + if ( + string == NULL || + *string == '\0' + ) + return string; + + while ( + *string != '\0' && + isspace(*string) + ) + memmove(string, string + 1, strlen(string)); + + return string; +} + +char *str_rtrim_space(char *string) +{ + char *ptr; + + if ( + string == NULL || + *string == '\0' + ) + return string; + + ptr = &string[strlen(string) - 1]; + + while ( + ptr >= string && + isspace(*ptr) + ) + *ptr-- = '\0'; + + return string; +} + +int str_is_short(const char *string, const int base) +{ + short number; + + return str_to_short(string, &number, base); +} + +int str_is_short_strict(const char *string, const int base) +{ + short number; + + return str_to_short_strict(string, &number, base); +} + +int str_is_ushort(const char *string, const int base) +{ + unsigned short number; + + return str_to_ushort(string, &number, base); +} + +int str_is_ushort_strict(const char *string, const int base) +{ + unsigned short number; + + return str_to_ushort_strict(string, &number, base); +} + +int str_is_int(const char *string, const int base) +{ + int number; + + return str_to_int(string, &number, base); +} + +int str_is_int_strict(const char *string, const int base) +{ + int number; + + return str_to_int_strict(string, &number, base); +} + +int str_is_uint(const char *string, const int base) +{ + unsigned int number; + + return str_to_uint(string, &number, base); +} + +int str_is_uint_strict(const char *string, const int base) +{ + unsigned int number; + + return str_to_uint_strict(string, &number, base); +} + +int str_is_long(const char *string, const int base) +{ + long number; + + return str_to_long(string, &number, base); +} + +int str_is_long_strict(const char *string, const int base) +{ + long number; + + return str_to_long_strict(string, &number, base); +} + +int str_is_ulong(const char *string, const int base) +{ + unsigned long number; + + return str_to_ulong(string, &number, base); +} + +int str_is_ulong_strict(const char *string, const int base) +{ + unsigned long number; + + return str_to_ulong_strict(string, &number, base); +} + +int str_is_double(const char *string, const int base) +{ + double number; + + return str_to_double(string, &number, base); +} + +int str_is_double_strict(const char *string, const int base) +{ + double number; + + return str_to_double_strict(string, &number, base); +} + +int str_to_short(const char *string, short *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long(string, &num, base)) + return 0; + + if ( + num < SHRT_MIN || + num > SHRT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_short_strict(const char *string, short *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long_strict(string, &num, base)) + return 0; + + if ( + num < SHRT_MIN || + num > SHRT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_ushort(const char *string, unsigned short *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong(string, &num, base)) + return 0; + + if (num > USHRT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_ushort_strict(const char *string, unsigned short *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong_strict(string, &num, base)) + return 0; + + if (num > USHRT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_int(const char *string, int *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long(string, &num, base)) + return 0; + + if ( + num < INT_MIN || + num > INT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_int_strict(const char *string, int *number, const int base) +{ + long num; + + *number = 0; + + if (!str_to_long_strict(string, &num, base)) + return 0; + + if ( + num < INT_MIN || + num > INT_MAX + ) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_uint(const char *string, unsigned int *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong(string, &num, base)) + return 0; + + if (num > UINT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_uint_strict(const char *string, unsigned int *number, const int base) +{ + unsigned long num; + + *number = 0; + + if (!str_to_ulong_strict(string, &num, base)) + return 0; + + if (num > UINT_MAX) { + errno = ERANGE; + return 0; + } + + *number = num; + return 1; +} + +int str_to_long(const char *string, long *number, const int base) +{ + char *str; + + *number = 0; + + if ( + string == NULL || + *string == '\0' + ) { + errno = EINVAL; + return 0; + } + + str = strdup(string); + if (str == NULL) + return 0; + + str_trim_space(str); + + if (!str_to_long_strict(str, number, base)) { + free(str); + return 0; + } + + free(str); + return 1; +} + +int str_to_long_strict(const char *string, long *number, const int base) +{ + char *ptr = NULL; + + *number = 0; + + if ( + string == NULL || + *string == '\0' || + isspace(*string) + ) { + errno = EINVAL; + return 0; + } + + errno = 0; + *number = strtol(string, &ptr, base); + + if ( + errno == EINVAL || + *ptr != '\0' + ) { + *number = 0; + errno = EINVAL; + return 0; + } + + if (errno == ERANGE) { + *number = 0; + return 0; + } + + return 1; +} + +int str_to_ulong(const char *string, unsigned long *number, const int base) +{ + char *str; + + *number = 0; + + if ( + string == NULL || + *string == '\0' + ) { + errno = EINVAL; + return 0; + } + + str = strdup(string); + if (str == NULL) + return 0; + + str_trim_space(str); + + if (!str_to_ulong_strict(str, number, base)) { + free(str); + return 0; + } + + free(str); + return 1; +} + +int str_to_ulong_strict(const char *string, unsigned long *number, const int base) +{ + char *ptr = NULL; + + *number = 0; + + if ( + string == NULL || + *string == '\0' || + *string == '+' || + *string == '-' || + isspace(*string) + ) { + errno = EINVAL; + return 0; + } + + errno = 0; + *number = strtoul(string, &ptr, base); + + if ( + errno == EINVAL || + *ptr != '\0' + ) { + *number = 0; + errno = EINVAL; + return 0; + } + + if (errno == ERANGE) { + *number = 0; + return 0; + } + + return 1; +} + +int str_to_double(const char *string, double *number, const int base) +{ + char *str; + + *number = 0; + + if ( + string == NULL || + *string == '\0' + ) { + errno = EINVAL; + return 0; + } + + str = strdup(string); + if (str == NULL) + return 0; + + str_trim_space(str); + + if (!str_to_double_strict(str, number, base)) { + free(str); + return 0; + } + + free(str); + return 1; +} + +int str_to_double_strict(const char *string, double *number, const int base) +{ + char *ptr = NULL; + + *number = 0; + + if ( + string == NULL || + *string == '\0' || + isspace(*string) + ) { + errno = EINVAL; + return 0; + } + + switch (base) + { + case 0: + break; + case 10: + if (strlen(string) != strspn(string, "-+.0123456789Ee")) { + errno = EINVAL; + return 0; + } + break; + case 16: + if (strlen(string) != strspn(string, "-+.0123456789ABCDEFabcdefXxPp")) { + errno = EINVAL; + return 0; + } + break; + default: + errno = EINVAL; + return 0; + } + + errno = 0; + *number = strtod(string, &ptr); + + if ( + errno == EINVAL || + *ptr != '\0' + ) { + *number = 0; + errno = EINVAL; + return 0; + } + + if (errno == ERANGE) { + *number = 0; + return 0; + } + + return 1; +} diff --git a/conf/Makefile.in b/conf/Makefile.in index 4afc1f8..cc5884c 100644 --- a/conf/Makefile.in +++ b/conf/Makefile.in @@ -220,6 +220,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/configure b/configure index 3210ecd..f70451d 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for nut 2.7.3. +# Generated by GNU Autoconf 2.69 for nut 2.7.4. # # Report bugs to . # @@ -590,8 +590,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nut' PACKAGE_TARNAME='nut' -PACKAGE_VERSION='2.7.3' -PACKAGE_STRING='nut 2.7.3' +PACKAGE_VERSION='2.7.4' +PACKAGE_STRING='nut 2.7.4' PACKAGE_BUGREPORT='https://github.com/networkupstools/nut/issues' PACKAGE_URL='' @@ -652,6 +652,7 @@ RUN_AS_USER PORT SBINDIR DRVPATH +LIBDIR BINDIR CONFPATH STATEPATH @@ -1511,7 +1512,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures nut 2.7.3 to adapt to many kinds of systems. +\`configure' configures nut 2.7.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1582,7 +1583,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of nut 2.7.3:";; + short | recursive ) echo "Configuration of nut 2.7.4:";; esac cat <<\_ACEOF @@ -1784,7 +1785,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -nut configure 2.7.3 +nut configure 2.7.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2374,7 +2375,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by nut $as_me 2.7.3, which was +It was created by nut $as_me 2.7.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3493,7 +3494,7 @@ fi # Define the identity of the package. PACKAGE='nut' - VERSION='2.7.3' + VERSION='2.7.4' cat >>confdefs.h <<_ACEOF @@ -10271,32 +10272,33 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${LIBS}" >&5 $as_echo "${LIBS}" >&6; } - for ac_header in nss.h -do : - ac_fn_c_check_header_compile "$LINENO" "nss.h" "ac_cv_header_nss_h" "$ac_includes_default -" -if test "x$ac_cv_header_nss_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NSS_H 1 -_ACEOF - nut_have_libnss=yes -else - nut_have_libnss=no -fi - -done - - for ac_func in NSS_Init + for ac_func in NSS_Init do : ac_fn_c_check_func "$LINENO" "NSS_Init" "ac_cv_func_NSS_Init" if test "x$ac_cv_func_NSS_Init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NSS_INIT 1 +_ACEOF + nut_have_libnss=yes +else + nut_have_libnss=no +fi +done + + for ac_header in nss.h ssl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else nut_have_libnss=no fi + done @@ -10601,32 +10603,33 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${LIBS}" >&5 $as_echo "${LIBS}" >&6; } - for ac_header in nss.h -do : - ac_fn_c_check_header_compile "$LINENO" "nss.h" "ac_cv_header_nss_h" "$ac_includes_default -" -if test "x$ac_cv_header_nss_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NSS_H 1 -_ACEOF - nut_have_libnss=yes -else - nut_have_libnss=no -fi - -done - - for ac_func in NSS_Init + for ac_func in NSS_Init do : ac_fn_c_check_func "$LINENO" "NSS_Init" "ac_cv_func_NSS_Init" if test "x$ac_cv_func_NSS_Init" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NSS_INIT 1 +_ACEOF + nut_have_libnss=yes +else + nut_have_libnss=no +fi +done + + for ac_header in nss.h ssl.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else nut_have_libnss=no fi + done @@ -23333,6 +23336,16 @@ cat >>confdefs.h <<_ACEOF _ACEOF +conftemp="${libdir}" +eval conftemp=\"${conftemp}\" +eval conftemp=\"${conftemp}\" +LIBDIR=${conftemp} + +cat >>confdefs.h <<_ACEOF +#define LIBDIR "${conftemp}" +_ACEOF + + now=`TZ=UTC date +%Y-%m-%d` @@ -23384,6 +23397,7 @@ now=`TZ=UTC date +%Y-%m-%d` + ac_config_files="$ac_config_files clients/Makefile common/Makefile conf/Makefile conf/upsmon.conf.sample conf/upssched.conf.sample data/html/header.html data/html/Makefile data/Makefile data/driver.list docs/Makefile docs/docinfo.xml docs/man/Makefile drivers/Makefile include/Makefile lib/libupsclient-config lib/libupsclient.pc lib/libnutclient.pc lib/libnutscan.pc lib/Makefile scripts/Aix/nut-aix.spec scripts/augeas/Makefile scripts/augeas/nutnutconf.aug scripts/augeas/nutupsconf.aug scripts/augeas/nutupsdconf.aug scripts/augeas/nutupsdusers.aug scripts/augeas/nutupsmonconf.aug scripts/augeas/nutupsschedconf.aug scripts/augeas/nuthostsconf.aug scripts/augeas/nutupssetconf.aug scripts/avahi/nut.service scripts/devd/Makefile scripts/devd/nut-usb.conf scripts/hotplug/Makefile scripts/hotplug/libhidups scripts/HP-UX/nut.psf scripts/HP-UX/postinstall scripts/python/Makefile scripts/systemd/Makefile scripts/systemd/nut-driver.service scripts/systemd/nut-monitor.service scripts/systemd/nut-server.service scripts/systemd/nutshutdown scripts/Solaris/Makefile scripts/Solaris/pkginfo scripts/Solaris/postinstall scripts/Solaris/preremove scripts/Solaris/nut scripts/udev/Makefile scripts/udev/nut-ipmipsu.rules scripts/udev/nut-usbups.rules scripts/ufw/nut.ufw.profile scripts/Makefile server/Makefile tools/Makefile tools/nut-scanner/Makefile tests/Makefile Makefile" @@ -24051,7 +24065,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by nut $as_me 2.7.3, which was +This file was extended by nut $as_me 2.7.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -24117,7 +24131,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -nut config.status 2.7.3 +nut config.status 2.7.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index f87be6d..41db8d3 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,8 @@ dnl | Network UPS Tools: configure.ac | dnl +------------------------------------------------------------------+ dnl NUT version number is defined here, with a Git suffix in include/nut_version.h -AC_INIT(nut, 2.7.3, [https://github.com/networkupstools/nut/issues]) +AC_INIT(nut, 2.7.4, [https://github.com/networkupstools/nut/issues]) +AC_CONFIG_AUX_DIR([.]) AC_CONFIG_SRCDIR(server/upsd.c) AC_CONFIG_MACRO_DIR([m4]) echo "Network UPS Tools version ${PACKAGE_VERSION}" @@ -1202,6 +1203,13 @@ eval conftemp=\"${conftemp}\" SBINDIR=${conftemp} AC_DEFINE_UNQUOTED(SBINDIR, "${conftemp}", [Default path for system executables]) +dnl same for libdir +conftemp="${libdir}" +eval conftemp=\"${conftemp}\" +eval conftemp=\"${conftemp}\" +LIBDIR=${conftemp} +AC_DEFINE_UNQUOTED(LIBDIR, "${conftemp}", [Default path for system libraries]) + dnl Current date now=`TZ=UTC date +%Y-%m-%d` @@ -1239,6 +1247,7 @@ AC_SUBST(PIDPATH) AC_SUBST(STATEPATH) AC_SUBST(CONFPATH) AC_SUBST(BINDIR) +AC_SUBST(LIBDIR) AC_SUBST(DRVPATH) AC_SUBST(SBINDIR) AC_SUBST(PORT) diff --git a/data/Makefile.in b/data/Makefile.in index 5a010e3..0bd8feb 100644 --- a/data/Makefile.in +++ b/data/Makefile.in @@ -274,6 +274,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/data/cmdvartab b/data/cmdvartab index ef68d70..3d091f2 100644 --- a/data/cmdvartab +++ b/data/cmdvartab @@ -47,6 +47,11 @@ VARDESC input.voltage "Input voltage (V)" VARDESC input.voltage.extended "Extended input voltage range" VARDESC input.voltage.maximum "Maximum incoming voltage seen (V)" VARDESC input.voltage.minimum "Minimum incoming voltage seen (V)" +VARDESC input.voltage.status "Voltage status relative to the thresholds" +VARDESC input.voltage.low.warning "Input voltage low warning threshold (V)" +VARDESC input.voltage.low.critical "Input voltage low critical threshold (V)" +VARDESC input.voltage.high.warning "Input voltage high warning threshold (V)" +VARDESC input.voltage.high.critical "Input voltage high critical threshold (V)" VARDESC input.voltage.nominal "Nominal input voltage (V)" VARDESC input.transfer.reason "Reason for last transfer to battery" VARDESC input.transfer.low "Low voltage transfer point (V)" @@ -59,8 +64,14 @@ VARDESC input.sensitivity "Input power sensitivity" VARDESC input.quality "Input power quality" VARDESC input.current "Input current (A)" VARDESC input.current.nominal "Nominal input current (A)" +VARDESC input.current.status "Current status relative to the thresholds" +VARDESC input.current.low.warning "Input current low warning threshold (A)" +VARDESC input.current.low.critical "Input current low critical threshold (A)" +VARDESC input.current.high.warning "Input current high warning threshold (A)" +VARDESC input.current.high.critical "Input current high critical threshold (A)" VARDESC input.frequency "Input line frequency (Hz)" VARDESC input.frequency.extended "Extended input frequency range" +VARDESC input.frequency.status "Frequency status" VARDESC input.frequency.nominal "Nominal input line frequency (Hz)" VARDESC input.frequency.low "Minimum input line frequency (Hz)" VARDESC input.frequency.high "Maximum input line frequency (Hz)" @@ -72,6 +83,8 @@ VARDESC input.transfer.delay "Delay before transfer to mains" VARDESC input.load "Load on (ePDU) input (percent of full)" VARDESC input.realpower "Current sum value of all (ePDU) phases real power (W)" VARDESC input.power "Current sum value of all (ePDU) phases apparent power (VA)" +VARDESC input.source "The current input power source" +VARDESC input.source.preferred "The prefered input power source" VARDESC output.voltage "Output voltage (V)" VARDESC output.voltage.nominal "Nominal output voltage (V)" @@ -106,14 +119,31 @@ VARDESC battery.charger.status "Battery charger status" VARDESC ambient.temperature "Ambient temperature (degrees C)" VARDESC ambient.temperature.alarm "Ambient temperature alarm is active" -VARDESC ambient.temperature.alarm.maximum "Maximum allowed ambient temperature" -VARDESC ambient.temperature.alarm.minimum "Minimum allowed ambient temperature" +VARDESC ambient.temperature.status "Ambient temperature status relative to the configured thresholds" +VARDESC ambient.temperature.alarm.maximum "Maximum allowed ambient temperature (degrees C)" +VARDESC ambient.temperature.alarm.minimum "Minimum allowed ambient temperature (degrees C)" VARDESC ambient.temperature.alarm.enable "Enable ambient temperature alarm" -VARDESC ambient.humidity "Ambient humidity" +VARDESC ambient.temperature.low "Temperature threshold low (degrees C)" +VARDESC ambient.temperature.low.warning "Temperature threshold low warning (degrees C)" +VARDESC ambient.temperature.low.critical "Temperature threshold low critical (degrees C)" +VARDESC ambient.temperature.high "Temperature threshold high (degrees C)" +VARDESC ambient.temperature.high.warning "Temperature threshold high warning (degrees C)" +VARDESC ambient.temperature.high.critical "Temperature threshold high critical (degrees C)" +VARDESC ambient.humidity "Ambient humidity (percent)" VARDESC ambient.humidity.alarm "Ambient humidity alarm is active" -VARDESC ambient.humidity.alarm.maximum "Maximum allowed ambient humidity" -VARDESC ambient.humidity.alarm.minimum "Minimum allowed ambient humidity" +VARDESC ambient.humidity.status "Ambient humidity status relative to the configured thresholds" +VARDESC ambient.humidity.alarm.maximum "Maximum allowed ambient humidity (percent)" +VARDESC ambient.humidity.alarm.minimum "Minimum allowed ambient humidity (percent)" VARDESC ambient.humidity.alarm.enable "Enable ambient humidity alarm" +VARDESC ambient.humidity.low "Ambient humidity threshold low (percent)" +VARDESC ambient.humidity.low.warning "Ambient humidity threshold low warning (percent)" +VARDESC ambient.humidity.low.critical "Ambient humidity threshold low critical (percent)" +VARDESC ambient.humidity.high "Ambient humidity threshold high (percent)" +VARDESC ambient.humidity.high.warning "Ambient humidity threshold high warning (percent)" +VARDESC ambient.humidity.high.critical "Ambient humidity threshold high critical (percent)" +VARDESC ambient.present "Ambient sensor presence" +VARDESC ambient.contacts.1.status "State of the dry contact sensor 1" +VARDESC ambient.contacts.2.status "State of the dry contact sensor 2" # FIXME: the outlet collection is indexed - solve with regexs? # diff --git a/data/driver.list.in b/data/driver.list.in index a0e82fb..50f23b8 100644 --- a/data/driver.list.in +++ b/data/driver.list.in @@ -18,6 +18,7 @@ # "ups" for Uninterruptible Power Supply # "pdu" for Power Distributions Unit # "scd" for Solar Controlers Device +# "ats" for Automatic Transfer Switch # # - support level: a number from "1" to "5" (stars) meaning: # * protocol based on reverse engineering @@ -47,6 +48,8 @@ "AEC" "ups" "1" "MiniGuard UPS 700" "Megatec M2501 cable" "genericups upstype=21" "AEG Power Solutions" "ups" "2" "PROTECT HOME" "" "blazer_ser or blazer_usb" +"AEG Power Solutions" "ups" "3" "PROTECT NAS" "" "usbhid-ups" +"AEG Power Solutions" "ups" "3" "PROTECT B" "" "usbhid-ups" "APC" "ups" "2" "Back-UPS 1200BR (Microsol)" "" "solis" "APC" "ups" "2" "Back-UPS BZ2200BI-BR (Microsol)" "" "solis" @@ -70,10 +73,12 @@ "APC" "ups" "3" "Smart-UPS RT XL" "AP9618 SNMP monitoring card" "snmp-ups" "APC" "ups" "3" "(various)" "AP9618 SNMP monitoring card" "snmp-ups" "APC" "ups" "3" "(various)" "AP9630 SNMP monitoring card" "snmp-ups privProtocol=AES" +"APC" "ups" "3" "(various)" "APCUPSD-controlled devices" "apcupsd-ups" "APC" "pdu" "1" "Masterswitch" "940-0020 cable" "genericups upstype=12" "APC" "pdu" "1" "AP9210" "8 outlets" "powerman-pdu (experimental)" "APC" "pdu" "1" "AP79xx" "8 to 24 outlets" "powerman-pdu (experimental)" "APC" "pdu" "3" "(various)" "SNMP monitoring card" "snmp-ups (experimental)" +"APC" "ats" "3" "ATS AP7724" "" "snmp-ups (experimental)" "Aphel" "pdu" "3" "various PDU" "" "snmp-ups (experimental)" @@ -93,7 +98,9 @@ "ARTronic" "ups" "2" "ARTon Platinium Combo 3.1 10/15/20 kVA" "USB" "blazer_usb" "ARTronic" "ups" "2" "ARTon Platinium RT 1/2/3/6/10 kVA" "USB" "blazer_usb" -"ASEM SPA" "UPS" "5" "PB1300 UPS" "i2c" "asem" +"ASEM SPA" "ups" "5" "PB1300 UPS" "i2c" "asem" + +"Asium" "ups" "3" "P700" "USB" "blazer_usb" # http://www.asiumpower.com/Asium-ASIUM-P700-650VA-360W/dp/B009SMEQ10 "ATEK" "ups" "2" "Defensor 1K Tower / Rack" "USB" "blazer_usb" "ATEK" "ups" "2" "Defensor 2K Tower / Rack" "USB" "blazer_usb" @@ -242,8 +249,8 @@ "Dell" "ups" "5" "Rack 3750W High Efficiency Online HV" "USB port" "usbhid-ups" "Dell" "ups" "5" "Rack 4200W High Efficiency Online HV" "USB port" "usbhid-ups" "Dell" "ups" "5" "Rack 5600W HV" "USB port" "usbhid-ups" -"Dell" "ups" "5" "Various (SNMP mode)" "UPS Network Management Card " "snmp-ups" -"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card " "netxml-ups (experimental)" +"Dell" "ups" "5" "Various (SNMP mode)" "UPS Network Management Card" "snmp-ups" +"Dell" "ups" "5" "Various (XML/HTTP mode)" "UPS Network Management Card" "netxml-ups (experimental)" "Delta" "ups" "1" "GES602N" "" "belkin" @@ -275,6 +282,8 @@ "Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5 PX" "USB port" "usbhid-ups" "Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups" +"Eaton" "ups" "5" "5E650iUSB" "USB port" "usbhid-ups" +"Eaton" "ups" "5" "5E1100iUSB" "USB port" "usbhid-ups" # http://powerquality.eaton.com/5E1100iUSB.aspx?CX&GUID=8D85FE66-3102-427C-8F33-B8D56BBDD4D3 "Eaton" "ups" "5" "5S" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5SC" "USB port" "usbhid-ups" "Eaton" "ups" "5" "5P" "USB port" "usbhid-ups" @@ -296,9 +305,10 @@ "Eaton" "ups" "5" "EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)" "Eaton" "ups" "5" "EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)" "Eaton" "ups" "5" "E Series NV UPS 400-2000 VA" "" "blazer_usb" -"Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "mge-utalk" +"Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "blazer_ser" # http://www.eaton.com/Eaton/ESeriesUPS/DXUPS/ "Eaton" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2" "Eaton" "ups" "5" "BladeUPS (SNMP)" "ConnectUPS Web/SNMP Card" "snmp-ups (experimental)" +"Eaton" "ups" "5" "various models (SNMP mode)" "Power Xpert Gateway UPS Card" "snmp-ups (experimental)" "Eaton" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (ref 66102)" "netxml-ups (experimental)" "Eaton" "ups" "5" "various models (SNMP mode)" "NMC Minislot (ref 66102)" "snmp-ups (experimental)" "Eaton" "ups" "5" "various models (XML/HTTP mode)" "SNMP/Web Minislot card (ref 66244)" "netxml-ups (experimental)" @@ -308,6 +318,7 @@ "Eaton" "pdu" "5" "ePDU Switched" "" "snmp-ups" "Eaton" "pdu" "5" "ePDU Monitored" "" "snmp-ups or netxml-ups" "Eaton" "ups" "5" "Powerware 3105" "USB" "bcmxcp_usb" # http://powerquality.eaton.com/Products-services/Backup-Power-UPS/3105-eol.aspx +"Eaton" "ups" "5" "Powerware 9125" "USB card" "bcmxcp_usb" "Eaton" "ups" "5" "Powerware 9130" "" "bcmxcp or usbhid-ups" "Eaton" "ups" "5" "Powerware 9140" "" "bcmxcp or usbhid-ups" "Eaton" "ups" "5" "Powerware 5130" "" "usbhid-ups" @@ -316,10 +327,13 @@ "Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Serial Pass-through mode" "bcmxcp" "Eaton" "ups" "5" "ConnectUPS X / BD / E Slot" "Network port" "snmp-ups" "Eaton" "ups" "5" "Management Card Contact" "Config 3 - Cable 66033" "genericups upstype=7" +"Eaton" "ats" "5" "Eaton ATS16" "" "snmp-ups" "Effekta" "ups" "2" "MI/MT/MH" "2502 cable" "blazer_ser" "Effekta" "ups" "2" "RM2000MH" "" "blazer_ser" +"Electrys" "ups" "2" "UPS 2500" "" "nutdrv_qx or blazer_ser" + "Energy Sistem" "ups" "2" "(various)" "" "blazer_ser" "ETA" "ups" "1" "mini+UPS" "WinNT/Upsoft cable" "genericups upstype=7" @@ -351,6 +365,7 @@ "Fideltronik" "ups" "1" "Ares 700 and larger" "" "genericups upstype=6" "Fideltronik" "ups" "2" "LUPUS 500" "USB" "nutdrv_qx" "Fideltronik" "ups" "1" "Other Ares models" "" "genericups upstype=19" +"Fideltronik INIGO" "ups" "2" "Viper 1200" "USB" "nutdrv_qx" # http://fideltronikinigo.com/viper/viper-1200/ "Fiskars" "ups" "4" "PowerRite MAX" "" "upscode2" "Fiskars" "ups" "4" "PowerServer 10" "" "upscode2" @@ -414,9 +429,11 @@ "HP" "ups" "3" "R/T 2200 G2" "" "usbhid-ups" "HP" "ups" "3" "R/T3000" "USB port" "usbhid-ups" "HP" "ups" "3" "R5000 / R7000" "USB port" "usbhid-ups" -"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module " "snmp-ups" +"HP" "ups" "4" "Various (SNMP mode)" "HP UPS Management Module" "snmp-ups" "HP" "pdu" "1" "HP3488 Switch/Control Unit" "" "powerman-pdu (experimental)" +"Huawei" "ups" "4" "UPS5000-E" "" "snmp-ups" + "IBM" "pdu" "1" "Blade Center Management Module" "15 outlets" "powerman-pdu (experimental)" "ICS" "pdu" "1" "8064 Ethernet Relay Interface" "16 outlets" "powerman-pdu (experimental)" @@ -478,6 +495,8 @@ "LDLC" "ups" "2" "UPS-1200D" "" "blazer_usb langid_fix=0x4095" +"Legrand" "ups" "2" "Keor Multiplug" "" "nutdrv_qx" + "Lestar" "ups" "2" "MD-800E" "" "blazer_ser" "Lexis" "ups" "2" "X-Power Tigra 1kVA" "" "blazer_ser or bestups" @@ -491,6 +510,7 @@ "LNXI" "pdu" "1" "Icebox" "10 outlets" "powerman-pdu (experimental)" +"Lyonn" "ups" "2" "CTB-800V" "" "nutdrv_qx" "Lyonn" "ups" "2" "CTB-1200" "" "blazer_usb" "Masterguard" "ups" "1" "(various)" "" "masterguard" @@ -691,6 +711,8 @@ "Microline" "ups" "2" "C-Lion Innova Tower 6K/10K" "" "blazer_usb" "Microline" "ups" "2" "C-Lion Innova Combo 10K/20K (3/1)" "" "blazer_usb" +"Micropower" "ups" "2" "LCD 1000" "USB" "blazer_usb" + "Microsol" "ups" "4" "Solis 1.0" "1000VA" "solis" "Microsol" "ups" "4" "Solis 1.5" "1500VA" "solis" "Microsol" "ups" "4" "Solis 2.0" "2000VA" "solis" @@ -711,7 +733,7 @@ "Mustek" "ups" "2" "Powermust" "2000VA USB" "blazer_ser" "Mustek" "ups" "2" "Powermust Office 650" "USB" "blazer_usb" "Mustek" "ups" "2" "PowerMust 424 / 636 / 848" "USB" "blazer_usb" -"Mustek" "ups" "2" "Yukai PowerMust" "1000 USB (PID: 5161)" "blazer_usb" +"Mustek" "ups" "2" "Yukai PowerMust" "1000 USB (PID: 5161)" "blazer_usb" "Mustek" "ups" "2" "Various" "" "blazer_ser" "Neus" "ups" "2" "400va / 600va" "" "blazer_ser" @@ -723,6 +745,7 @@ "NHS Sistemas de Energia" "ups" "5" "Expert S Online 8000" "" "gamatronic" "NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic" "NHS Sistemas de Energia" "ups" "5" "Expert S Online 10000" "" "gamatronic" +"NHS Sistemas de Energia" "ups" "5" "Laser Senoidal 5000VA" "USB" "gamatronic" # http://www.nhs.com.br/produtos_interna/id/T0RrPQ== "Nitram" "ups" "1" "Elite 500" "" "genericups upstype=8" "Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16" @@ -936,6 +959,7 @@ "Sweex" "ups" "1" "500/1000" "" "genericups upstype=7" "Sweex" "ups" "1" "1000" "USB" "richcomm_usb" "Sweex" "ups" "2" "(various)" "" "blazer_ser" +"Sweex" "ups" "2" "INTELLIGENT UPS 1500VA P220" "USB" "blazer_usb (USB ID 0665:5161)" # http://www.sweex.com/en/notebook-pc-accessoires/ups/PP220/ "Syndome" "ups" "2" "Era 500VA" "USB" "blazer_usb" @@ -1077,6 +1101,8 @@ "Trust" "ups" "2" "UPS 1200VA Management PW-4120M" "" "blazer_ser" "Trust" "ups" "2" "UPS 1300VA Management PW-4130M" "" "blazer_ser" +"TS Shara" "ups" "4" "(various)" "" "nutdrv_qx" + "UNITEK" "ups" "2" "ALPHA 500 IC" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 1000is" "" "blazer_ser" "UNITEK" "ups" "2" "Alpha 500" "" "blazer_ser" diff --git a/data/html/Makefile.in b/data/html/Makefile.in index 8ec093f..f455c4a 100644 --- a/data/html/Makefile.in +++ b/data/html/Makefile.in @@ -213,6 +213,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ diff --git a/docs/FAQ.txt b/docs/FAQ.txt index 8ce0b14..81c93df 100644 --- a/docs/FAQ.txt +++ b/docs/FAQ.txt @@ -561,6 +561,8 @@ The most frequent issue is that udev has not actually applied the rule: - and if the device USB cord was already plugged when installing NUT. In this case, just unplug and plug back the USB cord, then restart NUT. +Instead of unplugging, you might also be able to run `udevadm trigger +--subsystem-match=usb --action=change` to fix permissions. There was a mistake in the naming of the NUT udev rules file which resulted in the rules being overridden by another udev configuration file. While this has @@ -590,7 +592,7 @@ will appear in dmesg: usbfs: process 29641 (usbhid-ups) did not claim interface 0 before use This can be a symptom of a source install conflicting with a package install. -There is a rudimetary locking mechanism in NUT, but there is a chance that the +There is a rudimentary locking mechanism in NUT, but there is a chance that the packages might not use the same directory as the NUT default, and the conflict will be reported by the kernel. diff --git a/docs/Makefile.am b/docs/Makefile.am index 8ca7afd..c587aa5 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -111,18 +111,21 @@ A2X_COMMON_OPTS = $(ASCIIDOC_VERBOSE) --attribute icons \ $(A2X) $(A2X_COMMON_OPTS) --attribute=pdf_format --format=pdf -a docinfo1 $< if HAVE_ASPELL -# FIXME: also check ../{NEWS,README,UPGRADING}+other dirs # Non-interactively spell check all documentation source files. # This is useful for Buildbot and automated QA processing # FIXME: how to present output (std{out,err}, single file or per target)? +SPELLCHECK_SRC = $(ALL_TXT_SRC) ../README ../INSTALL.nut ../UPGRADING ../NEWS \ + ../TODO ../scripts/ufw/README ../scripts/augeas/README ../lib/README \ + ../tools/nut-scanner/README + spellcheck: - @for docsrc in $(ALL_TXT_SRC); do \ + @for docsrc in $(SPELLCHECK_SRC); do \ echo "Spell checking on $$docsrc"; \ LANG=C $(ASPELL) -a -t -p $(NUT_SPELL_DICT) < $$docsrc | grep [^*]; \ done # Interactively spell check all documentation source files spellcheck-interactive: - @for docsrc in $(ALL_TXT_SRC); do\ + @for docsrc in $(SPELLCHECK_SRC); do\ echo "Spell checking on $$docsrc"; \ LANG=C $(ASPELL) check -p $(NUT_SPELL_DICT) $$docsrc; \ done diff --git a/docs/Makefile.in b/docs/Makefile.in index 037296f..1a28021 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -242,6 +242,7 @@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBAVAHI_CFLAGS = @LIBAVAHI_CFLAGS@ LIBAVAHI_LIBS = @LIBAVAHI_LIBS@ +LIBDIR = @LIBDIR@ LIBGD_CFLAGS = @LIBGD_CFLAGS@ LIBGD_LDFLAGS = @LIBGD_LDFLAGS@ LIBIPMI_CFLAGS = @LIBIPMI_CFLAGS@ @@ -464,6 +465,14 @@ A2X_COMMON_OPTS = $(ASCIIDOC_VERBOSE) --attribute icons \ --attribute tree_version=@TREE_VERSION@ \ -a toc -a numbered --destination-dir=. + +# Non-interactively spell check all documentation source files. +# This is useful for Buildbot and automated QA processing +# FIXME: how to present output (std{out,err}, single file or per target)? +@HAVE_ASPELL_TRUE@SPELLCHECK_SRC = $(ALL_TXT_SRC) ../README ../INSTALL.nut ../UPGRADING ../NEWS \ +@HAVE_ASPELL_TRUE@ ../TODO ../scripts/ufw/README ../scripts/augeas/README ../lib/README \ +@HAVE_ASPELL_TRUE@ ../tools/nut-scanner/README + all: all-recursive .SUFFIXES: @@ -802,18 +811,14 @@ packager-guide.html packager-guide.chunked packager-guide.pdf: packager-guide.tx .txt.pdf: docinfo.xml $(A2X) $(A2X_COMMON_OPTS) --attribute=pdf_format --format=pdf -a docinfo1 $< -# FIXME: also check ../{NEWS,README,UPGRADING}+other dirs -# Non-interactively spell check all documentation source files. -# This is useful for Buildbot and automated QA processing -# FIXME: how to present output (std{out,err}, single file or per target)? @HAVE_ASPELL_TRUE@spellcheck: -@HAVE_ASPELL_TRUE@ @for docsrc in $(ALL_TXT_SRC); do \ +@HAVE_ASPELL_TRUE@ @for docsrc in $(SPELLCHECK_SRC); do \ @HAVE_ASPELL_TRUE@ echo "Spell checking on $$docsrc"; \ @HAVE_ASPELL_TRUE@ LANG=C $(ASPELL) -a -t -p $(NUT_SPELL_DICT) < $$docsrc | grep [^*]; \ @HAVE_ASPELL_TRUE@ done # Interactively spell check all documentation source files @HAVE_ASPELL_TRUE@spellcheck-interactive: -@HAVE_ASPELL_TRUE@ @for docsrc in $(ALL_TXT_SRC); do\ +@HAVE_ASPELL_TRUE@ @for docsrc in $(SPELLCHECK_SRC); do\ @HAVE_ASPELL_TRUE@ echo "Spell checking on $$docsrc"; \ @HAVE_ASPELL_TRUE@ LANG=C $(ASPELL) check -p $(NUT_SPELL_DICT) $$docsrc; \ @HAVE_ASPELL_TRUE@ done diff --git a/docs/config-notes.txt b/docs/config-notes.txt index 021033b..62983b5 100644 --- a/docs/config-notes.txt +++ b/docs/config-notes.txt @@ -30,7 +30,7 @@ configuration directive. This may be something like MONITOR, NOTIFYCMD, or ACCESS. The case does matter here. "monitor" won't be recognized. Next, the parser does not care about whitespace between words. If you -like to indent things with tabs or spaces, feel free to do it here. +like to indent things with tabs or spaces, feel free to do it here. If you need to set a value to something containing spaces, it has to be contained within "quotes" to keep the parser from splitting up the line. @@ -45,46 +45,46 @@ configuration directive for some reason. You can do that too. NOTIFYCMD "/bin/notifyme -foo -bar \"hi there\" -baz" -In other words, *\* can be used to escape the *"*. +In other words, `\` can be used to escape the `"`. -Finally, for the situation where you need to put the *\* character into your +Finally, for the situation where you need to put the `\` character into your string, you just escape it. NOTIFYCMD "/bin/notifyme c:\\dos\\style\\path" -The *\* can actually be used to escape any character, but you only really -need it for *\*, *"*, and *#* as they have special meanings to the parser. +The `\` can actually be used to escape any character, but you only really +need it for `\`, `"`, and `#` as they have special meanings to the parser. When using file names with space characters, you may end up having tricky -things since you need to write them inside *""* which must be escaped: +things since you need to write them inside `""` which must be escaped: NOTIFYCMD "\"c:\\path with space\\notifyme\" \"c:\\path with space\\name\"" -*#* is the comment character. Anything after an unescaped *#* is ignored. +`#` is the comment character. Anything after an unescaped `#` is ignored. Something like this... identity = my#1ups -... will actually turn into "identity = my", since the *#* stops the -parsing. If you really need to have a *#* in your configuration, then +will actually turn into `identity = my`, since the `#` stops the +parsing. If you really need to have a `#` in your configuration, then escape it. identity = my\#1ups Much better. -The *=* character should be used with care too. There should be only one -"simple" *=* character in a line: between the parameter name and its value. -All other *=* characters should be either escaped or within "quotes". +The `=` character should be used with care too. There should be only one +"simple" `=` character in a line: between the parameter name and its value. +All other `=` characters should be either escaped or within "quotes". password = 123=123 - ... is incorrect. You should use: +is incorrect. You should use: password = 123\=123 - ... or : +or: password = "123=123" @@ -95,7 +95,7 @@ You can put a backslash at the end of the line to join it to the next one. This creates one virtual line that is composed of more than one physical line. -Also, if you leave the *""* quote container open before a newline, it will +Also, if you leave the `""` quote container open before a newline, it will keep scanning until it reaches another one. If you see bizarre behavior in your configuration files, check for an unintentional instance of quotes spanning multiple lines. @@ -176,9 +176,9 @@ right one for your hardware. You might need to try other drivers by changing the "driver=" value in ups.conf. Be sure to check the driver's man page to see if it needs any extra -settings in ups.conf to detect your hardware. +settings in `ups.conf` to detect your hardware. -If it says "can't bind /var/state/ups/..." or similar, then your +If it says `can't bind /var/state/ups/...` or similar, then your state path probably isn't writable by the driver. Check the <>. @@ -204,7 +204,7 @@ NOTE: Refer to the NUT user manual <> for information on how to access and secure upsd clients connections. Next, create upsd.users. For now, this can be an empty file. -You can come back and add more to it later when it's time to +You can come back and add more to it later when it's time to configure upsmon or run one of the management tools. Do not make either file world-readable, since they both hold @@ -266,7 +266,7 @@ You should see just one line in response: OL means your system is running on line power. If it says something else (like OB - on battery, or LB - low battery), your driver was probably misconfigured during the <> -step. If you reconfigure the driver, use 'upsdrvctl stop' to stop it, then +step. If you reconfigure the driver, use `upsdrvctl stop` to stop it, then start it again as shown in the <> step. Reference: man page: linkman:upsc[8] @@ -335,7 +335,7 @@ Reference: man page: linkman:upsc[8], Startup scripts ~~~~~~~~~~~~~~~ -NOTE: This step is not need if you installed from packages. +NOTE: This step is not necessary if you installed from packages. Edit your startup scripts, and make sure upsdrvctl and upsd are run every time your system starts. @@ -347,7 +347,7 @@ Configuring automatic shutdowns for low battery events The whole point of UPS software is to bring down the OS cleanly when you run out of battery power. Everything else is roughly eye candy. -To make sure your system shuts down properly, you will need to perform some +To make sure your system shuts down properly, you will need to perform some additional configuration and run upsmon. Here are the basics. [[Shutdown_design]] @@ -384,9 +384,9 @@ The exact behavior depends on the specific device, and is related to: - call their SHUTDOWNCMD - disconnect from upsd -5. The upsmon master system waits up to HOSTSYNC seconds (typically 15) - for the slaves to disconnect from upsd. If any are connected after - this time, upsmon stops waiting and proceeds with the shutdown +5. The upsmon master system waits up to HOSTSYNC seconds (typically 15) + for the slaves to disconnect from upsd. If any are connected after + this time, upsmon stops waiting and proceeds with the shutdown process. 6. The upsmon master: @@ -433,7 +433,7 @@ References: linkman:upsd[8], linkman:upsd.users[5] Reloading the data server ^^^^^^^^^^^^^^^^^^^^^^^^^ -Reload upsd. Depending on your configuration, you may be able to +Reload upsd. Depending on your configuration, you may be able to do this without stopping upsd: /usr/local/ups/sbin/upsd -c reload @@ -441,7 +441,7 @@ do this without stopping upsd: If that doesn't work (check the syslog), just restart it: /usr/local/ups/sbin/upsd -c stop - /usr/local/ups/sbin/upsd + /usr/local/ups/sbin/upsd NOTE: if you want to make reloading work later, see the entry in the link:FAQ.html[FAQ] about starting upsd as a different user. @@ -479,7 +479,7 @@ adding sensitive data in the next step. Create a MONITOR directive for upsmon ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Edit upsmon.conf and create a MONITOR line with the UPS definition +Edit upsmon.conf and create a MONITOR line with the UPS definition (@), username and password from the <> step, and the master or slave setting. @@ -655,7 +655,7 @@ to keep this running either. After stopping driver, server and client you'll have to send the UPS the command to shutdown only if the POWERDOWNFLAG is present. Note -that most likely you'll have to allow for a grace period after sending +that most likely you'll have to allow for a grace period after sending 'upsdrvctl shutdown' since the system will still have to take a snapshot of itself after that. Not all drivers support this, so before going down this road, make sure that the one you're using does. @@ -706,7 +706,7 @@ for individual hosts: A small to medium sized data room usually has one C and a bunch of Bs. This means that there's a system (type C) hooked to the UPS which depends -on it for power. There are also some other systems in there (type B) +on it for power. There are also some other systems in there (type B) which depend on that same UPS for power, but aren't directly connected to it. @@ -715,7 +715,7 @@ of the "single C, many Bs" depending on how it's all wired. Finally, there's a special case. Type A systems are connected to a UPS's serial port, but don't depend on it for power. This usually happens when -a UPS is physically close to a box and can reach the serial port, but +a UPS is physically close to a box and can reach the serial port, but the wiring is such that it doesn't actually feed it. Once you identify a system's type, use this list to decide which of the diff --git a/docs/configure.txt b/docs/configure.txt index 9b12481..aff82c1 100644 --- a/docs/configure.txt +++ b/docs/configure.txt @@ -90,9 +90,9 @@ Verbose output can be enabled using: ASCIIDOC_VERBOSE=-v make This feature requires AsciiDoc 8.6.3 (http://www.methods.co.nz/asciidoc). - --with-lib (default: no) + --with-dev (default: no) -Build and install the upsclient library and header files. +Build and install the upsclient and nutclient library and header files. --with-all (no default) @@ -227,7 +227,7 @@ Sets the base directories for the man pages. The default is --includedir=PATH -Sets the path for include files to be installed when --with-lib is +Sets the path for include files to be installed when `--with-dev` is selected. For example, upsclient.h is installed here. The default is /include. @@ -266,7 +266,7 @@ HTML files will be installed to this path. By default, this is --with-pkgconfig-dir=PATH Where to install pkg-config *.pc files. This option only has an -effect if --with-lib is selected, and causes a pkg-config file to +effect if `--with-dev` is selected, and causes a pkg-config file to be installed in the named location. The default is /pkgconfig. diff --git a/docs/documentation.txt b/docs/documentation.txt index 4483117..ab3bd2c 100644 --- a/docs/documentation.txt +++ b/docs/documentation.txt @@ -46,11 +46,13 @@ Offsite Links ------------- [[general_powerdev_info]] -These are general information about UPS and PDU. +These are general information about UPS, PDU, ATS, PSU and SCD: - link:http://tldp.org/HOWTO/UPS-HOWTO/[UPS HOWTO] (The Linux Documentation Project) - link:http://en.wikipedia.org/wiki/Uninterruptible_power_supply[UPS on Wikipedia] - link:http://en.wikipedia.org/wiki/Power_distribution_unit[PDU on Wikipedia] +- link:https://en.wikipedia.org/wiki/Transfer_switch[Automatic Transfer Switch] +- link:https://en.wikipedia.org/wiki/Power_supply_unit_%28computer%29[Power Supply Units] - link:http://en.wikipedia.org/wiki/Solar_controller[Solar controller on Wikipedia] - link:http://www.pcguide.com/ref/power/ext/ups/over.htm[UPS on The PC Guide] diff --git a/docs/download.txt b/docs/download.txt index 3991b1c..e43ce48 100644 --- a/docs/download.txt +++ b/docs/download.txt @@ -103,11 +103,11 @@ NOTE: The only official releases from this project are source code. NUT is already available in the following systems: - Linux: -link:http://aur.archlinux.org/packages.php?ID=5379[Arch Linux], +link:https://aur.archlinux.org/packages/network-ups-tools[Arch Linux], link:http://packages.debian.org/nut[Debian], link:http://packages.gentoo.org/package/sys-power/nut[Gentoo Linux], Mandriva, -link:https://admin.fedoraproject.org/pkgdb/acls/name/nut[Red Hat / Fedora], +link:https://apps.fedoraproject.org/packages/nut[Red Hat / Fedora], link:http://software.opensuse.org/package/nut[Novell Suse / openSUSE], link:https://forum.openwrt.org/viewtopic.php?id=26269[OpenWrt], link:http://packages.ubuntu.com/nut[Ubuntu], @@ -115,16 +115,16 @@ link:https://github.com/voidlinux/xbps-packages/blob/master/srcpkgs/network-ups- - BSD systems: link:http://www.FreeBSD.org/cgi/ports.cgi?query=^nut-&stype=name[FreeBSD], -link:ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc/sysutils/ups-nut/README.html[NetBSD], -link:http://www.openbsd.org/cgi-bin/cvsweb/ports/sysutils/nut/[OpenBSD], -link:http://doc.freenas.org/index.php/UPS[FreeNAS]. +link:http://pkgsrc.se/sysutils/ups-nut[NetBSD], +link:http://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/sysutils/nut/[OpenBSD], +link:http://doc.freenas.org/9.3/freenas_services.html#ups[FreeNAS]. - Mac OS X: link:http://pdb.finkproject.org/pdb/package.php/nut[Fink], link:http://trac.macports.org/browser/trunk/dports/sysutils/nut/Portfile[MacPorts] - Windows (complete port, Beta): -link:http://www.networkupstools.org/package/windows/NUT-Installer-2.6.5-3.msi[Windows MSI installer 2.6.5-3] +link:http://www.networkupstools.org/package/windows/NUT-Installer-2.6.5-6.msi[Windows MSI installer 2.6.5-6] Java packages diff --git a/docs/features.txt b/docs/features.txt index 8e25259..eef38b6 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -18,10 +18,12 @@ More and more appliances manufacturers are bundling NUT... Multiple manufacturer and device support ---------------------------------------- -- Monitors many UPS, PDU and SCD models from more than 100 manufacturers with a -unified interface (link:stable-hcl.html[Hardware Compatibility List]). +- Monitors many UPS, PDU, ATS, PSU and SCD models from more than 140 +manufacturers with a unified interface +(link:stable-hcl.html[Hardware Compatibility List]). -- Various communication types are supported with the same common interface: +- Various communication types and many protocols are supported with the same +common interface: * serial, * USB, * network (SNMP, Eaton / MGE XML/HTTP). diff --git a/docs/images/nut_layering.png b/docs/images/nut_layering.png index ff451b4bc4db1e403ab32e20d4f2213fa1655862..41f650c593dc25baaa3d945432a1edaf00725704 100644 GIT binary patch literal 231026 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 PO+v}>q@;jv?~MTX{jOs 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%0DoOwV^;Pl?r25LBQ>1vX zWZNk^+dAO)N+)@~uD#<{TeQyCy_hD@^hy{8~hXi^cZ4_3}f0^bS!oujt8bof9c0l--oPL@zvZDw45 z&$%(TxPc%d{P&+l;`6~c4$hWVRPT_UCZPn609ZH+ z#ps@-`i`{qwzlY13;B96Xh?3{iZP%py6+R~y`(HRT(_zZH_ImC>U3kpl5OpOnjsD5w{; z{x}pQCu6{;^?381u)*}9U!CG2o_TA-mA|L`nW-i z$u?oa=;MN3Rj=C@p7krC?r=T+_pgQ6y>TBs@X{|?Ms_*|j~;}b>*P-1h{%(?c@-4B z@klj>95)&jlgBAi4xe^>_`dOQ?;7X?COQqp%2`Pe>M5Ec`hT=HO3O-0Fir&TzPub$ zXAQ@!Q^&AhKJ){8^5#l%cDONWd>OmujjJJI8@p^QYk_xBrjfr@cM zF=qNWOrJjo0I+`1GEs&;e(GhKcHXHhyD$$AeD)gq_{o3M-qjn>Qdx=Ik|GS6FbcDN zd?DU{@G%_OvMsJI;vu#?B03bGv(934^1rvY(9dp~iu?ix-um!z(_8=9AktomR*TfS%mRUfKHb8QRChZSS=Y+3Smg1E)-$wY0zO z%Qw)ROV44UiS3T>*NVa$4pnx2-8J~)^qv)K6w{M~MK7Lo3`uI&;^x~e)7?E3}{ z$zdjrg|}~ocvvhPX3icG)AvcscKqalY~bKLsyfspk$2vOlNkWCx4BSP)gqB0mTw@y z84AG78ij}y;2p1nFCkD6+v=}94$SARdLZiEQDfXeN= zF=)aVO#9({*=dEDlbjD-TL1UP^tdsQw*l#I^IE5)igkBK0p;erbNhf_3v7}O>*1fSc3w)#fo6c-|^Fdyyp(ru2pWxYaj~__0|0?l*yRuRB{9IJ}IT zbHOb0YmdCaxt*TWl_mfSXC+>6!EBO#iH^noR7knDGUyeXFr}QOIjrP%iD#hG=Zs*( zMwi5uWyJV_m@suHwyfDNdd`_RoPXsU1_0kKSgVwOiJlv4B1@;d%$MuB3u`}FLMO~W zm5rD-34)r7PfSl^%80QxJ&2U=r1HtJw-(a4|65ub0cz z5ovKP|9U5V@!&z^r*^vvDq#3Mhvk*<0C z*KE{`<8jITcXV5E@kC(EB-`(BAl1>$;|bvI+ZG6a{@Z-6pfDZ3xNCNJ#dFWD2D;^{ zH-!fto6n6xxKw1hz5d)%+P$qBSKoRnJN>+gqOf;g{Dz);^dpg8JuV;GTRKrXqzD(? zaF&Fp$L+<3uYQR)p8Q`@eb)LuD@X_3e(EaXx(l{+rI-K3ATZhXBeyqQI>;%QODsa_5Ab;A$>qYI{xXld{hpJ= zd%>dk?b+Etr=2yDops(A_TjsmD2gha$eHJk3vLkhcuf^{~(RJx4@0FG?ijhx~_OgZ;-_Vr6|iozV(Sr{{C zCIFyj*B;$z`-xy;W=h7kiv~-@oTUr>%Rq;|J$f_FIw7o|MgRTMpY#k%AS`}siT~>R zuCUqD?QHVg<4h|)U8U_v0*$bnY~<%Vnc3usyC+X>hRpyh{c;!m;#a4!>>LN~e&}5G z`27pW+g$Vcqc;{b>!bYRX#PH+?zvULa^F4jPa839_GyqUkmWOM8^J4}C_o*M)rmeF` zMN8TG%?j*YvkAkePQ=fjdz8I$=kICns^Ic`Ms5x+f8qfY53hj03s~^yzo#I@#NiSI z*i1H&*N_1KNvj#tb+7KZeE65|(wgsfWBS~YC?8V5stz^LmNonE&8M5Fy`=+hKfi?R zb_*&G)GIckrrH+#>c@`>C!KQw8$Ed_D=9C;ft`o3dD&K4ws1v^7m2Xsov(0s=K&f& zb36u*8O(ADb74=nqq(LD^@pmk^u0w?xnrNK_o=C>7JvQe9dyF{lQDGCSXMf6C^B-h z(N^Dp+THuG@w3G^vSoYH^~WO!uy9sI54!xSMdaDK)s=M7Ij{1w<_uxOhUc-iHVPukPhss z4(lhB*Q$f{xOD2Tgo=?R7&UPS%P+}BR!%xv8{5!O*?0z)1F>~t-Ph~!;7@-~ zURUJoVm1A>H?`uCOKvBN#RPXp2S|{9xpl#l&tdfk3&DXnj(zsQMhbpOv=kR#HG`#R+EG*4g8#j?oT7Q$@%syz&3*}6 z`uS!$xVsuPhZ~WTmw_>p2V>@`;~4<#+;kATHy`Sf8Sr_1_~-B5pa-7&1)DT`9G?E{ zVfM`j%W!b#Vd6LrCFO;fan=c}rJ)56U-PKUDjLGPQi)BAzQx|v>oI)V@woZ5f8x8> z-U@$7bn^T&F>Lx&>{|LgM$MTWmzR=v)52LG2rihoG)Pwif#@+U-j6ub)B_ zCl6o(AKiCG?%#ZMEnRxWWK2782)pWr>Fhr*tfJ@_t1rE3Dw}o62-eZ&!J99xr0Bj% zAC$+`SUN4`7Eg{asl3cI&uv0%z4vr()qLCae45`i=mHE$@593 z4mBL9ApmUb>=W4PkG~|ZQ~Z+kr_a1X6HcAQ=G}ZX_N-io%I(3`bBoQ2OCP=$HirWn z7JPxaeFt>Q(GdtB&77wA4G#SvQ_dd@gD z_pC9juDT6{C0VdoOjz*FT5>ymxcHhA8ASZV{9pgaBAR*HIQH0UH*qZu9cXWLqI_r( zI1>lIFMy}-dy^V!nnew2(1=p}?A}Y*&+feh?Jb>XsA@vNfIMV(eR`bdc|3LJKPli> zQd?^GfQ9hJy-(1!fBPL9IA%C*dG#sgY;A|DtsMn}%D@Si9gWtXuFUF%aW)#MO#U zo`=npPI7tRSgh{lUfvD1$AuqlC#hZudw11?by*4O0}P@1P!nnnHPGUZ)<@}8Zejos z2{^E;3I}&p5~99J$%T(2lcv|&(2DkkW{K|9^tgB3wyyjLvM)rn*4Cq~whmlEWx^zS zw{sT3$9I@v&Xt+a1phzw&^JOsVLCTuY8m_S6_Xe+i2;Di<;N}8y(bJEo{yk`9*M(Z z>hiXYm3Z;#Z|JWt{FL4Kz&RqZH?KX2`)__-@Pt<;gYoLBS}=CTj-7p9-_Pcave8x%pm;m=kp_3>%yK*(i1-<+KNk|5C6R8HeC6a z2Qg{hX*l`X%W?9xmjejy6MpmVdtr0f;~MBbL4cXF$hMy}Q<@M6G;=0vsmO2?mxa>y z7IE7n0{-^I_w>vQ7c$NiOC6-?X!qcc_kAw>;qi01+wM7qyX>kHaA02(ksx63&;nLc zngzGpk4NucNUbeSSqGR@zED_f-Hx3=DUEAtZ9>~PNCM$s_rFT_{re7f*&RP*)6blO zgWC_Gw4wx~jvoO&z~iL{U!mX^YUA@xq#mvMcrh-#>sm}XdoCuQIh!>esR0QBp1<{e zs@ky!2R3ZQm;e4R&ba=k_~pAVV9%=caJ9B#__X7ZTUvtp1BdX@qfaJ~a+iT_a>&-P zM3BmtMEjM2uGe@g8C=2vK+S;~3MibRsTcJ}>I9$H2dmAB0Yi#Yz64fc&*!(hc9^pq zW4fNmd(YKoM<--FvyeM3K*V$~`@fB>yh!QwE+}N}22)*(2XS8dh*q9Xr!awePohD2lfzihg zWBJ877&d+|1YSU6brUu&+lGZNe@@j0YDDqeoi6NH6YE_QmvwVZBX+LYhRU4>74i*K z?K%L9&4R`wHImFU9InD&F1eZJ-E=t{J$ot!jHp1tpfWTasY2EE-T3_P&!c|-LD|mf z!0L4%5ImjIrRNZiY}gR|ifD`cTk2Y|&*P_jdubrHJj{%UC=lFkA!7t;`z;ryUXSAQ zNfzBRAxjl%y?)BF7D&ni034iI;Q3C@Yzi&)t9$vBY2=U!ooGp0OZoQ>h=pDdjlga) z!_9}Kvnc2p5RkUecCAm61ICP*12lh4yu1>FP{1Dc! zJU|!Beu5@U8py^^E{EIY#r92=*t+%rNzZa8{Nkd&3x&m5m@u`1m6YWouOJg1w-@zQ zP1w42A64$F1t48z0DyzLD)Gx7JVe7M491X=Wf(ZDgn8XwG}biH=H**af4EK*@4Jt_ z!=4Sh$l2DRsE0Qnd65?6yoJWYwX)#=@YEG|5yu73t&fGz?ZHdG_!Wjs8iyeh$04hz z0F|4!;?RbTXs@e7c5xvZ_U(gDrC)Rl0<4@>QjP%NFx$u(Xo1bD{32=)!MIgb?O40I zimEExNiO`mZw}Ch?`@^>t}RS1XY}!s!P_N^cGLFF&+|9lF^3y_+yG2Ep_~E0k%P@x z`2J>k{;6-MwyISWCzb~Q?A}&Q0YA@Lo1H2RMZUdN?ytw@)qBz28j2gC^ZNqWvU(3H z57f!>t=wOWt*dv5R;K}A=lVUk&bU%|JHpH zUfWh}g~uuPGHh^6-nn`!j_ek%bT?JkW7n$9Xs!`&x9V(Z#{*|wMRPAZpOp+PM`nHw z7-QfAk*%!nKk_v8uiJ!EulX@5CXa_bBOP`758|7b-@t;u`~!ZMOT@Fip$Yp|twqye z_4D>Scpf%$I-j~eD|LMzi`{ROFe8@tb6`m}pne2iZ(?Njf?*T${__*9^sn#uPlnZI z#rh@d1CRdfv6Q{g`Ooj3aTJslaCI8wXsAid?qU=tJ_5>0L(Vi~? zF-8>Sl?u(`qkjhn1G9<2!~uRkA4L=W5{sDkGauZ_4I5pGfBfMC`t;4^6biT7E%1B& z;o}NJFUhee9#Q-m0AysP!Q*s+cyZdH+=@M(B#|$e7iqYNE-Viz@DU`>IF2!k%>uvM zEgK%qhZChQ$kL<=|EX!B=_O}4O-y{c$@aE=R(IMQv%@}!q`E*%9>Uu%7$b^$@mM|& zQr*Rd2g{k0l!Jf~oGnqKteChMTmbC{YZ6&hBM%s=ddWqhOBY+c?jkH{(Iuz3~2nuBqtz)694hRZ- zV`+u1@Q4SjEfB!64!eI;?qrb_UFEDaAD}_joUD^5THn$AN+{nX`&>*DDTAOMo_OvO zHs|zF?6qgVr++>EB}v;xbU6mgOug@k^plZ3Invk0lpzzxk?W&l%SEowiYZr$7gt0t zD?{`>Cz3g)Zp5^wN{MNdOQi~EOH+ygV-@d zJVwTP35}LYBWtO9fMk)V$+k3uX1$`GV&?WNYj_&6ZN0e zc`3C8#ME!~_z_t+35|5DUfkSDY4&lR632j)yx8XDvzk6W{O^Cpr@S@*yu5^n6u*Gj zACFmNS}!3GTspRqfI>{QPf_bZ(i4qP`bqKDDMf;L)dr^kvYD)qYpZ$I918eCo~dZ5N$#0k z8(~sf^|ma3uL_lZBOVg24@s9tt=ESvTOl8-^L%^0;P>o?vfdQ`E9hUTzA8a$8N}^t zb;zN=91EA###tJYB~PSLzofJs`8t-E4VI!@qn~YY5zk!XqrJI}?CExvUy`3P zrJKwqWaMTr0BCP&PvMIR5tKRd19i?F7F+hr@UuwmrkLNM@aS)ll5A^Wh;4B4bm~y= zaJ2GcioCSMJ2tW3?M6{rX+W+{<=Jw0U*|ypbGn|$>s?K`Sl0E?FR=M zBw?{>D)Wu)FQn;eEtk|onRm61r=rYUAy&3DlZ^ykyp2q$zG!I+@gT2n{WNO*CW}iK zuZ*Pey4505NK+1#9zP~$gilIEFs+ULnHmJQ`MW>gzk>0n)TKRm`dcDZ9W(%<|lXpj2iJ)H@=s{># zUSo9=6_pobK*azquOyc>*UEoXLJ!7F8)FK6T&1bHfx2S=8<1Aa?`zy<$;+M*^)#M` zE*46IcDz}Cs=WfK&`)<733|}Ia_n~bsUl~9>|Q!EGl2;%nOIsqh;m5A0}~9ZuWG_y z?|wP_@}qX%iO7=*XiuZg=R=k?Pjzo22cJS8pw?dFl}+&ZXYX&I$TkQ$zVXsKdeIgj z8f>=9>egYh2m!vGnN6YdthKfQwQ@?tLmQ7qOJABw^sRCy06yZ##5gF)HrP?*uX3)l zL!=Qncl}O?)bN#$FDSm8|fR&oBOTZ|rP6c7`0; z^A<}Jp<^<9VrTu$^&M1S-3oW7{D&k$Jk&e|T0Ja?nPIFIGtq6B%a6E zPXvKkNlE7eY+1b9y@$!^OHLQ^_wt_Cw_ja_hkx}UE%|I4$%V(p4Lz6dXT?y{pZK|a zpQx>`l{mOEA3;&^-X>pRvTO8;!DHipnsKLd93Zu@m4O)c-ZUmP^qIhkYXDwW!dXz2D(11 zTf8Q0pr3!^g_fM6_@8)I!_W!CxY<9LYX*WxH*Q<8rQ5!?b6n0aUqka3y|T)5|Ic5d zt4@1F`1+IeeR(>4OksIz2aU)cr}|Cf;TZ$`9UUwB*2?2Cj7C2w(~_ZjcGu91l7Q1F zlaykw%Z;M6a>Zk}iqrCWpIhIV>RPdO`2kw+-bUKBwWeG6_a_{7`zYUDqIwLm-DD#x z3y?q1tVU+QfCRN(FVf8!f;r|ug}#J-WuQl9m)fo)I}Zx$zgo)!fFskv?tSe6dv;zX z)59Zll?^TB?s@UIcFq)3`R6Y$2>9F{-F&oO`L-N^6IunIzd@pdAmlxp`n_ZE>C|T6 zTJ}%IpW$nTl4nUTA9eJ!wbjYOA@$TMdDOM&UC$g$edQ%S zePVGE^#UeSj)y%S9Y7j-g_)fBVR(>9D)j_&SA@%{o8O5_LT;rZ{_1gbm|D0Tjl6#3)0fvp;_Xxk`o{M7UUYr3#2@oh zJx=PaqhGhQ(U_cZzEs;@#uk@^L4eLTa^L#%Ykr?6cv9EEk%PELKYKE5`q?whjDx25 z7OR=fyL!Im;g26r%Pz=a0MK09M4vqOen77*dasF8y>(a|P0%>FKyXd4-~@LP+#yJi z#ogWAT?2vO?(P=cf;)@51b25?WU<@#`|j>{_s8tB&rJ7pRdtt6bv3WpE121UtvE*X zHGR!xAA@nSXNDR(srrNI3}Fgd71BtI(t7BA6$uBMPm}>L`?KNHUUm*#-Tp_oSKxM_ zt4Na3A5~1%Svk|1;sdse=9{&ZR=;*3aF({Z==gZU}y=0)KlXj3HZpQZgSz>vOb6Zl?A&Q%U&hp46h+<<;Mo2eb zKO~2K9gSaPT(^>K~FeCR(odnHMxj!!?W&aT1?5v9hn?WJb<3b z^D~pnp@g22mR)ybjf4eq+Z1r+&8JtsT2>SYs}s}HbU|5DL&{~N^vDYr-iVbXHu9)` z(>UfqC*ze6KpKE$gfg`|RuFoTyZ(?wy-A9cHzdiy*R41gh8JpqhQwr}Wj|VrdF)+a zYC7yQw@cu4^UR)n8mHWLeV6*%AN%+mTN*@*bQPCwn{_9~>-;%GA4hYwuFrI;`zwQ7 z>vsb$5sg%pRT=SzrR6;h?wy$n_tx@(Z{qh%IG`nkHj{1 zF{XyEU24+r?^+&PG!Y%IKxDiW4B6bo71o+a>(xKU%e|DJZh@%F9X6A5#oeK!-rkT!P^Y9jsmuho z8K(__SNRm*|NWuu(aiY0X;ts+ZTa zZNt%A;ufcEe${mG}_0VNtLc9dx`aTm zg78jqfIx<7iow+4uVQ8r4ya;QaA<2?l^sx7 z)44A&+GXOP3`p{DTW@Hthw(rnPK+7*KEOy+Y@uzL)R(|KW@-vO7A=QPj$x+=fiwt& z2zKMBGK|nTw|(sjc{9ty4pO?&=|06&-|eK;M+G1`(qN>wYB518d)?o099VlKG*n?{ z+mYa$TUiKR8sZvxUm(5XyN&UNHKD~+zaG`Gdmg_@9?J^CN)wmJGCt^5N=oT-H4PPa zu`1A`BMT<3(P4c}w^$Ef6akEBXS+I&Fc}npy^QbkdUir3O3Y9fCRtKZLeuZWy) zU^Eb_J6DU0b6V+y?PTfKrvRS$b=>@0J1)A3iU{1ecNCTX6`<4~<{oygZmb8YqHlrs z(yIg~&L&IqcI}Yk5~5G-k4jeA(b^V`Et0je&CjLaaW>8Db(hbFJ(~>D@zQEs z;CyQQY2fx&TOBiG7JGfD(?A#hrp5TV*dEcPdu3;q1j`e~E*e_8rzYXvVS^G{HKZga z#eKFNy`;VO8wM?I)U_H{$DppzZq!C0?u5VaMvX&BIXuWGk+*wcT=sLaK9;4eUXtiB zg!M)Iv29R#*LjF8r<(+GIR#Co@W+iOW~p+c32C-3z-LV$nIGZktvcivyNR!Pcz5~! zoW5J$XF#(nAN>?p;M7-k^Btm$4bIVd0CXSqkT-)98XB7GK!9*DYd+K; zDHpoDv216XuyXaD`QRYe@AId>lXVD=;!tn;faEtuAT^ZQ$=D_H0*>yo|mDSmffD(93Yg%K(r zNTkYX=xB}Z&JC#(rm}BX?2bz(k43Ga80d^iZoz9L3DoJc)TQc1E-AO3eVWmG*>|_& zONs@VUL=!aZAT8_@d-H?_Z<>oI^o=8y#u@oiScDfojGHh5@Jli%$uwU2!zbt`({Tp ztlnv1%B_P2L8yI$xBq632anG3-&CXARGh;g=RsnkF001F$GrN_hKeVddt*@})5BFc zbkU_Ue${K2;ua)zUJ1a`!;YgBPsRmiK|gTI1iGPa$yb_6iVF{VWw&CK*HID7pAhi= z*X5(Ao$!r=MTz;fR;^I@Uk%S$>@4tkT9eQX=OR zp8h4ZP{}(5MUQ$m?5LlcnVCbtrigXIRIWm9e4OaO#?~9vze~?#RQtr*15Di+K7Tku zi}YBQA5U`-^B{rNwO5mfG6Xr>U{+ndBKuL)TwC0-amsvZ3K8h+ZYoMgfv65%c5&@s zfAH1RkRUBWEZK_&7gy+8{Z(#uo|{6u+jua3_%$|^el%Wyte@-Bq`2Pk8+m&Y*i|$}^D3(L@d{R$P|0gHP<-L{e*(>UFmwcJ&qWLlVbFTTlYHKz3x6IItI|lJjvnHf zeFabCiicxY`m_p!-Cu(mUg*I1tO!6}YuU>g-w0Aciy-RCb^}0#vqQ@zH@H~MU42AF7vT)rISZwf0D@caG#xHjXDA=n;Fp>_oIz=E)NhPLIWB4N~*W0oMtVL9n3~IHPM*Vn?o?JeWAS5NXM3^^Hi(!KzP+ z9vygRnzQXj_04ptF^@5$cQL3Zv1{}u62iK@MtK$%N}%|NU7x|0Ut-hh zH#A#osP)^8_)=(N)J%ZY+m)9QggsVOE;o>ry5Wvf^ne13$GJF@clZ5mwz0$hax=nK z%hmn*!zOn$nbrzFQ1kl*uPOWCm*%dqmXG^F^4f3LAZgcyU;mtxtYoPP1R0ZC8Z{Pn zC1SaUh8~JeiET_0WE$n+XLcTpC4hoYBjOfGvbS2i>}~D(BSCfZUenOeRvRQhdJrrV zahO#r?i*KkVwIJ?;WZY>c@Ff2+mA|1E{0CV4(JJqpYEwn>^elZ6Lb>%8K@_Z@7^Xr z)gueqkGeh7VyAz)YYH~$8Sg-O&za<#+gM4RXw_nmKmRPBU)}O-dR)a-&bdyWt$>9365Y!7wWoorSo5{%>tV zl(Hcd0zC5)_1N#8PN5$k+4mhgF{m>&pDJwis|>9{i%zXTrwsTtUz z`BY=^9CaUvS*c@P&e=0JkhL9T>{A`b$NMSBD3A8T(C=dBfa$tW;>h4hI>Oys6o2<= zue4Qz?wNu9KId6U%607znY`HQDhQuZGmusu{tn$n{Ky%Z8H^=j_2cx{j&Ji81MtDY zxL)~lKz#r0J16GKem;Axm`hIZbGp(1rrgw_hr8`pGTZl@3J%Al!Y64 zyF4j;Hbzqi-4o@&%Zue0sDTRy1#;cqhIgcxlnbFJuvk(YG*s zehn}*n{ z{Fq?b%{CpB`766&`eEciuPXA!X4-0_cxP|i|KE_-* zh&s2bHH;o71cXqI#N=5y_tDxt)VbTpf~cD=7*uv6 zQFSdtU%c(S+u!BQX0#fh=QIGu2X<8dd202VlhAzECj$k6^m^?He}R1cs60kfIPMVW!fIgQ+u)EJc5q%$ekXLB~C9O3Ki$_ru9_fg1m=S3*}aSbBwvFw=M^Z&F_G`!dit6)o&b~ zziXse_a599)7`l{tesH>fC@xGvLH{H7IfHzGKZ0*Lee&ITG0A(LR(~uNQkxrKStY% z;<0_HYeROZMbfp(Z3JXq=vMWhdz0X(Q?Q+H#c+3=gRL+Gk=*J-$MsDH%Li!YOGuX% zD?wny9c&jxC%Nw1ho2&TDjTZbyZ%6a{uQP(esL-uG4~Bdfr_E&* z{Sze{T5}f=)jd)*1X;%l=X?Y%?= z8f-ZY_yyWHo$qLSvEE+6AZ>kiBZ(+!F2KJulikPPYqGnZ#WSdst-m(a$fv;hKxC0G z>q2OjLE>usCek~p)rRy8O|>y24&_0y{9Q;605JR0x*+hSM>?3x8vx`trdB+KU2cU+ z_Oc?n<>(3Mst9Q(X}{^O++f#Kk9}kRhG9j+$SbSvoMxM3E+baQoEciYO20}0>0>&L z^!t!^|Eb#ljuB4qcb8Tf0@~-VhIyC$eNNCY5FOxa3Kr+~5wVL4GsY+`(JusVTuGqP zX9VxQqd65%xc_O~69@w*NgXA4gd99gbZAWY)$qSN&__IrMp-)vSQM=C&{zK7_rAvQ zefF8g4t+fO`hR*OD8u!OD0~h@T>syW(AFXqP*HI4ccpjy{~ZJR=g8=e5tEPgAMF3X z>336%pZ>$)e+MM?yF!kcRJ}gYK=4j<@ND1y&i#Ktv3?90kNKZx zZJATx>sn9Qt7RV@y#E6j2xCoD-lxJ7%m_yUc==hlKJJAM_x}NMbnD<24b!{e3MKvA zO4minVazDc;yYligG_z{q#LyL4oxAFBsaJ9MxkhYjqJhV8(Z)+5@Yr5<^p%Jo%&_p zu?{SGY*tcg&v2h8SAZ>yXn4l)WVp4qze>EhoE>t$NM*E7x=NEgiUyX=|g)r5*?C9jx; zlH0SUDl!>EV5WoqMK)R<^%9Ae204*JDB4%^kE}S=OfqqHvuhEbS$&eT6&rH$WBAK} zctsf2<-fKFQ1pBN69Q!5@@Qat<`_i7?pencJ77u|>} zYauj2Xblt=zSut-6YR}JFCpxiO&2jDXY&P^ZCtxmG;Po_2K#4692?&j>a!Zp%~O;T zXJ=LKty1*TA|0XqRXV*Cp(P7s$NKNL-?ZdQjBbVFo^lRnmBY9^T3Nvgdn=1t2P8YF zYsw39-y4HV3vMPxXhUT7$6Q@l9=&hnC%{A&{f$)Z9_2`LtKXR4(BsT(r{i$mi!+y890M8!AJ)DCk`;7&`uln zL?l&5vZwU!$c(g?)mV%3s|xq@{^JP2(G50hIT{s_LggRDyg6>^IPR__(`mkKDJo$I zEpq%l!5A4|EfAl( zjsaP|fM62dzS=thhB~v)L*8T|jEagX=e%9KYA^p`+~D#SpLmmdRO?thzL7F0axzVD zW#k1E)Y#o^J^Qn)sw@D5=Yk=Dz*)7ClY ziG#DEU-|Z@2&b(7M+2F{v+ofCshj>E8G|#72$1J&?89j25}0Wjf(sX!KYv_q9KqdO z%|!8PEF#Fw6%wpmV0<+!c!%6pUD9d!c_VrEB{HL0WzT?=_?%=^mqtXga#dyWCS&Q> zXj9~GbQ?u>fw5Y(D#%%dG`Z=XrMBM>!6 zEWPZ3#xq73dmhJK@AbhfDv47Q-ac6u4ygvU9xQfm-DZT5vh0vzL=r#>*JgvcCnSLY zLq)~OVa!;Bh|t&mUfK^mHPeT5-&8gn1=(#)nKkm!G{G|Nw+yfBC@@Fng)v7%=i&og z6Eofose_m0>M9X5mrc^%kIkxhu3?E+d-H@h@dl^H`v|C#I}(=_6i-M-5$O)1-vFX$3uH^$e2%6_NoBUOX67>lW6>stK(EKnNS&T$0 zwB8#DN;JJS0=oN>42SN!JUD;?o{`;Y6RMBTftl_~HBD}&pQ=GWF20`RG65}Jip{2o z!b2o9Md6oKc;%1MUo=VsDQ*fQd9)LrzRJ-T^B%T*g1Du$yT5j5B2|;bJd%qS-CY`s z66qiXvYlbdnIyt2^n(>C*7muT6IVqKJ^MSi)~Q^Zo$5aHR+8PE(=di&&k7G*&!OjN z*+WLUez!L$0z%a_+cGFMB^)}f&OsIA13>1e!TiL?Qd&Dsh`6U!yqbf5<1|fS%|(J9 zefC96>TlA7@X`U=<;Rh$xZS1H_!9vexylyTxur2NbV)J46Psa<%VH&5pT*zDO`@mVPxZ!@Wqj=KXfptp8kyO>A$yiR}^gIfXv>AIdm z8&8&246~+&%(~k}q;rNOYvYK+=i?c= zre!B%c?`UHGB!O`Wh3I=G-DpPUutBFucra)>7hn(u$t@Muai|I!kW{o4c~S@8R+n7 zYoX^3M%?&gl^&`Q^(6Pv1=VU2G~LX>HhHdpyBbL3{P;>YLsf{)d<`DPj*V4!#qU-< z<@mU6v!828P+FmX$B~fSPCK1yb}D@bc0M79ni>`_pNP2Bw$^fpJp|3}W6!P%l|3I; zvIuRKw#eS~e4TE;GTS9nCw7|BTwHxlk7D$M{{X|dqOB#py^nJ$JhO|4bPdFrVJoKS z6!#n~j9ti9-|#k@rVLZ3qVQ3mRBBBKPp#m~WXe_jvS7BV=T=O6YUr@|)U|Oi@5pgS z;D_wua_cy~(7W=|rBAjL`wK`Oc^DZg+%>yJw4UGo)wN*L!6|&`*=>rYqvNh%4fgb+ zu9F!U06J+lPf7lUZmxn*l!HZmDJ5`eLSYmhm?z-s8WvR~S~$o^Z)JgE{cElJn4SQBO(D30$q2TtE( z{L()6pRMUaJ>{`UX2O5n$?;T3S+#%mo4Fs_Xe8Oam@BMMy`sl&5m&+dQR8&&#Y=D0WOx2!CDk13(h(4(5 zXwaM*IhpBb0$+N&77rLOhqj$r?-%^?@hB=qOcK}aJT5CO&{s(Ithk;fQ^+=`h(6DG z7?qg=&TnamRh%BpL|tSx-pNHtPxWLpbE%)Y%>XjjK(A;6!3K`5{&O#<@Aeme9}N|X zt!$mbzX#g(wKuV{XwKa?w0vMADs8{(1N+%9j*STg^GudhO{?bbeb4{UXKW_NCC`+- zQR^vyEg_KO?Uu*cMQXWFPU`guU4crj>PR}g(8JAhWo3LEIh5sfV<&`EO zC8#S<<>scgu{G!P{QA|hV+F1_Y@@>K^-|C(3oaBP2O`ZWVl5QeMB5TStI!z;G+v-QThVp_+PIAJV3qJ(7{VYk$8JmF|{gBbNE%DbDV z7|%xVu_p9PDC6G&zwR%OgVY@a^Y#UzuvqDf-D}!76vETU!oB^QP8AqRKd}lL*euWn zX9?{58%fe)YFow6D7#3M^dS8E@s(jAe!gg<^9PiP2U5EOk1SHcptseg--R?USS476?JUQ7GiM+k*H1NG z3BQ*po3cPJDVR_|J0RFH;8&E4fmJUbo%6*JQqpTQMezdyo56kbHqF0S%!p{a8~+* zpH}nUSGM&a!D@MR;|9|9^m!yGsg}3Mnr`!a7AMiqQ!m|b;MXDBUpl{{-F z^tqpXx47)u-KCp+4+=1E)=hPtE!RpgYxN)^`f6yKam*}Yj1=BNH;*lgQ$`0D+%KeutQwzjdc z(aKY%`zMX9x6b@Wo3@hSZZAi&1o3C!E)V+8^Do%djZaedyUG8YT|8m- zMEFfe^-*0a4x|d!0ljYjf*ZcUEVlM&Tx}MA6PPNp9$5Q-AOPRdLLc4?lmaAT< z4nNZPbX>lj&F#5K`EHgk^55-l1Vq}a@!TAw?sekP;IBffhkZEevsDI~N_9!>%VqVx%yrIL@YyBKg$cplZIDr7MzMMN0qI*tQ7(`ph?RE^;U~l;$Q-USED>KCRgB?Y!q6;SkkO>8w|59CZMItRW$p1^VD<}tds5eErni> zX!A2h7fC@a++%|Q_hFHGfShtQCyfe;y22qf;(z1kNr82dsEU)wr{FvN)JE zCg`O!vRH_2TSCQcR5VlUE4jF<7$f~27g-8hzwi{nQLYjbR=+N`VgNkflP7-YxLlRx zqN>UT^;?;UB89vdwULvX{0K#e&S%TUfNV#@xNF^Mi0UjWo3^JGD_p)+ivSxF z5Z^5O{qxvnhniKK z=B=V@Z-W}}{w0&syT^XYRcE&*$yXD&(`H-Vvy^zWG8-jz0VeD)Ct@)8r&2@v4{MnKmcS^U-d!Hr|q>k{1-`MT7l1;d-(eY+S8#y zC*IlRGyg+|6$lJr=tQ>JE1lY2ewymfNMO^c{Q;GBJvC5qbOQvK)G8Ws= zQC2Wz(jEo{fjktikSN~vX705AE|IAjD)Y&SV_W3SJ1aNaiPh)AksnS@Je>EZ@9keH zp(wz;l|7y-Y+CyGEmTWAfEn(&b&{Vm|7aNeBlX%YpV(dvaC0BcnwmX#8$xtAKmTiJ z2)Mf26h?VH4zKKNh-I8+>Av?oyp0VYEMME4ubGdH+48*w?bng5cNA3lY#8U6t;DAiL9@VJ^Qgx1kztx;41ZuwKgX8(7u zZYZcD)C@%ca`+JZ{`|nm{u!=ha#ZCRJMWY$8CPLa9cHU@$$bcNg2PZO4pce8NY~v? z<6|_)=Akqo;NGa5SLe|3X<5>2Z_&t1@j9}BubJwnof_Amk)2SRWnceOS1otJTJ?>) zX4PgC#$8=*%C+HVf-OAYq%uRo#LguacD92>ovl!WK3yq~M-W53t8$cK-M6Qr##-iY zys({rc!ELJ1dNChZwYH!QRC&uuK>hKLNgUTm)LXj93D0L9PK>QeG4{r^PWxOxcy?a z#Yu2`RZt1pN73PY#XxzaFL17doG#e_MU@3}!H2yAf4M-T^lMKC@`;6KnNxns?mlGw zV&T=JHWan!*gSqCXZP-AX>(ntlAA&wp~D=$cJgfxvkiSJHh5&@Pr_Lip_c(&K`zWWxK8+-Tr7FShdm+S$4WBu9Lt^_83 z_aMd1tZVM^dM#Fh?loq}e>wu(_Ku(5h(4+>0bg&f9op5H^;s1{BiCDZxI7-tb2<)x z4ZC1=e1Z>@Ziq~-c|YKjoJn$$elX)8PF`YtF&EKJng${f2;k&liw*;Da4qOspGe^W z>fL|YZ3!hEdg8ML6b^N9qOd>w8?_>vRKTSv)q zAof3Hto5^1g4Is=4-Z{>3e-nOQe+Vw~gp*wy< z|B<~Nj^vqXW@CR{zYgGTlh@{wOcdRDeYgFcY`^00D_Duw?ZR_^oKe1>xf?9t<6jrM zdAkncV=Yn_y0R`Z_0D(Rsc+S$!bxTozE}UV%ZmWraOXz@_&b|*cK_V9Gd_BI1F85? zXSdE`v)Sy-_$gv|d<{*=?M>Wlqr5?NC}AQ}8tF?|EUYV(K?09m+HU468MI?h90Lyx zgjyOXm)_RVUndJ6m-=nQT3)VfTWHsNNuMs4I((X!G8|qlbX;E%pQAeYPi2knNlrKK zUK{i<}YuGOM zw~q6+(~9)if#r;&?Au*r0P@+2;^LE6$J;of=jkRHQTGdIX&uPI2QB40nDH-0;XVy2 zL~`G;1+(a`y+e|B3$RIeDo}GzDkUY-a3ypUPThUVO22K;CC(or(D^;R~?4L zegDB8{t3F8JlV6e4<}9vvGQCd6*bS)x}J8;E`Ze;mmdPFP8p-mi7Fu^c{RRgg;%2> zAr!a0T!ozU(v7>$2HgO^i;}3rB|p~F(tx+D!#h-SYLXo%NQWpmq*%oj;JKH>ElSes z71maPcYXEVMF<<{6-i@#tB^78)teB%Z?547c0~kq+&!)gXDqB5OBHmLNQn2<3Blbl zb~lf|Ww+NjJN??O5jG$=L7L>JV*uehbkD;86ke`{b1=1+BX=>Df{@hPl|N)eYGI+QFs6sLF&tU+9wfp8uMdaS>);^6yKK_BN7Efd#O{ zW-|+VgxVdqvfJV_8DKq6oKL}LoWNyYnyh4bPI}q6NOe4qE*8PuLyBeKekDR{JjWVn%#Z^NU*=)=XIXO#yWeUaq77H` zb>5J_>`5v8k3^gnq?=;AqVsVl71;SAu)^=g28a_axHc4lR(8_9>{ciAyC=&HiB6+l z?t!Gj0%V{{vAt#S1I&j`A?{ouZUa5n6&$-`FLv8weOd#@QSn#A?)JXdS0d6=Srr0q zAr+WFXd%e>lL8T$@X^<3^&csjhxlgh2wf7`yOf2EoM9o|Wb{lUz7HO`9&%aV=J<0E^jmr^X79&B!Tr|8OLC9^{d+G-E+VT{ATSlXq>n zq!^Cwb`2uX%IWvV?0#C@?bUhPG@C4t<{fp=SUY*!ZVEu=m~W=~&@%zPUP6JVxCvG9 zpY=z~W6Zhat(JMI`^ZU!;7LnC95pN%@G84kw<&;~?Y>53HaRl4Fo>U%hbue2t8$>A z>i_ompy#3cR%y7OV~sM4{3SS)?|-CA$j{IhS35Htz+{_YMPV6_iK6yQY*R!%LS> zDA}dTh5j|Vg1(Q9mj|MZ%?B(6qmj`uL#Uj^1lLHyoI3~^W&Fb_iu?C;OnRFB?!yZ? zzYQRK+`ei5`C~rN9C|{Bn+5f`BM_<_BL7D@kkcQ~+kq8Xmmk_jRh+A@<#arDsBmgi~ zuKs<0WIx>t-bz|$mfer#ty0(^;qCO9Wn%jLL2@^9o(6{ z%EkR*uOYyP6&8>haIO0Mb1*Rx;ZZ*~%q{9ZK?Z0d^0w9X{93FtIx(Kb;s1bb@F1I( zve_Cd*WXvz?eh%{fUnmw?>_2vt5QO=kNfmEzDxTcb^NC$rsaiw@~fA;)9jS}eL;DJ zgRc4PrgYe9uX!$q9(-U$Cuh4pYWs5P zauN;uH~;=Uh6}k}*IRi@20{;oRYyFj(2;nseCpk-##nFP0cwxT>w>$I4S)u(FQLOh zf{0Z+(#xZ~sjRinH?y8h*29Pw5QVY_8)0zI>h|E__-th99z(bH>1F@bhf& zo1hLO6Ts7CzwICW;pAM5uw9A!Gns>9Re(o)o!Pp5Lv_89=WI4pDS4torttS{w;faP zpyWn`yR7O5XzA6HfsLyD#iHfiWU}{j^`)Guef9kuLR4kr^ONYIP>+_3QeDRm_xl?a z@C4b}SC8sVlLa*nBzAM-(GFza$q{zd*rf@I{4!sc{fwl30jO=Tod9FSRs!>((cRjCk4&HV{lK2%5Zzdq`c?LI{zP!$S&?`IUXM_7>N-E*{xxI$ zbd-;bx*DVjnmZ4mrH=)#&@6lZS?ZE`B84>7U>y2AK-z2UywALrZ49WNlXhc0EfB{C z+&)u<7-ln=yp_oX$hy#%OKlr^N}X-EW3}kMwM=7Pwyu4%@@DCV*p%|N zJLoi5%D+IGE&37N$@b7HHkxRu3qFQB==uj74PEA%wBMo99s?&c3t4#`KAY$sRb&UB z`(4m|1|M&X)%VcXu6LGTYg(Rl_aZM z;D6VS7kEGVY|g`@HgrXuCZwlB#iHU?K0E!&M@vtgmK5@YV)8y|Jvps*Sp6D=6EJ2E zdJyS07@3s5HiKo`ZXb&~%bITQNUB*rCHCMs90>s{cR8fj6EA|gP9O-hUFIj=-)iR% zdD9`Hd}iTHZil;F4w>KudI7LX`GXqB2iT>yB$ML`Xn_1#IU)yy06wg~W14&o1Mx-t zGn@z<(mc=z|EgGxlX0t%rK=B{Jz0YUB+SCWU+5dL`C`*V>0V zQec<7ZznXS_qOoGDEHo*1?)8a;6%CYTAs!W0ucnxlE@WQaiV-3!ElTEiXfZ4ZE~wH zY_iPDQnHGps@6C%`pR7I>Jx1H2a~#kOi$yh&v#O|!1~!A%dcZ71Yy z%%>fW{d)wwwl{aS2V-uO?5l$>RYqR5E3p|7c&*2U&h%~Y;hn-{2*_$`UrpY4xSX^x zh`2W*S0c>M*0mTt>?%@1XM7$X?D5gg&GvB3YDd^_mDo7LTGzNZ=9`Q*C$(Fx*8S<3 zXP&epM!(u@dkz84R#fQ=KT;YAmu37+M~xsL|A;(T>jNx4>x!Z650`Ejs)OowrT|}> zpLRwZOV4!(lK+M%knKGT`y=UImfVo`4sNq&0zGT>VW@bQ zF`&sAM@c)*dpH1g7$$K6zhA^Dus}^Q$B$4mBP8mJKd>h*F~$>NPiY|9vu%nA;13{! zp_4FX9QX!}8E=~aN?>?ku5s|3#Zj28IPdK>X+p3>hsmwERO!v~-HtdxRG5Jc0AfT# zlEC`>3MBZWuu`m^Pk@d5>fs|LQ)wlI|11P7XPl-qSy-GrGEthqTbOwmPkfQrx@tf) z1)C!(Ko=He5;0vviXab=jU|f28}U*CP?Vx)c}+y!at6%Bf>Bjaz2B_>DKK;dClOKl z86i0TL6MhYPPL!hG~v3gE#O!3cbClI4q6M)eNxg7L+`$s#jrFgCZnAN+3c z|KtLok|h3zfD%?MljbaaP~(?#0I%o-!W98=A`0AK|M*Eow2Kvs4z)5Zd;MYBS;HHmK~K-dck8zd7ou zHpGIlkw?=M%@&Kzfd>!=Ymq})A{+KZ@SDIeS<}$Z%GO50<6ClQV~pUqPYxUs5~?r7 zPEasLtv>JFS)xq0@4sw$2s{b1BDuGEmQ6b0WN-6;PHXtk{McB zxM$l~ULK%xtSG-4a4fNLf?2&>Eu5o(Rxxur0mfjqtZO%oTp;ZLm#IjgMY%_ zu>?1(jBLfGE%db(v5S zJ(;JSUa3=+wJ5v%-DK#xJr?U>tE*?BDlk?fiL*d=^BYR@MN_s=Lh;-w1N&-@;VD-O ze70=^)>@ zs~hKYAN{3_qb!3N>Y6R*m=4g=ka294cxAqKS7=4?Z{5 z<$b*6eo;-P;F-szfDRWLLQSpjV43W|ZAPS2*P8M3)~NT_cT2${fFBm<4;3harP#Nl zH$rcAQQM;d4_Tm6WEQIi+HWX^BnUwIhlj2ikrhdNP?9q+mIj@G^fN+!AszhDH6sZd zth86AL4-mjrCq#~&3bB+fk@<_dPl6>#*BjH zVfI2}2}(y9+p<#$Wxkz%39zmx(~{vMB}r2YK$lKDYrk<4`{%Ai7erT(w6X^iUWB@A zFH~g3ee8E2{D+M)MgsFC104?5A`IP042y@KZQhMCOdJM6o@ccunGBDx_tTvI{hw`k zwl&YyAI48F!nBI{-!2kSrV?~V5_G|$O6lLw-3wZx=+aW z`+8CFQ%?4sIDeRUm&=IV1eMl-Q6L<-5r9vJ6zn|-Q5Z97TkloI~R9n zZ~m>V+J|{Lbo>S#=>{)C-XTM9yK1LUD4nkf6|*n z;)Fv)pf26IYczqJu9yn`2bK6X{F4qir;lpqq0jb_q%^ny?1WHwKVK@N`re|=L^$>0 z$WSxGx|bH3X<+?F`?LqDEZo9D8=$UKhUQ#PFQua}W)hK(OD-khC7?~BGp_*x;} zdLtV#pNI<8QXTx^G1RYoev&gz=677z{))Nx2IPHlIWMq+tGkTme=FfsnT(PM1U=JVz>w{4VeR9_|hQo5|&DC)jv^a4Mbb zHm?f#-yCo_$CQEs!pO+d9WT{rFup8P4W|e)o!ULD(Qb4?n#MJ@lfR~P??`ij=`%x0md{Xgz^8yC?GTag{EZEXmGzP5H;+vW zAkC89r^&@5g{D9&hVH}b$ve_i>81`#ly$fDAD$X~C$s$SRY$coD-Thpk2xgNtT?q+ z-wl?HUUTS4gj2lxsJ*Rmf~A4g=46y*b?u_St$e@h7+vkH`wi`?j_b1KhNoN@ zN=lgBzm?R6viRZPWZVUHeYU<~7HE`_T`hAYCo1%J`#ZV{wR^9xO1%!ba!;gnZ6m~e zfz$$xK}E*h6a#yR55bK=<@sp{4-#+P|6)>qAs!EKfyL^$%qJLAGeo>oLk6bdFSJ7- za_%Ney>61+uki&p-}AMIHoNc?U3{v6KH^R~%ERZYSCc&*yZ$0ho&;yB;pbmT)*(HJ z+jRnc3)l{@oa3bH>Eq4Wey~(Nb`fFZe)ccPMlgNxif?XUjLV`+8i=5K8Dj{!MuMtq zO4fq?%sf{2d@iV|J2`=C+rU9k!Ho{4i~`Jne)FdqZrLfHc_tpmfQcfQRtz1wrTAhx z9QK(8q6ae}V0;NevAmHX>v}oLOXanEHSwU`Z&@&9s{ih(+ut7vJav?TqM=5!P?*kp zs9&UsDp2A9&unD1HU5VSnt?k-&Z}SPh&vadtY52xiii+gtd(|kBmdE=YE)S+sEI>f z|Mc?#j;cW@+sS{fRvN%l#98LhYl>Iavl9Uyj};d`e*Uw@SBK|;c!8I(eEGiOJSI79~^&V+_#4L$Qfo81jkNG z?qg+S=@!3$e|aG}K9wp-Vg0wne>hQCG|_(2VgG~f)nuXJwu-wgidtB-TiY`s{s3{A zqgghxsef(fuU4eA6Jh8-P9zz`*;VBt(DhK*xV@cV^?blKR?9zivn}iFSE)dD)``Zl z5E77d!neA&lDc^!b#3phs7PydsY1g&@%ZxZ`}wq8U6)s<-sU<^^f?RuK_+sh5v3}7 z^4}bcHgi#dV&Jv#JZR6p-_;Dw$a0U=ty<~ei|M)lM5fa_FTLnGKWiSEIhbm8BKBqQ zS)RrYyX8~;hj*D(vl4Hb&L|MOl8P832AL?b$XhJfL`v&;6Isf+V-$V)#WQ6`&btNT z@6x7HtKV%LFNx~u+bFx<-4D}xeLl312|K_2!w4j^YvVC@JaR3|C0E!91s#q=I4vXD z)a$X-7Jt$T$i++WZiRZdE+2Q}PS1PYHE_Uff_@^OZA>U_xVS%?)6FdmegbHFlx_23 zIsXF?qVZJ6s|}lUZS%G8_YIW65bKfYNeqg^%MBN!EFnZN@#Cno?o_m_YLX1MA14hYI%@=v{j^W>pw9vHVQp>@>h` z8#RN1?;l|(k3yFdw%?8cs0d8%%f^!dQv#bG%1JXbZit>9ZF@L4tnHBC&6?Scm_5IW zbR@`i(w3#$7~~27FOB?Na`ghsV}z z@{ck}6!tbsbXlHi%tdrQGuMF`A>0Z>bHB>D>R z6Z{!c@WoVTUj@yyVS4pnw20bK{aENo1rCc%g)7ms3!SN?&19@5%@7sM5oNie!R6uX zzEH5x-*a$|x|{pkQ|V`;Cr`u!^=g)=Fa-|d5gTsQ`TOu-?RQuUEY!Trbpc147ptaq zE2=qnU|8U{ay%E!rtlx#=46X!P3EX4Y8`%xJE}t;xsVM~L|;lo{;!76NikC@35Os= znk~`FTAiDZx*X#J&uxUN&9N^>!r%B)GVI~RrHl}KovnRWB=@gI4K)d8Wj^2y?rf5^Q7l<&R>@Ss|415nYi z*jdljNU=#dPs8a;iZJgU2V&r%Jm2OejemoSGgDq?av9W_`tK{uqABXp_$NtP()LL5 zqSHk!8>y5^a-mjkS=X|Ai@v*0hvJABmug>~@W<^^qE6Jp=pJkqunwYJ)ACKF$Fom0 z&}0`a(%vGCuj;>q9lRPYE{8Lzg&|=^&Zmkml74q@S*1Bq_dJxP*!C`UkFQJG7vlu=hFwZ8T}=hf zDIR@$pg!Bhu8ND#iOviAiJ2_F?3f3 zt5qvQscHXeb95}a?nmFwyaOd2g%DE5#m7HVGH7VTZ#pGx^Ph7{37oNxO*65Q0M^tBs#YLzctWP|SEdgB-;|F24{UCi6lwa+SkxQKVx-idfLpC0RwW~$8biCTM! zbx2)-ae{|;@8S1d9VI#u?CZYgMQa{SfqC5;_Z4sFk%xfwF{M;;x$!ne?q0r4JIiIr z_&j2dfE5l_gUGkF)K6$%ziLGSQ+spX(zS z*mVHE_5F;se&^Cqyal4uzQ9wc!}HCkRsMw(_~2^H{)Y@qu{w^hPq=T%%=(u;vfX59 zbsWXvgQYXXynzQ)gVuzdMp{a0#oDU`xjZU5D;Vvc06|Q9Jj{iOV9)~yNW5Y{OM2Oy zhX`YkZKY&qv-T(JB_iv49X~b+2H)^meG1$i2w%L_D&9nuP|e9G@ggg9Kt{vUU5AC( zSXNv!X}AVa`0y!jrJBKyKrp)7Z#!?F$fqgdQ!AzCJM)T6T_C+q4YzZDH|9ka^B0lS z_vfA(ZStMP&$?z8@a6s7)evW3Ab$#| zrO-RkezBnSe)XAdY0)DvHqNRZrgBlGQQMyTp{!gp53(^lu_}`Zo=Pc3I{Ac)3L>}W z5G^N#&*r>NgkH|88uX+)W<2B=26|}h*kyyc=Wojf>8Qy-wqnKF!ZS@`EYY4v5qkgs;>K$C1UR&o0n9*YTO+8rO@0Z?Lr(KvlnXv3$dPcV!p<(ntX2f^Cys7 zEsdJA3~o*=h0ZBG>Ql6p!k0=_>0iS8eD!j&ms$EwQ=S)9JsL)s+!X5T-2svI7@QOu zRaG(_^JYh1av#Wv^(7&aR^zNQ^i_kKEQIRQcvLn+PnZtn4f-tLhTro6z*xTLQY^1i zCOWqj^W?L=1iIC^vgCt1;c3>eVsi4)(UzwTPszOrj`>iw@9lJ`!iwmCji#cax4tTK z+Z75q7+GG0{NM77IdTaa8f~{vPR9<$h*W79;G=*c<_z4bTiu;B2B0P1Y1RyFp2eUq z9N%fa>5zLSWmu)1>UKlWCL|Z(m7h);uP>Y_$iBKGZrjzPMX_I+H7JCM(#(q+1)M*8 zeAj`i`CTa`tf>112H~iZXMCT#Jov5@_i1wPtCzXvD~x-^7oqfpZj9#@J9H@DQpU?Q zzh-A&=fO8cW_ZRQKO!Z>S$|}>Ws}s1>1P^FowLYKHjw#jlnri*4BtM$Y15hOdyZ)W zJwe~9=FQ~)nBao!$sltlI5~G9oiYr-iBLO*pEkU;!n)p?n0IWTzX+oYVNHNKN%~Ay z^?9y-&@*&v>ra0#+0*t*tRyKt#ZpIc28w+hR9>=jPcDwC&y=-s>J|+9agvmr%wbhk zrS>GvG8*{kB|oYKXVNy@K7Hjro%VCm#Xaf|e{Io9qE*p$*r`OZWFg z%uLA*H0(IFXr{`}Wx(b+OI`_|DVv&Up2v5&`GCpJ_o#HK2~_m88>EzYV%Bp&kFohG ztcS?0ufa&%qK@n@ETyyoX|6i%a1;;&7`Y(X?n`<+b9C$uR@HwzFQN_MAI9ob4Maj- z{SutLuB@!I4A8x}6B zyvQ)o)o_qS+BzB*N(t37l3eaOr6erb@5MjS{Sc*F)HMJ$Jw^jeo9=m^+;r|?*^xkV z1tPUHOjwNgB-Db0+3SU3sg^Zt+Wa|%K#Aeh>3*H+43>!S=&A09jnAhQYL*V$!mFX& zPcc6;JqxEEkbQn_lSIiLuDVQqJ%C_92FZpQhE3^~n0Xl$laTgdLzyB4i)U*jU5sM@ zAX91gzUtcy!mOUR}5H8vo;#=Kne=1?3 zGlwsoxq24MefVEwxk_vMbW(F=35l_)(6Ix%y4l@%rARV!k`eK+r>g=<@J$W+p%p@y zM-pfNTXE~Qpc*w>RRNo&Dl6+~LQ^E99B@HZ>0fwL_-u90*l>?%`(E z3q{q$PBYKk+p9q0bXcu8%eH}@T7lm`UrM*hw3I5-IR?s~+Jcjs8j+_swJi=pWtR-! zKv;~G@+e>aXZb5sI8UQ4iOX?96$@MMMI z0NCPE?JLbr$E)|S1OV13ZjWek`o$z-l`JcE4!u~CexOXx@my~XQutUz3`e@5km`zR zpVX=aCu)v_lj`6n#L(t^AJc{F;c%esktL|P6g+N2$2bjB53`)-3}JJsdNeZ~HTD9Y z56>)dcRqG%YPKpnYCerY=2&>Xf)ww#$;2QMfXIqGvHt%rkjCUh?b|A*8QKSNpEiXZ zO;f|VUXo?Pov3@ps0c~uQ~4v?TNCjeq-Rmum^3}bLrfx!{@@`u1y22wyyMwC<_i4v zunmt$c+(n(3En_xF~6zw0-65Cu$xuZ`g*hfxW zS1%Isyp4CHsR@`-(`SOfR>_H@lV_p(>i|g$RY;AFlG~ zfbHoNsSSmuN|ay?k$!zHl#<)!tSn=EBr$n#Yay?8F_WcCw7O0tN=37(#y1GVZ{X5Fv8y{JepP>mhrYr`4&*5i5Hg=%B5 z3B2gEB_|eoF(Tr*>}x%cqM`ddh(S@SWZVy50{|&PB>gAf8`lcljf?5D`X6Mx^1s6e z7n?!ZvZcExTW9XeGw-a9Jvt)Cee))2(LvUNIIoXtcEDGnOG!6o6Rk*$ogS<^B}<;< zt20Ci2#5pnl7FWi;-5A8`&U7Z3SzpehUZ>o$dsH^%qzRN+GFTJ?Uf}mq?oVy_+DKy z_ohB2D}nzGcw=n3`l#;A2~uZ|uZH+dbvOI}qFkDPVI??`S`C7*G;4(s_xHs2Z*n*? z$5L?5xf}yg0Fe+B*=Eafywi1??i9>=o-)XMPlZ@s`<0Y(ptYN4apUjv+?4~zG~`5Ilr$r>XB<*IXq`4Mk3)E z%M(C@eLSETpSib)uk99CbPg&XPg5S2&TOC#hx*lC`mQCXD)ldu%bh&(k1v~I9bn%b zi3c2suxLR;gC($eL$g@N0X~a*2x0J)nGW1hbkb)J+C`oOi`Yo~Z_T7alOZgJ_brLm zSR~GQxfFx*0^eOC*5yn4jFuOF*_u;A-2FqhSY1e6c3^Dw>HTI=mdlFe{i zq2vU|fQ$VU5$zHt#6eb>cFxN38^g#qYU@%E81rjUcAsOX@oJPVY8$rjzi7RRT{u^a=V%Ou?jhPYqmY zE}4Nt2k|SptR_Z;P}h6gH(fAgRcaO~wjmOWR7aZ{^PNARsL_dXU`u4`Sgdfo)-FxW z_z7@)cD4qa-cZm-0n&^Aortz`(l+-l(rg|mEWpwGxeN{XY|eIhJF8jRnx;7kk3-MQ z+_m5NVk4lY^7qG&!i0S7uSTa0+Ekw@1)0bS(S@VA5&puCl$B^URn)L+f7P>Uo0&Bh zp4IvZ&5;9CMdp8R!CLCfFu@=*dR#8T!sMg-+nXJ2Y5 z0*CVk4iZVWw~OcbEn7t8V9{e4Dvm&Itp^#jv9?` zzh=T2x|T?26ab#)!e!yO%Ky#a?yi%?PlxDsh|l&qr)04e^tHi`Gt=oi1K6Q$Sl?-? z*OsU`DPfVRhu2h@6zvwGz^r*@X8x;2RfTdskH|7o6nvSW@R*%zI)T{KcrWxR?aAMH zO!p2~!9=2`faiDv7l#$>?2NZwbvxDjn1PhzFAF+3!EUTZWzP31B=qTkpQL)|=q^kY zH29jK5Op*5C;1MU0s5$55y<0GYOAc~2oRrjKCb6NWtTa%wmc}Rl5s0?$hrQz6H$Ot zWQnw(XXPbR6Z2{LEh0tCNz|}DzE=orc(-gpnx19zC925|i|=2(_BroHO?b6LtzA!x z$-FL`(kN5;<-A#WOV27UPBDHuZvz2&0GX~E4NI?2(0tzz&Rb0zMMB-=>Bxx4pbqhH zaBSkz(&&q2GW0Pq_KJ98paY2S-(Ltx?5I`e?|iy7>R_KNU(q0LJ3~Hq3z#h-=*) zvmgN!nezS9md|6>tK}-oLp|pes=&}z#}aHcZF||JZM$1_d(gt!%FR^wY2<)GR$N#< zW#~XYEmj0I9i7Z*7m(+!u1;rgKgDNa6S%7XJ4j9C?6ly(KC@zYN)I)Q4YcArtHEgn ztg+n!Cv3a8G&MRMAIHI?7h|($NDUgmSXx;8!o-A~o5&Do!Y?g3U|}&pF5%8d@sY zc*tXr9#P6&?i-l4<*Yf!0X+qG3^K;9S|mP34={~f-!{)vaCIA*us*k84(`Vs>dd$! zAyQpB40t$;D5W_tu8l$vEpB5X))#Az4dUD0(!V5?KipbRcqU2><=`eL?o_QbYX1Bk z9#RGOvM{bCyxgQ+TVfqkmuH^PBp?s&|0a+SYiCKIv6rczmE@zqD)K-kvs4kGOldn; z*)ace6qA^2%n?J&kwrGbWOYcZqMX1f+EKbucB-BKmrZi|rR-fo@!?t2v;&zzBU5`k zx#OwQL_&Qxh66QMA|B`PKM&)y*`l+PIaN_BD)Y6K(&0ozRGR0)(-V%tWad>dsy0F| zFa`yS@dU{re}otBHG=Y3)YI)yAF_>x82U6VTPpf-I;$96CX3ME7gu9x^z zu6f(|k4P_gT8v(@Ogwl3Ubq$g`~@E9|dcpng{z2w9n2KzL6wPZ4XkokhE; zPq*XS+)ym{QtuWTo0}b&yOl`ZgsY22DYpbIS{VDijk>ATrpB|&00f;&(=W`{^Utp? zl)E^ewDPPxy<>XZ_4GrYy`Dr+l&~w8*w)7zqR^{qJ-XTs6b?@#i)shWl6F)(;bky$ zSouvq3a{LGOv`DVCYf}~JyAs5@ zyZaBCk{I=usglc`^Zdp;!-k^oxJ*0(?>ifyw6ao#8}hciToW2F7{kD2iGZ&6}T{2JNdA-Oire5;IPKSL9A%WK0GiM7hUP0}dw8=YScpUj}V9OQHyE zBcJpza~MQQEjps|^74vqn)665I`Z+bkjw0BT9J z?3v|N^>8rnvy2->WQ?ZiyJ|lGPnMOKw|uR8G^)W$$UFJ%%i-`({xD4a_G~gpW0CVx(@-9wbD= zUJBJkoN6?2mt~{60{#Uiz@0xY``QQr^zGwz6B(w+i-Z`$;%Ksmx@-)#<3opVL4U?s zcR4=s5ttsv*xA@LK?CmYkVl)WR~z~)z7zUNB+wrve{|WWvU|8e{}t@cDfk=o^XGz| zoCaFE@u1aBVJ6szZYL=vX=QD*_4#xyccalf$^=QDb|JVlC#VX0tf^$=yPARQV`78w z_5vQWnW%ck7je!nGEx~!rYoVbke;uei7~hf=C%vf3wjm0#-5!fNfU`Mq@e;9$P!oFVydzRB8Z zH4NANGw;22!o(*RyG(4|F8I>95@X{8RcPirI`XOq{%SSbc$)4C+t{cP)w*4UO@qbR zkuV(Z&3JuvL&G8-i|J&vOgiiO@EA>)8 zTqUoA%`$NqmXIB)yOihM ze2g`?5V-rmcv=E?K#ae?7pQKG9-&I}uABrdtgfj^waew~+sjI$f-{^K9`PkxuOu!xGq`hBU>3q5-H8&oRg98y$kbd zH!-;7PnZMs&y92-G1(@osZ`0P>d}M{bMPMA*St+F(fz7LL}ZAbl+Ll{R*6ZJFHA&| zJM-zUZMP0t0h&=q4b_`Tr@j7W`?=##0n`cEiM#3iDz;N}HHpUnzrfWklpMt!hEn_m zEB6I+D`%jm7>|epPFoozbBTMd(PJ;p&P6x-bb6-Vt=3qtW2x?;IdZ+dwbm}L!sF6X z4DL80kz7e^DeY36_hD_Q$>-xm2^W=+N5`pM=fZ(&k8M#Kb;h|$%=GWm&EX)qY^IU- z^@u3&;e6dfMJ0*4D9~7g(@wv}WvfTm`tA9%)nSg03?ql@pD!^cMdq?N5sgBj+bbM` zP>k9j(dc9{_n!-G&lVe~$37+3+G1@0-(oX^XUUL*)Eo%ksqE>wJP2md_aCBx{po$Xj(n9ciMT3GNM0ICnh;LM$>|$7a>=8 zD*c7T7k2MP;&90Yq$(VIU$6!VeeBUMTS@&+##(!1a$qfP+LPbVdT=a#=NTZV@xOwv zp7jj&KOW-m2)TFUMKJa3+K-M)$E31XE%CnHqUX2S$fcW{U$qRFm(WGgYB;n-{*YGH z(WyvGI#X~xT`K2bo2LPL`$iENUe|%^&aMq79w)0$A>WIBaN>1i)|glSN*Devq|+jr z^T^v?*4V#OM$j6aJ=Cl;Pljp~6-PAYdVAWCX6z_cQa<)9j?05udie7^JBwCol{(S) zi;2xV@hq!ax7<&2Rrp|)jUu>2(UBwea0zt5JT_0Q#( z6}nl5$kxV3tDK2ifL7}VA2MK)N}V;=iAwLq)zEMj##!QgCiTxwt#i+9eF{xZ;}~g4 zxVC2=8<}-9nCQ7-I5z?p+_D(CT)E}|X!5G}P9aoG0L z!UUAR%~s#8U&S>={rLM5JkGiU#iW0b&IFsPi7zhFF1Vlp1$LAa} zesExC>YJUF)wZvpz{y%gLn$!R4x8zi>3%Sfm&L`Ff=(hn3dHnm6pa5 zVjk@p1&JZ=%Rk!CZ*Zz-Z2X#5$4oY6lj4q&GS})KES{PKyK7E4J5%3pDrIsHCqFfw zV+EX%FXL_ZDR@>KP-PQwl?<|feQg>0esyS?rjh7buyWO-Jrgoc{7!1kbd= zwVNykDN3^m+AQB_zVYFuXOjsYXFpJ$?XPffc-gSq zJ>Tv8VnwDJtgA0UwZ#E)H~bfnz@~A?)CaH8Em*>LBd&@0Q1JS2GoA1wM`COG#TP`q zl2QXP`NEDm>&KG<`IXP{79(m)R_WuZNGW1J>iBYC3O3oOg$WKrKT|9tuLa%EsYZp=fr8C#*(JPKd0H*Dbp7bW~Kptd{GV zd~)1&kWmFD|L%6_rj|x0FVSM|sLwy}WKXP8@HA$aMyOikD5pIgEo?vaEawRO8I9LF zMEc_xMq;G6c7s{13ji>2e&J9f2{>rmy(Ix^(RBY+ZMz9NeUAE0{K z(df@6xaoE$2Pv4F67Jhfj7nWy417{Wl*g;`B6Rt!kqOlkDXBlMtAE3}WoC7;I=XEq z%W-;dWGm!n*Ks+^PfYrwZ`_2fqT(ige+)6md^VpOBZx-rpd6w{A5}vGDnX^fu*J01?xbc8REATzjm;Gsbtnq1+trAD}xcAz^A;b~j;YrcH5!KHoOwkn=<`!Gj%8Y~xp7b!|?^U8f%sk>G5-qX&j0Twr!b>Ng_f4-YiI%q6blc)Wg+ z_7&@nxg?s?YF)DOvgD#v3OtU6NHk2yza{pXUjPJ7wLj%14otBooy#URYj|h6c?!J-OTjMv;;KOdrz@O;?_UG4|mwrr|@IYdbN(c4S?4+dD;XDyG zr;qn=n3{T(Y!-@EvE3#R$lB@d#QDS-#BRQ`vs1XWg-S(9sT@x#YGGkJx~ERY4{LP>&2x0Mrn5 zfW4+G|F0Iln;}%26OBE}0s%}?-*_(rA&7z04lK+@cM%M2;H>f_R_n3r>lMUHGAZ5z zT${^ufc~kv$aWlwcA+C@Nw&fUpC_e}h6E3`nY`rXjMVNLp;v6h`}G*_d>2sV4|r6q z8T$(|`FPj4ZvWXPkc9V8T#CkyJ4hnM!Ng1wmX(dBrl2TUcND3ZuZ@fxsfI_Nw0Blj zbAOt4k;N8&XS*lN{A9N+m8C^W!l1S zt!cu!8wpT80yJnsaI7cp@O`{~+KeM%S5!Bn*x$GLhEZrZJxxxY~=xAYmOHzN)G!3jf^T5u+rTVj?Pj{&@;G&Fg>w&263`kpWES6_ZTlKC zObQR_ljNzJBN8{RzN7FbZU`c9rP3Apt@e7qjvxAikXv#YeuN3Wa;EGIj=lUJAgn;D zoCALJ=8=)Qle1BuIHsA8NPa*e_0;5`z@vT9yj4nzqz~6F8%@o`xendMX6r`H z{m4jtjW5$tRNvs!KQ4UuIyb(9oEB6;Y?WiA5=U{$F(uKOqw0LnXl|j1A$`XxkUw%i zfKZpStUWZ4mgF=(bP~hR=eOuS*+sA@YzOjF7tSm^TV*9{LLQyW7iT{2Bn$6PQ|al0 zAxT3b+`wC_71EZ$$T-&H5lC=Wev`*qM($}?oE(g>G+@{M zY&c+e2NEE1)`M#cS-f&@OpMv1l|z%qXzlKRv}Ji@B+a$b&i*V`V`_9Dor3~kx53bk z;a{PhlncznBRkJjBqA3@iA6yVVfp))v6*My^GLqie&694An_~33LuF*Q7n2!krj3U%LT z0)P{42hgS>Ycs;O{F2nunpM%RJ_xJ#4``?V9fFdSJ`=5?ipGB#+IK8MO}$as_U5AG zd-!EL)56HTU^w-250b0i>K_G@qYif+rq1(b;kK)#wZpeek-Li{ zA6jmn!Ua#t9=wr~Xs`@xAMa_d_cdnmGwcOg%cxP&7Ruyv)5+YkOe-En;!#Bah{gn6 z*rx&}w{Pioc{MZ)c`MXDtCt`TeI}SPR2|IT-?#y69~!bd6fTHV%hZl0cAs+7NwDkg zD=Uz!>fP9OYh1!Wf|+NYE<5l_1!yYvFg#wkAv*PNx9BO8@3!OqS4q)m{!fsup$K30 zsN^3$S3FrlC6&9)axy9Dy8ca5d%&ZY-Z8e+<<-(nkDx)1R)~dJplr}G)1WHfv3?Z7 z=a}#~tdhVRQ*!|^nJC)c-#r@p%N6v_RbO9Lvb%@?pPny0jIrbalq~mEbUGnSTc8>h z7l62A{QML@sBQ+`Y(5rMR1Y|hIm6j=+xL0CX`?Z*Z#xq^!0YEvpVE(ALRgzq5;39V zdKH2x0otCMHBSPfN*b4V=8{0i-N?$S2knylR2=JHhQg7rD}2bIi#dldzPvALD_u=R z3~;_n1OcB&O(Db-eKSkDnu>XN?-GmeoR@! zhySX3G|zV(N$R z4g1ehdy*ijPYxQ9S3(Id^H*mkVPVN3ngOzp!p$$dkIWCb)XIkXjs_vmE~;2Fd@2Kfm^|qu zm_kO-g<(hF2T^eVPkQO>VCjvfsi_=MQmCA3 ze#?gkgH-$L!b|&&rkX=XtJXj7CvWA%$$4FFeMIJ-`|QrubZU0bc%;jjV6}*U$W}gq z1V8}Spx|N9HL1l(XXps{H+-F^E5~6j)NAnv0NglLrETH`oFjyL$9Fof5@MJq>;L-BV zlBJ7DhRjZHp*ffvo>iWL>%qfc^@0Cd?MWQmd3R|)-%pZvJ>D@$ssa4466gR;=6 zN(M_h$HaM>5VbJQ?Ko!Ey6}33s?)bbd|I)nE4Q9;>ru8hqoryF*MoHyzhvymkmtk4 z$wo*kCPf#L5@*}R3Z)YI`s7MU4sM@@!~f9!iltJ&AFexzSld*=QW(SIXW-J*6Y`bOg3r#=dE0S8>3Cxk3n~&*3uVs6%BWUt6+?_S2UMZeH+|S2@@q9Xx(Rd_@;B zXxKEb1bjJ)F@dyPfa;coKJP@Zql11=Twhdm4!Q$DKdiMr$2V`f1fhH@M8d-S)MKXH zv4^~Itt$6)YIV|iLapO&VzM~P0#+IuqGRRds>!;p>yM>LG}ff_(GOz4y58)Wu=`-HaiJ8GnMOz0$Li%66i7>_Xl$dUE-b5Bho!n&}6rbP#S+; z#OjU$e=|yOUi~r}ZeIM$U6aAfZjnqef@rk?PFDn2H&e|!d-h;p0dh^NLFt3|#+1Z>X5B%JIGljv3wPS?c8 z&o#wbsW-!3$*Y~fn^pLiC}Z6I-eRLo;Bm}SBXxrIDP_LES6~UB$<&vwQBOU!qv5ag zky@vC7C5_iqx`338>H`=uR$)B0}f0iN3=1jjI51^$>A5QV%F{RdFgKEy5nde3i#A4 z^2r)E87)nxd~dczHMoBo%bdwoJZb@fPRU&GWRHn2+o25#*2oqV5;!L>^R=$X4 z=yYpKH)}6T8jX#Ic)cJXlTnj?J7`{QCSqDofy$lf6ag|ru9Jnm$>zd_Y8_QjZsouA z9PtTu;;1{Y#5&Q~9WVE+8~S}s@Kb|vet!^g)4Ldm#`iaUbrZS5cQvD7w?@-Ofi-s( zcH`AwZALr?CjzU=rs`83>}2-A8yOVV)!B|6j8E6Ex4S3y9mgPLoPDVnQj+nbcpJBx zIF{j!51w}u=I;1gcY?u(Yj~7x8;80T7e}R-sJnV=#m~VmNnpiZ%UlwHv2><03cs6R zyq3zn!82Uw79?Xq*UoC+Aor6p9FMI(cV?@uKMZ_$+z-bKobKA^w>}});yBFH;_0pUHAVr zCjf9Nrj(^)bN8{#F|WV^sLKaaw^;b{R?J37+9mRK#S;#D&nw70E7T$q<;NpB`+g~M zc(%{dnz{#Tn6!}{^fisjy$uEqoea5)!O}UDeRD{OP_CtzXPtsZ#cQNn%$NBs=(o!; zO}98hd4@v}g*qpDi>rKv23YD4lN%M;NuK}jNMPT3-6fGcq#P0wyU~r;==C>dvKuQv zZk_rU-8D_!A6+Z-aDu}Al?cej%2hB_3=}i9hRP1y?wp7rvp(1tRP-Clb#~jQmlWBh z81$X2g0J5)34&_5HFbbmv7}kY2B)=cT}`IBiU*O&l?F+AOscyIP8AaCopwP^6=6XZ z11{*^6gbGV?bX?dTsow^`rO-XQ5JE?^`gUcG|Ea4V0FgT-jx}REMc{{EY2<_MY#r6 zFN+-T)-YT8*4eqm)R7j%leol0*aif&m|T)(VfBeHmYN}9g{exw@0c1=JUhq%q{avo z!M~Cf&J;O^PGF_>tA+C>wdS2fXq*q=_z%e7gSYwXxutDZ<@;z&J@4l$|0Z&OewmLR zDaP^c>yIH8A`?qjvi%RD%lZSmgD11*O^ zN=4(TL|?+A5~gKodGQ{}Xf$)WOL>gH+x#w*|EHmO&^ehv%-^Taj*O+4R7MZZ*3|Lx zQ5zQ*+uZ15)eK^#O+fZEyR0AxUl9k6vma3<*=|M*%0GH;UIb>ET(-fLB~fw`0D?j7 zby@O_;R`OS(-lb4G-hd9F6i~xbFx-i1B^I;wfKUOXbZVA003*+hqg-vpX>|j5>Q3i zg#Rx)l#a|vG^|od>OreyX8W8*6CrC9Waow!QDXZ;c~m(zl{U`;=whq%TgN5;!I8_L zXLBJ8Ncc!G7nKMS`1*zDk(3Xs;KpMR3nirQD#UMou9E(3^CS7w*+%Ew<@Ffa&JN@r z*61-gSl^aBx3ztatb6?hJ>|UdkjQPwgW+z{m@jkIbe~GC4BTFL?hSh!H{iFcp?)`BO*RJv|LAkaA58WvT!G0L zU%&TlH+JqGe@7#dONsFTSt5F5fKlS?jFGcATtWATY-ek$*MdAs$%l}BeW!A#_3G1P ztK$bYucr$#@K&M6VEY%t8*+(bQB(PeaXqPwEAzb;)nESiB*&9w9j+0e#0(F)kFk*E zK6k~9xa8@exp0fB#1$oKIIhyy790}&+(;(KK}u}#0N7Mvlg{Sd1(>PU32?nwirx5= zuzubjg&qsodfxe{@<{C2p!d!Ll68eux%9k)G5n|dq;HboYwnqgHg;wtHm&K96M6LO zc?+xjWTrkuf}fs`#~!cZAO9d$Z-Gs++3SZk?(YnG)ef{8`DJy>E1${t?Ku4q4eNE1 zl0w4yKVE@-qe(tZy3R=A1#>vo9S+d{*(MC z*^ntpkaDz3=f*G9I0z!HyOPBSlq#Y+qUru}zPr8D&cwl!7xGQl-=%w;3=RYeBhrvU zpgaI{G>{s=SV7Weys1B{{qVk0)Q0!s5T%Pr+`7;Gtt4j~tE_ds#aHyCQ-d1tJG8G2 z_*Y6>={Ip;~zIp2#d zDH=JU$Z>*2v>wdo${im?ZglcVjAH3K6A*x56k)*SK7#zKUr|!GKb#jgS z)x5-_IS2JG79+hY&IVb{nW86(z_NqmY!sc1A>w7HE>Nmr=TWj{nFKyVkh$nHcSXfo zrw$z|KH_ZlG@YOBid^TRU=PAA;U7O+7^v1f!C#c}hA@K!pOWcpJJ)K6eM2Bk2pNmo znyb>eRV==7UA@0pXqk?6-Nw_XSEvNGkV4dSQ7?2|hpX!;|0sNP(`Y&PR&&+$!mBFj zck85)DX>}c^6rT_MbNW-s|DvvmHqq-9v;eS%6O`0n;&5tW@~wQ4dVKhlBk~;ekh3A z{r+arI3s6Tc}D@RZ<(QJyE-*F`i;;fl1f%o;I8>)!skuKx%R;Me|Wma=*YUI-7zP& zt%+?uiy9H`~B#(POo*&>8ia;yPoQ*ciUmZ_sX+1 zo42laLFaD$-m|KLgnf#LNl$3;7o5m=3d;a=_bxncpP+SNBhyi9%_?dw){3=~#SZS# zkrZt15yfHal4Q^U=^x|4m2{!}u2-wvRcvNe!FBe%DO?^A{|wXesu&?^wnQeClK-c! z@>}tx{l@o)o%YF}!nh>7e|U!lSnlbl70AeCf?Nxy3nSuBeS-gxm<|Vuf#r@hNFF4~ z1aZIfr$!uiEKt)pKs~J8_y)PO;LkUcp?M?Jj)6zcHZj2gx-Ib4+70(b8?`z8JNI8H0H93%CkJOq1q#3zZRVXG zIkR_fGYX~(0jA5;gv7{kPgwfk?$G6cqGnT8Fb9+RM4b+R5v4pLANbX>KUW4k4bCVR z0Q-AgX_NU_<@>K&zJh2MHs%92+`@0TV5UhdO6-W+kXmAdC^)7+>c2#BRzfhtMzQ=Y zXKb6rTGT30q2iF^oWdLX$?uxPTTv=JUmKyZLZ6NsFvBd>=s}#p+w`S*G&)cgA3B*e zH_wI!@CR?n(l(IFODBo;V&{4x5#B8z7gf$Nj#q(9iGw(F2+2{*Ypk-(;J{tD4yv%M z3J12cKGIv)zDfPN!9=XKPE~OVv{y1`Qu4cT6zX}U@0ixHR&^HMqd}8&7F`_`-|QcS zqPa_^Xp^cXl8aKA3k_}s26pWZdq%9)yKC?{za?7pf}-FGpo&1T`l z32`J95>auhgJn*jtQ;zsuw0MN#n?_Jyn)cQ(Z>02yDwPs>U>PEpI;D6K3npFyyI0R zu}UCwQV7{1f0%r4(*Bt>crc%jE=R8+G_jPae7JwcuLNvc{JJKcZyY0ASd3KB2!sz3 z9hR|)`p`?&&LVU1nF}JUj=fka2!}9>D~$w?#O8>+yGGm2F6z}}0-(D(cW!ot0-U06 zeO78W8<|;Eilg)S_&S^de5ZI+RH;oLekRZD-Q-|OrvwoDsqp}WOCaEoY=MjZAjF3| zGeELyiLNK%F&Hr}i5y>0&O1mT-`WEKKL@ zokb&U5{(gJotB4dgc~d01IXu>3_)fajfCia&;ks~VeF}a6KuQ(Vjv{sU6VSS3KIhQ z2&|)0*wxxj2M2dFJ;VzOGhU&~us~8)zM#+dUH$l;Vq%(F{zf@GyuQ3#=9*8PG4vnu zAi}S1tLvv@KL?n}en@t3O}HT;r(}rHaR5j2Fv^PAUi!kOE zrp)FzriM^bs<-18&Py4}4ZWrV{85kBLTGY!D0|(;(+7C~1WXw!Y8?%YqgPTT|_uwcZ=E2qNO?lluuhN5}^ zNZXf=vDLc0cFwE*o1l#Fh zWTBb!38AA?+5B$}7RDHt<+?PU2A(-t2bPL?H+>z za6m=!>@e|@)>=v|;n#4dqt|rku#e}xa0KTX?8?s0yJc6BeF0_CxiA_-jfRnWxcAT6(*V1q!K zU+bO~!+$HQ&XsKq(`%N~M%7mKv8clNE%g;s9v zWbjfN%zL!>wo>`6kCsNw@1liiP;Kwn*lAo={$AHioVEu?EKwxCDpzpu zI@olXd4&2G&zWL8nEMXS*oIQug5$e3dlpfJwLKe|f!*q$Yp1h35{UfsXSTPBDuWA3 z)b3q?0I*W)t{*uov?Yve-NweO8&DT~TAXe>=b&lE z*~uO#wdktkxb70bhM`~so|jy=$1R1w;ncby#t}f#zu>k~mAuz?$o2ZM`o|stvP0HO zPe4xfRw21*T7Y`7O8;vss2@TJv7jDWV#4qC!l38+`qHPSrTGW1N7&)X9v-J+MO9^y z!U%Y>g?SW@BZchG%ztgn9w}P{7t*F?OP5JGFkblyI`qeQn+mb8lw5DXDx_i_TjLzP z$2;L4PnzqrxNTj3bu1$_E-Niucs+N%ZRW;Ob!hR}go8mNh*HRTU7Z?iH7M(M! zm12M#RNU;O3kZk-ZSy_q_qq^4_S=A5>7AYvGl^U|(9~xtX0o_605rV6|LB(kB`WTO zwA{BT8XOuNSO`_$RQyG|%1D+m9Gaxjc$yhz=>)_8mXM(bFbVucFdRq_MyH;-{sY0P zQk7P9w*IZU2 z$N`>>rCuzjHMaZ(Z3~TLf4id?u8wsqi+Kj35yOSXYNROczBG2yN~%csb9uD34i5e0@KUC-`ioL&WM1GiX_o6gUg;1GGbLMKZSW9NrG5D1I~ zUDt6B6cxdha$Cd){b?7*i2wBm1XDLFdYl_wZPuP1t<_pM#O=y#yv~u|#b*?vmCfV>|MOp~O6w#cEkw{UaMNEWO8|*j zmLm7?duB3Sq?r6?Lwid4piW<9b%AGcAi|TXe=OX@$sB7cJ!@)V{8=Y-8>pw7dMm?U zVFY6yA~3Rlb90aLbwh25xUTt*{BB{SC-; zbP3N`X6+^XqkjYnTYJe1mFt+K$sJ_RI9v+CDE?RIj_3hLOfV)yVBd3)-%vJ}upIt% z0igR!B0ve~EnjfG7jjS++P4f<Lj zY@OqMNoHDf{Vj$ddSYOHR#lBVBN@HAZg)@it|a$<4fOY$Qg$qZ=Zxn^XP%4$+5m32ufOTqA=!4JKGeZaU64%9p zP0NfAUZ?w;3#19Blld06r?ou4One*aAY^*a>E=YC9*De+H+jdcEFD;YKmlwrPCjM$ zAkf=7F4Z_4|MxlEdOTplp7_POoU6OJ~kT{&+^mC}U$zaR5r~{;O^N0}Y!EAJhrb!{JbdX+f zs9?`t!u41!{V7~Vi+!wBsaC+QNymY$suX{)pr)59b03>C%S|N9mdU9x-qoB(;F9u2 z7QN&f6GWz5#_Jl4p9@Foi6On2 zSc`S7nVN|a)mi-`a9jfQ0#1qygW9fN(PBUyzUtLAsgjA{@Xrt3E6yj8Ef`6ZgC+F^ zO}sL^x-6JF6TP5yqzdRm1U33K4V_pitiIrb>;tOo7yBu!?P=WrRO&XTf}a7YhML{e z43}mimm*h7YASI(I(ft8ZT)3l31=;7N?|rRRj|hRO z8yeJgp=SVrCkZHMK~VRDV{)f|kW?TtxC!zDWT5w0?(E*~FV+a925Y7*i(^!mw02(Po9(l8c%>Ry;<)k>ixqRB$oxVZ)5M@%yknE>LRm zsOPZ`Y!F}qT!vQAB)P(&@!=i8xy8=OB^prY`Nw}j6X?(xX@rFro)VT{jTMWx9Uzb4 zPM!U67f@ib&lIPkhK_|&8o9KB;HHj1j1z)_E7z<%y!LZ)nEHo1FvU)V*op#%`O0=G zITFP*P*DMx0@tuYa|nWSaAr5BzY|$2Ea{PWY150R>T-{FkWTA=Vgnd|^{OEkmOgf! zyM%8P2x1;17CGBsGs-$wjHo1}j33uZMio%Y_>jvB!-l^0g!T>=fg*hUV7ZXOW?V~0 znc%Q(ylU(Nu)O2McqZr1lmB|+ObKxrhi^&2zN+mCIeVRKBf|!jmsT0jIBiNp9NFw( zR5Jn?t)}4DgU-2BuyGyRJH#yrt?nn%)^9Ye!pK^%FB#uZzJALBm5u`bwc83XC;;rB zj1k~BV*IaN1shTNN5`Pop$MRDfjVl@pzoBhMNBWn?RfpdZ?ZA4LF7=;ScF&`} z3MG<0qY~#_{_a09EQ|@GvMewS?<>5pQU%9Tu83P8~#vMl!W zRD`Y7KDY9MhE)K(2&ilOyU+MQwjQwNHueQpxq!nBCtZcAfXzb4tso_72i&6M@*^63 z0rz#MLQ#f_qT`k(KL@x%;CLlG*n1`k{1m-HWC`ltCKrbxTKvm3FmyWFiLgrp@NQ<; ztS)nO@g%`A%pv>H1nzoK8rNdSVAphxsY$7tsQnFK^i(b50X+PRbe8V;9YY=;OHL-@ z{5;goNvFt29v4r%cseW(&>w0?9LJx1`0)^&N;NmbOjuU#TvsE+_t)}tu@0Slw3KBh zi6ul)Xd;Q=5na|0AJ>M$iAl~f-M90m|KhgK_AWPnq7UhU$zmZHV$I{>=?NPFIuROq z>p8yB)Mk;k$G^!Fm5q@=c2AWI1s7kg(G!&;nR8xkes3n5zuE2%RYP6Ft$gyQq_`fA z$87@)EkKX&G&W(a58c6D0V$Bg$ha`TSH;`7Rd-VxaloG1?5ZA92I-!N6r>Rs=mDlT zV^8z_ylT zY0>lgd8-5#prpI^SfvwxrCAsnbUGqrm{r!S#qoT3M_%85DWD+Bj-L9X@8U_0`|=IW zL(*!wej0hi@ZGNGyf)_;ayT>F=!_S9SJKdOl4;@d{7Kig7cNVi2l=fH^ZckNW4W$U<$H}28T*(h*`64S z<)VE8FKc#KI=}-X+hn2-YXCVqlwKP0?P1??+&(eDx_YC+VH{uFXiR$Ae)MKs;{KWg zgT$@qmigeW(&l5ZZ9O3M=Sqw47)dTGhPxTv^`4@D(F7QP91wIbteBb}mV=(oFhhQ4#8|Ta@zpAt zXMKsW)=2=PsW%GG$IPH&puSd6_WI|tI3~dR{lwT~ZuO6W@(=Z71^&Acypv0OziTl6 zS&H4flJ5j=hVtLPNJPhyTH>OL7hGf$Q}RxU4#~@t#Itx93Fvlpzv|Nhx3Yy z{>}hh@-6OW4kl4Vj66)j4IJ0LLrUp4Tmcm_m9cV)?UFI`8A=w83}8DnmUE0qb2zKV zRGX4!?Jyr46X%bG9K{cd-1iM7a!7>`oV#isoF#w+w7!qFnub!4%cF0Kd2D%-uCVD@^wMTNlE zoHEk1!1(rZLi=l!KEHKjDBI7|swT%GW9gtFS;%a(;gE6;wSau|7;e^VY4MLMkk>(n zzwPLTEqEEyDzP+$GGwBQ@;oh6L&ifJ^I|cLpFEuZVeF-R^(S@5kFm4v;HB82NLxHf zG4d#Rm&(tBu($axAsM6&e5y#SCw_+*W*-GQOvs|?-MdluyBw?i>CMg4mIBB3thtjy z+))Z1hJ-jQ#~c=;r6GdHT|?g_guAyM%xCAjF1iBg$YI-;oJJ=f*E!a3+MWFaJ6lXZ zNbp|HLv%)poNenB0bUl$dSmeJ8{K29mryG5<=E9<4^$!>%IFaIpLuIL_@GVW67WRL z;`BqD{gHug93vAt^1oVu>36Oxy#m5xCV&?E27pgiJ{Ou^M0PwtmQgS zCa;$dw}YugyKvf(Ft1M_b$U{^aDaN`(wq8kaa zoxod4W=7iDea5WGfZt+|TzD>hDlvs)-t z>BuQ4FhEOxut0@d?b4NJHlHeZCJ!mztHaGkALC2@AOGv=M?W)w5X5ova~FVHlw21v zhl#V95np5N%|{i6lsX0)JB9*KBycjt18$^?yg1BbEI41`qG~QW`4-}rem5Gbtzuah zc;ZaA?mB#J;4t{U7jDyCj|PK)w2%<`!7JTlWDK9>sX=d!_`DW~Ptj3jA!fz98;zYl zc(vbvwz}bE*Y1>m{l#M_A@$Q#jlH%Yb-)mC<~SP&%4 z0Iw7Y-gb+;cS0DONx5u8RH^SPKDDkt0Wdl}$9P>zWl}mpBr|xqr(0-rQnA$dj;jm2 zBW)vTNiS2wXc6E}H0X5C+_LzSuRE0+7%CoD2|;PSaT|CZTEur?W7Uv0e$w}wR(gMu z*cKI};Li{9k@@gHm4!Rz1LR#R><>LawZBXTRAG3SEA6i+Yi)v&Jl3}2gD{DH-nTHM zu1Z>|`KA%Kbm>8Nm65}4U+byJ7$KRw-Ex@E{z{9ZK$_W(f3N7-{Bw(h$r7j?`%U(6 zmRd+hl%xF-_Z*h8b+2vk{zKC)PZ@5fl&-9=+3=}e-O$=7Z7qhGPD!rAh%E1ZfT%AX zZpVH1PBLhIHc)!1Tkmmy_edxF?(3zt6tVA>FJ3C1tW0dO@m;L$@{oCk)=HftMIq(( z%`|aI;*q@VPZ;ThxF%|ZeaE_5D684w>?zyP7 zL36gv^D9?Mn*&oKC9Y*+$X#dLyT6jMc;S$Izybe}<@7av(shafDS-bNi#WFh0tv!? zVzu2`O+eU;vS@esG953X*9fJ!WX&n^Ne9O)CBG67nGuc-q}@o}ENLsaJFzHLyENg(vRpR518BxN`K6CWHl*Ziubo zRrdE!8`4LmC5YSl920nM?SguK;JF{EV*f=p(4q8u-P$svqAivj(7Jw#wM8Q{2^>*( zn<(__u{wcUx^VTZGgqg|VE>whh@T;~sr8au`v}yxzIf^Y1r{-&%*XyJaH>T4Ca<)j zerHs7Gb#3b)I1vKv-k^c|FHyXw$UMQ6pCwtBB$q8wSxDEK3!r;k2zi{A!_>buIp{V z&(HRlnHdFu*9EP57)>5UxRsQo960)3^BJE0D{8sk8wQk~=Q6J;c~Ry%oj`Q#o4gC# zPrQCKy&661)(IW*gc31I-Rg+TbnDl1oGe(16R>h)lk9>}$Us*#d@tmG3b`A}hpDEZ zGrNqFsP%P{sPv_W#$iOhu*Vk zS}Dr(7{_f>M&3)>L{faGtP2rj*E13CRDbqc=G)D12bXmvJrNHw<&Bc-Wd23Hg z<1d0f?_AIT(_$*OwoOgqPaWQrs&fl9Z`iiCNA3G$;wyB))i=!rF(yOV>27y^7VY;E zLpdT;$tiA4)GRx}n`CcyMT4)DU56P})+=5WxB$KTQ0;kw^|#w4G?PEcZid2O+a<_L zwM>TZW%@W#Ydb^b(@PC0z_VDmqbO3pk8Q!9@T|MTPrk-Xj2`lj?HOCorSo+3zRxo7 z0K>NBU%=Et6}_ z>J%Z}dyojPfIlWb()&I)q>-wf9R=u&)EHtg^1;4sl)-n%aF(Rlf!ccRYBbRFPg-*Z z-yfzL1`myTdzYchEECcQH%U5*yK9PzH~IUo0SiPzZYi{W+0WIlV7+a3XvZ_g8|WUx zLDvQQIp1~NoY|S1hRnbIXBnwkIZt=uF`+%pl<>aUS)a9My6TqFwG`A(AOXT68k!j{lU{YOZyS=ApMMW*GghsQJP`w9 zeS{iI{6T#z%Oy2o3N?}!b`-HYNqnCFOgnzWAI_&78bMIyB#NZ)dqMeFJ&^y&9H(xv znvSASb1bk}d$Z1FIA42uKkqK&v|s%A?R7!# zxFp-6+*JApMv*C5$lKGh!~J2v7>_+?_Mb2a zv8?eku!&nD$>_z%WJgSRVy5VUsA#qn5>7zo#p7p^`T~3i*1LxHD>oMppSdfMJSr8( zN~;rE9|O3YuE&bE6{{XH`qhYg2WbiyaROX6ADU=s_`s>$z6(YALg)sCkJCwYc^Ao{ zP!zxjpWffR)Q;kOB6ag7*ziU&R>8`Xr(=qPZ+6-ul-8ipRc(0H9>=V_XSXK zz|Eu<#;v}$1@whl2CpoLIVKe_ebDf=+oW5bI>&#>77=&I&Kyb;=Krk})5;X`9Kjr#b zoHzd8ZoY{0Q!s);9WG+=Udi&Uk)u@+xc*OwUVa6^Mw*z)@(nqdkka;^iHZy7aWKga>T; zyt~oT>q#=UvIlPhk0BQhU4l2WrwHayg8;J*GGqNi($N4C-s%?(6^(U=Hy?)pvhFWb zU*xbDPOWr9<9G=Tm=8by#N+eVxMq~}zvAmZHBK5Si2751b}0SkXA1`ScWp-3@9LyD zl_J`KSs;?T z3ABXaF?iCqn%r}Xhp9WFsiin)XXaJbMg)uNNQ+xbC0<9%DM2@CV7Le^ zy|1LolLKl^7i^ndUSg2W!ezoJ07i{C_LE|fF|thoeMniU=EVclA4 z5X6Q=;P*I#yh!V3^(#PrN7#{&xk7F<*jJ_u{2JF^`HP=G4y=2xiaZ<#8_H&3fP}VX zL)aJOr345d-{T)kcJL@FmyU;+;S~9z+u{ex+x@cm`zfGgd3E=GYGRBCDWv;b8||;n zT#3bTjQkcm(dZ}pX|w~zPJ1iBRB2reV&jAwht6V?Q@@_~z&L*TdPA4; zmZ~W;JE6O*&i$3IrKReo*VkJ0J}y)cfD(P&pb7znP%(=cVeRgh8}k|`nlsKMmryQZ zpj7wGO~vv4-4MENRaW=ivt)hGX7%ueF+d6we|7>}kj(+PzWm40Im3}2S7Bmn$lE(@ zZsXzP(8lv=1*5gJxD+1FbYzM74x<8^@eWSZi6u;4T8|zIKFc^IXIg4>Ql%jL_Q-z- z$_OT@HduT$Oog$nnbJ=Dyrm;U7Ho5PUBrMVJ1%rnAp@rFg!!n3*cT-@ekJ zmszq;z`a>0{w3Q9{c^zy{u{FvVmR;oU?MEo;{ zt!q2%wpoB?J;De7kxe>5cwgjqc*<2k!uJ0H5QL5k7vzsC zfq?=?6@8v01KhZqC1HHsyiRM#=k2na;H54u~%|o3AF8nd83e@2BttDe0mwh81N8Q^EpPCUG&IlG~AHKsr zQfGfRNGj;uks1x77BT+ba~6}ynsgksI&_fXJ1wLK34n!XGkqSIx6SEY^IaMI@K_tK zA3hjN!AoF60j`w%uc_Q%otr6yLpFOMG} z?5$&xdbWK}2rUA!jpIh&JoM#Tk{|3K+*(O`48nbOAGFaIf45vS?-xR0A49x(AzF;m znLcl|Ou?f)TBV=6^)OZA-3&zLtlilqr%hwZR<=3ZF_cJyzHTjpQQD$Jq?<{TD3 ztqxPtpK7fSc`IN~1mRH#R7;y|sUhOe*h>HsSd7#y!3;oz+w+g_P9>HXPkh?)<^uEi z@TnWV3c&Zpa)*PgJ2(KrX5u)~`H#l|;^pkgM;pNj!1ih=qb1tShVj#?&-s<#bIZA7 zD~rb_q~npFZ3)BoTXAg>o<*O6iARtAy~wiBpXarVA}B^kwi`srgJa^~`r`X)gI=aL z=d{<`OEHaWY1S$kFV3*nGOLZyAOTQ%xeyCV;xAl)&ENzS3KGYGr+$=Fe+h8=${jmG zeea|ybW*00Y@hcR<(I!-q33e9F9&ZJ+d1WN*hqgh zBHCC+R&54S6R*&8JulKPoZlrJM_f4_mmlzKz`L~FmpkidpFo1;&Q*Z&$D(SL;S`AQ zWV~69WvR)_D~6Xkq~^rs)~WG(b5E}0sRmgh{RL6`Sv5?WUHA9AmQRbK#d8%b59bt) zcN>XNfaP|Ng3$2`fl{xa!fs??|$*1YUGhe~ph*2GX!d~# zqKSl=oV^40I?V#So&!+y@~`fplaRHb6!KL?u1hjQV^KHZD=gvP`n}PYr3tFC6}al_ zlxdrkXq&D}EzU@Ys}H9{Z{VlFRF>a`UjCd_>leF=T=@kCb_T9^y@yBysYMLU*72q6 z=jE#>_m|nH{SqOsI7Q+d(T~?b;%Ap>U#e8%%KWSlg#jwbM2EQ{lM~RCRUo6g`02wD z@>@P8pZxnUg$Sy>snNkV*`s*SF&TH`?eLJuE0&n11e6F z5vJ+gG;$ZY-jh)nA?}BBWjleB*g+layXrW4&$T$<+r6?l$%=toCZb{2-geF&0o#*# zUWF6N(U>n@`C?*|`sYB;AMpz^w z|4sFl$q6T<=SS6SO%!Lz2{d;}?CBNr>3Y=M9B}_1Tuy}0s#5N1G-(|s@M#@n*D|RJ zpu-~+^6xeNl`E(E%~Ydi#(q-!`II;o$tbGi;7JDXqb<8x2=$BHSI+pfH- z9_TaN33PMoea3G~6Yr_B?6S9q_qK?Lw%`Ck2nqncCji%57#luZuRRPpE=GuQZi{8W z;&1d4K5d=Ao^gUKWQ0O_aA_N>jy7{YJT<+Kka@6kL{`QaX7J@_up9(@GQvoc+bO|4Fi1}$MxpJvlL3%#D%%3aP?^EFX|K& z$Ip+h8G8DbjzkQW=t7=76T8l1>{=^ln{+HE4>HyEiisPTVY5BiheM1v@mm+x(_?U& z0AZghZOA+W+4xifPHw|@#X2~^ITE!?i`92m?w-eooQZszy<|V^bT8zwyAaU0pjh9v z6{RIwG;mfykA`6{Ec&9_HStw**O|rd4Qh_H(myLNu5rkU zHp2y)m(-d^-70-6Yz{CJIoc9;F>zN|e)UuRy)BqDnXUeL)RGaq>O=e;kbBrF;tdSG zV&JSGAE6hH=;9kAa9cGMQ`=qTVGf5)aIV!J8=8Ju1Y3Z__RXj z+jKjh&g5+eleY~NV3yV+^R8>T3aJzLN0SpAUR5&n9KUr=HOl?*jD~jj2nJ8{rU(@85L5K@;iwQ3EV|8 z0nNp(Iu4~OufFe$$_buJW^Bzae`7!2)A|>P$Xq@dFK_9P2vdnVc394$?kr#dBdsTG z-Z!pGy5)!IRIjNVv1`SQX+uXCW_NJ7;d*K&>?fzpb1^AMIyb6moo;isqcbzRZfMqi zZWUUs=BY`1HU!vdDDsWQyrQro^3p|!O0Q#fpC=R9f(Bz*Eb);bEYX;yI(T69RQHGc zsKd*eOGc4`m}IW+()3yJ(bdTo%v+6apZMA6w%3@_mQ3Jo#=dg~RfFKOR_+ayjf z3U8e7pbw@vnH@|wlG8UL#DT$a|7k2_8FR2S4ajqCF6RTb5WGJOU2^C=Y}#e|%fqmq zSIxZz3;~d@;gSgua3-Mi{?4W3)njqp1q=RN11lL^UhxPos=8~O`nMEzS^nZ4Pl^!tSY7+BwtNw(fjY*W zJqNaSjZp=xjd|%_H^bL<0h_Fa@n2gdX1062K6DpnKkMDtRdmli*dFnBBy8QZjU%xC z+O$~liOK~MyFDSJc|&$7;zN5ucDc!s`DeZ3i6Gl=qJkSKmY^EqYWN~`Hls(OZhuF0 zf3T9VoKZgwb%1=In*?wo8~PwZ2lg2;;~);5z}y9V2VMO8T>@1um+imTI0dj&Gr0e~ zFG?8_{rLZ%q4@>p{NLxHO)>g38VJZ>uP8`qB}Lim)OB3csx)wC3spm!eqiQ76V^1+ zNvw9yN)1XLNZXs8aKvMtZkDR{iNU;vN+J;atUBVO^a*mfqtxP-n5OUvj=4k1z@*7y zf}A(i%&j$|`0@K2Bx2s7e#zF&jBuT|BEeAfuY1e{1|@B8eyempc(>3Xf{^$fguYmRy^-PRWsYpT zs)ry}-1c3~+G48Ix6|(vt9x8f{H4#tU1R+|y7xNqP{*XS++zUr0lFD3b^11z8UFq@ zZT7AUsOmAsnw8YedcNzOLtV8P(L&~f=_8_p;qF?ugw}b4ivjgBI#+yKCw4@e?$TPz zX)O7gAhze6p5IO|gcDgHP(A)#s#z;TmEkbm;X57eul03F7`a?zvWPg&Z-0I@(JCjl z6onQN$sHtXJV>oM^X5e`hlXcq6rq^xODis0eny&IRSEV6C!;+ZbgrNLXo-Vo1n{58 zANh<6)zy;wPdn22YL0K;SXt)kbd4jmZcw)!eHpwv_Gy4Nl%8)P6tH9WfptbkhZqz= z4q9rL7rCSl_-3(Xb6_5olO+<90ewLZHjz&x>SaV$2g*)9vE_YO{u&NKQga2&iU{~M z2tNQ1@2*PTv5vv+9>nBcGnd}ckNb!_VJ}Qc>vHoqy)^wy^?+DgOnIkGe9t#f%`1kv zPak}6B4>5{T0M97v}(XHv0qnbCwLI($JxkkzBX5GWUo1MALdUEHs^EMf)|MNrJ-7a zKld_B?{PU7W)@j_;|cIG+J2fO@AUqO2)WQ);+~8zu)UF@no&d*vBFScdb4mH2qHXL z4XQVb!G2FU{-0DwA-NZ+6Q(p#Q`1{1Dy&jYOQnR=HC==rs;l|8 zl@@iU9&J7UbVSFh6p)Aai%A-YZV!kwE(&>KV`m3JQVUko3{S5GG=-o`?o<*Rv9t|A7>h-Cp<$t z%>lvM=hWc{TcBRW6=zHqyP17B+!`4Wa1J|WL-%sFH*M&@4BWnFv!(D^w4d2649Di$PPpiFtO)=svI|$2;JsvyNISf$0%q zAS%GXQq^4lDKweX6v@x<^%Wf$TCr(NB+^0)=vaNAj`6G;ujqL0gsIj_YTeG_k;_CD z2ojr7@{XFz@%e_y3ZNJWO?+-;?zsy``PDgUNl?^_jgMdspc#=xc8?y**j?S6w=Q%6 z4Oq-N+|K*i{=U}lNC`5}5rcts=Ra(g0?ABdLZv;>4E;mwQWi+mXfzBVV=u*Mneo+y$k~n&*xA6j&Y%pjC?$1~QCSA49OnA5xI_dT|<;`S?L zuV{&2ugk6=A-h56o)+*68>+W0Q>#G%p%nMzI-?y7$8o~1FA#$V_nL0+b6+{_N(~~9 z47(Lc2m;FHevNDL9~aiQz(wUrAko-ZO0fI4Ar!nF_tJnc0+YO z$08rZF8MB8Wju9KsOd>Q;HNKeLY^uot^kUQU|{4C4ya-{_@3RS51Ce@cfpas6?dA(L_b zYdIsBzxB{2{Rr|xnm-~Rvw{V2$8Lu=Y9cP^Bji(^%pI6u8en9jmr*K?a_lx+RIl>(4OCDeO zFsvT0cU&ZZuivcAZKv!s`M6#CdWF8ZG}+n5t=;RSmm#E0%S}T`LI%-02V7+M?Z&r9 z>*w@puk)*UlhaQKMpOIaASrd!a^svNZz_}oM{b)xS)Xio+fJVk!~%HYzlD*7hYtKk zqo>vqxc<6k+LZqBkj6?ACZ>a@Dzg9dJjDxE=_>$*yIj@+G)oIDbL*Avj(zpgZ})HP zwil5?s(Nlf*{P7?DSxhY>Al3ZH9NiDrslMhqmHrt5GwLXxmZ$#I=`itKf83P!qaz8 zVs5}3Y)s8D&J1+QA{Xb~XN-h2RN1ldj82KIjhrV;BI0Y)vmt?$6E2l@GX z^CorVLPCKPX>2ikeuHY&b!DK8Bj)EZ%hRSCoZrnL8xP>w6(|D2uuav+h$`mw%ORW?M%?vYSI{uZ6_1kdUF5X_kS=a-)j!` zUK>lFwbz4@vPhLO?9)>8BW#70lQ;&YPrF~Mo^xB4TIZXyzsC<@Spq|_Cfu4j+sos-*qG5i= zPWqA)eXYI-z-TK@^q1!rnzc0-83$i1L%S;rkHfte1qXeq_kPRg{V4>OkSBfXQ$r~v zz}^3zT%hTd1TzKv=175(>&+ag)ncti1UFPpUTFy8^ZA>_dBgT83g_%$mSoJR%{wbd} zpwgPKha3CF$l;8#1^Ok4W801?_1syB4NCPe5mxeM2tShAKS;rSS)$$-(rZqfMN#__ zD^{j|KEwvPJs1vC;fbWivp~6zwQemQS~OsT7KRtYF!|@nANTVdQ5hg*=cVfCkZ__` zitP>O>o=$M#dE3sPv2cNV7EmI&ocV$#~EW~0&}+~Uiw!6a@V+DIyoF)*5Gk}rs$nX zGh=s`&g<(4{2>v_rDt|HX;0kucrE4Pbe|p?iUW(z{(8r|?I?eXq}tmAh!GzDL~n)E3nLrBH`_L#Q=PxdrLnoTVh;~{K?So zA@^-v?X+Z*a$W>3ApPSyk)U!3u}K>YKzj^VQqvK+={7-LRM`Ib)B7F9aQxHYky-@5 z=x?Yd)8XQur_A((je0Mx_x#MynvqP zr#D+?qes%0{rArVTP%ElX8!M5>w#tu{lAQQJn`9$wp4|3=BNx9XCf;P2|cv5rD5D9K`mYu=nAa|3H5wf2yzLf z|I-!>_jx>+%zGQnq&1zXq=W<*c6SN)px-A^9sIveT?<8_W70>tr#=twPYwN=(Upzmd~b^{*Tf@;DP`Bu={@g zyrt{@T*+~TdCBNGYhnLQw}ygGXjMA4y1U0qUY3mM<5?jDHHeGYE6wk523m9I!u`|y zocivA>+>(AX^HU;N7cw8*QUwGbbrJOtq9?0d=w^|lBVk9=cA~LLQTEd)L2;|O@65M zop82t*~FiV!h?`xtfrPIyV2-l*h|DYb+z)7N@?1Q~r0`xt{jy zf!X6VyL0rC$cmYPw>@J521P?n$?4*-y0v8#P%u}Kn1XTe;|Ph1VHcK^hDTLQe|J4Q z{o}QCeiiSjI#~4Y-s&m#EuhZn-M-y1-=hgJyg$++|CgaNw>YTZwaxbaE$=j*LG6s0 z&P5?3H*e2PpDrU!0kGZtX`cW_;&0uu^zn9aH|QE((2(bnZ3h%Y`Zm%lYS( z(kN{)|DhAY@bwo$%R1rD0V+s)ta$P<%7u}7zI84W3L8Mq?rfq=EKb%*( zThT-+dh?ij3i-aq7#wE~A^5Q-hXF|2Y|8p_*l@!sf;C;v3PBj#o{3ZK$E`ug`XH8_0ZRL?py z&sR(g%(-*!^=6}nwSCSMp{dHS$-}jIX4+8j%+U^Z`g$?ovCnq$6VIli2Id%K>I%XpSm6SR&wV%Cl z`1zr%X~SbPADG0z@Su8NQtHD*H!eQxqW_H1{go9*R2uIyj?5zx|dg5Ljnc{ zq#m@xR4asiR1tBxD5K@GvgD`~CMZk1^#lZYs4V|v?YT8o)U4Fn%cWxy+SQE4OKe>N zllDI~dg>PsL`&6a(TFe?8}$p-No}00|jsAj&H?>b4vEPg~vI zuCGnh8M}o%231>Mi9Gy}4#{9MY@tgFuyoa-C_&=Sxt&yMg{(ImxIn5gk;~55TS#vJ zD!8{p+C6hxwoCaf%Yg|K6T;b9js%<==Md;8L6(L^-u@My&S=(N66Cj&9wUkpeH}hn z0*eyy>1Mshx!PQ!&gSEPe7(AI+KMOU_r{?PW|BCl!;g14sjENRWr?7m4*LcuudqQ` ztw9EceA#IV3Xx=^k!WC{y1xCr`m#PNn(DL`C4*lD2fw7IH;lW>+Zv?gbr{@Jh-?bl zc_Jyu1=3Q89ZD`{T(Nlt7v>R zm!R!9a`Dx_>aeNI);~_}-ZH?raDuzL`v-|mgccO%&IUi}6j|6OAXULI{!~#epU2}t z#`RN`mq*z%=1@_d9IqN4IXpt_wR`P2SFzuPJ1E3ZyL7nL~VqqoxSjrtfkpGAHGL4#z`pwl)&G+hi zAXRauq*5uK8#TXnm)st8XJ&LMNAwnmNi}5$F^8c;sEnze{;OegJ z)U6b%SE1%&NYNpqFdTZx5r5Op?tC1ipuV%63q37Fa8Y>D_dJluaN9vgnWDUWYhdV{ ztZy<^e|L2yF=tUsVvUB{NuGzukLiV#-XA#scApsv!#fV+VV94F0pc)$ZtWUT(+T6a z9UC@BBWql;C6_-#oLq0~rjaM)Oj9tx72hqohXkyycD{76wBr0@=b(%l7z}~t$L8f_ z1Tst`MAIK*R!xei8bd}#FC-s+8Skf9r=fyBzeS^{kA5vWlhEB>tg47dN%~8e`|7+Y zKdmmo!}cC{V3V0=TO4c<{h6J&_m$;0JCTP$*Jy9KbR^$)Xj~or;cpx7y6qJ;)SGNRKE(EcV6Zeaw@5$bhj@!A{ zy27L0Uoc@Y1vUY7Jy``wHU@Kqa{0uREMY8z@7Y(PU+wV}r3`zjs+@sr8NS^^UU31# zRD%yblli$zwXb5*TCgnaxaESPD0v<$Hnz9%dAn50f4aQXMt8@jZmSv_C!{&Mt|PbZ z>*r9rkRLxlCEVfzFA{1zq`6_+C=XP@;}TNDgkYkuG^JlG!sSZ7i{j_10(KcSs4@LJ zbTqkYIspsY-TwPBjsdFT?vTMfD5h^%aD_GFph2d{Q2`N2K_EkL*8O`x26%Pz&7K&V zbWaf6ok&UPS}h-$-rCUwD_tK)$BHpdN1erM$NMxKSlMA|a#FEdM9g$z$BX;w`s{Ht znU;zZRQE}g_E(^d{0rlOxaoYKL5Nngzk4(Nj@MaEF}m%AytC6$a2#~b*3{-R$DxCX z0S`7w(#OR*i-|X7boFS)yy+doq%9bWAwNa6!HaN!T6l$p>oWCOA@&Q&Ym~=XajsqWo?;$3C~!7hG6ZV%taZy0r)|pH zQd~>JRMFwWVBm?!H5i_+W5nl zS?@0nYGI~?Hp?96nZrtFkyqUqfk>d=fh5V2xRsDlYY9xRREz?rk3-4#BA^cyo&cCG5!oJonAs(KwJd0WQAGxXgq;?i z@bU5xEfac%x;$EX+1S%;E}!KYyS(PSUoQB0?8h!H9Cyr@~Pyj^Z#Gm)+{yg$|OA zC5UrI2}%?29CpygE5uW_YhRb_XM8HW1eGRxHjg!XjwjBBeRb9d9ZbDhj^X}eBuh7A zl~My06-D=ca>lOh)KwH|Za$DWt}y}1RPT7Cc%M>Ao1N9kN_x8l0t3>#B;Hf!J^ip;($;$Ff|(V|Wz#u$8sgD3ycIErFjX7@0*sYSKB{_t+UiH9Koz( zx#wxD9cw8@G8Hhfbo}PMCVOe4E+RS}g};9BIHm5Px|R~qc9o>9cfox*LL1b(muILy zR5cHu!OQsMxZy4YwzWDdVpFA0emTzU%9y6Ue7?9lbbjb;@c01{I&7-_;FmUSy})hp zAiis`J(8|{3q%c^oR>J;+8(liW(C4<4f|u0OG%L_~p_}VD zR3%11vG?YbnG{gxwt;48%JBSOpvUg5l0h|127j3Mt)WfIDc2{(!hG}0 zSM2&?HuYK0Gb1gd^X%y;+7RV=7xU}DG|1C(ixw=<%}g(g;0MdUFl-u1FdK3}@K&D| z7L_k=VValIGFBJswqT5pryaQT_=9Bs6p$pJog2uwKAc^fegs9X#|x!QXEr)Rz{jF& zt&!Gh@dV4s#!>lue=zMtEBPnLA#2V>L?|<8@rU9I{XIy!If=%nR6}h|D)Jq+yvfia zgXRB?#TQ3#XCGeF%@lZ%H?7lEJ71gI#LMAzcgz=(R_5N}qRUcUYgaUZbS^C)Ny@V~ zH}dP@@#pABdg5}JFESe zR)e=Unt+AKHW!B2#7-Z%>)fj@=w@MjBx`GZWa2A4jCDa%qR_0MY_kv{6Ct9bNH?0F zt>o_C98I+DTL9dkmyMgd>{*vN$`OiRzd!11hnu6G73=gbf-eP!x&8O`_LKn2z|4gLJ<9^b$_(c0usu&eeS% zxs|Z)QdVH9i3VAUo_we<++=pE*Y|lIZ>3w@nrD)$)r(2 zC6&bIV6g4>aVexlFLd`bY%Ers_~4*FoeZ2am3Y3U%1S-HVPx7g#JuBTy1~`n()9FM zewz~T+O2;qVQNIGV#*z?ZZqO--3>Yxcs1~{N_K53Nt?_`#lOlrag1o&TkMJKdAT=x z>!W;LFV*~ai>Jtr*Lk%>y_vdRKMkSM)|z6_W{nKk7IxxErMN7aP&jX@X$hsG9CrOO zHt%iJfNCXnUnJ^)M8XeE#=F z{AKOo{Cp(NPiHhoXuXTN9qE(9N(@bBI2nE2ytO%~EXKq^3^dTy2yM;(CG&BP5bvz{ zd179BQz<)k9d9T|mCYyrx8ZTr+ut{`g`;JAeE~bcD?M+iF;_K8DbG9C-p5M6_ts-i z&cb&qlt2k^*p#wouGi%K7GQSo_c*z?dFZR7 zV%RPRz6x0FUhZ(H-ZX<*zerwp5zRcBfe4VLG@5OrV4^2a`)VR0^FsljkoW_wbPDJ z$R1Ip3bUlLA+x19vs`LLK*G$7GU@u;P{P2M!DXPKghKdR3bzaL|5$*sd$(%!+9l(& zWk|9pbU)s0zj6}4cXo2NKvOfy#HJX}*_9cI@o{`mqF8EEm3Jb=mWi{!MpY^f*Cfa6 z=KOqI7;id$l7*q{lsv`HpS;Qd82F9)n)g>9Ssi{{A<|g!!4Pr={t#EZ&gpf_g3!*m zX?HQ|p!=S@mK&>AP=+H#Y$SOa6T+BmWram{$6TmXh_U=HbSK^%n&*o3es@jYQrXBA z1O#bk9sWddI5W!ByX75tYunQh1LCOpdKqyHiIg+u+Y^5{+Ik8)PV^y8a%=jNE<_Jq z9(NyJ6&v;PD(iytYC@9vMjPcTew0=a6Q7=W9oQ$(1I=bp^|uv_NJuEjR}vwjC}MUO z{ls7KQ9$O-B7VL9|MFumt0tdmZiT!_Jha)SierJGuN=`|)s%A~(Ok~(t!n_r@wbM; z*>Y(UGbD}&@#@0qW3j9F^Ghed)oZkUa(3kjYJOTwy_&O(=pha}L9K}P4C$)gkF{iA zt8Km)BpsCMuo)>SdFntZrI<7CPg^T7mmf&7j~Hs2(n?!0MS{Z{b6?fOF4L!0N_=_T zxtc5UT(L)wy^o2)J@J|=>{`6=yKYvG(o07ntAcUizkm<{9;>GZSNNhj#W(DE*my&z z%GWcsTt9rBJiN9l?6Cqhd&*L~&<-5LqDmnGQ z!2TMYT!E$*E%ZB zB1qrh^@j@(Kag)JW~7iiJ|tm+76%|-tb}LLb4T^;RGT!rfN}rYk|f-I{zugmqtFB> z#VR;Ip;xo;=0E46PzSZRC^sEw;}1$qXLuS|{mA8}G+|HhRkPHc`6jiefW-Hl5aK0Y z@*hhWa8B${NcoC98#dMj?lH7 zHeWEIx@yiW#newMP&xy|pB%O;pAhgM*m67J7_ba=xbs#1tcfnc10SkcT*M)5C97*R9UXp}pXuGGxnzG{Z4sbu8ThLcXb00KHQJfh zF9`g-5pVg3!C(u;vz2SkD<=d>6Vm$6g6-7+?)SZ)ws^e+@J&MiDd)h)G>D^3lz(mL z<$M(?jz7eM&FkXhSej^DbM&qp#UX$jd+aG)6v|cuK$icplq__0vgnH~3*&ZsrsE+n zCipyojMD6?<;5op)QSsSKqm}r*?j1(q&X13oi z4bs(BZCC97ILn-cCSC&1ab@~&y%MXbE}lMNMH4pH_Eks zqyO6^mZD`CgZhN7>D6LHueT#WX5!HXTBdQaK6Y zjUJ-y_NgL$f?Gc#v!?z;HDu_f8J`^g(cwo}yf&p(U*k#@+W!WBO>oXSbFN>_ZrU}* z`&_x~ZpJ-zXr3#QQ>LPq!g@8}*INK)pm(tPaHvi-Jtf$54evDD9d$Ul=We#bcS@#! zlql*sMkj-tG~#plADiklq+-)(tg9IaMnO*!YiR>FTrgD`~S${5^-tqRHPEHveG$$@!xH>|cL`M-A>Gr=dw#={nrg6)# z%$$(NWa)DGmsQ8t$ha$NI*jZ4#aHyP_3W{EwMZ zeT$h=Va-9t?`g^XFc7V5#b`*l)*%re@s=CUMF%-cjgTzBk)2e=B zfzY9(mW>sbLV~oaSYz57a*%SszWFK~nUG{jA{7#hgb697X~)InX~%z}GqPIH zFln|DGtFtORcu?PcmlQe%MttNIa2mgso#~Cgd&9)reY{S={t>um%PW)N_%c=VyM3b z!iN5QGL)8h5@kN5{rurZ)ad_1l;`rk)*t&M(2PEi(WR41d3#fz+#3D=2RMUSU=bTpUTjPP zh|yv4l&AtkV46+>7rz&}-_@xxyF_c-E8jaE-rc2VJzW%#+73 zl-BHb@90O^>>^#q(avUvx3#L&vU-m_lvf=!dgy54&KD!^Vs?h0iwc}xR3x{x-mgkV z#uI+AIrp-sV_W#wArA!D_xv@Rys+i1`gyP3YXju5^a5~t9!j|+fWrA6#VL~zO@kAr zPQKZc{EdNOWN_&a(LnRmj_92RWX1i1%vmpLD>(`yBEGi*OlbyxK?FgW*<2#Z5t3t9)b(@GqC$3Y0 z`ZM*}kshjjpJxgNx5=?z689l$@Y1OUI%dlPwB zKA;wjd_;Z}QkprzN)jMT^%SC=zUZyYD>8h*XxeD;6lA|6o$j1-Zw*Wre)L3jiZrgZ zyJ$IIkz7Y%5a>%U@K$rkoqq)z*0*R4G(e#d;Pj3-&I>QhGYJ81Tr?56DNpU)F|4JQ z@d?15H)o^6gXbv=I}4mYJwnKC*zMjI2=n{H1gI_rhg6*d!bw!ZNk-j6rO)A2S`g5i z>BX(F#aC#h&ve-2bB0v(T+NLZ+_x791A2K8gIUJvTIGCn>wl2r62Moep%dgLk!YLs zeM1#-+~8gJtbp^}!V&0slF~qVAl+W_1D+BJQuqRITgI34daD02sk8US1+>7>1)$Q& z)vU499_n2u_j}3^GDfI);Z;#-7>x(ylj%?&7LNB@&rHYM$oeRjmh6g_91 z8n+J=?{I4!j$n&!7~`%cQI_Uckp{1Aq<`N+L{;wGM!#Sp-FjWAaU5gCr^jIr(=Gtw z1;ixh{Ht&V6k?IA0RB}%+cU$6u2|~?N3;)B)HO#06^rf8P{MzY4zf)0td~2axz|+i zwaO^~T5fj*BAkRBT z1=8)_84^zFoh!Ruw1PU~bT|@sQhsYGTD~}on(Xr6VGhgi3Mf^a3NV$DBy?^as|Jj1 zkVmETb?44rJWe@Zy32OYslW?g5M?-N?-8YbxPQ@zO%MEzH?zKC*@I<*&bQ z+-E-RU(;><@b}74T7}OxLK5ns)V-bQunOMK2E?A4Slc^r!Y+c zI#dxl)E^7+&G&rex327!A*#5JDHym~C9Y0OPizNDuN8@qN#CS&c3w}|4WgNG98pLlDX}CkAd}2aOisDvSc7uooaBs- z?cBVt8M463uWVLcB@^66vfs&?jfG5HvXMzL3dj>FlHu<1;pMa3v`h3uffq2|iw202 z#Hgs{gz$>z>W(Vrxd4EoL76^Xr|G;lMe-^W%jd&~3tng2cg3_82#sbhO^b|qCOWJf zgkLkY0ak2q2W><@X&<8u@>LY>Vm$k#3Ob?M{B;}xFDPTY$F7%=pWu%+n}~{|yN|c^ z^DOWT@w-|dV>D(9Q9&0CaBli-!eFU@%4v9G&!|sO{RBhuiGaJ?LHf|uEVRmW{EwC7 zv=ct5>S%DNtRA-TCI_xC{g$j^F8!y+@S~-DW{1grAQ(lJumz^}t`>;bf>*ba z0zuHlUy68wd3q&bVpq?XbnnCCiKFx28g)4J!tJnoA5CcjxK_&$$7o4Zo=kV^YSr*b zI`@h*TdY|)Bk*^IKJ{be7Qam_9;e?F{8vgO^x@N+ONXGfo?w=J8aILoy@GmkhG{Kv zv~v2UDwM8yylTSYCZGX>9XpoYR}`Z*fHA%uqmYRUBX$F=ChmY5mr5QrqK z(5$_qFxMZom-CmtB`ksm{Js`%1o}%WC30+Q1eN2++2qEZ6rmO=Xwd!1hwk*6I&-x1 zEw1+=CGJuKDzF4U=)F*IFBqo10THYf|oc~b;Gs<9U_JWy7}Tan9zV~ z4_OrO0F@a$S`Nl_TznvA_zgR%X`FbLn`ntPwQB`|s=jIGTn(z!gs)xGU&t5jfNBYh zEFp*J7_^)*E`tIbuE4ve7FJ1W0u%}*wKa5LrQL9=?t+lO90qo3?YXRW4VTkcBK~y= z8D;Y+qROas=SgOBPENwV(Ti5Zm^l~&8OxW-?br=!rxeE1jgM{y<@wUAhpTi#< zWXspYzz(EVuf-}*b4uY8^SS2h%-L5q>r`GaJ*32?pb}*?qdYCuPBtbCap8h5{8NY% zEah~qxD-#r1eB#C5;iH${3FUa3vw+F$BX={Sml$2RLzzS2)#|Gw)C02c6?f%&| zSDSWAXx?d=_#7^v+3mDjzdEk%e3$iE7-y{4G$c*dz1XKz(j*@`j#Ql*=dmGM%kl%w zVhODfaDDg}=}J}0Es)ebd8Yg6bTgV#bl4SZlSwEjIyWhV&^*FZ1wx4aAm~%)Ki~oQ zfp@<)N|j44dEEIt^5zjeMhVX(_&|0TBD#IL61hFbA)ONBUYIDT<{81x4&~r zlE=#-CXzJ)r9zrlH4u7kf#y(C-}Wsec!2TI?#@1!ym5baA7g?5PS?CFOoHN&g$ZT_ zg)^3IOyq+{!w7@pdr_p7US|M9wcKWJ?M1VGvParTx5D zVL?po;W&K1pycpAEyD%KovPFgeMNx4=gZp<7jkHTVXT;0T<`ZOuUlePHks2#GtaMg zpG`+F*5RRJ{P6}^=z{GmpPv77U}9GL%iXx%c41`6tRi0}r>?Xkx0^F6PNK=wwSyz9 zd0|kDalYbA%io=9g;+dH9$_LA}`(ksXzBzyX~#x@bxoS;4s+I%za zU$_}t8FkOqnb{b+`-izt9pDHFCsSxFnq=V0Eq(rEqpN7BvQy@cG`CneW0_!EB! z?;f6N`W@Fi@Wc6In^}F|TnFtNh{?9PNcr8_M;jjSZ6Su>jrQGtS)@yW#X z^uoV6JbjTjReMRI1?^(sSuym1EV{+S#d{zB(oxl#${WI^3_YvHRlc3M<$3zHdZq(qUmU;Z&Lz85VhhZ|D81;0eKE1+*tM`kfx?i$BSD$6u&RN>`F9$`J&v}Zt_nN>yz0HG zh;@egoc*34y|o6Qw+L>=xDWM(8zx9~`*c^bv~W(OMmxn^jULK9`V0kf#t`B*%f;0?$rT+2GO`#tK+DMg z{PsBM>Z}=>C5n!*TX>{nT=vG>VpYeShFma%es9=^hqr~so2CE8p2 zFWLpRpX5#_#{J@!*d~?Dxp+Xr3yy4Z5>x~XA#rs5NNTECJy9GCLy13`%FH*8j9kjC zchQi{`f?il*AR>@D^gX;Vf@-5xpPjtbA_s49>t^oEp*SIKVEl|jMCbFiVkHe?jpuE zS7~F&8ahP(Yv-x7s~bzrO;PWjCwRSM3n?pOYfWoJD$PrGafr1RcoVg8-E`Q?!XPcC z9yqcrYSX63PhA^T_{Q!mOM~(&ti5jDeK~T5D)AbwL*)HkOr5{mRi~@5VPUNMNuk+# zFh$G4y2*XyMawrkbxm)%pzCCvy;Ec2@%0y#ENf1YJO+H8v)CKz&*sSeZ2jhwpvd~T zWy@+vfHw+zg|IMCG0p=Z>{1oVEVx{f#YI0@sc}obxR9iJKiM{bdY!F+*^v`D^H9?C z{Q*@7GDp%+$V|s*5Z-9$y*CawVBM~B75?`oq|eLf$SRk!GH$tFJI_OAkM!FU9Jw8m zNgHk_>-+#%iM!fSfkHr)UopqaLpCj!4H3RMuP&Uz4_-B9cs3%R8p^PSg^q4VX^hV= zNyOoZ^Ruf_$HN^cwf}opaKCB1XY5l6Hkn84@%Jhbds>==9#l@v$Er?r;PZ&_H7r$m z`dueOit<-lSidTCP4!Cz?mx2>s_-((eZ5`U4?R9tuse2M@fHg34}%w|k}e+?t8~|@ z1v<`@WvX_sRDx&UyBCZO{Fl{gTh<2AF3E#}ildoE*wcwv%dP2R#1^F{%@rX6H%lNj zn8B$&u$J2ZsGWR4eQ-ISNRA+x?Ty+%?%{|mo}l?2hlmcR)bcjR16&TzejGru1JdPp z4BcisnBOOAjN{6t3-Z#gG_^gMbt-d>Im^d7(SrI`wXb9RwlhkSe4L59%$?QiURLnG z?zuS#e-~isBg@9M@=DrKqtF-DPPYv^KZNc%ApLXMgYY zionX2Mkcyc4za{=b&xqNSjB|(jY!&b9fVZVY4~Vz!X<^&Y9s6SIdiP4JoJS5b{zbV z1`9+*)aJ&S@T|N2m3r}Rz1pTQ`iSqXp$;srbckXg98sKLZn?9$p^XI=PRMb5V<^-6?JkT zdN-3aLgi^|w6lJ4Xy@!ZN`&XjIqCv)*|G@zLR(wb+L)@60Rd_$GL3)7bZs|_H&ehT zpb;ESoDZl83Q0-f$MQp}tD))ro8}9+Rc9-0t(u>@C($G_n_6@{RZ=47Xp^%}6btXl zMXWga+BkzbwomgFi*wmp))b$tM<{36CWevm)$bQ_I?n$q)skRNY$9B3U=_n!-X4W%Cg4betT;a!O zdL`?JN&fxmm!x# zjW&%{i&K&OUo;XvN%AdT`o&D53cPwYAvQ(o;NIt#*5*q5!_wvFWFG+$u-{v21zqNU zab8Cig*SXlBodR+sp8}iu=k4DZ!W|b$0Co>42strYM2)!Ln{tWnMN8s?LU_~VZ_W8 z;~JTBbB*`7MYp!}%Ia6dFKSMyvejjmf;Tj`mdaZ%E7Z2!55(2V72!;Px!xBG#_vC{ zk1~cWB<|OMuM=+JqE(f#pHrLK!z(JepPxKOF$Ry_r)j2p7vO=yvlJm%;j`ddswbk) z3l*w=81Mb$V$t7ZIf*m&tC}njvj~gJ3BoDsxlu>Q_n6>9y{ zbDsaX5bacB1yW%W9`i~h%Wj;cYRbnt>5WO$mr+R)c^c)roOjGFFLEi4SDKS_Din-s z>{D_IdH;J5YMroqc&G7>Nr>VCemK>r=wLvOZ9L;JP(nM!`93f=YF$F zUnT*S_+0@A0@YJ}i~{4ATe`g$wc5#;&j)v6mz1$Edd3!JN<+yRrRZI~fKXO_1^(UcM1DFL+ zt`2Vg+w;JWQmi9vL50K(`!aQQ8S3v!iW*(0PU1>cUDd*%M|G?H_wsXpKMQj^meCmh zLQ1ETmAW})T(Z7rm)x8<<#IXYwx1`x48WtTZwh#`w800@$H%bg*jgawP4KU`5_fUI zMrj!q=@y?D+W$rJm`YaJ@KUa?0~qMvEEq^Q*gV zCUHmYF+m)s)Pqx@Zq+SJk}ZGqX*HJy+O+f}QoxH+0w;z%UXkVG1UB+uZm~_Nx7G|O zi3OKQ{^jgx;^Cw3pJl@K*w5{c7`-$){;(%utQq=07T_(EI*zyD_8gB_6K(#8wwPj? z>lN%zJ+jf1ymS?4y9(xMKN{e14)Gnh;vIyGi2l0QGR1GHGo`@Fb}VZ#USZKcd7S^i zacA)=9ZL5vBQW4d!GktA&q*mcNx>UE$v^R+3w9ESxIOjy0iqlcj;FemA{{CSubU32DY*d7X-lpx2`69Z0WeLOK=}~ z{-aL;`$5Su-%fVBK-ak8`x9VOU^x4^t*Cg3&FL2ApnM^LLr#-pgF$6!ksDzQr-AOBlTsfQtk zB|S4}{Or3p|33r{oiV+Z-QBxk5QV;O8@rxzsV8m~f=pm7j;Eo8Ja zAvohW24W0=+m_-!6%MALVKUPBJ*zgom5peB%6P{JR}GmJvyYXW*SFoYj$Lbiy(#b29mVB?V(NrHCuIXX zu)yjT_jHT_Tmle|FF?TK1pswuvg#E_k_V^JcV9Gltq~ z+M(3xV-`63yjAuCYAk2ez;3Eu(qKXLW7PmCKD9U~Ey{u_Z2fSZ>)R~4YQ7G+u9q>wQg zvUCkEe{hO)TI4F&ptzPTtx7(v#NNSRCF zVcd;;eAia9E*`u{iGS%&UdBd1(q5AcGGjOm*@(Cx}lx-CxNXMc&iY zwR!fxu-=yyAX{_hm!Aw%A3$;8dHpN=9lT0fi>8KDiWyhkJ>Pc69J4(v1j@2@q_wg z*MN+eNe~7WcT>m9#q+c`IBCGjZ9|g7AHUVC?91t{KY>u;=0&z?N<3Yy23ei#uU(Ge z_{fsl1@!2>?Ra~|Vl@TaL=o!ceQ)iEKl!^<_?ZQyuHSn~_fPOyIG|ph1_TsT;{?%f z?wa*)FG3Cu6#@YNWSgjb_j1Xp@g6DmBblc2g-VOF%i{Hn%GLU8-Gz;IC?s}Ftw-## zshgV*Q$I#*!*`Nky?3-yYItyDpZDLYm%dbC6p$Dic2kuZd4bPa^5%2Shp zqeLX_-Q`fZ+ay0FDaXsRW4~sXlFTi7{HnAA$`VCpK{5%u!WaMpc(`qgRSs(7>OzU4hqsj};*R z1-C5#0D)wkQ`X!v_e80O!N+-XyVc%+85=)z$q9KZT{}^xU{7a_W-F2`n5sl1^w!z| z8w4Hza9SGM9DSQIiCot1SLJk1NeQ=Tzb9PxOQohyhc7AJjLo^xwt7npCWNHTQroW+ zCyg?$T3b88+%Auct-xI{ZOej%$>2wVwEnk>Me)QsFPDat_OD;dgReofir((*Y8=Qh z;;s(?VXxblm9JHE6gk{7Md2~85!-?Nfy#6Ulbm7NzZI(BHx@@v<3aji%#@$}S43eLXj)A<=4V{1a>h>XG?4q^Y6WT) z<45A~V*l?jT4o$c~Wk z@Dy(#Bwq)CNPiWHT;2<6ib0P~vKT(ezra}homU2hPLnZ;z$v0|?Umlwj{q{7J|z<#j(T8@(*S0`)>!eAmL z+!x&iwPXalfXw_29&C_XHfQJ=9F1la^TSF%Eywl_z!{*3Q_@u#`8^S-X-{Ncv52yf zxj+Q>9dEnQ!VSnAh+)I^9W5}p9ii@vFF1=&s+Iv~&TZ+YoM*aL!H;dAhQI8tF&TYr zBSJ1m?mjg2dgGT5HR8`ducTyx08D*i%5++~eDA0+k5gWVK&oi3g;VLLb_?|FV??=9 zzOux&xgsc=r3J6n8%tNnMsrEs2- zrd7%Jd%=EyD6iG5&Xqwe|5PO0_7>ilO`velh*c ziDFN`kENO(LeUN}j`J~%YxVgiq99Q0BBNpC{Xw@3b4c9eL($jWHAKj>mH)h0!MamR zw^21K(5kYR`z#@CSkoGVMMF>KZ3Jr^`yBy@Z|Hfq$6ZpEuC^0*B`KYZfw1Kpo`qri_joi4k`k53z>wZm@mgONL~PFtoWd#ixc&6b0Eq3rs0rjOyLDy0w}b4t(x zI$sTm(Ce8E@ASE@EGYBZpw_tX{tc53#`V&{utFkIwRp7rw|Rt`QV?qFysFJ*bZ6-8 z-aY6Lz-e8vUKlmy4+8uHQ=K2>_gtE!NKEsNQ=k82EhL%8q|y+Odx2%MrpPjm#@d6d zaD;{|RWq9Z?Dn)|WXGPz9krk^qb&3-n7u=E(3!2mo;o6sa1mvL_<@Sr2nm@ybtcob z&SC7nFmnd)@pFJ8d`%S#Vv`YSTV0n(YJ8sYX_h#g{W=@Tx8T=p{HWY_3+b$YyONH! z6K;An-V88BK+`?3sqZsONAZK=RaM=uovjZIVCzSkl4Rt87fs~j4I7h>3Z95SH;K`T zYjocFy&02~7Ikp%d2*IKRS!H;*)IH->cAv89>B2or+)jfwvyL_lGyv1hsmPD=Nw9t z5Aw!c#$fknDKQD8gN981U6>KXeoB!ZtiK&v9qdOC z%F1WGT17VvlX3wocfZf-%;7 zQ*DfJfwk$zGp2!rhO!*dMd>lPo!G`G;EXn$F?H{0aK( zs0dXRgH|t6V#9j3vmo*4P&#qxmhj+kZl^IZktSf3VB5c>3Wo1VV`9RsL2!8kvfutU z!{u4;79N-iN(VuA$ztMbOxKOIr-#rA4Ue*zzt{dVPMV3eoq)FG_3Rd+1~RQ<8iNBA z{TY)>{Pr466&Hq!r-rbf?#zwg3 z3!pmTujJnew3406iegh|_gUcxPz|*=c{K5Yh@7Bzxg3~-ib^3cu;aQTWrnDN`SKEzi z3g8gKJ+6l0zXdY^%nGlfyIv+#X45k$i6FsD0ODs5Jy$8Q@TvRMAoS9i zGi%Ue=-4E*`lY{-y4NL>qam!Y#Qf^gl@)L!(yNK)+LG=0y@-^mr~2nv&TAjv(hz_j&$;jsORk>Y%6& zQBu3!Ger34V@^5SV&(AU=edz>1ak|+h1ywQ+~-qaj((q^$7^spA4-M3M^%_oBcdSw zj)Gy<`UiiimDQ33F$Xa*T@0uc;4}`a89TMb$pa2Rma#0YrV`p*SEJ+qd}kVqN1IrG zNKJNQfq4+)EZ-J&HmoNvl=5?naq&7(`l26XDHbFk_Nabt3^2L|kG7^fKeSNS7;KPi z2HQWA2{_To@vv&A2^MjT=k+JhYi&+!Ha=HlVI0@RI z2llr!6Yg@$8AV}>-+S9uwG!tu0x~RENgULi<%;ZVgiM+90y4gwR(Vmyq|&Dd7+z$j zW82QkXv#Au#iZ<5CiXN_Q6HG2iTP)vuYaQ~Fgbk?r1cd~7YR1K#c|=mJ6Y7zEyP+o z^pnn}bNvd1{qH)hoy@%o*y2NE9sVaZwN<7(eOGMT$S2bu# zsm0tLoa+2E8eswnDb~#QP1oGSn5J(M>3r4Xl1Ndx-CIdbtkX5_V(K{gJ4*Dkx`{2` zHQ$B^LHi93>BQLAtOyQR*7^|VP2}t*4CpMX=e&vuZQiM&|49E@Jfi2rQS0-I66_~R zkp-T^yUMvu@wY5ks0?a_0G#2Jg(+#iF-bv7k^`t|u&8sGmH93Rh8~aC1FmGW0RUYv zS)Ef#|7{={sA5AwJ5sOZo ziQ?&VmSZ!0|KD{@;ZI$zvae4$9BI+V)DKwCOHtGf?zIf}1zY}jQ8WFV7=~vcqU)JR-N43jU9X!5Q5#UM_HBSK<9CkHtRCk^*odE2I3kz7u!<8FXmMUtwUj?G6}#H1cnjEl|-Z89K5BSk>7=`akd*-lKYjt8_?< z1u(QZxT}?2)8%_;a&O;nDyOTZK-?mz24>IHWWGur6^{@&4QF8(@ShYuh9iEmCs}<} zAKRM7Y77Ax|C9lA!;a>6KFWGGehA7Y5FW?}0dAvF_`HAb@bOUUH@crcmkkOdYyeQ&bm^;JwsP%q-dB@%+zKk|-zjlj*lij7KJ~E+?WJN0gBvm`h~5SVXm-vo*o|-@Q{ODmVKo_P;cm}g65&3VZEf0LIyud2DfDnX+znx3<>L_(upZ^tz>ZGtq zWAonEKs=^4XEns62nu+$Xi;XI|4iKK^)!|hvx?*Ba8_?Od$8R%Ljf{c zilRmAZKx>3Shi zjVoigRJk>% z_;|u`QR2m5b^VRK$x{M2jb4^R(SMnr>&PO1Jr=AEXV&>W*&UNB4#xrgNPVWE5+2fj zq=$b1Of*kQykuz|WR3L9G}9*me58FfTr` zQVyf>`)az+2x`c9b=Za%TCocRTC)#9VLdVv-LXgyQQI2B=c=YzbFYcjx3vsJkF2YST#Xh{y#PqXXi9Zvru z;>goIbg~AZQ#ZMFo>UI-TQ7P|k1p!v-H0N=+zg42h^c`cDjONX9~I~%aIBahYsTYq z2>yXwe9My*F3i7o=eCj)rJriSLUN*FWcraCPwH-Gy4Is?F-(COj@I42&5~nvwD%Sa zIjF^EIwu{z?f$*!%|<6B0X_=H(7}JiN=RxbE$FFYR5KF zwslkpNEA9fb*n3-)TA1Rb>C>cC<}-)^^O}mSKF|>4qx^b%NMCD>c*Qjt`Nd8Y-@p) znIms&<@CJ5*xE1))Asf`_cHIl`G)2qu`c!0nm@Y_+a z+25rXE~{xtn#NyV;_;YtKe5N|%`}WNBmus!h1^$D!nA4dmG6MQC~!g;z}6dA%?o&h z+v6P>Zcp4NVX23|ItGxy{J9BSm z@z>KiLddgU*bQ1<9GhN`lrkOiHAZINv}Lj9>%~5L=(IO%LC$iIDx1YMj1#PO!N9R8 z!kxGBflYf9qwH8@Qh%dF6p4vi2RS+ftn$(5JZ9uM986T9?AO`ir5g-6F?>Bthqt)I zkAtVFlJp^fO|S_bKH#3gnny&u5p-0NHI@>}HF0`g& zJq<4ASadpN<=_uXdGB^6!-6vakgCu)$D7*IfeGyLXBNj_nUh5r4ZJeN`O$hAhZreR zc^55gf%;P{28@#w*t*X?@*DM7CJI+|n_Ks*tG-Or>q<4GLw{2ke@%^o_f;RyHe+w8 zI*s7iqp7aCqoX^=U=``i3kS*{enSVvn8L>759b(nv2JZbR8WSn6mL<>o-h9U6bemm zgx~4liczjYF}T9=Od{PogaU2@)8doMr-1@)lMAkS^CmCF{)0BF2=VtPp9uqOO#w%@-sV~2=K&$y`-`l`qK9aWq2z} zj6$}D|B`6Jrh|J4H3Lr?p!$dDMr_@Nu<~s2XRry8wOO*6;I2?|%gwGG#tKx?OFq_GV5t6T_pGV+T#G;YGm#?*CY)_^2y*_ebW%NRYep0J|<)~8> z&(R|%+_9Vc&k*wdMe>_kxqZzoY#Qy%Pz+Gsg90guVE<~{C->>+NM8zb0m!i)<6874 zN&4w9?^C5b(=ZI!rW$ay#ITVceakP5vZO(VP9E~&t*cG5*z%)@JcQzOjQZd?i7i6) zd6z`h=PKIfpixV*BeB(2muO1lkf-sqi< zgQra@T9?rj9`mKq2%p<pph6eN~>NvW+jx&He z8N#OgKNlb{G!)UqD8EngG>PxtKK43y!|lC@rK3#_w}q^e{m*t-#IMDP?+B8X0fs_N zug$3n(i}BZ?2chS5@vQ^s!B-ZN-TS00^tD23df~fN&Tr+RFOx}cH)`10y=0XhxVe3 z;Cc#EwCK?`l<4Z$VU0z#=Xq5d*Q#oG*j{!+fXx->Rqq)yvJF)FGz3JIJfxsDb$Cud z55gDtP1Wd+wXL5Fl*@)FlGdVI8qIu#fn&88P2u|NWM{8z02El3P~^fok z-+gsifp;cZEt`~RhJf&64@U42QUC)0AdSIrI`KXR4`|-#wITRIwS@0lefU{N@!Z7Ra`rxohssoL_pv&C&4yj!Y4!mtmgPLuHdf$8sn_>ExPBZl^_{!+*L|G0+G1l!F#7(+w<^YSbX3FS-`>G`b$LOXGr#y z+g3n}*IBa4VwnrLloEc1Orq4c|Dt4!{K5=tN?AhUwzl)VNj)|Pay0L(707S;I<9K% z^*v4H8qECD&bCmvfIw@?N&zd(HRNLLLJ%Ty4me~H5eN?=mOlB{)(xr}x)8FXjMx8K ze|2W=`QXf7z_1Jns|nkX@;bHK9Q?Gkp+RmSK`P#b54m(xmz4zo@?L%u|1j7&)fg;` z6rPUC9~aqPVENfrnwP44m%Xe>Tx)O{V;n*_(Fp}GG$|YRZzPH7ZYxSR)q-7frVdI4 z)yMaJPI2O7mqA7KP6r9J<`QzL!k?iVYOuTlOTx|BKsR{QtkcwGjohmJA4fV?GXDar zC`k5aspL(f3{GdvuXmvQFEstY{T>7;iUva6Nydo&7PkNq7y551aVwn8qHyh=(qa6! zH?;lbb7H-#cq?K{|31kk$xhY&^t#M}M|kL`c{_VCQ{inBBMi>49DmX}{-xafIDA&} z=Zt|?8n|Dnpr#k&`?l$^#?nFriF~gWi^ISWJ(0FA-8@| z3a?5#E7SL7V$S)9U4wp7j{ios^}(WhWd{@LUkbyBT%~SGu5KG8#mm1j3cBw13HKjE zMvCZobb48to_=R1U=-|Fv<{ulqo+vP54%+MjRLi<$iV+XcPo(Bdvvx*=Ykx)T9*7P%}9#&Ivu2t0{t9 z?BFWAes7@$+N86GrqtbDJqh^xtyXoiGJLo`FQ%wg&^>t3*@Fqbk%uc>lx^=LJ)+YO%x)LpxCY`Nt#Vd#Dem4P>;`#R0p;z6x!>|Fq=3*)CH>MV=oHxB%_=WvTMCD}oeP8&W0MS+VH*Jb2TD`em} z7TynHV(t(CL-*=feYUvMA)JI~R~6I|aHA#q(OG)RyJLt(LxRef-(e9^^yw!A%CQl3 zyy3l!zrqb_eph$@wG^d2A!sWljaPK*2VfDwWU&WvUl0#q36aO$Le+zxjx*PIZ(EW~ z!G~ZRa=QZierMV(LGa7GJuw%}S8d#!h|$GPIAy6)I=3qK=H4BdQ?V4kEQlP$@-iS( z4!azOh|qE@*+2XC8B`uuX~=7RXsP>+%5Hg~q%tR@f%`@9dLMU9cT^rY_ayYa>=Pa( z23zHx__YTtCr$5d45p=jh8pK|rhNk}>*TIL6;psPn!H$~zo7tz`8byLmmE2H3A==C z5E;Z6GFrM;;Y)v_;YR8V0IX-}$Jl*9GsX3H zGvXvK@7%#=SQvixHDN6z^R*NH9JwdB%875;#DSSde?sha`f$i~tjL9ql3;vYfpf>} z>joduhV#e&Gbo;f8GbcqwAwTglBW9mzZt;S6fS8X6d$wFfG z;OU4wNg`64$l-F)9N%kE)rWPar5S|kz#9$8{znvYtJ6V`o(?k;*^)h>;Ptf)#%$vc zbW$#R&kJoYE%o4h;N7=lpIKFOm`o0mJonEo8My3=Ej^rHf|~Br=B|^$hycQASvZjC6lR{_yMDt$*GwEI6q16Ts6RQ;m`FUKdK>$4;ZLeAVJ`q{+9B6lG_V0hS{yH7O$=02*UhZ*g zPfS^lZr6~w_&!c_*fqU!n@I4`-QPO$B6Ki@lIhTeyLYkQf#(8=;CO@z|FMJug=clD zPdjXSe9nVL-cBRDKbY*5?!u3lFw*L7a)8kN*qkaqTw?w0>dGOZpq5`g$FE>rN%K^B zOxB6tHVyOMMNswoT(0e#GXx+|1MznYW>I?OVYXM7-(5yt z*J}o`UW>Ql20J!6rk+_OL&qqp1AGXc74VbioL18TDIY&7<321Pov!J?!pP#lD$MzI zN0G)w4`XC4j%;RTqj|4UEUp zIQ%XXl=&-gq2*vUp}(G|yx)&PXZRcDQK=nR75PUnQ((43ZgQVdXywQD9~g%Fi%T7}Kr);s2+=UEIh=9NCj~DyxYC5P_>UL74Va%n`>&-KBu0t9qc;8Vh znb{-N&UE)<2EV0feoM820DE5a$>@4;yDMOpQo1o6PWOrD6P^^=x|6-e+Rl`rb@j+b ze7ca@#;?Q9xKC`c&g<^hqGAF$i9Aj(u1Ui0{ibl#$_k0$}lQ``%m8W;^ia zI^tf>?Awdz&u+ec?KtOFq{t02iznoNbeBCTwDoS#TExnOf}Gt6aG4}V!871M)-NY} zi{Ez_ko*E$(tSTozW9o_C6Fkt>vZGk$1&67(f}&R!K7K!GdZI$D;n4XMPTqB*LApR z``3YU3_wUOefWtRZFFb^Ryai^Jff@fnmrLFjAn}zNXWW=rp$3Bsr^+2lH|t(FhQTL zJ9{h4cEri-S!#C~kCjgz>$kWfV32m)jCbXuiMefN?c|3vHFwkyTbAVU1rppKR)QH2 z6TNjFo`F8fh1Uqd&EDsEn$c__2a}DO3hfoj@-N6W!r)r17cTZsS_;|lcQbkhz3+}t zKqq;;>h5Y8#xBiU|GO}VTD|<}j;~BNXU;f=4RhaI+s}5cZ&q@A=%!Q(s6D*N@Ch#2 zDId%54R~f@moCXjxsQ~s6FNeCukKCth~zuZA&QM!+jRVg++!n_GMtl#)qQI?&sQas z{I+RhxC{kJkVCH$4A!Ailpk;&y%RCmLuH(nO7?dJEJ*6TAFrSf77woyxI@zDlr>Gs zX$qVeuANaZP|b6X7_CK;K$abK!AiWvg$`El&19yiPb(<26c)Mp1JpdDGDAMTXo%iH zFz#~WJL}+|IM3sCqEKde7}B4u`U?lx=5xGZUMB`D{#(}v-ypp{2a_(o?5q`6 zL4?HD%6__YeaQ@$RMxc0Q>Y2fG@3hRf(-eWSi_L!7IF|E zq?!M>L|!6b182ags_!%s5Qq#(kHUgjh(HYQhGKkjTC=uwkx>)v)il<0G9gJkf z=M~NaC!B|kKr97uV)t6!XcaAJsNIyTU(YC$=rzu*GfEMKS}%!PFR5EHRoE^#rCM5A zA$WDa!U(<5?^)uvN_SjY55>1puqpP}0{Ixv4*1T|3m_ya6^~{!3ZZopp(tj&f(O}N z{F8MPc|hmg+V|WHkCLNAm#h29@3e{dT=(JAktrgDyGc0#iQS(U7MXfD?ESW1-jF>; zuYVLIGl1p)ss$QbWE}2UTZ<$5^eO*kjM@U;HUM<4T`j~SI>$2!B$sIOYi(E zU3hSXwtsV`Fhl06$7d|2Q1wi@AoOeMs#?h^$NVOO2M}z1A1rCCTmB()tpCF

CI;rR@7Wy;t%s@Yik^~G@FPy&aKr&?}w>%~A8UPdl8 z^(JQ4^fy{ub4%&q^m>i?!tNdCl2>D_1LYm}L| z&jg+e<$T#Yp8Z`iuLRZ(Ao=6CvI43Tq=zdP6BnZrGU6#n#vLtFj)JE46AdGS zwZ0w!7PP%!h%T1p9>654Y(Y`Tj(A4|U?O@o4!x<2| z;VBxYqI=^yJmV}HAH~ik-1U;uZ~0_JD}>TR^`j)m+3BL1KVkAWg%FoRmh&Yf$tC2$ zx|F!C)F>BP&yBdolnGj5WM~kT3Rf_7$E50{AzX<{@?82Tj_iS}^u$mP*8uu48kP=! z4Tc|m`)dgjdwak`fYeJ40h4CatZ!HhM=6+M7ne0p7nu==fFC{HvWSm&!AYZ$UfMER zS3%?6PsgDYUvslSa7$qR=hD(J^K*Uu`&ROs66ewS+-L6CWnF5X*vUao?6EzAS4axY z-xn!(#GD=IBs8D{>-CkWlxYDZb89SJfvT9fE>l$twFSGFHI|e`4p0J{DGi*Ts~*o`#DyZo zLb!n@%zq%*dgV|6bE*=6D!lNR?}{l5^dxymWC6s>f8JD1+!aL=cpVA$G|7_K*=UX0 z6@MfLxoIN;E~-x|?UeH}1Gr9;q8J*p8r_2$?bgk5n-1Gv2Af-#8r*)k$rGjBnq8%3 z9^;E4 zlM1%RYEw}J_&|@VY!LAv!Z?-~0_bC)N&qFa;UEHRAO^eYO>taVV1md<_CK~K z@rhGBh34e${Vx#G`46b=*-dQf#s$^1CFD1rG2OjNw0n?eTXC1&V635^j8FbCr9n+j zH-MXmLu5AhdqIXCZd=A50nNxI%k@2;y_9YNmAseW|&L}pgbyq`lw5mn>Zv?8%)H15_39N?D5{EQ0HaO;+It0ue%hx`D*I$uva=-!opwaRZY-uuy9OUG z{9eE=9XdzW^h@FzdhO$1YDuk*!*rS<3;z}DpAKrcbVB;gl^$V6oh+4Nl>Rmj!v1?= zu_Z>q$41#I!qDH6+!%@nX8m2YGEP!s0uVjd?)S|9mOpF`*)P_}2HcZoY9i72@Rr~= zi&16%geK>VAmWT9YKb87j^MvQ>w=!~`!qFU0*!RaH1H2zvB_Q67l=tl-yZD60(1v| z0eXSEix4rp87`6$#$E(dY(kodo}=(bt+q*QE6oyKZM(UQN)x@dVo4A$p1a^4S7F=P=q-iFDrlM*_33BgfD8cv1)VIFSZZ9i1X%L4_PGQ@` z(9G~s>1qEPrXY841Oo}9{=>e`mbSB(X@pO&Kcb<==k*vO|Ly6$rReUFAoq?5EbZr~xJ(gR(ayEmIIyxK3VguTx-&J08a zV?0nrY-1h%LUK*8sK}#^$i5jFGwc2bi!{A>y54@hLA(H!!3dMHPGp~3yxEoW2pwy))rSz$%B`M@liZUEP)@N`nU?iVplvN@vG5ZDb(; zXIUmyCIZlUD#uFML8t{GKM}x$d)EGf4&zQ5E&0dY0i**#yH)@+gb5(uSuEx}R;xfF z(b*mGmkfh2>+k4vj=)k1L4@$|Ib>)D@=Q|G+Pw^&~^Llqr0=&mu^Q`s1oLnn|`vL_x1a=|yZ zt8@e`VnTD++cvV{GeBMgox=QyZl90S%eLQlesjQnRb%)E{6u*JIr$Oze<&uszCb3r zrU3%LN^utJ(Df07N&e+!`{d!yORGTh5Xn!_LSB;Ph{G)p4H4Ux>3iUJ4DIm4I4@~gArV^ z-q=kuc{Wt(Xzz(UhWlfKK4x{YF;h{xv3Ip!)j%;jUp*RKDZ{OR_2+tgH>edq=fEYl z@;}gd09~OoaWD@Bo9{+zWba0CPe}sT_2M$7xg=^^Skw|FHis)l0SAkyR`nM1Da*sO z|0^*MBjR>7aIhEG*wXk{=yr)m_!DYRf)krsq>&*cs}_RkY)D`V+lCz$4!|7xj3t8T z=>6#}K^o9WQV<4WT9o~+zdeX3e3sUTwuvge-}n_7DfM3f1T#LSP4AQ@0RVh0KUEwC zMYw=2Vl88T2MF%cE|0D`$wtR4H@M#A|5<)^9-gp*)^E$0PBs|w9#N%=cWQI}!|j$6 z#MQqKC>aBj|Aq_($TKV?u_dLlUQhfz#Y@mMRN>akCnAlme+c7}GBXvq2_jH%bWNY@ zH^TKEeae(>fWNvvv1p_nHv~JLoxgvNHP!3@+}xpdok`;@(ryYU{m{9|1VN0 zaCM2~F{QZ=c*ZY%oGgH*`p>Q7IXy-Xl7eZ}{*iT{g6*<@kM5Es6HL0=y;0NUg(