From cd2205a32518f01255bd45b968ab141059bbffa0 Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Sat, 15 Sep 2012 08:09:37 -0700 Subject: [PATCH 1/9] Upgrade down-rev rc file during install Signed-off-by: Tom Eastep --- Shorewall-core/install.sh | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Shorewall-core/install.sh b/Shorewall-core/install.sh index 42dd771a1..9f9790959 100755 --- a/Shorewall-core/install.sh +++ b/Shorewall-core/install.sh @@ -164,11 +164,15 @@ else usage 1 fi +update=0 + if [ -z "${VARLIB}" ]; then VARLIB=${VARDIR} VARDIR="${VARLIB}/${PRODUCT}" + update=1 elif [ -z "${VARDIR}" ]; then VARDIR="${VARLIB}/${PRODUCT}" + update=2 fi for var in SHAREDIR LIBEXECDIR PERLLIBDIR CONFDIR SBINDIR VARLIB VARDIR; do @@ -353,9 +357,25 @@ ln -sf lib.base ${DESTDIR}${SHAREDIR}/shorewall/functions echo "$VERSION" > ${DESTDIR}${SHAREDIR}/shorewall/coreversion chmod 644 ${DESTDIR}${SHAREDIR}/shorewall/coreversion -[ $file != "${SHAREDIR}/shorewall/shorewallrc" ] && cp $file ${DESTDIR}${SHAREDIR}/shorewall/shorewallrc +if [ -z "${DESTDIR}" ]; then + if [ $update -ne 0 ]; then + echo "Updating $file - original saved in $file.bak" -[ -z "${DESTDIR}" ] && [ ! -f ~/.shorewallrc ] && cp ${SHAREDIR}/shorewall/shorewallrc ~/.shorewallrc + cp $file $file.bak + + echo '#' >> $file + echo "# Updated by Shorewall-core $VERSION -" `date` >> $file + echo '#' >> $file + + [ $update -eq 1 ] && sed -i 's/VARDIR/VARLIB/' $file + + echo 'VARDIR=${VARLIB}/${PRODUCT}' >> $file + fi + + [ ! -f ~/.shorewallrc ] && cp ${SHAREDIR}/shorewall/shorewallrc ~/.shorewallrc +fi + +[ $file != "${DESTDIR}${SHAREDIR}/shorewall/shorewallrc" ] && cp $file ${DESTDIR}${SHAREDIR}/shorewall/shorewallrc if [ ${SHAREDIR} != /usr/share ]; then for f in lib.*; do From 92ed56bbbcb4abe111550dde6d26f1ff7e668e9a Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Sun, 16 Sep 2012 07:29:53 -0700 Subject: [PATCH 2/9] More content in the Internals doc Signed-off-by: Tom Eastep --- docs/Internals.xml | 48 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/docs/Internals.xml b/docs/Internals.xml index 6ed79ce16..690071397 100644 --- a/docs/Internals.xml +++ b/docs/Internals.xml @@ -40,13 +40,49 @@ This document provides an overview of Shorewall internals. It is intended to ease the task of approaching the Shorewall code base by providing a roadmap of what you will find there. - -
- Overall Architecture +
+ History - Shorewall was originally written entirely in Bourne Shell. The chief - advantage of this approach was that virtually any platform supports the - shell, including small embedded environments. The + Shorewall was originally written entirely in Bourne Shell. The + chief advantage of this approach was that virtually any platform + supports the shell, including small embedded environments. The initial + release was in early 2001. This version ran iptables, ip, etc. + immediately after processing the corresponding configuration entry. If + an error was encountered, the firewall was stopped. For this reason, the + routestopped file had to be very simple and + foolproof. + + In Shorewall 3.2.0 (July 2006), the implementation was changed to + use the current compile-then-execute architecture. This was + accompilished by modifying the existing code rather than writing a + compiler/generator from scratch. The resulting code was fragile and hard + to maintain. 3.2.0 also marked the introduction of + Shorewall-lite. + + By 2007, the compiler had become unmaintainable and needed to be + rewritten. I made the decision to write the compiler in Perl and + released it as a separate Shorewall-perl packets in Shorewall 4.0.0 + (July 2007). The shell-based compiler was packaged in a Shorewall-shell + package. An option (SHOREWALL_COMPILER) in shorewall.conf specified + which compiler to use. The Perl-based compiler was siginificantly faster + and the compiled script also ran much faster, thanks to its use of + iptables-restore. + + Shorewall6 was introduced in Shorewall 4.2.4 (December + 2008). + + Support for the old Shell-based compiler was eliminated in + Shorewall 4.4.0 (July 2009). + + Shorewall 4.5.0 (February 2012) marked the introduction of the + current architecture and packaging. +
+ +
+ Architecture + + +
From 78f3255bf0637b35226af635088357436140d1ec Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Sun, 16 Sep 2012 09:06:32 -0700 Subject: [PATCH 3/9] Correct getparams. Signed-off-by: Tom Eastep --- Shorewall/Perl/getparams | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Shorewall/Perl/getparams b/Shorewall/Perl/getparams index 6e2bc5d89..89328355d 100755 --- a/Shorewall/Perl/getparams +++ b/Shorewall/Perl/getparams @@ -25,12 +25,12 @@ # # $1 = Path name of params file # $2 = $CONFIG_PATH -# $3 = Address family (4 o4 6) +# $3 = Address family (4 or 6) # if [ "$3" = 6 ]; then - g_program=shorewall6 + PRODUCT=shorewall6 else - g_program=shorewall + PRODUCT=shorewall fi # @@ -38,11 +38,12 @@ fi # . /usr/share/shorewall/shorewallrc +g_program=$PRODUCT g_libexec="$LIBEXECDIR" -g_sharedir="$SHAREDIR"/shorewall +g_sharedir="$SHAREDIR/shorewall" g_sbindir="$SBINDIR" g_perllib="$PERLLIBDIR" -g_confdir="$CONFDIR"/shorewall +g_confdir="$CONFDIR/$PRODUCT" g_readrc=1 . $g_sharedir/lib.cli From f8c2e129c928a23fe7028419910fe6f686cff041 Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Sun, 16 Sep 2012 15:47:29 -0700 Subject: [PATCH 4/9] Additional content in the Internals document. Signed-off-by: Tom Eastep --- docs/Internals.xml | 388 ++++++++++++++++++++++++++++++- docs/images/BuildInstall.png | Bin 0 -> 26268 bytes docs/images/ModuleDepencency.dia | Bin 0 -> 3889 bytes docs/images/ModuleDepencency.png | Bin 0 -> 24822 bytes docs/images/RunningScript.png | Bin 0 -> 12035 bytes 5 files changed, 384 insertions(+), 4 deletions(-) create mode 100644 docs/images/BuildInstall.png create mode 100644 docs/images/ModuleDepencency.dia create mode 100644 docs/images/ModuleDepencency.png create mode 100644 docs/images/RunningScript.png diff --git a/docs/Internals.xml b/docs/Internals.xml index 690071397..a28779a05 100644 --- a/docs/Internals.xml +++ b/docs/Internals.xml @@ -65,9 +65,9 @@ released it as a separate Shorewall-perl packets in Shorewall 4.0.0 (July 2007). The shell-based compiler was packaged in a Shorewall-shell package. An option (SHOREWALL_COMPILER) in shorewall.conf specified - which compiler to use. The Perl-based compiler was siginificantly faster - and the compiled script also ran much faster, thanks to its use of - iptables-restore. + which compiler to use. The Perl-based compiler was siginificantly + faster, and the compiled script also ran much faster thanks to its use + of iptables-restore. Shorewall6 was introduced in Shorewall 4.2.4 (December 2008). @@ -82,7 +82,387 @@
Architecture - + The components of the Shorewall product suite fall into five broad + categories: + + + + Build/Install subsystem + + + + + + Command Line Interface (CLI) + + + + Run-time Libraries + + + + Compiler + + + + Configuration files (including actions and macros) + + + +
+ Build/Install Subsystem + + The Shorewall Build/Install subsystem packages the products for + release and installs them on an end-user's or a packager's system. It + is diagrammed in the following graphic. + + + + The build environment components are not released and are + discussed in the Shorewall Build + Article. + + The end-user/packager environment consists of the + configure and configure.pl + programs in Shorewall-core and an install.sh + program in each product. +
+ +
+ CLI + + The CLI is written entirely in Bourne Shell so as to allow it to + run on small embedded systems within the -lite products. The CLI + programs themselves are very small; then set global variables then + call into the CLI libraries. Here's an example + (/sbin/shorewall): + + PRODUCT=shorewall + +# +# This is modified by the installer when ${SHAREDIR} != /usr/share +# +. /usr/share/shorewall/shorewallrc + +g_program=$PRODUCT +g_libexec="$LIBEXECDIR" +g_sharedir="$SHAREDIR"/shorewall +g_sbindir="$SBINDIR" +g_perllib="$PERLLIBDIR" +g_confdir="$CONFDIR"/shorewall +g_readrc=1 + +. $g_sharedir/lib.cli + +shorewall_cli $@ + + As you can see, it sets the PRODUCT variable, loads the + shorewallrc file, sets the global variables (all of which have names + beginning with "g_", loads lib.cli, and calls + shorewall_cli passing its own arguments. + + There are two CLI libraries: lib.cli in + Shorewall Core and lib.cli-std in Shorewall. The + lib.cli library is always loaded by the CLI + programs; lib-cli-std is also loaded when the + product is 'shorewall' or 'shorewall6'. + lib.cli-std overloads some functions in + lib.cli and also provides logic for the + additional commands supported by the full products. + + The CLI libraries load two additional Shell libraries from + Shorewall.core: lib.base and + lib.common (actually, + lib.base loads lib.common). + These libraries are separete from lib.cli for + both historical and practicle reasons. lib.base + (aka functions) can be loaded by application programs, although this + was more common in the early years of Shorewall. In addition to being + loaded by the CLIs, lib.common is also copied + into the generated script by the compilers. +
+ +
+ Run-time Libraries + + Thare are two libraries that are copied into the generated + script by the compiler: lib.common from + Shorewall-core and lib.core from Shorewall. The + "outer block" of the generated script comes from the Shorewall file + prog.footer. +
+ +
+ Compiler + + With the exception of the getparams Shell + program, the compiler is written in Perl. The compiler main program is + compiler.pl from Shorewall.conf; it's run-line arguments are described + in the Shorewall Perl + Article. It is invoked by the compiler + function in lib.cli-std. + + The compiler is modularized as follows: + + + + Accounting.pm (Shorewall::Accounting). + Processes the accounting file. + + + + Chains.pm (Shorewall::Chains). This is + the module that provides an interface to iptables/Netfilter for + the other modules. The optimizer is included in this + module. + + + + Config.pm (Shorewall::Config). This is + a multi-purpose module that supplies several related + services: + + + + Error and Progress message production. + + + + Pre-processor. Supplies all configuration file handling + including variable expansion, ?IF...?ELSE...?ENDIF processing, + INCLUDE directives and embedded Shell and Perl. + + + + Output script file creation with functions to write into + the script. The latter functions are no-ops when the + check command is being executed. + + + + + + Compiler.pm (Shorewall::Compiler). The + compiler() function in this module contains the top-leve of the + compiler. + + + + IPAddrs.pm (Shorewall::IPAddrs) - IP + Address validation and manipulation (both IPv4 and IPv6). Also + interfaces to NSS for protocol/service name resolution. + + + + Misc.pm (Shorewall::Misc) - Provides + services that don't fit well into the other modules. + + + + Nat.pm (Shorewall::Nat) - Handles all + nat table rules. Processes the masq, + nat and netmap + files. + + + + Proc.pm (Shorewall::Proc) - Handles + manipulation of /proc/sys/. + + + + Providers.pm (Shorewall::Providers) - + Handles policy routing; processes the + providers file. + + + + Proxyarp.pm (Shorewall::Proxyarp) - + Processes the proxyarp file. + + + + Raw.pm (Shorewall::Raw) - Handles the + raw table; processes the conntrack (formerly + notrack) file. + + + + Rules.pm (Shorewall::Rules) - Contains + the logic for process the policy and + rules files, including + macros and + actions. + + + + Tc.pm (Shorewall::Tc) - Handles traffic + shaping. + + + + Tunnels.pm (Shorewall::Tunnels) - + Processes the tunnels file. + + + + Zones.pm (Shorewall::Zones) - Processes + the zones, interfaces + and hosts files. Provides the interface to + zones and interfaces to the other modules. + + + + Because the params file can contain arbitrary shell code, it + must be processed by a shell. The body of + getparams is as follows: + + # Parameters: +# +# $1 = Path name of params file +# $2 = $CONFIG_PATH +# $3 = Address family (4 or 6) +# +if [ "$3" = 6 ]; then + PRODUCT=shorewall6 +else + PRODUCT=shorewall +fi + +# +# This is modified by the installer when ${SHAREDIR} != /usr/share +# +. /usr/share/shorewall/shorewallrc + +g_program="$PRODUCT" +g_libexec="$LIBEXECDIR" +g_sharedir="$SHAREDIR"/shorewall +g_sbindir="$SBINDIR" +g_perllib="$PERLLIBDIR" +g_confdir="$CONFDIR/$PRODUCT" +g_readrc=1 + +. $g_sharedir/lib.cli + +CONFIG_PATH="$2" + +set -a + +. $1 >&2 # Avoid spurious output on STDOUT + +set +a + +export -p + + The program establishes the environment of the Shorewall or + Shoreall6 CLI program since that is the environment in which the + params file has been traditionally processed. It + then sets the - option so that all newly-created + variables will be exported and invokes the + params file. Because the + STDOUT file is a pipe back to the compiler, no spurious output must be + sent to that file; so getparams redirect + params output to STDOUT. After the script has + executed, an export -p command is executed to send + the contents of the environ array back to the compiler. + + Regrettably, the various shells (and even different versions of + the same shell) produce quite different output from export + -p. The Perl function Shorewall::Config::getparams() detects + which species of shell was being used and stores the variable settings + into the %params hash. Variables that are also in %ENV are only stored + in %params if there value in the output from the + getparams script is different from that in + %ENV. +
+ +
+ Configuration Files + + The configuration files are all well-documented. About the only + thing worth noting is that some macros and actions are duplicated in + the Shorewall and Shorewall6 packages. Because the Shorewall6 default + CONFIG_PATH looks in ${SHAREDIR}/shorewall6 before looking in + ${SHARDIR_/shorewall, this allows Shorewall6 to implement + IPv6-specific handling where required. +
+
+ +
+ The Generated Script + + The generated script is completely self-contained so as to avoid + version dependencies between the Shorewall version used to create the + script and the version of Shorewall-common installed on the remote + firewall. + + The operation of the generated script is illustrated in this + diagram. + + + + The Netfilter ruleset is sometimes dependent on the environment + when the script runs. Dynamic IP addresses and gateways, for example, + must be detected when the script runs. As a consequence, it is the + generated script and not the compiler that creates the input for + iptables-restore. While that input could be passed to iptables-restore + in a pipe, it is written to + ${VARDIR}/.iptables_restore-input so that it is + available for post-mortem analysis in the event that iptables-restore + fails. For the other utilities (ip, tc, ipset, etc), the script runs + them passing their input on the run-line. +
+ + +
+ Compiler Internals + + Because the compiler is the most complex part of the Shorewall + product suite, I've chosen to document it first. Before diving into the + details of the individual modules, lets take a look at a few general + things. + +
+ Modularization + + While the compiler is modularized and uses encapsulation, it is + not object-oriented. This is due to the fact that much of the compiler + was written by manually translating the earlier Shell code. + + Module data is not completely encapsulated. Heavily used tables, + most notably the Chain Table (%chain_table) in Shorewall::Chains is + exported for read access. Updates to module data is always + encapsulated. +
+ +
+ Module Initialization + + While currently unused and untested, the Compiler modules are + designed to be able to be loaded into a parent Perl program and the + compiler executed repeatedly without unloading the modules. To + accomodate that usage scenario, variable data is not initialized at + declaration time or in an INIT block, but is rather initialized in an + initialize function. Because off of these + functions have the same name ("initialize"), they are not exported but + are rather called using a fully-qualified name (e.g., + "Shorewall::Config::initialize"). + + Most of the the initialization functions accept arguements. Those + most common argument is the address family (4 or 6), depending on + whether an IPv4 or IPv6 firewall is being compiled. Each of the modules + that are address-family dependent have their own $family private (my) + variable. +
+ +
+ Module Dependence + + Here is the module dependency tree. To simplify the diagram, + direct dependencies are not shown where there is also a transitive + dependency. + +
diff --git a/docs/images/BuildInstall.png b/docs/images/BuildInstall.png new file mode 100644 index 0000000000000000000000000000000000000000..4187ac028eeeae384b04fee1ba1c623c6a8623f1 GIT binary patch literal 26268 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 literal 0 HcmV?d00001 diff --git a/docs/images/ModuleDepencency.png b/docs/images/ModuleDepencency.png new file mode 100644 index 0000000000000000000000000000000000000000..c302f3b6e3f0af6f0290f041a13bb5e80420d03f GIT binary patch literal 24822 zcmeIb2{_g5+b+BsH9X=e@?@@*DO5<2=_yGvg@n*-3ZX@rqlrRM$t=Xmn2Z^lB_UeK zlp@74WuC3?yzBqp$Gi7__xF8!?{^>X-p78u$MNrBvDW>&hwD18^E|Kn_1D!_XI;U) zfjYUp`p!YMS%0P3qbuH3#P0uBA>t7CRQWRCRa3i%s!fU9^C| z?QZy5+1)Vg)vFcYZ?_S@6tLp@b*CHq0t}WdIOyelwy2#WfEM#lHDf;_^6!h3lweeSi6N&EUS3`s_$+*>Rg3y61e&HKjsuaJlfkRl~Suf zWyn}oN742rA9n6uxcujIZ>I8ecYiN;A&hutg>Q zv%qTEE=`ZjNs4=?nwlCO-bF)0LyhO#w{LffX0yuqLuuH2p4wWxD1mbVwou?ToPwr?xc zj+QrbX*#`JgpIZr^Ib&kUHi|mbbrd~%xyG}{Gz&vF(<4Sy8BHa&&0P-odNv(!8LxH z#tgGfrfa#l1gLa9RrYT`el(^UN$D-YhSpGv-+b|W_lE~Mu}Z;8)7^<0p<>MHicGJu zRBCU7=b(Fg(P*9Kn#24QAM1X>iv4t zcy;~Gojb4AE~C(`lXCrpHtK~M$e-`N6&fmyRXEU0&ssW$*+^AorR;r?<8n(z$R?z! zyEZ|zRC{wbi_^hA2Z2faK3Wb;bfv?bcx}Lh3*HqU`-XmF@0v|CUz0jyPH`iqwMaqAU zE1er}`Ss&P!bZ2E#_jaWdFWwgF2*^zI4~8e@tdvh+UeW=`Y7!j!GG~h{O0gBmlnH6 zj~)f@9)A1Ee~q8uUrHVYOJyk(UBkqcAx+!Lc|$`(vuztQSb27w@2Pv}&|a!%w3tE> zV#5aGvejq7<55%$*KFPIWL9{-qM`!7qgm!P7oV|&LfJ27t;eMjID!qzqPo?#0UPVg zCa+NjPriAHTYXjw4ZB+wlZX?xQ#aOQSc84B_~EqfhIG>n)tWWR zZif#aPNRqoV^}re((3U`1-JL~^r*7S*frDLEo`{1N#3Fu8yl;#k9ODYNl1NzhYAX> zKmZZ^gG8MDx4uO-3?u|At?)he_SX8TsVT#vAIriUg0S%yQB-_|dUIT|j&1b&iXN>1wQ$&~>th?}z_^H~Y7Wk^j>{_W!&$c(6)TRMfu^dwWvZp>*ndt-3&T zNXTmH`t=%gU15)@t}rZ$qTA^8LiRZABTt>WbiAiOMk~1PGh0THZTtE4rLa!SQ4sQMPJ&li#xBi$!WzenrK4n>W45`t(RLl%`+66AJt*pZzdX3hqpL7VO>_32= zRWR9cBU0A3Ax_nAjrPv3u4OZ31#?@>3P+1as&BMq1WNI)mZfU9U9>edFp$A}B5eQY z>auIj5oI{}2pR3r^qw1Q)C*grB0K%_C7b(b_mH2!?6HcFO)YtLMT4a?{0K(pikkE6 zO#PO!rsNgx4WVi5zyp`_Iv;GR$v>c}so*-m%T|{=l#uBl9`o?pAM2iA^dGeq`Y*BY zUoRBd&o9bsD84u{Qlrd#$)F#fvd&*vdzb#ZcWmETKFOx!*B#jmNUY2CVY z!UzNIgC$(EMU9*aTuV-ySRi-#v9Q@AcpN_5VCLFp7;1WAwX6p1_{*y`N;79?Yn11Q zf&;l_10Kih4e+#>zP>RCBO=4Bl56)Et2goC1C^RMfQ|L9*SOIj4pkYLa7x zXy@AMsP0jJL#njk+}9WQa;{Ny{Sc@6yv*G!%UQ1}`r!So$B}li1_K?hZ&)CRGdx6C z4j|;ePLjLM+;wsIo2mWNP4kws8#BTzyq;ogmmKc*Y|KsZTX%=nx zo6XgS-`y3LdipH{KjCwFyPnJJyx#HS$JrP2$)CT#oSQhw^FBsV!KHI+&eSvS@86D&ZlmcXUL zl*d1vocQeSP+G)6@9v0YlpfHa3q8QRPG)1BD=p?%FMj^w%E~evlpB(TR_#?w z|M-jKX1sOjc(biT$=KnuU%yp^THquYnO{6T#;EUY%+#@JJ8sujXn61H{{1V>+ZXlc2`;Nvn(1pacb8b^JJ#Fy{l z8XY|zpx+T8Yn$iT`Nqk}uC*Y`tjHy+1#|c5@$o$#hR7Lx`+$0G1O$jRF#&IIT6v22 z+D)sF-!C81*T2Tfv({F>{o;>k>}6*gn_bu3OiY^bi^^EC9d^yHBL6O%s&eoex?z!n z)QlY>J3I1N<=)lqSD#Ppux;o=uJr2g7akum&puOC$ef?SC$s<#xeq-3F;T|!JbUqJ zasv1Md)i7}{1t-;Ha*F)F}H6!0;e5}+BtNE%Y2#dm%i*8FB~L4!TSoX_HJ%&XFH87 zJjd|UpvPXT1zmR8tE#H%>D98zwX#!p(K!^|$J4sIGEZ0D1C$ABGtad##N_?mSB9Se z6gl>}csR)Fo6wgSWL;Uwg;m(f5VOhm_4TD`(iW0)>E$(#NOMopY`R=|KC9I(29R>7 zvpkqjf$ZRqNm>dMtIVY1KTT@=4*S+gtdiRH(LdFBk9Ry2%fim2X)Y5TU+awBf=$yEvPttvcJ{;%bAXke zPgy5tYbLLGcEtqQ-07+e)49L(>rlCXl&Glnr^jEPU0QUFO@QA)*5KRIA2FH@O#Kr- zJ`3p%+%C4NjmL>Tjo{0iELZjwyzVJJe^a{pZB-Sk@3Dc_r)BeFnS%wLL8+Og)9Lx2 zr|UDlID0k~Q+__Q9TO`=T??$bPQAjWgNDJ?DSQ>;3`Es{+n z?ZnFq-4Cw$3R)rd&sK2D+R)`bi_dq-(JmFb^hfwGT~l;*zso#9Ou^qFF5SI%FDW@0 z8(1-K_joAP-HzEd=rz$9tejz$?;agw+MD+tU#f8biwxWq7t;o`$AcVj0u*v(F*=BQVbBD2~yw&G|LD z+C^Nt8{P}kHaF&FK4Gc&UKNQPyw<|&`4X1!Fr&&)1-y>gA;ty`6a?>q^xQ{O_f zx==(tefpH7joNrMdwY95J-xFRf5tkz@EiUdRqnvW$!P{as}&)$tMBnkoN*)IXdCa{ z?dE;U59IMv-v@h*Ch#k|?KM-gGt|}9b&2n5?rktd;A=1yZ;C^yldvx^fSTCpur{-J z_+4vjE6#oaLISc{Y8IE5#kuE8fYJTOXyw5IOh#(vfKITywDd?}Z-(ZVv{(>u{%RF2sDDAZhP6es@RlOIKVuB@zV zaqWEW$6^6Q|1ntyOGyg6t&Sb9j%X&ge$=aSocwyt!tphy^qKcKSLLzuqsi;{T)oLH zEA}}hUIy6oc{opRt`PjjrR*$c5WZNff)6$u?LF{N!0%9!= zoc)?%R%Bl`H;zOoXI=LV=UPkUdHdleVOl}K1=M^)P252W0|o8#3mo2P>`tq`%O4S;^V_|O;uYSw(G^_! z_8-eyZm7xDR$_2oh}i>#JK$Poifu?z&F3}cJB~a#rGW$lF5s|9Jm%LBNdC_We3K!4vC|#trPG9Id1VsHDi<$ajND;2 zjgsDNyl>a3x3_4OqUwFiQyc{@zg!?TSEExlZpL4B8wKcz*8zajuWxXb7ZoAv#_n|N zz=_0O-HyLn%;6!pO1?Xe?5WBysaQpKmznW?k~AwNi~1%zgM-beYpB#)IpfpJ-n8uM zfGU;Rhniu?sM$1Hcc_liy4@FkmL^Bj>2w?#1o}ZtJ&+yO(Q~T5=k5C!Kep1Yd!`K; zW;~VkE7xw>`StRe>fIynKNacNBm@L~8>v=sKp9%((r=P|Mhj=#Bbzy$$!sohcRh3F z4Ey41d@i2`+KPg)#;?M(d|!vWM6CJoK70+P=-s@^F*RvDKF3#oB26ARl`9n5*Vjj? zfSGot7v6I7!TZRooFTLa4WX%*E>BgvmToj!~f=AW~9{Y(&;qj}DZ1Hk*|?Wb+VAKyKa;Wg3bntU+a3CFqIiHazA zLV3dq-7D|DGd62Qysf|GQ94w4ep^;JO=)fv8F=nI&J(_}x^jCf&$9>ZWz`TtNi8Kc zh*~$Gi$Q=?c+%ujn>$A`<}u4x*#ti0yf0a~HtIr$KWdVjg_4y0i~YGn4(~S7iIyKj zbrW33D;R$I%o**N-BZXB{7N1d@O++4i+$w(j=w4t2Ka&umtmZ}d3=sRt6UIbyv4|& zwP2eI-vxRXMI|?s_CWi(XW2CB|A0bv!Kv37i!7cxokn3qSc?=RAQOszXar-AjG$_S zoC7~~IYqa>xMV4X;rAK&cxUoi)D@sd8=Hou6Xs(`{3D73RqsO8(Y#b@|B zp^DzfSZyP7%|5W}!=`XTXJYr*(G7KjK#eX26>_@;K@UY%LdL>USwgs=u)e-Y&StZJ zLNlvNtVg5AdppkpSCf?QVs$30@xrh z5N?`g`)K=_&5J0skN5!rf?y(#zqky@D8_K2*sK9*J~HnLN*N=~D&`9~b0?+Cpje=Sv)B zw`V>JRM~Ix?i!AAt`6UQaTrua&ZAWSf09#il431!8Ah4r?2C~;#_`UFjvU!}^36?J zYJ$twbUwnPQ)_Xa&GS_Gqyc6Hmkkv5O7>iL$QjIW0qOWB;r|&?s4i~u$VrNPj0>tw zI>UUOoa>H3EVQ#>h>;;xi{`8Ht#Qz2qAI%?FJp7fGdWj$%N7rC6$u$DS8HL{(oDza zmQszI>3zX?ai#CE;cpeqbdLm~nVy~GE$qYP96qNQroOY&Eq_&4+veJyuBG+#pl$gj zV4=Xm%PB&jixICb~x3i7=nk%EE#V`;ch(j2K6fti+<9Fn9@e3- zCyB8o(B!0dQmz6((*XDf;4|+Z3hf%_F5bF;WeX~5?7xb)Z$G)(?c4W;&3p1C^olq)kCxw4!Gifj zJ)~i9Nh1|Ie7Sbsl`B_9e$=p`fa+~v<&)28HOyjr0#a@k_5DCm-pTTytdnUjw`mKm zAL(#^&GLyyM@MI{y^M+TCEk3DPSfj>6p%kp+sjHnl$3kp0FcR<>ZtIyf394yVwI4d z0Mc`;_xuzn2=V4G-pmQ_O0)S-Cxfr>%OI^%JQP5X^X@qN38Yh0M1P=nzJ6@f{Z3E^MRx?VvzV`6eYLDUE*EbB)(&e-}>;qRHpti~o>H*65qp}sKVdzm8zlVc?h?J+=sI_o#aS@RAD`-3ksY$XWr|-q} z+(%F$6kN`t%zWAcfkf9bkWXR9GGCPbc1=$nwz7uAsgh{H-i!!Ch$f9l`Gz?D-4`B1 zx1efu*)cBoxnVhT5eUeynRMCNu-Z@<1(0fnmX4`$nQ^FD8}5r=>hp6c8~;%~qM+Dg z>Ny@RP}SwHIR05x+tdMbJ9vr%_u!SF&RyTI;f4-Ff4j zT8PBMey1@hNREbL)2xMuehCMkMMP226Ge$?_zr5Zs-nl_Pg?3CpX>c&WPH;vR!ZG0 z%n=jRTlDNwA>!P-U&4;yKw_x2JgA+Mb_^lg-ycx$#Ey~w*-g`roANHeJ90Y4eLy2= zDHVUIa<>4)m$bBW*cRhD(1C)>GD@e(qh89OUc$a5s^@0<^M%#@u6I$jwIywsE{3`e}wk@7b ziKsTeqe2)?{Xv|gg%EqvK>0%K)iYY4s}3R>yuwpw%ghj2eO1-xvr{9XKX|@ENx8Kj zt4pC=UXNH$QTglt=5M;K??I6N?FINZnGY4M+eBGePI;D(ZA_*YIw6H3tM|0O102mO zqlFZW&6_qoYz?Ca+-p3AxxceWNk=U{3H*elV z9XAEMmg;d)L!;vI@-@&pT0jM)W)#|>8gyqJ1tN3pZs)o7YqpVm(p_LQe_+ z0$vUtd_abA5DEogP*#iVRGkC@-nbF!4Kl;vhwyCW(1rgfiTww)1$v@TeEo(R(;F_UQRq zHLz>vK+K#F_z^}0T}gffAn_Ij476D``>8W$ma0B>{!tBlA6Bx^ z7Hl_>4O|9V*DY2>&OV%J&Q~;uW#nkrQ3I_z>lyfuCAlj)bCM3$@Zw0792gvA$52c~ zxl#X^UwwPQZfqB*d{e_+sML=Zp6|gx9ycz>t7oV?YEcnr0k#`q8J` zm-*s}I5{}>nyp;_+MIiVPxAoIg#cJ^^OY=Y{JXtoC&e=gAPfBoa;co({VWI)pq;#9 z&wW2F<&T-i3ysw(s!moUuqqTZr6iQ!MK*qCx zi%6UkW}iTh0Kc-RLf7*H27gs{*c0=Iq~W(nuZtF8xnHLYfylP zGmbVT>j*qb8wU$C!ROlgCzX>zftW0$+~_5o3c2G*e30k3hMj?~E{TGhQ(%ZLtO}-R3 z?BIwGvs*1om-vm{_kX*-WXTfbXJBZg()qa=P{L2+S@#8U8x9O(qaHwsW+3j*O{+yz z*a?Ol70WJJ*)fP4lW+R51_eOySjEpCBULc;pg=tsztpA>z|{-$jm0ehnw2W};`>ex znyq&+ej9`vgjAuV-4qIAi*)D$Su=2%kB`6f{U-$6WC~pB?TG_fIubod{4%#Ft7Uap z{=qFngRG=^Z_7oPx5S$W1+2<`)U}NYu~pN+8jog1ey>j_(ge`SXK^U)QuA>vAQZ;5 zL@hpBUF?=4q{lsmEi>4}4E;wEWW7~kImKDR#xaomB zat(1yDT23!Y~pr^=4++H_@g33zR}RpK?Px@o213(pv#6rjlrOx+Qduup8h9{N4XBn zLf?M6g%0Na9{EhY+Ze!)X4}lF_wSE_U~Mn;^b;&VbR?dh{k!qWp4@Ww9+eXLi&cL@ zfWkyyzy>Ei92GOvqPcbd8APM({Ts9X5CTHGTW>l>%l{jXp}r@_>6RdZ7@O}g6k5da zAW$;>2A`W2)VA*-@D(-yfDz@HS8c*CiffeiAfp=`VcZfEKODRB&`B9$ut=;$uKBkx zG5GRN7&IqK0^Y{0()Hq&D2P-P34f#mHaDdTLDLxTa{mr?*okFl+0lLt4 zqELoQPm6A75YA=c;fU8Qqp1yqj;Bf(Y7id~XjpMV9IT+w{2_>i9&AM9YjekMHd=Ul zBC;f8JQNH6cl7V<7f0cKZj!{0o$@M9BBG)w3GwA$$W9agFDw5exibU=ndaKujgB_U zEn4!oX6eYmCkJ{FAuqoSyLWFN-oq~6vL?o2j$uTELSTT{+qeIu?qU&AR`v$Jq!*|J z;6tMNzT^g!hgI0W3EU-^Z^L=*3FuL&&3p@4M5d~xE5szmGohVqzVHR)|FzOVWLm&@ zlS7A|45l#W+L?iK&R}n5GSWdT;mgFtr2E08#hMx#yHG`udi@FOC#>B&<=~k&tRX6Z zh7cBuASRcAQ`2i)NHsu$T{9b${rK@YXhQzHe_lVFu27R^ns1NVtt%tIj8_q2D^lb6 z_FPbPyr}5A9XF0Zj&fe>{Vv?a!MP7pD?`RsLZ^v}MrFj_V}- ze|>R<(~iB@XP_4r!Q&peYHuMz4s2)lEKNR^P< zgHQK>nG6D(2chsY3MBf&1(d}o)sg-%CO8J6hkaOojrY*h8?Y|1at`KL7s;~O;a7Kz zx@>IY2M{!XPxvo>yNz6;Fj$;D90>A~A-HUMVz6wm#WC)?0>}@zPM$AVv=mks??)D8 zUQLE!=59UsQy|J(WTik1Ag{$9;Po)*fMK&SzM0Zd*cS*65nKi!x&s>tph|hurmhIv z4F5uTijVjID-Y5vkQ=h|4on1e6Qd_hjQUgo3^pf6hSi2v0yBss@=7os zH?!+s^+jAyEVjwTE=O(44^Jn8!YqU=f{np`0Cct>>+g6fN6}sM+IJL47BKNp#Tho` z*`N3wBKE=BvQzJ&VTnl;O#xn26!1vBIuSCDLaGMf4!}1Pu$}-LEl*{oIjz}za1xZ} zEP(DEvjQl{F^cX`SxAv?e^|3*hA&W6Lg%(IS4C$KP&L|c@cBflK!piz7_YKsZ zw0eiLHjeSD#uG@^(&&U?%kA53^$d`Y-mtL@T>)}~0pm5uPl%EuuMyB-D}#13UCjHo zj-n#L6*-n2vV-a*L-T8%QDod-1^KtPk+^12Wx(jtP|EX)n+_+%!=+R{jv6zslRM79 zo}m|ZE>7NcV7JwWI3)bZ5I}3P@NjKGE~|ofuCo%`5Z2>iD6wjK-!DOS`8+w)83tlt z)_ou=Dk=&xyrEa7{~F=Ly$Hpj4^MR z9+0;PgGvNMC{6;vrNlY#X_(0EEXtG5A>`V&&7OjMI?$5u&^Hd?`;%CcW!IUiZPt!D z5=~tK!&ejmHq8lfMU)V<`!bvc?;VRt<3U8-2Fk{;H*G@gKuZ8O@IhH`|0 z2MwxcG?d=Y>5mHcowl+I5o{4jhm2d@~W;)D=devC$pCSI^Lx76^D zfzC;Jq&|1UVm5x*T8%;(rxN0g+F(qUc)~_sSl>^6zwcf?gAYj!aht0R+qWU<*SEb% zJn&ojR)W4+fXMY=i`-(wZ1kRMgcxkw=J6eL`Rd4e;%Gtk(+QEK z`JFmI$40KHsA$4b$Hx~Stw%-i;-f1PlakEg^aGXViHav^*Z2Fxy+7FQ{i8ZsuW<=Q z_W^jmM~EKSfjqJ{2JDNW!n=cUByal5%bxu3p(i|7P%0E%d+ zm=q7cBl18M{dEs3H-#NtP2FWE`e-#3OvlV<&zi-m+S=N)mN}G=LtBi>U=qk0G*UNP zMNzq;y{qdEBF9qIt(adrJ#obY=CmRM#mN4vnZu4CKstyAf$)C@!L*3;y$uqK)jr%Q z$gY-Aj{CNoDK3$1$KLl76xp&R3c~V+a_m7nV$=o>su(rXVnlpXr~yp$gsuTEpGK1O z5h&pFO^>|~OpP~WS`3z%8$Sp_&IL18U1Sv3`$xp>O*!U<8BtNX+ zH;DV2v6|w;{D52`xD1SUc6K&A+Mr5;mFFj41)JXBSi815R#}-L_Qhvs4gK8E$osO@ zV=zW;Oux3`X~-JdM$FF;a$nFo={IzcgAnK7TS>@>PkQ_A9Y&90T4P)yI}xRqpq_rq zu3ztQ@Q|k{FHq!au*?6U7XOdW0ponUHi4foV^eHW3-8mGAU04|9Ub*|gUf=zY@`it z87p*>2+zWzk~;9Grlw}9`!f7ih`CA5OK-$)M3921?~yPo)Io(ME)_6)6XdYi8Qyxe zR?56@JGf)o>OUuFBO@cu&d%3X@ijx^fNO?$4~F=uj*gDNlrU-H3;%&{&t8Nt4;ToE zq!C;I+(5;ko(Pu`1n2B;7V;v7I1~+6GjZGzw^u`26O2k_*zc3WCGUW)!{Hyp!3W{v zR&Quz2isd|7o=H&`RMfS$SH~ttH9X>Do)pTij@9;8IOtSg=81h`hW_GfGXc>Vwqt2 zu))VsWgu>!b{$5{h12!|Of4kul6DxelPJl-X?k?sH6o^8zzvu=BQ_# z^eHo0*MU~Tx&8Lf5nB}uq#nei+>Epbt_rFW$x6gq1*6Le@A-ZQZ}FngfADmu?*U+d z1l7gGPQny0(eCX{=1s=h2};%M{6v{l(X{}vv@9}9Brn21Qe9m=4}t72>MlyI%DXZU z{AO^SVMMPl4QA7G_*5T*=z%$A2;x;xA^YSRqEW)^;s-vHin0tffvky*jSbu&fDY%O z_3v=_427G`0Rasu9fCRcpTZ1S7m1y>)esWjSqK$^jX_m*#j>*}b^D99V^TsbRt8r0%-&@-&Ado@O6}KQB;&#n|z9gj`fQ8jg-b2xwq4 zO^zIaBJu_t;t!*;X+t_yZDYsYHee#*m<#c(hG0aFk{V$gun+7p=LzPJVw!nLVTj^C z2-qMC>J)Zxxl#Q+u1NT>0A3TYL`YdP)zJ!mf;6NDy4nJ|5=xOm7~Rb=+n-|HwP<<+ zyaGr974P5A!pZw*dj(V<90p9CCC(l)lf}`av-xFn z5=ynMu}Yry*wRS8nHFX9fZV@KvONEZqudJd6eq$krwL3^=F{&H#54w89hyN^MaA-| z3-Rn_Z`{Grz+aDq#YA;81%Dy%38f;g?=p8+^-wM5R#WonDHMJ~Men0_WdjDDc6BP} zb4@$?)CmU_Nzx5}+gUl`ydfAR61-U_V5BET0f11$Hnv?kWU|nugkAyIQa{5q66`(O ziBe0N5zilMDjJt?37oJ_jvj~lft@gozBv>83tuV+)l9dt6$}v)_vy_3lv7G+ zB(S2m!`F`(cYBY8X#wUdY%6Ws%l2-at1iPf=|f!EjjD|eZaZR71FpO&AtfgE?za++ zA%md?O?;wqA|)?G8HREAK#pJIYe2*SZA^T1nRXp=rC2kVEM1A!#BV8B+CCgU!-49J zdKGJOK+Yp7j+~b^H*KmSpe2Y%BiVA-zCNOzNB!cw-8We)thJ#Jd(&y-?FwL=YL*YZ3WM>h@h_RYLe{2uE|chq71Jq5mbz5LRbZc1+jCORpQ;{-q;SDAL3+ zhM2%%zJJ{KBEVeSPw*3p!M<@EeVn2b`QmP(Y0EP`?_O6{trcc4LV1HzTZOw}AyD6B zEWa=Q9__&adh}jC=TFD4VZRT;%zHx$7I%M#doeNm%**-csDuBhl+o&3;|Vzgc@}+~ zjR@a$OpkTVy+K2US^0yGAOyOCOm%gCwu6-cv{yiD9F*#(DPE&9595WcVA}6G)AN_V zya}>YH1eOCEq2GYlW#D!;W05@bsEAY1gCb9{Diq^#qoeFHi->4J3CU-*<$2X4rYa@ zO>h&cgI2)YrHtJ6^b3fIJMiTE&AoiSd(E_L<}aRsG^9M&qf=RG^4eh3#8^)}CqC>& z#Ls3U|H(CX*6OB0n#1B|VJle7y7E;kGiOOvf{hZCx7Fqb)N19~uWWjOG2!7C;Q`wx zD{qjI<121b>E$Z3qg)-!<>&c*@+}7smm3N{`0K$*^o_j^%ZGA> zir{T^b%sYP(kGy1Sx(Lu>lD#lSFUIr{Kgs;E-=`Z=++i1=BJ9BM9wSldq+` z91%Fc-CqRRgfu}NQ_OMbg&F!OOdBV-g7WO!h(Cf<>9)n|bFc>`&+j^Ywt$P?h@yGq@c){GggAw0*VQ3 zI3&xXN_g}3_QuK#MLY*-OL;Yub$U?2hE9X4LVU-r{Wv5Ysi@VPQ946*LkE}?y4>)v zQm(Bi^O54q(CL6m4PK9~ONtG*-YKcxop@MTmk{D=I9wb2v+MpC+ZXD83#{je}OP%<_d8CL@YD5&m8k5#-xQj#?$)z|&? zZ&QKJx9bLXKOL=_o0(|ujZYJsfVKK??|kYjOaNL#z=uvS+doIE8yUCz3wXacvv9>y z?qxT8eMBUw%O2d2UMN=0n|t1oqQRLZoi180^IUK7Mo!(d$|Gx&AMVq&c3kYHZ5c$< z*RDNjo9uFD>yoR>#cWU2u03-$_|zqtskx!|-^!1DD&2h1$-z9++s!$&a$=2r$=B$? zk==3u@v!}a-Qu5Xg6j}lIzei80}bAe#Kdoag8i*eM@Y8}7Ho1J`5Y_`VN^&5ARx?8 z-kP$}hf+kOhVBJ-?IikUBW7CUS)uklUomF+PcHyUATu<*q08VewOZfQEi5F=6W_l|F=@nsOYQmd2F}Y$~ z%Y44Df@K~}ZX=7>c5elG1gexY$?1kTV)tfn(=)=u0x}~9+UjwP4YVO-494uRGntKy zTf?*a!Z{Q3PsLYWDQ^Y^(|w?)inzTGxLxinL|NaQ3(p%*IhN1peRA;{ zj}E!KD7N!PY+QoH14&fBopwujB|ax?Zdg%ckg}gK5p6d$krs7CoY@#b=a&`c9Mpr> z-ZUg#kCK%zLc*Q~#p=;s9p37BbB#Hq!JP1-LrOe+mSt9Gpp2jGU?X!M2w9VI5!!AV)`XA2zi&s(zj6XZPmo*GFaKG37tn=iX3c zoPPod5>(?n%Hx#G%yuOEWJEdeVbw8;Gl|Km=%$PY-JLFds^xsK+-?@_N<>!^H-8e$ z%I5kVOx-w@9$+T`l3oa&9&d5*Mn|j8>0q~?U!DgJ>Nh*h4+$`b0AS3}o`TM`+B#dZ zO)_C)H+8$KV_zM$3m~KV{rjk$jwiIWt06BDjyAOPQUj&}7QoMl04O4A?r-a)he1%d z4;#Km%Kq8Ij0y%?b^y7voVwnjC6Kfpl_Cm)T6+Sw2U-)OF06C|ItCC)-(i^oqi!R& zPHw`weso&{j%esS7u78Mxho?fHjeaqBELEy3iHGgOj`oHtEKeeB7GZ^P5G*#jkZzh zocf)f<}<CA9b%9%7;>@;P8wyJ<_}26PQ6D*)d-lT zO^SS!e&TNqxN!sEHVQd@m`(xV(qBz?s|BB{-&ieR+*JiX|s)Ecj&74v1PH zFxFR67GMeTEvJv|gFsg8^c z8tpzb0@zww>n$cpGuloH~6PIZDojTGvSt-KUovi6oUA<7UI0pR-_2H}|%x8j^e{m=50p#A3zeRra96b0XxL$Ux@g46X4cPJBP|Z-@ra!gE|8D3_qG4p2 z9$n%ZI?!)5L~N`q#s}L4)b#Kw^#9(>7|LvtkEb~3F^P)YX6w1y`vZVsjn2<|7&6iVVfs6#02Hz_XBqNSxBbX#o2 zZ*JL~_NFnMDaruq_;z)H4|5yR9m3;g#U)W8*u03(W zSa<7rsKK_7l9-Mackt-sL4?%!gLmiFo<9YTPM1`tnHA+dc`_`;9G3dnQ&xq=bUBdS zSwdP)f04VWlh^3%zCF5y5_J{kAZUQXJ)&RkL;iq|pA$q(3eQ`cnVI24z$aN-6pPqrfJ|v5f(VciDF?&>$QCL_= zIw%6-fe7~L<)C4!g>03aD7*%nF8uAF#Xy|gwmnv2+Z07AJH&h9?q$ z*#ILG!jFCBGkRyUnj&mhIL&{c&;!`l<7jiLlmP#$096MvN%*K0`Sj%TB8-TL2w+S# zJsH$?kTdt`(J_n*k!~oj^B!Gt=>QvYw^tp*Ny0Cm+(A2upN^kI`GQ9LDI`Hhfa^rd z1r#gwL!~t3QdPceE!G^CGIZ=B{Y?O94+YA7-tV@S;^QLRb)yjIs*{JF^~R2Y>Q;C= zk4oi5$YASf}7%kWbO5(O!MCFkWI|GnIxoW zureTc2(fJx@p?P_gyd2L1eIP)ex36IN{+%KGrI7nxS*z_tK)HBz4@FK<}h8~ArE?Z z+;nZNLy21k0q2_xMP?hG44U7In@9jS^J{>f(&g_SX76AaW4kZ;kFuPJi&=foI-%oQhE4H~B%gH>z)* zgYPpjL|cQ6y&HDHfOeNLTZ@_I#?tXz{fmIn>ZEOfuvAyn7d2l7ErxzmnI6%FgcBq; z8KBKzt(qRP54m0eloZH={zNujAVD{ayR4KrEsctJ0N9`47dU@DBXJu7eYE_;Z?3FS z_rQl)f>I-5N1fkgT1rX^jdtCE4c+-z_T-R{dK^T%m)K?0TTxjlE+yqq#fhp9T(POM z8by#b@sz0x*+_YL6*_RJk8_nxz6R#%DB+7kB5p7R4+6UDUUak~N-?_pPhuh?L@COD zNwc62ek`t5YSCduIl5JA+@*ZmvgZU4^64rMH06oNiFEeciKizPTNALKrH0&y!wq z3+9-`qnV&lMkw9+(kLwbv4f(rB1>JX=mUtaM0G3i4$bM? zCLI})A|e-1Q<58;0%q#5e`VCPiXOv!kf`pXlY&A(xSNrfya+jvL)O|J>!A_+A@6K+ zP7i>)mfMOKugw(E3QYDf%HzNyXe+f;DpezRDdod}h)rEoXG!q!A|*v6+q-w}fVl=I zs5ty~Be?=2G-eqkPSNS~b{~Vgckdb=Jz9*%ME3+LX1N|X*qZs&SZ_544KQ%PH!DKp zQs|&L_?%~VrPk?Vpi<+%^X7juq5jJkE+_-?+yWIV597`WOSWi}Hm#7WJ>c;l%+e7#tG|}tpv8hP6P*T$79^>DyHWz`COoQ@(R`(-M zPV$C+=*fyUwXi6IJ`DXC+Y^ae8hbA;9Pibfi>!<`LUi4Hxu!gO+|$#ut}`*X;2|NQ z+QHT^QCQtZM*Oe=kf^`8Y__uOl%*xQ{mBg_zuNHTa2DFp*1L2S@BQfLIW!~2eyIk? zN9_*Wg)jUEzMY&uIUdEM{Qm9RNs!4qVWvPahlZ^YN4qz%Rd3(!oUYXVIW|-XuB{iI z7JGYgpH#C;(CW<0Otf4Ww$_0;fBN&qN~5$Rw^3}39;JMk{WT_{e}L5A7!dE^*=yPk zYdO!L_kR`kcRi0rAwx<}(sYaffq+XcIY_(#hHD&dcLgjI{+YprB+}FECyRNwxg&Oe zn&~997RWrJkHb*ufXg$;wJUqQS5^rrS-2qtg$nBs`WgY>0v9KcTCEr!hi2`ci&UI# z_Dd00ZM@a{``dteRIcN*)%EU#g*D1o66s7>I2j-VnWeB$9t8t3)KK!(ReYp5{bXrr zg#ui`#Q*`5<0v$6tI_IqrSI3yo;TQv)-UB!(x8J$e4HtOlmVf}!yUR+`iS)01)UGb zJ~1A{6=0}eGYhYq%9j?nZV?w34~R#ixEI-vHv8asD_{lKGAYkXe_oN=t2YX|Qb=*X zbhbLH%1rL5iV!lDxb+M4E&i8CkZ9Fe?QH`~%${qj6u zLP1xGc>KmfdJxy-fkz8$|Js9&%qFx$Y-6(?u7+;W41ZK! zmd1}=ZS%NU!J@N1n}@|p3t1k=R^`Sg375=2 zF{hv}3QqC}c`5^UnwS_E0P8(Lg@I*|IPzF9Ab#`U77-B0S?hS&Aql{)S|L zN$+j~y$RC0uRyjPY(ug#GQ5Bb=(gnpCF9~UK2bVRGMTOQ8PM0vz<>?`6LJwGx!0Db z&v0&to3^RB=!UDlK<1e&|`s$WXOv=~S$;BvLi@ zKkN-!K%3g8KyqkR8W|oYb#%<8yCl`(iX9dJKZQMht?wG(tYeR?-Ytkm%}?D;z-}r-R4CwE>b66496-ISAr}NWBm&hW?b? zDg@jm83&hA9@#*RhCOlmy`_@$g`Z!@6_8^re?h$)fz*j`>BaSkYTn2>U&yZ%($az#> zKlGnL^203deB5eXmspTWuERe7=(#k|3;$KB@|aCN61c>QfGib-c-s2(qc}t9#YV;CPaI00%EF%Rv*T~QJtjR+ zMiJUWW6<;5yu=7i?ffDC7y|+P2@8vZ%3*0I|2L53; zhisxh;;cvjUIgU(K=2+eofX=zw#RgCPPk&-#G){~BzG1i%V3{$9F9W_~%* zW1&Z);k5)5_8SGDfSIx0381~Ngl~YF2~`UPHnaW)ndN)Og^xqNC2`Gxf|^_sPY1QBYqeTa>bzAc#|c}6?|&7 z@Me(Ij#dP4=18iqg9GBNkV+sAgDAL<3vtl(RtiTU$Pzp%8U|A!_jl9Q<$URKOT6555a02rnAP2;QV8-=o zcY%V)Xi<&Uc#UUo<_b{m1IZ6A71zK`!nRXDEuCAtI)4;R+N0!Kau`tK?YtMiRO$BQ zyHg-2$*sU>73LXKh7Xg+VGv{oB#fbcRL5uzkSlFNk`~oZ+6~VR@l+CBMWNG2?0S=jtEUM@71L+v;$|XKV=Kx=)g* z&6hR)nFq&_eA13&Z2;;Vnup)(O$$6hxOPO{!yQxtl)zvITs1?Q-sW+AQX%>Q0JC1Z z5+$?`R!z_}M8E~NH(6Z))Qfh1{2Aas>0OiG9&C=OdUFMa;o1V-6{PtL?lnxuI?JeS z*h-jlFxV7|mOfqO1|$}ssn2ln;1Qr7kXC6CK-P{F85!ey)v;r%((fI(qP zKuPlnj6&mIp@`oMNR$uGCMbX$qITo5uvR30i77kT$byIJ zf!t%r(-`?2+W)X`XNc50#<)wkzo`8r{2%%>BpF71KZimGO>j!nTY5zTaDu!>ui@Do zisx{%#J#^JUQ%4#6qiBO>8k)l{~j}`2Y1gC%{vPyk9tu%?RUGp z_I8X~3C>DF`%#wtoUuR6!dm7dcNoE%=v1+3Y-~)ABM_`@T3TPC1Yaa#(n_!^` zGpH9)J1NZa@u}WyLI|EL?27D{3s<$YI)6s~uTwv3{q1b|quQbzC z(?F*SDS}_baiQ30LbD{7sG>H)48w|3udp4d!8m|BP9mVl4YM)i_(dZacP+2s0RH9_ zV3|j$0XM@sjhcm&XIX^3pa>5=((x4Q`4j2J_dn9}hV19nfH~L5|BnFD4EWy`t^P;R zOLPc7#Y&slJkS78r~lzHwklzQ2=TIC+|bYvK#HI!iWS$qz$c&b1lR4cV35cK@Y;Jb J{yygW{{YSX^5p;k literal 0 HcmV?d00001 diff --git a/docs/images/RunningScript.png b/docs/images/RunningScript.png new file mode 100644 index 0000000000000000000000000000000000000000..08b10a549b2b80163c7b288c1b840a8d2479d66f GIT binary patch literal 12035 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 literal 0 HcmV?d00001 From 124dafbf529ab91e9d0982a62d46d6b3549a2f56 Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Sun, 16 Sep 2012 15:48:06 -0700 Subject: [PATCH 5/9] Delete IPAddrs dependency from Compiler.pm Signed-off-by: Tom Eastep --- Shorewall/Perl/Shorewall/Compiler.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/Shorewall/Perl/Shorewall/Compiler.pm b/Shorewall/Perl/Shorewall/Compiler.pm index 473b82e7c..daf8d73cc 100644 --- a/Shorewall/Perl/Shorewall/Compiler.pm +++ b/Shorewall/Perl/Shorewall/Compiler.pm @@ -34,7 +34,6 @@ use Shorewall::Accounting; use Shorewall::Rules; use Shorewall::Proc; use Shorewall::Proxyarp; -use Shorewall::IPAddrs; use Shorewall::Raw; use Shorewall::Misc; From fc361afbc3010b638ca3cc61b496c1543f5143f4 Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Sun, 16 Sep 2012 16:25:41 -0700 Subject: [PATCH 6/9] Disallow ':' as the only contents of the USER/GROUP column Signed-off-by: Tom Eastep --- Shorewall/Perl/Shorewall/Chains.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shorewall/Perl/Shorewall/Chains.pm b/Shorewall/Perl/Shorewall/Chains.pm index 78a8669b2..1797cea95 100644 --- a/Shorewall/Perl/Shorewall/Chains.pm +++ b/Shorewall/Perl/Shorewall/Chains.pm @@ -4326,7 +4326,7 @@ sub do_user( $ ) { require_capability 'OWNER_MATCH', 'A non-empty USER column', 's'; - assert ( $user =~ /^(!)?(.*?)(:(.*))?$/ ); + assert( $user =~ /^(!)?(.*?)(:(.+))?$/ ); my $invert = $1 ? '! ' : ''; my $group = supplied $4 ? $4 : ''; From 483374d356449bc8879df00ba2970c982a23a284 Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Mon, 17 Sep 2012 07:52:18 -0700 Subject: [PATCH 7/9] Continue development of the Internals document Signed-off-by: Tom Eastep --- Shorewall/Perl/Shorewall/Config.pm | 4 ++-- docs/Internals.xml | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Shorewall/Perl/Shorewall/Config.pm b/Shorewall/Perl/Shorewall/Config.pm index d9d85ad1c..ebc28db26 100644 --- a/Shorewall/Perl/Shorewall/Config.pm +++ b/Shorewall/Perl/Shorewall/Config.pm @@ -174,7 +174,7 @@ our %EXPORT_TAGS = ( internal => [ qw( create_temp_script CONFIG_CONTINUATION DO_INCLUDE NORMAL_READ - ) ] , + ) , ] , protocols => [ qw ( TCP UDP @@ -184,7 +184,7 @@ our %EXPORT_TAGS = ( internal => [ qw( create_temp_script IPv6_ICMP SCTP GRE - ) ], + ) , ], ); Exporter::export_ok_tags('internal'); diff --git a/docs/Internals.xml b/docs/Internals.xml index a28779a05..40ad20390 100644 --- a/docs/Internals.xml +++ b/docs/Internals.xml @@ -116,7 +116,7 @@ release and installs them on an end-user's or a packager's system. It is diagrammed in the following graphic. - + The build environment components are not released and are discussed in the Shorewall Build @@ -192,7 +192,7 @@ shorewall_cli $@ prog.footer. -
+
Compiler With the exception of the getparams Shell @@ -238,6 +238,10 @@ shorewall_cli $@ the script. The latter functions are no-ops when the check command is being executed. + + + Capability Detection + @@ -399,7 +403,7 @@ export -p The operation of the generated script is illustrated in this diagram. - + The Netfilter ruleset is sometimes dependent on the environment when the script runs. Dynamic IP addresses and gateways, for example, @@ -462,7 +466,13 @@ export -p direct dependencies are not shown where there is also a transitive dependency. - + +
+ +
+ Config Module + +
From abbd1b2c356c30519d40467df85e1bfd5cc9b031 Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Mon, 17 Sep 2012 10:23:18 -0700 Subject: [PATCH 8/9] Combine two identical cases in the Redhat/Fedora shorewall-init script Signed-off-by: Tom Eastep --- Shorewall-init/init.fedora.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Shorewall-init/init.fedora.sh b/Shorewall-init/init.fedora.sh index d64af5cc4..d09b7c5fe 100755 --- a/Shorewall-init/init.fedora.sh +++ b/Shorewall-init/init.fedora.sh @@ -136,14 +136,10 @@ case "$1" in status_q || exit 0 $1 ;; - restart|reload|force-reload) + restart|reload|force-reload|condrestart|try-restart) echo "Not implemented" exit 3 ;; - condrestart|try-restart) - echo "Not implemented" - exit 3 - ;; status) status $prog ;; From e14f5e519954c55d42da5cbe2f0e816f17f5173b Mon Sep 17 00:00:00 2001 From: Tom Eastep Date: Mon, 17 Sep 2012 10:46:31 -0700 Subject: [PATCH 9/9] Swicth from postincrement to preincrement when bumping 'filterpri'. Signed-off-by: Tom Eastep --- Shorewall/Perl/Shorewall/Tc.pm | 6 +++--- Shorewall/manpages/shorewall-tcfilters.xml | 21 ++++++++++---------- Shorewall6/manpages/shorewall6-tcfilters.xml | 21 ++++++++++---------- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/Shorewall/Perl/Shorewall/Tc.pm b/Shorewall/Perl/Shorewall/Tc.pm index c4c6c0143..9d00cfa03 100644 --- a/Shorewall/Perl/Shorewall/Tc.pm +++ b/Shorewall/Perl/Shorewall/Tc.pm @@ -983,7 +983,7 @@ sub validate_tc_device( ) { mtu => $mtu, mpu => $mpu, tsize => $tsize, - filterpri => 1, + filterpri => 0, } , push @tcdevices, $device; @@ -1422,11 +1422,11 @@ sub process_tc_filter() { my ( $prio, $filterpri ) = ( undef, $devref->{filterpri} ); if ( $priority eq '-' ) { - $prio = $filterpri++; + $prio = ++$filterpri; fatal_error "Filter priority overflow" if $prio > 65535; } else { $prio = validate_filter_priority( $priority, 'filter' ); - $filterpri = $prio + 1 if $prio >= $filterpri; + $filterpri = $prio if $prio > $filterpri; } $devref->{filterpri} = $filterpri; diff --git a/Shorewall/manpages/shorewall-tcfilters.xml b/Shorewall/manpages/shorewall-tcfilters.xml index 912e81468..25601eb6e 100644 --- a/Shorewall/manpages/shorewall-tcfilters.xml +++ b/Shorewall/manpages/shorewall-tcfilters.xml @@ -205,22 +205,21 @@ - For Shorewall versions prior to 4.5.8, all filters have + For Shorewall versions prior to 4.5.8 - all filters have priority 10. - For Shorewall 4.5.8 and later, the compiler maintains a - high-water priority that has an initial - value of 1. When a filter has no + For Shorewall 4.5.8 and later - for each device, the + compiler maintains a high-water priority + with an initial value of 0. When a filter has no priority, the high-water priority is - assigned to the filter and the high-wanter priority is - incremented by 1. When a priority - greater than or equal than the high-water priority is entered in - this column, the high-water priority is set to the specified - priority plus 1. An attempt to assign - a priority value greater than 65535 (explicitly or implicitly), - an error is raised. + incremented by 1 and assigned to the filter. When a + priority greater than the high-water + priority is entered in this column, the high-water priority is + set to the specified priority. An + attempt to assign a priority value greater than 65535 + (explicitly or implicitly) raises an error. diff --git a/Shorewall6/manpages/shorewall6-tcfilters.xml b/Shorewall6/manpages/shorewall6-tcfilters.xml index ed03945cd..8782d7f1c 100644 --- a/Shorewall6/manpages/shorewall6-tcfilters.xml +++ b/Shorewall6/manpages/shorewall6-tcfilters.xml @@ -199,22 +199,21 @@ - For Shorewall versions prior to 4.5.8, all filters have + For Shorewall versions prior to 4.5.8 - all filters have priority 11. - For Shorewall 4.5.8 and later, the compiler maintains a - high-water priority that has an initial - value of 1. When a filter has no + For Shorewall 4.5.8 and later - for each device, the + compiler maintains a high-water priority + with an initial value of 0. When a filter has no priority, the high-water priority is - assigned to the filter and the high-wanter priority is - incremented by 1. When a priority - greater than or equal than the high-water priority is entered in - this column, the high-water priority is set to the specified - priority plus 1. An attempt to assign - a priority value greater than 65535 (explicitly or implicitly), - an error is raised. + incremented by 1 and assigned to the filter. When a + priority greater than the high-water + priority is entered in this column, the high-water priority is + set to the specified priority. An + attempt to assign a priority value greater than 65535 + (explicitly or implicitly) raises an error.