From cac3baac18464ada793614bf79e59b1cb824a2cb Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Sat, 15 May 2021 12:21:53 -0400 Subject: [PATCH] Major restructuring Fix build system and repository layout, remove unused options, improve code style. My programming skills have improved a lot since first writing this program, and this commit fixes most of the rookie mistakes that I made. --- .build.yml | 14 --- .gitignore | 39 +----- .gitmodules | 3 - CMakeLists.txt | 29 ----- Makefile | 10 ++ README.md | 21 +--- Sarge | 1 - branding/logo.png | Bin 46455 -> 0 bytes branding/logo.xcf | Bin 41527 -> 0 bytes cmake.h.in | 60 --------- cmake/CXXSniffer.cmake | 51 -------- cmake/Modules/FindReadline.cmake | 81 ------------- src/CMakeLists.txt | 16 --- src/main.cpp | 79 ++++-------- src/sarge.cpp | 201 +++++++++++++++++++++++++++++++ src/sarge.h | 54 +++++++++ 16 files changed, 295 insertions(+), 364 deletions(-) delete mode 100644 .build.yml delete mode 100644 CMakeLists.txt create mode 100644 Makefile delete mode 160000 Sarge delete mode 100644 branding/logo.png delete mode 100644 branding/logo.xcf delete mode 100644 cmake.h.in delete mode 100644 cmake/CXXSniffer.cmake delete mode 100644 cmake/Modules/FindReadline.cmake delete mode 100644 src/CMakeLists.txt create mode 100644 src/sarge.cpp create mode 100644 src/sarge.h diff --git a/.build.yml b/.build.yml deleted file mode 100644 index fb8f236..0000000 --- a/.build.yml +++ /dev/null @@ -1,14 +0,0 @@ -image: archlinux -packages: - - readline - - cmake - - gcc -sources: - - https://git.sr.ht/~armaan/gen-shell -tasks: - - cmake: | - cd gen-shell - cmake . - make -artifacts: - - gen-shell/src/gen-shell diff --git a/.gitignore b/.gitignore index e64a8f6..33f3ef9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,2 @@ -*.d -*.slo -*.lo -*.o -*.obj -*.gch -*.pch -*.so -*.dylib -*.dll -*.a -*.mod -*.smod -*.exe -*.out -*.app gen-shell -CMakeLists.txt.user -CMakeCache.txt -CMakeFiles -CMakeScripts -Testing -Makefile -cmake_install.cmake -install_manifest.txt -compile_commands.json -CTestTestfile.cmake -_deps -CPackConfig.cmake -CPackSourceConfig.cmake -commit.h -commit.h.in -*-prefix/ -*~ -.fuse_hidden* -.directory -.Trash-* -.nfs* -cmake.h +*.o diff --git a/.gitmodules b/.gitmodules index e895022..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "Sarge"] - path = Sarge - url = https://github.com/MayaPosch/Sarge diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 31151de..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required (VERSION 2.8) -set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") -set (HAVE_CMAKE true) - -project (gen-shell) -include (CXXSniffer) - -include (CheckFunctionExists) -include (CheckStructHasMember) -include (CheckCXXCompilerFlag) - -# include the readline library finder module -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules") - -# find readline -message ("-- Looking for GNU Readline") -find_package (Readline REQUIRED) -if (READLINE_FOUND) - set (HAVE_READLINE true) - set (GEN-SHELL_INCLUDE_DIRS ${GEN-SHELL_INCLUDE_DIRS} ${READLINE_INCLUDE_DIR}) - set (GEN-SHELL_LIBRARIES ${GEN-SHELL_LIBRARIES} ${READLINE_LIBRARIES}) -endif (READLINE_FOUND) - -message ("-- Configuring cmake.h") -configure_file ( - ${CMAKE_SOURCE_DIR}/cmake.h.in - ${CMAKE_SOURCE_DIR}/cmake.h) - -add_subdirectory (src) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..26bddec --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +all: + ${CC} -o gen-shell src/*.cpp ${CFLAGS} -lstdc++ -lreadline ${LDFLAGS} + +install: all + cp gen-shell /usr/local/bin/gen-shell + +uninstall: + rm /usr/local/bin/gen-shell + +.PHONY: all diff --git a/README.md b/README.md index 516bbcb..5b0e835 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,18 @@ # gen-shell -[![builds.sr.ht status](https://builds.sr.ht/~armaan/gen-shell/commits/.build.yml.svg)](https://builds.sr.ht/~armaan/gen-shell/commits/.build.yml?) - -A simple way to turn any command into a shell with arrow key/history support (if compiled with libreadline). Forked from [taskshell](https://github.com/GothenburgBitFactory/taskshell). +A simple way to turn any command into a REPL with arrow key/history support. ## Usage See `gen-shell --help` ## Installation -### From a binary -Binaries can be downloaded from [here](https://builds.sr.ht/~armaan/gen-shell/commits/.build.yml). NB: these binaries are compiled against libreadline version 8 - -### From source Dependencies: - - cmake (2.8 or higher) - - make - - g++ (sometimes packaged as gcc-c++ or gcc-g++) - - libreadline development files (7 or 8 is fine, 5 is untested) (optional, but highly recommended) + - POSIX make + - a c++ compiler and standard library + - libreadline development files (7 or 8 is fine, 5 is untested) ```bash -git clone https://git.sr.ht/~armaan/gen-shell -cd gen-shell -cmake . -sudo make install +make +make install ``` ## License Following suit from taskshell, gen-shell is MIT licensed by Armaan Bhojwani, 2021. Gen-shell is forked from taskshell, which was developed by [these people](https://github.com/GothenburgBitFactory/taskshell/blob/master/AUTHORS). diff --git a/Sarge b/Sarge deleted file mode 160000 index 5c0b2a7..0000000 --- a/Sarge +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5c0b2a714aca97de16bb0a1b2f723681f69f3307 diff --git a/branding/logo.png b/branding/logo.png deleted file mode 100644 index 4824efd9da73fffdb87d25c4a396f0e8d81aed75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46455 zcmeEu1y@yT7cOo$ErO(gz*cDxEJ_46Vxg3TbV!$^(%}{nQ3**20Rw{+kWNKHl#uT3 zmTvA`c+L_0?k~9Gj&GcAoWox0UGtsqjAuS`uH~yBcZH0Efdmf^k4*aNMMXTk{iDb~ zLau;My0|F z-basx&1oJh9Bm{?KKEQ}4PTZah??%o=gi*T3jL^Ot>^2V*mCV_*ddAHvN6Q7FGq;b_b^yTESN5?tOe19JNhT5&7MGWOu z_+*}U+uqY(T)_Gi218kUy7ZH;(4%)kx4q`YZ9_s0Lsz1me!L;2l(5tOwc=<0(+FpB zxmw00M)(>pt*F|V-p$hj{apRe6UIXL4aIJXSlc#p3pD3(c-|6DP35(JF-#Gp_LY+L zk%EF0Jxyz)D*ZVw+WJqiv%kpmJbblCa;x+P)vz=ShAre z5Y=Uno}KWYcb^olroyZo&>Fk#nYr(WTab>mMcVN=PsW@aD~l>-o80{e&eNxJLXfEj1SQmE3JKd-z6go&Dv=LQAd z2K9$_&Q2acjqM-N~1If_BoJvx2%kXI|_as8C8+mcsH{lOYFN!gDlvTVD!Qu531F6a0MSTw6?5>a5V$m5bJDkB#qzTVZ*V)37NZM$ip6<#J_ zv7j3u>$Y@#AL%~S35vS7Y&`Wx=EPsw3p|sAMH|G0Log-o9zo&#;FQ4{e0?eLlU8X4 zS{!9}UDn%I<%-yLHV+RT^)E>sxZLKVs>SkzY@Mg8?VBJv;aHqxYL!f4h7@ioW1zG@ z+_ikMGAD+)Ws=zrH1dzQ^Z4nmt)A2^7X9Z$Q))%Nce~v=R8LbE_fAykw8ed_t5lKf z5trDUnnx4FvP1?~|G5nhw}#K>pRYsRvfjVOLFT#{xWpR+ayr?w4=|wH8RsTLjoS(b z)X#X>k>z)U{MIc7i}A$8mQkm_70VCbj^gnxx!$Y<4bi?ju9#yZ|<5#LaMxTR?IaUpPSH^GW*RIuZb#T(k$QbN+8<|+} zuO*>1j?GpaW)scd>c|nFR$K{tPFka5ihd9D4Yp#` z#)xe<(>jnt2565aBTkw6=eDq((gY{=9RsvRvGc?cAIc4V!yrKt} zGk$;5>BrLdR`N&aHYvgKo6j$d{U^>4jT2{BnAqS7ZFq6GW6=D28Lt>07h;3*ayJFu ziBj85XX5Wll>crP4@XAqcHZMxY}yS^GbzTEXsjdHU{`3mwhwA*IXsrSc*DVmaV79y zqqv6^Ko=eUzTv&zn0TtKIziE^o3||}fDt)n-?q}zTPEMGt1$mrT?4%(VzrS9tEY#( zu)K}|zYslWPWi}hwK7L)sW&@GB>TUUqQKOpVV4MA&wRb?ZdReY9#XOfdtH=utH)s{ zzdQP~n3#N*X#3nEe(c`>fx*TZ;5?tOY}-#Zgx}f7lqcTEzDLmYv+e_Soqj&))VA_F z#iMf^8Ln=>yO%}J=>m)?d2o?DH2W8$U9q@ zQ{g;)BegA=QWVVpRCO2sX~E&r{^qvLA>FYpoh;T}qFlzMex1tj`6i}1;33GL1}^Y5 zSo6AB+Ns)Z0}p*IPv!3(S^s%Ih<*k2uA~fcDqw7~S{}%$IL(ePn5+C_FZ|BV4 zuq{lQmYlr$JMHYmV0nCh-~C!ljEkXSOqE+@;PrHl(=H*-mOor8_I1;>%nwA0z3loY zQSIDOglY@!HYs16ZhfCxEkyHk9umsg>t*P6-3SL;-gW;R^BNw(?W+HTx_T3{-gbVS zezSimwk=pzS-<*_4MCwuinKq&b`ZI*uhDXjo7gur+oeBJm5AbRscw`8^tUb0s3jbQ z;9PRPqP#$tcYZcUM+IjW`ez4mmME5|_?v=)eMBQ-1a)f&UX3*YLobf(fam9Qk@%LV0RWa8C-uHgOb>=u*7?+P|~+5 zL5Hg*j_yuPM{OhvQ^U5AY44L+&ro}O8LJ)L^Q}c z`}y!PgS<0+_8f;Sod_Xx!Lq>c#=?>BIHSFzYZ z{EkcD&&BA+M`z2P4+rSK-nw?GK3OM>Vd3J)dBG9UibfBHmi<(+H#GhnH4(LZ@9^_E zt~6;~#e&A~v1tTiX(Cph6rG=*H#hmlvoq~lx9Yf!GVhQEdEj-63+rz}P$Xdm)8}@+bWi9^7Q)DmyXqf_Y@(g7G1;2AF6Th>r-*Fbm4&u{C1xGr*)=4~` zptHLsskUo}L}=$&!tQY zSwG7?xof?Js~A_B4*RL)_|&nVR~@FqAm(Yxh;?uZj%a>8RCK5%b-|L=b(bEnaq*}t z<)%{l!5)qU{F|9!ms9jkhUW-5*BgMJ9Qf6cW1Om(u`45B;~t@ezP^$7U5=N~`8xO{ zD1)HT_Y6(cyx72O+j@1jx&C3PJ?qn;zUv2;>IaMG(|k@iEalbxMm?Z<^|S40kC2&D zDdp}h^5Z_FNf)0=?KSdGl(e3mEQhdlWNtKPEB&(+qyL|*u@Ciu=m-l{?lA~liqh{7 zI6Ga{+HaD!DLwVB?CADuTq(ojJr@%np`+3mCZ6$oK??}$yn(&=$%A(tw2Ir}j*?0J ziJW-25d3tGf@1op1=oJ6?ibS5B{F7pjQ3i%7&1NmrQBccE2Y1`d*Mrmgio^PU9zm7 zSzySDk&hrK^mz#G%6{-yX--UI>B~vE-HRV1nWPHt77-lFE@$5yIz}6Kt%hNN`Nzd| z(VE%-sUuBZwIBrWN4il~Js{ot(&Kc9T#@szhsRT38*$^WX&??2If_uws| z-L@AZ+ly1HBmOlu{iN!q8qfI8xR#ekqUKN8W+(RN*)!#Lc<&b8h*pjA$-16pJzYp{ zrE%k1$y<=v&xWl}OHr@x4;Qri z+#lcN{-#f{&6-_}-4+7IUxWN!NzUk97}ytFIC9=KH1b`hWADK6-6zn<6}YI@lDVvP z_u!50uCt>PKW?8_aPVc(rcs>{;h(WhJ-zGdIjTyRt%_EMi?!4A%f54Qv?p|)9ldc52?N_3CsVFulIR@SB?}P+(ec-x{ow?T3XZiU zwsIFL7fA+GJ1?<*_Vk~S4i%@QmfvlgZfJ)mw+JiPH{Z6tNv-1WKKtrs9&-J*Fquik zBB_~-5APoFrE%{1O%@Pju2|N$C@W%Uwc7~91V=XYH{X>lMyb4TySqDPV2&q%h+SR+F zA_eEYl18ZcyVdTUXN=SzVpwR6o}tIzu2Z<=b!d;`UgMWnu)90FCX{t9xTf9D95v6> zZ>SYM_n^{mw~3+K(J2-)ecYutz~?u$Mo@uCa@(NpcjK<;% z2*u=D?+I%{{u@-RiF~zZEm_>>w8^Rd&C!;x>pxY){o?MBxvWd|)jXnF^iG!zbJ=|{ z7Bk6A76w)nlP-2PN=lS0k-k^5=UwX3#83YtGfk zHvMbTd5Lmuvfg2@iYZ2~Ve%U{zoiIX8(RMojl_@QM-DpNHgkK|8pN-$m|+W+KYRV- zNivroi=#QrnnWtndj%swsgp-626?NI*!sF|_*ERdF`stf(Y0N*CLEh0RqH98@hvBF z>EtN+Ig`2${wpgz6YSHqdrSly7lqo+CkoHw=!v^B`MQ6+e#wgYuHb)#(2f@_qSIqe zPn-zW2`Yj!cxVvyep#mee$d{FUJ)G#2+!N*YBCHK^MYW)o1Gd@!oj~M@N!0%w6wcc zvr@@tNd{;r^{;(nZDQS>toETUQCGVBNNSO>lb)koUSae*dV?o_GR`x|JZM+p4Uyp$ zNzzkaYbyS`y3aKBeTb3VR(?<){m$W2rO$3_ETgM*sZJV^v67xX-~u7x9Jg3>bjX7} z?i443$}i6tB~{|){BUM;Y9@ZYCFI`V-b@@%z0%Uy?H8l$#r$q#HiucU>VqovUf*C1 zT#QjCkNgqzgKc_>{GqEjJ-zR4EO`%0gBFw@!r5}Ykd!DSIg@&Mk7}-7!$jzu^*uBC zYjU;5)`gZs;8M`hJ+Ux>=;>pVpW%brmeVG62KF&Svwj6fzwUK}DiXKXg+kRdm}LU7 zo7+V>%;Aamd-oi;f)Or>quQlGD_o1;HlX-rr4Gfmf>y@$&J%ks!(#Yxla$M8zZ924 zo!J7H=@(w>_eIVZ80%{75!>lHWTbqLZpS8b%k0G$m^vw3 z*wV)nqF&7MF(&-(x}8!-^8eb*O_HaNIevzJI;O`{8<)KxM4nti<+a;%(bxFv(si=f zOzOH^b=LOZ#O*#G&J67J=}Xp4^b7nU&Tktp@4_qlQ1P^;(()Y(XGXhSb;iAvZFk@J z{xPg#gtGZ0yopffD@a(x81Ap1U zMRa8Syx@)<#0YHK_n#9yBy9HAFw+Siac6Y#buB1xPc&V!bg?@9mr0S)wVu-%E=s!b zT5#>aTAJUrAHsia*%tS3sf0|_Yr4tYmqoCCkIHbyL}w>ME&R@V6XxMs|;}`B9JlD(zrEe)>yR5>n_nP-AdUrctdY*q$l-0~M zA?8(Nf8dQss!GSwp3NvY;F45pT!tgVT^JV(Ec^`#|I#uUE)Ra?x3w-VaF-R3QIX!G zX7o7asM3Vd^kTGR>V&ep_E4+u9@izJR*D<$&W$11JYM$cnZRBNO(U??h4!-HIr#;J zMpRrBdw!+XjeGmO(*op{`sJ?tS5VeCrl3TwZQj?5(T_%MUG4T=T=8LNM%NupupN8-b05l@ z^iF`;`q_16G~YoW zaAvOo;^7YB=QSxgW=qC)-y&k!1F>MI+QfGf-%SGuadLKT{+jyKq9^6pTFhP*P^ii4 z-Q9TOS@6Ss%B81Zz-u~Mvgepps>qDYPscsSkJT$hsms4uY<|JlWmd;==iGh%zokh* z=S?Q(H^jx(sZjUq%@+GmFG%jRX*#-)yR2`HSezs4yS~?YuyLX&_jCE=g^6cIJMM7Y zzr8m^;o>;oqn|3K6C`7Qz97ol13KVT^Qhs+?q0FcX^9!i zW`e!Dio1y;>-OnxqhGj{c{y!2sfk=y_o0NqbqbgtF;S-a@V$55!zQB`Co@GY>H?Ak z9#8$P3^{zkRtv}GxY+Koz@lA!jvc2kr)kwo?YiZ~%t9e_^75#z1$D>&>TAJzCby;I zeJO#MRpx+;=Gq^3dVJ!`!+&Q1exIl5gA#uxvh0En*$={kPMK@0rikjDPoaK$)%Lo7}^8e>Y@(EM<*u7bBABv1hEp>VNz2x@9 zL+>+t{T`0zS&2*Gaz4Yt3VL}T)6~$JzlBOeO)T|J#7Ooer1d@Bi!sndme^ixv6Vcs zH95xCZxw%wY=Gb0GS@-?v#W_s>|?RoMT}!?68BV)jBL3e4}HHud=auaD{geXA{doFL=> z`@TB%*_-lP&GZX?e;UaDC?J>U)8e4Dz^LY6(EYf-m(`Tty6II!L;lzCVd!vKF&oJQ z?j2f+6#vZ&{No0u6W@Bw>m2(f|G34D)ej!4YYr}MikpeNPICY6ka$~cRg-LO`uyL) zMGM{TGMCM;@GJKXhI4Nsz`%0LkNGdwMlJ~a&wZWfHAAR_JHL?1{3V7VYBQanke~GL zEve#))V;(pE!5~ebq_p~z>sVWbMSA~q@cXg3EUgBlqjPAa_ZKz7Ii`cf29nVB>1S_ z9A_P4L301^h!SN&wnp)Pd4N>3WNnkK&0b0C*y|h!+&K^I{VNuuihHTEM6DVX6t$Moxrt*V~iqi)t?bxYLC)s)hg8TM)- zE&&yl`?WAZDb;GvN>`=*~1zC^sgEj z&CU7oMswV9qF&#%zj84b@xph81}ToTR)S<(t3G_Ux$t-lt#!??G!2Cmo2|`*#=;AlPf+SQL=@ zXm&}G|Ag837ZCFB{}&Qb#s71fbf>EPecB2r+`jz;4}#^+aXn=a;I=GWY`!&G_wv@0 z6In!F1Y{(Ms;LKgR8tOE7yP>1;hC|xIuc7BAhG47mSb}(XQ|zyG~MWXp7P-{#xl=O z8(njnaqVHu>afcHIQBN`p{!sVt6|#u;zY~PmLRn7EpV9@Em@mP?wgA(9b4<|7OCDe zJU1UyFuU^ph!W!8*jg?o=Pz7PY}wzo)0#7<9Tl(}tQ4~7{{A~IVMq*Re|_VKJ@QuW z1%pG6`|?Sf-jY16bb_q_&kX~$0w-JHnS%K*_wh;F%SGlYkCzU93ocE`pJs6Aw5|BK zIvmv^Q1pU`!Zf-hQo!PieXSTB?FkL)>7w=NlNQZMSp+b22T@dvt}br5vyKQ3{{5R0 z)#A0L*_Y(*oR(Q_#$?IckrpXt7Uhnuw|w##w;r+^oKm1!<qABA~eU1WqOKrZ=N?!KrB1>D;~#?_y9p zJyUI>1z+;c)oXMeD?9BsZeAPMV5YzbpIPdxWZWIpU6O^d29C*s`I^4x2L5KQuS=O6 zJ8z6!b%1&mhL)gcD?guzZ1^tm5tq@Ix8+r8bxe!_Rbb`up&e!)yRM~HpMOew!`V31--grWmDkn^KVz7Gd(0Wg` z?x%uKt*oP$n4D$qN-{s&SIT3(4Ct+(MLX)$Cxj%RSX-LvSi1bEyU^7qf2Jsk2nmy);J}!6;@~VF&U3}b z(`NO9!F@d3TT;X7)vvx(rR-6blvc%?OK&Tv5M#LnL!xxI!Ukaw2S-b6X!5COA)epc zV{F^Gl61Ln_wLYr@hcR=>%A5$v#(Lh8>G zRHIFas)r>!+??jVag=`XCe@@>MbPvc&R(u*uA0ZuNI3GsIt*_V&bV72eCExHjT=X8 zt}m01MBB?Dj@ZQ2D1Q%I23x0*zzcy^A5KQEE>5y<^mV{Pun}A*`r$z)2E=lPXm$0F zrICbki*^ta3N9MIMtptpV;QaHV6^uvY(QHtT-$+oB*xXMi5^+k8(BBTEgn>gp{ne5 z_85G2rckH3ThOqNG5}4WG z2`NLCe}&TB=%*_!!R@E2mV+r4W%b^bfq+!IRdWt(+$+dvkL3!|LD?rACR=UlBnffI zO+l#Fm;Fd8m>ji&a-|Uitfquv((BDR$iuXHf1Ig30PbPiuYN56( zB8gmH5VE4%$}Bh}D+O|shF)imZQs592d|#H@(u8H+%vfFvN;3NaKk^e(owwG5h%vh zhU_y0-(`84DZM2{9k!xC16xrs)_4JnIQf)(CS>`6@T1-o$l)KI3tj$q+ zA(vxt4RWFAXZ^l5Z#BOfsLq|riVf|5)OQAVGM)Zbr`2p z=;CeQFY@-}>NNx;iyeaKcCi*|q;WpSE@@~09QqkLT}WOHSsQIETVZ#a3+wFaH!;gg{8I+Pb7Ip3YFAOOu+M>LFB z-bhEnD+yn3llgD|rx5JAqlEZ1XCaKyEGQ*mQRoCdo6(m(4}ZSCqWVH|6P~K2*IR7TI-==BZymue=}J_#dhBi z6{1iw7aC)AKiIS)MzrG&7_CaW!zK7d9DZ3HR=$KLO5%@`)b07ofo#RQq-T4x$LFP# zPuMHkOAt~)jyaQc)g`;qTH@oHs5J+k#hIp}T=m|VlfpOl@Lr%jHCfrJi z7vL!=pwm42R67Xm+_UoA3-Z%q{9~QmPq3l*VSL&eLvu}X_pq1XU}z#tjVLh+WVp!> zQ$9=%YX7W7=`{P9kVhp|AJ%#cYemkdnD4Ar#_w^;^3%`DY{_yklBlfGyV#;jo?%j( zV!k@gj*Yv3_@r!>A~6ML_D-fgY5e249o>g>C^R?M>_UUQYPuDoJ~7zG;;>d3bf6V_ zTMYupIHGMX5cBLz>RtfcaEbtqN%;cIBKw-%1jjR?Z8Zwl{-SR3f+pQD7I|er;WCbp z*(vU+(FcT=oFF!>YdQW4DQ6zD&34Ur2wA3;(Ux7)$U-dV?GC)4QPuicoqQW;1)M%4 zl_z4J=@6ItQQLF;+msF+x3eGfaK_@{PLpo@3h+GeJ?sRJy{|bWEyxIv!uKQQ%RTGO z?{@Ua-NqaE)jI9S(lI3k&hvTMFOw0GP_Qdv_8Y_?x;(}e)5!su1i=X7G^zTa05%)I zS*i&-WuWleIGy8H{M|Cz(Fur;q@mg6V~%*Nl(IaO^dg|)v2BA=IPNkIGNic7^OG;j z3oW63!}XKENM>hlun5Eh>cgk>FRmEv-iNtP;!yL@4xrQF1ftqQhKZWPA?Qxh9Nn>Iv9Lwx-%CUkx@Wq z--q66eTHSFdqb4uh#7Bxy75dgj0ahk_oPWpG;_c$JS4u|08{&_9()GzBd|xY-+qKZ zAHXMsNFE5KhTvk?P9u8{dk9T%;4sBQau%Hj%0o!#dq~WyTXbH_eX)s*u@;L&f*^33 zs~K#n$gzI}{Ot`c_eg{WYmgl=0?)M0cYYvUeC1IS{+eklw5?vg6OC-HijsZiXDA?`vj0I;S5rilN=2c!*fD)Nc3(v0gL7b*ZB)St>P{sN#zU5ovKFG99grVq(NSS zX$fFem1yJs+2JVbhu)-g55Yk(oq+0*^SCuuAHR6Ohy``x&}d7l?(>tkF0{HYca?^4 zDSbg;90cIbpjIxlbH6V~`&JEtG8K$KL7^tPQ)nVq{#igv?6C%qiEEI`WTislV2hT$ z?BlU-zE~er;>~0d$F94o9c#g{8>}*sXSp^SBsP@}i`W_Zbc9cpir5c_B(p9;K#ns8 z;MyW%j5I?&$@PN7x3xb~UaVq>-d^|Iwtg<|o;O^8o>yO_OuxL@s3cDYaUc<0=DFG8 zsq#wh5^^GEKq`}SMF^a&LA9;l6Z@It8vM~^aeOE4xXnlPOm-j4I;Mb!o6LH8oiFzd zUc?e_nZ)*LZC~C*%0wGx32{PVa1XZU7ujH&RyaBxrW7rV9a?lxJTH!Xv{2(j{V<(&nC+-D!8-gZPn596pL= zrG)ScKt)Xou2_oho6iFB--91;0r0igF@y;XoZwE-u!J$Yvw|2Ta$5H?vQTjblpOUr zq8Ov!{DIZAWFS6VN27g>8j0x|0B$oMw;^cY1hw!=ua{J+PNBx(G~t)&Ew!5!o*P$e zDZ{vM=kTFOPCd6Q^{5{)V)>skxe(@l5qP4B8yQF=PlNSi=|Ry?oQl7`bb72$ zm0i~;N1IcxR9+ER98WY&DOww6xU>_JBdv&%dWR1ox&9Rff=CIoQFfKUM8wMqEmB>7j+*C1KVkr>Kb_dxRcuBk`P z?Yh$EQ#v>F-Sy;sZQ?ilfzZbvPBa~^jtXCAjkd25xiwh%EO+E6EJ0Mj1_ciu)t)KEnHNDhvug2mHq$1D=!XCHrk?SGDYV_2w|czeluo3_d=^8)EX z)uT|n2V$MKo2)4UZy|OSUIO_eN_F(jK+&&qM#Pll5fpCv02{$r9E%uOoYH5l% z3@?~|YuP)n$VwHx{HZL`Hgk2|-s$`qoo%UD3eJdL!9$eKk0KqQF zqyYBd1KB{Z(`mr3?<B*P+`0K8xAGi~<@_(GK5%sY=F)@b}i|=AwxP9j!(lnVdw=EO0xY^{4 zCnSF1%b%B6&x^>8srV$6B%Fkk=F{6r&e=U$bnQR!;ly zP0aa7Y#fcK&oi&X8#enO`chK4$StGWCxy>aeI;H}b!-XJZ1w9EL14{!LPJ8+E?w%7ND z+ZRDxfNuKA_~NA7_#rzPhUaJ!g{Wg(g$*P4<7>K0kd()9#yiR?&rCMgkUUUy{>Pcp zpI2D48$6Ic>%Z@5G5vNjsD86J71O?Sy3Q1qT~o_Kk5jC)R*2smCk(2N5=uQ7Iy|Ll z;T2;PBrvACH5Xp`Mmjh${P{D;p-B+;(v^^kK#^K_@?+_jW=-oC`sTUAA==$K58jE7 zJZ5#`LN9e#7b`ZVy*!q#8Xlkilu0yeTKC}r=JUdCBceTAi}~Y95gg7G?;~L`^D`+r zD0C35@c8@JK{foTgUqgzX|r`w?GjtXIKYk*QI-$-`7x(+n3i^ z)*fKLp}QfwgeSdn3=eMa8Gu4d=&Nh_Q~Iqbt4D7n!8gEs{1NJ(^_b0MS_ONMw2Rq~ zSP6;3H-;DEa43XyXf=+y%^<9=Ayo*zaeL;Fycs>(Xnmr1YvQC{$-Rd| z_Psd5hhF63IkyJrAK~G~5jsM2nVSO(!^=p~eSrQn>&vJ0*No-{znQVIGNQ;RE3Iy? z0vPUE8c#XRPcFWqr#K{#7ct%NPJZPphxjvPKSVvx5%ttWC4qV(uuD>TMx`i1raN^H zixKG7p)rS%vJFObK3%)Kvru4LF(m=q)I8ah>lE@t3+BdwQ8S$<|liI-%Oynv+C&EHkPfhr9XFOKdJQ^a0#R zwoM(rU9`Qm?lVba=BJa+G3z;eCf01>V>#pkeUv-T%~U%Cc}16Sy^B^HSLG2v6&G~dBTrqFrCe8VU>#&FEm596^?GMEs_E( zGS@h;9}u_|h?_g2dKZu`7PF44sn0Bllk{qj332;zs^S4yd*RemttGE*NFMp!ZM0}R z%F2|$Hi&!|99HK+Y9^#U3hYYNiXVE&XmvHAvv8?B(QMUF^tA-)^%Fp8_Hy%4w#j=XTx$s?{pvZWY>TAKc)4t{n;^>o!lZO_fcqxszL z)W25?^-SVytG@{F;Yf&b2n$icNf%M*dYVd|MFWK8P)DkpKxMNt#y?EW?PF;2*QfJ2 zR5A_ntxkT70OeJPp1_qW7k&Np|QyDY4YejR`c z(|aZR2#?g=yKw+v@Xq4X^6MN)cdb)WH?E1MCpdVdHRw+NnHUYqD-^&za6lOBiB14Z zMiFh%#(evC7QoP?77)>Qlp#0rHd!ObY{`D|#%zP&rAVOegD>lNwgNBhuu1NYV00^h z8TmLvgmFEq5f?Gjcl%BX*bFk(V9}C72D#NaIbY!JdYVCn;N1J$-Jf8<#G*gWl2jPl3A43G5JRn zmQVG1kx$QxBGW3nkuMcm?%dc80nYx^5_zNi&C!#N)17B2&1(A}9rrhN7Vogkko|5z zauq5;KxSpJQZxW{F}TUkHV`1M{8QVR)2%?UuDUKK+i3u9CVQlC;AM8J{uBS=S>)}( zbHG43-XGxE*>mrw202pqwT0ilau0hN<+=J@_e-kh=7izgw`nmJh(q7!=}#M8{h!BD z;3f|sG^$ddWjsQlt)Yi&V|9D{W!oom2K-42U9-2Ybbt0D6#8%sUYb%c#x-wSs2Iy; zBJ3d*4hX|yGNf|k&|ELCAE>_E!C*1Y8svO-;m^D90*qSL98PwT z`-0kUn#8zz{FksF11A56TjTp1ehevZZ4s`iVQDADAr$lx1YF>wOk$jkM|+ArNskdD z=Cy%lb{>2-TYsH@D7@s{GbmdlI*JP!77P#W_od(r0rOXAU{eR`gYzSl?+?EPbI_f- zD}q$Y?6~!r;^MbcQH8$%kG4!wFdo_V6Y6g5bwpl&D|ral!-*DBhX96$%cwcWll_j6?%tKh5OigF0maKE zys{lA9}25Qx<|>`-I1DZI0)?s`ITeOVUI#n(jFFbxg*^7fQqt40jX4>(}Z-H6k#r@ z$8#H@jmv4&2CgEh*=Z`X#k}+TFkCeoDS*(4=*VL>)43xLs|7ofxC|H(vi1Wpk`6zF zq>p$G<{~wJ?W{gXr?=0fj`X~dxDvq6x5l$MWy*Of=^jChEh*JU8oYCj!hEy^^#0Yej?y?pG zpiq}>-P0MOnySN;lGFdVvmb^auxW^jVyN09<1#LJ}x$KcS$2|7RqPMPirE zr2%PhHsaIT;sjlKw&`H5p(^zbU7d>cXxVOzO4~#Vhrkk~k65%)#{Uo+5v(Dh%1CHt zz#+{@UX4%h1wQ8;G8+C7k-MF~04Zqn@>@Y9EmS~8_t$nqICegK@#Wmw%r5(w7inpT zA3a7PR+TUb^w3~rEdcYtMjHHFeVBy6YQt@Lt&j_SsQ!jiqUE!M=w&n z&nXdT(FzVJX-zY*uQvI7A3wL84tjk3q>z?Y?BAoH&g0$b8X}B$6Lp}4HPg1 zq+HrHVz=8rowRKIsP$|bx^uq``A-C_yMUWiF^}Ee7_oQvmM8sAg9H>tYA4{m1y{70 zb&uG7J>>krU33`9LEdya&n*rj2ki#=``3s9RMelY_5!#hGl_L~KqADGVy~^I&OE#6=0X0A3wZ9)o&jaOMXP0DTUVKhqG!J(RGKJ!sUmto0BGeYZIx~v!f4>19O#} z)y};!AhBhDKz{DU-b!fc`8?q-%2_SxdV12ZGB8UwY%ur73sIrp{(KC#k%G^C=#?U% zi)^G5q&1DQe{TgWTAxzvnle&rycMbatXo-5WSB}XI`H(&7jn;)(m?HgtxzK%y80j# zUVYm+8UEf`qF^3apX=pP#{hf5n2FBhYA}o~o}g%T9(kcj5r6I|@+P4TRPH`d{Cqff zDe+Sy3d-2!FTjqejx+SAYng}J&1Cm@B;E=8@12{hb2qb%(RCRBEdEdk^2N9tuTGgV8M|H{~wUD+sNnL3zZv^-V zWk02Na@7K{mfie0z4x{3VOk1j2OR!)f!GAV>BOkig1KuTOiiGA!(6qsN5(n)#7{ve zDW8KoiFnMSHsA^v#|dJ*X7z&%W`?ihG8SLo-2C_pM2!LI zspNaK$5n9wZiB~DYCilNqX)5Yn;kDlBna!0*yMEEm2G z6z_`7O$o2~iZ|wNdQOZPk3Xtv=qu$?eWv9$r>~W zm11aq1V9i%d#0?eET2&IfBZU^IfSXh;-FX%OVZBI!X3Y9 z@P2Y`2_ZZf$`aD+Q3DkL{O+4OwU>ZgwD74Gw;1=OHk(p1p}|Nm#M=Il3S`ukFFY zG$=&~tZ2`z)#}6T$SWj7&=*2lPI=H3o*}3g6|{ABy{(hQ_qOEuDT6QmqSIyWhqD7{kUv@6R7Tew!x?=17DN<53j zSv805iTbj%>HKH??&Od5U{)|E?8L3fQ+Dqaq zKv5-(*`gu)=0S=buPLk|hW;CtrrWkt_OaFN;khNNQ*G~icfd-e&a%qz5Wvx^U_O zZtCa( zzY#A~$^0O!o_-k-7uz;SMf)AXoy%r(7 z2n`e>yOwPk&4l~(ev}c_N-v>=T2@eV;s^|>$&b&>|EgeNAs}Zi(1}UjDB;IwemFsk zGY2L-QEVH!pipVOaO@TV!bI?eWnW@8S_e*W76w4@jw+br&eWbiGYJ)7e99>vE5KyZ zO~QA_8@1-ubM1^Eg^=1+O9H8vfK=!;T8SZeI0k%w@io)sSjPrl*ZvG|Yy>{LT=e1e zciF19a(Bu%dnh<_hl2~rJ>VNCxx*NMJx$1vg-MFaHRM}w!R)dLwgKZ-MQz4W-tZZ{ zn{?Qrc-mGV(@K%P%(YHeXtAaGK>RxyvD)dmy@`Mj`|1(MC%?0+GLl`BS8u|wSr;{u zU6EO*{M^iHU~p;V#8(X|(APKuH(&8t)F3oKeN*!d$qz41#6Ui|VwN?Tv4g1i@{^2y zp@9#FFFl-pfumxj1I{FGHk%RQmB&>3CaV z;QAYfET`1MrK%=mO7FmjLOVWH3V;r#c@R3szM>$AUc~J`C>;05Y$S3%@Tk<60FQ;& z$ZXC~q)#u}h5IBFGP4=6o4jtD6T0M(ey7H4yxSy1HKXhEi>^F9{A@iLiLG2eHl#u2 zc0>y&uFxkS%|QeFa(||d)_pvu+g-uqW?^7O80j(gLBb+~c>ya;UFcsvCgRL^glZG3 zK`4PrW^^`8X88bzCblr8S;+D%J)?|VY(e3)k}y;+og+y5>^G27mWp%Po>B61Mg||m zC@QC&lj_wom=*5kOk8HXO`T3CYLw^=h@A-bFTCz89rGQj`jGz1c_oS{JRAuLeCY+g z#|M+f=jagT_FPX%HUxCem)L72PcjJa`ZJ52QypsTCXD5I2$}1X4D{Pho5QORoR6^% zzOXh_Zj{IXoubJTB_{rpK5Fe zD!rBY;5kAt86hTQ0C~)TgPiwRzJ<8G;QBAkc_;jpFc1us{3wp#n z0T8nf96bci0X?78X1ByJJe(X_PGl$qNr`eSh{Jb?A?@4P_cTpcOU7hb$! zlp=zZOLrkxHob5SrNVslFOei<`ie}(g;M1JjTxLEGQ$(G16vHg1-+4B1?=@FIMn$< z{TB%DO1`^Kk~`lRKG!?;zd7+jDGGmCOf) z0M7=g#3S$a-Z_C-Op1_sA1xBPNnaCR%QiK%mY8Zo40;|Ms6mVzB);UIcvZ zK-PVz2nbZRpn4;G|8wK-tC~}guzbP>S`cjbfy)_KX7`1kNK|JvIz|t_K*u+AxF9hS zJA@CkB>B+Rx!5Xs6wGAU9a76MmdzOqx^Cy&b)#-`xkusvi+I87RE?!JXbrTctD%tN z`>z`x_h|=Im{}+Rq(h&hQp>wzR@tl^HrDWNB(e&WPLHr2{|IRfif1APcahVB-q-;^ zuBlpGBnaigju4@5Fi4YFYu*`Xfl{&M&fpz<1mn6$UjqjkA$A*AiY0MhUrPS>Hk-vJ zRgV3q^uInj2_w>4^AVzsRy#1}9(*$nx+*Ymz|9u8dD01ZW98q2ATa$4WxQbLod(%& z_kd(OzO4Ja8{qN|YWa7jEtGO)V?=^Qu+1>|T2m78IjjPX>kiI&6Y4EIR$B>(gyyG91td5)Q6PW4&VPEh{0!za;_^Jpf3q zw@+^?fO4oM^^lR{{wMr$>`i73Z@r-_ITTsDpZt8Fg&V?1)jfmM2lxmOGdGUkeeC*w zb1@~a1H>5+D%`M20yu2DYNM(4%$V+&i31Pu47$2IPVPe-%Jlz5#=N2~iNv0)F94$Qgf7 z`A-;1NAG1`F0uS(XpemZlEH^ZH1&rj*=sJ`g2Du{KS1bl%WDc}p150}9oFo@;Il;|Wlk&g~K z0sVQD{k62iA`mvJvmnLTv)+QbNTMSn6>MVnY5>NLa#BOEXd&<-J*ZwEqbFeJ!$+#2 z0+v&+16X%jO%BO1%uxlG(T20)i-(F*H&!&Nc0*X!-&U|*SqETrbPKpN=C8I9_im$imcR$3X8hKdb zzwJ!s5P}|qNsAn(vd?Ip%6B&2wTTLKL?QMRN=7evnl!iG;Zf`*Tq>s~cp>2X?r~2T z_RK_d1VWK~$>Rl`HzB?Ye+l^qe}-YEAbx0KZQ*!Lw`}$_&P=e2m_Mp-`IK1RMh>c7W9~XPS;hcj`f2(+yz5ZI9w!p`#v! z_>iN_t=3;53FkfKo2upyB-{#Jh1P~=Zk-5~ML}k(=Y_3UVOM;3z)u_BWMMU!?;Xy< zZz245-Z&u+HR7ps-))xJalR5ELkXZjwe-WkGqN{DklN>4+kXVAcZHlELwSo)PLxk9 z{F(i3^vE~!=XUQOtcNm!M^0)VV|(5rC{qsNBqvffq?7s>H@T7M`nHOo9NN~cSynGE zUe0E+hQ#iR?lDNNT=}DwdQlFc_!t~rXrXO>;fv@~e{gL6!5^nbpziTwOennyF(Y7L zSA_x=mmW`@CnEGlrJ~~8Vr03fVg)r3*H}A_Z@a0;HKPtt+@foxt0~E zyKhkaqQ5QikKzQy_F(Cd8>GULoRn>WOhGXTNGj)RG+-Io59@Y7)e1AX^m^OUMQ$l> zA)B@Nk9~0aanGom8fLPmoB-c8^#N2|zcv?ks)hVRjGrK+6N9nZRDfP0CJR7*KLYxA8#uJ&I%7Qk{-)Ta-akBxW4E;ge>oLY)C<{ z6A$+i?DPZ<&y{HDHyaSQ6cQu!)E+GVk_Ix%1f@$x%Fpar){tNa5EpA%K!_k9xF0_u z(U5_G@~`(xhWqe=j@yR>nIz`x&I1~-h({OXKoz2t(@DeK{+9e6AUxkGmFI5?PL1%TWM*nS1dYMt41 zOMPK#r_V?S?To&m89my?1cJfj3|RG zk*(at4H?WD)u_lo>)Xm9Fjw&eknxE6Z4Q{v+$dO2{qGhe13z{K&P{<&2qJoMwJKQx zX{Oa6C;Y+ojG(W#X922^FHf*Xhr$5m{B*XZt`|9Y8K8si=y1Q9CGTi8*g1ZB2VS^C zWc-j&`F~shRNr+4Wg6vP?ngWEFE#atY~0;9E{ib7qP^>suI~vDkUJ#clyKkQVSML^Hq{%9`pLr`Wp-X`*?m2TR!7tUBA{sL zh)LC3x-tfcp6#h=1<9Y*re|J{5E;wsrP8%r&%U~dbYu!6HQ;R_#>ZCyaU{Vl+=k%+ zl%rtj=ux;M|W$-CAdhmJ}JH z;<~+)Dp-QO!3FyLHVF(MvRzeSPH&r5Ba-}WdX)V+Q}#{Ha6BJAu zd?2M_)`6(Vh-W)hxEk^NZqr);u;}*b0FUV1QQ7KE9FT*XJoE+$^7~f^^W4V*{-5KM zK9s0WrC+Bu)q&C%ARup;cbFCKOf$)od^m>)rcTm`-ilJp|7`&X7Qd7uU>JOoNP$I6 zZujRiiFk<|-DDDRvdy$7HmqH0w!jy07=#K#*7HEwK}DlHnvX2#g31SC#v4-7NbPeU z+AjkXdOSby3S_8-IZhFAUWHSgp?6*<#vHvAMo%XjK^MY3_UqqZ%$D^m-3)S;1L+ERQj+uHpG{Ir^D1)pe_F849(&IXWlbE2HeL$mm&wEjs33udBed`zGjwJx)^m z^3K%gu#wLbQGHG_G4`h4`3&i)OB)a?0#QeIrN}>qZU}fuMxZv7rC29q3jHucbS7=w zzX3qF0oPxZj*f`)aNJKXxp@R?g3C5^?F5a-$a=B^GV#359JOeWb#fJ6 z`yoczTR3?yk~V?O!UXSEdnE2)iS!rRe0#FMVt;n3J*WdObfE{-UJ&YoK7EK)c?1>2 z(aBw5I8f(KIb`_m!-{EUk&@Nt`?8>nWZjg%7~&#HVjzAMcN7Pd_N_?`6g`)tJVxH? z7({!yhr!^sd*$f{lY;4C{j%s{dbYv?kLz{-{3vC67zn_osH(3KhiZ+}<_A!-hIDTB zT2raC01W+%XoN-j{n^>DdC4ZI9bvb>O)Ve-N?7f`jkE1PA+~!k|2ayb-QQ!8#T$`r zl@4RE!-O}-B=Jg&n*hx8;!To;QCfv!P&({z=Be#xk%?+NhWI`WlfQCK_ks?8%goq& zFUDk*NUbjh#db{q2Pi?>6-|KwgHTe9)KyOBo3gB}0j1c~^hQ@{0IHrC`;>dBSf4Q# z3m70DKYks@6jVeAq9npPYV8iYeJLqqEq^&6ZOwBbYnnR2jjwA;+6uJwMpy4i#Yq#qW&9 z3!s=5k(l>5tyMy`OUm^0lndemm;S*^G5b&C#I1$Grmvmu>yU>hKo9J5qlTRxLG!)H zQ-RF0%-j94XicvK2e&bwIJZH#))fza-MTA|tkJ$SZTey-Wa}mvWcN>4pq>5%%&Cq$_BDy~6&6dR5%iBc1Xm>w%A^misT@Qj$eAgcVufcz=vjUNam*LpL=n+DUptaM7*D3W9(()jMEN=#BO=G88>c&dJ#+sT1(KBB5 zJYfscjsh8A#xMaXqd+_yhNtYLijo1Ra_x^UYcra6(X~>Cm&rZ#Lng?WRcnT?4(ZK2 z0A9P#3|gYyd=09o$ABz`=VM7&Q}H9P*C1?qEx_mdP(>skD8lU1&y*>(nmOe2;L6)& zYS1AOC;$;~ai3qG@&Y?E^a5f0^cGTXFh0%$yWBfprH!L{vzN0qIeK_73a_^c6YMUM zrSMA3{=iLKhq#FYik>!T^7DTgA|nFM3W6m%6_OOWEa=5`uyy~HwZnqC#8TpZJUW`xUVfPVNlGiiN)4D$7mEsSS|F3EWFe>?5CEkcmB08!$c z8$yslD5a9stih8CP%d11NH&s`5FL+$KySQnk5Nw&ky5v;MnpjoiN3$c$9NnoOw()Xt24tEvUMw);tNxIKKPm$u^3#}fc7!!tL;`~S7 zAR#kVtfO`mI#u9eUfBC@=ncH$P+?bj#Ae^cyKazBtMm~^$*H{zqYF-tJ-*LCUdI8` zK2@cVt!|d$aOo53NoKMGfr(cUHMWvSAxU46>Ycu=Gqqn>TOa`V}zr$>J*Yc=il z?6o=%nY`G0vFJl=At<{laOwqWSrDP$0a!~7d3u|wew>;rq&8HXR7C@X)VE(oyT;By z?MrNR0cEdX#U&%)B^&aW7U5pya9dS!_$X)Ur&?45&)~y%n5Go#?fB z?7chj0KAt}NS*|bkA9T-D}=PZEKLcMOX{?5b}F_b){7ZjL##C%Dr=5^H(_G7jF6$) z(Hb==i9G)qv8A`rBP!6A{=)|njBJLW!p(R<0`LrDS*lMdE=-u^g%%9LbZjB~?2qok zNqJ6!0;US^$Bx}ZwI0#L`v^VsTg!}G0xfuxR?ZV{jKJ0`kQ#4;JZ%&?1R|WJN9J@q zGs1mRLX?_N$x&M7iDE1oy&m>Cr{XkhTR(zd{YaDo(Cm$fz zK&W()`0~O%g%xRh^g`m=eg_5ctUZeOHp6ae;Nhc3(=Ze&5WGV5p6b3)Zq?Mi!U+&?i=#9ZNdQ?5Rp~R z^iBsAJys72Ty{+AU{ZB(E(p7Z?=TNxo-C8A%T0u*gJv`q69RN z>F+%VF8%7tZ4eG@8;K^DB)P6pLS$Vzj>E1mrapxS9&bpQ1W^MQU~z8j+eH@X*Cv;! z3bzQ>VTSc-IQAvxMI61^&agU|)e91ILE48~^p$vr%AE_{yRz@!J+ibA#jp^?;Y3)7 zEm^G>TE?@<(#XX$BIJtQ6M|HV_3Ma|#V_6i=>?6GtE|7H!Np_Sf}YNvN~i#PYly|l zcvu_9Qdp=xG%bhS(%5MuA|@G)^pjx>`?^K0KmqHqys&hX#Q&SbmnI^2_x){Z?9O4@AQfqG1FhdK|r|s@w zR09a3Ak@Ui-s=Nm*!v}Mt(AbcCBKhUV&dEu;o>?OQCPn1z+QUBGdvG=+vy?xKo0r2 zI~_H=#>qQ3u}lB49x+=Wc6@u}>0MAxkp23&KzdSsI1=au9~c@lErk#(xswysoTtgD zf~)im_;&xzk>;%?pJo$4e~pi9B7WtEl;b}nX@VgFWx z2PBxg*{K6>(LHK-1{QAQEN``>Q>CbYyC^u3Yd3~;BQ&#UjQvPKHkcW1=6bMS6Z|+U zP`YnFrK=&U{TN$>3k1R_j}aM_$O9KWr_l@K&2Gt??cD=rx!(2&k)C-ys&UwSPaHWS zz6`cCu>ufN-!8c3f{Rn~a#S#FDRuz6I5=qFiUh|E?yC?pn5I9^g!+pak!Ps54W^IS z(++wj^r>CfJ}7gJ%*#N=(AQ4mBqs`KtXMFZ8SdbpU{3w;g9YuSvjX`@!5+kb19uJ) zgG2d$xfBm_SA`43T*So}k_K}z2HPCp4M*WFFh#jNo1iq%R)#ChQjTwFj8DFCgpl-1t5`EhiTyMZ~ zg#FXn)lXg>KFTsUkSpf|5JWm=Vp+zl*<}5p_WLr1=%5 zk=+B>K$JAt!#mkEk+Dj7ygg>yO!Lk(F%VEB>h2oe;F%O{jYGXY@3UXk3|G}8vQDP*&fS7*2OCAcq`^6$I+Tu)Rp~~>9 z>?KHIbX9=ISVr`L5WwqZ6tv6{Hux9Rc4u13b?g(2@^FdAlY0`VW7G!-fb9|g_FJmu zyrT!7v(0w!8-w`$T1rxpsb!Hav|5U!g0XS10i72b16acu{&sWs zM@9q-1zeTtw?+ndYUG=gBhmH4$A`O1@VMKxBnc_Qo3%?K4O zn^nde48H-Ve=SN(k)24-E^J5ow{=q*UH&Lk$9uM3hmQ`!(j= zXYUi-+3hc3-_WU=Z#IRbI?DN;%5yy71ElDE&Cu75;K9(CZpw44S5IBRqJHsXeSM=L zZxEzviW)0JdAx}mq|T+boQI^6tpFdV!0fe!##s z)vpo(SNF7L<37ldFH_o1Bf;w5wiAW>nn)!VTj<&?O%uG4O9~Abd^2Ohc4N&D);DTx zp5xAd{(b`>S?@>bp=bdk@FhGWNxyZtKVS#Th(yXAkhsJzd$=)D+z136uSX>1GQK-jJ z6k;g>HaYzLi=i@Jo+ZJXrN;yTEN12dQ6OUnn2*G&>~%8lJ8>V1+H0~K3CQvu*M&JX z-{fP1f}!t4VX~^KYN~lluud5d%HT8shcoBA3bb{6$wf&sL^nx7@L}Y3Z0&W(al}Gc zbW*O>sTkp7J^-EJRIBum8>RKzRlWMS6o*=-fjom*_%PnUhu3C-;xh4fQxH)<+A-gc zYWxzJH~Eje{Gu}pP}0L?IdKFz`E1+Z!Hst*LFN9TCPTz8-oycOqL7sgEU@DiRJn0hs1K|`_7Yxx{3xtoXBr;| ztRUjrLT|dBB!u~l>G>h7R|F5q7KH(OR4syBgk`Y&8O-g3U1K3CErYrXm!t293bTy` zrE-XFO%ytV-Xh17|9#W{P$je!Fw ze3gVcjqUX8t=(i^R@XB(J+_=EY5;FGvtkFo2(-fdjyq+>_mN5LF*`WQh1_9Ba$vgR zhpZrL^G#sb=g`E(^9zsS0!FAo@FP&V@)`pn&{PbSN21c>vm2X%RbCEV2{zQ7i(AS+ zbUbRGv-KHtvV7!q4b{*Bs(5f&E|kEn^?GpDW-G`A2>4diFy}zJ>x(Zj7n&vJP&=L` z*RuJ1|17j{wRlY2?AM-hpcY3GN0HY|2{xeG^W2k=>PpXSWIArqp}sh#UQy&VkR9fM zT445RFM#`gKYg_T%9n6q`tm1GNS|(B)P8OOy#Bt)y?WqF{excsH9fE30eKpJCWIJJ zBL&Ah`(}Xs(K<2-?K6xAs33H-=+3imBdMjGZCZ3qvIV7b?#x4(wBeleT5`G;p~>DEGE4 z%?U6)SK@O)=$tC7`ehQhA~L5Ri$)v||BnlRxPFlC(yxI0-;I<*>yiHyj>TzK7C?C| zB9tsVZmhF`cC+<$6LNsM(_t1xvc`Kq#V<0UEW+yTBPfvp{X_#Ga-1uhV>xpSbv)IP(4wYSa!DtF zCEIS$x1JArNuA?R97xM4FK(Y7${#0_ZvkU~SGshnGol|6o(OyJ;O@%%Ln9tG1cB>p zmr{Y=2IgfybK%!utRG0%gyO&ztQ0*|3GgFcF8lC%iSs3>g&eTZObh2m-)Z6sV-ViH zmjP0P&Et_1*Ez(v-6xNFb0gqo3h@JnE_{K`PpFs@GIznxv@l-WihT)p%k9+09(FR- z4MwAIk8Bx4Oy=NGH)Y;xAVp=IeM3DieOg-D8pq`xAB&<;CQt_?M1n}XpMoOq<9cvx zzDDw~ z)qg?QKo)p@lY#p-`_)%`TbK%8ER1lBL_RzY4#)TdyZEiOC-Icvd=$f=vX^s%1rK8& z0M_}|mmIea90fCS5wu1b0l+1Mva`f$%-84=@`TCk2>ky`=K^fB7_Vm^q7FrLyd z4xw=TfZzANaeD|}`4KEx4p>7u;K6(loVRJjPX|0retcdVVW&zNE)3}G+y%c?FIF{= zL;O^SljW=lnM;H!sGhM{+@x<&rz_QFPB4ED5<2EroeDkWnzxRyEsn5#gVIG8L)Rke z@3zbdYXX_3m&hL^yakL-tQzN606cATl&XsM5oxF|Pt zQ@*i_Ygqx0%Y0a{J+Dl%t_8P#3RoLW?<^pefq~vb&pl?;0v-;N|Ke;r+c1t? zY)_S`Zzvzki2NCr%wxV(O&+`*iWW>oL=0|{EaxgMeZpO2bDprnOFd<>P!1E$N9Jq{ z3S)z@rXZ5}I|nXfi45RqbEv`T^CtfLo|;uU%ltlCZo7}7*+Y+bNw7a6V1Mi~!XmLJ zsfExofxkkn!9!nGB8<+`RBA4z&4ap#-@%ZN%?!j~)2T2jwMkr>X+g%xE_uY}j@%I; z_}#Z^qupf+W$6=szi$|%r`c7y!?6;w!-FiEY6#R|uf?&_;;T=-eDumcEYEYmk?q0J%i$hUMb7qLO+ z$(X(r`dVH_MbpMJjnuDpU(T?*m|%CQFt0TkC1rnry#9E9MVqlfuVXB3(I2&)a#V0x zg`z$eJcT$$xfc(01Jd3SGmsJf2OmZc=rx4y*~|&#OmisXT1KY(w~d5a&iy;^BnH_J zNNbV2Yu`n)eP&Nd#Llo)l8HlJ)^Pz7Os41ZPDrg~MXj#~H%yIZ1__|Lx`I??$i>1d z)nT&&t@c92Q6rNX)RCjQ(X~JXVAc#Ne39%`2hk|uBL;HKY^bg1sj|R;n2k4M;9-^E ztW@fSl|yFK3bq+_r?!R?JCs)#U$ql@bRz!_%Dq{Ire7aYc}~1i6%A7)S;6^u$*ctZ z){>|hv2RewHq6`yZ#6e;X+-4){gSBV(-nQtq2`OFONYRWZu0hhWd%tQ15-Q#fsOz~ zfZVb?xt+j*W89-7Ja0M!(yfTv8yM?4BEAH4kb^uZ<4Lg1ta=^L#E+?ZlgAO%*L@8+ zA_qmOHh8E?y%5mzwfLjc+~%F0;A(4=q=p3K%x{Pq$lxjL@u&zNX%j?jEse6s>{BoS zn;?M*Ntf9IdNr*9YrW+BrVlm%K8pe&r+MAXW~>zngZK=n{G%N30DeR(rz_~%4==t9dHH`9=;l1^O5;c^qsuC`SwuzX!p8m_SdjaZw7+WW9*9Kk8~1e0F^U}znt34qg(sURX_sNZ*g5nthCyU#?%(a3*@s^vmjowE}-kajXiCFBVjA<4` zC6u?ImM@_sm!+OND>`nT!Jv->c4}!ufAC?9Sd8Z}YT{}D%A8B%zM~d8o)L&VU9M32 zYi&V}ckN?|d+^!-P#?3BKOq0Fq>VKgPU$-a9H9Vq6yTIY&$@ExiudJeJR%iA@DAaS zcW2sDsDe^snFFBZ9JT*HH0JkiKRTQfy$TeFmN3H@+yuuv z&`*#ax!@xpm4yS==OGI!o{8l``zS(9{G*0@sxk9m_NDn@!0aj4!7sjhT^<Jd8wN9+wD8rpj`V51eL(y zX?f9UG5AzL3CJnP--M)WwiA3?`hX7tFkDQ_;7bX9sx>H@g_^+U!NEggRFOpgyYvrc zcDFcNy1N8=>LtH_gw!1Cf0ry>i^squG21i{t6=$F^bg2+fp8-k`u%qX(D@8UE^b(H zT`;_R_sZ+&nZf&Fc|Z@HOjrCs*J`)oc@PBx!GUKdllIE%Fqonm+V{c$#9=%#RvRK$ zJP!u$8AmfdG*AN=j|FL~II>Z{2Tl(IS6fB%zc4VuKd=eGTF{}H_Bt4Nz~5h9p#y>X z{}*z3<^Mmmka*5ovdv$z2OdhAK3#xr;|5P^97Q8FXl_ zW<0NDYP~{d>*l;t{yJ$5CRPs2y)})|qz}P~`s4TN+u7bL~IPoVwZamF403vnv;85T589n?XoEt2Y?pN?I{plw;30 zvTz<7XLL~a*@}_C;&Jr8{VubH!jQ*bO83_=chMK^ntn$&|8ke(F$UV1f%%BR8f^>O zOOVNE9a)Rm`!sKi++2I_jpe#towq4kTr_`&5fd(8%pcDE2wrgh-=nlV@jpgsN>uqt zb=m~*e~Fuk@{~_g4&-@jHjl ziPi0U2$oTq(yD*G)`Y1<@{%iG?Qja$m6s?u{BtX0$ur+}JX%dzGxj;rZpB1|4YuQr z&W`A=nz>_glo#>1X=f=m@{D!iS#n`=w8|UR_V>N0V)oAk{UTYvIKI}WC=f5k=9`}q zS|E++GwK7ngvLllWX>Np97zp7%WP5wlwchof|&Gbe57RMif+1f&i2`1aRtryVayZV9P||I6%& zRjoS+3KPt|_ZC%ng;!j1W<#&M$0TR1>xbhBE`L4#Gegmbuc{1`tIsm5{r@ZjS}@4+ zX||3RpYZ0d&j&HhyrCX4ncIG0#jM~2v}0r{hvQsZT8&lBHT0`vKeaMJvUKI5t>W&L zb(-X^&E#|Q)`Ox6+64uY{nC#?E#^A^^UgTI|9K~GEx(Lz8KJn*88G}6Po9x-(-3j; z_B$O;M|7uz7puNQd|_HeLny-#ZGTEJP+DeN9(Ao;8=%EA;65~&GWY6VXh{fLd1Ej( z2>nQ0O{pUO>Y)@Is$MC&bePNyipd4TamgZnYkR|zRK!0fBgzWRQ&{z^LcbKr(9Pd^ z`MJZH_7@N(KfILfKq)=NPNb{3*%0&hdU70osC0I~B1#J0uR3Zun8&63_uymcON$cW z{Tv0bK+Wmj@F?!f;Z8P_6T8yN!&|WW(J- zn!%$*#1>$T6n1$PC_@*^+8AzxDM-@+wJ8PaN6sy51BH~zpb5L+q?TO1qyN5 zhF+tPAy;frp}wdhB6rdb3;kq-4WIm&8D5&a^RJh}vM46re&VNU-xV{@+#ALb)Y#J~ z0N<9NeMY}T?eI^Ph~Uz!*!+VlzlseXe1+e>4hOdt?hkT|(>X6pdm|j!DALn;B2o1h zMVX**L?$CD{nN^|hlr6?d^g)3LbA@d)2tba6>0Y$t4e?D;wyW#?212#OJ-4D7olqr7vq4>f1@ew%$0@A!G z>i~Y1AJ|K4E_joISK;Di^*x65KFhDTC?%dm*fnakYG&MvQ^9t{Pl%NXzY#FF63<2F z9lhl)H?sfwZgqoJNBO~nf+G*saMkh?7g~b-ytk~JM@k5ZkmJ4^GxON-6yIMan>P!7 z`$brVE4jRQY{#O77B| zidDo~)nattmFu$fhRM7Na;(*?|NCB6yuMu5H#Zr!JO?`Br;f@P>y*ECVy8Vm$+jbD zHD&72B~f=DbzTa)+{%MO|CW17Lu8dg`dhf_;E8re6E8jpv}s>;mU)lrZ2lHPJI7#m zR9`Znr?i_5uZZ+DoH*BCM+p{``IQ;Y72D7tDM!Wh|6KTXz2ei`0gp_M)`L70@jo(2 ztfGAgsD!;3sW&B3Oub>%?-#Z9UXVm^G|iUkuAjPVTWWHy>xRjOT7Chuy2vL^h$H;x z6^xN0wb^Mc*};NA@mVS}F=n@(Xs>(+i9oOCa;8;7uCD%#6fEnypeDoW{J-{f9f!R` zRcp~bUT6jC=T7PU)KaOo5O;DS{v7SQ0ChW!4+=A?k#RaJlnx$>qdM{4s#^IK143+v zcRAN%6yXzZ}k^I*)~-%-Z*Fkdvx^{c%p1{YrubZ*+-bLINcM{lpq-_eo} ztJ9UWlP~78nOOQtV~fAf^!W4ZY^edOu8A$?ubp;{0)D z9OgRDr?_yVPxV6Wd;bwmrcov^4g5)#Il~g%!q`dgY=_ys;M?=*wdb-2{dL~1FrImn zW{knj>AtF8KQF_AH$qiizgHSQ2xr_O!~ZaEa0^^y6WLP`kgN2UOF?8g^X}OfctqH% zQTy{|!_pIfDcF3bP2|_l&JDPA-O6U599(Zy6~~fu(+qu+f=1Iqsmw8X-HmcBcjO4w z?MF&D52>lP^m_gEz2ZQboy6Nmb9~Q$nLoOyv@oY7PlwW=f8-w9%5ZF(?w36S*(Vy? z_+!F_)B`7{s@G_z99X;Jg$BxareFQO6PcE-=9pQiqq`5iuW(*zKe9ITA4O#;e@54E zu%m(ZV~|C;y-s1}{MoC!wg3713T?uJ9VSOWu{}S%&d;%(!(Hoq_N2(gGma>)T-0aTp^lDAj;Ks#L0`KN4G#A0S z=VF++VN^3LQjV==^e23Gi{%Vm*BjL}Q`&(v+LX84x=A z?)c?{vI%$^_OE`{Kzh+b;B%N0nHPC-~dvD*#N&3C%o=3)4zR?|1ueABG zSl%th-mpI6o(0cTKleB<2HJ}Vr|^-R4e$TFmMG%l9%Q_$tzS)gVfyy1h!a~^%KgB2Fvck(KBu3_$eD8@R$n5|6VadKBgMLaQ&Qyqjbby&x<4%RC4l#WLK>? zqIfB$g!d1!Z4OBZ0Oav58>Si46<41=RH3YG`h3NL)H>p$POs@}oDfYPO8GMA-N{9P zNnBJ*`@-A2!db`P;!#ZFsPH}3US!x8C1pC%3n_HVo8x84hSdZYTFHl6Z_*o(o~8!w zmZnpOEHv6*_uQQ7S!_8dV@|s=!Ptiw3I3#;P0w`>1+EFO8Jr5Bw05-%^)_uZfL0_l z!-RT-eI>Zktc`1bIL6m!5|W4GlbIBicnE>uO*GWSbN}-X2Zz>vjpKigv~V%$Q;gup zyH?d}C{@)R{ZnJxzo>6u{w?9?A5ednu;all>uMQ+AXui|?5OXH=L zQJ^{>=(z7wyZ%@I^l0fOvl-cYOubA>Ar#fl@LBCcM(9gqe*|dHfetCz$L;Nr_nGYz zBnt|?kIHYWaw0QNSxKzGUZuEw^zW7XW5g5y1!*sDFzdLexFA!N+T--B+u-Ri!Bu7Nui4(> zsGzx*#j{*l zdpuH=h9m>m%-?(Ac;xG+6EP}Xv>psLjQ&=}c}4xPQ+>g0Q-ma*#-OBwLMEED;W_p* z{jnsSFBx?@KLj@v^f{lS)D|9fZ^u6xn)If59iZAK9qOmOEW?dz$lT^uTwm>E2f8u+qev$V6BqPCVuPXlWl{H0_r{(d?A}5ylqgXZZDg?9bA% zq}e%?*Zec98yik-NY&DJ4k}D}W^(FCItF+C=H`I1DH}Z&UAdJZ!zG>voE6iqYubl8L404#nt2KKaPa0@aqg%@S$De`ZvDKO`F`z zkJ4yVBZxiXtuv~M2sE7QqH`B$4~;@e_CIH=Rs~P_XITH0+rsg&=$~KjJ5CBx+L9zo zMdo$g7i&6;f?TV=z=u_7w&W6b;qLsAYT3u?D!un5>w<$z-|Vl7C_VI*5?YvK+9tK~ z@&5QL&)>wKRxE>(T5p$73{Js=M{}mleQeylHSbZY{0ePDA~D3?Ocvy;m{wio`fs!y zbFb=qC)PfWt_=PzrDs<)omT{z_ywjNp;s3(c|Z0{4CmrDNf9P@)yO6c^LW?X7`SG! zE(g(_|BNPo$H-}wGuo^@Wv!!6##K%qR=wI_9H{H_ZEmOh*n-(9q zyvd?jZ?N+1^v6Ore4MrA0&?{}xqUN{K0de<{K~Dz@f`jl0ZH+DV{I`OU$zq_*GmdC zPL;k|yb*LHli{xiPGTf>Cno1XzyC?KRu`_?;I0o1YmifAyU7-3G&6OBjXd)E>F|#%QT*bqHU8ouV`~aL3G=PMR%YX*SQDG3P18t zqMd}2ZpZsmBU&JYpB=75oy-hwyS(xG=76)TeG0FV8Y{;mw(WU}nk)TYdC!X^qtmx7 z(aF#g&!_M)P_}(AVC{1{eYk9|{A6)qX@S-U#}Hb9No4ll#(lwrwP(AIR91a|^Rs$p zX<{2-cx<6^g8bxA?aUJaG%sN1C6ID`+7jWkZtR%W8#suntr9mrI&BbS++$;#TpY54CkYB0DL=aTgqpN|4eOXRT(PCqSG9Wh$aCA6deTLBYEA9< zJJ(DWJfB|G6&*W@Ivo8TF*X_G)x%1p%d?;NMrMm5b96 zo!vg46!dDfI#B$jl8D2#D6@lBT4L*Bfy*ydFJ=S>U-(9_t)EVQjb=wHbz0u9Xj048I8b zR=m&Jt=zZXq2Mb4Z0MI1(L=9>6U&h0O+DRJ^J@Iseb0Z7(oBMpV&0MSt5&AUtu$>o zSuy(|Fd$r$y8mf*^p}~>^68gbrPwO5;w2#@ztbY*=~Ca_;%nMMg4NuLlVUesnh|{d z(xVG!V8~Bp%KY9^9CxAU(9B)l_rt@}?0(In9o&-_v|OLW`MjIW`E`FXwA0$D3-_9P zT>&cW{{5ayTvOW49WpkGL8r6U?k(F3gfNBb=ML#UT&DHnax{koTZ6H9(wL*0uZqFR z&$KDu(g>LJc{SP9?}!^dP8*uldgB-Q+2(yp980s%Jk8NOqde7TuNRcagcX!5ZjH^~ zlhKD?yCR-oJ=pQxXA}<9qRY-O#R4xxO#7JcAXS~(XL#C%T z#rxjw^I1}i(#Op)CO$F!E^}-S1&ZCf2llww&^Q$U-$-cw-1eBQ`MK2E!i#O(-QAvb zKEYr8Y@DJLk`JW+J{ADlTH|dxn=)>E^AEUEed_5Grd|QX7}=EY(6d3x8P(oa)7msf zfRKmbsqR+izcd}6K6r581Bme>sph1K(}#t)i?sV)-hBvah<@)n{mkYO z%U?}FH($=Z34GjDdl3j(7sc#^6Xjwlfo>|^wq`_y0O4yN{~U0Gd@L?=dc8aG4M+34 z*p!8nVuVSfG|gM#8Ue?5jMsF{jIWb0radFh#vPG9uZ?9N$h3?;xwTwgmlii(MJTmX z`9UcZY^*U9pn)j>bRt(CQ{%ccP5cp=aK{$3_6KgMEMk@B_d2PaQ9P$&Q3v7w6i%;s z$Adz@q^qRyTgR^uQO(Koa2xxt6AMwlMi%R<4L8wXUQjn^XhXIuj8Sc;&n>p2Ber%j zP4^N=XNan9YxT#0O z4`%mMOyT$_Jmiq)zNQh-Gc~!WkkKwoWx`PhO{l_%RX<s`K?QXNNh}UxcY`{P{`KB?qmABz)^^?WS!Ua>a z$)^&RtbcFLaZ{_nO>J84MA_A2QO{J5$2%nl2e;`B@{My{nu$>SO6-aj6rcRWx3<;b z_p&_OK5|Jh*R^symiIl`$os*;`#R9WLew%okiXqfU2WZ7)i-rCW2&dGtGF#QF+ZyJ zDF0)s5z-X{O*i-p%7l2=j3mP8dA{oC?+6&$0%e3=nmcdi>cQ_PkW_qAmbv%rd(FXT z*R1Eq-D|~O$+d2w*6A!M7lRwvnH${~ zMr<*|P`E%WA9=t=JSe|4W+42(0?e~K*Q^7~c683W>z2LQ6ipOn_$>^_HLT8U+F#@` zmd*QCD7`%R<`WYT`MmC&^YIQP8RsSyvnZTXo@bXTn3guK3^<3=mG0)fFl{^jWvw;r>KgS~c5clQpAD)Xz3*wP9$r3{-crOg?4J8=eP z?Vr1}F8sHHkcAmO)h6X0!$DrtIkVp^s!BMvR1=nvpam1YD=eo;kip27u!UBi<0n)4 z3!sc(t-G#KN4;MQASj&O^?qOfvk}lHD`E0la;>UN21{pjMzGASfjfn2{Nxj|mou-c z!&SLZP~^HQTbhw_i0~_BlJoo3D!D7;x7`EInbl8r)Zd#v8WyKq87I-3d`@{!ezHwn zoFxa@b4cD@_uSg0&nCcpd!6y)&*wPr8&%6O3~;#zNN3bkdl`4t=ycU^ro~-%n(=6k x4NS7JxHd3anB+mO@(LTie29Ssf02G62)9GJ%HNXi%Rlg+)&af!8T+g*{y%}_K?nc< diff --git a/branding/logo.xcf b/branding/logo.xcf deleted file mode 100644 index 106ebf771395cea066bc492863248597f61bc9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41527 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 D-t~QS diff --git a/cmake.h.in b/cmake.h.in deleted file mode 100644 index e905598..0000000 --- a/cmake.h.in +++ /dev/null @@ -1,60 +0,0 @@ -/* cmake.h.in. Creates cmake.h during a cmake run */ - -/* Product identification */ -#define PRODUCT_TASKSH 1 - -/* Package information */ -#define PACKAGE "${PACKAGE}" -#define VERSION "${VERSION}" -#define PACKAGE_BUGREPORT "${PACKAGE_BUGREPORT}" -#define PACKAGE_NAME "${PACKAGE_NAME}" -#define PACKAGE_TARNAME "${PACKAGE_TARNAME}" -#define PACKAGE_VERSION "${PACKAGE_VERSION}" -#define PACKAGE_STRING "${PACKAGE_STRING}" - -#define CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" - -/* Localization */ -#define PACKAGE_LANGUAGE ${PACKAGE_LANGUAGE} -#define LANGUAGE_ENG_USA ${LANGUAGE_ENG_USA} - -/* git information */ -#cmakedefine HAVE_COMMIT - -/* cmake information */ -#cmakedefine HAVE_CMAKE -#define CMAKE_VERSION "${CMAKE_VERSION}" - -/* Compiling platform */ -#cmakedefine LINUX -#cmakedefine DARWIN -#cmakedefine CYGWIN -#cmakedefine FREEBSD -#cmakedefine OPENBSD -#cmakedefine NETBSD -#cmakedefine HAIKU -#cmakedefine SOLARIS -#cmakedefine KFREEBSD -#cmakedefine GNUHURD -#cmakedefine UNKNOWN - -/* Found the Readline library */ -#cmakedefine HAVE_READLINE - -/* Found the pthread library */ -#cmakedefine HAVE_LIBPTHREAD - -/* Found wordexp.h */ -#cmakedefine HAVE_WORDEXP - -/* Found tm.tm_gmtoff struct member */ -#cmakedefine HAVE_TM_GMTOFF - -/* Found st.st_birthtime struct member */ -#cmakedefine HAVE_ST_BIRTHTIME - -/* Functions */ -#cmakedefine HAVE_GET_CURRENT_DIR_NAME -#cmakedefine HAVE_TIMEGM -#cmakedefine HAVE_UUID_UNPARSE_LOWER - diff --git a/cmake/CXXSniffer.cmake b/cmake/CXXSniffer.cmake deleted file mode 100644 index cf6482a..0000000 --- a/cmake/CXXSniffer.cmake +++ /dev/null @@ -1,51 +0,0 @@ -message ("-- Configuring C++11") -message ("-- System: ${CMAKE_SYSTEM_NAME}") - -include (CheckCXXCompilerFlag) - -# NOTE: Phase out -std=gnu++0x and --std=c++0x as soon as realistically possible. -CHECK_CXX_COMPILER_FLAG("-std=c++11" _HAS_CXX11) -CHECK_CXX_COMPILER_FLAG("-std=c++0x" _HAS_CXX0X) -CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" _HAS_GNU0X) - -if (_HAS_CXX11) - set (_CXX11_FLAGS "-std=c++11") -elseif (_HAS_CXX0X) - message (WARNING "Enabling -std=c++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") - set (_CXX11_FLAGS "-std=c++0x") -elseif (_HAS_GNU0X) - message (WARNING "Enabling -std=gnu++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") - set (_CXX11_FLAGS "-std=gnu++0x") -else (_HAS_CXX11) - message (FATAL_ERROR "C++11 support missing. Try upgrading your C++ compiler.") -endif (_HAS_CXX11) - -if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set (LINUX true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set (DARWIN true) - set (_CXX11_FLAGS "${_CXX11_FLAGS} -stdlib=libc++") -elseif (${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD") - set (KFREEBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") - set (FREEBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") - set (OPENBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") - set (NETBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - set (SOLARIS true) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "GNU") - set (GNUHURD true) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN") - set (CYGWIN true) - # NOTE: Not setting -std=gnu++0x leads to compile errors even with - # GCC 4.8.3, and debugging those leads to insanity. Adding this - # workaround instead of fixing Cygwin. - set (_CXX11_FLAGS "-std=gnu++0x") -else (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set (UNKNOWN true) -endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - -set (CMAKE_CXX_FLAGS "${_CXX11_FLAGS} ${CMAKE_CXX_FLAGS}") -set (CMAKE_CXX_FLAGS "-Wall -Wextra -Wsign-compare -Wreturn-type ${CMAKE_CXX_FLAGS}") diff --git a/cmake/Modules/FindReadline.cmake b/cmake/Modules/FindReadline.cmake deleted file mode 100644 index 8fdaec1..0000000 --- a/cmake/Modules/FindReadline.cmake +++ /dev/null @@ -1,81 +0,0 @@ -# - Find the readline library -# This module defines -# READLINE_INCLUDE_DIR, path to readline/readline.h, etc. -# READLINE_LIBRARIES, the libraries required to use READLINE. -# READLINE_FOUND, If false, do not try to use READLINE. -# also defined, but not for general use are -# READLINE_readline_LIBRARY, where to find the READLINE library. -# READLINE_ncurses_LIBRARY, where to find the ncurses library [might not be defined] - -# Apple readline does not support readline hooks -# So we look for another one by default -IF (APPLE OR FREEBSD) - FIND_PATH (READLINE_INCLUDE_DIR NAMES readline/readline.h PATHS - /usr/include/ - /sw/include - /opt/local/include - /opt/include - /usr/local/include - NO_DEFAULT_PATH - ) -ENDIF (APPLE OR FREEBSD) -FIND_PATH (READLINE_INCLUDE_DIR NAMES readline/readline.h) - - -# Apple readline does not support readline hooks -# So we look for another one by default -IF (APPLE OR FREEBSD) - FIND_LIBRARY (READLINE_readline_LIBRARY NAMES readline PATHS - /usr/lib - /sw/lib - /opt/local/lib - /opt/lib - /usr/local/lib - NO_DEFAULT_PATH - ) -ENDIF (APPLE OR FREEBSD) -FIND_LIBRARY (READLINE_readline_LIBRARY NAMES readline) - -# Sometimes readline really needs ncurses -IF (APPLE OR FREEBSD) - FIND_LIBRARY (READLINE_ncurses_LIBRARY NAMES ncurses PATHS - /usr/lib - /sw/lib - /opt/local/lib - /opt/lib - /usr/local/lib - /usr/lib - NO_DEFAULT_PATH - ) -ENDIF (APPLE OR FREEBSD) -FIND_LIBRARY (READLINE_ncurses_LIBRARY NAMES ncurses) - -MARK_AS_ADVANCED ( - READLINE_INCLUDE_DIR - READLINE_readline_LIBRARY - READLINE_ncurses_LIBRARY - ) - -SET (READLINE_FOUND "NO" ) -IF (READLINE_INCLUDE_DIR) - IF (READLINE_readline_LIBRARY) - SET (READLINE_FOUND "YES" ) - SET (READLINE_LIBRARIES - ${READLINE_readline_LIBRARY} - ) - - # some readline libraries depend on ncurses - IF (READLINE_ncurses_LIBRARY) - SET (READLINE_LIBRARIES ${READLINE_LIBRARIES} ${READLINE_ncurses_LIBRARY}) - ENDIF (READLINE_ncurses_LIBRARY) - - ENDIF (READLINE_readline_LIBRARY) -ENDIF (READLINE_INCLUDE_DIR) - -IF (READLINE_FOUND) - MESSAGE (STATUS "Found readline library") -ELSE (READLINE_FOUND) - IF (READLINE_FIND_REQUIRED) - MESSAGE (FATAL_ERROR "Could not find readline -- please give some paths to CMake") - ENDIF (READLINE_FIND_REQUIRED) -ENDIF (READLINE_FOUND) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index ecd29b1..0000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required (VERSION 2.8) -include_directories (${CMAKE_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/src - ${GEN-SHELL_INCLUDE_DIRS}) - -set (gen-shell_SRCS ../Sarge/src/sarge.cpp) - -add_library (gen-shell STATIC ${gen-shell_SRCS}) - -add_executable (gen-shell_executable main.cpp) - -target_link_libraries (gen-shell_executable gen-shell ${GEN-SHELL_LIBRARIES}) - -set_property (TARGET gen-shell_executable PROPERTY OUTPUT_NAME "gen-shell") - -install (TARGETS gen-shell_executable DESTINATION /usr/bin/) diff --git a/src/main.cpp b/src/main.cpp index 516f223..ae69ebb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,74 +1,59 @@ -// gen-shell - the generic shell +// gen-shell - the generic REPL // Copyright (c) 2021, Armaan Bhojwani -#include #include -#include <../Sarge/src/sarge.h> +#include "sarge.h" + #include #include -#ifdef HAVE_READLINE #include #include -#endif //////////////////////////////////////////////////////////////////////////////// using namespace std; -const std::string getResponse(const std::string & prompt) { +const std::string +getResponse(const std::string & prompt) { std::string response { "" }; // Display prompt, get input -#ifdef HAVE_READLINE char * line_read = readline(prompt.c_str()); if (!line_read) { std::cout << "\n"; response = ""; } else { - // Save history - if ( * line_read) + if (*line_read) { add_history(line_read); + } response = std::string(line_read); free(line_read); } -#else - std::cout << prompt; - std::getline(std::cin, response); - if (std::cin.eof() == 1) { - std::cout << "\n"; - response = ""; - } -#endif return response; } //////////////////////////////////////////////////////////////////////////////// -int main(int argc, char** argv) +int +main(int argc, char** argv) { - // Command line arguments Sarge sarge; - sarge.setArgument("a", "after", - "Command to execute before leaving the shell", true); - sarge.setArgument("b", "before", - "Command to execute before entering the shell", true); - sarge.setArgument("c", "command", "Command to convert to shell", true); - sarge.setArgument("h", "help", "Get help.", false); + sarge.setArgument("c", "command", "Command to convert to REPL", true); + sarge.setArgument("h", "help", "Show this message.", false); sarge.setArgument("p", "prompt", "Define a custom prompt", true); - sarge.setArgument("", "no-space", - "Dont automatically add spaces after custom prompt and command", true); - sarge.setDescription("Make a shell from any executable"); + sarge.setArgument("q", "quotes", "Treat whole input as argv[1]", false); + sarge.setDescription("Make a REPL from any executable"); sarge.setUsage("gen-shell "); if (!sarge.parseArguments(argc, argv)) { - std::cerr << "Couldn't parse arguments..." << std::endl; + std::cerr << "Could not parse command line arguments" << std::endl; return 1; } @@ -77,47 +62,29 @@ int main(int argc, char** argv) return 0; } - bool space = true; - if (sarge.exists("no-space")) { - space = false; - } - - // Define input command string arg_cmd; sarge.getFlag("command", arg_cmd); - if ( space ) - arg_cmd += " "; - // Define prompt string prompt = ""; sarge.getFlag("prompt", prompt); - if ( prompt == "" ) - { + if (prompt == "") { prompt = "% "; - } else if ( space ) { - prompt += " "; } - // Execute before-command - string before_command; - sarge.getFlag("before", before_command); - system (before_command.c_str ()); - - // Execute after-command - string after_command; - sarge.getFlag("after", after_command); - // Do the stuffs! while (true) { auto command = getResponse(prompt); - if (command == "" || command == "exit" || command == "quit" ) - { - system (after_command.c_str ()); + if (command == "" || command == "exit" || command == "quit" ) { return 0; } else { - string whole_command = arg_cmd + command; - system (whole_command.c_str ()); + string whole_command = arg_cmd + " "; + if (sarge.exists("quotes")) { + whole_command = whole_command + "\"" + command + "\""; + } else { + whole_command += command; + } + system(whole_command.c_str()); } } } diff --git a/src/sarge.cpp b/src/sarge.cpp new file mode 100644 index 0000000..eb7d14f --- /dev/null +++ b/src/sarge.cpp @@ -0,0 +1,201 @@ +/* + sarge.cpp - Implementation file for the Sarge command line argument parser project. + + Revision 0 + + Features: + - + + Notes: + - + + 2019/03/16, Maya Posch + +*/ + + +#include "sarge.h" + +#include + + +// --- SET ARGUMENT --- +void Sarge::setArgument(std::string arg_short, std::string arg_long, std::string desc, bool hasVal) { + std::unique_ptr arg(new Argument); + arg->arg_short = arg_short; + arg->arg_long = arg_long; + arg->description = desc; + arg->hasValue = hasVal; + args.push_back(std::move(arg)); + + // Set up links. + if (!arg_short.empty()) { + argNames.insert(std::pair(arg_short, args.back().get())); + } + + if (!arg_long.empty()) { + argNames.insert(std::pair(arg_long, args.back().get())); + } +} + + +// --- SET ARGUMENTS --- +void Sarge::setArguments(std::vector args) { + for (Argument a : args) { + setArgument(a.arg_short, a.arg_long, a.description, a.hasValue); + } +} + + +// --- PARSE ARGUMENTS --- +bool Sarge::parseArguments(int argc, char** argv) { + // The first argument is the name of the executable. After it we loop through the remaining + // arguments, linking flags and values. + execName = std::string(argv[0]); + bool expectValue = false; + std::map::const_iterator flag_it; + for (int i = 1; i < argc; ++i) { + // Each flag will start with a '-' character. Multiple flags can be joined together in the + // same string if they're the short form flag type (one character per flag). + std::string entry(argv[i]); + + if (expectValue) { + // Copy value. + flag_it->second->value = entry; + expectValue = false; + } + else if (entry.compare(0, 1, "-") == 0) { + if (textArguments.size() > 0) { + std::cerr << "Flags not allowed after text arguments." << std::endl; + } + + // Parse flag. + // First check for the long form. + if (entry.compare(0, 2, "--") == 0) { + // Long form of flag. + entry.erase(0, 2); // Erase the double dash since we no longer need it. + + flag_it = argNames.find(entry); + if (flag_it == argNames.end()) { + // Flag wasn't found. Abort. + std::cerr << "Long flag " << entry << " wasn't found." << std::endl; + return false; + } + + // Mark as found. + flag_it->second->parsed = true; + ++flagCounter; + + if (flag_it->second->hasValue) { + expectValue = true; // Next argument has to be a value string. + } + } + else { + // Parse short form flag. Parse all of them sequentially. Only the last one + // is allowed to have an additional value following it. + entry.erase(0, 1); // Erase the dash. + for (int i = 0; i < entry.length(); ++i) { + std::string k(&(entry[i]), 1); + flag_it = argNames.find(k); + if (flag_it == argNames.end()) { + // Flag wasn't found. Abort. + std::cerr << "Short flag " << k << " wasn't found." << std::endl; + return false; + } + + // Mark as found. + flag_it->second->parsed = true; + ++flagCounter; + + if (flag_it->second->hasValue) { + if (i != (entry.length() - 1)) { + // Flag isn't at end, thus cannot have value. + std::cerr << "Flag " << k << " needs to be followed by a value string." + << std::endl; + return false; + } else { + expectValue = true; // Next argument has to be a value string. + } + } + } + } + } + else { + // Add to text argument vector. + textArguments.push_back(entry); + } + } + + parsed = true; + + return true; +} + + +// --- GET FLAG --- +// Returns whether the flag was found, along with the value if relevant. +bool Sarge::getFlag(std::string arg_flag, std::string &arg_value) { + if (!parsed) { return false; } + + std::map::const_iterator it = argNames.find(arg_flag); + if (it == argNames.end()) { return false; } + if (!it->second->parsed) { return false; } + + if (it->second->hasValue) { arg_value = it->second->value; } + + return true; +} + + +// --- EXISTS --- +// Returns whether the flag was found. +bool Sarge::exists(std::string arg_flag) { + if (!parsed) { return false; } + + std::map::const_iterator it = argNames.find(arg_flag); + if (it == argNames.end()) { return false; } + if (!it->second->parsed) { return false; } + + return true; +} + + +// --- GET TEXT ARGUMENT --- +// Updates the value parameter with the text argument (unbound value) if found. +// Index starts at 0. +// Returns true if found, else false. +bool Sarge::getTextArgument(uint32_t index, std::string &value) { + if (index < textArguments.size()) { value = textArguments.at(index); return true; } + + return false; +} + + +// --- PRINT HELP --- +// Prints out the application description, usage and available options. +void Sarge::printHelp() { + std::cout << std::endl << description << std::endl; + std::cout << std::endl << "Usage:" << std::endl; + std::cout << "\t" << usage << std::endl; + std::cout << std::endl; + std::cout << "Options: " << std::endl; + + // Determine whitespace needed between arg_long and description. + int count = 1; + std::vector >::const_iterator it; + for (it = args.cbegin(); it != args.cend(); ++it) { + if ((*it)->arg_long.size() > count) { + count = (*it)->arg_long.size(); + } + } + + count += 3; // Number of actual spaces between the longest arg_long and description. + + // Print out the options. + for (it = args.cbegin(); it != args.cend(); ++it) { + std::cout << ((*it)->arg_short.empty() ? " " : "-" + (*it)->arg_short + ", ") + << "--" << (*it)->arg_long; + std::cout << std::string(count - (*it)->arg_long.size(), ' ') << (*it)->description + << std::endl; + } +} diff --git a/src/sarge.h b/src/sarge.h new file mode 100644 index 0000000..ab24c72 --- /dev/null +++ b/src/sarge.h @@ -0,0 +1,54 @@ +/* + sarge.h - Header file for the Sarge command line argument parser project. + + Revision 0 + + Notes: + - + + 2019/03/16, Maya Posch + +*/ + + +#include +#include +#include +#include + + +struct Argument { + Argument() : hasValue(false), parsed(false) { /* */ } + std::string arg_short; + std::string arg_long; + std::string description; + bool hasValue; + std::string value; + bool parsed; +}; + + + +class Sarge { + std::vector > args; + std::map argNames; + bool parsed = false; + int flagCounter = 0; + std::string execName; + std::string description; + std::string usage; + std::vector textArguments; + +public: + void setArgument(std::string arg_short, std::string arg_long, std::string desc, bool hasVal); + void setArguments(std::vector args); + void setDescription(std::string desc) { this->description = desc; } + void setUsage(std::string use) { this->usage = use; } + bool parseArguments(int argc, char** argv); + bool getFlag(std::string arg_flag, std::string &arg_value); + bool exists(std::string arg_flag); + bool getTextArgument(uint32_t index, std::string &value); + void printHelp(); + int flagCount() { return flagCounter; } + std::string executableName() { return execName; } +}; -- 2.39.2