From d0ca1634fc78d6859fc27e92cd439d1ef2fb420a Mon Sep 17 00:00:00 2001 From: Robert Ramey Date: Fri, 3 Feb 2017 14:24:05 -0800 Subject: [PATCH] documentation updates inspired by ACCU Overload --- doc/boostbook/accu/accu.pdf | Bin 91505 -> 75420 bytes doc/boostbook/accu/accu_logo.png | Bin 0 -> 5993 bytes doc/boostbook/accu/db2fo.xsl | 4 +- doc/boostbook/accu/db2html.xsl | 2 +- doc/boostbook/accu/makehtml.sh | 8 +- doc/boostbook/acknowledgements.xml | 50 ++++++++++ doc/boostbook/eliminate_runtime_penalty.xml | 85 ++++++++-------- doc/boostbook/faq.xml | 44 ++++----- doc/boostbook/notes.xml | 8 +- doc/boostbook/safe_introduction.xml | 55 ++++++----- doc/html/acknowledgements.html | 23 ++--- doc/html/checked_integer_arithmetic.html | 32 +++--- doc/html/checked_result.html | 28 +++--- doc/html/concepts.html | 2 +- doc/html/eliminate_runtime_penalty/1.html | 53 +++++----- doc/html/eliminate_runtime_penalty/2.html | 81 +++++++-------- doc/html/eliminate_runtime_penalty/3.html | 37 +++---- doc/html/exception_policies/ignore.html | 8 +- .../no_exception_support.html | 10 +- .../exception_policies/throw_exception.html | 6 +- .../exception_policies/trap_exception.html | 8 +- doc/html/exception_policy.html | 20 ++-- doc/html/exception_type.html | 24 ++--- doc/html/index.html | 6 +- doc/html/integer.html | 26 ++--- doc/html/interval.html | 28 +++--- doc/html/introduction.html | 60 +++++------ doc/html/notes.html | 12 +-- doc/html/numeric.html | 26 ++--- doc/html/pending_issues.html | 2 +- doc/html/promotion_policies/automatic.html | 8 +- doc/html/promotion_policies/cpp.html | 10 +- doc/html/promotion_policies/native.html | 10 +- doc/html/promotion_policy.html | 20 ++-- doc/html/rationale.html | 93 +++++++++--------- doc/html/safe.html | 36 +++---- doc/html/safe_literal.html | 28 +++--- doc/html/safe_numeric_concept.html | 40 ++++---- doc/html/safe_range.html | 32 +++--- include/safe_base.hpp | 10 +- include/safe_base_operations.hpp | 6 -- include/safe_literal.hpp | 23 ++++- test/test_z.cpp | 31 +++++- 43 files changed, 601 insertions(+), 494 deletions(-) create mode 100644 doc/boostbook/accu/accu_logo.png create mode 100644 doc/boostbook/acknowledgements.xml diff --git a/doc/boostbook/accu/accu.pdf b/doc/boostbook/accu/accu.pdf index 3755efd765ccca76e0ff2acb027b55622c01b2cd..891968f7d605cd38208a6855b2864e6f0d9d09e1 100644 GIT binary patch delta 48283 zcmex(ignIemI)6yjSP$pjZBPc zkxKrZ^|#llZ2eff?~oFIvN@FaJJ=Rm?*qEa_Rv^w{r3Q&&IREvwA;r@Bkt@rdW7_xp^`OMHw``twrxS$oUw zDb*h$))(#KuV|3}@qam=QwmqrpSv&ZzA7*OU8JU8e)ODT{rq?Peo4)fd$7}eo%P<> z?H^9xeQxYDCtfs{&+_fRg8kLsI^AbDzw2+#h;*6x+_LYnyULO#_aE}=-z|T>I(a-b z^yCsn{Vun8DX#y@CWhWwk{UR9dS-Fm|Lmgw&lA<Q^>omO}ecRRa%!$tm-S%a4 ztDRN-xm)Ma8qd_V=06|T|8;3#3isB+xrs#w-p7KhiTeGRO*x{GzmIgV8QzoB)_^X}Ilf3)?- zTU%A7i$?-$Ui}t~F#qh~VEgXTbqDG1`?m_}S4?Mi?E2KusNCSG{or?Tl<-frbNVw? zK0XXMxoeuKX7`&$lXOqL(4FT~{7xxnb~oEBYqhbN92zRNDJOf=^yfcHqrwuzBk!DG z&h!e}H|?sS_WB)c+Z$qoOM-*S_`Dxg)jwOyS9n-5_2bh?ORL=PEUnz(ajDR3x?95| z20@Pd+s(bY(?XR5*>f!<@@MRwFiHQi&Dlq*CNrH-^}N*;qj+b6(27+j_W5ppmKinS zii_%!&1$8y=QN%UZEAfUc$_(=al1od^p%&KEPK7SbtG_Jl4Wh&`zKFy?dy)-(#Xg; zVS&5q1>QL=u=vuly(P$uQ+2;SpGvOBoU2QhCftttATXlAs%=$v5-&;CXw;L+YYID^Nif;U_ zYWRj_Ph9G>g(pQjedAx8dm;UEnHv-TC9WB#quwS8tl+(8{VC|5+35hL7yD-Y6FYZl zkz)H6zgxSGi5_@to_jZA)`7jdS2$Qt7Lb@%(J?ViEL1{xiYuc;`{T?{5>F3wDW)mQ z846xFAsqOG?Vg50ed^17PLAIWv2Kk`nRI9(uh*KXDURQ=)6OyVKUyX@=NGreHYTQS z30{L)RqrlcD!raGasSp2%e;#PFLGQjz8>qc=FHzJzk`M$S3<&=5no;BPjzQ(??R^z*|y0K3p_k>yEGdJV<2#f3ki?fUU z7FhTGVSDra%CS(Mx)uD5wgz)nSqO%In0fl#S>egz(_RFv_nzR&bC9ubMc1VID=(&< zJ+bWFmzi7IgHNelOrK`(8u`?JqC38*qn)_bNkrIIldR;YntLEH45IAXT`_8$|@@;h- z@7}j@cc0*q5)$pxkZ`G${&iT=MCOy-J6Wf@iO%m&Z^}#4K9rDsbhBiM%8JDj&)zYW z)XU00weL2Y9y;rcn2|oixQ4*#cQHo3xz^#EgDgwmj+2T}Jbjy49sJkxRUf@$@!-s>nOhfj zTTK6|y6w`;ji>S-ORT=r7H6c%_VwSfNzcze|8VGKeQt7NcWU*g!;bvl7TwQ%(a2~P z&QO??;`i-s>!$r3x(CkB&0A#5z3Y6L7;^)!z4^jIh7Aj!-;!cykp5-S{>{B>(}H;0 znT_l`r<2!|G#~FQOtLnA%HewT*tcymlEvF+%;hf1nr5zga>sVpbF+1ow=H;M&dEopwd{y6&F1z35ruyES~bO&)*Ot*Gbt zW%g&kSrR+Dt-=QNT^X4d_RV#7=W?Z19Qqa<)0R-oB+PZ@Q=x%Pt-bt2?{S)Q3+hNP7{U)m5&_{>IcoWL0dd z!2TXx_EU-Mn`apusA6Ye4UU~sf1<(vUq~*SdB1co5dD#NrBJjlqx=gmkI>}zJKE1q{HJ_|tCd%7doU^1U>rcqyM-2WrXTe z$8U4@I?vp4qkiw9Ew;8N_EmR?C%fG3S-Wkr#TAi--AX0XF09O6|NOjqd9ZhF(h0Fx z@gAB4HCo0^LiRr0}rwIEQEcZCobVBFsWhY)Hnbk(>y)~EbWX??J zzf=-DMdsA2hPPLRs%t`jN@>shA@KgPPOjXplZ-KT`wdGAWZFN~9|(P`ec4EcSMr3p z_?*Om(qP|7n|<~j&EtJ>;LNWnqLp7+yjFR02K@HfS0#U6Ew#?m*r8LwqA1{~_=2Ac z*)Pj3y%myhBQ(gjK6u7WmsMgvJ5DUjyvpw@@iG3gj-hoR1+zF~i~k9)~HcO1GXSD6sYxpej&q%lK@CsY6 zM-F!$2w{?@%I2QAm-G8|Lp|%6 zdCrm{xq|6#)AhNGg9=&ASC^hH-YP58awYJ&M#!UYVX@kF_g3Fz;$*ud-L&!Oq8PKQ z8~LjJ4ZT)hmp-#@f!w^n#)w7F1s`)Hgo(^(ba?vXu0_*=C;m^T?#VcDdeg5mS!=%C zor<5neSGTfuj26R!Hi0I>BG-loI28#?wzZw&q;iF&82Dg)(?WhoQ%95&U|f7J(8uw z$lrhXn4wtE`rS?&z8~m*%-{I4|C+x+BRj9a!!~c}HO2Zd`?dxozH@Of^DJ;(a?IWN zKDSuerKBCl8QD%7+dezH;JTZ6!H#vO)n0_NXq;u+mn^OZEu zzsB0KZ)x~hI%liUlh#d#W0->%b)Q?Rb~DK4Qp>cBawiXO$)D0vVzBLwt(o)Q30q4w zXP#m$NO;F}eD;;hZ>!b0bXAHDx2%-AagxDUuebZ>g$sXdHu;C@7aV-M^RVO<(b~!j z=gq&WA2KkpcDuN=+iGV0v6hPe4p|9`wsWO7JkO4i?V00tudQwN=|qLB8yD5|zob8r z>{-EPyrO&6!Ik@kio8pbY&}GTT;`8?n%Nu0qO+~5MuWNeM6Z+F%zCXSlPwN% zF&+2PFJvvsF8m-Q!EO`4rBp8D_u-SH`bNutd$|z%c<+128o1yKAC#EXXhr)lDm@ejkfnE%RBPe8+|y`8!tKI`Q%EI5A%N-AODl$ zwB7XHOMR7P_Sb&6c1Hf+>wQAQZt=q>&oyhlrfclq;Pdf*JwpcT^p{+zc`3yuMX8Co zAXa`-7MF#BfdYs&Ha6dED9g@Re|yqxGojk+;Uzy)Cx4ouRv|odd&;SsXT#>)_?Yul z(Qm1Nips)i;*tvKYier!nwRLQEWLHBU8PXyqyUG^9J{-<2mG}i?f&g~)L$wV5VzKj zH@WFi$Dt=h9x9rw6UC26yqo{&I6uz^_W%Ei@q! z=IZ`r)Z{)St z;KYyl4RTt)o_7B}CNXvUm)N_j)*5|z94C46)v|40Hs_Vc|MTMiZ?{%tN!+xLUYRb9 z_K~mFt}9jb{${zdk3M)6t$O=hkBIJ(bIT3BPBIk} z58Qvm(CJFfiBr9czHJDfwq>c))>9$7!dPwPR)k*NH)ZXjy(XI;&DXJgU$RemclgeG zG9HiAb1UY0&N*DK@xkRtwc1CX1N$^f>lW;pa;@)#zkgb`zR&_CpGh|-PkwuQ?kpSL zYkyC>%U$)edwJ{v+y9S_nfbF;6+WL{>Uc`x&xXU-gRV#OTd7%I@XkFP9gzMsY+~p$ zPGgTKncW6w|4m(YQo~@%YOkwnZy(qe;W4YJWIms9g=Ych`M~;i-5K>UA5Q$9`s<r`N*Ly{HvarupV>D6-bnscjbA^+q<6Uoev$Cla#AW z%s77Y+U)o0e{P)q!yxVUFf``ir9EZovz{Ak{J8#w^+8{h@^_W!Q?s+ydvk~`_MWYL zHc7B(nv1#l{Ij!j67KM+oSrl*ShoJPYxv8ze2&w0Jz;0-@J>()Ij!*V@7DSESd3?z zPnuW0Em!MSNogJ5fp@dkxg=?EEY_L0NL|8sYRA_1Yn@-{bZ(9|nt6Wq>nA#i%ZwZ= z)6Olp`TP2J{dm96r%RS@lCymi5T%gT#CXR;V#uxxsgqV{?gZyXcRLsyeaHos*}q1~h4WwEpW<8+#$j`LpHAd4 z(RJ!OKFvM#-@<`!xbWpZ`j3W|mr&vagsk`NK`6 zFL$Q1f8BjA>+80%SIce7Zccj@*%N z`G94uS=VNrkL`NTCw-ErfBmceaQ%s$4AQMp$4<6|{GL9Eb&X_AqIFmI-}@K!KZvKC zQ=W7nl>It){JxgG(rX_yy)zcOC?&pdWAp|obKl5abuRZ!dUIb^xASe6U-f`}MpSIF z@AaP#ZKQ)Y%#v1<**&k%__m%<#!Svd65X?>723UjyZim~)vXJsFJ+8LL0^wOU9 z_3I)YY4q*2Xg;G-SVGvuUn`j|B$cn=Z>upa^%EHzCEbRu=%`n^A&Ga zC-JT)&n|7Q%9F6;q>${eo zusz{<@$B3ADb2?067Iqcn_66p_QPQSz5_uUVz$JI-~O*pRPd={#Gi{-NESmz$neKU{LV zrgwGK=3FZ?rfv0)xstZLz5Qfa&XU*fezWoOZk=*hn6JJ-ja#<1u2i?Fw)Oq3HM{#D3*LxU~Yp<;RUE9yK?ylG2pTAa}-#A;D=P##I z#r=gricc`St-wrKbTxKeMusHj1&GLGif}J)W4T|41 z9M>#j?4NnFBKa`|@G!m7um7Y*v9O4qj?dO5>>&+lKtaiy{QN`HGFjHxf2c}O+kjJN(hi>?;`8402;o}qIRiFyFxTI+EVpUOQO9P|LyHznGpdCit&zKhxg2j7xJWA6UQK zHP_SD^YJ+q-&vn`7;ih?yjY>r)b&J-W#r2*`^&{uT!p+HpZi@t;#Z^og0bx58*Ybp zbvueA+xPo_aGz79b33;7#qk(1wln?Dob#p_=ojn}XxklG^MjH32lM~hLxO=BU%r&v z{dv>&uFo3ecay!jYIXJy9&4M{Pp?n)wkCb zi!FCY_g~qy@^PEua~rS7M?d1a>TSxlC$G1!Ubo6Cjkh|`tVmh=+xER{TqdvHl(zm; z+V7vyW#6wCs_GYB5()QWdRCacGXJyD{m!Ppdv#~msNej)NyK&X>0QzFPgd`iY_yy4 z?Yip&{;2(Zh7v6AyZ7F>X!rB*9qnY>3Z*;ldP(vXh3R{kt=c}a{Oq#svuUpleX@HG zOW)~U$EzEavko@RVVx&jtTJ2uu9yCI9(D0GA??y-6ZTh6$XUB-+cfQEUfU+|&JazN z*|sUAa^}~zbt!kne9yY5-rN_o+N{2rb5YDj-9Nz(TGF($Plim}YOwfB%2}0)rZqhA z4sASh-}M{p3}TOQo#In>=80Tw=SnVO1%?!a^+ZhLB*Li^rJvjuLN zP3Payy)8+am2c^_$!~o^Ri#`fE}Xc+;p^O-Pd*|?3!M({z0=h$^QG$0yW4G@Y!yxQ z^+uuQeAO2>$Ven*GoD~OUcSg?)ARV6#wod48*iUnmDavTnz;|v%S_l5#Aan zy!FwMfYrLLZFf3;J6XMPZ=JK5f9)F6=mjObYq%qVHm(U|gNHULr|4@Hh;3+) z*miIAqPLpv(%1Pezh1fMg-k-j;Z3F)Q5{^?Zr)D}`V2$6fgOCSOrf?5&s7M2RH|R*b=HCl9HlEjWDPqrihh7u_$O=P5bjs2E}0 z$UJ3H@rk`tMXZx2ovyvW(ICKBa%sMg;ACC*b&nslpWv6@pK5e+S8CI~vN^ZoPUY%e z`xJXGcFml(b@jOyP0Qwrlycmu_c!35nR0dNg5|sB1wELwC{LmtR zQdfPtYGs;~{asOUO|RO+-*SE5GYGUU?w%;QY}o_9#fw)?t7Ipc3eZfDRa~vP}41P1@%z z?i%*C-Fn*gmfac=A<~yMFCW>qOR~*aeBX-h)0aENg(}$2Pk!=+>2mZk0nSG2c|zPm z+YZ$%G_**SF62e)c(w z-0dBIrmJQw{&LyRt!e%2sc)yKRZNOYPxN>&Gs{!PPpNxV{?4a?UyMKhV){P&;wo|R z`A2meWltucRVks znELzrT+rXQyZZav>Hjy(yA;wQX}s=uuJneB{OMIZ@-g}qF=qt+r2bmTA^n%7cFRTo z3t_)FZ*6v!h`s%!_LqX|L$O=6Cw3e&o;9_sYrn_uCJyemB7Y~hemkA*AF({)_T|@4 zmo8rtyhU=&WtED`x0ymqUg+2Bh)+MAeO^ybByZPG9rl17FJm@~eBel3#{WWuul(~m z7sXFZ_xGk}Z9lL0J38;NUCg%L?#{bQIrmNSjh^}a!A$R9L9^*<8F|H-P1{=6KbKa& zvtO6h!v0C0bk!Vnn^za^CqCqT?eyvKzDcFM>o@Y(sAV zp{<=>TJZMi8trfOH zDEq*Ux#q68R(1URyA>i95jhX- z_{FCc+~}{I`89OI!WUbDgvzh*MDM#Oy3Nt4-shBc-3yi4-VQH~PrtoF+|}M?hi>WB z>3d?U)UwljO8X0@*5UIHDbn`9sH_1a#GK{UpCl1+Z1te*1O8{g*zwj z*s)(DHe&KZafZqd^4DTQr{;eO64~|Rl|ezVn!^jnGQUPsr`8*DEA&m*GQVUG-77D{ zb^7#+0^Rx;^OxHuod|GTd(%rZdk)7v z%1->2dV9rOhr0KD)hG9@zv36^U9&-sC1MiGgz`ltYbGRJ-Ja*NQ|Kz!>uZry?>8%M z)T`zzMV0v2fRcztMVjOClzcHA#muDN}8-FL3>Ci`Sh zeTDjpI1j!}tasuztCX@`*sT@5=3e91Lh%KEerjpIC|kAZQmOxXy=ildxn%FZFIJk{ zrI#qoBW~6=^|(ckU7&#-W3`1T$6eKf)1Exv`EthbmshqOdB@hNm?b!$rLX^am_RFc z_64T82~`R89nA`!YtmGA#8`{Go+`z|{Vu#C%XmgveV4}XmYb^6-ia03*VG;s+14!c zDN3)g?d)aV7J>D3GS1U_Y;Ut^@C7ZokSq4-N#9{TsjJ!lCcj}$zajdjX;nj~9p7aO zuHR=ao5z2d{UUtD?YaNHF6dFX*ZG*?toH}+vqyLyZxFvL#lI-y_lE0SXC==5`X-UN zZ`FZyvu*@@++tr_U(vHVVb<)fYpe4@H%fip`R<{`1M`GA*{qUju`3RjUSIw3PuaBF zAEwSYA$7BK{)@*U7wmcse0aa!DpI{}`RnY;m2AAh9v>B6pWG{4acDZfwMXx&RbTDG zj82!HlCF+@Wp?}3mK$5Fme2e1YKnFIHC?mMGxQZ4O*xb%TiPsN(s1Ta{rPQd?;hk$ zDP0>boZRrFblv5zXT(jG`v20FEz^Ctb>;hCmUC-uzs1bI=p>-BZ{ZX3R|*FW%nuxk zo2DJ&SNhOGpxk)>&Z`A;ou{TWTd&Non%=t5$HC`ZZOHcMtE(>U|J78^)vEH#J z14j1(g~Pf`@2ngR=1pFaq&Qp8o1>zhW5Tb09LrkT@9doa?C`>?=4V{&Y<98el?j#c z8c%Lq=dR2p#J+x(=MrhvGyTCkE*cpB8XNC3c zeU~%2O)`UaI80o!Pf7mKfg6j%)W2y2Jv%*jYW)55GSALCOEqKzlr5R}37cA5e?D{i z9MAX1qUn17_AZMre6=yB`s>E}W04XD_Ot9B1s>XS;G>hxwbgeXipyQl|Mh>Xw@B+E zx&LqZ_J36_|B-ySZlBir`j~J1tK;jAUKX9#{^q6EW@)i~yMLV&IP%x|s!Fvfx}wV+8~<^^{lr%;flNLg5|4#1Y6Q-? z^1U{~`|YDDMUfd4;US~8tkSK`8wbHO>#^89(1X_UF#`rxo*-eZk=1< zY`JIVI-C?ZzFEqzzUL^1TCe|;+duBy*|09=9fr$uo-!YJ zAk^dgs<>Vv`i{7PS!R9AfgdvW4Ueh4jrY05v5q_HNq2FMu)nh4=PQeJCti~GU0})Y zr=4NN=Dy2*?L$?*M7<{G314rnTenSgu0>9`Xyvx_;xcK=*7nOjm0=Qbk3_|OT5jL) zQ~yV+>z}(#$#b6CeBz%w;uUmlwOVQx3EAedQ4iy|-mk&Q0N0TGx`EdaZK}-;#6V zqD}6eBjr23%{_3hTIRBG{iRdJe&1EdT`!l6OH&NY{}su-!HxrW*rTufp=yE!P1_o~#b=>_)nt>*qr zQ?@@@?`XBT{l%>;?hBhIy4f8eQT7vA=prw$)W zRtV7Z{~p0?{;6VX_~Bb!rlQyKJiaT{UwCspG%&=!;>)pT5-xr7cLXdne^-5;`>euz z#l^L*JHwf#-wnG~xy&WtmhFVhYZrc-d?~E&%6S&le<=5v@9wJ4%bx#Qcw&3y?K#^R zi(&%}uE4YHQSiRE+fHe3zq0eed-uQ+7O9IJl1mS#oO&y`Ot8Gw?Ec)8 z^;-`sulqddkzD24MF#@r@jWx1H)jW5|HZ(cc{@6`yMC|b{}CJ4RmHFW{L)HDxs07Y}7W4d7Nv0Dep1t;neB|Tjai4eBsvY}} znj13}-4_sey3w3j)uyJDwtG77|D=SdM_-xG^Xh=S=qa(SHxpT2t_ZTz z_LS)HO6{)74_fXWRhKKeQJKg2$`cpa%73mBQD3?xqOR=MO{|#qoyEEP)*A&iiFr?L z4_;VgmMh=7c-=#t_cvlMebV0jIr74#SG7MTOkyXbP{mF~vuKz+7%k)CRP>4Exe>sbYq{O|JzC+?oaN`8Cf(Zn+|iTwbn%8KCyb9*cDv@c z3G+WzHF#U$q;D#6Qv86iUxS#bszb<^r8P^I)l6b}elK$8nddJQD`u!EzKTEks6FVL zXG!SGuK#)GpJ;_Mv;XoawY1v3N!YdV*spcjk(U=v6<8yBmbp48`(p5xh>+5ZzApfQn#a`|!6%}v2m>g_#Own=*tZze$+*%is^gF{z7^cR1f&{;^=r z;__1_w>Fq%z5eT4uXZb^_}1sb5;w*NAA+kbcWbYDvv4E3B%{#&>1ykwKO8;S?dx6_ zIQ8hftADHW<~mP_UwLr3%@3(fA`StQ1578se(r6;f6hBaH}J{+i+8r9Ez11#d(wnO zhMxY*k1M#;-VM9jlM|P5BCO+AT-@a|&1?=;^GkadENfV|Y0c{F$Tar)Yu`6bFDNB7=u6u}DtpwN-{hN^3ok7_ZDuSx?Ak18 zyf~;Rn4dLH|5S9&rj=PL?Z5vBmemVhWAODoGiy$fLc>MP;Jzm>)ziB6#jF%u?J!M+ z^Z3n`E01wKDZLlWxjR+cQJ}MF?GwK%x$e&Lw*Hf|9{tLz zU@ufpJh^Aq%$e*fE=^+TwEFbB@5$S$Opz6;%MP5=%9%Sot8b;ol=e;dl&{e!- zd;NxacQ${IFX^@FiWFgZzU`&@WbKXl_v$mh36@AI8KlVMtIN5@ttfo`T)Ug$4-^z`lNHdEcXi*|D< z`W!ka-xpSMdq49@m&@W3TBSYn9`*}&x?B~pa)}PAfB0UgZ{MQ)FCEvXo%iPXSupFN z#f!UE`6s{r=324r2}247y_9FIfaByFGr~a%aZ`lV5##Y70d}&Q3}1pULPd!@FhvTPXos^Y1ff8}a9# zv)%gpak_Y`O!QaY#I(kya&=DoTMiM6KO?|&%2;`w{ysm(XNu)U7LyZ;~szW$F0xsp$@t zjrBX{Je%ce==*5nl=eFney0>F>bEV9&K6s0(z$->#)}6X_E&hSNWUv4K*e5(sTMHR+pKNC@ z&SYY-Iouv;ygkrfCG(t(zys+Rbz@((mphC-Uq7>Y*Yoz{1)FITIU? zJMFl$bP?FJpUb{Kl`i^!Jy6KoMsdj!6@?zDMRjLR*UT4tB7c0- z+3%7+tHYML&Q4GARe$ok`fP(t%lRW>TG{(Ec+nK2c@O3^?+>w`;#*kiwymn(M1to5|FanqN5o4qR_PdceVQuz z=ORm-(8h`_&G#oCaFnh$G~Kng;&@i`$LGl-@3lTk4Kxiw(E$ z9O>Thx&Fw;|MMjuc&;#5kR*2CyTO~c9Q89&ran4!{KFm-UP+e4sRDn>B854O7Eb9q zYC22d$DH890w03Jtu8a%wCQr2to)@ZSaZM2`rXXB#{_I_w_TMBnrm7RpnZAKgvtAy zRBf(wPqjF;u27?Cw@jB*glyM^y!Ktz7i78~)mf0>n!GiO<3iXt~NUe&Q zGQA=tv+)W0Ka1ZR|HMY!K5bHd6=jiPy zk7`i<@_GKd`~QACuaE3bz0+#xSQ9Zjnk~V2zr52v=5WJVF{yPe<+J6>6OHYi=I1^u zKQ%8(zHu$L!t#t<&Xx;jjQ9<2JyQ}ZJ>C0bl`2cq?M$A7Yi-&tlqnrvb(<%zX>G_e zk$T&wMl5l)D)GWDiF4xC?+i2F5&FIPhv2T?iqa=VtV7Q2$PGOlbZ}Bwps|ZjRFrGM zc?cKY;-(fFJ$v)i>4frF=KDL)L*(9iB$&fe`58llcPH<0ZtznHt& z$H<+UXV{bijk!+En8{|Q_Q3FpT|?@lT``>>`1Jf7Dy$_Hb~N*D_+@70kYO!v(VE@T zaAEc4ZoxUSFQz;Qi+|3ty`ooSL-zV))+^^6xjFKeCC?S#P+@Io;l9?m`SuDc(;Y{% z?-U%Zxp?xR?PMd@%)kRF8+k;7XS>rMu}VL;@;tbeo-X6WV&k&Y zzTngko}$Ws46=>>3nPzI%%7}KZh!jpx7p$T5*Pd?e9-X7(~o~_UQquhbt2E=4@*-H zwzUUe_t?h4;w5;d{iOGA!Ba+$BLk=MD;Opy2?U;TDXIP`m9dLU+K}T!+=25aQ!_PZ zE}UKerRelVMa@Y0+1qaMi+|6YDc|RME6ntQi*L$Fhg+W=joe+$DvLEPZC09?yz}I% zM>>%%_tZ0YDpuZ}V5KYnAl%t6GVsLtuN&7HZ`tX>xqRZnJMCL6(&T=6=5=h_y~R|P zC-=$AIRdv-65n6H-qV`Fp24ObDyNfrOq$!qpN``43XXRy6tayw&oYC-8WneMQ6OsC_0w}x9Edb={}%Iw3Z6gU*S8p6`8 z&h7pjdv?)1o5nlhCkoHMntSR)#4G6{;TGL5XPNCTN3^|9+Ru2USy4hqu*5Gv)qwxE zUBex|snJ5WWAhKKs!y) zW}dvT`pU!Rr3Vjbo$GdT4XtsDh@SucTITM1x_npouP(H?Gv&!_nGW_}_4gUe85S=$ zwMdi@28TV3iQzbLKOjxjQ7BTku^^#ymCm_Sd~;Q=Ss#rn zx+Gf3S;%Bu5SwdMsUQ2kh(lQE@ymr?-HAsgv?(?TXDT(RO# zcNrANN>?_DFqN9;EfdS@iqK7wuV>l!oPAD^$ELsMf^Ke!+%>Uz#pb?MiVO5=(gZHA zHTh`@`Td4OLNU{ybAfIsi5y!9P_?G%ukDZ$=aOH`_}js9h!4;rI!717x|Vu z0X$lltGHEHxX+uOwTjpCZ!BB*R3&!Lc8A8rH7|UeLMLT}BrHkQmMvcO>U);cIFn$KkVw_zN~}t=R2T-{dWI;aRg#$v`*Z%-I8%E^sb6_fH|W z{H*eQriBgp*S%hEo0g`dZBSXZdQ)oXpOhPZWuLL+Xkl{O z{Vxkd^HL`5ENkOicro(gNnwtjbE}uJ>fKx1VrJ>uE;aM`?Pbo-CbGA7chttm*r!}M zVU^MnS9ve?{^`3j&g{ASFu~4$ZWh-&9?RuDeEvS`E{d3L%Id1W;Bi?gf3uZt%&xXh z_RI2Fhn@&Fwn#;my1rPsPCThpldJT`V`VwhO zGGG77#*~*>&Ca;^bjf_vdiE8@XAYUx`N&`XE73ErHanqe1E={x_BM5CBjd#p6@>{! zFNDmE@gQHTHIsgAKd-lyO<={-uj~Hp z`X(3jpzyQQ+xwxfwZwjD#`|8rKk2vc)X2Jv28{)6*;xmz_K8bm%1MY!d;kCMF|(=v z|M5#*`6)YHkcUxZvaJs%ld0Ke51+-n^^dm+{@b^|X$ODqr8h5KUfKFGZE=hbQt()B zs~}%=&@nr^ytQI!ug?24%R;C_w|`38819L|MBDJe?n{i zJdCTaslOU~^ih7e{U49}>t6o$v57zXsE_x5?bmC8D*t?6igoW^ZNGna)#vLzCnEOj zww)OkHu20Ri@wiZQvw%h{dMmw=YQ1hzwcf9!pPo7v-5J^&2p^yeuL-hjc<3uYVP-a zpZ`ze-rvV6o>K!uGd)waLf&-z+V=KVdzJFPt*?)LTPRrnKWA5!@wT&NVxOj$Ph%9G zb?g2##`}K1&WbJ8Klz(0)Mc{&zO8#V8OVHfOer)vd0~ELlv`$8Sm>&)h5uIvPBsdh zs=|5p`W62*K6fs3MDN~jVJqbzcQ#Q%#dmdbud_Pad!B4cfBT=uNHSyBmsx)-G$EKRz@ zdZ9-tQbttREX-Skv0|_EZ}wB7t3S)JVgUrP7Q zcRI@#CbR67_I2s2C+FyW>wkVUte!J+UW|g}iqFq_Bh0twUhi05mGOGE?`F~6x)ZDI zJGNEd*=d;b$#afX8n+SGmIO=I3zMDX_uNr>{KQ4#U|vd$4{5x^d(!C%xac& z?MR<85ET>7VbP^E_gnWcTwazM+@PQpr_l|*+t49>fB_Q6|AD!p~P9g zdX;NV^AFaN=H8gzHB;KO3O#u*h&(*s8}a?_d-sc`XQTFHcrfZ6`(36T_Vrq+(`B_x z!_B2(qTM-6KR(vIn16oKJlUQblF~g4%OCcAKYQ)T=FBU}=X(sa=W0B@A$F1H{;8n# z_8L4!Gxumz?0y|~OJI@QyE1-X^H-WLJkF~}-KxK1vgm&A?K0o_+mkNaZFxLxV!UTR zv(aSciUkSA&lqb@vq~+vUw_Du1AJv1H|(yE^_gdCz8RM=dMzUC^%dwCC|$J<;cGf^u&TomzVE zX3(Y`N1VJg^Xhk0H%!l2Q}gPPrqIlV|Jox9k9<-(=C-HZCF5qK-;XU{N*^rP+_NOx zy|4CBePL;Tuc~iA*}VC0Ix@Cb7;~!V+*S}^+5Itn*~<+X#=gqGjM;r#t&Baw%R-Bq zOKdOdOcQ*YX56htBI)uDxxmFU&r5Xu1xo;C|Wb zcRopcm|uTxr|E%k+cndD>Yct?)-!z(&wH7_(<5NVQ>BKwuiZa__9T7s-odQBUnd~` zdYl>bU zm0pZkX_9oTOC>$fC7?z~ea<(DFP&>FlAW%od!8wMptw^d_zs7~B=4YfXGMpi2L1^$ z4=N`yS2R2csO@{gaCUM`zz)}HNCDyiR~La^)&9O?PPV#pB!WHDt8id z&4eclSlx><%PyMPJZew7!&|T?EzdYX{Eiv(g1e;+ThB6NK+{(+s+hD&YW}`#p=^n?YXOA#FsM=A?pQ!Vzooz#6 zR^DWm`qGWtJsIBJ)!!O+=Aqmf*+_r>?_Uo*TT{Ruc8=+X{Eol3Sud^Sc|Loc`i(bJ zW7zErstc#am)Rr!Q4FVC=75A0c+2&w`slim%n@8k0%U zoRd+Gp=%!Nw;Xocyj7H^;MgC}7+?NX9$6cY{OOQq50^Gh6FAROu&Cy|LZyh&WM#8M z8fM-+N1R2Z9Xnr$F3Gxl+QvCy56{K;gPl8GS|q-l_EbkHm2Yuw6VHAoxm3m9 zhSP9~qzTs(g#(){IWEj|y5yy8!M3cz(IjtHWTdLj-7cAi=G&2xtPccLrp~zd_ov*q zM>&t$#T;V9J}b*CIuP?m*P!nxKX-jjzH3dy9?6f~cP>T!*8SjJZ2Ej=)OpLrm7BVB zcih_2pxz+fqGa+ZFL0)}roVkm64RC^Lc$AnGETplYRdRv=d1;%^jC8-oL}E3cz#`< z;JNjEwy%nVxiZR1WyJC>YA=YdZDHMbbcW+cv*fm^+bs-q?rI$_j5|Ls=?15q)FaKd zdRMiE_F$f3<&(;C+uNS7F5YG~N$kdzs-%?0itg)TEZwC?HY-G}ah5*vd&M;y&4Xe* zpO<`0J^xsFo;v%H%}*K%=E>N+GJevKF-_*sA>Sg0FRN|6`4T^hS?UDbQ)y?tiW&cTVz zI(oO1U1}O+7|u^-KEV8>;Z^YyhKzYKO^0-g98S;S*H0F0dRuTYX`Pe6`+fdNYn`Tb zm~Yn<;Q!tAY!U0j4c2)&QHR8~ZqpRtyWJw@|1hA@LuX!8)A^kni`IMT6qvorVH_uW?3vsF5~*!+I2@=U&W5%CsEwrh{x=w7(T~s^&tLKruyYv0tXWi?nT6*qGR%XDhi9^H1m`goOarS`6WKh~{|xNE+8{<5>rUrPLXu%7*UO%B`KTibtqm$N>h zQ$IEFnm*yC zNn-G}ikIH*Z-Z~=zuFk--t=ef^@BR|ekbmo8}m+8`ik_dw%uuSo;&(m9(`!It$$kW zvE3WC6s11XFpo?t%aNKZI8DN~a*g~f&7`UFhtJ8|cKlu^9QC?+)#9T|uh)xzOs_n3 z`Nr8r82ylC0iI~7-t9mwE8ZTGEaluJpT5A^F_)Zzqj#}t)2ON&an`lBTLP~ zXI7;29{$(+v7=ev@xrbbPYM+r?&MT?{n;gv5q7pLn!kGPm(o)!-pBDRIj^~Vm5SD5 z=Wib~>$k7i^~v0sDwA_A3QRtfDaU9$`C+D>gsG8*o}saV zsR>BAsi~o!i8)+3qtWDvbz+n6XBtcnsAJ_fH8#>SSFkkDGgL4&F$5b3RgsxxAZ=)9 ztY@rXVrr^qYGSEiXl$luW};wXW};_mGP!Z08j~@^u+Lcr(ncnRdgf*d#%30JW)_AD zMrNjZh6={!=6YrplP|7;E3L`qrhY%%|L(5GY88cL%e_OtSH9c1 zy(?c_uK45kF1trZ(lZM`u8sd3aUxQHclsU=gZb8V9Z%m)+5P(fQ|*QG+SALPlzspB z{@uIH(M9F^*W6ey{FH58oPQ+qIv4#X{*xg*N5s#$4+hg zyK45;%ldD=$+LUzE11-x!g;QyT;-K|>?@~dZ>Dd{DOq@FGQ?%k>9W0FwV zTECW|Zo{`y!NW=y#D8y0HvE~`aq5QNJiZ;)oS*quh51NdTO+diR@z;&oWStbzx&p$ zPSxe!7P)fL-P3zQ+bZoQrygUfxp1(kK*6()mz43Jw^v~hyT|Fx_M&f&hSvecxD!l#2RP<@bZIaCs?c4!ZpMS_%C9V}jyh)? z(mc4g{+-ALxgX2Fw@(yi`*D|Gsi>m)7ZqUAOt9$nIoxm06>t}ralbfJz%)vR^`QPV? zJBrFYRgR5^<4%5gy=mPoquZP_68-e~1QKT)cI{tzTeQRYdimBh+m9?1GAUWgnbxW$ zeS1yB)(vNNOjvo&^s7wL)#|y5yUU}^-X$p}NKZb#&wlay_d@J9`(K6Xo&K^hQU0mZ zLfcL9*1~Rwm;|jFbJyLg@6ov?6{~mib^3XmJjuChWIP`j+RvHQRS_DxOj6cy#)7gP z>y7j8=kc?-^?6r_+RU?jxcWaROn!sg-6CyV!oen8nZgi^Y<}5eS(rM=uPvLCboIgg zo{ch3#aP`#iw@m5xlek=^=FYkC6XK4`05v56DpqVwCmEh6*>&trDjf5{hM(@mMP)= zIj84Y$5xyuuX(sLPve}l>CJYIv|G2X%;G$C_{d9jCA;Dhz9)yuPdsOdu`F&{wxHS~ z%RSU7T9bRqtsZ-&0~e&!l|=rmv7cP~VR_j7s95Ix*&7r>jV|>Z(K9&LD0pdAgmT+g z9zJIAdf#)8Gt3W0uDx7);nu-BVli=!nd^c>m6lwZp>@@x_?Vf*xtV!sBFSk_8~N?5 z-oGn}?_bFmkebRpb7mNGs7O4MpFh8Gl;t~#7!@U@2j8PoOxMP`Cd?la)?=LR*HSQ zcNRx z{KoI7#O$sL#aFeL6*;{_wW1%tN>q)${G$5m#J4_H0oF=RUmh)x=ZG`S>0XXa^=CiK@KIbaNbHh>x#7dU zJ-he08HBFAJXzVH;mGIM@_Al`|9*csXuB%q`wM~cZ;ea3^Lo2iS{gThV0a*Se5>IM zM+2e2xnHj4ANIJb|90J_6MBmK?gZ@#v^bi`aO2}qlSG?C8S{8vyWgxo*}V7lBU6dS zZfKw5uhT z9&EHXS{uT0PHt-a>8!&~Wc9Yz=E`d>oR@K>!E#3Ll5LGItFCaBRxB_0dNp;{b`$Lf zH@u!^&skkiwRzQr83(udnr`*|Ffq5jUG7Yn!5a_L+aX`Wr_{N2d+=2)s>%>Cd-ben zx=q=2y^}V(+df$fEuVdSO0!e>-m4R|o$HrBQ@wb?<`mP0a7WfjZI4t7N<^1A8qA(_ zwQ6UU%r~)9s#)8*GuJL@Jazh9N%Xw-thd4u-&iJ=7wnkxF?PDJuyc5i&z9nnsn4&r z<KtJkB1RbfIm|M&)q(i{W47 zLerK>|B;srIilB+dS+}#RgB!C-j0*Cf~5;)Zi_uVh4y-z+*KJV}U{C;ntWa|7UwCX>5_?c=hfrU3cY+8qz+uB?L=%y^c>_r+&G@z$o|5(uI#M`YlVH zz<994>SgYBMYlV>t8edPuzkmK?;`*ED+?_?2i#rHFDJ57xaazve^>wVSER`A`~H9B zu{m`I#pgL^_etz|q^|y7{jq2GcvL?14)BVqp*Y? zOA*awY^Y$M5X5C{JlUpPiZOPwV6O1wD5JU4|MM`is~LmT1#u}T=sV}Yi{vQeo~{wXfk=?TzydEQ^?TRM9<99T*1)TQqRIr!O+Bb z^2T~ikb=qLlclS8C-1$^Ir;n)_Q`welqWB#GMFq-&mjoa18S|Bn#1%knOIDoSSLPN zzgl0y(9%NBK*7++2yC{InFZKvV?&VHP<5i9umgpsjg5jnv^i>OH2GkpdVOSM@ttFW zb%x@Z#PcFZ) z=twN%UEA84TE_Y7Es8%Dd&?KT+PG)euRHONb$DjT&y9y}dWhK;^X@|<_ZP?g`LT;M zc)z|ZFaNP+`kjZTnSVcAwXf)A{rz=ye>lUrWB6~rJJlsEVINm3q50_Fx{~6X&tAR# zd-e7Hww~Q@>S{|+_dN6;f2aNJ@%(oompfuMmv0r5zPRCg^u?5@Rl8E{J^p@pKL5sF z`@Tt_Ef14GTOQmO{Zq}3OjZ58Z}rwSEWi6#Y!33i7^Qgs-u!yY3+@^9@qB+0zHF8| z?7BezThj4_PlqkF9?Pv@G0q}ulN$!miQfL<~$uP{HP*u=0;)L`s?v! zr}pT@9pGeG@Ojy;KdCM?T#SCAm))mw$8j|p9%tp~@tog&V8&x57PUwEP6l1#~2 zJMMnhb51x@#L0Bt@*@wE{^h4UOv%%{1wLG`=Z!mbLFm8Zl(jn!JXr3R)pC4gYQxj7rs8?HtY3XktX43+!Avx9IAeNV8_La z#ph2wn-hN_Wnl=*OT#(B^SlpsT1=8W(kZ_8inZ`G?t3#YOj~s?#^^`n!#VD!FNtq@ zVe(PUX8IoCYO!Y@8F!W{R^LD4(`8p>c)VlMF$1+%mH%E>KK#*Pxyw2T;!*=&XER z?dPGavFefQSG5ue@3V$swpNz)Ctme7n6a+YnkMS19JOmJd*b4<6IbGkHkw}kFh{F{ z>s9ouUwitG{B6!TI5{+WhvT%=>sdUP7p3xNu}|C)c`9_WY5i|$wa#TiGj>(;f0=hO zYnzaUSkm38K74jHLQ8K6nFeRS$aXKgRPDA}Ln^bC>+rVTTPBfLH^nM%6*KMJSIj2! z!{p3yyUN!*eCsq%%5=VHyR-e0Qv2P~0ES&PS7yGuo)_@m*V z?9Qnn@7ROYcQ$#=+A&4D{$kIT?Ot1F)#}e%a$_U^+!x3GeYkT#u}4b8=claOuLI`M zSCa}ecZaIp7JDf7XhWE6fzkTe^NZA*@-Iy|e{$Qd+UvJ}tvk0nbXlme5R?4ek_W0b zpCvcB`cK<5sYOd6>ekXcrnru7rzvZ0JbhO*>9gb}>ri{g1vmK%8O~}S*6iV`&p&;w zch!wuArVR!-*4k8|80F?Q<&7xjk>9No>%Q2FYD}^JXu0leMz5i%#{MC@A*q7p5vdH zw$^Q0x^LkJ;Y)!jqC)8gO>1{sZNHs&`>95NuJi+&IBuIOcU!i_+RwEVnY49M_sR!L zBeH|FPJWaz7q%+DVg5dFqRYP%8j15a1qs!E+BVm0>nRbHriVS;mr7LL2W%5t%enJ$ za9pAJyobl<{CL*;>Wli;e^&x}V@!IUxyxNPX1H}%y=g|w>?@7c9K0vAoDO(>QGAh@ zrLj$EdbVblv4y3F%(8<0iPl#|-kx3L=qRzUX`*AMRrbZBKOXG2d#*fh4NFv)?aNih zo&teW7t}NP{Ng*{IOEH`L%E)&^VIsX7tcQ<<81jwwdY@!r0tc9iL<3uikVh4*m|1W z$`t$gqA9RtGqe59DXzi0)_eb5uMFQ4eVdEaU0`nK7r84LKQHi*3un_Jo4*i{-mtE`M`+vSYpwMo4< z7VVOK(|onP>dZgASAXubujuP|%$0ZNyoFMaTUCIZZ1z6^hOR!}>1$5PUtlY`Yr6SB zhwz!(d9z%m-#$0x-MfPN7m`da&Fh+PW?FLB_;@$2ogcjNygH-54SVpLDO0^t({+{~ zTsdv)6`{zV+Pk=nnImuKp0r;ZSh4uR3&F0}OtJsNu3Z;dW_0?fLG0bVvpzb#>f@{Z z`m1lPRphH^DL$WS^XRVM^X3wTxux{)$b>DyDSk#8Q%}e(6 zN~Ibp-4=Sly=~Knki(aAmMO?NdtSVhQ|}v_?xt-olUZu;Oyu>o4{FXow`<-}dL&sl zQ7D^dQQFoGpC2b4*!W^a3h(?|TNle($$zmt^E{2WGN|a&47OXWA3dzAOS)aTxcJW5 zN#@-WKl7dOl4d7U)Yj^h<9xrZ>epOdCvxk`wWZ#r&% z<)tgQ#B*MYjg02CRqIYZ&q{o8-0uZ@=9|y^7S~N)IDgaoP1{q$o=;X6J;-x>=G7lr zzMCB8*tB`gZP{h%|L5uER!eE#r^;HVcK_Po*)x3t%T&&KW&cyn8Ez8H5x-TRmHbWV zU~f`BRdmkcMY-P608`(eJ`vk;@(&f=30(d6oN|VgV&8OdK)xe>el%1eX)0}$^NeSH|;;}p0p@W{^^~< z?wayduf&UuHXGhnom$^B`B!Hl$4a;0iCItFlDJHKcc`kF?$%`!G;2t-n>#Oe+fhs1 z%LOh!@3_7Ec)*iGuu$UchTBu8i!9k9G~ZfFZZ%IdyJYty|I{oIgU+rd&UHZ=1xdap z#b+ER(lW^#+cpYSyZS3+ta+zC+mg4* zaNdSrd3;;f)qk$4*(|9h9+&&=dVhWRNBx37A5FK{`~R-5(5?R0_QO0h?Wd~sE~E0f zPu}!ed>4za{eMhv>HPnUe*NtWL5=BRl!N0;ji60*BU4KQkTj^BX=)4=jOH={$p>+n zn1Gw(CZ-Sy(l|G<6bExn4Zu_^T)WBSK%-^groANCs34T4y(y?U8#KAQ)_O8%OxN7N zQqNSu++5GtM8Vw9VzT26b;wAqIHTF*g|}oThxb`cUS7vLdG1_gSrbD;Ju`C!Gb0N< zb7KnyQxh{iOJfByV{<(-LyO5Dt5g|HCr_L#&S*M$<8@JRW89)Yd2&|0fvkyvrJf-^ zolK^nM!DGJPxS_q9j>s68k&KvFf=#PGY9E2MYUpbbp!8Y*(;g|b*6eoDC(dFGMO2H zdoJ%L88Dd{PkxxGFJl2wYG?*BQo+R7OwYnZ!ORF^gX0`E$e1>hnF&;*%;aN>_$MVYcN^<603x%f~lnm*nP%^MtbJP3T6hzAj2j*&QY5zcwKz*hF$|%Lo-wG&^uhE zsh$x+<;N;js0$}s_JKoJ#@Gm~0%WwAAt-bW^h}UVhPZ3;#6D06v5J~n7=i3mFf=mO zvs5s(Gz9TLE`X|&?w6hXZW74xe3LiKRGd7!-$2&L#7NJ;P{Gv90PK2@-wiAjOwBBz zdTl4GPB4%)GPcw+MOI~@XNph-b-Ch1@yY8Z=*yazKxGX;W+<2%8R>x>4>uANoQe~D zL`^Kf^2UaydM2O=2}qiO1UJa60~2|`GZXvg*-rMHWH4EGKD(Hy5hN9un40NX8Y-9? zL*nRTmFi@H>k^YMPLiCwZh_Nexyc5yCT0*NMvzzq_4tfUP;^X~>?dky0(OLnk-46^ zp@OLqB-TLYO_(e>*12@kQ8Pec!!ucHP1NLv zGYn)wQDbNc&OMN#z*Nt`Lcs*o^@kJ%Ocv%~jaf5!CimV|mIVhkUJa%elON6&pL}U1 z)XPSYEM{bAp=S!x2#+j~(IAyEv(Qu;8R{9Js)U%y2q^;|t(RxAG@d*$M_w4GFA$8=V*}CoilpkOt*wGX)a^Xi6|K*E3Q8mx&NBGg^W( zKgV3q_=Vu)1Djbb@ z`j8R?GED{wV?#@0Ju^$lJQ>77CQFOSjZ4It3=F`Y0u@4*kXbcD3k6VKH?=@k&S(iL zotX^{3@0zVB{8{ur}*R<+f5h^z(YFH=0ae~{_m<$X- zc1@nTKy31Z8kWiJJ548lTwow;YzR?l0?ByBW(Io3C>kffS|~NSW+4wa;l0~sGMRai zfsCQKg`T;BF*J&eEiCm6EftK7A>j|U%@k}~?;?UkLcvDiwtCqEg`C* zk!NCI3M#;nG*9MSD#>JEIXUrSACsZM&T;x9@87zRMC<7`O zfhIEzEhdA!VrVqEaf!s_1-B$8@4G5J`RR30M#ISqEA(Z+S`xtA!-D!oj}E^*JcvK-GbYHgJlWT)5I))BsWdf$9cJO9dkXNB|<# z{8}kJS^s{+mAD+PWrQ(?>~Im(&qcg$BwJ>nCHm- zxn$h(Z*9)vl*)pd+Jcft!fq$OCRuOwsXX&tb7`Z}MD-m;^%gthCeMDaRvGvr($#OX zmwu_E-uqI)aL;*Dp9BZ3-S>ZP%=}!_k0*jpWpt@L+_LHm5;FhC3IFg;j<-(!AaFzc(}iq{pQpXU+Rh$+$hkaYR{!TcYpN!n zT;fvnc+!!V$$vuRCS@)4WLD1q((G3pF{6HJimZC(Bwf#02lT@VJ@dAnle%fNzI&$H zPo|Vj>Os@10+&xyytwP>_N97qyIkW%e$Kk{d}^C%%T^X$)*1Cv&Yt9{ix&O5#!Jp* zrl{xCGn0z$p0a=OsPj(h&*W9ly=Ct&yJfWQ!8`#6S+UNtJ3pUo^;$1#ZzXtaR{+D| zh)fOL8zn0z{^{J9_=3}!aiKxUCas1T&p8w4+jDE4*1Em# z%SF!%^AjExS8zudDzb*Psonf;yRE(C#f7^^*9bL<&-~+YY-VSi@7G6^^i7OqSuQPN)YWG13_qG%IE(wb#SD9aKIg*` zCl9aR$jx!C{pk61>Tfcv9{zc8*?-PN!JTajjD9|3H(Gn(|Kp@MrvKMpFIlyv?fyJJ zef9A0zmk1B#3hqh5B+-eLbRnR!-U78d$Uzr{f$F^oF7;}=FnHv)8Kr6WGU}`iyVHZ z*_H3yTbP=}4=XBu2zh<`Op{f=JojA3Gjk=j9CnrH-Q#g6+RbRo3rFsw3PNv{^|qDJjk%=aZyN>MjYc^dGDt3I{|qPCY1hQ1q_%S+cB%v*tF-f|Gqq zp6}Pn`=~D1x~@=XVY&V8DVOygySl%h*);!Pz0NVf9uh0mF%FE$7fW9?<0P@lJ=$JTG-zT;W$EYmzxzNBv>;fPJ0v0k@MCa!yQpVslWB>u1{Q2OMS7)*F3d)LJXL zt~OGj>Ws*w#!tEz;wM{w;5C|OpV6LN%*WU^^I`LWMJ#9e!sp3|{hx7mp_++_k>1Ze z>sz&|CO+#|X^i^FQN41>AMKnCJLWFgcUmfDqrt05#~=CaR`_*hi&=iuthw@U>X|pb zF4U^hP+T2qZ0vgN%1ME13iEVJq>q2@@%ik^x|`kiUfOAu%exGMfBxKk`Q(?k&)@T( z%n#5zAJ(4oYeq=@E2XU!H5@1Jx&*7`vPEzmtggvs z;^(@)J(0(b>U0*q6P|ZJwSfE88Rh&(Iv49Tf39q_&UP^HE#22?`f$t3>W6lZCVKDg zT(iOJv{hVI(6#U1D+4FG#?6SWoqg=x_RKZ*%vY|&ZZMkCy?%p>L2&tAwY<~uK0A&b z>`DB6^XS~Ntv|hsRC7+Acoec|K4bjZ@Cjvm6kZ+DIhH&>q3KZE&e!}22c&H;zmD$6 zjWKz;;7C2^d7qbQ$J<4>%sG1Q;dkNNXJd0t2kjFt-FUxgXH0Xd{qfr>sUJH7s!q*d zH%`8ou)4Q>>GF?G&K}He=eH&n2d`b2!+JU|iB;v}L&jX|Vvpj71_JA2PQ-qSxRWXV zj%l9yirFWc4@?f+et#oR=1azd*D56vrtt+UJBgl|+qc^0aD8F%bQzAXYIPpZo;+u( z;&?Z0{o_e7OTYe_P;;X3lIYBelvR%-s)mNPkr6JGO<+kK_O?I~+@$Kg}fTl!B2Zrb1?eD!?v@|#L0 zCwVRRf5Oa?XIsB6MX%vO{frv{bKGO4S+zHZ=6(q+TrID0-9pSBlr=M_Z`HCqdrE8N zt5xwo3YP9!VfiIt+r&bvg$vc$o~nz>_brGB>;NCFV zMDI7}#+e4U-mYPLyTP z^Jt*N&0|MXS0+rTVrQJ~=Xc|cN$PxW0U;Lm-f7eLW|Rp%ece~KW9sLoGLG-LTb#4* zY;k@hyD_I-dA5UADvs~t6&xH*tDr+`kxine>d?otqo#q zIpoN2r7mT|tI5{Ky(FwW77IN6c14CWYPWFC=2;viV(0f=*(Edgd1(@t=!FMKLe1Ah zV#@`z5BoG_%81E}d-D8tnQ!F59si0&=8Z-Buel<(-c$tq&GPHm-FN@Njcp5_I+vRB z9I5AiKWX<8+t;oK^%{8CiXU^|H|t4dS5*|mVK>97 zrT)|>^*@oIB5X&##F+Cqw6{ZC-w{Fvh8|{@Rty#eNCF>lT(Z?HA7Zwqg&< zn|n=(3zmkS1gGKYFXt_-v{6rYu(_=Ft6e@)=-%gx^HUwX+d^(Hw&%I=Ca*BfM0Wf1 zO&|6;{9;adog~|1g}FoaA;}rYkYsz*}7RQ?{{2*rPKG;z6~A|DKKJ zYSUX^PM%e7d~lg?$<*noMYFShJQF;%p!mndFJAq{xmpJexO7>n@Ad7^n>4|?`mbZ5 z^vBc}QtZO_%Wr*+v!C?ep*H{kCzU8U!uHuM> z#%bR~%TFd3E{~PpyOO>1Uu{fCHt+8lHIDb5X6Meje%{<6$Fi?<=8dF=rQN=^^%4bw z&Q7^En;%b|k|WJ;xa~31Ga0?xr?wR)-7Gnk_Sq#BEkXeF4*aB)@K6#kE*abdKu= zMX@VI5$m^2|6;J~G3%oR{h!{nHBXa$!N+d+ZnkAdsHJ7cQUCk#+*VDE_tWZ^Dkg93 zQgqA7Km1H`@D4b~ z+>FYZ5pHKZbK**YZ}zdzS7aZOo#YvlQZ+N9XyIiMwYSOB96m-odXV)lUE`|h-idCv z`y#eTGp+u!Bko$NYlOuXO}-`KGoRK^4@}v(KeomvXJH&yUWM+RJ?{?hn|rO+H!tk_ z(zDft<}2AXVqa|X(-!Xj{O*a&)c3nxqzo>X#p#v(yn8%ylTvv{a_00v>7rp4#u0cd#k`kf z#F}cK*}Z12dFgpiRPu(Nvqe#N9NRs+Pw`!GFLyN5Z*ON^mF`<($#Q*W<+S8njz7y* zH6GkBE&RR3tm^mYO%bSe1F=)^n)CDs(wy*@rgV=_~hR*PzcT>nb0mNKG1Bk(fhER2e5Hk%8A%+@q8A6OTG&Gx> zb>5uObn>k8vOMtV14CmY`22y4A#~x80@B(bLvZ&sh->oq_43md_U7r+QJevv}9y%re|Vmu3%(js%L4WU}OOr z7oP06SbcI}mc(T7jeK0twKj&vW}u$&V3PI-fi`aQSf^t^MGkvU`F_zXw|69 z#nW%^Hv9R0?!qOp`(CWryQu6@^ZT-`{b_B7A0BRB@@+b|o5mlTyCGkmtP7x1&D#pmYTXb1|M??LG@5NmmL5r?lFZpF1v*>cSZe?*`Y`~|lM{j>G zFl~RWXc@y(|7@9b{hl8OIa>ZLObTB7c*1u3s1k|!C7pf?vy<(=rL_NFP+qB{A5>KR z@%rrU)$1)jGV6Q(G4VZl_F0I&=J!P^OGWGy>^}cdSvJK@aOcg5+vmq!_f@_oTNzpU zD9q%^?!6hC)~#6mZS(gh&*as$1;1a?@Vl&{qWC#NplS9LUblPoB6p|NM28&J(?0on z->a^<3irFUw0Ar8w5{8hG~=oRx9&nYe#Lbf4+E~uJFjdY)fX0jUHf9mlhSR%{L@`( z-Rstv-&M?J`8j)saO&RsovVWH1f1>k57zIvSa8Nus@ky1r^2G*W39m^G3yO{9%8;} z3bU_tS9)k(UgP-g?-6cgzWQ%JX1F{{{5Q+${q-5UPP$~cF@0~lAQ{Lad*JcId$V&d zPTCY<8u{7bK`Ntc;8P{_NN=M_=3oC+22ON)bDC#SOW7pfyA#&voLr@UiqBr>*uK|t z-W(2KwhH9lK=-UU+2a`t@wd!b>Ymw*`OjROuh#TX4?ownfI~8#!I2jdK~~zMKAtn#$x9 z@wa7Tsp-pYOj7!nnf5Z-?pXD{rF@kpo3iD?`ZC|2j!#_Y9P;Q`KB;NZuYD^I{yP`w zU&mu2kZpd@FJ$Q_GzZZmi1 z*H4A>4WeYtzlmOx+H(J?%1blH#%=Kh-Q79<*HZ6tdEAVMu`OUu z*{~w-q*->6%E6gZ{>+EZmhNqS$k?2=t5almt>(`quDjPt+^l!rbZ*&>c7|1Pla#)k zT=gQVf6vV>uVV%xEOiskip|~;?;N}E?x8uZ8V^m3k}m&^S*6Fv`XMH?JV3EaUtz!S z(GyI!uB1lF8)!bVJKQF?W8?9_8;-Nu~Mh<35x}ZA@eW$1ibDG@Ohm1 zi0kRWNv3xMPwzgjQ(;w7&l8jJ_;e23>*uPg^pNtD+Pw>tN zHkz`tJTmghBX;@e@<4md+~uo>Ttz@^Ihi;@fYsw zI#>2k%ZfX9+KRA}?rm2WZ9Z_G$Dm_Uu(|#$Hl`AjOFEWo=jeW!-lx~qn6dHR4Et$E z^7&+C>MvY)ypezPWfh4F`nw$$uM3QANO=GK>w-8oSsT6nvK=|A{IetkBF#hY1x|Tp zdPTHr!p09zy0U{#eW;A@{B65OZ0AxnrVGETBHU-TOznEu)94|4nPcVo)w8BVvKrn! zUv^BgezmReX>r$GW&JB@q0MZo-!Axbg@dcKKCtnZ26OiXiHwYHMX}Jh zJEE2Ptl~>vK3`?WBYB8LHhjip59wnqwjo!yrFN~cIiPi*PcOl(br`&yX@?cq$eg@l|!PTZkUdB^H+D;t%`0R79IThBZq|1^(nQ zRq8lBF_VN80w^urzyR6GP^7O>jm$%&NcbhEgEz3Oe z)MLuaUvtt{O@6hhFjVDSu)TY%}2g?hK-BS@e#uWZ0%)qX+bmGm0XZYt|3Ayv2 z(kZy|NtPDJ+WOkxkLF+7z&9@_MaPd_isOdNpPiikOzzw|k2On84cRHt$ zG~Y-)|Hh9KSHq;w-w>8sy(xcEm12;o#@6B+*PH(TTHRcm`&jSW)(d&xV%xIcWFI_h zSAX?HxnWUnjqaEEu}^kqL@UR0=U&t--g-$(bZV`*^2HO^oo<($ify!JJz12W^(OnE zt{F&&*xVZN-@)qlQ(sH{oOdx~YOU^$l*`lCpQ&EtvT(`M2_~PmJ`kIo^<;NWtm^%v z6PHhZU&Q(P&F-G-H^0l&Jjq%!yH>pT@#BZ@AFr)1^>{iVsGoT=v$O2dP1(CI9gDB^ z+jnx+9+Af@e?AZA%fF!2_UG75%iw0-|7R0#r$5U&nt8kF{JY(&c*j(Q!G?Z zUO!{g-aG2`lczqPnE#5|?nt3$SD(zQeP=!vY!|K!{J!?iPW{cHcTbdm@)S>AZKnOy z(99z8`c8$z&k~|k=tu|Jbso+5fr8 z<7PQaxfA9}r;Tg)Senll{fIxwT-&iK|60?PXI7#~%(Jc}->$ztcf~Fx?f$bF{kU)@mr$fwEPLX+S8U10YoApA zeA2U*Q+nA%!T8;4`L9mcJo9nc-vFB?O^c_RUl$i14&G_-X0xl~BgU`3)^naki{|B2 zXw84vrtV*`=j_`uH-9?RZg$9Bb@%UI z>Pz=;IV$n=pXy}QsMc%_yrLCTjsEU!1?vHhEg)hykgW*AF+ycp^J&aCd^iP~eW*$t5y z*C+nolv~;mnE+yBmKI-j+ue6(dTzG!b*K7wQoFjheO;J+aP7fGys_N>o(878;6Ksc z`Iz(P$6Z#bP2zcRiyuG!ceusV{#-f#v3h-}KXnIX_FE-r{%)zPI6L{in#bjjoIK0E z9uP68YkgFHPV?U%@hr8T-=HoHdY1>(KLB-ej4Vvydjt%@EB!&D(Oibcke&omR{+$N z07=@|fYuNNO^!F30bW=n4bc|_5`}LXFf;~tEGF}8Rsi=4bTIk_MyBR^hS>TACI*uq zW*SI?XOay~jr5EREfhdY9Zbv>49yHdT+mD^qcLczR@?;Cp@Fyxz98Sw1iB(Ww*R)7 zSnd3H#~-S@U${(Mqc0tiGl9j|n)OoNEXGe0c)6k$xxYEF$jfVSMg8A--d>wjvwLc9 znN99Y*ZBD9!@c73dsF`H;GEIFe)^Y*dDnHU@BF#g&#KcGF~g_5Ddq6BiQD@O-=zIK z%+B_r`CskJ%hF40fB#9Z|54)n?}PI}yZZYf=61gyK06)W^Gu>Yvi$KGUSa#YHFFq0 z{tvoQ^R3|Xw|~#B{+_{VxBLG580nn73VpTr{kP>jZhfu$H*)iD=HH*TmwRPTG<~x! z>qzs3H`Ajs?s-}C*ZU6an=t?E6yW9{FWEBQA~VvpMte|yzL_JjXa zwc^ZzBeV)H*supQi2GPi2lWclT5eBM3~ZT~G^_wRd^?D@Hs zKd0To0a>OpH!jsVHMuV?Yl(S8PlHkNFTd-%8FtC$$4)dzt%oB z`=Y8qzX3vY78 zFJ0lSv3?!+5!k16C+s$vD-j_Sy+i^cnQUfsKB-NQ{<+x7Y4Le<|sh?+BdPs`M0#t{)E z5l5opADk$AoEx;m!Zj}b;fbT!C$zd^G(R7#WPPzgc#)KB`ROI4&S!fM`c>5{rSH*c zjdKuEux*lfcyGz<>;S#{){kGSJQHbpA9uA9(NG zZ?tLSurn%p7VosxGkwK`n^BIvYl3sXg+A(>uFJF?`3ohgvLuzN)yoXK6mLeDGlE%MHGn+KeIR zJ%j|Dl=c+{F&k%`wh2{W59E36I7Meo>3y>mntM#l`0C|Dl;_Ves=GgX?#%8BA6r6p zA9~wln%1(o{qvjz4~X9@FA87 zi|fvoUtmA{{ZLrlB<*Wb;U|jLX02Kkbw&03nj@QRyG}&pz3sWqE$zI^<)Gv$^QVq8 z*={B3PIRAm+SoezT)o%Z4+}myTrNFZn%s6o(yEh7MylxUr&an5?NL^VQ4FmqGaD8e z^~84Nn?7>cvTwD_YU4bHbb~Z&sfAlF9b3C-)0(T(6m9;0?*s~?8W zy3oUNN{A)X{;}~aW}Tm5feQCma#>xDSgEv4r$E7F`6l0U*Y_0fb@|GqGl^e!f%XfJ zg;t+r*G#zfW~)_%{lD{)0*eyXXm+|e9gi!i%{OTdO7PiTm%ruRgho;O2{zG6Rr9tt zeY?4gE2UVca8}r<s=dlce+jXjVZs%S8x63>kY>n z-^<;X>F_A?3k6s0u=ri^hS|O;TPEN9gw!=nUe;;+tT!v70_LB%f5zcvX_)Q&Fpu-g z&g)LEQu+7zP{3WE1>s+FIMw7X%xsL3S$(qA*7$;-O}L0u!6nchF=8y<4iD{c8D{p48Z%M6EgpW4%w%ziRuv;Bfw zq0>18oNnJxJd?4db=u6xn{v|p-&PVN77 zGdC$!UYEf+%C|9)Q?UAU=RO(#&AaR$ICA(g@E(y6jrg}b|3kY&&doA0_AhIqvnnpX zJ#=YG`2P)l|DJzd=u=Si{o>bk*AF&vuKo};Wsa0{_`(ef{T%u~Mt0^MWL;4mteiJ5 zwDWn{B(^w#A0^pB^*Ry-(hK80ZkL&7`Qg(~Ue-*Gnd;szCuyq9I`cK}+nI|>X9dGv z?65S|RIUsSomX_Chdpw)eE;7LH< zc+_CSw5;*XnlH-BPbQW~I&HGH+%S6|!=5yI<`J zCSN|;m!a9e+>U?gU~rI4uv^Y&lU<+lnjXtUAP=)d|V?&HmnTfl=RUu7Zxwud3d**+*`( zO*XUHd(O${#)AD(?YHZW#UA!rDp$QxLB999lwOMI(eDn9FRpN3pSSDy^Q(*b%MO;_ ztG`&e-NjI&dg0V(drTId)7dfeor&6ptfkU@0UM_~Fa9~JR?Y9DY-#>FY02r2t+WfS zxjA0yW^ZnJr+KblJ3oNyB3r@j4>n<|HtX)Zs`RSi&dGmei+pwpiT!;rLHMYqd}-y9 z6iLC8o%>aOW-sLRzwpkl;O`16t8@3QWUjQxx;pFByLBGgamPFSipAwmj+tH^ee!!x z@_u>QW_~Yb=cBjB{TKh}+f!io?ECkt|Jz@`eChjhKG(CKyYr{~J@DOZ^6tk6>c8!0 z_?I&M()D`A<<%+gv9uz=E7C!YFC$|!bC5iUZD;}-Th33)66cEMGBkkwZUPdR-=1bvkPNmbwtH0i?{rtO$mVY)R+us#2uUGqh{OtMt zk20H{>sj9^dB%3MefD)OfzSG_XH#y^&JQ=&-&Zbaelx3>PnVzf-L7SsRf^m^x4B;0 zcdsq__IdgD)X>fyiR-)Ea$Jx8+bkY>Wl3t_=J}V>zTaG*^Y#2@Rc(Vq6LeVlHv1gC zvj4Ku*~LA3GrQH!vi=Sf3B0ys(Yu~K^)bFo8OmGh*D~yz_G4GaL&a6+x7Rpdd-6In z^w+0{nh*9#6-++##)^ZtB{e5T*RO!b4EfM=x&(yjV6O#GI%=`0}mHJH&5;H7Pnxm(sHRqn{vR%Enx8m5W$8lHU zH@~;4FKHFv^q#$5-?2G=Tc*WA&tp~DDbG(|4HsWnu}_epBXjn;b!V<6iQ9J0N`1LF zL9m+b|FuO`$Lg|Qx4D{nce5=N-g+?3G^d@t^2@(zPcsWoy9jU2?^5nQ?XuypUT^uD zwTY|v1z$TInKj9@sYmlFf4mHLfko4iw|soAkCWo&T&VxB)^5qHXRj9hUzc65M487a zIz0L7x}41|vZr2cOk@A@;_0RhvWJ)4u++QG8+)4RyX7T@-1}ckavy(MwQu`^^4!pF z>$c;Xzwhy+O}pk%88r3x?kx#ZZ=?t66gBn)H^!}T6qzUa(VRAoRwtkYv>4?q3YitZ(uKb+daj1E>-L1a%cLzisDg{qy@^*dt#bRIQ z<4s23E!Jbs8=s&`d(b~q_Ft6Qop)>X8=!q?b=FTpzm;~GC@omD>J*o(kI9Tn_ZK%N9(&!^C|DqEW4PfBS9ad*5Vqv|VZS%I zNtp?q+E8(8tGVSAvBLd7T}5wci1TVZXnE8ZI7MaUf!vLrnjMGZdB6EyTfo14x8UA4xSn)(nI7Bg88*q&ea^M56IRa?{^5MHL$Cg{kZ03J=deQwoAOrp@&79Ecu=$T zOMO^t4s#99A?`PlFT?HEvWna{=6tv3*Q396r{2`>mNImMvkz2G7cb=ap(@nFmy%_Uv=%6ZRHR*8IV5!C*;&iCZg=jV4CAKoN( z+-uuqUqSU*x~ogP&mP&(d!^R0ckQWTs*`0x`y~rykM`#TPqp0r|KsuBLWgJU5>l(L zmXQ8px?k7Z;N$+P*Xz4>#Jcxh+rh`Dx{zBrOLnKQqus#^^gyxydu_~^}zP3xj}{twA5RQGqOu2izxG-rj1zF^54 zj?A0aZWg9RZ+#Qs_=W4_s?%>)zRqxboF!;Fh3A(32kCPhnaLZbrcChj(o^1)5gVq$ zwXf&hx6qwy7s*&fH`m_&)>~iK@#@j!w$7$+rnBayE9{JE+#*)Ua(>ZYxsq5D=6r_W z#=9>WKC!mdt+z_N!c-K{zGBCj@0n^=D;IWdyq$BDN8^jq_PguWS~=Og=P6gPyb#yy zdd`vIHE%1||CQ<*+b{j82=DZ>(Bga|R@tZe`g;G%d3z>&cr>>|J~4r9=6kIZ^{4XU zYbFMpzJ8KYqN`lFZJ}?42UnEHj@?%RmN+DdJh^|Wbory65Q7I_>*qU){NPf`Ofr2H z^Fcnhv|(hHvNcm9IB2yES^Ls-NaGmbs)en^CNd zYs1zTVQj14ub%Q^$$Fif$;-W*Js19XEW5P6udnWIkLvky5jK&kOUFz^+)m^tlgVf8J=I&=GIwv@adPfuSB5vb8_hB!9vIwu&$i38_*66h z*>BDg?{5f7o68>5-qAP&xHe77bZ+Tb0$VU*DSKj{q>{|Cwd#2Oq-AK zi<#2R>epcv*HvQ@_JDDz4)yVf8oUZLDy8HOCI{}XQ7d$_4G&L*d zwuT%!^78h(X}uW zMv2?zcLWx%JY4i_*0&#yYVs9+2?;06cJ{Jg2&kX0ae_NenWc2o+N66Qbwuig+;Vp@ zY&tkK$9U)2r5kSCQ>fjQR%X+Faj(I&mH@Zum!Gdrk=Xp_bFI<)yve-f7mQ=xzGk{! zvZeG#!A{#<_qJ`Y{t}S+^Wu8>=A@idww~m^!8)qSP7zCl*N*2{4&>29cm2cg<0gyY5?bOX-|f-(H57t5ugX`@G+7&^arp{C9;(=ELd zHVN#KkMo&zE-A+J<3T1+{@Sk#^!@doTea%$miqT|jTd;XPtOb1@tH8) z)b4+b=2%u*;U9EVcrVR+`|43uXH*@-Yexx|XFN(| zxm^ z(^l7b)0eL4=?8QwR(l?s57w*k)_?t5 z`)KXs)w_>~=9{v<)3sdCx%yq-@vV|3-1o8$efU=MWOn&=UJ;=^kJf7CM|+=pbxr)i z>O;1_R_j$f+|qh=?zydQ9U%|(r|GaSyQg>8e9>L=J)e3fygOzu_%%8B-PL^7`d`&T zrN#5t2o){$ke+ziVXwjI7gpYzd-V2NoIb-~b*VRg9h21gqt^us)nl5L%yZiDx@Vi7 zZ;bD!lB^wkX+~xlk4}8{s(ahMwqf7OoL%7=lU8)5ToS+Za%RlSL)nL?tlMbf`|?sz z)Ae&Y7Pa#-p8Vo^d^2SFwPPzj=KNwjrdxlq{`OAKtVy-8uF@rHKd(I1KNIx0@GZ00 z%rn`aD+5e(%1`z#Z9Mh(n!Djd#JUZ=B;VWbk0=^;!R)Ot`fF zKOXaZTRWM~4KItb!I zbOKG0mlc6^qIUuz>zgKT+zDA$#AIwS{eldm`egTAqTu-iE$}HvK}hS2Of1dy%&{yp zGM&7zLU?+E0;BNs0$E0l$%?y0A-n@1-m2XY^QI@rF$zpSpvovV*<=qwNMrJzJ$%!1 z6&a35@ynQcJd7wO_29u%LWXBq)bqnReI*cJYKFKp` zFdLegfO(3Lele2sO)V|;ObyN8%cLeZTo9SOx`GqrRuL_5FB(ZTXoH)HnF(AqJQ~a< zE7l2vLr5F4Q5;E=sim2op}8qGO%vxr+{|b?-CU7TV{-W=NFd3Xf~SFy3<2#>Gch-W z7&7_mB}gw_2BVj5W&v9K1zz+ux%M(d6=q-F%-B*7>m-o*^n;9yYVwAd<{FqHbWHBL z0x=nLddbw>5TOov*_k;cK6EjSHZ?ZKp#>6Y3RtulAdf{%=DP+P9bI1@u;i|r7r>ddD*sxYd{V;F2~jvUgH-(QEg6w?Ku9jb6= zPcFLwaRC-}#>f%z54So4q==Z@dJ~s4l`m6O_A(Hj#vwvv1Dk3TQ5Wh&@9Di~ToCN$sPk(&Nn zoiQ*Pp*El>wM@a#0#fL~wL(fT1%0>7qT&(-L+GMT1%01HFc&m$8N>xzN?Dp$qM&QW z1-1loM#JRacfpp3OuwqZXlQ_N2Ecx)@>@1akw_Ac!*{egFr=WUU8KKlEua zCfZ}@huI9(4-Q=09km;AIDT`^q(vl?m=EMP%i0@pi}8}C6~@=2Rf6Dc&I zL4s^GB+`(qwy*?QEjc|!hp_=O%E9Jy!J^y}>~StcltVlMk8+r5=X`LK8$-McSw=kh z;6tz@d8eo8GEPx4w1Bt-ZZwSR2$};2tu3B>{t;AzvmRrNJwgN2S1`Mwp#rlTq#qJ> zNS?H`fOzt|9%BNM)lid=tp>;1WGk3k7w9wE*kNP@mkgU zJz``4vkBNw$9rKVdLF@~Uf#0a`N8ycBL&_&u1hkzqya^X{`L!KBh zx)`7ZgpmQV&5+PVw%K$#uPLMX^nPPT)5+b>xTlMmGU|bNY}1)d7~ri`4^eN7oPnG6j;8XTtYFlE%6tostGR^E)!gvroo z`b0NIndyaQj1ppo=HO;YtOAl_42?kwM5k{tV^k6|GzW(ussa;;0!DL2B~C+gaGb;{ zOz!<6F+Ilu1x`bAu#aOECg1%cF@3HpBj@z#=8Otrh8ExigleGq^h66rk?9Z3 z8I{Eh&9Nx304Wfiu5ZC8BL-^!7$^jxnqUc1V9sr54o(#yxv38sMW%CEG73#UX#w^K zIKDwLu$GpQk>PYkOGaBUL&$=DR5>G%oappSOGbH4LvwJH#VSmn$iyf){jVh>=k(2% zj2dEw7MS5@WHSAuC8L#?p#^5p8JSLZv|_XpF|>e&8dA7VpWwhFQa+)YVF@wA&yG=Q`fMA<6fr}{E(jD=#s)~L0&T&nFdc4e2v;RLoy(3fQOpps zl>*f)qv?%yjKyMxkO~r2&UkvE6Qln0EPFAv=iIbw#8jT)$`OdzV_9T)|s`#Ur8 zPd{MC$TK|-#IF41RGhG-3rauMwZKew& z|MUhIMomsbGicJCE+-E&Ue1+~d-@v}Mq5rpGnl9Ip|V`lLtGg(I1M2O!Nw{~KLD3l z4wir%JQb@jT|fb19@q3=UR-nl_(e)g0ruJ5oBA6f{`KEc?w2`U{5H3mVy~51SuF9f|IO*kr6ltDHs`nbBltJ z5!5^*sChMt)I1}IdG$s{;FwY{g6v~aFaqxd3Q{nF>~&Evg0`cLAf8h& zf-H+uFoG;^Q!p}y8VFuG2hs;M4-$L|M$mqq5oA_V!3aEM8l+$Zo+J$tQ80q`(u^R% zs$gVdHvNh_qalwmm%evqO0hz;p|QnuK@UbVs7Z!U4Tj+3!h#eai4)#6K}qu_7So$O z7$d}uOu)g#rJ$hiUs{rrnU`9uU}#}J{gVfyIR-l!wW12I`0GQNife4bovLVJp$$#D;Pm{8iDkgDi|3WPM`0|n80jgVmY13 zi!n15Qni7`2|(vvK-NX6s4wd87LT; z8cx69#kiv06cl#`1_lNSc?w)0+Q7iv6clP8HeAfi(gKud(8NqZRW6E{fw?&-e z%`x;ESek?4*1(`1*43quzJ3s5#f5i>Hf0ObU9F;F5z6*D%d2aWom3YuAf z@-ey?Xe0+!%-jGY>Ws_{KwIC?)Pb`px)`YGYyb*>xQ~s@O)!08ZVIYP&@`KYI!I_@ z7NEicMaZmIwhLnK0D0~1hs2MNL*Xl!7LMV&dQR76vU z8G^sFs+S zm>HqlVP*#EZh_U+!%974Gtf~~ATgvwXl8*?E*P5|fU0AVLPV69gSVEViGgc1G%;gP zjfpH)Z(wY00%}?!3mO=kn}O;XG%<6G0?F9i!o&>ScjlI$_CKm#3qy=j)Y!tv)ItH2 z|B#ANV+&)<#ARU$+7OFopc$yPL=!UywYJd2EMX}f5n7f8pjsNDt{z(H7+Zq-6%awV zm@#HhTN;CULul$uLG>w`m>Cv}%|Q(g6m|8+mgbmw+tL!$fFvKX9 zO$>}cTbMx#;XXDoFa~vh(8NqZ#XLCtkrZO)Z4(1?i~_{Ozyj0;L^BXQZyOkxfQH4; z(uav5xZw@eTMw!8O$^~B62dWtCZKj0R3S{ADMndgVrXV*fnkXSrlSolF`~(Y$;e>( z!C*$=dT^5m)h;7rl&TseX<}pwYRrO|2zMHpVPty~BXiJJa5Qz67-`nT*Z?$`XS3UZf%>OtV#c7c5;QTBdbB#tz`)eR6g2#crqCRt zy<}=)foY%xX3b)10q%LAnrC4IZ3fjNN(562Q;c{rwJ^n~zDzC5Ks`=01I*65!Dh)a0d@f%-FyZEwP$f8be!+NFKH{ zF|RkkP-qI8u0%7?45LkKYH5y9jG0eIVLUW(Ec*DHG%ZGXq16 zglT4Agwb^|GcdwvYnd4sV?>jgfeBhMQV%LVOwnt012Y3NjHaoXff+`*WM*KFQDc}H zSbzpWK<I*CeZ$p_G8Dqq!nV}g*6UEHX+|mRs&6pWlVwB=$Muwn1E!YxR;cRAX z1RD857OOWfGcp4m0D>%NU}kK9X^D{~rUQ*lFq$`@hNL;V1C7nmEjBPSwlp$FZ$p`x z7+~}Q%uFzgU^5eAOy8N9V1|N;DMpjW%)|_lW?*e7GZS-+%EZjX0;5bfGc~|WAEpMN z0a(-!GzE|Lp^1S9c~Hda%}k9!Lmw!DW~Rm%Ed?`EEWR@}#pqL;nVO-Na0UhjW~OEs zg^!u3IVfa6(H z%p9ZCGc&Wq=$M&d>A0JjgU8WOL)F{_vz)0n$5POkn}Y`V(KK6PCO8W$Wrc+iMvuhI z!UUs1XJ!EzC<28)qLi}0Qo>naj**z5*J7YJwy?wueoF&T9HV-~5~YuB1d=o`voyn~ zbj%G5FdFja28NcV(@&=`$}$_7SWJJN!YG|>;^^e)=xk=-VrgP-YGmr_>S*a?W^Qa` z=H_VW=IUy0r(i=+Ni1k=FF3O*6*RU6nrbdCNh~S>54V{c7#SOLsj9mAyKw;k0+t9& delta 57159 zcmbPpmgVCq)(Hc zkxKrZ_1XP*wtf8lk4x!q0K4U7rIpL2Su&c{3NLQ)Eo!wt;<)f~QTfyt8!sMy?S1k8 zJ;_N`6EEGf?47)21^c>ciB;M@zo1*F&E~kY~H68f8$3W3g)aGFQoIBH=yjGXL z?yJ1HZ_f&=$|<}*Uq_l{PQM=N9rx_+%fI<2-p*e(x58&KOL!AD33z-81Qac=e=m72R961f5^3?OGVx6e{sr z^9^srt$+3FvM=$--;-vohwSNw>FPP}p^yT+Dy@$Ee#1=diS&{kK zDNOdyq^qJC>zj372U#6)mFak_@a*7~X+Hca+Z1?~ZeH_lcGx1>CmHdo4^FIB-g$cU zmYwsB7iC6F-Fk~F$HY5P{lQnIZYI&-RK41b`4`PMC-kz&J*nq42>)`6PjQaq9`h$l z|KtWPV7YL@^snt4i%|D(m9xL*c562r&;PycvWevWh0T?mB?)qi^`q*J&sd<-IZ5Rk zldsfbnHvTzF&`t;lxDFgdH&Iuu`_4leN&Aifg2WV+I*(S;)+A#+DTd`YELIdhy>g* zX)G>eJ!(2Vk#n)&vDpXW>!YhS_ZoAq*OiG$6*d&-^ewRc{x|f{I*vU!yS8)53oqmOjJIvSWlnD5e`Qd~&huQ$Z3%D9w4#EKXHx3@Om|&= zEtN9SDWO5(UcjgCVzHZM-@MY>cdK0Bc&w1~GY;qZveS3zfAe6fI1^{)5O~W@{<5Zx zlcY-~zp+uG(Zrj~wJyc;0|k%2Ixwd`o+0Yy$v3jgG!q?K8SK07_#6!m%TKr;*|p&F zB-MFak7)F;ISE!v@a^Br%e&duOyi+leR$9x%itxF=f29kjNSMzV9}9BElh=;LPf#s zf7tpaF1mlajIU0j-EhZ#`Sm(VVkH6reHs!jwc@{=xuy7i2z>8TG%jEG{?)FxYeWl6 za*rBwTM1qX<|(dc-Q~;wNj^0Gl-l_|9taahAqoOAa&%*nOyr~XyVVZB$jtM#1Bi+aP`k-Q9gdvcvVGdys*eQOpw zgZQrm=XPUP%M0u0MLZBZ%p{b3@I_%#%#Cx+MLv(RZ|^QjIkW%R8r>61BkeRik2PmM z*|Rh42;Y}pW?4VRcY<3Sb{R$fPFC69v4Fq3?xkPy z;vXLz+$;X^K;yp$Q5F>i`6rgRHy1YKPCZtWrq8!U_O3Ylt>zY;rb*0y-$;sR_|_`! z;yb*`#=gh2Pj9Bjw6M^-FRNHYt*%U6ZKiDT^<#mMPE5?gnTJw+a_X5&qo=Gm{oj4b zd7k3n6`o)I$L}kZOne-ztE_Oqs5Y1TBg_7O5?XDsW*mYqj2683ajW$E?ny1_3-7Pc zyf;C@d)*mK4BbvQ#} zhk#eKuUw7m;=g6bEmHS&G)By?uh}Qe*lV*@=g2(IC9|dNG{y5-WF&tm`83RzHF##z zk-4VfU}v{%JF|1H$fu{>x;aPRZMhuui+@L#lfC4QuJkR{zu4G1HOp-dd^`9aKjbBb65)^PH(COizzZqdKjw|=qF#GM^!o3v#WvvtqBsNX8G z?PJ=;8}wy->FXU&v!R=)i?2iH~X(0S>7;l z)v+1u>3m^@T#;ukcqE-VX72EDPMu2ilMOfSJUJfS+Wycx_NBz?hR+!;j7m}~89#oy zDeX4dvqIxX3)?N1nN-z>K~e8#rt)s|&^ACr1k%-(pmOsIX9(zn2tds0@VZ@>Qe z`6w@|HI4CR{i65HB}{5zWeZ(OZ>K$(b7`7Ps;cyxH8Gk`Tf}dQct#3FK1q#R8TNDG zO7BZ2&F}V3A*^zoN_SL7B z`V6W~3Bmh3&pUkn%dyPbYwgMd8&)s5^=O$vac9WiZ;}&(FK5YU8$8MOq4D;XS1e%nb~$5rJxPWCw2z3Q#Q3iBPSy%)SXdY+Sob>%^h zB?mPg1cH1p6eua$Y*`=q8H_OT#y%PLfBjnM$FlTMMy}|Xx ztU^2~CM?O_p?mXI70dR`OPX>m&wNI$BeTt7rHyXqm5&J?SfgRU+<1z+y^zK6Wct_E zJugn2-t{w2+Pbf~Q}a{b$EOp8IV)K|=1Fx2+E(+d|NYiMo^{oep2ZrG2YbU;%O6@N zpL@JQBd0xY-|o8V1ja?*rxr2; z2VSmOwj=y(jcM=Z%(Fa2?)fwRM%@1Ss)U*Q>V`$T{i1)_@O)3(!XSCsME2LC1~Gd+ z37>gJ9uCZp3Y;~Ap9e|198~7sIIpH6|NfQd%PYUi?Kr=)VRF>$2aJ5iN6gM;&J0{S zdC&X_30utSR~M+U2Ty)=V^*M0i`EmtGe2Hh6inT=qHMc4$CJ(@O8k8D&UQ+8yqnU< z`tj5u_G5`P23f%ZYjoVEZM(oWVdjIqA#*yWPUS!M@IYn4yRC;(ct5}1@?xow^t}Bu z)aI1dZ9JhcZ;_0p5)c#910&m%7H*ts@-g#Uy<#zHV8^6Cjg+)@^<}8+&q%k)s zX;wwKe^i2^{X8p!XWqBo^v+3J*A^CiD$^(9)#;z5z5z|c$>Rzf3nj@ln zWtmlS;O=`4kC<1!-ROB*^ITt0+a2-L3t}0j7LOxKvQ)Tzt*oDZ+8V=sFl*h`ce^da z^%@1rr?K?a=(jyz{;-52@Al=F&weI(asN49_iSchb?wdne(JBMJOA6SVR*YWS7I`A{1@`4yX`W+7r%eG`y^fOP1)J<3`{p9`_sX=QJ6W62Diu!&h`DN`775txKU6;^c|KtDqn0bM>ZeD)> z?#E63osXy6{@t|FT(5S2{m-xFJz^65FDftVo7??J{9MO&G~Q>1r*{_bIxk!aOhQe|q+?=>WsR`oGnJ zKkhwxEqPes%Jd(d$)-R51x@XgwGot?&|ayT@lmhh_?ru!m*y>*r+l7M_SZ5Ekzk&6 z`z9}X`^Dp;*P9rwAa%bDJH)?v&rxzYJFVx2S5`lJriY|figxMJtjG(GCq_ledR_Fg z;?ULlck;sLxTn=d>@!!toybxbH0%1y@9+8RSCl`0+kByX&jj=S#jKN@gIE3WsMPF{ z>_4z%&ir#i>R%3c3morWo*r>)@0?Cv#R7f#$|=9xS+U_Tki3p57Oxp7y%7_U?f#5gsp^ zLgq_zS8S}W=RAMxAz!q?WreBVwXZG~lTzvY_4+82=8<`ga^*e?`}fJ8O{>(tY7zJ7mk-S2bJ*-ppR-GR=!)vChQx=@Q&i zD>`4RFqVk9-_)I{^IW&o$aBU{pMcdfjWfRe`}+6v^v{1T#cK9C^H*Py?3lUG`338| z7{^IJ{Su`6$|rCAX`*A1Qy-@s<6k7oEO{>F;yqrg*WHZV{I}}PDp}~boO7Df!N9uR zIsK4MsD9$lyb4b5t3NNOwz~PdXogz$Zhg`B@ohkYU{vX)St_9m`ZW692^vl}y^&N? zdimRZwWZar6%S6IOj;5q60gtu@7A7$U9q1mmVb~u&Y)g2W$}fgBD3zux>xmACTr}J zuq)FwVmllA*FCE7icn+vt?R0%cQmE6Y2QEnr(e-PSn7AcnjnExzbOm8E1b>`+A!mL zeW1eXb7rU6*sp|i*5nJjJ>Km4Vy7qntL?qlR>bCB^=Hr9`Ic+lk=YNEUPWczYHXE@ zyC*W~diK=~azfl&Cgo;MPsnkc8vo&&fBmK$zHPyU-R>G%?RF(Ho<^(Qy47DeWm>!Z zAWy{P=dt;GUY2_26m-q{Hm{LO4P=;aDRraEb;pCC3*37|L=Ae@PtVQIy*FFRS|KW7 ziT%3?{u9_#R^-~7IiJf2eE(#nBLB_i6?1;;6m5Ou@I0Z*Eq-cXS>oy@ld>4Iw9HBC z5+2px`Exh#+r-?rvU^46+t-y|UGi~f0;B%*1m~jMYWuQH6RfL5*4Sj0>nmF8p6ZYP z_xjl}&;1kR+qAhOv(97)=&v?g$>s9BGx4QdmWcR)&C-C(LZ1b(W{UB~%OS<&myInJkOD<^~3{B5r)Y+IDJZ;;_3)_8@qkdgn zbog(ZmPzHZu&WW5w-w(w=_amov5oWiy62B|wsG5jIVh3TvuCzlf#v(RyXB{^W^J6j zR4ym5W^Z0q_UF1C^^b}VYZNWw3Df?P_v~BIz1raXt9d&Um_&DSls7~lUCS!|dBcLY zKfgPhN9xU8>i0^qq*45SOqJn#$JNJ|X-=Om5L4o;Ct6o?m$@qY^Svufn|{aUPS1W6 z^|bB5z3-bgA6TQjVz*b;)cB756I7#Sw5?myviA0U?v6g`*)Kz~SF3NYpEg;t@J0IN z_#aZIzF%0KqFI!@F=$KiZ}pp7br{_q@+{DJxI5?Z^II3W@2XAqWqU3=Yh7NE2>+ID z#$W#f%od4!_cou`aiKVA%O)AKS8jVdVyEQavDx!MWN+qP2lLA-gf)Z=npM*?f*$Cp^wodg z7H8#b!5Au{5tO!Lsc`|zbsqCyCzo#QSDec!n^R-hV6g3>@iq6Wx9;<=cyMZ+$(;4; zf644tJ#=8MV#`8VEm0@Vr-y>~{N&*-Y%_bfW556Giw1M=Ic_*;E5CL1P7c4nU8a*C zop@UR>CE9nZOn4ZPq5mgrQO~rY%Oj0LouW_k>NvS{hl3#*O|84`&1hGt`^@QU>kR* zt$jY*s<<;L)_c}l?dR{hB(2}l_VM$I+MmK_j^BCs_S*apMz25Zy%o>(?APj(B6^I; zepMgU40rrG_Cf#Il>dLkU;WXo1J%IAB}J);xm>AvlfSC+Gh0}iZDv>FWUTMMvrX_{ z-TtP%bs0hPORwyHvWqoHIWtBfGiLrnrfrEIw%m!m8dbPGRF zuXWercFdoj&mR5SJz?jZyKCID?p`T8JfT=_sZL>y{!x3m-8VOy$J+*ns%~zx)tBBm zQS|rixUfYhLnAj|uiX6im+bDJuXjwEZjsrgt;+a$$HpuCl{4SF9Q=20n(w~JZ`32Z z7M)DJt6Tr+?b#j&d7s~}l|HmyTc6CscJOzSe%TiPeKV?4*RcDy{669OhFSkzPr1W! zgLw+^g~um8-;m#3GkyAj!kvaItjb(;BPMJ@o-GHes$=0!b+!=~xzZ@zb7>YCe&R?b|ZayvZhYFfR4;}q>}t@T`UF65-@ z&OEhAEN#lnH8WZKCro|FePY7G%WnnM!e2G4?wEAaf99RV`i7y6Y~`<*>jJfJeDJ#V zlg)$S=Id=|1fFcTUL~w_``IVH@{3_Piw`WkQnhLB%2h6lHH=JzL|5#a>^rY>k%eEz zj;Yaw)0^Y^Z|2@MxX9rD!M}dlt7D1hrKd4F=jbxreDK3>iu<=W7nPUf1b5!`3p2HT z;(G9!rN)&U#`_^js`9J9&RQX=-WHXsY4pVHj@YF{ebJ(GcH1^x%W1r1x z{^Cm-zkYk~f0}P~?zBZ0xq~^fO_o2`U-M*6{U=#9-s{~m_I!-IFV&v>D_L-XdEa}> zbefo+^w;@Iu%ddteUp)iAI#Eg)7 zutDks9iJpND;`;XM!h-BB7d(qxXXw%Z56ig)wF7NiSgWMthVzGdoKfrpo99~lOl#U zi=J5N)ph*&@Gx3!@|tM17v9HrzFQh|JxTZe^SipIZ@&9JU93Jf`MPId`+>hqpC@>R z#d21ydacQ;r}=7G;&QFL&wE1pck{`wad~+C`kLuk&%RtfS~zjh74w|?*S%y(NUPIPx!WmwVe=ssV%J>q?^lvev--8IpyUFIY2QGQ$+ArgYE)l+sIc>=XMlKJ+#eDBv@G&k6<)}M(;BvuoV~(!{rFMq?55LbSpVTX_ko2sG z+vvf}7kxL(J94XTMzFS<22GwD+GKxPYi45l)C2MdUR4SfhjG@ujI-{PvpZJ*Tqto{ zir>cxXS`YYRdns_*WG*?^DVVL{D1G!G`pB4wpy|Nk{!AITmoO@b-dd-SyCpcaq_?8 zPB<@pKDcZ9Pd>)?E_st|ZP&hR*&ct><}KqX|MQDJpYlJa#3gq1Sjj1qjcfDT9-e7E z|LW1Fl1Hs9^9~+XwcLB)%QQ_Frw4t@kJLA{tTniwcgAlWJ4c7m?1uZd&+TMiBe(oO zoqT5Zvt66nv}S&6JD@zfpYn&Gi1Ka^BMTyJ_;o2d~pot(S7nTXH>8 zLa1U{lu-NR6N_F&=T(aQy|QQDfxl^6Ufn#JZs>hs`rqH8({}jZ+oyZdwEkIf$~N80 zhtB9*Rn&9VeOzZ-8y6#xXkEeiYqD;+kcsEnU}51epXKxK{r_;*e$8?d(ZpjtuM2Op z<$O6jQ|>VPb#6H^W0v}Pby|nq>>cHEzX)%cTG#X~N6_uMS>=2?kH8(RW%5SrKK7(7 zo%`tgrF{yAoUC2zw_T{Kd&~J+B&WK{cK??tC0%CCrL$P-&#$-jZ4&u=qNvbv|F<`f zoE|QleZGjHb@n+^Z$|!rv|kN=4-3rSzY zZ*G}d$v1r9#KdSZ>9{PJbsQ0t;yB!OUR~}l-_g6XW;RX*C`?uPW z*MCU8-f(uauJkldkH~BFU*`(U?EaIG=o*{0Go1Z;|6GPr{^pXzqV%+jb51!`p1sz3 zBj*X%odq|I3X2&2Ze61l`jX3U>Bgl=ty&uudaAWlue}T@z196Q&$8p-ccDEhOTBNI zT>Uspq~^~Fc|w+OBOAk51g<-eT~*?UO)k!sRZnDZMOnOELvl z$gQ3t{C#1|LFdCYnz9#;$B1c1J=lA{IOd&--aCCS@oOnBSRLg4w6jKpKApWsq;=g9 zE1o-ZI0dRE%neRB7@%0DZs+0q+ToXDeW*NJ`=Kafs~GOyePQBlxxY47U+oUmm#l}Xa(;t3T@$yWG(0?nX zBNZUFVD-M&TH9hQ-~6_F!6N4M-F4r&#+%lYyYv<6tKvNPHnHA`+pJQ`c44a+mIPl^&1rgg=-9?j673hoxsItP@Goau zxLf7Mq(3(1vY##H-kNsfm4cy*?xV>EK7PEzwWuJGH|i{Z5dRzgLIIV|t7}-MXSXNq z4Qft2_?Ig%m+f-BpJ3{IgWX3i-BrqKU%!6Fp?edY<4&ty*igBvQQ**T_zq77&*WH)#{HHh` z&9&gWu!m*;6`wN(eAV~X7OHn`zI%244II4t<@@~tXKN{y7ZmA@tvJ(CdO)a+4-^N-r_iXC1Aa7 zc+uR&_vcvUTrg-ADc>~jj&-AY&Cdlw?Yp}8)yegK zJ3oisO-k?o$s`ogtY9?raIqKHi8J;8bFv@sy>pAa-fn8h<`MVYD)xMhWALvX`!6MO z3&+j=CAQ%5&FjhUv#p{ynvR%H`4cCrBJqst#*NcOt*2J%$*@0K_so2|)VksolX42w zzlOfwWH5!ZZeoViF?9)E>sq2>$b1Ui32K zy~!CyvP?#Xo7;`J80#Nz6a2Stf78u6kEWO{i|&c1+N|Jaafe{YJpUj6UiXZ`ITzvMda{HbsJo>jVrTFHvXQzM9-ktA!EVgXFo#W}?_V$IZcLkmjI{rQA*Yl0PWq-e% zynfZLX_2SzO<8;A#H`xw)3;`PUX^pBzjF8AFX?6f`-Ro@3olKvP-Xla(|pzbv(f#| zroXGTZ`Y{b{Ju%Vb@pjDX;VrU;ej|;g93V<${NuE8^cA?fZ06ep#Gkzf9?I zr|aQ1FY;$t1x{fQ7CQFB&BRMY{cElKwV>TQ?scr0mScPO3@_W;pAAPjdQZrPX)*TI z>|kn`zomTAiEe*^0$zrO86OIqPM`N|5I$PDJHyeGBW7jw-FI1c&+L0wa(!{ASp60I z+Uib*;#cy{nyD{UCMjK5R!}du=?3TC2D@XoeoOwldGV3vwL6Q>aa}ZFtCVPxxwA9- z^6WM2D}{F~@~qCkYs9J-o1+mUzZXq z^Qq|YC%d~_+V`3qwM{&u8U2&NUczgZ_W0g*n|Hp-J#O(YEUqt*&(^b#wl4*Ch(pZ+;*lZrN{pSShZcx4Y-~zC^+8w|7d~wDD%Ovp~8xJQx zYFKnU>G_8G_mZJ`tlF!ehrfxe%Sq*#zI5HjoY>S@16 z{^=`J83l{}1%LIh?+$wUf7iQjy3OVx42#o#aOPY~=AXDV+4I28=Pd;_Kb+q4#Fy!I z@^nT9hW7hxx#9SE%@lX%`mJr>RL`7GJUf|TsqW9L3FqDvYVX>1i}Ayosy!3m&M{fI zWYW2fDjkt*Iz}&cP4u#QtIyC_<9VfE%G@LK%s4bAFTZo`K#xtV=k*QSl6+gYMqk=} zLf-UuX{g9mW4XQCEZHVLR-a(2g*%3kh*0wC z7V@y{-JG@k{6e9vdE55PJ3V(wP}+fJ)ymvm`6vHy&3k-rZ%VJuiq9fzrkuB0F>ib2 zHd%+eC5yx&m}DNFy}c^JSEcQzRnRnx$-nBU)CaEpAlg#DZzQ14G zNBYRgenv5ug^z!8{JN1R>S?Jj)zNPoG~v}T9gp~HGgg+SOF0$Kzj@6>P9=12q)AP6 zV1C)7Lcd8@i7I2t+UPb;l6TGg-nil43YK|fbY_pLWNO(h|U@l#ZI+*CKY)*7t5tg5?zL)Ue| zHpQ&MMSV8^wRm)Yx$@|~il1(<=R|eWLf70fK4BjHPxBHo0%vdQKNPsVU}E_jz0998 z?|#(D$oy(kiQieox^H#eG1L*S^iR6DsP6m8AcMH(q*uD1{$Ek)pZ;U^z7w(kRqHK^%p;jD z`KZdIJ}^wvH-7%Id%}`$Z&Cw-4u2BTvHWx<^IX!!*$YtRPVE86^Gn1&yHW=8-J{uQY#c2y6aKBg~85KS2r~73ySSK zx9*KgpiJDx_I0Vg?O{$E!c6+#M6PwM_rI7Fcy*!WC1*C1kE&LouT;4-=RH|*@IEHKwe*e#W^Wd1DM{j|Qo3YN# z;y4kXl-n`ixca5$?c2GCGxX}#UGwKO9^~g;Ccypn!?`!x9k`Bn-`%Gj|3W%<*Y?Vp zy}XO+zqYRx|9vR@%g(TpRMz>IU2cY@^{?^{Da#KztjGUky8QOPJzce5F1q(TtBh4P zEB10O;%~1N{N<_F*)Y~16;BI4UtiO6VFA0>oVg|Y=xB}By#j?- zm7X`*L4wchXPF$LJf4frt zHE&}FT|?Hgu*BDULYRGA7w%c}vi@t1|Kt!ErM<0Rcg)-Sdr9^c$uo->EVldFPm1Yu z{`@X@bK`>B{Edo_E37}Nd~!M)d3=4h|9k&U|K546XJ8d!^mwl<^G)oW^S7`oq2Zfb zH*ay&dHMi ziB{#)Sngb0uhCr6X1V#WmP@V-Z~nz!pBdGz-t?`n6WDG0Gdob>wBQ+Dttsh;CbV63 z=Qol4;Iz!z;_*yl?#DMCHqKXzvoDgfy`cPD!(si=y(WEE)?EByrD&d~(p$H9wdV`Y z(D0`>Kc_hex--AcFXQi+H~aUQ-r4Qp&*$Cx`{k{wQBTF0`yN&YE6QGEpLp2!bjLTh zYjb3#uTySa`MUnc3hu`n^iTe8X&F=x}(V^V%S>s%v_)W_`*OB8%AddRWs zuFquqlD=!RTBrXJ+}ct1rbwd)TQgo_La`rT{qo&)w{Zv{;KJ_@88!u@v72~ zXYZvitjjiv>z>LA>`%2-JL28+YoBnFx6tqFr!&_@idNlMG|9+@rN$G-UCsiSKvEM~2ZxKdtjAzGx>xAOnGt4A430~fG0a+y_qt=?sF z{r*bZWs3}a#PrsFJAYiWH@W`v%-i=5T;)9bS6Baz-}`_6)*YI&-)`=LqenIeyRX*~ z_0uun@Yz1AKHcZ#{{Kuod8u+-8mW0H@KN}b{G=={LrVn%1rWp7z|griv*JkX#_o8dby%|ecuPu@_T5xyMJw@h83IRDkqq=o=PLeq; z{q26ahv&2t$`kj=UosQ#$bI?n;ls+x3XP!scLE+AzAyY!klXFr@7eLcvZu5#KAc$B z>BgDZc-(2novokR`FAMTKl$%p)2Sg+_3N&@-EQxHA5z`p?$u8*xBGee>}vCZQs(Q< zMY~=e;pMI0SDC2s=>NKs&nFL`-TvLY+`gsd*ONNyS<|@s+ZMk6JyD_a_{<6aC3fDQ z93Ed2ezkO4-pS9K&dP0?_2=z`tC_RIQ=Q|Uy?uAu{K>!di&dsoIC*$_I?TxL_+_a7 zxi)G-z07H|`{_^KN6r+>otI=fcf$Mkrp!eJZ{MG8(4SH__viy9m-sVD{zsp1+iE@b zT=35GMX{=L-6fX_9j}&-rDo6kJA+PDG!^sx3;O#br)#zGrmMd{Hy>muF*triA>@a1 zaB5?qP-xhK#hiOol0Igz-7H&mVtbklpMZ#;LSrN!K0?p$VKK zmweSk+g&(zxmcK0{!B>Wd)~l))ANkLycrP>e|nj53vBb;e)IOV41r+%3A`CH)~&|{ zXE1D-qx|AJn@Qqc+Z6>}zK@=M+`D?!v5=XU5_TTEyj*Qo>uF`3{@-iPT~C|bp`YDv zozlU)`>gLC4(tE!GQa=NWSrN+#jKUaSi^t#Uf&1)$!mgQ0(j1QU!LG-5XE*df4XU- zg0R=ih?vEkP3J95c^LIeKc-75%yz$+QPdJwu0)WYx^3Uu&@V;&QQ% z>jkVfb<`&>(u^&8^;%!hYMaEz{iiv#EDZD#Doc2sXT4ZE0!!r<59wZGglT=raMl36(af64!E$L;^0j?#IocZOx*2D9xv2h!@K z4%M))OR6iH`cv>;Zrz>Mvwt{hx6Qn-S)EnOvQ4kPVa}qhssc{N-f~G>&bsQnnkM}* z)SH84`(=ry=t`c2Z(Z6#w@cn(iC%d|v+7hT$DUsv`_wuP?Wo`TEb8uqu(@m>l}nZ@ zN}m+54oSPSZB^pRgqdN1#x6d$wsbvEdu^zZdR){%sP9=0$H~|1XDqh!NJLI{WYN#= zYjIwY zp=?aUhcY9F0(R+yuel`+7s~7kxUO?BE(}i>SGKUepm}iZzH^*;AEh)CuE!ncS~0g- zOyJ&}zS6h@kKP`6AhY!xPu}8JS00G1FFY*zbJ65x>%@{WhYIz{rLM_=4x1v{x>ouw zmfKztq0wtoE9cX*fF;PUp*SRsbi1-r6T7~+Z0Qq><+ANo3m-r zg!!+NW79K=PpaSP=Xq+kYu{{Kwm_{%^Y)65S0jscqIPO(*PC9A%e}B|c^40x`Qd57?^-9g z)t$N7!&X^-XI11E@%9T{$|v|0zh4Th&OBYR^RtAO>rVAaCzMN8Y~)$~v@cPte}OLV zqJnkFnTGtol^S-6X{}V*w);>^=<#1hx@%YeRn%A5;a9o4SwJN+*17(Qt>Vr0H7d(x z|19^rrXl}g_TH2~*LDhMb4=D~pJ~$B=2_zC+)_PrqOYp?GtZeP3szkD_h-_}#D$Mt z7oJM9Q(m+7eEI7wvG2v+`a75A@tUjtRBOM}@~?bCoI_P6Z`rMMqn@ctr3|iWGQW0Q z^)_h6`_rrD6i;o?KZL5qAQxS}C%H95d_Rd3g%Ejdf4`-T3EQTt``N^N#fJwk zW-l#`_BNg-I>Tmn=w{FIY^{n|*=}F?#t7>KhgfUPC7Y*h@muV-W8dU6e3NfTEsDIk zfXPMII(LbzJ^R_&VXyR!95Dl9wF_y+rqf_Y!z7MXfQK)L%~bG zj^3JTwG3bWdNI$I#`iy`tvI|Z*5;d|<&KS$#F*k!RKh>*_C1*RY5Q_rA*Tm6ip!<1 z=?kfe@46+@rNE!2ENC36BxP^9W2486JHhO!%v+z$idJHH$#=qkmy5ygnYL4I+pY?% z<-adqDpHzZAHCTB%=Q|Uu*(X&G77#nCM;=OZN;xC&}1Vh=T^UkdxO2hIkDrtGv{6| z_S!LV=ZR~53lvSPvMeJHB$vdQ>IQt4^DUd~oUvkJrB#kq3ZJV~L$cS=ug-40Yn)t!PpJ#8kmN|2LVzBSQxr)#2KDV>;UC-!}iZpf2Sduw$d*oa(z1YJ?n!m8m z@|F|ySTQj)yk*|2D#g_4^@{=)+uA(}R9?M^!!~qFi`SFp%U?G#SfwgGJowdXR_+?B zSr4v0x%p{M(XHm3^zd87IW7BkH#aea1^32m;d|{n<5lQVg>Ia9wSMz^t|xg9 z-wA#y3VQE!_siYzXK6>a=yS*$=k=!Zf87}U+ev+uMtC=?s^#6BBGy22?}(6@$Gw)@ zvNjqfI)qO)Jsh?+~&jf_Cj;1;kkRM5s|a+mC~&2hf3c@S}~4<-HlzV(+z_PMa#tLOXQSJgQm5p^S8)%9qF*vFW<+8ojI@}IcBF8o(3t9>MF z@!9#0e}4WEYV&_XV!eG#X}IC<+gE?fKi!`Fv-aG)b$ySXwf)~$^;|>f|FV+qn}4s) z&tG@%k7>H+nY?%B*7?5DIQiM4uX|Q#;Hm7d?VD%IR{y_g{@0-6>XChK)e805zWr^M zn6>il?umad_{~0FpJM*s!uwHZ$aSxvsfKdai}q#jF1wy{bN{!ySKhJwUS9uV*4ryx zA2punn@?j7w%oE`mwn&mU$VAp`=?wC|73K@@aMU{Q%! z+~RxcX8lJ_sXt4Z&HkKIUH{SN-<;>_OP|Q6=;S)jRrq6S=*IADX7jmCn=dog{@rw~ zs3bc#AyWUM)B{oVL#!8ClqzMWN=biK?PAz-)BmsEwXUnD1=(^rO1o4}iEevzRH&4} zj`!?g_m7#Xav?vfcFvz9&%DNl_v-aLlTVwiW8cWfi$yQ5zx3IN<y3xu^)w5f9@aygoKPCA`1x%u?tEYBRJd5ff6CdV`vD6JHVyCEnO zaHn;03Uh|n#4S@qH0w9+i92G}5$|Ar~Cup z`V^Su-kP{})wI60Hul#ae<~VQ3d9HhJcTX*1$!`1o*RN!bEz2{hgU} z{nO{Z+}p9%y)A#NKC&nnS~Re8nH9@jC=Xf0`0H@Gh%-Zt>hvm zrf=(~ab!of>PK=Z)y=tf<&(sR{QE(PydOgOU#l9=3#iqa$MAQl_1EoADjIjV1ReJO zYOOsQC-_zMPGe}i*oyVf^2A@vfAYttecr;*t4`~po}QVug7F65GL0}nhdti0VS*nz z*u%_MJKV@x&7o7EHJ#Bnga480YT;YS`#vaLPhGGoseZoQ1cN;~EBIWtmkH0iKK0zj zmh^pMM`C7w{<7$+{v+l;3>CBF8RQ0`F8y#BC;vcb+nRlYbnmdeptRo*7ndwRJ={1kFZP&loOrvjHKliij(D_=qNM^@#V?&R^yqqfx^FApxl>5H^b>S9U6Wam#u(c5j_B=hd z;8R*6V}bFV-R%Zqf1R0c7?^Ia_iWmAHgwV+wG@T%tTSMC`cs$cSr)nHQNyS2592ZC>J3@yDmh4(|Fru2iC zn$icDgUv$b&)UQ|Yu+Z-)@V!a7vYbBH&@@_3QNtmuX&MhDeb7tmSq_`*Xe6JHmGyt zX-CK%=+oez?2sr~f9P*!%$*Q9BVZ1zGd&ZE!TnuKn#8Tel-^_p<`+8T*;A8=oe&159Ok z4F8U1n>~A?m(yyx)7c`X#DM!P)5~MuT931c#~z>3p0H}#70XnuqhBgtt^B39tliCs zd-uM};uXt!6VB%T*SN9c<@ejB!S&(}%HLv*|19aZ{@$FhwoUfNtR0J|h^<_%&}P!? z)+ohNv5AfGmhr?br?_r8_{0hH&Q1#p<@DZe#Qs2_EG(3#;FHd`*ZvlDzf|n#HXL-Wbj|#C+NSfPtb3DpY5w) zXReH*QW>$li`om~Ynxa%9-ZO%(JZ-b>UIkQox8Kz9`D#!(UmA(k|;)uY{j8WK5DdbjY{J;mc}fPrk&DVwO4q_f*gReQ~>2=gfyVM`odoS_)RmZX%-|YWU=RULb z&p27peaUK?+vg`D)8;(iaPslNznLl9orL;!T_;A z8M}Xf{$^|4xMbd<$z5w$gkO0c^xH4&y3%USy}VBb`|lpPyY^E4myTCjp@xoqqL1>- z9{u5YESnwXwRYmyyWbA<&AVRKpY!JGv1PX&%0ym2&!4pEs@s~nOV*2j^?a#+a&a=V z{E-E(&aJ4o|9&aw_DhAgv)s2d2~Mq2D+(}PnLclx-laKiY0GQMs}ol5o4hVYFi}zU zM37#vmyudmvj5vHfn{gT#eRMKZ4sPn7Zr5Q#y+}Q-8s7d%E{}ePA2ac z75ts1Ju9(#hn;QT?kt;&^H1MgdUt7`;?3oJf?qd$`ts&&vVrWE*PJ2!=Yo$epVM)J z-|O<`wq73lT9t2WUU?o}Z1OX^KhE{h3)9z&H{Dypcyq4Bv8_GbzWXN~y6*Hd_ilFC zj%%E2YzyjrIG3LLyH9df-mJ}zZK;>b%yyg1EvejHnmz5(S|8cFed*P{=^vWqbkF*o zuU#oqlk+>*xU=*~%8IXArZ&oTn0Zx?fswWbIL1cxI;6?ysEjyO&H^ zUF2^0a+>9`rKN6eNsmM}?wTKXY|jkibMq}ae(y{6dOdm7WZ!y!tL*b#+6_vn#*SZB zoG7diIb0$m!d=gjxm;FqzvPnH-=g>At4_VFKgVdQ_1%D-X>XUvf8G~5)3(#m>Y>Dg z)pg%5tf~kJTsOb-a{GkCb*7tl=3G6MKPzwP`6;tzrj~lVj+feIWAF7YQ15A9(JKzE zqnSbbRH zzb~xU>u%b%>x<*2S-#4g-jVpCJ$T2Qxbvks3s0D>@Aw`+cb|Ful_@9m?!13=`ShME z|NozV|87&f^0(DmpFhpMu}UTAzU$PlkG7nWYK%<$+O#G9=JHqX|1&7O4bI_8&6~U_ zLz3CV%yjd)3>QXWGd&9n3k4HnOFdyfT~JqwG;j=gG=V=E;l$7k_Q&YhwxV`5^e zXK0~dY64MgYHFfqV1}-EW)?4NXppCZ#^j1DrOAo!geN!j$V!_S=owikm>QdatuZn% z(latrFf}oTTEk>)Jb7Zf*yM%T1~Ntl7J3Gz2(@OGdgg{$)N17z$QT+L>lrJUm|E&t zT3RX?8k^~vnJAc;S%A2c56)JFn#*KtKDn@5U&h2p&%_+A+{nO0&(IjFa*N4@)AXfG z4E4;-6pYQy^bAeR6^zVG^$Zn^Ell+cO(rX5sWXC|%xFB>agM%>k-34Mr7>Ksv9Xb! zsU?PDF%tuLr&vMXCp9m%%{M!~n|K`Oze({brN%Y*S{X+M`w_A5* z%67js+wu2;7`N-9+}PBUQ&(8*i?2UFVN&ki8|B&ra8m}`G~ z?OLf=f8)FO{Cx=~hj*OcCLR{E|HI>>?GqIr>8H+4INcq-UHtt0Up`!AyDfHv9gF$3 zPe7?7@<^=uGWqtq>uxSrU%z@+*vd5XrD5Koo9COa@+*m(%KO{&`s(HJH{ROwO`6kj z+|aYj=2^$Y74ttC#jCUaUaDKVFYL`;t;tT$S8a5y4CEydFj?QlTB~03px32@}f}Q z$$Z|YdUo!(aHwd5f@{etr`Y#@y^dK<>Q*=~t>)pkc&^W`r#jpZ2|G<{KNkNzxOaNR zn_YU}w#t8RJ^W}wdtOKVS%Vv!BrKc-crxzUIqdt;vwb@P^PwbWpJbqE@{PRO=CS6*`bgMr0`Inme z&nNa*YcgB^f9N_{-+SuDlBrkj*X}CXbNa;3L;u>gSn8@Cu+2Q$K6R6|>eD&8i6?9) z39+x6`YB(h;^LZBQO+&mv8N6wOU^5gauYe2y`%iVakpd7)%o8@-mb0t^*dED%Q=41 zn$;V1G@HEtOx&RDK4+Smt4+~Y$>MqYOY1d_ov*9s@cs0!V*Jkf@1g75?Xlu4ZBk8`E`3@8!fv3tn+&%TbRKlwd)jTT6Snw@S2FN24{A7T-tMD z<$!zIH94Vy8`fy8j4@7apCp@Z|MrH}!GPN;-mMGMqukJ6H@t9q4pU<^~rIPF0GYXRyXcwHXt~KJ1 zTYq)C+4_mj(jjI_whe+Gq8GTb?`*D*G4Cj`ovwRD=_lhZ+55JuOO5!Wa*d>-G_*8y zKZQ)?sJUbkI*YkS^7f+xM~iGj-vrHk`}0%JqnCU5eu{ldO+C?Kn#=cQay{og+0L^W zUsd=86kdK?E)m?hv9)cJ>d8$}roBe(v)sPQ9NrNAb%W+AnI$D$SB(x$Y@qt)JJL#1dSZ*3^MiMDQr&AkFE7(( zk)7zk?kuw<%<5%d!)v}?hVLkvL2&a3DrqS-QRvkC1!PPV3LWQ?JP8HRY+UC!PUcBnbLFbpN|m#k^Fi^(b)%F zZ=D|~{%U;j>;Ci=b3FcrEEV7$xrluyL5EFlR=Bjg-C;wf^{ovioBCXc{-_PBctSBzj=Hj>g z#N+Dl%fT~t`E=Dk^J#v=7&q@dXJ(4ORLYmvQ$EP{N}300PrUWqro(<|-cIHEX2xsn z%hs#!%RI2>z(cv2J?~arU*ThZ=3Zny@2}6b+4qjRUwzFtmE+Q`Md=(X{&ue1&FUsz z52e@{oE?vH?_1=jsL4q~bcj|Ok>(+a}TNPHWQo5ui zN}xw3SiyMSncn0a?+s4N?rDZ58R$l3?b(pCw2SvzXvE&w&=<`CW+kRuc|SjQF;4clpj^1K&c`s~`L?N<8QO>c z`kn1wJh4)QHDP@d7Ypx6?*|*|C8sqfY*StR`Ked&H?dQ~Pu6_RTsw(POMmT4HCz6h zw^%p4(O9yfV8@)B)p344UzSSD%;2jG4Gf9ilsk8dfK}b4hSGIU@>Kf#=70WLWYs@o zg>K@N&%5X7xl9Uq%EOtPX}s+4+rHVNwmQ0-kInOvzv%dO;zIq$t@8slySerzUvsZt z{K{>XVyEig#)^d5&--#ti>&(5__^;^(CS~?@7NuFy87%h!9K?P{Cj(An)Uu%JpPSu zX5<{Yz;&a(Tj*xWveLlz)6Lr-ZcLf)B4!di z?epP=!$ykE|7|kVKHpQ(czMVe>zpygyZP)pMWfP+Q#aBIvl6^t?AdyLl7H)M$Kd_%&n^4qvtzf@&)E;>JUjZf z{QC73s`Ka9)K%46{bQP>AQrpPUisSuHe)f)HmTqHZ%wqBv(;It!STAQ-_pLu#-oke z7EvcGCVhOl@BYl$-)*H-XRlQ=J3GTduQ5XD2;Y`=j#>JvGP!Ldk{nX!UymJml{{`1{9DD@&MWo!;sep(nop*;=f4U5^_PEZ z)%+`iZDyipp z+&Mc9#0@Pi^b8cBwiuaNfL#r?1*&Lrr-6i#xe3V8P*uieCVB?u3J|wIRY`a8azJ}1 zW|IpYH0q;n7d_b~SbIHu!8Lx*JwmP@&h(Kn%|tSt4{Ivc^_3YG~VEmG>ye{ z+J3v`j755T&b(4heeY^~G}A=t?(*IK&YvH48H?BFzfkqFofaN0|0{h?E92+IpWSV| zW{6wFbsR67YQ5(H zvh?tw@8R#=+IH;Mz8$k|=dVxyUVWQAp>X=$_5JIft~`ABLg`(N)XvA%ntwmus6ATu z=keSusfpR&wp~k7mil(r&t&GbRe3l0gYy4>5#Ig(c;Mve7MWhNCN)&P^SHV{MR)a@ zl>6mdr%g@xFIXCur5UyQN&V~J#_Yd1-o8KG_`aw1T5<))m!olSBz*Q+yQkh^Hhtjc z`Qn!w=iX)Wob&V~?W}A4=Sy49x$?cX<&+J#QvQT2mgxEKAF~}k`13)Vu=|pIk#1Gh zym#izlJ9?`GErRq{MolF3x7S%QlFzR``cUlI6h|q*0k3OpU(FEY5hH`)Oa>q{kxO% z+68pvZrIEGSSsz$SK~2#%F^_kLN0zHs+qGCPHhyfVtjBenY-}s9^uxA{!L1pa}>Nh zwdSo!NWLlJ<|HN|(Y@_vl+BBYHs5WID;Fot^9!pn6YQIwn_p@u#{b7P`Q9E$?smo! zXNymVJGZPc?O(Qyc?RQ5;SUL$o_y{s*i)Zz=0@kd*ZS6}_r&xcurQpc437S1BV^ag zu)OQ#;!~{ptp_TOvU2pe+VeGj?CKVnv0^_*lu~|5>B40+r+^Xu`;$4={#dRVzL>;Smo~N8$ z`oKlzB+tVm-Eptxo}9#eZ{~?#izXUX&WWwcU%iCgN1+WYhE4eJ1&+9+(_hFIqp*Bslv+vHG@-Zf6G ziM!o$XRXP)xo=`r_pFfnmdt!LN}o6S-?M6N&h|2LSK6iceeJdriRH394Z813m+dYS z^wImgqWEauEVn$X3J)H;gaY?G)2ZhV2d*_b%{lvQ=A{Ko)bvz+O%{LiUK(|FpSXX} zo144+N|FM$SmsLBH##?%PMGm3!M^V|tAJnhu6@$yPULUBw|D2>yYIiB>)KWxvUw-# zrq%1F{rb7h@R-e(pJ5`gnse5!J7wte_X6j`yDF{smrMUK5%iyPq^Gd>5?^z^yS4zM zy~IgIPV1{lKH0lNRd0(ukPFxzCcEiT^2ClB^`dHRwOhFg``#-5*>^etRH8Y1;Evdn?Q$90kF3gjwN9w_%5e6R=~+ z+`H7|SJls7a3O{{fw}0x2JXfGZfz=EthG%qbXn)MHzIa# z?Hi|Vy`<5+JLuUYpSRqvx6Ipp=J}D6PD*0pvc^+?Z@;wS)@`57VT)&^`xbr>UbXIo z)|KNA1#<3Q-MRNl#%`I~6{*fwrTpvVZe=@7m#VYctZ9<1Dy}_mI@26Bv5$AM)JooM zSYN--`LW4BqcAhr!S;`5lmFS2K#wW>)r(zY z&MfM@Bfj+Bs=UpvXQU2(^Wd3l8^j~HUaMN<7^idG+mOYZLp2Y?eUa}tZPT@>oa^6I zCFhss=WeI+8alkLKg4|5@Osyqv}0>DBxkyErQDku*~}|;aBjoHiTj%?+*(f>2I^E< z_sU4UjFJ0gygHI?-j=m2YZA;A60AR@U3=Sc<(=p`Kb~vzx=fSWUzJ(N`_-;E{^tFn zbLVS2UUgWkdvNTzq`S(y6MUx@C!dvPa=5thMzte|zDLb4ZIPSRQxkzw0$XhwE7|t$d+q!U#PXBY8>@Ukqbp~-_vwUHfUkcHpBHT_qch~EPuJ0ZEJeFebO(ptSKiua@-sAZ=5<* zAI!UdO9Iy`N3X7FZW^zwjKf-Ao>+A_(QjiO|GgBA|7NYxE;fhxjgoo|5Bp4*W+Bhf z=jyJS{o{(?^tTs&CY(>?F~0n4@}$YPEh5A}Pb@8aE%w=nM`li~Q{FA{o&n3?d2=|S%; zEB`;K$}NUWbL*eldY!)g%fR`pkKYwln-BA+uwU#sbn?#=^%?V5TvvT~XXdY;onBH! z=N3k@R{Ro|T6BzA<3;YPhYEED<&!?%NRE;Ct*rSZ)IMWgT!(=JyM@pS=hju3Hxdrn zotnpM)n~4B_47xjt+jbuSKQj!JGo$s;f$xr_qA3$vysdRTedjkaD7S6ynU;V>bs=P zbNP8HvTNmOCG#?izyE~mUaSm>HQC=a|EB%N&66HY{uX$Sg+EPIWVc06T8U56^rC=6 zbuu%%f?q@($!q%BQTMc3ZI-Rn<{i!~vpKx2g%jTGI=-`PRkGfJ({($7L+kgue%yRr zF=UeeFX0zzUXmOAuAb;+Ic=s=zkI3dt52pb0t>_Wn-5&!DCRdzfA=Inf7faTLkqXu zMM+i3jaD^0w_WbVNY0H9?+Ko^yU#m3bmRNI3IcZD=RSRV=In$*wW$#w7cO?&bjqMH zDB;4tm8ravhR==X_nX{WGx3E(!k?*5&LY{DoL}CI54*$@xMGjBQ2nhn`=w2NKR&Nt zceN;2x?;I1Z^ZTD-IrffZris&cA5hZ{aupU)MLBQ$PQaxoO%@ zZA}I9lHFC`{tCX+tqXi&UZ(l?ul#N?t0quCYw}fo{(4aN4b);cvM@3S34+*Wu%&O& zTqdUAKAedego1SJOduUQQ%I-H6w(ni1(_7YWoiOeX$sM23ejf@(Ps+LX9m$13$l(4 zY@f;GM%iVG(C#7FcGT{n8N`aoH@dArT`dtab2B|-V{-*_b3J1d1v3j%J!50Ul*Z(o z9s_9$V?9H21(-rZ6BAIM3tc6XnK`uQ#4`C{yB(96#bm|~Q!!I>V?84iOYlUIrLlsk zg^`}2ktL{W#%Koarm*$NPF~iLJUOq=K-R>-5@Zu@J(C~wc}(6ggH_Db%n)p>p}CQs zxw(R=xdEE7P5lP4hUS)fhGq&dwZ@hPdS=+v@=P!jg_>tPkk| z#K2h3#1w9#sfh`wAB$u=NHwGBqB3yqCT^vo<2Oie9dE(EEWTscu<@`D8| zlMi$mOujtPK-SpU0@Q;uHL(OKQ!q6()-yLj(RFr`y7hmi@=osQ)f9y( zG%*CnEJ7j3JVp!f2uDMYtc-~TI98#`O^u8pzJ!|#Qa<_TG?1YhVkVY`Ao~=IA)RVd z0|O8jU){{0iG1oIufT=Y#G}1Fsz))(56v+CM8)g_xp4Z1NW?~8&dN5Wn zF$M**f(a#j1`Q`jUd`gQO#wv1Sfih35ud7aHSS{mI@}I z`Cy0(KqgM!G|NEN$O1Irq5x9}n%Xr4&8@=C1go^3%?lpm(JG%N+0CN=;iXCpmhQxt_~CrM2HHyadZD$>S!#>NUJMn)h{ zC>WVqfVswoATB6e!4YQ(iH(gDY$uDTQBAbYb0eD*11eA6S6-+?GJ0_D4&Q=4( z0<)ok;bg`ReMvL$yfRd!g}I)&DVoa3yXG2#60V4`g{7XknF1&{EX@^+K_e<~<0iY# z6QA5S(RK2ad4|$PmX>;;{AFPY8hJ4_F$eP?>IGM*P3D-dHo2!)L&VtJ9HhX=)I`tF zM8VhsG^afoqCg6qxF5`vl>*Ipn=3$-npjwX3Jx@-zvqiip3rSHS$DGhWUB>+GKOYG zdPbHC#-Q>G{ezjIo&|XkHwq(A3x%G=^r3tWa`t z_(DTzQ%gN_gn_8)6tmR83EzLp#i9% z1?5N+^T}}Y78%Nb6OgF_%t&yuH-Z@nQ<$@uZ*uNC_Q{~s3>u0wg^uBw8z~qYS%Ulw zQ@L%ip^Txav7VWs0!X2WxjA^^9#tVI;W;iblrgphjZ(rDni@m7a1%iaPcPwvM5Td+ z9>_RDLsLBi1!F^Vn6+moNiZ84T7VZN7#o5XB^X(l>zNpvC>R-nst^SuOEW!VLr_9e z1qY+VGD8_7BU3#yV+EK>Q&U4da}0%xmYIv1n}Ur3jaZr+DHvIppctjSTzazDw8+Uv zmmA4Id~IZI3R0n91ghmt;Ti;25FSx>i(R6ZRmiT0$=}}CEM&Q)jFkM;9$izs`2)wAn6f{I^WNN5qXlgiF zaD_TZ{VI1^P-$&usenV>!P$^NVOkANTVkM617w_$p#^Bw1*lX+Hcn!4|7spk%9b?( zRa6!VF!i7iG&4~^S1-vxH72i%!bB>lN)>WrH%D0EEPajgPdSu zW(f{2BXh8iplX>6jVDi>X+3$;ZqdmNJu>5C%7kT zWvj}7iUU(ixN1`)13e=%4CRp3G2m=%Xl|@$XkejWXlkfuX`*0gVTfWdlL@GC0vd#8 znH)M>f!WZ+5R^Nl%}hZJPf(N3(!xT)$O2q-AT)!tIbM?h4fe|zS%OP6m|A0VQ&263 zp_UOg+RrjsVvYu*;pD^$P+Nsv4B|3VuqVtc6%5S`^el`_!GUaIJQ-w5>J{+hiHrew zW&@@k)M7His($+weOY58Gti%=MleagBF!UzM^9$nRzfhQ;%cKC(ZDwYqU}R~iXJ(3`+Z2-8Z$s5vn(LWZ zz}1_8l7JyL^*T>Mvs0i@5S#2fUukm9QxVW&v&jqQvx-=l>X{jWR$y7`8Coh>n&_EW zT7pBs)D#o~lh1(F%19eqn(CQaC_t5)8W@9`CYZ{lpNW8K5)pGyHDRe>Xkw^mXry3a zgl=rkGnkXK8OsCDKJGA=hnHQd-u9nhFhLtmJ zOwe-DQuW@vyLsy+w@X!q^6&EZ=h^Ow`s%^Q$mh|jQdEB4$G-0Gg%^K0)6M?OdMIC~ z5wXXz^1j{UGo>@W^vM_MCmhexBEA<+ynU^|7Z4!WcuFyzx(drn>L$v?_YDX z{`KTHN7C-k*;C2wFI@3%(_c^Jb;)~de%5Ue{4KxLeD+#Dx!Ad9=I`ja{U)n2K$l~EZ{yg6`PDE?njmv9-v_m&cj}CR2dT#Tiz1Ob(+PwYEt3L{! zEMXFhmK;btB-c^3&UkNU(6_AVp;e1-w4PeD<P3r)sUfv`TdLd#!EPR4*_1&Lp?GMX@zX@AD$7 zRR73Hn|0RT*y^=)SLm83?P;%GD`~yEVRwHiXSDnFtOU83=`&KJpJ+!cY!O{|HI}dY z#jE=}Hmoy=SiNRZ{Zy^BZb8L|lCJW5w@3SF9DKGdhsEyH=S{C(R4;Lgy5wl}E=cWL z+6%7-Q|yFpFfP6K{`)mkz2v7yvkpky3TxP6GhxcdwT{XyFV>_4?&^Pc>T=ZDua!5F zFBHvc{@$EtHqozi8&m6H{%e7pUBQvQ(a&}(h3UjI`Ia3oTN?E)=)@`?1ev)WUysxfG~M$Wcxn;&*mZ=J~u8@&Tg8}-b2|E^`ad_U!Rb{z5miFH{tY#|9cG9y#3w0_5S<%MIqtk3$~}*P7GR?udi(T(YfvQZa)^za%uB~pJv;0mv8<)+hTv<(P*<9E1yhT zv$tN3VT#dTk)!50jXl>U7&bgub@yZ$Z_o6LZsKolujny4bTT!g((Vysf^4cS`w7h} zvelgbSbsR&XqAn+#9TI=oB8+WSh2?3#J5ZT^%^z%dmK@cl&TPa%~a#-F8TXi`b&${ zsj_@_^^bV3>cld#GamMIms+yXkYnyg@%?w|=SMB`ouZoJv+YOI+|(IH#y_sF z&HGcL!FTRq6|-WvkhoISgmDH{qyRD9GeX_S9U+QWaDJ<-`Nmc^+Iu8=F!s7 z+|&Bcie0Yl*z)M?xuBDI|L*@#3tI8xr&;8==)0x~wLj@ebKF>u4p@4bqCqI%9mwhV=3FWi&8SSCx`?2r2J^QlwE&)4|}ER4%oEB62RQ(RwGIX^_~XWHV` zUYcgcHxxItCzk&#DlAO=Af>2|8L6 zcdTIEU#|}fA9H*tmCx3@ZvM7WLfqi#gXbluuXyOaKPr@H(Z5M{TI(HK)-BJPKAcw0 zQ20}NNOHpsjgwq94DSy-jP=r9Q2*nB$@0pu=vM{I*EeUxui(jA##-cmz=o?@yvVCEe z!5Y6)aVsuZb`N}%4pJfy=PvNwAKJkrD5?gHe?8Jjo1>Oo~taShHO2z5W$$c;%4Mds>C< zLxsM;%RWx6MYTsQoV!=G9hmg5p+uyjR=Bjcxn3mi?uAVYy*4o4etmfDjJD`Qscp9f zC#c>Df4xUzp>C@FYA&m_Ib7=&DsOZwUHEv`H$%Sb4f5}rYivIyWX z9?WGazdbv>US?O6Z~^xVLB3roMV=28k0>tS*vh%HwO~!coaO}#TedU3TxxLfzu*hA z7lN`MJpR3JD(BPUt&A24j7*vEq%!P+>4PaXGWQk3<*dq2c_@o`{pbAkamOch^NyDZ z|CnS~$~~V`oS#>1yg*ETzRCrTh1M-=7cPD9LcyQ+v|Z zH2XVO+NlpNvErpib+aC9x7A{}w6LGa>ApF~ij6aCZ!OgEWSdkic6=RMRBPDk&akWb zD&idnKE0A$#lz#XzI4{6<0m|fg&PWNSM#D>6j^V>JP;oW<|bi=B>F(3WY&=e|2nW4N~Hee$*) z^}hf@g;9%(!*U} zr%edHQuY3m+r2!wE+MN^jx+dnhq$>;{xC5@`lhd{&q?(*K_RXkg>F)&eRCGc*PE|5 z-sz~pnzZ!7Hq~=m3%}^h&5D)Yb>dYDGb>97pZC=%ewD}cZcp5LP~^fJ`P2WcqF?%~ zWSaZ@`G1?(n7Y58)0e+l9=q`ISIymbUcWLAUGgAy8B2Ea7CrUgizbI}<()5S*;l$i zW$U7fVCKv_eyXoUR!r7!ow85h)8(~&`5~X4)^9seFZ*jn3Ey0v*rqFY6Q2C$ob-@o z%R9F0osW5*@Afghy2bJPh5d5D*I&4O6rN?cfOP}suEIZBT1m1OlcJ*XtnG{n=0?9M zoRT?pQ-0RBlP_CaPP`MC>LKNSJ0ak|N)v*2eZQ;!47;hi8o0g>_iX-rZ`y$uiYB z%WAuM=7J~7nk0^&dB?&%^HlQGmnE6~7yj=&%+svrT)*Lwi!0CW&#vscEfaeholZZN zeJ1qk;}QWUj{eVrTNt`HKV96wrCxqr)`)|v?hXo6- z9nE?a(WSY>CQm^o>hf#RD^q4QS$ruwXz@2$boE)&D*;Z|CJVMtYhK4K8Y#Up#DRG` z%XQhzXub9ij~C7MyzjDXlf)9la3pR_|3#4c~7C8~{ zil15XlsTu-;?q9OJgJMXd(F#yyjQZ%JnGKHtDRe&-+$1Wc&S{!D%^G7?P=Gv&WEqu z^r*(T|JklHkKb-9W6+kE;LN6+2xKI>fY3CW*o zS~p#H-JY{4+|nWTsF>L9kia?OCpEKI=;wcaZPV#@Gjdg3s{ON8g9WrK?W;oZ59=@<8k_rS&3y5r@ke=6;yHznMws&vdbAdbw&La06-Ia1GQU?;ytv2l^+>kf#oZYWKQbn3{Nemm zI9)t=w{-ri*mM1!zit0sUbCiT>*^_-yIX4+RFsZZc&fWh{@vKPC;ijB_mdRuro=6> zRT6Y`|Hm-H?{QK|bqSL)>yMutKOg<%|9pD={Bs6LY2o^57u5Oct4n6@R8VA4KWMJK z_WJTyQdO5`#K|1^ZFg5-(kD}iUp}@@&)VPdmRy$CO8a&1fJJ(d>-?~1y9 zc=4{t4DX$;Tqlxdy>_U-HO=yv@5S%SA2M=k)=s}-o;oQ~T2|ch-pVzbt-f&WF1i=T zYi7c^?lDhG?x_pn``$(c?v$_cLdG1ou{3S_Xjz^zyiFo&)U%KqMj~?U%-@DYN*UE8zvxBDZ?jjb!FR9-J>sO65VuNeey)JKf*u#mW7O=doR2^a@Qu29MXb`8b%b zZ!tQ_FBei9`$_(4Pv$oMrL)b?c^G$#`(5lm|LyNdUOfk4@dcd0tZc`2>nqwFVEbXU zZ1u5Yz6PReOZQ&9H=#D-YsLR_8+4^oW$f!C3@!F|-Mmq8l=1b4!2PnkJ{mbY#cwb* z?cny&(d%6=`~Il#vd!L;lz$bx_qG2*c3;(66H&LI@`iG++pn3X)F_p*TbRhFE?H^K zvHZpHx6*!jAHMDl>YaJZeny*~rw(W2v6sKRy#6<6&Ud$}E*D(emfPCAwf*ist%@58 zH`+d~J8F`1>w;3Jv%i<*x$+CmpFfDywa9&Ta~HF;+oz)<GLLR+MkgA zMydVX&%AFMhx8x6N<6wo^+lT4v6cI)XH1ePbK4)tp#Ls!X5g=LTNhc}yDGPIGs~r4 zWqVB(TAo`le~UjLx>=)M_j$liUiMT5j~fjf_e~A>=JF@;u5Y>BWX<-f({gprt6*dK zxtrO7p9sJAP~YAzZhFba>qg~bzHgn-!Jq$NNi-AJ6AwmT=xHE>nB(^wWuqyZ&CAzv0hb zt)ub(nK!V1s0K~rqAnda1W)0DW_C>s42(hYAhw|yXlfY5ismwdOb?rZriUk&?^Kfo zNd`b zLu05J#!$x?LwsTgU2AO!U2JV=4Al=_w;jY~2wi1uXady-oyj-MHi0_81nL0jY`!6M zIv+Hk3-+8T)MDt2z9Doj-_R7Q4?3xD2%XM1gig|fr}aUxY-naWxlwkR0d!g)68%9a z%f1cGAOVF~_ibnf8rzkg{A5A#--X=R7T3gzz8%e1yyVc8vHj^Kvz5ktXNUhOaYrZ=#cm1$1g=eBWA*8mgZoK zEzI;xKswCyz(cA~i_Knv$JOAfER8_3wB`mNRWOsrHn1XQzK9VO-&3ylY^*A zZ@z+B3L4J?P4s~0;ms^f^i081f)Dy6CTqXuo1Bvc8Z~5@+_5N{$=nn)&@66dq-UmJ zW@Zd>ENC(jwD`dY;?~It6D61o&B4G#`^A4a1nuZysLZGQ!&?q`&PqQh= z^Pnjl(1gY+@yXer`6kzvD}$mGw5!>~92BKSps57~(2@vnW`LPCVWt>(@Z4>A19;Zn z02E(BrbecqL#TuI%>KU3Vm>R;ALW83G8{cHzY$XZMw6%ePsR2kWXzw;?F%P<0hdBn4 z#umn)B^)MZpfEErHPACMS1>ULg)gXR0Ig^-GML;rLtg?kmv0DOQvuq$ZVuWHf})Pu z$N)4~XDkFtNTv#)$zBUf1rsw+z#tiwI7NT5>?(F)6Jv15fajCU6--P(Ap_b>Zeal4 zq`v(p|KxvNN>ZQ+eM2(^sA^MVGd)W)4Ao3V2H-^%4L!1wCZ>AEmblb|rg@o-3_$CM zjD<~%AYl$!3}a#p3P^+tKxTrnhQb6zxJt-s7`RH1X_HU==9yeot|kdt2?I3~lqxJh z+h(9ql5;hC(JttJ5~JxmlpDnS7W&h!u?1y|UCY;~LiUPvNf0Ll}fX?Oz#6KGXp z$7Ey(jtnCsL(r5RXkC}70w^0AA=EG%85&M5^c7|_glsAKoqxwn=-=IXR{rna{L+Cn zFDe}bE%IufFUXv8%QfIfQ}doj?^a#xiniVLvA*8f_S?dRPnH~A*gJX6*)!%U&p)1> zaAv*u9D^T4XWS*YH{FT*bF07bQMC)(b7z~5jt?t7B<^tD_>h_HO#9E zch>hUdusS}-+2k{B%wgfq|e?He(P5Lc;+>IY1FkR%T`>Cn)>9f-&D`JFBd7vZ>sv- z-~Z&_*}%yi88Xto6Wv*)S60myy=ivxWWR4`&Vb8&%5^B0z{PBR*~bJ#yMEJ-|FC*!{F%fv6s z)|LM+x%;=yzgu0nLp1i)T5XB%v26QyT3-`;5K))2YE3}s({+=MTzq?PPUyFrje9M3 z*X4iUeRKBYLw9xUImgTL`QG&Ay~_RfY5&vhIX079Vh`;~ei!-dPsb8wt-t49c>H*9 z4ZSad6&)KmJCFLW*%6ZJTe`DMduxu@Q=L*S>8%lhW$H^mCaPGg?tW%? zewysu9sN=DtIm~Lc>ib;j9t>_WvuKzef8VZhOb+C*cL`gr)bYg$uSeGx?;Xi#H(>B ze`U+0uolJC$re`UI0ZW;KgwU3_h-#%|0nx+4;V)Ls%M-a;1v7rl#cqOy$WhkFF8^) zGFd8aJUyu%n`^L^;pfbwh8!j>zw|VXrcS=iXYH-an5w3sq<hdLd^3zP|*2uq8M7OM*V|L*BFZ1sk zPu*FvW^?K~t?$A03%~F5x_;^{b6nBG2MhR{F1oCLmlwq((dop~zDV7oMe?{oOTmHa zeXfTtEAj}QQBTz1P;6MfRDG`WS>3nlRqiLtv)JA4tXia2<@#^!b}j#|DR;h_ZMT%V zVgF1mp&}!atH|U+{fp#-`UM|v)KA=!IHy9k)Apcc4qAMn_AiR5iGP~kR zM&pw;Ycglaw)ijhjF49CirK1}9@VCu)bu=S{tYFp1t8shmJlRmJe%~YC z>Bc_X4-QWJw_dB##z69-JL9!_(>{N`#-a_HV)N5@}b-!|1=?6@FGVKs&MzByy&gCoD{PmUvbyrW3Tzo7s z!|{0H69df(6_)8aF}1z^KX)X2_iVZ}(K}@2?;4TKKRXKdTPto{rGMI^XZO#CarH** zVIOv_@X5P2n`Oq|3co9?nO$1Z;##dOxv#5SgM7JSC)dt=lQTE#POg;D#M@z3=VJQj zPASu|7ubI^_1+9e-@5Y1+p13tZz`&XS1#^aTBNA3aC4Q>OWvSUrfLESO|I!pt%e65 zWi++wiOppcYi88({&>7+v&UDao-G=oSD)0II*9)=4_#NZw>~oW%RjGtU%|EeVpS`b z3QRA2HT&L~&pTaBv$__plKI5udEVq`oyTHNnRA5;)@FV@$sls@&Z~D{R^3wx2!RwTy+8XO=5UD0fNzXJW6^S$6p3#Z5ZiyTvXf1l9S(Oj8hk>~%@qC`r56Kw@)f zY}SQ%GwU`zGTM2E_xy5xd0^H%^HX!GeVq5`O@4dr$dT`! z8}lY@Rl2@Q^Yz&aIsRd|G73{x-E*w>qOe3#}YP=Ny^4{l~R70Y3Kj zfJ2`jwFSr|b9T;`dD_s!wS3j(X;*X%nRvT*{>b5frTcAq)ycbAnk~EIx$8^9WsaLj zNy+rME}eBUS-bJ5?$%lJ?+7Ixn0n84>dmTP_{XN}RS!$_^UmW@GaXh8!$gvye5B6Ou$`f+t zT)*j1#AmDDYl5DKIX_jMo*I_FZPmGH$>&dSBpt4Zy74V{XY6N9{$H!vb?m1`FW%$% zbyHC}=N6`^l~sbC3wP_hEDTq7oi#;sXI|Fj4bH50Uvl|f6ubV}A!3Wd^x_Qt#S2d){9G6v z#q9f5YuB}^xvRh3H7s2CNw<8r8BbJFQT#fuy>C_i|Eu4g$Fb?e&AID8ExG?;g~U1b zimWHkEtc$iG5P2wWAEiEzn||HlrC%fySp}>wc$sd$!CLm{qpV)`2$W=^n6|a=h^fB zpBMl8`CtD>u(Ync$SK4<;be<71+t^d#1I4AlWXb=Z=kjKc- zs2;XM+{g^RL)-{F<^k&eM{^mPL5B*=pko|n&@l>g0|f)nc#1i6yu=(b3}9#u9ddw< z0~wk_hbo{0LWbs0{T2}Y^@bKu11z8hSU?T1fDV#Chl>oM<3)zh0V6{Ts6o(?BSYxW zks)-@$PhYeWC$HLGK7vB8A1n+3?U;&xm<>p5QB`MLr6x@AtWQ{5R#Dr#6d>Tp(G>F zP?ACrml1R%$;bc_LPiFV5Hf;}C>cRVl;DFYMuy-$68g}=6i6te4yG7EN1qUbDMp5q z174`f85x3yfE4s2BBK;QXI?3Q+WH0xd8Iiyv0Re{|4V?EI5$j}l`;pdK{hhC)H60Q zRARdxYv2PFmDZohv2YG5H4j zj)q*3TcY2m^@iPg@$}m|-+$HZQ?{HIm)#nE#V_ed`RZDenluaJ8kbY{@d7Om&lmqx zKI^pQUhE&6IAx7K0pBy;Dv2E~juMBTKGd`M+ra&){m*a9X&pfezuy1&rFcin^7w5p z-ny1HUc9e&ueM<|YfS&ehxJJY=68QQd*t5D@h`UU^3A}G+wXhlK3U#2rTNg6WrF|10SH;{U>T?@PYQ!x!U!$m+lT+ZR69jK_?Pvrx=srOBM2DN7x-+*3^C+&G;L zHa)Z6z~?c^Crx3Ng-2$Oq2U_GH-~jPBqi#77H4d5WRl#!Oz+oLp1UbZ+h!ivTPU+c z<&Z_!;fMETugwV54D-Ebqwpj2fJ+Fge!#s&GNQhF>-Ds*e5jqt?EOJF_Z8dI)XuQI z8rDCTN<3dzeWN&&;ptW8TjpPLC%?atsC_MZ%j?_kw6onBeNQpXI^eUcr03^vgC1Rp znTOX}Xx0DV+q5M6Q|M0yWw951=1Iy|j(?pH+GwogVsW4)QRea$^F`g-73!Zwo=HEt zvi*TxzEp?H?dIy8CDr%Kr+YA`tn{s?4>edc+c;a%UR)b_fSuHLgM8s)-QKS=S++I zQgP3rPUNR^_bc9A)57X4qdw-=sV5jcy!0fe?TnsVhJ?V2B#V|+#c#WUnF|iND0#%I z{T6k(zW3{=kA}&wc5hstvaa#}zJtz(YW9Ray&|xCnJfFf6Pu)Z4{dq#$u??w>1oB3 z9pZq+l4DPu(?UH-G$<`s8&>^qUsb9geL#Wf@AZ|tpIm3?n#hZoGYS#ob9F zIv zly|u$j~*9gE({iO>GGU4@1TmW!lQ<^Np{D5C)||N+V-*M=L#E(s+Ou9d;TA4Oh5c( zxytN=|Bv%6n%24C?dBU13m(|}7g_#Ty?Wt&Gno=59k%+NSC*GoYIdz$>HYWCwGS-; zpQ0y-e~3LlRcc3g_e17i&F%3_R-RUqm%fbrBlG9L>FFi!1okZ{zEIXB<+(j0+TV)( z&l#q}MJ2PIxn9=!YMHrw&ct(kzp~GZEWMDC>b2zK459s1EIBQQ6_S1>-#?uvFg;t7 z+adFN^->PDpH_BP-_$?3>{lzavEjsS#rJ(tn^q{UUQ#A;+0RzPmq~ozd+oaY?e`sD z%53dk9H#X1MAn67o2eykN?vs)F(+TGa!ZY4Tpk_qqxF|MRHyQF*yc@MUvU6OocaKHJpz`6B2f)Xdw*LS4#^lAm{Hqe+L;pP|7 zQMjt5;p@eQXsdwVeq4@hQay)0*Tv}wpu=m zyN2EEeA6!MQfJFLJ8ouAPrI12wR>By-|ja{?`7t0$(o}de{;Kv&uhEx znjW+4#dEi1mfUo`T{SsY%Xsr~y=QA~CW}8z>$YW{SMleI`HiJ3T0Z^w8t7gdCBfCw zRB)`&sI%hzw#D81e+kvj4tG6yJo&Z$dO3OBwn>Ub3m06pJaxPEfBmbCzDB3$^C$tU}2pU#t)S;x5p zzpuU3sQ)?i?h5}`p~BghP4%x@8rAb`TE}hoj%C}{YA#vl65lNSCu@t8{qAb6N<98; zg1yZB%$fE9auL%WsaFczJ8?aE)<@rNr+FRbHu^UX6v^!^&lRd3k? z9~@h8G&jC{&nuTWxx1mqPa37X{qgSbmRgPP%dbEEpw@iH;qI5IRqxr~+4`hE`Bj#q zU4K7nrNV@zFRT{qTrGVv_8rIl)#2fHf|cI9Pj#Ns_ZNPP?5wQ&`u<d@yOmOqXbf1X*dSi|~kLGANrr?-7&Dn78U_;c#zU)Pp)f15j7|F)Ueb;tUb+IL-V zr@gc)SRT=Hsq{g-ylC6cs;VeGjj2*M;WFpWS&T_%4!A`8V{W@|vFy|Ndd98i^VY!nMGlF%ASS5aV`KmD=@AiGQ%-nxhMDv(deGBSkp6sGnwN=%Mm%bTdXqNbBCn z1iU;y;&$I1Gojk~>lL0I-F+hB+FvG}Ya4nkX0lFNGnw(v15>7LN9Luu>7JTm^7h{P z`@t$p^Hx5syK^MDI_*Z%#|^KptkkOA$vLBc{q!%o+D>8b^7rl7+MsIKed%Y=gl9TE zdkqe5y8E>M{sxEpFaA%rvkjcR{Cxel87QS+_h^S6i3uKsRewX41{FGgAM!Z|vW6|LL1rn2F<8;b)5ETM(e*rSNu0ktd83p z-@a^m^}&C-QgPpdO0J#wUe9mL?#A&p{&b@}kKJoSou=Bz8I^65<)5uNbLNp~`)~2O zfBq6`-sy36s@vDx=Ui6#Sz|`g{*JsA)z{>s52gfPb5`AzZ}+q=I9cR<#NrupQfW#- z?_7SW%szfp?Pjdf?v6ZVuZyKI^0wb*&yr`dz8WB;^}TUgztG0?*^bx#df%+yP`>_N z?f1Kx&D$;b|8+U*e^ZtbcfBrC_VI?kMSy&Y`a7{1DaW7eTYEIF;il+g*~f3LSupJP zJpS$F$LM3fPx{MM-$?xZ^Y1T5^OT1(vro?cCln#1-ymDI>CVRHHQ8aSmOcN_G=W7d z%xii{@`Vj;{`;pbGCkgzc7r)d)mx@NL$3{t>C>I}-%9eYZ!3rlp2_aMe%0i%0^M`IafeQQ zV%3qcl1o~%zCh(et^T=9i#$HBR@qs@SLwQOb*kyEe0HatmJGG)cMUUTE`C~fI96t= zcieTS_4SFI&ibBC_xZb?Xie*Weon%=+lqBzWte}kNc`S@4c^ThP10w+u%;a}w{QA? zNo9MQaR1+|Ip+oSy3YJImv^(i8MGilL3@t~>%xx9872Zg?C}~=Ddj4bd5_Zbj@!Nz zNXTZ?m%X_}VExU%)9&uSvAKC#+kq!1!&bYW-Pop5@aS`W>V&y(PM*Bwq<3|n=-v#k zA8hCI9p?9G*cBE%jCTrU;SM>GyLN&5v6X87r9S#(E`M0uas8YMUytnDOLPD3-2B>O z+1fu{%=wBOESrOy^;%V}Q)eIK*SvXwY5G;&6-AudUly~j2@>pBm?|Cjut?^I*G3hw zw>-l7zCri>Kb81I{HWg{UE-ag%_eLA#v$gyR|cW{rSBBD=Gc9{aeE>AqrV|y+nhqA z|9)`oBr!oq~3te0YKDO{VL92jb5M$$03q+OW&) zdC9k9naNg$UDrJ)3C#AK`@${rWeab=?Xhd2e=DY0bYw|6$WBs-vHY1>{~|EC;_l29 zf0k7J%$fS>_xd?5%cbAWo7to6qSAO$$1~igD!fS5hf9Ako7TDIDctLyb=?$H%>BEl zpjNDC@8jsiR~DZ9(pJ&awAMzgni#dkRKGW2ldjjH5Sz1o*R=&tGV8auJ?q?kcy`tL zU2;|lIuq?DOy{-^{^yzdaY3KM!qWQFrT2S14ZgAR{xEp9_F;#1`tPu)iII$nO=(5JiJxcAo_C0#JF^e->^0t0Zw)beNSdv*Xb=el>_gvTCPivhwUt#tm8|n9A@%yFUa!h<6Ng6@iKd%hgVuv_%WsZcMQ(fGdB z-NFgyH=ezbVEfpL{S}MOxz8^?u5vmz>GUzqw5isGZ>keCj@ZqJn)^hn{7j$Dw`PSB z>pF*745$L@6UQhi0yp?ywEEO_@C zoSX1oKC-`c zvij_0Z|?ld(J$QHq}eS#<4oSF_@r!&hhD#Jmfl^%A!@<+CV(?w&(r$5YaCvFDKfT`RO@twuV1=@{*};h zu3k}hE4|#3(Y5S&-I1KlvM~o|d<(c4aWL!&cg~~8t0IP{diLGvU2`vZ)5R$&x!1f! zEP|F~JI%O|Ah+CAu757~t)r_`%&ZSx;BU5&|6LaJyzB+9t)*+gg5c`1$uf(Jx*c-s zr)Hk+S1_phB&V3{Z0uI8tY8r|Gt58t?L&kv@X%j-p#ODNx%Q75;vQN{1GPiNuE?TqHu zXLe5%4UxF>e1+Te+j37XCwV`tUUp0IjCOUsu#8{yw``L+$0W@jwomn)zy71aafbLK z+nmd7&aC@9p)BFSnVRr}@2kVKzh1fd$;)omJ&79=wu;=hWqr6H?ncOPN+)05ACpH-{k^^w=qXq%D$^1|46 z28W#Hea-5hcj-re(WB)PU-#czV6;G^DERMusZxWt8wHiK*xwwfF`qosi?g||HVfeP#>cX6w^u_@1A`#n*5|esM>vv8Kdt!O{Q()$) z4rcqR&C_=;pT69)?&;f=(e`T}$rlyue6~CM;Qw~>{hy~_sMng2zd!68*P4o-Z?@(< zsQ>)-*Zem@zkbQHirHctLpK7A%z~SW#%4zF2BZ;a^co}@&1Gc74jI~xovz5lC^ETA zb}no|oe@|W+8D4AWV{)<`DZ>^FNH7_L?gh}O&&|K>CiL%J{KgNp8QnK{?#JJX>kjkfx4iT9R)j-=M{|QxxKMUi z%8w-1zhA$f(bJr`+hpzni!HnXx38ReV{Cl>+?jPh{+&uv`*-(Jzrv=-q8(ND?KjVO zZghOU-KIYiZmvtLuF%1^!?E*Ln)=oFMlBt}NMB|(9Uj6=h^|QQf+RU82dt0t`@tpqbbNP$1m{gza z#d@=7`5Uv(ho{DVUXrTcJ?(wP*?++wt@1W+%DC}*&E5Ks)7Jj4+?dktCNgp9h16{; zXZ$J;OKG=AU%zY7S-v@c&vaYl8{hM&SJuBanZe5AZM=5FevTTWqzaC2tYrxte*cV8 zQx)XqG0UxBG}k;culs^S#F1mhPR?zKYW96Amp=Xa@5rS|b5He|iu!M|IA8aC%?rLg z=O&d`mYulOmV0_utog@j@tePee0&!DtvN)~!awp_-Rczn*A~kjx~Z+btnczFe*OML z>3#M6@)d_ay_vUpMr`s*-u3Hm=Eq*%v?DR{B9lNq&$msf)ixGK+iNnJ-%sQ{tdyB z6x*2OAFZjp7nYSq-c4g&T{-nQr+q=g(gz2eIxRT%)JND^hwS`gaIW~;J4@~JIri!4 zYBTp`|8Qiem}s729Cb!bv%+j!=k4F0V<$~1oh54Bw6SVm)wdqg+?XYWbIr`xXwS+C z4>!m5yjV2l_WyL!&940a#*J%e)O5ddiv1mCHet{y?^8@xSi$(-ZAQ$ zv_Rv|v)esQ7ByKL-hUEfx%KwBMtbBjrZt`Na(+kdNZqmHY~JcIsh;DI?Q_x9S@#5L z9Zb8}Zp`P}ueeZk;+_?j9c^3YPIlX~PjFw;ibzA|)7wNNHYg^wN+eDV6#2p4bh%;A zjmo3U_NIplrhVGM&N_*^Njy_|g>gWelC$*UhQ(X*liyt9=1zC8T*vgv$IhsG!o=&B z_+FfF*O7hbYNHXor0c>m^EEH)58R%SbEU&P>7;!??N38(jVvRdLw@RBcX{-#hZk%3 zh&`8)as68{p=aF&J=aaE1&k7H{Jt&VVR)eaaqnu&YwR08Xl8U?FxTKUe+mp znO`4WowfFctpABqt3(v{zwVZ;UVNa?c8P&gW@&9c+YQA_!M87Q)#SOA7xs9KlRDS&FRyugE?}!wJm3G#+=_3 za%j`JvLoefUiZI9%14VImzDMJSnYUjOtVgYuvYDzwAv<#pXcW6SaIXh;VJeX=0yCK?A3|%%Q>^r*5xdV zQp@)XlmDtdW7)}jd5YF*o#nolJJ~|ZkLvbrHJ(|jl=|1pXP(w(w$gDyxzy8!Lm%xC>w^!+vm)10# z%UgE;_PnKOdtP@RHO%WeA9alTRd3R~+aFZiL>{ejvemz}a05edse4g=cbC-$>4#hE4Ski&DQ# zS#@s3tgly`lx>4~=P>=AZ2PpYPpXJZ_&Mh%K_CC!Eys>Yyv+T1r{__`v}ul(7JQtO zjtg74{5khJXz}}?>jf+J+!Wh&<)=ma(`mEVGH* zqgedC!K(mIg}rNBOLL-5U0*+6c=hMY>*G6encea~+2v?A-wo7cdYOLX)sM!e75V{> zOq^|AY){l$d(wg@I(U+}R0OY7(zTg0|2%$ccK$;~u#jBfGtCI&j3y7q;_IQ0))YSJ z@!J()U;li!h2=pXev!S4=9j&Ab7RT_w&RKxM>m|BCA{rqVw&RhEj;(R3QJ0>?2qU5=V6Kzt~<mHoVc$T`cx+ZjfUc!@( zAMJa}V@@xS*5}dauXulh`<^g=`o;5sC(C*i9FA_7HgieW+6yzImA;5sd&&eAY*}LG zDza?WzRBCILfE#Y&YSLD;FDuG_XcoD1iylh7A$GDu^e9_{FTk5lU2g7k`8OV_9G zx@C2(z}0fsk}Vfyt5$6J^Wwa}qv19q=3}PEABtpuH=lkw;*6o#=l%r2>GktpwH++` zTD!rRCuhz(ALWK93z3KWQ*Ten7xhc-o{@6vh+@#?gsy@Yhmx%f7M;yL^jf?;yYz6+ z!ynTgwq|h6yFdTQJp1D-9CMb(xol@DaqQf5XA$!X_bHuA517fUky&WNGww>TFIYsa($?nIq#OJ^w*2C`bxazZO_^&} zmboW>T7;Xny2hKnbWKk`pi{Bh^YGoY_-k4d)&C_e3;A_X_+J)R_rI)5-T%%tM1BaL z+_t}}etyMkwyfzDhoXHCewr?G;Yeut@yEA#X0hg*CRS8iemcARb*qfJBvt|_xRFQ*vPx<6`@%&cE!6YtMF^}gY#Hp?gO_9^Dyb0b&A zdwuz?l2tr^jZh?)XLQ|y#;U|=7fYw5Nyb(cPMgVCvPjzgtx~;>xP9-5qQ$BnuQZQ* zx)b>N(vhnw{>$5zAM`oK<||Vf*R9WXk?Y0oGhzESO+1#XGil!hzx!M2r^NoaVz4w@ z$2WM_mKhJW8gu*2e{S^Y3)kbDA=9rNTk$dHm*BCt2`6vw^vs%68|x}vqW1I3Q~8-o zk3GKSu46Rw`m@gqvMlaRlJ;hvntyYC$V}79QfFU{-U2t;y?_DipW#5UfTwqKF%9G{okva#a6Z7FK~;; z*}a(`Kkw3NgSN$X#=p%qpV}_?`M;*H=ojDf`CQLFUQcN5xcKz>6I<`ovs4lecsL7gkK1x(-_R-kT{v7v<-NFKyC0$*qWVu3nekTG{7=pHR2BTMkQ zCB(SBu`y_ilQL}F9;_FwM+V)`H9eM{QDSoLJ1J%(BZJACpQtk$OOlwBnOT@X{WV>lk5OW>-&L?Rx<*FeNf9K|O)ZV}%*`#Js*z2%0C}C!Y_il#4MwBM zja86f1n(~lLNdU}#6-`;+z`_MQ*fX>cq*b}W(tZ?Bt4+bKNiO3So9czEY&f@&;i-i zV~It_0dOSI`-e#zv-?VFWtM3LLJO{s5naWoCp$4>-oPG5uj_3c8;W ziw1CnJ3JL;1})dS^G=n~X!3_HaN@)^U1x5BZMx2Ea^gERP0ZOnQ%kJMC;Pup$D-QA z9CV2aM%+(c@IqZ1(`*wHtY({mBNAL--Fc_VY-DCJndN<$fe~~Wr-Hs;YDI~H5p*@D zg1)1I5p=~TQfe?an0)br!sJ!&Z8H!W1Bz116pWzDLgD5>7IP}-yJZ#?gUp4Dd@1Pr zB!ao%(u7Mv-#NcDuS7xDj04BJ5~2@cH@L_`F~fB7#Se;;+djJ3VVDE69O@Q`UWhr6dIrT0 zir=Ls*L~!eto11Y(@8KlK#hWEhZqH#d`7-W$;jLs?4(zpTrkanxdCbpEQB3Fhed)4 zMij3ZgU#vttbr7+&>%u`0QibfR0kMNzW70M^8e2bndm71o^+rNfH)qJ0wDD*ECoQ9 z{lZg#F(f8UAn67<^emw^vQOst+G_wh*b=nf7#4-lRm0%$f^L&W(rf{9F8k!CUqQ(M zV!VPr)UPl%L7WVClcRzWq`pHAGYe4S2YH=+^2~3MNDhIRh2juM@<4Kkxdqr4*57UH zFv1PyCa5D|IR)ehNZLR$$71q@4^orQe~+-oFa{RhP-Bqd-vp90kc|PwzvSflADHGq zmtVuf7vdF2_(GBfvN@n^COKLErw@jEpv$-6=0LmxF$dyQWOG1SO>*+(pCK5*V*zsj z)L#(4K+J(eAF?@+a*`=iffX)rnQxB29+-{K@~aVn&eD z0#M}*!SYiD7(x2M=>k>W2qM3Mk$q|kqmq~r2D(eYKmjE%jSawoSuAD*NmwW*7=i;*Y5G4FM#<@|%#873MvyWN zRTVfm!K$RDo3SvafQ}``aE&22P{FEXroUrhOcH|@Q>bQvgB7ewYWgBpuvy?dgsRG9 z`aupxz3ELs`Y(1yf$6Wf z82P6=a5D0Oxct)vxEUqkTmdm7$RQV~y3HYW_;WDEh#5gn!$4JF0a7qa%*Yrsc^Fzw zFXUuw6*Gd=QYiY23_x-Q(`~pIWLXa zIvOa37=aTrxb%{(w*)5~1<>7w1`0u-;~zkYQo#tacSga;66{$8BTI1fC>TSw&L|i| zw$3ORL$=N+fVw&${l<{3GYZC#tuqS7kgYQc#*nQu3dRNy^Nb-|XB6s%Q9bgRJnG^)N^byJj`&7XgvKkL`yg5`HYM>$1fzaN$F(ix?jE%sxt%5ORu2sPp zJc%2m0P1%bC3e6U6e~m<85vAp!_R1D1Fmot zU|nA$$XPE6kZ4kXbv$70b(A1C230V^(=`PcUB!*TBN^av2mjKNoXot`Vg(~J%jvBG zjOxtB#zxcE3oz=2LH9r@DCoPHD;Pm{LVG%-_9`GzhA>Q$hLp;-bp&jM4O zp@Ct&1zJ!W8yaFniLoKL`GjhTp)p1@85^2{Dta_^W}uE6nwSNsAO?xm!-L=0&=Mn? z7#kU2#GSDb`1C1|W`tfNa2bUrW`dH^L6XKsCTO8hZ(v|-WCmJ=4U$JP&>SP~jEyW% z;|>(8rskk33{|hG1xC&>Hnjv5^r-6042{j}(SzU22sDO(rqBdbU!jYE>PR#(Gf)!; zP0ZX3Jy9E*S%T_MusRc1sb_3%0BS&i1rcI~pxw1-V#bEk3ndtZ>p^FMp-Gv7_R^w> zfsVlk2_eckV{;2oJq{8?1h}~+rrRwr%QRyPL(m3a)SPQ8#7ABxx4XPy;rkF8k zVGgQ#(bQRB2AZV-JkY@51IoF^mf)k+P&Hc`VU)zimc~$5BZUH%0@m2l4Aaq;SaP$a zrBS^(TGBBwFuikldiU^v>uzzoznLepywi#kNkH8B7Uf`il{ zd}m@{iD{rA_%J+>LU_EJ7-Dgtp)sf@fTqp_tzxY=FfcJR1D&3SrqCRtBsMX$0Ch3Z z)LCMbUnWL|7>Urt2s1iOj7$s-tkHwt$P^<-m>8LX8Zf998(A1le<;l;Tn}oxp-LHp zj~7G}1NTkP#4wYSiLoh0QE6gqhEX@07@I@O<9ejnGPcBwY7+w!^vc1+1bi|ds$)#R zt!^|i6VUh;nwY7DA##|3GLVUhIjE(KrVz8qV`73OwoDB`#|xtBH8sR27EMfzF=N%# z#2j==B${SZQ0o&-%pBBrKohe7^|8>zEHTPH6Eg$Qfr_Z=%nU&TP9QO)3}goG7k~s2 z8NbriY8`=R*4&c8cUeD-oh9) z!5M(mnSy$1VDsw1#W+~d3?m_#8ku91L8eCLpz|xinqhiPjg4XP36DBcV^dJS6-}Kv zx<~2_OpPrtT9T$F1{gjuH8F%XR}op()WirQSWQh#FmjWri7BS%Ow23|6+rn9srO-O z0&kQdd}3mWk&jJH4KRY=)YJ&00yZ@@0-cCk83-CcAXbM4RdVqwG5}btzM&HWR0D*bh^zg%wfT=0B`@9TUcO*f~5h* zn2WikAx0O=+!8#Uf)dB(md2Qg+R_9)ebgJ6TVjqHnpkU}fdxjmY&X#3B?*aS29jZHC9zXg_FjfIH;Mzh+&!~~;QwlFb6o)9Q0 zO3chjtuNxTu>nmL1?A_LD1bYd3gCGu&%CsJ1@IgtNY>LuA=<{$(!$cv!qnB!&CSIU zRBAaI8yXn9xS5+97(2T^a}0NRMAn*aa+ diff --git a/doc/boostbook/accu/accu_logo.png b/doc/boostbook/accu/accu_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..45039dff857459c0c526ac151f77edd6756a8d1f GIT binary patch literal 5993 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 HQ$iB}+4gJf literal 0 HcmV?d00001 diff --git a/doc/boostbook/accu/db2fo.xsl b/doc/boostbook/accu/db2fo.xsl index 7885597..93c494b 100644 --- a/doc/boostbook/accu/db2fo.xsl +++ b/doc/boostbook/accu/db2fo.xsl @@ -12,10 +12,10 @@ blue +--> 0pt 1 @@ -123,6 +124,7 @@ General default options go here: 2 left +0 http://svn.boost.org/svn/boost/trunk/doc/src/images/ http://svn.boost.org/svn/boost/trunk/doc/src/images/callouts/ diff --git a/doc/boostbook/accu/db2html.xsl b/doc/boostbook/accu/db2html.xsl index 7a5b041..89db3e1 100644 --- a/doc/boostbook/accu/db2html.xsl +++ b/doc/boostbook/accu/db2html.xsl @@ -14,7 +14,7 @@ Override boost book implemenation of header.navigation with our own
- Library Documentation Index + Library Documentation Index

Safe Numerics

diff --git a/doc/boostbook/accu/makehtml.sh b/doc/boostbook/accu/makehtml.sh index 8ec715a..2514a44 100755 --- a/doc/boostbook/accu/makehtml.sh +++ b/doc/boostbook/accu/makehtml.sh @@ -2,7 +2,9 @@ if test x = x$BOOST_ROOT then echo BOOST_ROOT not set fi +mkdir html +xsltproc --xinclude --nonet bb2db.xsl accu.xml > accudocbook4.xml xsltproc --nonet db2html.xsl accudocbook4.xml -cp ../pre-boost.jpg ../html -cp $BOOST_ROOT/doc/src/boostbook.css ../html -cp -R $BOOST_ROOT/doc/html/images ../html +cp accu_logo.png html +cp $BOOST_ROOT/doc/src/boostbook.css html +cp -R $BOOST_ROOT/doc/html/images html diff --git a/doc/boostbook/acknowledgements.xml b/doc/boostbook/acknowledgements.xml new file mode 100644 index 0000000..1d6fa47 --- /dev/null +++ b/doc/boostbook/acknowledgements.xml @@ -0,0 +1,50 @@ + + +
+ Acknowledgements + + This library would never have been created without inspiration, + collaboration and constructive criticism from multiple sources. + + + + David LaBlanc + + + This library is inspired by David LeBlanc's SafeInt + Library . I found this library very well done in every way + and useful in my embedded systems work. This motivated me to take to + the "next level". + + + + + Andrzej + Krzemienski + + + Andrzej Commented and reviewed the library as it was + originally posted on the Boost Library Incubator. + The the consequent back and forth motivated me to invest more effort + in developing documentation and examples to justify the utility, + indeed the necessity, for this library. He also noted many errors in + code, documentation, and tests. Without his interested and effort, I + do not believe the library would have progressed beyond it's initial + stages. + + + + + Boost + + + As always, the Boost Developer's mailing list has been the + source of many useful observations from potential users and + constructive criticism from very knowledgeable developers. + + + +
diff --git a/doc/boostbook/eliminate_runtime_penalty.xml b/doc/boostbook/eliminate_runtime_penalty.xml index dc1b85f..b9c10e7 100644 --- a/doc/boostbook/eliminate_runtime_penalty.xml +++ b/doc/boostbook/eliminate_runtime_penalty.xml @@ -73,16 +73,15 @@ safe; The standard C++ type promotion rules are consistent with the - default "native" type - promotion policy. Up until now, we've focused on detecting when - this happens and invoking an interrupt or other kind of error - handler. + default native + type promotion policy. Up until now, we've focused on detecting when this + happens and invoking an interrupt or other kind of error handler. But now we look at another option. Using the "automatic" type - promotion policy, we can change the rules of C++ arithmetic for - safe types to something like the following: + linkend="safe_numerics.promotion_policy.models.automatic">automatic + type promotion policy, we can change the rules of C++ arithmetic for safe + types to something like the following: @@ -110,17 +109,17 @@ long z = (long)x + (long)y; // can never overflow One could do this by editing his code manually, but such a task would be tedious, error prone, and leave the resulting code hard to read and verify. Using the "automatic" - type promotion policy will achieve the equivalent result - without these problems + linkend="safe_numerics.promotion_policy.models.automatic">automatic + type promotion policy will achieve the equivalent result without + these problems Since the result type is guaranteed to hold the result, there is no need to check for errors - they can't happen !!! The usage of "trap_exception" - exception policy enforces this guarantee + linkend="safe_numerics.exception_policy.models.trap_exception">trap_exception + exception policy enforces this guarantee @@ -150,8 +149,8 @@ long z = (long)x + (long)y; // can never overflow Depending on the application, it should be rare to generate error checking code, and even more rare to actually invoke it. Any such instances are detected by the "trap_exception" - exception policy . + linkend="safe_numerics.exception_policies.trap_exception">trap_exception + exception policy. This small example illustrates how to use automatic type promotion to eliminate all runtime penalty. @@ -171,14 +170,16 @@ z = <long>[-4294967296,4294967294] = 2147483649 display the underlying type and its range as well as current value. Note that: - automatic type promotion policy has rendered the result of the - some of two integers as a long - type. + the automatic + type promotion policy has rendered the result of the some of two + integers as a long type. - our program compiles without error - even when using the - trap_exception exception policy + our program compiles without error - even when using the trap_exception + exception policy @@ -204,9 +205,9 @@ z = <long>[-4294967296,4294967294] = 2147483649 a correct result. But since we trust no one, and since the program could change and the expressions be replaced with other ones, we'll still use the "trap_exception" - exception policy to verify at compile time that what we - "know" to be true is in fact true. + linkend="safe_numerics.exception_policies.trap_exception">trap_exception + exception policy to verify at compile time that what we "know" to be true + is in fact true. @@ -259,38 +260,42 @@ z = <signed char>[-24,82] = 77 - As before, we define a safe_t to reflect our view - of legal values for this program. This uses automatic type promotion - policy as well as trapping exception policy to enforce elimination - of runtime penalties. + As before, we define a type safe_t to reflect our + view of legal values for this program. This uses automatic + type promotion policy as well as trap_exception + exception policy to enforce elimination of runtime penalties. - The function f accepts only safe_t types so there is no need - to check the input values. This performs the functionality of - programming by - contract with no runtime cost. + The function f accepts only arguments of type + safe_t so there is no need to check the input values. + This performs the functionality of programming by contract with no + runtime cost. - In addition we define input_safe_t to be used + In addition, we define input_safe_t to be used when reading variables from the program console. Clearly, these can only be checked at runtime so they use the throw_exception policy. When variables are read from the console they are checked for legal - values. We need no hoc code to do this, as these types are + values. We need no ad hoc code to do this, as these types are guaranteed to contain legal values and will throw an exception when this guarantee is violated. In other words, we automatically get checking of input variables with no additional programming. - On calling of the function f with variables of type - input_safe_t are converted to variables of safe_t. In this - particular example, it can be determined at compile time that - construction of an instance of a safe_t from an input_safe_t can - never fail. Hence, no try/catch block is necessary. The usage of the - trap_exception policy for safe_t types would cause a compile time - error. + On calling of the function f, arguments of type + input_safe_t are converted to values of type + safe_t . In this particular example, it can be + determined at compile time that construction of an instance of a + safe_t from an input_safe_t can never + fail. Hence, no try/catch block is necessary. The usage + of the trap_exception policy for safe_t + types would cause a compile time error. Here is the output from the program when values 12 and 32 are input from the console: diff --git a/doc/boostbook/faq.xml b/doc/boostbook/faq.xml index f5e5405..1a585f4 100644 --- a/doc/boostbook/faq.xml +++ b/doc/boostbook/faq.xml @@ -16,9 +16,9 @@ This surprised me when it was first raised. But some of the feedback I've received makes me thing that it's a widely held view. - The best answer is to consider the cases in the section Tutorials and Motivating - Examples. + Examples section of the library documentation. @@ -33,9 +33,7 @@ counterparts should result in a program that will compile and run as expected. In some cases compile time errors will occur and adjustments to the source code will be required. Typically these will result in - code which is more correct. See drop-in - replacement. + code which is more correct. @@ -61,7 +59,7 @@ similar libraries. Maybe a better word might have been "correct" but that would raise similar concerns. I'm not inclined to change this. I've tried to make it clear in the documentation what the problem that - the library addressed is + the library addressed is. @@ -75,10 +73,10 @@ Actually, I believe that this can/should be applied to any type T which satisfies the type requirement "Numeric" type as defined in the documentation. So there should be specializations - safe<float> et. al. and eventually safe<fixed_decimal> - etc. But the current version of the library only addresses integer - types. Hopefully the library will evolve to match the promise implied - by its name. + safe<float> and related types as well as new types + like safe<fixed_decimal> etc. But the current + version of the library only addresses integer types. Hopefully the + library will evolve to match the promise implied by its name. @@ -113,22 +111,23 @@ - Why do you specialize numeric_limits for "safe" types? Do you - need it? + Why do you specialize numeric_limits for "safe" + types? Do you need it? - safe<T> behaves like a "number" just as int does. It has - max, min, etc Any code which uses numeric limits to test a type T - should works with safe<T>. safe<T> is a drop-in - replacement for T so it has to implement all the operations. + safe<T> behaves like a "number" just as int + does. It has max, min, etc Any code which uses numeric limits to test + a type T should works with safe<T>. + safe<T> is a drop-in replacement for T + so it has to implement all the operations. According to C/C++ standards, unsigned integers cannot overflow - - they are modular integers which "warp around". Yet the safe numerics + - they are modular integers which "wrap around". Yet the safe numerics library detects and traps this behavior as errors. Why is that? @@ -143,9 +142,10 @@ modulus for such an integer would vary depending upon the machine architecture. For these reasons, in the context of this library, an unsigned integer is considered to a representation of a subset of - integers. Note that this decision is consistent with INT30-C, “Ensure - that unsigned integer operations do not wrap” in the CERT C Secure - Coding Standard Seacord. + integers. Note that this decision is consistent with + INT30-C, “Ensure that unsigned integer operations + do not wrap” in the CERT C Secure Coding Standard + Seacord. @@ -156,7 +156,7 @@ The original version of the library used C++11. Feedback from - CPPCon, Boost Library + CPPCon, Boost Library Incubator and Boost developer's mailing list convinced me that I had to address the issue of run-time penalty much more seriously. I resolved to eliminate or minimize it. This led to more elaborate @@ -238,7 +238,7 @@ typedef long int32_t; This example illustrates how this library, implemented with C++14 can be useful in the development of correct code for programs - written in C. + written in C. diff --git a/doc/boostbook/notes.xml b/doc/boostbook/notes.xml index ed61ec2..5c8a288 100644 --- a/doc/boostbook/notes.xml +++ b/doc/boostbook/notes.xml @@ -6,7 +6,7 @@ This library is a re-implementation of the facilities provided by David LeBlanc's SafeInt - Library using C++14 and the Boost + Library using C++14 and the Boost Libraries. I found this library very well done in every way. My main usage was to run unit tests for my embedded systems projects on my PC. Still, I had a few issues. @@ -23,8 +23,8 @@ - It didn't use Boost conventions - for naming. + It didn't use Boost + conventions for naming. @@ -41,7 +41,7 @@ This version addresses these issues. It exploits Boost facilities such as template + url="http://www.boost.org">Boost facilities such as template metaprogramming to reduce the number of lines of source code to approximately 4700. It exploits the Boost Preprocessor Library to generate exhaustive tests. diff --git a/doc/boostbook/safe_introduction.xml b/doc/boostbook/safe_introduction.xml index a24e56e..05d1756 100644 --- a/doc/boostbook/safe_introduction.xml +++ b/doc/boostbook/safe_introduction.xml @@ -32,8 +32,8 @@ were designed to map closely to the underlying hardware. Computer hardware implements these types as a fixed number of bits. When the result of arithmetic operations exceeds this number of bits, the result will not be - arithmetically correct. The following example illustrates this - problem. + arithmetically correct. The following example illustrates just one example + where this causes problems. int f(int x, int y){ // this returns an invalid result for some legal values of x and y ! @@ -41,13 +41,14 @@ } - It is incumbent up the C/C++ programmer to guarantee that this + It is incumbent upon the C/C++ programmer to guarantee that this behavior does not result in incorrect or unexpected operation of the program. There are no language facilities which implement such a guarantee. A programmer needs to examine each expression individually to - know that his program will not return an invalid result.There are a number - of ways to do this. See INT32-C seems to recommend - the following approach: + know that his program will not return an invalid result. There are a + number of ways to do this. In the above instance, + INT32-C seems to recommend the following + approach: int f(int x, int y){ if (((y > 0) && (x > (INT_MAX - y))) @@ -74,12 +75,13 @@ This example addresses only the problem of undefined/erroneous behavior related to overflow of the addition operation as applied to the type int. Similar problems occur with other built-in integer - types such as unsigned, long, etc. And it also applies to other operations - such as subtraction, multiplication etc. . C/C++ often automatically and - silently converts some integer types to others in the course of - implementing binary operations and similar problems occur in this case as - well. Since the problems and their solution are similar, We'll confine the - current discussion to just this example. + types such as unsigned, long, etc. And it also + applies to other operations such as subtraction, multiplication etc. . + C/C++ often automatically and silently converts some integer types to + others in the course of implementing binary operations and similar + problems occur in this case as well. Since the problems and their solution + are similar, We'll confine the current discussion to just this one + example.
@@ -132,16 +134,17 @@ safe<int> f(safe<int> x, safe<int> y){
How It Works - The library implements special versions of int, unsigned, etc. named - safe<int>, safe<unsigned int> etc. - These behave exactly like the underlying types except that expressions using these types fulfill - the above guarantee. These types are meant to be "drop-in" replacements - for the built-in types they are meant to replace. So things which are - legal - such as assigning an signed to unsigned - value are not trapped at compile time - as they are legal C/C++ code. - Instead, they are checked at runtime to trap the case where this (legal) - operation would lead to an arithmetically incorrect result. + The library implements special versions of int, + unsigned, etc. named safe<int>, + safe<unsigned int> etc. These behave exactly like the + underlying types except that expressions + using these types fulfill the above guarantee. These types are meant to be + "drop-in" replacements for the built-in types they are meant to replace. + So things which are legal - such as assignment of a signed to + unsigned value - are not trapped at compile time as they are + legal C/C++ code. Instead, they are checked at runtime to trap the case + where this (legal) operation would lead to an arithmetically incorrect + result. Note that the library addresses arithmetical errors generated by straightforward C/C++ expressions. Some of these arithmetic errors are @@ -212,9 +215,9 @@ safe<int> f(safe<int> x, safe<int> y){ Enforce of other program requirements using ranged integer - types. The library includes types safe_range(Min, Max) - and safe_literal(N). These types can be used to improve - program correctness and performance. + types. The library includes the types safe_range(Min, + Max) and safe_literal(N). These types can be + used to improve program correctness and performance.
@@ -252,7 +255,7 @@ safe<int> f(safe<int> x, safe<int> y){ Enable_if - The safe numerics library is delivered with an exhaustive + The Safe Numerics library is delivered with an exhaustive suite of test programs. Users who choose to run this test suite will also need to install the Boost.Preprocessor library.
diff --git a/doc/html/acknowledgements.html b/doc/html/acknowledgements.html index d337fbd..cf7a935 100644 --- a/doc/html/acknowledgements.html +++ b/doc/html/acknowledgements.html @@ -29,22 +29,19 @@ and useful in my embedded systems work. This motivated me to take to the "next level".

+ Krzemienski

Andrzej Commented and reviewed the library as it was - originally posted on the Boost - Library Incubator. The the consequent back and forth - motivated me to invest more effort in developing documentation and - examples to justify the utility, indeed the necessity, for this - library. He also noted many errors in code, documentation, and - tests. Without his interested and effort, I do not believe the - library would have progressed beyond it's initial stages.

-
Boost
+ originally posted on the Boost Library Incubator. + The the consequent back and forth motivated me to invest more effort + in developing documentation and examples to justify the utility, + indeed the necessity, for this library. He also noted many errors in + code, documentation, and tests. Without his interested and effort, I + do not believe the library would have progressed beyond it's initial + stages.

+
Boost

As always, the Boost Developer's mailing list has been the source of many useful observations from potential users and - constructive criticism from very knowledgeable developers. Boost - also supplies a widely accepted list of standards and requirements - for quality software. Finally, the Boost infrastructure for testing, - documentation is close to indispensable.

+ constructive criticism from very knowledgeable developers.

diff --git a/doc/html/checked_integer_arithmetic.html b/doc/html/checked_integer_arithmetic.html index 41f3b16..728f631 100644 --- a/doc/html/checked_integer_arithmetic.html +++ b/doc/html/checked_integer_arithmetic.html @@ -21,18 +21,18 @@

Checked Integer Arithmetic

-Synopsis

+Synopsis
// safe casting on primitive types
 template<class R, class T>
 constexpr checked_result<R>
@@ -93,29 +93,29 @@
 
 

-Description

+Description

Perform binary operations on arithmetic types. Return either a valid result or an error code. Under no circumstances should an incorrect result be returned.

-Type requirements

+Type requirements

All template parameters of the functions must model Integer type requirements.

-Complexity

+Complexity

Each function performs one and only one arithmetic operation

-Header

+Header

#include "checked.hpp"

-Example of use

+Example of use

[A code fragment that illustrates how to use the function.]

#include "checked.hpp"
 
@@ -124,7 +124,7 @@
 
 

-Notes

+Notes

Some compilers have command line switches (e.g. -ftrapv) which enable special behavior such erroneous integer operations are detected at run time. The library has been implemented in such a way that these @@ -134,7 +134,7 @@

-See Also

+See Also

checked_result<typename R>

diff --git a/doc/html/checked_result.html b/doc/html/checked_result.html index 5d46036..f7db9d2 100644 --- a/doc/html/checked_result.html +++ b/doc/html/checked_result.html @@ -21,17 +21,17 @@

checked_result<typename R>

-Description

+Description

checked_result is a wrapper class designed to hold result of some operation. It can hold either the result of the operation or information on why the operation failed to produce a valid result. Note that this type @@ -40,7 +40,7 @@

-Template Parameters

+Template Parameters

The sole template parameter is the return type of some operation.

@@ -66,7 +66,7 @@

-Notation

+Notation
@@ -103,7 +103,7 @@

-Valid Expressions

+Valid Expressions

All expressions are constexpr.

@@ -173,12 +173,12 @@

-Header

+Header

#include "checked_result.hpp"

-Example of use

+Example of use
#include "checked_result.hpp"
 
 template<class R>
@@ -198,7 +198,7 @@
 
 

-See Also

+See Also

ExceptionPolicy

diff --git a/doc/html/concepts.html b/doc/html/concepts.html index bb2ee45..04ee5f7 100644 --- a/doc/html/concepts.html +++ b/doc/html/concepts.html @@ -6,7 +6,7 @@ - + diff --git a/doc/html/eliminate_runtime_penalty/1.html b/doc/html/eliminate_runtime_penalty/1.html index d15a25c..4a91bdc 100644 --- a/doc/html/eliminate_runtime_penalty/1.html +++ b/doc/html/eliminate_runtime_penalty/1.html @@ -32,9 +32,14 @@

So the result of the sum of two integer types may result in another integer type. If the values are large, the result can exceed the size that - the resulting integer type can hold. This is what we call "overflow". - Standard C/C++ does just truncates the result to fit into the result type - - which sometimes will make the result arithmetically incorrect.

+ the resulting integer type can hold. This is what we call "overflow". The + C/C++ standard characterises this as undefined behavior and leaves to + compiler implementors the decision as to how such a situation will be + handled. Usually, this means just truncating the result to fit into the + result type - which sometimes will make the result arithmetically + incorrect. However, depending on the compiler, compile time switch + settings, the such case may result in some sort of run time + exception.

The complete signature for a safe integer type is:

template <
     class T,                  // underlying integer type
@@ -44,18 +49,16 @@
 safe;
 

The standard C++ type promotion rules are consistent with the - default "native" type - promotion policy. Up until now, we've focused on detecting when - this happens and invoking an interrupt or other kind of error - handler.

-

But now we look at another option. Using the "automatic" type - promotion policy, we can change the rules of C++ arithmetic for - safe types to something like the following:

+ default native + type promotion policy. Up until now, we've focused on detecting when this + happens and invoking an interrupt or other kind of error handler.

+

But now we look at another option. Using the automatic + type promotion policy, we can change the rules of C++ arithmetic for safe + types to something like the following:

  • for any C++ numeric type, we know from - std::numeric::limits what the maximum and minimum - values that a variable can be - this defines a closed - interval.

  • + std::numeric_limits what the maximum and minimum values + that a variable can be - this defines a closed interval.

  • For any binary operation on these types, we can calculate the interval of the result at compile time.

  • @@ -69,14 +72,14 @@ long z = (long)x + (long)y; // can never overflow

One could do this by editing his code manually, but such a task would be tedious, error prone, and leave the resulting code - hard to read and verify. Using the "automatic" - type promotion policy will achieve the equivalent result - without these problems

+ hard to read and verify. Using the automatic + type promotion policy will achieve the equivalent result without + these problems

  • Since the result type is guaranteed to hold the result, there is no need to check for errors - they can't happen !!! The usage of - "trap_exception" - exception policy enforces this guarantee

  • + trap_exception + exception policy enforces this guarantee

  • Since there can be no errors, there is no need for try/catch blocks.

  • The only runtime error checking we need to do is when safe @@ -96,8 +99,8 @@ this case, and only this case, is runtime error checking code generated. Depending on the application, it should be rare to generate error checking code, and even more rare to actually invoke it. Any such instances are - detected by the "trap_exception" - exception policy .

    + detected by the trap_exception + exception policy.

    This small example illustrates how to use automatic type promotion to eliminate all runtime penalty.

    #include <iostream>
    @@ -134,11 +137,11 @@ z = <long>[-4294967296,4294967294] = 2147483649
         display the underlying type and its range as well as current value. Note
         that:

      -
    • automatic type promotion policy has rendered the result of the - some of two integers as a long - type.

    • -
    • our program compiles without error - even when using the - trap_exception exception policy

    • +
    • the automatic + type promotion policy has rendered the result of the some of two + integers as a long type.

    • +
    • our program compiles without error - even when using the trap_exception + exception policy

    • We do not need to use try/catch idiom to handle arithmetic errors - we will have none.

    • We only needed to change two lines of code to achieve our diff --git a/doc/html/eliminate_runtime_penalty/2.html b/doc/html/eliminate_runtime_penalty/2.html index 8c4d92f..1a2d210 100644 --- a/doc/html/eliminate_runtime_penalty/2.html +++ b/doc/html/eliminate_runtime_penalty/2.html @@ -24,12 +24,12 @@

      Instead of relying on automatic type promotion, we can just create our own types in such a way that we know they won't overflow. In the example below, we presume we know that the values we want to work with - fall in the closed range of -24,82. So we "know" the program will always - result in a correct result. But since we trust no one, and since the - program could change and the expressions be replaced with other ones, - we'll still use the "trap_exception" - exception policy to verify at compile time that what we - "know" to be true is in fact true.

      + fall in the range [-24,82]. So we "know" the program will always result in + a correct result. But since we trust no one, and since the program could + change and the expressions be replaced with other ones, we'll still use + the trap_exception + exception policy to verify at compile time that what we "know" to be true + is in fact true.

      #include <iostream>
       
       #include "../include/safe_range.hpp"
      @@ -40,10 +40,10 @@
       
       using namespace boost::numeric; // for safe_literal
       
      -// create a type for holding small integers.  We "know" that C++ type
      -// promotion rules will work such that operations on this type
      -// will never overflow. If change the program to break this, the
      -// usage of the trap_exception promotion policy will prevent compilation.
      +// create a type for holding small integers.  We "know" that C++
      +// type promotion rules will work such that addition will never
      +// overflow. If we change the program to break this, the usage
      +// of the trap_exception promotion policy will prevent compilation.
       using safe_t = safe_signed_range<
           -24,
           82,
      @@ -53,8 +53,13 @@
       
       int main(int argc, const char * argv[]){
           std::cout << "example 83:\n";
      -    const safe_signed_literal<2> x;
      -    const safe_signed_literal<2> y;
      +    // the following would result in a compile time error
      +    // since the sum of x and y wouldn't be in the legal
      +    // range for z.
      +    // const safe_signed_literal<20> x;
      +    const safe_signed_literal<10> x;    // no problem
      +    const safe_signed_literal<67> y;
      +
           const safe_t z = x + y;
           std::cout << "x = " << safe_format(x) << std::endl;
           std::cout << "y = " << safe_format(y) << std::endl;
      @@ -62,40 +67,28 @@
           return 0;
       }
       
      -

      which produces the following output.

      -
      example 83:
      -x = <signed char>[-24,82] = 2
      -y = <signed char>[-24,82] = 2
      -z = (x + y) = <int>[-48,164] = 4
      -(x - y) = <int>[-106,106] = 0
      -<int>[-48,164] = 4
        -
      • In this example, standard C++ type promotion rules are used. - These promote operands to int before invoking the addition operation. - So addition operation itself won't overflow. The result of addition is - another unnamed safe type guaranteed to be able to hold the some of - any pair of safe types. In this example the result is a safe type - based on the C++ built-in type of short.

      • -
      • So when we try to assign the result to z we could get an error. - This is because our custom safe_t cannot be guaranteed to - hold the some of all possible pairs of safe_t instances. - We fix the by using an "auto" for the sum.

      • -
      • We now have a problem when we try to initialize our - safe_t variable with an initial literal value. This - operation could overflow at runtime. To our disappointment, our - attempt to fix the problem by using constexpr fails. The - fix for this is to use safe_literal to initialize safe - types. safe_literal is a special safe type which wraps a constant - defined at compile time. It cannot be initialized, assigned to, or - changed. Subject to this restriction, it can participate in safe - arithmetic operations.

      • +
      • safe_signed_range defines a type + which is limited to the indicated range. Out of range assignments + will be detected at compile time if possible (as in this case) or at + run time if necessary.

      • +
      • safe_literal defines a constant with a specific + value. Defining constants in this way enables the library to + correctly anticipate the range of the results of arithmetic + expressions.

      • +
      • The usage of "trap exception" will mean that any assignment to + z which could be outside the legal range will result in a compile + time error.

      • +
      • So if this program compiles, it's guaranteed to return a valid + result.

      -

      We've used simple expressions in this illustration. But since binary - operations on safe types result in other safe types, expressions can be - made arbitrarily elaborate - just as they can be with intrinsic integer - types. That is, safe integer types are drop in replacements for intrinsic - integer types. We are guaranteed never to produce an incorrect result - regardless of how elaborate the expression might be.

      +

      This program produces the following run time + output.

      +
      example 83:
      +x = <signed char>[10,10] = 10
      +y = <signed char>[67,67] = 67
      +z = <signed char>[-24,82] = 77
      +
  • diff --git a/doc/html/eliminate_runtime_penalty/3.html b/doc/html/eliminate_runtime_penalty/3.html index 5b68695..5f07f19 100644 --- a/doc/html/eliminate_runtime_penalty/3.html +++ b/doc/html/eliminate_runtime_penalty/3.html @@ -7,7 +7,7 @@ - +
    @@ -77,29 +77,30 @@ }
      -
    • As before, we define a safe_t to reflect our view - of legal values for this program. This uses automatic type promotion - policy as well as trapping exception policy to enforce elimination - of runtime penalties.

    • -
    • The function f accepts only safe_t types so there is no need - to check the input values. This performs the functionality of - programming by - contract with no runtime cost.

    • -
    • In addition we define input_safe_t to be used +

    • As before, we define a type safe_t to reflect our + view of legal values for this program. This uses automatic + type promotion policy as well as trap_exception + exception policy to enforce elimination of runtime penalties.

    • +
    • The function f accepts only arguments of type + safe_t so there is no need to check the input values. + This performs the functionality of programming by contract with no + runtime cost.

    • +
    • In addition, we define input_safe_t to be used when reading variables from the program console. Clearly, these can only be checked at runtime so they use the throw_exception policy. When variables are read from the console they are checked for legal - values. We need no hoc code to do this, as these types are + values. We need no ad hoc code to do this, as these types are guaranteed to contain legal values and will throw an exception when this guarantee is violated. In other words, we automatically get checking of input variables with no additional programming.

    • -
    • On calling of the function f with variables of type - input_safe_t are converted to variables of safe_t. In this - particular example, it can be determined at compile time that - construction of an instance of a safe_t from an input_safe_t can - never fail. Hence, no try/catch block is necessary. The usage of the - trap_exception policy for safe_t types would cause a compile time - error.

    • +
    • On calling of the function f, arguments of type + input_safe_t are converted to values of type + safe_t . In this particular example, it can be + determined at compile time that construction of an instance of a + safe_t from an input_safe_t can never + fail. Hence, no try/catch block is necessary. The usage + of the trap_exception policy for safe_t + types would cause a compile time error.

    Here is the output from the program when values 12 and 32 are input from the console:

    diff --git a/doc/html/exception_policies/ignore.html b/doc/html/exception_policies/ignore.html index 2354fdd..b40b1f2 100644 --- a/doc/html/exception_policies/ignore.html +++ b/doc/html/exception_policies/ignore.html @@ -22,7 +22,7 @@ ignore_exception
    -Description
    +Description

    This exception policy can be used to just ignore conditions which generate incorrect arithmetic results and continue processing. Programs using this policy along with the native promotion policy @@ -30,19 +30,19 @@

    -Model of
    +Model of

    ExceptionPolicy

    -Header
    +Header

    #include <boost/safe_numerics/exception_policy.hpp>

    -Example of use
    +Example of use
    safe<int, native, ignore_exception> st(4);
    diff --git a/doc/html/exception_policies/no_exception_support.html b/doc/html/exception_policies/no_exception_support.html index b238fd4..21385d6 100644 --- a/doc/html/exception_policies/no_exception_support.html +++ b/doc/html/exception_policies/no_exception_support.html @@ -22,7 +22,7 @@ no_exception_support<O, U = O, R =O, D = O>
    -Description
    +Description

    This exception policy can be used in an environment where one cannot or does not want to use exceptions.

    Parameters are pointers to static functions which are invoked for @@ -33,7 +33,7 @@

    -Template Parameters
    +Template Parameters

    Function objects to be invoked are specified for each error condition are specified via template parameters.

    @@ -79,19 +79,19 @@
    -Model of
    +Model of

    ExceptionPolicy

    -Header
    +Header

    #include <boost/safe_numerics/exception_policy.hpp>

    -Example of use
    +Example of use

    [A code fragment involving the type.]

    void overflow(const char * msg);
     void underflow(const char * msg);
    diff --git a/doc/html/exception_policies/throw_exception.html b/doc/html/exception_policies/throw_exception.html
    index 947fc67..18cd0bd 100644
    --- a/doc/html/exception_policies/throw_exception.html
    +++ b/doc/html/exception_policies/throw_exception.html
    @@ -29,19 +29,19 @@
     
     
    -Model of
    +Model of

    ExceptionPolicy

    -Header
    +Header

    #include <boost/safe_numerics/exception_policies.hpp>

    -Example of use
    +Example of use

    This example is somewhat contrived as throw_exception is the default for safe types. Hence it usually is not necessarily to request it explicitly.

    diff --git a/doc/html/exception_policies/trap_exception.html b/doc/html/exception_policies/trap_exception.html index b92dead..1cf81ad 100644 --- a/doc/html/exception_policies/trap_exception.html +++ b/doc/html/exception_policies/trap_exception.html @@ -22,7 +22,7 @@ trap_exception
    -Description
    +Description

    This exception policy will trap at compile time any operation COULD result in a runtime exception. It can be used in an environment which can tolerate @@ -31,19 +31,19 @@

    -Model of
    +Model of

    ExceptionPolicy

    -Header
    +Header

    #include <boost/safe_numerics/exception_policy.hpp>

    -Example of use
    +Example of use

    The following

    #include "../../include/safe_integer.hpp"
     #include "../../include/automatic.hpp"
    diff --git a/doc/html/exception_policy.html b/doc/html/exception_policy.html
    index c7f09ca..ef9104b 100644
    --- a/doc/html/exception_policy.html
    +++ b/doc/html/exception_policy.html
    @@ -21,15 +21,15 @@
     

    ExceptionPolicy<EP>

    -Description

    +Description

    The exception policy specifies what is to occur when a safe operation cannot return a valid arithmetic result. A type is an ExceptionPolicy if it has functions for handling exceptional events that @@ -37,7 +37,7 @@

    -Notation

    +Notation
    @@ -59,7 +59,7 @@

    -Valid Expressions

    +Valid Expressions

    Any operations which result in integers which cannot be represented as some Numeric type will throw an exception.

    @@ -114,14 +114,14 @@

    -Header

    +Header

    #include <safe_numerics/include/concepts/exception_policy.hpp>

    -Models

    +Models

    The library header <safe_numerics/include/exception_policies.hpp> contains a number of pre-made exception policies:

    This enum holds the information regarding a failed operation.

    -Notation

    +Notation
    @@ -69,7 +69,7 @@

    -Valid Expressions

    +Valid Expressions
    @@ -102,20 +102,20 @@

    -dispatch<EP>(const exception_type & e, const char * +dispatch<EP>(const exception_type & e, const char * msg)

    This function is used to invoke the exception handling policy for a particular exception_type.

    -Synopsis
    +Synopsis
    template<class EP>
     constexpr void
     dispatch<EP>(const exception_type & e, const char * msg);
    -Example of use
    +Example of use
    #include "exception_policy.hpp"
     
     dispatch(overflow_error, "operation resulted in overflow");
    @@ -123,7 +123,7 @@

    -See Also

    +See Also

    ExceptionPolicy

    diff --git a/doc/html/index.html b/doc/html/index.html index 20304bf..af2fd31 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -22,7 +22,7 @@
    @@ -33,7 +33,7 @@
    Problem
    Solution
    -
    Implementation
    +
    How It Works
    Additional Features
    Requirements
    Scope
    @@ -55,7 +55,7 @@
    Using safe_range
    Mixing Approaches
    -
    Notes
    +
    Background
    Type Requirements
    Numeric<T>
    diff --git a/doc/html/integer.html b/doc/html/integer.html index 1112d98..6fa5dd9 100644 --- a/doc/html/integer.html +++ b/doc/html/integer.html @@ -21,16 +21,16 @@

    Integer<T>

    -Description

    +Description

    A type is fulfills the requirements of an Integer if it has the properties of a integer.

    More specifically, a type T is Integer if there exists @@ -47,12 +47,12 @@

    -Refinement of

    +Refinement of

    Numeric

    -Notation

    +Notation
    @@ -72,11 +72,11 @@

    -Valid Expressions

    +Valid Expressions

    In addition to the expressions defined in Numeric the following expressions must be valid.

    -

    Table 4. General

    +

    Table 4. General

    @@ -167,13 +167,13 @@

    -Header

    +Header

    #include <safe_numerics/include/concepts/integer.hpp>

    -Models

    +Models

    int, safe<int>, safe_unsigned_range<0, 11>, etc.

    diff --git a/doc/html/interval.html b/doc/html/interval.html index 785e2a3..b9a80c3 100644 --- a/doc/html/interval.html +++ b/doc/html/interval.html @@ -21,28 +21,28 @@

    interval<typename R>

    -Description

    +Description

    A closed arithmetic interval represented by a pair of elements of type R.

    -Template Parameters

    +Template Parameters

    R must model the type requirements Numeric

    -Notation

    +Notation
    @@ -82,7 +82,7 @@

    -Associated Types

    +Associated Types
    @@ -97,7 +97,7 @@

    -Valid Expressions

    +Valid Expressions

    Note that all expressions are constexpr .

    @@ -231,12 +231,12 @@

    -Header

    +Header

    #include "interval.hpp"

    -Example of use

    +Example of use
    #include <iostream>
     #include <cstdint>
     #include <cassert>
    diff --git a/doc/html/introduction.html b/doc/html/introduction.html
    index 79bbfe8..2a28e4d 100644
    --- a/doc/html/introduction.html
    +++ b/doc/html/introduction.html
    @@ -23,7 +23,7 @@
     
    Problem
    Solution
    -
    Implementation
    +
    How It Works
    Additional Features
    Requirements
    Scope
    @@ -44,20 +44,21 @@ were designed to map closely to the underlying hardware. Computer hardware implements these types as a fixed number of bits. When the result of arithmetic operations exceeds this number of bits, the result will not be - arithmetically correct. The following example illustrates this - problem.

    + arithmetically correct. The following example illustrates just one example + where this causes problems.

    int f(int x, int y){
         // this returns an invalid result for some legal values of x and y !
         return x + y;
     }
     
    -

    It is incumbent up the C/C++ programmer to guarantee that this +

    It is incumbent upon the C/C++ programmer to guarantee that this behavior does not result in incorrect or unexpected operation of the program. There are no language facilities which implement such a - guarantee. A programmer needs to each expression individually to know that - his program will not return an invalid result.There are a number of ways - to do this. See [INT32-C] seems to recommend the - following approach:

    + guarantee. A programmer needs to examine each expression individually to + know that his program will not return an invalid result. There are a + number of ways to do this. In the above instance, + [INT32-C] seems to recommend the following + approach:

    int f(int x, int y){
       if (((y > 0) && (x > (INT_MAX - y))) 
       || ((y < 0) && (x < (INT_MIN - y)))) {
    @@ -80,12 +81,13 @@
     

    This example addresses only the problem of undefined/erroneous behavior related to overflow of the addition operation as applied to the type int. Similar problems occur with other built-in integer - types such as unsigned, long, etc. And it also applies to other operations - such as subtraction, multiplication etc. . C/C++ often automatically and - silently converts some integer types to others in the course of - implementing binary operations and similar problems occur in this case as - well. Since the problems and their solution are similar, We'll confine the - current discussion to just this example.

    + types such as unsigned, long, etc. And it also + applies to other operations such as subtraction, multiplication etc. . + C/C++ often automatically and silently converts some integer types to + others in the course of implementing binary operations and similar + problems occur in this case as well. Since the problems and their solution + are similar, We'll confine the current discussion to just this one + example.

    @@ -128,16 +130,18 @@

    -Implementation

    -

    The library implements special versions of int, unsigned, etc. named - safe<int>, safe<unsigned int> etc. - These behave exactly like the underlying types except that expressions using these types fulfill - the above guarantee. These types are meant to be "drop-in" replacements - for the built-in types they are meant to replace. So things which are - legal - such as assigning an signed to unsigned - value are not trapped at compile time - as they are legal C/C++ code. - Instead, they are checked at runtime to trap the case where this (legal) - operation would lead to an arithmetically incorrect result.

    +How It Works
    +

    The library implements special versions of int, + unsigned, etc. named safe<int>, + safe<unsigned int> etc. These behave exactly like the + underlying types except that expressions + using these types fulfill the above guarantee. These types are meant to be + "drop-in" replacements for the built-in types they are meant to replace. + So things which are legal - such as assignment of a signed to + unsigned value - are not trapped at compile time as they are + legal C/C++ code. Instead, they are checked at runtime to trap the case + where this (legal) operation would lead to an arithmetically incorrect + result.

    Note that the library addresses arithmetical errors generated by straightforward C/C++ expressions. Some of these arithmetic errors are defined as conforming to the C/C++ standards while others are not. So @@ -187,9 +191,9 @@

  • Enforce of other program requirements using ranged integer - types. The library includes types safe_range(Min, Max) and - safe_literal(N). These types can be used to improve program - correctness and performance.

  • + types. The library includes the types safe_range(Min, + Max) and safe_literal(N). These types can be + used to improve program correctness and performance.

    @@ -207,7 +211,7 @@
  • Tribool

  • Enable_if

  • -

    The safe numerics library is delivered with an exhaustive +

    The Safe Numerics library is delivered with an exhaustive suite of test programs. Users who choose to run this test suite will also need to install the Boost.Preprocessor library.

    diff --git a/doc/html/notes.html b/doc/html/notes.html index 33116bd..605936d 100644 --- a/doc/html/notes.html +++ b/doc/html/notes.html @@ -1,7 +1,7 @@ -Notes +Background @@ -19,10 +19,10 @@

    -Notes

    +Background

    This library is a re-implementation of the facilities provided by David LeBlanc's SafeInt - Library using C++14 and the Boost + Library using C++14 and the Boost Libraries. I found this library very well done in every way. My main usage was to run unit tests for my embedded systems projects on my PC. Still, I had a few issues.

    @@ -31,13 +31,13 @@ understand, modify and maintain.

  • I couldn't find separate documentation other than that in the header file.

  • -
  • It didn't use Boost conventions - for naming.

  • +
  • It didn't use Boost + conventions for naming.

  • It required porting to different compilers.

  • It had a very long license associated with it.

  • I could find no test suite for the library.

  • -

    This version addresses these issues. It exploits Boost facilities such as template +

    This version addresses these issues. It exploits Boost facilities such as template metaprogramming to reduce the number of lines of source code to approximately 4700. It exploits the Boost Preprocessor Library to generate exhaustive tests.

    diff --git a/doc/html/numeric.html b/doc/html/numeric.html index e4b1960..e97758f 100644 --- a/doc/html/numeric.html +++ b/doc/html/numeric.html @@ -22,11 +22,11 @@ Numeric<T>

    @@ -45,7 +45,7 @@

    -Notation

    +Notation
    @@ -73,7 +73,7 @@

    -Associated Types

    +Associated Types
    @@ -90,13 +90,13 @@

    -Valid Expressions

    +Valid Expressions

    In addition to the expressions defined in Assignable the following expressions must be valid. Any operations which result in integers which cannot be represented as some Numeric type will throw an exception.

    -

    Table 1. General

    +

    Table 1. General

    @@ -134,7 +134,7 @@


    -

    Table 2. Unary Operators

    +

    Table 2. Unary Operators

    @@ -181,7 +181,7 @@

    -

    Table 3. Binary Operators

    +

    Table 3. Binary Operators

    @@ -282,13 +282,13 @@

    -Header

    +Header

    #include <safe_numerics/include/concepts/numeric.hpp>

    -Models

    +Models

    int, float, safe_signed_integer<int>, safe_signed_range<int>, etc.

    diff --git a/doc/html/pending_issues.html b/doc/html/pending_issues.html index 7eb35bd..70aa21c 100644 --- a/doc/html/pending_issues.html +++ b/doc/html/pending_issues.html @@ -32,7 +32,7 @@ converted to the specified integer type. In other words, strtoi already contains some of the functionality that safe<int> provides.

    -
  • Although care was taking to make the library portable, it's +

  • Although care has been taken to make the library portable, it's likely that at least some parts of the implementation - particularly checked arithmetic - depend upon two's complement representation of integers. Hence the library is probably not diff --git a/doc/html/promotion_policies/automatic.html b/doc/html/promotion_policies/automatic.html index 08fe261..1437e95 100644 --- a/doc/html/promotion_policies/automatic.html +++ b/doc/html/promotion_policies/automatic.html @@ -22,24 +22,24 @@ automatic

    -Description
    +Description

    This type contains the functions to return a type with sufficient capacity to hold the result of a given arithmetic operation.

    -Model of
    +Model of

    PromotionPolicy

    -Header
    +Header

    #include <boost/safe_numerics/automatic.hpp>

    -Example of use
    +Example of use

    The following example illustrates the automatic type being passed as a template parameter for the type safe<int>.

    diff --git a/doc/html/promotion_policies/cpp.html b/doc/html/promotion_policies/cpp.html index 8babf41..11b2855 100644 --- a/doc/html/promotion_policies/cpp.html +++ b/doc/html/promotion_policies/cpp.html @@ -22,7 +22,7 @@ cpp<int C, int S, int I, int L, int LL>
    -Description
    +Description

    This policy is used to promote safe types in arithmetic expressions according the standard rules in the C++ standard. But rather than using the native C++ standard types supported by the compiler, it uses types @@ -37,7 +37,7 @@

    -Template Parameters
    +Template Parameters
  • @@ -80,18 +80,18 @@
    -Model of
    +Model of

    PromotionPolicy

    -Header
    +Header

    #include <boost/safe_numerics/cpp.hpp>

    -Example of Use
    +Example of Use

    Consider the following problem. One is developing software which uses a very small microprocessor and a very limited C compiler. The chip is so small, you can't print anything from the code, log, debug or diff --git a/doc/html/promotion_policies/native.html b/doc/html/promotion_policies/native.html index 8ad4fcb..3bcdb9d 100644 --- a/doc/html/promotion_policies/native.html +++ b/doc/html/promotion_policies/native.html @@ -22,7 +22,7 @@ native

    -Description
    +Description

    This type contains the functions to return a safe type corresponding to the C++ type resulting for a given arithmetic operation.

    Usage of this policy with safe types will produce the exact same @@ -33,7 +33,7 @@

    -Model of
    +Model of

    PromotionPolicy

    As an example of how this works consider C++ rules from section 5 of the standard - "usual arithmetic conversions".

    @@ -52,14 +52,14 @@
    -Header
    +Header

    #include <boost/safe_numerics/include/native.hpp>

    -Example of use
    +Example of use

    The following example illustrates the native type being passed as a template parameter for the type safe<int>. This example is slightly contrived in that safe<int> @@ -97,7 +97,7 @@

    -Notes
    +Notes

    See Chapter 5, Expressions, C++ Standard

    diff --git a/doc/html/promotion_policy.html b/doc/html/promotion_policy.html index 49f1f1e..201e6f0 100644 --- a/doc/html/promotion_policy.html +++ b/doc/html/promotion_policy.html @@ -21,15 +21,15 @@

    PromotionPolicy<PP>

    -Description

    +Description

    In C++, arithmetic operations result in types which may or may not be the same as the constituent types. A promotion policy determines the type of the result of an arithmetic operation. For example, in the @@ -44,7 +44,7 @@

    -Notation

    +Notation
    @@ -69,7 +69,7 @@

    -Valid Expressions

    +Valid Expressions

    Any operations which result in integers which cannot be represented as some Numeric type will throw an exception.

    @@ -123,14 +123,14 @@

    -Header

    +Header

    #include <safe_numerics/include/concepts/promotion_policy.hpp>

    -Models

    +Models

    The library contains a number of pre-made promotion policies:

    + The best answer is to consider the examples in the Tutorials and Motivating + Examples section of the library documentation.

    @@ -93,12 +93,11 @@ counterparts should result in a program that will compile and run as expected. In some cases compile time errors will occur and adjustments to the source code will be required. Typically these will result in - code which is more correct. See drop-in - replacement.

    + code which is more correct.

    @@ -109,7 +108,7 @@ @@ -120,11 +119,11 @@ similar libraries. Maybe a better word might have been "correct" but that would raise similar concerns. I'm not inclined to change this. I've tried to make it clear in the documentation what the problem that - the library addressed is

    + the library addressed is.

    @@ -134,14 +133,14 @@ + safe<float> and related types as well as new types + like safe<fixed_decimal> etc. But the current + version of the library only addresses integer types. Hopefully the + library will evolve to match the promise implied by its name.

    @@ -156,7 +155,7 @@ - + - + @@ -202,20 +202,21 @@ modulus for such an integer would vary depending upon the machine architecture. For these reasons, in the context of this library, an unsigned integer is considered to a representation of a subset of - integers. Note that this decision is consistent with INT30-C, “Ensure - that unsigned integer operations do not wrap” in the CERT C Secure - Coding Standard [Seacord].

    + integers. Note that this decision is consistent with + [INT30-C], “Ensure that unsigned integer operations + do not wrap” in the CERT C Secure Coding Standard + [Seacord].

    @@ -288,7 +289,7 @@

    This example illustrates how this library, implemented with C++14 can be useful in the development of correct code for programs - written in C.

    + written in C.

    diff --git a/doc/html/safe.html b/doc/html/safe.html index 36335d8..cc59c50 100644 --- a/doc/html/safe.html +++ b/doc/html/safe.html @@ -21,25 +21,25 @@

    safe<T, PP, EP>

    -Description

    +Description

    A safe<T, PP , EP> can be used anywhere a type T can be used. Any expression which uses this type is guaranteed to return an arithmetically correct value or trap in some way.

    -Notation

    +Notation
    -

    1.

    +

    1.

    Is this really necessary? If I'm writing the program with the requisite care and competence, problems noted in the introduction will @@ -77,12 +77,12 @@

    This surprised me when it was first raised. But some of the feedback I've received makes me thing that it's a widely held view. - The best answer is to consider the cases in the section Tutorials and Motivating - Examples.

    -

    2.

    +

    2.

    Can safe types be used as drop-in replacement for built-in types?

    -

    3.

    +

    3.

    Why is Boost.Convert not used?

    -

    4.

    +

    4.

    Why is the library named "safe ..." rather than something like "checked ..." ?

    -

    5.

    +

    5.

    Given that the library is called "numerics" why is floating point arithmetic not addressed?

    Actually, I believe that this can/should be applied to any type T which satisfies the type requirement "Numeric" type as defined in the documentation. So there should be specializations - safe<float> et. al. and eventually safe<fixed_decimal> - etc. But the current version of the library only addresses integer - types. Hopefully the library will evolve to match the promise implied - by its name.

    -

    6.

    +

    6.

    Isn't putting a defensive check just before any potential undefined behavior is often considered a bad practice?

    -

    7.

    +

    7.

    It looks like the implementation presumes two's complement arithmetic at the hardware level. So this library is not portable - @@ -170,24 +169,25 @@

    -

    8.

    +

    8.

    Why do you specialize numeric_limits for "safe" types? Do you - need it?

    Why do you specialize numeric_limits for "safe" + types? Do you need it?

    safe<T> behaves like a "number" just as int does. It has - max, min, etc Any code which uses numeric limits to test a type T - should works with safe<T>. safe<T> is a drop-in - replacement for T so it has to implement all the operations.

    safe<T> behaves like a "number" just as int + does. It has max, min, etc Any code which uses numeric limits to test + a type T should works with safe<T>. + safe<T> is a drop-in replacement for T + so it has to implement all the operations.

    -

    9.

    +

    9.

    According to C/C++ standards, unsigned integers cannot overflow - - they are modular integers which "warp around". Yet the safe numerics + - they are modular integers which "wrap around". Yet the safe numerics library detects and traps this behavior as errors. Why is that?

    -

    10.

    +

    10.

    Why does the library require C++14?

    The original version of the library used C++11. Feedback from - CPPCon, Boost Library + CPPCon, Boost Library Incubator and Boost developer's mailing list convinced me that I had to address the issue of run-time penalty much more seriously. I resolved to eliminate or minimize it. This led to more elaborate @@ -232,7 +233,7 @@

    -

    11.

    +

    11.

    This is a C++ library - yet you refer to C/C++. Which is it?

    @@ -58,7 +58,7 @@

    -Associated Types

    +Associated Types
    @@ -80,7 +80,7 @@

    -Template Parameters

    +Template Parameters
    @@ -116,13 +116,13 @@

    -Model of

    +Model of

    Integer

    SafeNumeric

    -Valid Expressions

    +Valid Expressions

    Implements all expressions and only those expressions defined by the SafeNumeric type requirements. This, the result type of such an expression will be another @@ -131,13 +131,13 @@

    -Header

    +Header

    #include <boost/safe_numerics/safe_integer.hpp>

    -Examples of use

    +Examples of use

    The most common usage would be safe<T> which uses the default promotion and exception policies. This type is meant to be a "drop-in" replacement of the intrinsic integer types. That is, expressions involving @@ -203,7 +203,7 @@

    -Guarantee correct behavior at compile time.
    +Guarantee correct behavior at compile time.

    In some instance catching an error at run time is not sufficient. We want to be sure that the program can never fail. To achieve this, use the trap_exception exception policy rather than the default throw @@ -227,7 +227,7 @@

    -Adjust type promotion rules.
    +Adjust type promotion rules.

    Another way to avoid arithmetic errors like overflow is to promote types to larger sizes before doing the arithmetic. This can be justified by the observe

    diff --git a/doc/html/safe_literal.html b/doc/html/safe_literal.html index 378d568..7b08929 100644 --- a/doc/html/safe_literal.html +++ b/doc/html/safe_literal.html @@ -22,17 +22,17 @@ safe_signed_literal<Value, PP , EP> and safe_unsigned_literal<Value, PP, EP>

    -Description

    +Description

    A safe type which holds a literal value. This is required to be able to initialize other safe type in such a way that exception code is not generated. It is also useful when creating constexpr versions of safe @@ -41,7 +41,7 @@

    -Associated Types

    +Associated Types
    @@ -63,7 +63,7 @@

    -Template Parameters

    +Template Parameters
    @@ -97,14 +97,14 @@

    -Model of

    +Model of

    Integer

    SafeNumeric

    LiteralType

    -Inherited Valid Expressions

    +Inherited Valid Expressions

    SafeLiteral types are immutable. Hence they only inherit those valid expressions which don't change the value. The excludes assignment, increment, and decrement operators. Other than that, they can be used @@ -112,13 +112,13 @@

    -Header

    +Header

    #include <safe/numeric/safe_literal.hpp>

    -Example of use

    +Example of use
    #include <safe/numeric/safe_literal.hpp>
     
     constexpr boost::numeric::safe_signed_literal<42> x;
    diff --git a/doc/html/safe_numeric_concept.html b/doc/html/safe_numeric_concept.html
    index 8d52273..1c6a8b2 100644
    --- a/doc/html/safe_numeric_concept.html
    +++ b/doc/html/safe_numeric_concept.html
    @@ -21,18 +21,18 @@
     

    SafeNumeric<T>

    -Description

    +Description

    This holds an arithmetic value which can be used as a replacement for built-in C++ arithmetic values. These types differ from their built-in counter parts in that the are guaranteed not to produce invalid arithmetic @@ -40,12 +40,12 @@

    -Refinement of

    +Refinement of

    Numeric

    -Notation

    +Notation
    @@ -94,7 +94,7 @@

    -Valid Expressions

    +Valid Expressions
    @@ -128,14 +128,14 @@ - + - + @@ -203,14 +203,14 @@

    -Complexity Guarantees

    +Complexity Guarantees

    There are no explicit complexity guarantees here. However, it would be very surprising if any implementation were to be more complex that O(0);

    -Invariants

    +Invariants

    The fundamental requirement of a SafeNumeric type is that implements all C++ operations permitted on it's base type in a way the prevents the return of an incorrect arithmetic result. Various implementations of this @@ -220,13 +220,13 @@

    -Header

    +Header

    #include <safe_numerics/include/concepts/safe_numeric.hpp>

    -Models

    +Models

    safe<T>

    safe_signed_range<-11, 11>

    safe_unsigned_range<0, 11>

    diff --git a/doc/html/safe_range.html b/doc/html/safe_range.html index 865652e..1d1cba9 100644 --- a/doc/html/safe_range.html +++ b/doc/html/safe_range.html @@ -22,18 +22,18 @@ safe_signed_range<MIN, MAX, PP, EP> and safe_unsigned_range<MIN, MAX, PP, EP>

    -Description

    +Description

    This type holds a signed or unsigned integer in the closed range [MIN, MAX]. A safe_signed_range<MIN, MAX, PP, EP> or safe_unsigned_range<MIN, MAX, PP, EP> can be used @@ -43,7 +43,7 @@

    -Notation

    +Notation
    prefix_op S unspecified S

    invoke safe C++ operator op and return another - SafeNumeric type.

    invoke safe C++ operator prefix_op and + return another SafeNumeric type.

    S postfix_op unspecified S

    invoke safe C++ operator op and return another - SafeNumeric type.

    invoke safe C++ operator postfix_op + and return another SafeNumeric type.

    s assign_op t
    @@ -62,7 +62,7 @@

    -Associated Types

    +Associated Types
    @@ -84,7 +84,7 @@

    -Template Parameters

    +Template Parameters
    @@ -130,13 +130,13 @@

    -Model of

    +Model of

    Integer

    SafeNumeric

    -Valid Expressions

    +Valid Expressions

    Implements all expressions and only those expressions defined by the SafeNumeric type requirements. This, the result type of such an expression will be another @@ -145,13 +145,13 @@

    -Header

    +Header

    #include <safe/numeric/safe_range.hpp>

    -Example of use

    +Example of use
    #include <safe/numeric/safe_range.hpp>
     
     void f(){
    diff --git a/include/safe_base.hpp b/include/safe_base.hpp
    index 5147806..b5999c2 100644
    --- a/include/safe_base.hpp
    +++ b/include/safe_base.hpp
    @@ -253,15 +253,17 @@ public:
             --(*this);
             return old_t;
         }
    -    safe_base operator-(){ // unary minus
    -        return *this = 0 - *this; // this will check for overflow
    +    // return a safe type. This guarantees that result will
    +    // be checked upon return
    +    constexpr safe_base operator-() const { // unary minus
    +        return 0 - *this; // this will check for overflow
         }
    -    safe_base operator~(){
    +    constexpr safe_base operator~() const {
             static_assert(
                 std::numeric_limits::is_signed,
                 "Bitwise inversion of signed value is an error"
             );
    -        return *this = ~(m_t);
    +        return ~(m_t);
         }
     };
     
    diff --git a/include/safe_base_operations.hpp b/include/safe_base_operations.hpp
    index 195048a..ad3f962 100644
    --- a/include/safe_base_operations.hpp
    +++ b/include/safe_base_operations.hpp
    @@ -183,12 +183,6 @@ struct common_policies {
             "if the promotion policies are different, one must be void!"
         );
     
    -    static_assert(
    -        ! std::is_same::value
    -        || !std::is_same::value,
    -        "at least one promotion polcy must be non void"
    -    );
    -
         static_assert(
             ! (std::is_same::value
             && std::is_same::value),
    diff --git a/include/safe_literal.hpp b/include/safe_literal.hpp
    index 7d359bb..88b45dd 100644
    --- a/include/safe_literal.hpp
    +++ b/include/safe_literal.hpp
    @@ -13,6 +13,8 @@
     // http://www.boost.org/LICENSE_1_0.txt)
     
     #include  // for intmax_t/uintmax_t
    +#include 
    +
     #include "utility.hpp"
     #include "safe_base.hpp"
     #include "safe_base_operations.hpp"
    @@ -94,6 +96,18 @@ public:
         constexpr operator R () const {
             return N;
         }
    +    // return a safe type. This guarantees that result will
    +    // be checked upon return
    +    constexpr safe_literal_impl operator-() const { // unary minus
    +        return 0 - N; // this will check for overflow
    +    }
    +    constexpr safe_literal_impl operator~() const {
    +        static_assert(
    +            std::numeric_limits::is_signed,
    +            "Bitwise inversion of signed value is an error"
    +        );
    +        return ~N;
    +    }
     };
     
     template<
    @@ -108,7 +122,7 @@ using safe_signed_literal = safe_literal_impl<
         E
     >;
     
    -template <
    +template<
         std::uintmax_t N,
         class P = native,
         class E = throw_exception
    @@ -120,6 +134,13 @@ using safe_unsigned_literal = safe_literal_impl<
         E
     >;
     
    +#define safe_literal(n)                               \
    +    boost::mpl::if_c<                                 \
    +        std::numeric_limits>::is_signed>. \
    +        safe_unsigned_literal,               \
    +        safe_signed_literal                  \
    +    >::type
    +
     } // numeric
     } // boost
     
    diff --git a/test/test_z.cpp b/test/test_z.cpp
    index b37dcc4..0702b14 100644
    --- a/test/test_z.cpp
    +++ b/test/test_z.cpp
    @@ -329,7 +329,6 @@ int main(int argc, const char * argv[]){
         return 0;
     }
     
    -#endif
     
     // test safe_literal.
     // can't make this an offcial test yet as we need implement
    @@ -363,3 +362,33 @@ int main(int argc, const char * argv[]){
         return 0;
     }
     
    +#endif
    +
    +auto val()
    +{
    +  return -0xFFFFFFFF;
    +}
    +
    +#include 
    +#include 
    +#include "../include/safe_integer.hpp"
    +#include "../include/safe_literal.hpp"
    +
    +auto val1()
    +{
    +    constexpr boost::numeric::safe x = boost::numeric::safe_unsigned_literal<0xFFFFFFFF>();
    +    return -x;
    +}
    +
    +auto val2()
    +{
    +    return - boost::numeric::safe_unsigned_literal<0xFFFFFFFF>();
    +}
    +
    +int main(){
    +    std::cout << val() << std::endl;
    +    std::cout << val1() << std::endl;
    +    std::cout << val2() << std::endl;
    +}
    +
    +
    
    Andrzej - Krzemieński