From aa48371a44945b8ebedca8d7ee283b3b794ccddc Mon Sep 17 00:00:00 2001 From: Guilherme Maciel Ferreira Date: Mon, 21 Feb 2011 10:49:10 +0100 Subject: [PATCH] First version of command line and config file parsing --- src/config/configuration.cpp | 29 +++++++- src/config/configuration.h | 14 ++-- src/config/configurationreader.cpp | 150 ++++++++++++++++++++++++++++++++---- src/config/configurationreader.h | 24 +++++- src/main.cpp | 37 +++++---- uml/libpingcheck.vpp | Bin 136962 -> 130513 bytes 6 files changed, 212 insertions(+), 42 deletions(-) diff --git a/src/config/configuration.cpp b/src/config/configuration.cpp index ce1bab4..9e1ec28 100644 --- a/src/config/configuration.cpp +++ b/src/config/configuration.cpp @@ -1,9 +1,36 @@ +#include + #include "configuration.h" -Configuration::Configuration() +using namespace std; +using namespace boost::program_options; + +Configuration::Configuration() : + limit_to_notify( 0 ) { } Configuration::~Configuration() { } + +bool Configuration::read( variables_map vm ) +{ + if ( vm.count( "limit-to-notify" ) ) + { + limit_to_notify = vm[ "limit-to-notify" ].as (); + cout << "limit-to-notify:" << limit_to_notify << endl; + } + + return true; +} + +uint32_t Configuration::get_limit_to_notify() const +{ + return limit_to_notify; +} + +void Configuration::set_limit_to_notify( uint32_t limit_to_notify ) +{ + this->limit_to_notify = limit_to_notify; +} diff --git a/src/config/configuration.h b/src/config/configuration.h index af72f76..984fc59 100644 --- a/src/config/configuration.h +++ b/src/config/configuration.h @@ -1,9 +1,10 @@ #ifndef CONFIGURATION_H_ #define CONFIGURATION_H_ +#include #include #include -#include +#include #include "host.h" @@ -13,14 +14,13 @@ public: Configuration(); virtual ~Configuration(); - virtual void read() = 0; + bool read( boost::program_options::variables_map vm ); + + uint32_t get_limit_to_notify() const; + void set_limit_to_notify( uint32_t limit_to_notify ); private: - std::string call_fail_command; - std::string logfile; - bool daemonize; - uint32_t limit_down_hosts_to_notify; - std::vector hosts; + uint32_t limit_to_notify; }; diff --git a/src/config/configurationreader.cpp b/src/config/configurationreader.cpp index c213753..648a806 100644 --- a/src/config/configurationreader.cpp +++ b/src/config/configurationreader.cpp @@ -1,30 +1,150 @@ +#include +#include +#include + #include "configurationreader.h" -ConfigurationReader::ConfigurationReader() +using namespace std; +using namespace boost::program_options; + +ConfigurationReader::ConfigurationReader() : + configuration(), + default_config_file_name( "pingcheck.cfg" ) { - // TODO how to select the source? Shall the main pass the command line? } ConfigurationReader::~ConfigurationReader() { } -void ConfigurationReader::read() +// A helper function to simplify the main part. +template + ostream& operator<<( ostream& os, const vector& v ) + { + copy( v.begin(), v.end(), ostream_iterator ( cout, " " ) ); + return os; + } + +options_description ConfigurationReader::get_generic_options() const +{ + options_description options( "Generic options" ); + options.add_options() + ( "version,v", "Print the version string and exit." ) + ( "help,h", "Print this help and exit." ) + ( "config-file", value()->default_value( default_config_file_name ), "Name of the configuration file." ); + + return options; +} + +options_description ConfigurationReader::get_configuration_options() const +{ + options_description options( "Configuration" ); + options.add_options() + ( "limit-to-notify", value()->default_value( 4 ), "Limit of host that have to be down in order to notify." ) + ( "host", value< vector >(), "Host address" ); + + return options; +} + +bool ConfigurationReader::parse_command_line( + const int argc, + char* argv[], + variables_map& vm +) { - // if user provides parameters to command line - // parse and use the parameters - // configuration = new ConfigurationCommandLine - // if user provides a file path to command line - // read the given configuration file - // configuration = new ConfigurationFile( file from command line ) - // if user doesn't provide any file or parameters - // read the default file at the default location - // configuration = new ConfigurationFile( default file ) - // - // configuration->read(); + try + { + options_description generic = get_generic_options(); + options_description config = get_configuration_options(); + + options_description cmdline_options; + cmdline_options.add( generic ).add( config ); + + options_description visible( "Allowed options" ); + visible.add( generic ).add( config ); + + positional_options_description p; + p.add( "host", -1 ); + + store( command_line_parser( argc, argv ). + options( cmdline_options ). + positional( p ).run(), vm ); + notify( vm ); + + if ( vm.count( "help" ) ) + { + cout << visible << endl; + return false; + } + + if ( vm.count( "version" ) ) + { + cout << "pingcheck version " << VERSION_STRING << endl; + return false; + } + } + catch ( exception& e ) + { + cout << e.what() << endl; + return false; + } + + return true; +} + +bool ConfigurationReader::parse_configuration_file( variables_map& vm ) +{ + string config_file_name; + if ( vm.count( "config-file" ) ) + { + config_file_name = vm[ "config-file" ].as (); + } + + return parse_configuration_file( config_file_name, vm ); +} + +bool ConfigurationReader::parse_configuration_file( + const string& config_file_name, + variables_map& vm +) +{ + ifstream ifs( config_file_name.c_str() ); + if ( !ifs ) + { + cout << "Can not open " << config_file_name << " file\n"; + return false; + } + else + { + options_description config = get_configuration_options(); + options_description config_file_options; + config_file_options.add( config ); + + store( parse_config_file( ifs, config_file_options ), vm ); + notify( vm ); + } + + return true; +} + +bool ConfigurationReader::read( const int argc, char* argv[] ) +{ + variables_map vm; + bool command_line_parsed = parse_command_line( argc, argv, vm ); + bool configuration_file_parsed = parse_configuration_file( vm ); + + bool parser_success = command_line_parsed && configuration_file_parsed; + if (parser_success) + { + return configuration.read( vm ); + } + else + { + return false; + } } -Configuration *ConfigurationReader::getConfiguration() const +Configuration ConfigurationReader::getConfiguration() const { return configuration; } diff --git a/src/config/configurationreader.h b/src/config/configurationreader.h index 11a9767..dce0c01 100644 --- a/src/config/configurationreader.h +++ b/src/config/configurationreader.h @@ -1,6 +1,9 @@ #ifndef CONFIGURATIONREADER_H_ #define CONFIGURATIONREADER_H_ +#include +#include + #include "configuration.h" class ConfigurationReader @@ -9,11 +12,26 @@ public: ConfigurationReader(); virtual ~ConfigurationReader(); - void read(); - Configuration *getConfiguration() const; + bool read( const int argc, char* argv[] ); + Configuration getConfiguration() const; + +private: + boost::program_options::options_description get_generic_options() const; + boost::program_options::options_description get_configuration_options() const; + bool parse_command_line( + const int argc, + char* argv[], + boost::program_options::variables_map& vm + ); + bool parse_configuration_file( boost::program_options::variables_map& vm ); + bool parse_configuration_file( + const std::string& config_file_name, + boost::program_options::variables_map& vm + ); private: - Configuration *configuration; + Configuration configuration; + const std::string default_config_file_name; }; #endif /* CONFIGURATIONREADER_H_ */ diff --git a/src/main.cpp b/src/main.cpp index 2aff178..7613610 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,28 +4,33 @@ #include #include +#include "configurationreader.h" #include "host.h" #include "boostpinger.h" int main( int argc, char* argv[] ) { - if (argc != 2) + // sends the program command line to be parsed by the configuration reader + ConfigurationReader config_reader; + bool read_success = config_reader.read( argc, argv ); + if ( read_success ) { - std::cerr << "Usage: ping " << std::endl; - std::cerr << "(You may need to run this program as root.)" << std::endl; - return 1; + try + { + boost::asio::io_service io_service; + BoostPinger p( io_service ); +// Configuration configuration = config_reader.getConfiguration(); +// Host host( configuration.get_hosts().at(0) ); // TODO pass Configuration object + Host host( argv[1] ); + p.ping( host ); + io_service.run(); + } + catch ( std::exception& e ) + { + std::cerr << "Exception: " << e.what() << std::endl; + return -1; + } } - try - { - boost::asio::io_service io_service; - BoostPinger p( io_service ); - Host host( argv[ 1 ] ); - p.ping( host ); - io_service.run(); - } - catch (std::exception& e) - { - std::cerr << "Exception: " << e.what() << std::endl; - } + return 0; } diff --git a/uml/libpingcheck.vpp b/uml/libpingcheck.vpp index afb4256c56dc973dca622ae6563eda09fdb4e88b..3c637d93e38ad94488d4ae7f54436894fff3c85d 100644 GIT binary patch delta 21770 zcmZU)1yo$ot^ms5P~5G!yGwC*cXxLvE`t`=0S0%6qD6{JaWC%H7AOS@rMUco-gn=B z|HGQKaL7JN#%4*fWEfD-HAb@_wIbpRwmF7b1g1HY-3kES z2?Wr9ezDbpW?iY9$vGY2U)vM;`=DO|bwScMuk)l-3pLltaKOAi?8&nM4L#TRae`@k zDF-zL=T8?fJnWCBec!S#Y!FFy2w6u2HK(;c z`QzbhdJfpSbNWYkhrB|W6S$(uW`Yz-g?gn^kyG15*S-gPJ)P;-kdLO#5QgiyH;%%x z%{wVAiEW}6OdFtcQo+Fj*9_!*I!KaQSgKT>mG?%pTpPXwc`iA4`FHyq0H5+(wtiZk zhkn@-!A4ZVjLg-i%sM|1DbtfngJI2>B*@ej3=Kq;=*ScPg~wZ3>QHwpk9;~XN`0Bt zH7a+u)ejHbKp>PM_1&NC3XPgg8s*ds7*mnf=T$`xRVF5Np_U z+{tyTx#d}s{D5vnoN1FvL6Gs_k6?g<4^!LFr{n2QJA33w6e>-tN6N!?$h3{z)FX+x z^qBT?V0?#N6ft6LGE%$AivtZh%dDLALMa{%0!W2sK)+c~SW`Lp@pItwPw&6;9CV-Z z(^z~9(G7U@@gkuZfUth!TV9477lr@M@oP z0+mvt?0~mP>GxYl0(2jM8`p0uYEVbjiWpE=?rS8C%ck#s*vi$E-;q46ZOogyIUx3~ z(B8lGdHaLzL+?0kZq$0Pb0+FO?Z*Day`}SSwhra?xzp3=H$TL&U7BxNYf&kTcy`OR zXj_Uz$8+5Num}V9;BPCD@cr8b?^14*+Ybu*F?~86FD3hG4T))MDv{by{dYBk3Y;co zr3NafSnuW{j#YX{-S-2W25tuztrPwLorv}aiuDtS8zyKsqD~~wY>nAKn_!3b10g`i z*;*B8Sbi3l&8`Uvd|kf1p|CckaGzQAt_Z`=qvwD>`pt~?cNAvXRStbwEi+XvPV*$w z$|JE4e*)fZUv-eE84C0=2XOuhyh4 z$leUALktb7`;5^@gaCLkRS}=8`#bdzz8BWeG4?!*Do(l!{fHY z4Al;(&iy9G9RGH;oLlMsOmICyY@wq2Tj16Aht2CC(zAo(f|B1)*KQchWH#u09|^xR zj4mnnMQh*#vr*GyHZ{>w?HF&0NBghuriP#7X~~1?!;jOGlNB1j$2=FU+IUl)=5`z<&i)s2nF`fOlXm{`i$7jmT{PS$dHlZ^QJ`k$!>XQb)&ZayMSC z34nTmIhaZ2D4FdMwrIBg1uGiwA~6+b!Z|!6@3LW@lPAnG`me+!?Dw@Notx!6-eJD& zwkHl(kQ~-s8&chTpi9ln6Cf19|$saF4vJMJ92fkQGzQLHey_+cRXyl&OXm zWjRA)D>komzr_dobz%Q)t*4gWGSp1Mz}PjVFv6lh4Sy2DwWWKJKcNZ#OXM~yUmiDW zjPjeAD|VfRoW+4-;ANs9LA)|6ljZ^eXM;Dl_|99wl`NL&GLxuIG3An3h8qRk1p1N= z`nk@6kz5CbmASND#PtEe#5Zauf?9c;bTU$Ve`5|N?8o)cv<0@e?%H#eP#SlfJlSU7 zWf&xu|24Fep#8eU;GD>F9q&-|Z96*;dyCbH!xCcaK08^7CDhb=HD+Cf6P7_ZKbeHF-%!%kyC{Dj$Z0LZcg) zWV>yfHv!uRS3vg+Ok4+sB^5WR-`8X>YHOZpk8J}D1%&}Bs(t&i8-YwsQb8uS+|66& z)&Nil7e+I=jRW$_UIa>TQ@1cPGsB9epO8PlLiCP%@AV$dYa+&WXPjwjEQW8EX+n9| zQ*}y_MPYKRR)KkJa_0Wow6JTS8@X<+>?>CF8bOUi;VlZ(%Zmx?IXx7hprGs^KQ%=d zSR5!s$p3$KK{Ak^d*q81Gy^<%5MUI-)Ib7$lE9>XhXFARv6(U5(R}9126)GgIb7;& zSS3$8?Vs{G-fJi>SgTH-v>$vxI1)!yQ38|us9iCwF-9`3{oWjZmP4n7u_Vw8=(`ZZ zrB%AX5@G&ui*?qqvc01TeFi^`osTnzin&|D$q-XPp@SO-m;uG_`8`J4F>TW2-%O3! zMp`q%<%x$s;-r5IT5qEDCnM>IaMSdg+b+Kb-N7xm+^yVi@7^+Xy*GQBDsTNe%X>={ z5$Y$*G`T|;aM&K-k@mIR70l!6iZM;2y5zo56e&e@g?!`Sw0-&_4-SW-Un>wYHKp^#&aR2Mh&3RhX=mZtUY8%(5d7c(9Lno5Mgj~CW_k#^b2tv?W^QvgjG zZcblcY1SN}oeGY^v!cUrDp1lRqKBSn5R8<8-;7z3n6F7l^-&C|^k&Gj z_*F%-ZI?YxI_j~5q7dpYDVk>;zwLA8KCLAf;IXSpq7zfH0KvDuK~L&1wBcm+VTO_4 zg#kRQif1)e-uaiSyytC(Ti9!kOqkc$A2feB>9{IrdL#6iGgBVMwNnqb~;OStj`*e_$FC{EhNHU#1`elp>afqIZ;zx)tx>f zQSxMBRfr5Ep^=va^XbwD&0EAyMJ=&nYMV4#2TF+HL;>b_{|smAGJKpRC7 z^}}1W880FRgZov}qvo|!Z)u?A(Pso+*?_?^)D}x>oPrzD;_A8#Vdws)zGh9cri~xA z0z@WXm(-Zy6*rsTnd1}qOiPp;bwhbL0vKZAPFcWaIg*b(rcV!^Pl!P=&n$#g`oCE0 zpa`Qme5wQN$lX^j&EH`buk5pZN9hpvM6LaE!V~Ni{73kA>ycA4k}eN$!Wx`|T^y16 ziSzi&7uU>>%NU{RIxrlmG%8g-l48F-YLlDR#IyF4*atcBcyKCmb2|^;i|VmF|JiM9 zGfgg%;CDMm(avSPr%2lkl&A>qw&lEmBQLAQT{bv1;Oac)!|Yz4U(7}tJwZcDMYWQ( zkL102Xf!EBKZzy%0nJJaq`PuIFFj&4>V|&;u-*MUbZF$!C4k)4dogY+Lkw&t3COxT)*C>zSH58k(>`cF^*ByI^Jpdo_?1ZkcF+(|Xpm zV;B)O)X4hUQHwC!RvY$aqm~KbQSVu#jd5^rE31!Of%D;MD?RXrXj@`wIvvy-!K|ix zMv1WMO!w43KXC>x+R&gbNoKx(d4eG)?TmYmZw50^)6BjjBZz%VF0F!!<}p0GZHW;( z+H-F+Na}EM=QdS$VNYs+%KN9JAj}JU&wu7@zB9$YlbT7TVQ1L+r&n;?iE1_Ru=HSJ zNYIZKVZ%!%X$PR@5`xnw0?GZfujgNN4JArSbiDFqMWOP(yLPeHLj92-=;b@?ca?0d zxW#Sw!{aJ|%QB*Qevbq6r`!|U#LjkjQz2~@7ZBftv_M&v6==<>Za#Pr41d-cQ6u0J2RHhre2-IW>`n> z?kAJ)-MLYUFnrpMj;Xk|Pd4I{GcK0AWYr}}F)W1R-Pz9Yjm?Yw>JN|7hj*9$8{|i# zEb@oJB!Magnumkiu?*k%WCvRW*0cD6QGTofI9ssgV9vwa);e*wA^XUibh6`h%h|T7 zO?&>`yCcUDxaDbmXIPtV$lspHuobjNiOR*%Y_h+a^aJVbZMN%HEUpN(r|QqF1nKv( zy@cB=k;uIT3)@9~lnqyoHH+&g_N9_$^TZ8|+Kd7Er;~9wcX7+`<*P-;hRkPrk|AjW zChxO@nNYrw2UyH-hGbwzJa{6_5v5E$Yv5*OB%HAA0EhU~rv#55m%jPW91p|4om3U( z9v9QpdUzsCy)K@>g@!p6;jps0(CmBfcWBh~wnQs--G%ljeLcuP7$sf1#p2sX7;j0*he@c(V<;t)$cck zCk?LH^;+}$Z7bg0r#KV!3%4myu<;C>X;^x!snN06_T%IbM8T0Lf)lO<69&SNc41b6ID=+zXNNPOy*ERa^@3)l6WFJ{>gh%8gBoojR5cFd zKhF4yJz-xK$=u@)CXe6&xtn3*Cj{Z}rcf7>tns6SEZdI0z&t3-w@Smsv2wQIdfpnm zy8-5v6YGij4e~vkmDl;Z2L7td0by(kXx5z1Tk6Su&KFrLnNDIsFyLN$A9hj|^vjR@ zNup@eSZdT(1}K@!x{};4^Mn>$F-1WHGepCWi0&+`kVKmo8;JQA^sP?uzv3oRFxe{MDnXPg$ZHIrjZ+{QPDZBkFl%E|7BWU&Q-}4DPZ()T-rWIildGMp2oIo>1d%D5Z&mFakNY2?wtORE&h%Y1Khhxv;83w2FW zLnjSHeFE)jtC2CAg^UFVmBKwFhB47@gjXL23)YJ)PgVmgdW7K$H11Cv2TJsksy+(4_|(`9 z%NysR_W$uSNSUA+@ONwcYJ!w67tg93?mNciuk4-pbLxaD+XAL{Y?mn*D$8!l?k%Ai zv=2o;?OHF#nJtfk^;_~sWv_i1pxs{ekU;5BQ|$8sG~2WnTxl8E^h3Uqe=VOt8IvVb zo#esP9G~kRqUqJtzQJ|kU6gv3pSHK5{z$6Tfmm1KT1IKvKh$C)AF+z0g^fZn8B7*zM|q?@`-J z-yn2$L;7p*TX7-nM6jx?c*)m!y?QaCisWtvM){3sY*1Q4@^}MoZJ1#bu;>1w%)a+# zuJ2u!tAbOzXZ)pyUOPGX*Tuf~Pa#9tjS*n8Rp7&-QGK46yZg13`sk$#JM@9VxjlDM zc%ZkFGk0)%E9aWBs|=$85N+lZwz#~k$ol%o!pj$0&1Zg?YJ9GT)6CckXBjr{5Kyl! zo+(Pf(gpo{(I$_MqO#KUoh4n1zDD?Ok+XHhgwqVe$kZ;C4!S#OrdZh&n=iKPiE;tD zVq}ymUQf99>+!j&mzm*CiF6x#u1$GjES{$=zbcz*qlO%$f2I+m0X^*W3>(5w0RVaY z@3eIreb4SVq2}!FM_pi8d{~>VutXLOuB&&PM#x_C>@r9^;Ss&$jWcrLRvMcIzyrV> zvQjf8wBB?hM#0RVtJvJThuj#L-R>XblPM0Bc0{R;Pb+o5p-4T-3XP79hTs%?t~+*D z@>S9FI*_6Hhx-;{OZJZHL6 zfA4w60I@jYHz<-GR9ug30$0pjHKfE8p5C&%Ix%tZO=sj*gm_1u%!xaLnUwn{$r}pFNlx^g*guSsh zrfDkg_zXdrkRKUL7wmiMBuxg)WEJ4SkZxS0$VZ9L?{v9KIm15`7mG?(Y^2KC7VAet z8V`rDo5$yL*nlQPt}>%xep#Rfr|`rn4sR0vY1&~?$+9lc`+Q$fVPT5~nk61gkG7%( z18IF`uqi5Ks zD7Vp0@Y^exgfJQHn_;oP)tQ9T18L>^4e;m$vEyGJ$sk~?QQmPxROZ_;y~*bZksEgw zV@5~VT$s=kiK^ajaB4zZF*qQ7j8Od`cQlDEvDZ5aKwXKB*{;?3z#k- zdHb|bL?i=*7A;U|RgL3KTqcT%z6h5+%`8CwT+Vfu$s;oE89#bn2~4A(A#&h?OCX8F zGNRh@qRZQCyS}0}r+h|9*szIaIWDYE_SMz19r*KopQ`gAH-ZBEiGrbBc7FOhoQqdl zh4HRZ^1=aoHHTTUP#=_-9qhxSLkm52t;d$Asc=1z@NbfmdD2>Zav`>^Hj6`?e>{)k zm27dX(Fi{+y${w=YVP~xa6J>MfjpJ^ww@1yD;xCoWwE?lS*h%eRRmb#w?0DX;iI##qK?|QoLZB2iJ_??=|_QXfuKWqDn1Fc7S43EEMc12bdmtve_{0R}X%@M`w zEOxy)iO$ejh!Ob7UFfUVom3S(M)u7`zs}P>-t_?^tZy!JN(t5&Up<1L4mGp+1M>kZ zP^lq@hgJlcz3hfJ<8$rV1Rt(tEPYkL(U->K$@9hz0yZ4w88iF^?>wEG`@*W=wao1E z2H?2yFMadDsN`c|*s)3KpVqS1zpZJ$~T+5PQ<6j-` zjy(iN>vG#{%ZBknAMw3Q+ka;sULEDPh_saIxnMn}$|D{x_jV=e2_fA_(6F9U{VI4A zH>$Z)?E+k6`cW$-Nfl-(>MYtoROegm0vC{buif3<=2J#_SXM z@;&-Xh#-bY&-WWT6x1Kc@BbgnYeug2dX0gDXE6W-&Djm}@SxcijOLK8;D3<>KrbKA z8Dy#%CWbR~7S5|_)tta3d`Urq`7DCPK#)SKzdw&wQd76b*(8B#x)t)iXfI*)F)v`c zI{*+O2-Pml_CbUTHGuuNW=-oPi`>3$P@rykV6!+kIGnrO$y#7iACt^$%2-A1&CVKa zuv{SX0S?XJK0@i&2DaH0j;QJ%jWotUxE{|!(!qq>;)`Qs=L#}Iip6YXqsBh3##DOh zbWc|m&ELLKgLbJ!cY0CB)Gj2ISxmrl&kq@{^_qa3QW)I)@`LujZQNTomSvC#C`FlQCPcn4zH;IZRo(Sa%CAF)O@S`R`>}6$^ zZx6}T?xX>M!ADs?IlhW32wRn{e4(R~-dURbaBqrTfMJ^=WD#t)2n`+SKe6$~kTk?f zAkADrG;V^rxRv$~OVeA=g59ehxlNkCQ)B<8HO`z}PI|x5o62l~t8vb-ZPo3|o+L%` z?pvd4RcA9hrf><0$!noZPG#vsrMunsPfLxvAq#VTS{kT7m$c4`{Yr^3TMVyrQpGvO)5z{^mGhPTr1#8;4py(=3hVyY#HP>owI65U{TMyz zQwOos1bsrCpgUUp6vK>|cO8{XTF1?%OO??tQsiVQ&3=4qK+(2q+Z8$|9O0GQJtei3 zhLayruw9$M)<|5ltDD!Ni}96lRp?S`T`Lg~txTgDS!O)cAE)L&ISB7rsjo9SxeLPo>cBK#PLK?A~M;P{?>pj03GI`6l(hpy>qJ< zNprlY<7&zajeEk2V8u*#QfGW1Ft{jQIt~i)i_**q8ofbbK(H}(0 z0T+_L`BUDwJu_R7WCS*@?Ae3YjF#9$D0hGP!4(el~0S&G+LNepj&1`G!2(KB0pS!uQ&Ighj zXK(&|DD#R1_vQh_!Q0;faKObBan~?0jL4bedOQA>HVw5m9m#Q}(mN#eC6seU2-TonizjCtpwhix1k9T)UME{U1`zTxV-j<}Clro?bq{P$tbi!wk zP^XiN5I*#1)P6({K>0W?wtY^&94}z42>)3I*tC{$>-1^uLm3#_mI|nAWX7`5UobM;{39ot))l^^*L zqE@&ge7>Y7Y7Pwlcm%Ne(Mhh<0)tMbe~J4(=-J4kBXh$qTvwpBMQ?&)VnI|^7xqXR zLz2>c+1#+c!<@5F+EDiQHoCg5@XNk$dJwG62 z5ZQmE{uMCn-uEH>ZyVeR0KIJ<4q*6NBhd!Qip;{jw!&fn#$J=Bkd1~1sN*MuV?d0T z&NDlI zpDvq%R@*m3#bwE*pnrz(Evj>(*=-r^H!QAp#gjg_?@ZbZ-ZlvaMRM=o|NV$G%pXv( z9)Vbhzm-r-6#4N32ZCMgbY!~3tk)#tvB~bhk8VyOQZ~)U2R~m1cwqAh%Y{F*XVhQy ztv^#MuA!+!-97nV-+t`0OxMjeJwBX$1A|J>pghICn?4qadQP&RuqQp2yJm1ud`F}` zNzekdy5&XT4_sqJy+{{Xtg@li`F+JN&=8LM%;M9)AmNnx*6$D{k}|*eqww=#fEqOP zZrWN4_D@)Ru0PW|Yu|uFXNSra3!)67Ira|;c<>A}8Xm2TOdw{qX0ts1cajEg8Fuga{`iy+577+$sm(Yl zU@a>B`?qAW1LDW%@jxz4S>%D9eTqhJsggMDIKfBv8s^5X+V6p9i!J2gwSFJ*k+z#9 z?U=}@)tqr%OGstTI)CMMCUrHczc1-@1f}qf=Lf%~Aq?!2H4bf?tV0} z&2Q3k;Oi1}<6wiG0a4ML5RQ0yre2Oz5xfa1R}hYi^Ib6?{$=p)ghekP@~W&w12c5A zi^Y3^{!3I?Fcm}9^&bSw#|byaNGE>2?!$2J};E4>^S+BV~Rr9~rj*F7u9k4jyMHA=(sb7~&~+pQ~+xHE`(JTOwRJ z?`azT%}+lIgruSJ3X#l84FPS(cdpu+JW*CiC;W^8wwkup`+tw)it<0&KK?P2HA9hb z%Kx$HG|WTe_{}QXV;f^!unF#RlRxlp!#O0-9hJb`w>!8uAL>|pj0e6=`2#=tL&_7= z(m2ooH?{FHCh@m^Jh|p==vky(w! zjqoH#-ko|akMhgUiGeZC1VjdKN9Uf!ht`V@u{gf=3ua|GSXZdVKI_2`H$^5{i=Mf+zMRz+Ivfn^4cwZw|BP}A>Xc->MbAz@Dv~|xVGOj^U zADNpt?6(0I7KUC!-e~cC=naDJN@cf=gKl>RvAq($Pf4g{TCC?gtL3ts!g?eJU zQAKS6GY7Dd^qgIK5^mu;sJ^i#@9$fRo=LjKH+{_`ktyE*N9P|Pnh_rs7XAr}fUQYx z=OK8mpeU+iRb{g-aklakKN^Vq;S>0|T~k>}{DaIg8BtF`Vd`+H1J4Zd~26qy0AWNb%EZ!H!+ITb`%i2W3s%~rKh zz4U{kJd+L;m4(C4J?Ywb=S{Jn6PPU2uLw8{D)Kegw`)dKuVh0LE7Ds1WFHF0pn&FM|>l-^7(Lo zrU$f_0X|OnAzS{=u<&V2uB9Z(c+)B~n~n`fN$6j+pg%s$i znw1lZ&9Sz6Y8cPJR(}`lBXZGJT^NOfpj~E`Nj4uX7#P_x%*)_sJgU|%TDF~xUH_mN ze|2#V8(c`zE_A1(pC&sWM$T+VzWYq_5F(WErY5;3Q%OPJfHv(D z={%j2Zf2Du=R!S*9p+mqLpiyI#SfXEI%gpHNXbYGpFIjq>%4;=RM6MId0Yqn>cxKC zGndt!)O|;aUJ#6{Wy0~zCA9{}@a?X32MZhWN270<6VD04`X>}4Vh#SxKl<0BsSXa6^?}4Dy%#=587p=z0-X6o?hI_26e7SDv z7X_s25$$w5`fuaT8*vgFxt{K5b9|D-x+)t^2#tHN$LCQWG~ejccKud3P9Qn7QPk)3=*_ZZ6-jT|d@jL!BQV^xHaCF{0J{Xdxj>t(#p{N#p zkJ-p36i!nGCosX0=DAVR6fCeH^o^XJ(hNSK+`AUhFV-M`d2=FfZPv!Mb*=g2;p6-1 z1g#Cwo<~WmOxmxWQ>RvPZLRbOY_l@sgY_-E_$T3niIUZ%ucg-;5e^is$2ErgyJt<@O zg^}lG*8b?c3E{_;e##C|d}$2vI~hWGuP+sA{ZC2?I9?2KToI@P>}L6J9iHQCiU;TX z3j!Kd*`LO-dSWN_GWTt8Y$j8;TEdg$->kXb#kVdoQG!3D7+gN|=jhL~q{p&Gp4-kp zO8t~&hHWU%%ged7M?*mAX%9gvz^~@TS8)p?7~fb_OQHF;f8!zVgiw^UZJ$%yGZDc; z3I~Ia)Zbv0nDI35eEr0C6Z-7y`o!4ZdybAk!hW-btu9}hZ?y%=G~V67>;3rln!@3s zM%R@h13ZB5lN6h7m|SoZ&cAKU%EU#idFe`u{tWZ-J-yIN89j~+1%>+tgvl$~mh%>{ zi1hOP+vZ6Jm_`7RNn*U5h1v!<0MGvuX<-Db-T+YB?zsV*2q2RPo;FJnfbVPVFnCJ> zAPa;g+*H#qZ$i=1Dva){7S^T}zy3h~unDVgt36h7chE4yVG!D7m<)P=i z^QGQ=Gi-1#r{mgjf;=Hy`u+KwpZp!jl|Y(q{_BG z@@*;^VGu^=53!Rrl~5R>=--8i1wT{hf`l8dxw31R|T8@WVtXMD-LHcC$hUcg}!TP4kWrfsI2sFZl~G-Ee^6>yO%x@YZ`70+3<3G4doh^Dio;oC3!sb znKf0S&eJr{Wj&2FVs4>?oauGH8OQw`_hM?vr%EM8;?;Ci)V(-xCz&!cAUZcPO6XY@ z#fxc-)|J-bvAJ~P5P?m;p)Ft@7pz}?ULXs+Ss^pZ-4-T1&8fvMw#& zyY9I+%`TIQG>GjcX5hSeM0nBBaedZFJxKY`Z&1;b7`R&+kp6O1YtxniQ2z@G1}Xul zfX0sN>^Pe>4@_bCyaZG#NVU`4i1LFH-S5>ZxRYXooE;aVQoi#V{{|LVt$MBDyH77J zKJs7x?CcTPc;HG8&7hi)*0HG4|0q}k*joSC>Bmy5$ zO;V3Kij%sGJi4%^K?5rXnx%>gD4S|h0gBu3Qm(e+FO+^)Nzu1Ms%Wya1HhgEM_BW} z)|#bW1fjkoWgX1w9@AQDZ&+A)FlK!i>#oePM49PpBa~-eR9j7RlzF2()Kqm~P(Gg`~F3t)97LENQ?qXIx_}ugN zaGz9$%w?*>AYlj7yRH(^YQYN)2=}R@2Ubrq`RImjj2kT)ms}AxQxBYeNfGSklVF^2 zWKZ(W)qUfNdHDtQ9wC_2E?z!(qYijDRA=lOe1#^vIO-%9Is2*RQW&}Z$1+vcv@L0{ zzEOrd`L57qMl0%8-DgHUgR}+gLXGV-o z8MYAbg_m^hW3abXIv!u6#1HVj?YZxn!Q4az#)IbS z&2iYyMvl_)-#jV(`AD6Od}=%tPw#crxvn0$vJKvu#@9wNciTMa+L}PIBDi#aW~TlI z2{hsbA9}xg8fgZ(o?SGp3-o#eTPQ!$7(4TjI9O|?$7`kdW4s0$WBJX~iycytNm=Vu z)hZDnfyS`^2{Z~C(LN;S%;vrZ8q;3`jo%=FMqlr*cVD;!!aU_5#m{gr#m|wCeItKq zPy)A|8nClsP#`4;@a)Himl?Ca1Z^5iqxrb-65ZH<-sCh>0(HyfCjGf!O6~l0nY03?V-v z(E`AMA;p+JYowu?GYP_0ePm#Ws1*g8nnv%_p>0o_a0 zbAPlb5~S*xHBNoU5GR{+)3n!uZut)kww3NHT5hDr0Q7)RhXL; z`?HTyj^&ha9;j@0!kXzWR+A^K(>r+TyQZar0@sj-MbJ-!9+EE(){a$P?#?KItI8mh zoXel19^)v6ti$-wSY*c~A1|u#FMF>L@J;W+LHCU{{<&)VR(6wA(TJU13jw_A%QqtT z&qMm+TE%60g8i8N1-&mmiQlXRzAZ@u(Ecxgq@W9cecd11)b#<7D*cz@T2^X&aGwDH z2dHJQx-N$C==2<$9=V`XobEcpnuw!>CWojkuuxfDtlSk-aWl|~Ru=ud)sn|gErul5 zXdyh)m33|7gJ)aADh-M`@BL3pZMn3O2b}pgB(19PRk|A}n@~k2;NgiVl z#o#3x8|Id*{BHSCJNTN>rxj}I-0j)M7`WTj*#>u+eQ(ECPF6v8{H0&p*7eQd>Eyy; z!sNTT`;!xAfUL6m&80TZFlKqYm9CgeQjo5JQ+B$d5Oo5)&=2l&bNGl6`f6t$rS%3> zNv@g@o#`-Y&oVzWbFrpqoCbWcLon&qJm^7DIY5r}EyH)NofbPi^JWE0)51>q} zJ|c9d;#d>8?c;4tA$GpA)Ux%&Clqb{NTGFwp+nM@?$gTFDr@xY32HW~%oM68BQYrl zn|U2C!y3e4^*vC-@0gCkiT)kTm8;NQdAW@^=s;h3+xKkSV^J+XxXzNOltI4me}tG+ zSFoqpDw}y07f$jPTFmC^7W4i-=mHmbm^+JB&b08w1uGX(=NqZSQJlJXmYUPF9GGH) zIj5+wnz4u~C_b#D(+?7s*hR-0eHxc;>w}I^PgeWj_UjLV_@wGj=&1W>xIQX&X``$e z_fPiDtB=t1O60KK2L|K7=_CugYU`?c{)f~!mmu)tP&YhoXnw<1(_Vb=5%4>5j*3ax(9!<;^Yd^R!Eq)A`)IV)n{So_( zi%CRb`iQYE8&5PPUN!oxKD>uLip(`n#q$XLb5QW^(uuJ1C ze!%p()8(Hd7o05-RD^zy+0IUfNe0!52oR3dKBJjbRrB`W?C~#GA_(%_xPj{5cKGi9 zuHAPliQP?+)|o~`XvLzcKB)dRn7R-2zHl}+T5voF(skr4Y$=_S8SK%K(1v6^)X*u{ z=%>W10Ccr#S_zi@kJ8Vuk^WHKDYyil0(7ah;^DdG1mJv600F)V5v{BnTBAwy=R%|P zZRFnhEB2mSFfDk>6F>xT1Rr_=7=Xl}54ygX{G}3!A%#TPJ5|#UiPx?J5gseXd{bWV z+*91+w!G_sL=12K+(vTZA<~v=Ul1|K(=Q=;^`k86OgSdN(65uT2G$F`w`f;(Qs8z* zrRou`#hcRc0fzMx>~}TwBQd})WzZsaIj4{j?&@u5x1%m_Bj?%FYt2P-Rs-X(y6^oa ztI8uzoNwY9Py=@wq2PMNix@l~WT{Qwws+;0$A4E#Uv^$z_2A@q$<%xlYtwTOSX*!{ zJjs+Jj`}39v@s}vMDvoV@yV?&-DvsaZ6q>6&8NvcvQ$y`echy1p*7Z^jV)nrl~2Aw z-m$IuB~i1!e-9O-`gcxL=k}|EH>=?0Rh!E7x0g%}?JqY@?jHcD2xEbtR5{K*H$DCk z2P&ggS*9oOUk7Tn_V<$oMEek4uZ=)%BDN)Y0hV5s>*eB-G;FMz!3wz151>jOSg%_j zBs5M?dgkT!NK0K?y7GJFS)+b2+jK^y=VMI`n9LtwirDM9`sL=-Gzk2`A7FyiVq1q@ zSR-}M0zUBvun^~eG+$_oS{!inx~3zD=bC0B%T2a0JF$!JGX(Pl0DxM**Y0UKcml{4>>dAX@_rWNYwPfGjHR4Qn=pGl>_@ z{&#C|OlVs*fp7+R;jE1|5O9R{KN$srHpVzW>c31wZ!&-uxURYW4rAD-d|6Ua*2tew zrQ#&_kI~u}6^f)`Bx<_$b|mL9zd8O!a@JvJMHPgnyYW~{dGGQdi>}Vzzjua5Z=hyj zLx6M2Yj4s0O9tJS-Fx4?MO#msksB9LqEC=d-bw2GQ}f%MZm0j~geO#1x(k`t+!ATa zBaE2VOB7uP6KF&^ub;eU12-0qTe=?g5gN&!HwLLy>2R0QXy`+OzS#i>Du1i;&(L_C zA}BS0G|~tQ_GdZ^diGGV@7G_rKlc?dZi5hN5Sb7xxw1XFbP1JYYSc;sXL4mIw(7g+ z&~;KaHTZ_-2LbFC~S!#!73K#OaihGVmSeV1DbsCTmj zDRQeQgaN-Kb2Vb+edf+mvP`3NA~GI`kH_>%K3KopMd4S5@A-?h;}~F(KNEJ zmkKM%G~mWp?oYN-ma2nL*5~=nlqUCo02^so_Co_h=z7|}m?XpEOQ89r+AB1kHEE@X@#i=VM}_LJM>_A-CdA zEbl?IE=E3nD)+9!gh%kXk%EUs`X@dSU?fl{_%a#RT%N}KR>S6#Jv;j0|1c3~UTLC;sL;DEM60H2ir^r2f2LE`vSVCPZ*CfKbW01MtIgv=I)1PYa5 z0n>p{CI)OupyMtgGDO=D6ey>R6^$T!U16t zkb}=~pfSLwm5||fxDW(3_-z&7EjZ@|@rVl03K)|QgA^HfE(<#27m*L)B*^h<;g(8)WrW;%~}X8 zL4&7HCVh3 zvKrIWVE29iHaMdWAOh`016frvu<0lO9SmC!;Dw&11*P~?flccHnB)*rMI;9GdOtu8 zy}Xc=H!b9T-~axV(t(rf0UFT346n??H$dJY!3gGS0I-1D8z2-fGQQ{&4XBqL860&E z(MqcqtN`;XA0-VCA!9c}5XdZ$Wu*YCH9~~941pm6E`5RXS^p_XBV=A1HW21-POxDU z1Qz6Y?NbMVAt&z8Mu-9cngQ&9rGKz?GenVIgzV4^5posRi;zKXmZ;$RW&q)9!^BI2 z6ECEJ926o54@Ub0k>LXW>#RnfAaBkRc%`WR1@?Rg-u(pOQbO>xUAF~-!w`bBQ-W(+ zAk?f2z3MjjtOfG%=_mZEK&q{f24N8pha^3?vK2Bpw&;rlK<4M zwjDArpVTX{&+P!L*G2r_%iT~=B>!jLM=3DJXMh~EsT?@qGe8oWQyy$S3^7#`6=d+{ zXUM#76kcV)*a6{tPvMnxUo%|ujbsK4+o|lf#@Sn4`i^N&WkO9HF_X4GV8v0Opux(9Jsm%GWc8^R&3hq(qx4^AFX;V`p#OUv84e1H=Kly<$>7!6S^EGa;Fg!6aK_-d zUWlIvDTa7hg+2(T!}wKuqWd6}B$~WZwcZEu!LL2E`yo9vOr?js z^)aAvH}n@JMtL2QzK^GC2#6 zcY76G_XtD~neGtXpkw}jYbNB{w#a|4HA5`&|0(0j!*b5{_J%rk>~8HPb3Ehv7<*!C2E896h1p_Jy50BJ!{vhHUjm~;56 z1mv*QqOHq)=+6Y;x-X&P1U8(zMN7PoufVVOqh)N5iSh5t=-w3;%A=M`o@1_pXaBFH z-}j4gs})q?gZ@`{708te0mC@a>M%96qG%qC@R zpA>VueDkwiZwrRnW{ONvJ6obw5(%b$D(4UR5la*UdpLxsD)zvJYA6Ljh@Ew|&1j zXK1;-4U(JAFiq?jkHDmzs64dy0m zPJYd3x`~oI@rzi|MxQgN^T^1XkP`VD&AIuif0bbd<6Y_aPp4bhnDM!HIudgQ#{Bo= z=xbh-CdS$cE%mZ1xo6^JCN^omOgJm-q%7&93Dz_#6AsGwpCmYy34)!cwCqH0GTg>| z=4t7ZNw?vX-G9)Q+bEsjGoopl?f}*1EOohqT_^Rds1PkM)tV090okEHLFPp@0%z_y znaf(rb#w^P@TO$Jmfq*(kx1K==1TjsK=SCkJUUlqA*SNrbZC4RYM%N_t4=o`Aj9v1 zEaZX=Y+Ob&qPw6fx*+w-zYG1&U6kXV*%+_AB<LeVlGiyI9nhET@*p8MSuq%wXHMigeQWA-A8<&TDuE66!P=NEvpYwOAErwubbSCPoXC*lZ^U@b z4QcM32WClS4NURtg_Moh9x<&i2j z0DS?C%Rt?WAZI}t;_ORHi$FP`TxuI%!~*r!6*_uZ#QO7_6>@TNF-$n{MDFf?6~obD zx5)DCclrVp+Kv6ra!ZbSrmhV(CD3l|bGW4qQ$JmqA$HI+@^cj+iJD6OHTT{@%OXT*YDKh)(0?4}@6!OZp%!WEX z!OToYHM8Ui$a^+bz||+XbvH3k{S!8VcXOsNJvUP1Q()+t3yf~}6lURvZ$F`LiReU$Re08R_ zsR4eDd3taS#2sp{eBs|07RS}VRndNGre4g*w-tRYsD^hS&sz2&FY7>aYtcwAbyR4# zYnhXb+Uw5-aBudth}wou%2?Zh%u($@gX+MsX8=Xiv2L;ow+{YzABUHU5pTOpb!tdmqx{E8?Z!R;ZblLdBcPo|yw zuP=Fq!f3Y!xFHPJT#=ohH;4%LRuMkc0GB=KO~nn&ubt=~*$16wiMI9`{sJvHR`p|4 zzK40!SK;Ul;teKtF?ZMhr#~}|L-@qwR_uB1&I1QXIVQ%H8{hGGdUpgkt-zm)1;_dU zj3UM}S9K>I&p^Csph^}{Hp{6D>wHF##`}DL&%Zyp}c&E;*m57 zr7LfVTRB)Kyszv};XIIU`+&HfkKq18#pFn?AEsz7>9Kfun8I{#1YqNE8s3P9^2`ru zMkZwOVG%nFMW!xS)D0RAHt*?s}AQ3}YN&aB>gJTh2A-HW5Bvo(K*+mEK{)_fq( z9<3-+tULR_~hPTrDhl|$Hk{ZpywvlSXJMi=2ipbLzMC-;; zm@V`T8c&)n58bW>1N@rOWJl{Syqb&+_m-ZIZ~oR`kM-|C75#hz4S$(8fG~=SGOy9?1`Ws)ScH zhOSGdD4=XHl2u*J?GdrDQ1o~JcgK-+A*z+)b+UJb?mf;z0ToYKh z@e9RwUlRx!Ii0>QW*up-clmJ5JD!xAnpzS=$bVU4~&QlnDo5IYK^A+H~4i-^U=(2TzXyr!A7t0?lRLj8z zFlZO0+T8{NR*C?KeJRC&+7id>5(9#gxJbC)lR7j5%CMzM`toKVcKlKSsRBs*QnB@R z0`OC`0v0=QC!;8ByjPo_t93eO3-2vmhG*)m=IGc-PVkHWO2N~M@Sbf&Hdg4^MrTY{ zt)xEAe6)V&Dn*{+%C1^x9>9807e}<1kmjg;Au{q(Ml@ojYl1(^>a|+K zXxs_cZE=CIRcq;-3;%#``bJ@Nb_K?ibt05qO*^2U$(47| e2gWek9>@Hs*p=Hl&SW!L_5z*mZVdKZ-Twjke6_X! delta 27671 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 -- 1.7.1