From d84bcdac5cb321ff912741f8a66948030e885544 Mon Sep 17 00:00:00 2001 From: g8bpq Date: Sun, 17 May 2026 08:14:56 +0100 Subject: [PATCH] 6.0.25.28 --- AGWAPI.c | 8 +- BBSHTMLConfig.c | 12 +- BBSUtilities.c | 52 +- BPQINP3.c | 5 +- BPQMail.aps | Bin 92748 -> 69752 bytes BPQMail.c | 4 + BPQMail.rc.bak | 1183 ------------------- BPQMailConfig.c | 9 + Bpq32.c | 6 +- Cmd.c | 308 ++++- CommonCode.c | 74 +- Debug/BuildLog.htm | Bin 0 -> 6926 bytes Debug/NodeMapTest.exe.embed.manifest | 8 + Debug/NodeMapTest.exe.embed.manifest.res | Bin 0 -> 468 bytes Debug/NodeMapTest.exe.intermediate.manifest | 8 + Debug/NodeMapTest.obj | Bin 0 -> 105675 bytes Debug/mt.dep | 1 + Debug/vc80.idb | Bin 0 -> 142336 bytes Debug/vc80.pdb | Bin 0 -> 77824 bytes Events.c | 2 +- HTTPcode.c | 109 +- L2Code.c | 15 + L4Code.c | 2 +- LinBPQ.c | 2 + NodeMapTest.c | 57 +- RigControl.c | 5 +- TelnetV6.c | 96 +- UZ7HODrv.c | 2 +- Versions.h | 6 +- WebMail.c | 49 +- asmstrucs.h | 16 +- bpqaxip.c | 2 +- cMain.c | 14 +- config.c | 36 +- configstructs.h | 5 + kiss.c | 100 +- mailapi.c | 9 + nodelog.txt | 0 telnetserver.h | 2 +- 39 files changed, 827 insertions(+), 1380 deletions(-) delete mode 100644 BPQMail.rc.bak create mode 100644 Debug/BuildLog.htm create mode 100644 Debug/NodeMapTest.exe.embed.manifest create mode 100644 Debug/NodeMapTest.exe.embed.manifest.res create mode 100644 Debug/NodeMapTest.exe.intermediate.manifest create mode 100644 Debug/NodeMapTest.obj create mode 100644 Debug/mt.dep create mode 100644 Debug/vc80.idb create mode 100644 Debug/vc80.pdb create mode 100644 nodelog.txt diff --git a/AGWAPI.c b/AGWAPI.c index f40ba4c..5dc2f9c 100644 --- a/AGWAPI.c +++ b/AGWAPI.c @@ -1393,7 +1393,13 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr) if (sockptr->AGWRXHeader.DataKind == 'V') // Unproto with VIA string { Digis = sockptr->MsgData[0]; // Number of digis - + + if (Digis > 7) + { + AGWDataSocket_Disconnect(sockptr); + return 0; + } + for (j = 1; j<= Digis; j++) { ConvToAX25(&sockptr->MsgData[(j - 1) * 10 + 1],&TXMessage[7+(j*7)]); // No "last" bit diff --git a/BBSHTMLConfig.c b/BBSHTMLConfig.c index 05a08bb..4593cbd 100644 --- a/BBSHTMLConfig.c +++ b/BBSHTMLConfig.c @@ -439,9 +439,6 @@ void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, if (URL[0] == 0 || Method == NULL) return; - if (strstr(input, "Host: 127.0.0.1")) - LOCAL = TRUE; - if (Session->TNC == (void *)1) // Re-using an address as a flag LOCAL = TRUE; @@ -2032,6 +2029,15 @@ VOID SaveFwdDetails(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R ptr1 = GetNextParam(&ptr2); // Connect Timeout FWDInfo->ConTimeout = atoi(ptr1); + // Don't allow blocked uncompressed + + if (FWDInfo->AllowBlocked) + FWDInfo->AllowCompressed = 1; + + if (FWDInfo->AllowCompressed) + FWDInfo->AllowBlocked = 1; + + SaveConfig(ConfigName); GetConfig(ConfigName); diff --git a/BBSUtilities.c b/BBSUtilities.c index e087e3b..f56e24f 100644 --- a/BBSUtilities.c +++ b/BBSUtilities.c @@ -7368,6 +7368,14 @@ VOID SetupForwardingStruct(struct UserInfo * user) ForwardingInfo->AllowB2 = GetIntValue(group, "UseB2Protocol"); ForwardingInfo->SendCTRLZ = GetIntValue(group, "SendCTRLZ"); + // Don't allow blocked uncompressed + + if (ForwardingInfo->AllowBlocked) + ForwardingInfo->AllowCompressed = 1; + + if (ForwardingInfo->AllowCompressed) + ForwardingInfo->AllowBlocked = 1; + if (ForwardingInfo->AllowB1 || ForwardingInfo->AllowB2) ForwardingInfo->AllowCompressed = TRUE; @@ -9346,14 +9354,18 @@ VOID Parse_SID(CIRCUIT * conn, char * SID, int len) } } - // Only allow blocked non-binary to other BPQ Nodes + // No longer Only blocked non-binary to other BPQ Nodes if ((conn->BBSFlags & FBBForwarding) && ((conn->BBSFlags & FBBCompressed) == 0) && (conn->BPQBBS == 0)) { - // Switch back to MBL + // Disconnect user + + Logprintf(LOG_BBS, conn, '?', "Uncompressed Blocked Forwarding is no longer supported - reconfgure BBS for MBL forwarding"); + + conn->BBSFlags &= ~RunningConnectScript; // so it doesn't get reentered + Disconnect(conn->BPQStream); + return ; - conn->BBSFlags |= MBLFORWARDING; - conn->BBSFlags &= ~FBBForwarding; // Turn off FBB Blocked } return; @@ -12048,6 +12060,7 @@ void run_pg(CIRCUIT * conn, struct UserInfo * user) FILE *iop; int argc, pdes[2]; pid_t pid; + int i; pgret = 9999; @@ -12057,6 +12070,20 @@ void run_pg(CIRCUIT * conn, struct UserInfo * user) conn->InputBuffer[conn->InputLen] = 0; strlop(conn->InputBuffer, 13); + + // validate command is alphanumberic + + for (i = 0; i < conn->InputLen; i++) + { + if (isalnum(conn->InputBuffer[i]) == 0 && conn->InputBuffer[i] != ' ') + { + BBSputs(conn, "PG commnand string invalid\r"); + conn->InputMode=0; + SendPrompt(conn, user); + return; + } + } + conn->InputLen = 0; if (!user->Temp->RUNPGPARAMS) @@ -12088,7 +12115,7 @@ void run_pg(CIRCUIT * conn, struct UserInfo * user) char pg_dir[MAX_PATH]; char log_file[50] = "pg.log"; char call[10]; - char data[80]; + char data[256]; char line[80]; size_t bufsize = 80; @@ -12307,6 +12334,7 @@ void run_pg( CIRCUIT * conn, struct UserInfo * user ) CHAR chBuf[BUFSIZE]; int index = 0; int ret = 0; + int i; // if first entry allocate RUNPGPARAMS if (!user->Temp->RUNPGPARAMS) @@ -12322,6 +12350,20 @@ void run_pg( CIRCUIT * conn, struct UserInfo * user ) conn->InputBuffer[conn->InputLen] = 0; strlop(conn->InputBuffer, 13); + + // validate command is alphanumberic + + for (i = 0; i < strlen(conn->InputBuffer); i++) + { + if (isalnum(conn->InputBuffer[i]) == 0 && conn->InputBuffer[i] != ' ') + { + BBSputs(conn, "PG commnand string invalid\r"); + conn->InputMode=0; + SendPrompt(conn, user); + return; + } + } + conn->InputLen = 0; // Build command line. Parmas are: diff --git a/BPQINP3.c b/BPQINP3.c index 59ec9b3..a5598e6 100644 --- a/BPQINP3.c +++ b/BPQINP3.c @@ -400,6 +400,9 @@ VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port) UINT Stamp, HH, MM; char Normcall[10]; + if (Route == 0 || Route->NEIGHBOUR_LINK == 0 || Route->NEIGHBOUR_LINK->LINKCALL == 0) + return; + Normcall[ConvFromAX25(Route->NEIGHBOUR_LINK->LINKCALL, Normcall)] = 0; if (DEBUGINP3) Debugprintf("Processing RIF from %s INP3Node %d Route SRTT %d", Normcall, Route->INP3Node, Route->SRTT); @@ -1711,7 +1714,7 @@ VOID SendNewInfo() if (Dest->INP3FLAGS & NewNode) { char call[10]; - ConvFromAX25(Dest->DEST_CALL, call); + call[ConvFromAX25(Dest->DEST_CALL, call)] = 0; if (DEBUGINP3) Debugprintf("INP3 Sending New Node %s", call); Dest->INP3FLAGS &= ~NewNode; diff --git a/BPQMail.aps b/BPQMail.aps index 668d7a768974d43061177eb08abed18ade570b01..73fb296f9db5654f62983d8373f3e909ca12b770 100644 GIT binary patch delta 3777 zcmbtWeNa?Y6hG(fvL7Uhda+O!AuFBH+o`t?rb$+Q&^}1?2C8cVy zyDHDAmbfY^T$TSq6-5gd+dU<0-&ap7<-jYea1K9Pk5+!kjS1-BScQ4Y5d(|s%Vu3C zE#?H+1Ww3e-oDN3`pLL>pr*LR-2g`T0HVRqhWj212t+i^ca*&2$Tv)FE7U+WlxXgd z|1a_xM}29Nm>F};8vJiy2BH*jmr1Jvy{Cant{F1A2&7}k|RUdC;e%G zFr!T}-na|nRmhRP+jsFDh5U%oDyWcdutB8m@EG}$=gw%JaU;_%gGXrE?4^P15t&sm zUqGJ^*sC;(I4mQIXiyYUaYv{sVPBQ>8Sdgc3aX^i-gXHU?{E(K(YhaI!FMnQcJQBbF_CYbh8cvFNvus`y`N3P-!hbD zgZLPIIELZr)FoESHUvl}s^Q@%x{iU>01xLo#muMy|pguE%i2grr>5a%H{{Ny`EhSJuA9M|P zp%grHS78yjD7TU<7u`$gWB1UT^N}S!{8F;i00p`z$wMo>fQxCNs)9V)J5)kkv}9Gt z)}cI(IQ4H>!DT3@{`90ezG@` zRN>ngk_xbkYMsfx_0kJrgI?PsI=ANF;_78a-6R*5)*6a*DuEV;HSx^mo7mYD6Z}*? zq3C8j%T7Fzs+;BaV0P^R-8Evd{?ByRd3?Qsy63ZvRX5b@W?}4RgSS}kJMS{Ecbnqb z+l}w&7Szky)(q%o`I>dDouQlM`(WIB7rI%j!Mvx_^?#lRI$M+2!IpU4 zdJcBBPGt*QS4^&@b3o)qp=}Rhqu}n9n42X|*xho47RQoxa_ex!T4}@6S~+!v$Pc-3 zuIUKv*geR7t1#PqFiM^*7@kb!v8yrGw3Px|Ozf$XPE#|Pxn`Dq%Fb=8(Wsm;v%XXL zCb3iPw6MM3ri@p{0vKs`6=#!T`gvK$wflIF2rf)w1?TN1XEeaI$^7DKOjFdUJh~2@ z$`}WqTZd_emkWVEQHQC9+mA-WvE{(ce)7KlIPj^$ z=w1bUfiO1J0dEjSiy!!QVa#p>et-<+@LGOn7N+oXM4>#lj(<2CQ+C&r-QC20nu8hU zOH_p$n}AQR#|I1vn}IK{$7zP@0Pr34IMLip?$=%fez_itGBUS|IU4DDk|s~*omg=) z(^?;G;vc`lPd|oszNLW%_+TghVL4`*){_7ASNVr3W|{3|JKBJsZNLYVt~P#X1s0gZ zQSf{lzq11E=613(cTpJ{Y4(5Y65wRs*N77owOvN=b8Ce7c0RWjv-rF1wc zQ*{bt{^{~7Po1^aUVH7e*Is+AwRiK`9W{qu8?`GE?pb47>n>T9+cvay+p5cluiCsS zwRtGAb;C77t0F_!tn!9;Y+X0BYVDRk?e1C?9^SNRc(Z~+=_?XzHf(I)y3X9Tdxp7V z*VsKz?fxWF)w#gj|3M=?4t~&V-*21`TZ&sI*<;Q651W>Zu%|uyK3rKdVkWuYURmvo zP!emq`O|-!Vs?GhWVU=&x98$d4pohqU*EBd<6 zs_YSu=SH*t58oRxm%lbwf9{1wI_Y;-o3>L^%#<(g9kD=r%~xN%GGZ=A%%m?nN6h7| zJ=cGEv}VL?wiR!yvVSvTHnorZ&uY7EK0ym^fMy@F-kYFXA?dRxl_JyXmbU(8r5?+_be3}gn}xZipqgNPx7 z$-2vFY}_x25{<>PZib~AOy|-OC+n(&og!f-;e~SXcqHC$72B&})%3qYkJZ`H2fpFF zZpPuO)@-+W{Mkyl$()5(dgh^h{ncIi)oEGMJnP1jZWdZ!=4LF5q>ClP@m$2UKoWcf zm-1`9Yk^n!ovDj=j<)B}|LTh~$Jmn#PIP%b5_96I{(Rh7k;-MugFO>fvbcp-FD!H~ zG*Y>=+Dl8TicA=v|63J{=6*RvV21+f$PBQGq@y4x!EgH~bnzr)XWF(tPIBC*{jsK>i zsW-H7Xx;Xq=!T6$+kAKf;7%x&$pXL;e;KS)^eykMMw#?8o!~3hKO*_VP(ga^72! zz~Wiv#B+k=F-QFM#!HsCdT5c(XJgqok?9!c0};t%G`TFTzRoxyh&mxaQ1)0>6*`=S z|IcNFyBuq}vtxk}M)FvV>9o`D!Zb20A7-8OXPe!(VnEW^wy3K_Nvh5cA)4hw$un7< zT@_$Brx@8oXBQMfEQvakrxh2?I0>R(i%{(h*k3${^NZXoVnWaZ&R@2;UJkr9?zc|udVDfN2nTlX`7sw>h z1d#{?@XanCk0qB9Ky@0%RC%d1Tn7Q6SL&k*0xGXAKvk>Zd~^`v!oLuN=*BZ$!ddPW zV5opE48n8Sa2X^lL7H*H%K+B-5DxKF*ol{cCE5@WO96*M1Ko+J3KQB;A><7>pzI4$ z!i-5Mg$bpX$ii{@GcB-;yUZV%k0^}{HUx5=YJmzZ6w_H!YPgU}W@8DLyby!S;_?I# zaY^B%Yc~N%g|?kI1}kvYt_X)!Cs5T`6`XK-MHIUYbOxn$vLb3|GR)@J8e(b)p^z6| zvvDKV1laSC;lkWQt$)5BZ0QxjGKhBekQCtqvy1D^{g#Rdbmk<|ahH7wHPg*R`^XWS?u z5FM~MrHNO+k6k@MZ7{bYW*VL*mBfaejIU6HECU)Yyj?yKOERaDH4rCkacd(CaoHipMHyUHo38^#KU}pZLMFc0|C}1G0PL?tb@TFWV23q0O1~6Cee|mgu4@u6&#w^u8Qd!$WZ)7U{!G=YiS?@AL)8& zLR2{GxZ`ExF)zzYvRk*@TG6cQdE|!?A*e5#Mni?72n0neB54Sg;QdZU(+w$UPo0SG zB*r0F$-+Po^3rI#A+A~Sw+#{vl&OIAS*zp|xwX3-1|Dn=#~b8NHj_@LyjT|DA@SGY zQOK6adlZ93qX9T^4d(|^1qzK3(&&(=n2!*@0dOuDHwhaNSDX(V|# z?m8Lmjm-)BS2C{*)j(=Xgaj|3CmRnj{;jQri}6Ebh?B+=9+xzN4*nFHCAT-O(a}@DGnn_c zmxZNSq4u5^i;#!yEos$R(6aCMl+C#>rT_Ff(uS} znrupR(yL}V*8J}FrcErZ&?Qp?NcojWjm^hUJViq2Fa%7_CPQ%sX|-4FM*Eb+TzuFf z9cHt+^1nBgoq0G9!xeYGNQd0abD$e4m@d*mPf=$Qk0`yug`Rc=R2x99I%#2YDGm&# zLxfR{v{(glOM~g`iZl&qkt#!408CrlBArhksQz-1>O{cl40bbdwTo0M6S!L#2PLXt zqZ%P_f>Jgrpg8b{!1bw0$a6yvQl(HhmQ%n3;zSjwFUgaRT_`YaYrsc8@q3ukjEB_JuTP(>({8l;$^ z>ohIUZa`2eM0^)hiK!EFSwJ~4Il{3P%(Fb5oV*gemCYg&^L%HBELxjT294qaic*}G z009#)M}9hW0Fz88TJGTiH@uV*CCaZ$eUYi5X4KDlH%+~^AX{R=x)^9K_}MHJKA2hJ z2Xr148Q!#J!)7Y(p)Wz8gh+`;a?Pe8g6o<)hZ`x5lM>+A{75puDb4ZQ@E#d}`}A0L zmMmU0aMrCG-m!VR-v+DCyz{eWUp!)$-LPqBE6Kq77@Fisu)LGY4iHoq+Bp_OUF>=( zfPJNu1txdY9Z(8VUCA1(9@f1Kn>--i3%cwiTi`4RP*s8evy|9ls{kAd@GBfr5A(MX z;MDh2wCSQoijW2xIue|n5^}4a$lGopKa9UWR3$ zM8qp&=}xNvsP-bHX~**hQyHpx_y{4tB0JDYK=uAY4IT=U{y`L=k%qe8abukeX-tR$ z*#WpJqM`+rjr=N+v;Z-pk^TU@BpVa!mZBp`l!z5B#E_YZd80w8L#VleMT~X-5n2kP zJaWxI=zI#f1o8oJt$Ff)XcF#IaE+Q3sY^$A@}>v}rQSrTIY}%-g%th-l~H2hr{+RU zL5SZ#Cz=}+kO{M}er_)0=~O(9-H+JlTnl?1Ga|lx9F?R};x4$HOs!vEI-|k0)Pfw0 z7@{b(5CDY}@HrlLs@uQtaMBr%LNjU~m=`%$37nU3AWJK&4m|*iD**2L4clXzzc-Ag z66KQ5LpqsAQ#S}hJ&;pSOmONafvAiyK^;*XKm}FQ5UC332d3I6!kY*xV*V~sYu5Zd zRj-*REn!)6yf!U8Ey(i*v9MH5n&86`=m4q~Rf1A74{#}-;Zlyzq7=?ZV3ns(Y$5cj z)*{glA|ke;h3q-VB~HLs6Ln-gS;|o@V0F5s6-iIA6yUmu1x}?1PUC>kby#kYO+k=? zOO13I377CI&v~jJ_Lkg|?5Sj)Jf7YTKS-8sh!D^Tz{;x(M$!PV8iarmxGI+gy{f|! zLb#|3OHg5=Dr`0WE9g9QC3D7GONf>H%0s?1Q14 zKDC(De(!PE1VJl?10N#ABEnP*3g8F<1H+=)#B#EqKCUY9z|5q(8&+b3epQPZf+x=E zP`L!*Y3+gHsv0nAX(V%)f~j~c>iRfeNoLF4jlqf=CM(ow^)2%4WW2fU?xwlizihJ^ z7aoMN#>{fKO%STW#+xH|*IybSi&MVA*vb&40u0m=HUa4=`AeF-L+R9);HqRQ zsS)?`(Jvv@B&Xr%xQUJ=acXGx-P1&}(zzs`R^i~blX@WEL@J2*DHa_B6I^X=y1DKb ztvJrN%#2r>NQsg@&;c6;EX2L2MOI+kWifXU74TF%gy_E;nRy^JieS@1=!0aNYBG#v z<@$_e-{hlGYRMW_oO$S#iI)X?!VZs8q8r93Ff$6|FrpSY>>@s#JKg$f#TY_4Zw0kO zwK2d|1fvWHQpOMu5=F%bMMN)^%Y+dw0~;6~vJ#{oup6$#b$9f^{gs$w8JeHGT6bvx z;3eRNoeZT#`6rQ@-zD6tR54wO0Z>NHO4zIe6i>Hujr0|QP{4hAkr^UpxJ z-XNm_$`0qH759up|MWJ4!i-N$OyQsSG{{dM=@_PG5P2ze$I2B87vNNGB-)Dc0#2zpBQRXc%)0lyHmFn%-V^ym z7==nck*B8W`(~N^y>pjpkK`YT1x;#BW`NFfP(?~#L1UuR7HW$@Q3=??)eLNvta|?} zXO=m5Z?pK)S?0rgXXXL|#1dT20tbJ`qygm@&M|%C(1esc&w!I5PZLYxP=@kNKZ+TzE;@L%qT^Z@lL^k&t@lgO zXy*M=9QyYCb7q&8Jzbzmq@5&oNUCOXE4E&99uIk=d(y~JbYt6DDupBP>PM0 zJlMSWj4{MrEIuAY=*$5EsZ#Uk&2HuND}BEBU~_N+ND9ieg%;YbBHGpFk(6}f8;&^G z(u$E#13VRuou4mI5lb9y3M<9Id4wI@lw%wlkooDuvV8YF+;VvZEe8rh>5ranR`De& z2KV?&mB4&kirC^jkw($>$W&e46t%#(k`WZAn806~jL3PEYcbr{y+%8E4tE&i_g{wi zMjLUX4!mN3)?cwn*F5ydM7i_CyL%pPNJfro0f~6*kp^8}xRa$Jq_0)FT_xHe98ZJ< zevn7&*XH8AqPfIgaeTvjrAoeQuPm4Q_Dc2qMTLK?^tF#lyYn9veE*|jH{XAB=1l1m z%7UNAl`yE4?G-6Ci#-3=O=?k%DMeCZWy0J~l;y>&Mucmz!iAk7HIA814~D@sWr$!vitgG^4IM+5ef; z<6ye%_()&+TjF_mB38?T>q+Wk!HaDv8UkxMo4Zsbg@SXyg{( zc|rvEvnOQr+^)|j75>f>vP!~Ox_63PdnJb}Xu=D|eEDP`IfVUT zt|Wuu#(@+E$J%_6I)DviZQ9cD0%+bVe3_UrofRO;3DD3+TqsQ`dFTL=cN3oh_YOy# zkKq810woL~5>!UQ%{m-Qp@f=1=*$#ukRlQbQ5CR+WUFhOHqwUa;$ z0xR*)$){Ss5$GV6L^TWhE!}+Q5*7C%cbgYJJ(sQfyHCry*!i@qo4fRR@M*E)kCblW zGqP?vo|(t(mg{rpGp+MVUD6*FNN^uT6iH{L=#g&IgTg%b%p7j{+h>|Wffl%9?zuSZ z7fZ!qY+2iB?1Y3wwI%O|3eiqPZ^SP8tO&m0**0eTSI^FFJ%cUXQehd898sf}pOwJy z<7Z_wb^GPnzF$VwzQ56I+CQEd{&2r^@U#7*nV;=%FmLUzW8CEDrcI=p9rKntjhXzM z@aTI^{NIY_M6e${*Fw9cOkEm#4pJX=1D&#v&BM=0S8wX`kIG{D0f8?$AR??kAWrS( z18w62Ec?yz0}Z1jV146&^!oV$8ClD3gvGb?xkjHi{HC?M<51W`sSUg!kH`s_yyE)Z zq??J+4jk=tD&|O=l0D`)It4+%due+bcG|%)8#9nye$MkUtO0#)dR}DT{k&MpBhQN_ z|M~eDXUK{a5Y;sHd!0_e$7pxB5se}p#cPm;<9uKLEH2%xE};VsMqA_DeQ6YTKczYO zm+7VX>K?MKz7i1F7IVjJI4hlT3&y5QItAq3MrTK&t z<#Q0|6WJ{W&=suFd0bn}#vo}49heUI=OpTf5jTLA^)mTIk#YWuVi4&UFJx2x(TifX zcfEK4zrUjRPZi&GNbs>k;xM)x`Ucbe?IGc_PvP$$lJ*l{626zcB$K#SpMU<6OzwRz zUBvC*eo6RM9hP?Ohrh}2RfokWt~)Hcx>Mf|96q1%zdzi;&$%y4yY$PV^Wm4JzrT4| zw&_Ro`R2F@s4QC`mmbijo2Qpih-S<69y~?_1Kr3Vr{wVi=j z|3DmHHVjuTu9$y)YfgE6VCQiAb118l>9{ED1cVCV9817~6@#mRxUMZr+wBaj6>Nr} z4RSSuiU;u>9kJsrRJ)5Gv}R|ZGo9lb(HDEo3DLGjQY>t5vBg} z9kH30^!dNvkwrc3nAp%a^_kG;us(Mm6XSj8m@I~Oj>$gw`7zBW9mv~u3NqLui&0^juR zyz&yHUTMQgrn04t$qk9<55Fru?6@+hc~2N#_@2PM_rw=n_n!E&>)vZRhlLKww7mMB z_@Xc06M@^_7rM6hl`bqxee3%oVDbI)`zzF{k(tgqvknJhdX}9InNXiCDJ(3;JNg6h zoAdRV{a{`Wyy-NO_6@A#`PdI8TH|o#XcF$1)#IYjxj1JZgUjHf02z%x)2qgx>DA!x z=|+t_7s|D}VfvvUDD9E-Jow0Vy?t9WzYirC+_J!t$SC2m@VjbRDZ(WN& z-OHJOw0~qCzIsBNXZ^t1M&;wcrz%~I4n6>@A*{DGRV$oUi~jTQzS-K&zgw*gI1O3r z1MTQ%Rr+HHG7)W0@#lIgXJxIh>6|mAcA7m3ViU%ktZFce=8TVh1>z=vK8F%cox1)E zX5DB)_%FT&Z(DbyNlX7`U2m;7cP^eXPP%Wh&Np|?o^nYgv#NBn-2{D(wf^`uyrkt^ z>wFRKp6c1>N^=^|#Xk6G^-Plb@@9K3bNcKooSN;68UN*3@E==?eU_KiFv|;@?Mt}H zS7&XKu$G8$H`H86Qq+EIEw>^9+E>%gAjeLCORZH^Wsc2hu669?{8}xqA6x7E1|6fA z#}vn2#}uRRx1*$g9IEaa9yQcxuQsnw|7P8{twTE(fuP=6Xm^^r88glACrvfqo>9|1 z#$r3O7T6v3sZ-Q=C+uUpwFch}=qLEG+uG8j!FcJ6|5k;5%+XoP=+V&{rN_0cNqRgl zZZ#*#0KD1|I$J9EE@{c?3;ZfdY&)?Iz_~|;k zX3zh*{H`hHFUO7@)51f!WzXHKhiv=jrtZom_RseuuB@J8uipKKK|5-$u)CXKhWx=9 zdBx|kn%$rG6)&!{$C_i3K z<5P%k0)(GkqC3cR9e}l)88^%-tggUz?w}Ss0gIMebTRBe1+1H4<8fGCrt4u?1~6Jj zBIyE#{bdE+LWaF6ux2JqSdJC5l34Z@i#M%?#Czr1#!E?@D7}?fUdqk414dns!t-K0 z`BSM;GxfZ5>B<8N%8@->|i4*vO-8yj0bJG)3kb?Z%MWnemPs-JiobF=uS-ZNmEZt9(M z8l7c+deh7^fe(Kj@bFCwC!gNj+Vka2;aYQY*F|QRJ=OfzAD?3`+kNHqPci>V5o~+rzbQfge8Uab z1Zn(#zG2*0zbEu+2Ywr>VGwUQT|~Higwq z#a;A*HDYdA+f@8Dy&UPZO@4h-@d&*f>axvuhMI~e>1Edf+swMEsW@poUZyRwi;d&a z*=zXGOFyhj?Bd{fdtP-qY8MOR?F*_mUTznEG2WhEeP7%*mlm4Ftj2&pPTRXrEgth2 zw72UD{OlorSXaGqnO$5`2R1b;?P9(T!dt8CqNxL$6Zr9u^yAv^+Qr|}kB{)9ae}?L z`l8jgxp>$7F}uKcBmZtG{(OSnP~DM7n+f3Z_j#r$woZi5C-E}8t505fuB4aqiZ@RL l{SEvw&rILlD%jT)pa$D|8G88aN*gY1G``sH@CnY{{|9pGo_7EM diff --git a/BPQMail.c b/BPQMail.c index 6ef392b..b1e361b 100644 --- a/BPQMail.c +++ b/BPQMail.c @@ -1160,6 +1160,10 @@ // 6.0.26.x // Fix forwarding to/from AEA TNC mailbox (22) +// Fix possible crash in SendBBSDataToPktMap +// Remove Uncompressed Blocked forwarding (27) +// Fix mail api returning garbage when deflate isn't requested (27) + #include "bpqmail.h" #include "winstdint.h" diff --git a/BPQMail.rc.bak b/BPQMail.rc.bak deleted file mode 100644 index 178d358..0000000 --- a/BPQMail.rc.bak +++ /dev/null @@ -1,1183 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "BPQMailrc.h" - -// Generated Help ID header file -#define APSTUDIO_HIDDEN_SYMBOLS -#include "BPQMailrc.hm" -#undef APSTUDIO_HIDDEN_SYMBOLS - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "AFXRES.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#define MAILCHAT -#include "..\CommonSource\Versions.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_PROPPAGE_LARGE DIALOG 0, 0, 235, 156 -STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Property Page" -FONT 8, "MS Sans Serif" -BEGIN -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_PROPPAGE_LARGE, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 228 - TOPMARGIN, 7 - BOTTOMMARGIN, 149 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United Kingdom) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -BPQMAIL DIALOGEX 120, 50, 341, 165 -STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "G8BPQ Mail and Chat Server 1.0.0.10 Beta July 2009" -CLASS "BPQMail" -FONT 8, "FixedSys", 0, 0, 0x0 -BEGIN - LTEXT " User Callsign Stream Conf Queue Sent Rxed",101,3,4,228,10 - LTEXT "UTC",IDC_STATIC,236,5,15,10 - LTEXT "Local",IDC_STATIC,280,5,21,10 - LTEXT "",IDC_UTC,254,5,25,10 - LTEXT "",IDC_LOCAL,307,5,25,10 - LISTBOX 100,2,16,231,130,WS_VSCROLL - LTEXT "Msgs",IDC_STATIC,236,25,40,10 - LTEXT "",IDC_MSGS,282,25,20,8 - LTEXT "Sysop Msgs",IDC_STATIC,236,36,40,10 - LTEXT "Held Msgs",IDC_STATIC,236,47,40,10 - LTEXT "",IDC_SYSOPMSGS,282,36,20,8 - LTEXT "",IDC_HELD,282,47,20,8 - LTEXT "SMTP Msgs",IDC_STATIC,236,61,40,10 - LTEXT "",IDC_SMTP,282,58,20,8 - LTEXT "Msg SEM Clashes",IDC_STATIC,236,77,63,10 - LTEXT "Alloc SEM Clashes",IDC_STATIC,236,88,68,10 - LTEXT "0",IDC_MSGSEM,321,77,20,10 - LTEXT "0",IDC_ALLOCSEM,321,88,20,10 - LTEXT "Con SEM Clashes",IDC_STATIC,236,99,68,10 - LTEXT "0",IDC_CONSEM,321,99,20,10 -END - -CONSOLEWINDOW DIALOG 17, 25, 400, 301 -STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Mail Console" -MENU CONSOLEMENU -CLASS "CONSOLEWINDOW" -FONT 8, "FixedSys" -BEGIN - EDITTEXT 118,24,228,348,15,ES_AUTOHSCROLL | ES_NOHIDESEL -END - -BPQMONWINDOW DIALOG 17, 25, 400, 300 -STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Mail Monitor" -MENU MENU_2 -CLASS "BPQMONWINDOW" -FONT 8, "FixedSys" -BEGIN - LISTBOX 121,6,25,290,109,LBS_MULTIPLESEL | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL -END - -BPQMCWINDOW DIALOG 17, 25, 500, 300 -STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Multicast Monitor" -MENU MENU_1 -CLASS "BPQMCWINDOW" -FONT 8, "FixedSys" -BEGIN -END - -BPQDEBUGWINDOW DIALOG 17, 25, 400, 300 -STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Mail Debug Window" -MENU MENU_3 -CLASS "BPQDEBUGWINDOW" -FONT 8, "FixedSys" -BEGIN - LISTBOX 122,5,156,290,109,LBS_MULTIPLESEL | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL -END - -102 DIALOG 0, 0, 385, 301 -STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_THICKFRAME -CAPTION "Configuration" -FONT 8, "System" -BEGIN -END - -BBS_CONFIG DIALOG 0, 0, 381, 306 -STYLE DS_SETFONT | WS_CHILD -FONT 8, "System" -BEGIN - LTEXT "BBS Call is the base callsign, without SSID. This is not necessarily the same as the Application Callsign defined in the BPQ32 configuration. SYSOP Call is the callsign used by the local console.",IDC_STATIC,10,4,354,23 - LTEXT "The Application Number defines which BPQ32 Application gives access to the BBS. Note this is the APPLNumber (1-32) not an Application Mask, as used in many BPQ32 programs.",IDC_STATIC,10,27,353,18 - LTEXT "The eMail Server Params configure the NNTP, SMTP and POP3 Servers, which allow normal Internet email and News clients to get messages from, and post mesages to the BBS. If you don't want to use this, set them to zero.. ",IDC_STATIC,8,52,357,27 - LTEXT "Enable UI System activates FBB compatible UI broadcasting of Message Headers",IDC_STATIC,8,80,357,15 - LTEXT "BBS Call",IDC_STATIC,7,105,37,12 - EDITTEXT IDC_BBSCall,83,103,47,14,ES_UPPERCASE - LTEXT "SYSOP Call",IDC_STATIC,138,105,42,12 - EDITTEXT IDC_SYSOPCALL,184,103,42,14,ES_UPPERCASE - CONTROL "Send SYSTEM Msgs to SYSOP call",IDC_SYSTOSYSOPCALL, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,231,104,129,12 - LTEXT "H Route",IDC_STATIC,7,122,37,12 - EDITTEXT IDC_HRoute,83,120,119,13,ES_UPPERCASE - LTEXT "BBS Appl Number",IDC_STATIC,7,138,61,10 - EDITTEXT IDC_BBSAppl,83,136,29,12 - LTEXT "Streams",IDC_STATIC,130,138,32,10 - EDITTEXT IDC_BBSStreams,168,136,29,12 - CONTROL "Refuse Bulls",IDC_REFUSEBULLS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,211,138,53,10 - CONTROL "Enable FBB UI System",IDC_ENABLEUI,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,6,157,87,10 - LTEXT "Send Mail For Beacons Every",IDC_STATIC,102,157,100,12 - EDITTEXT MAILFOR_MINS,205,156,22,12,ES_UPPERCASE - LTEXT "Minutes",IDC_STATIC,232,157,30,12 - PUSHBUTTON "Config UI Ports and Digis",IDC_UICONFIG,273,155,91,13 - LTEXT "eMail Server Params:",IDC_STATIC,7,227,135,10 - LTEXT "NNTP Port",IDC_STATIC,7,243,39,12 - EDITTEXT IDC_NNTPPort,47,241,29,14 - LTEXT "POP3 Port",IDC_STATIC,90,243,37,12 - EDITTEXT IDC_POP3Port,130,241,29,14 - LTEXT "SMTP Port",IDC_STATIC,170,243,37,12 - EDITTEXT IDC_SMTPPort,210,241,29,14 - CONTROL "Enable Remote Access",1009,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,249,240,91,14 - PUSHBUTTON "Save",IDC_BBSSAVE,159,281,50,14,BS_CENTER | BS_VCENTER - CONTROL "Don't hold messages from new users",IDC_DONTHOLDNEW, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,5,189,134,12 - CONTROL "Forward Messages to BBS Call",IDC_FORWARDTOBBS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,145,189,114,12 - CONTROL "Redirect msgs to BBS Call to SYSOP Call",IDC_BBSTOSYSOPCALL, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,213,120,146,12 - CONTROL "Don't Request Home BBS",IDC_NOHOMEBBS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,260,174,99,12 - CONTROL "Don't Request Name",IDC_NONAME,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,176,174,79,12 - EDITTEXT IDC_AMPR,72,258,119,13 - LTEXT "AMPR Address",IDC_STATIC,6,260,60,12 - CONTROL "Send ampr.org mail to AMPR host",IDC_FORWARDAMPR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,258,124,14 - CONTROL "Allow users to kill T msgs",IDC_USERRKILLT,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,264,189,95,12 - CONTROL "Set Don't add WINLINK.ORG flag on new users",IDC_DEFAULTNOWINLINK, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,5,174,162,12 - CONTROL "Don't allow unknown users",IDC_KNOWNUSERS,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,277,138,98,10 - CONTROL "Don't Check From Calls",IDC_DONTCHECKFROM,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,5,204,95,12 -END - -CHAT_CONFIG DIALOG 0, 0, 381, 266 -STYLE DS_SETFONT | WS_CHILD -FONT 8, "System" -BEGIN - LTEXT "Chat Appl Number",-1,115,109,61,8 - EDITTEXT 2001,185,106,29,14 - LTEXT "Nodes to link to",-1,115,129,53,8 - EDITTEXT 2002,185,125,87,88,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - DEFPUSHBUTTON "Save",2100,172,226,50,14,BS_CENTER | BS_VCENTER - LTEXT "The Application Number defines which BPQ32 Application gives access to the Chat Server. Note this is the APPLNumber (1-32) not an Application Mask, as uses in many BPQ32 programs.",-1,10,10,353,18 - LTEXT "The Nodes to link to box defines which other Chat Nodes should be connected to, or from which connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. Note these must be directly connectable - ie in your NODES table.",-1,10,30,355,25 - LTEXT "The Callsign of the Chat Node is not defined here - It is obtained from the BPQ32 APPLCALL parameter corresponding to the Chat Appl Number.",-1,10,60,360,25 -END - -IDD_USEREDIT DIALOGEX 20, 20, 293, 281 -STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_THICKFRAME - -CAPTION "Edit User" -FONT 8, "System", 0, 0, 0x1 -BEGIN - COMBOBOX 5000,7,10,57,123,CBS_SIMPLE | CBS_SORT | CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP - CONTROL "BBS",IDC_BBSFLAG,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,9,57,10 - CONTROL "PMS",IDC_PMSFLAG,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,22,57,10 - CONTROL "Sysop",IDC_SYSOP,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,35,57,10 - CONTROL "Expert",IDC_EXPERT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,48,57,10 - CONTROL "Excluded",IDC_EXCLUDED,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,61,57,10 - CONTROL "Hold Messages",IDC_HOLDMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,74,65,10 - CONTROL "NTS MPS",IDC_NTSMPS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,87,69,10 - CONTROL "Permit Email",IDC_EMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,163,9,57,10 - CONTROL "Poll RMS for SSID's",IDC_POLLRMS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,163,23,78,8,0,HIDC_POLLRMS - EDITTEXT RMS_SSID1,244,21,13,12,ES_AUTOHSCROLL - EDITTEXT RMS_SSID2,258,21,13,12,ES_AUTOHSCROLL - EDITTEXT RMS_SSID3,272,21,13,12,ES_AUTOHSCROLL - CONTROL "RMS Express User",RMS_EXPRESS_USER,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,163,35,77,10 - LTEXT "Last Listed",IDC_STATIC,163,87,38,12 - EDITTEXT IDC_LASTLISTED,248,85,29,12,ES_AUTOHSCROLL - LTEXT "Name",IDC_STATIC,7,184,35,14 - EDITTEXT IDC_NAME,55,182,96,14,ES_AUTOHSCROLL - LTEXT "Password",IDC_STATIC,7,202,35,14 - EDITTEXT IDC_PASSWORD,55,200,89,14,ES_AUTOHSCROLL - LTEXT "QTH",IDC_STATIC,7,220,35,14 - EDITTEXT IDC_QTH,55,218,130,14,ES_AUTOHSCROLL - LTEXT "Home BBS",IDC_STATIC,7,238,40,14 - EDITTEXT IDC_HOMEBBS,55,236,162,14,ES_UPPERCASE | ES_AUTOHSCROLL - PUSHBUTTON "Add user",IDC_ADDUSER,79,257,42,14,BS_CENTER | BS_VCENTER - PUSHBUTTON "Delete user",5101,124,257,42,14,BS_CENTER | BS_VCENTER - PUSHBUTTON "Save",5102,169,257,42,14,BS_CENTER | BS_VCENTER - LTEXT "Connects in",IDC_STATIC,10,131,45,10 - LTEXT "Connects out",IDC_STATIC,10,142,45,10 - LTEXT "0",CONN_IN,57,131,26,10,0,WS_EX_RIGHT - LTEXT "0",CONN_OUT,57,142,26,10,0,WS_EX_RIGHT - LTEXT "Msgs in",IDC_STATIC,87,131,35,10 - LTEXT "Msgs out",IDC_STATIC,87,142,35,10 - LTEXT "0",MSGS_IN,125,131,26,10,0,WS_EX_RIGHT - LTEXT "0",MSGS_OUT,125,142,26,10,0,WS_EX_RIGHT - LTEXT "Rejects in",IDC_STATIC,159,131,35,10 - LTEXT "Rejects out",IDC_STATIC,159,142,40,10 - LTEXT "0",REJECTS_IN,201,131,26,10,0,WS_EX_RIGHT - LTEXT "0",REJECTS_OUT,201,142,26,10,0,WS_EX_RIGHT - LTEXT "Bytes out",IDC_STATIC,10,164,35,10 - LTEXT "",BYTES_OUT,45,164,38,10,0,WS_EX_RIGHT - LTEXT "Bytes in",IDC_STATIC,10,153,35,10 - LTEXT "0",BYTES_IN,45,153,38,10,0,WS_EX_RIGHT - LTEXT "Last Connect",IDC_STATIC,87,153,45,10 - LTEXT "Never",LASTCONNECT,134,153,93,10 - CONTROL "Don't add @winlink.org",NO_WINLINKdotORG,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,163,47,100,10 - LTEXT "ZIP",IDC_STATIC,189,221,12,11 - EDITTEXT IDC_UZIP,207,219,38,12,ES_AUTOHSCROLL - CONTROL "Allow sending Bulls",ALLOW_BULLS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,163,61,100,10 - CONTROL "Include SYSOP msgs in LM",IDC_SYSOP_IN_LM,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_DISABLED | WS_TABSTOP,163,74,100,10 - EDITTEXT IDC_CMSPASS,187,201,88,14,ES_PASSWORD - CONTROL "CMS Pass",IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,149,203,34,14 - CONTROL "Send Mail For to APRS ssid",IDC_APRSMFOR,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,113,108,10 - EDITTEXT IDC_APRSSSID,182,112,16,12,ES_AUTOHSCROLL - CONTROL "Redirect to RMS",IDC_RMSREDIRECT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,72,100,69,10 -END - -ISP_CONFIG DIALOG 26, 5, 381, 284 -STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE -FONT 8, "System" -BEGIN - EDITTEXT 3001,95,110,100,15 - LTEXT "SMTP Server",-1,10,130,53,13 - LTEXT "The system relies on having an email domain which supports forwarding of all email addresses to a fixed mailbox. For example, I could register domain mycall.org.uk, and have any mail sent to anyone@mycall.org.uk forwarded to mymailbox@myisp.com",1,10,34,349,25 - LTEXT "POP3 Server",-1,10,146,61,13 - LTEXT "ISP Account Name",-1,10,163,63,13 - EDITTEXT IDC_ISPSMTPName,95,127,148,15 - EDITTEXT 3004,95,144,147,15 - EDITTEXT 3006,95,161,147,15 - LTEXT "Port",-1,250,147,18,13 - LTEXT "Port",-1,250,130,19,13 - EDITTEXT 3005,275,144,29,15 - EDITTEXT 3003,275,127,29,15 - LTEXT "This page configures the BBS <> Internet Mail Gateway. The Gateway allows local users to send messages to Internet email addresses, and get replies from those messages",-1,10,10,353,20 - LTEXT "My Domain",-1,10,112,51,8 - LTEXT "ISP Account Password",-1,10,180,80,13 - EDITTEXT 3007,95,178,147,15,ES_PASSWORD - LTEXT "POP3 Poll Interval (Seconds)",-1,10,216,80,18 - EDITTEXT 3008,95,219,29,12 - LTEXT "WARNING This feature my be illegal in some administrations. Make sure your authorities permit forwarding mail from the Amateur Service before enabling it",-1,10,64,348,15 - CONTROL "Enable Internet Gateway",3000,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_LEFT | WS_TABSTOP,10,90,90,15 - DEFPUSHBUTTON "Save",3100,165,261,57,17,BS_CENTER | BS_VCENTER - CONTROL "SMTP Server Requires Authentication",ISP_SMTP_AUTH, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_LEFT | BS_MULTILINE | WS_TABSTOP,250,159,69,32 - EDITTEXT SMTP_EHELO,95,196,100,15 - LTEXT "SMTP ""EHELO"" Domain",-1,10,198,80,8 -END - -IDD_FORWARDING DIALOG 20, 20, 457, 327 -STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_VSCROLL | WS_HSCROLL | WS_SYSMENU | WS_THICKFRAME -CAPTION "Manage Forwarding" -FONT 8, "System" -BEGIN - LTEXT "Forwarding Rules are define here. BBS Records are created by setting the BBS flag on a User Record.",IDC_STATIC,5,7,368,10 - LTEXT "The Enable Forwarding flag allows you to disable forwarding without losing the messages to be forwarded. ",IDC_STATIC,5,20,373,8 - GROUPBOX "Global Params",IDC_STATIC,2,33,114,263 - LTEXT "Max Size to Send",IDC_STATIC,5,50,58,12 - EDITTEXT IDC_MAXSEND,66,49,26,12,ES_AUTOHSCROLL - LTEXT "Max Size to Recv",IDC_STATIC,5,68,58,12 - EDITTEXT IDC_MAXRECV,66,66,26,12,ES_AUTOHSCROLL - CONTROL "Warn if no route for P or T",IDC_WARNNOROUTE,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,101,103,8 - LTEXT "Aliases",IDC_STATIC,5,165,57,13 - EDITTEXT IDC_ALIAS,4,183,99,81,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - CONTROL "Readdress Locally Input",IDC_READDRESSLOCAL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_DISABLED | WS_TABSTOP,4,267,97,8 - CONTROL "Readdress Received",IDC_READDRESSRXED,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_DISABLED | WS_TABSTOP,4,281,97,8 - GROUPBOX "Per-BBS Params",IDC_STATIC,121,33,326,263 - LTEXT "BBS",IDC_STATIC,128,46,57,10 - COMBOBOX IDC_BBS,122,59,50,60,CBS_SIMPLE | CBS_OEMCONVERT | CBS_SORT | CBS_NOINTEGRALHEIGHT | WS_VSCROLL - LTEXT "To Calls:",IDC_STATIC,186,46,40,10 - EDITTEXT IDC_TOCALLS,177,59,50,60,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - LTEXT "AT Calls:",IDC_STATIC,242,46,43,10 - EDITTEXT IDC_ATCALLS,233,59,50,60,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - LTEXT "Times",IDC_STATIC,299,46,30,13 - EDITTEXT IDC_FWDTIMES,288,59,50,60,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - LTEXT "Connect Script",IDC_STATIC,348,46,57,13 - EDITTEXT IDC_CALL,343,59,92,60,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - LTEXT "Hierarchical Routes (Flood Bulls)",IDC_STATIC,141,126,114,12 - EDITTEXT IDC_HROUTES,122,140,148,60,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL - LTEXT "HR (Personals and Directed Bulls)",IDC_STATIC,281,126,125,12 - EDITTEXT IDC_HROUTESP,280,141,151,60,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL - LTEXT "Interval (Secs)",IDC_STATIC,359,205,48,8 - EDITTEXT IDC_FWDINT,253,204,22,12,ES_AUTOHSCROLL - CONTROL "Enable Forwarding",4000,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_LEFT | WS_TABSTOP,122,206,72,8 - CONTROL "Request Reverse",4006,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_LEFT | WS_TABSTOP,286,206,67,8 - CONTROL "Send new messages without waiting for poll timer",IDC_SENDNEW, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,122,221,182,8 - LTEXT "BBS HA",IDC_STATIC,125,242,30,12 - EDITTEXT IDC_BBSHA,162,240,134,12,ES_UPPERCASE | ES_AUTOHSCROLL - LTEXT "Max Block",IDC_STATIC,368,241,37,12 - EDITTEXT IDC_MAXBLOCK,407,240,26,12,ES_AUTOHSCROLL - CONTROL "Send Personal Mail Only",IDC_PERSONALONLY,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,321,221,108,8 - CONTROL "Allow Binary",IDC_ALLOWCOMP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,125,260,58,8 - CONTROL "Use B1 Protocol",IDC_USEB1,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,185,260,72,8 - CONTROL "Use B2 Protocol",IDC_USEB2,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,261,260,67,8 - DEFPUSHBUTTON "? Help",IDC_HRHELP,381,6,33,11,BS_CENTER | BS_VCENTER | NOT WS_TABSTOP - DEFPUSHBUTTON "Save",4100,352,303,57,17,BS_CENTER | BS_VCENTER - LTEXT "Interval (Secs)",IDC_STATIC,198,206,48,8 - EDITTEXT IDC_REVFWDINT,407,205,23,12,ES_AUTOHSCROLL - CONTROL "Use Local Time ",IDC_USELOCALTIME,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,116,103,8 - CONTROL "Send ctrl/Z instead of /ex",IDC_CTRLZ,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,333,260,100,8 - LTEXT "Max Bull Age",IDC_STATIC,5,86,58,12 - EDITTEXT IDC_MAXAGE,66,84,26,12,ES_AUTOHSCROLL - CONTROL "FBB Blocked",IDC_BLOCKED,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,301,241,61,8 - PUSHBUTTON "Copy From BBS",COPYCONFIG,160,303,57,17,BS_CENTER | BS_VCENTER - EDITTEXT COPYFROMCALL,227,303,35,17,ES_UPPERCASE | ES_AUTOHSCROLL - CONTROL "Send P to more than 1 BBS",IDC_MULTIP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,130,103,8 - LTEXT "Incoming Connect Timeout",IDC_STATIC,125,278,95,12 - EDITTEXT IDC_CONTIMEOUT,219,276,22,12,ES_AUTOHSCROLL - CONTROL "Use 4 Char Continent Codes",IDC_FOURCHARCONTINENT, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,6,146,103,8 -END - -IDD_USERADDED_BOX DIALOG 176, 132, 129, 68 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_THICKFRAME -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "Ok",0,47,48,36,17,BS_CENTER | BS_VCENTER - LTEXT "Label0",5050,5,10,117,32 -END - -IDD_MSGEDIT DIALOGEX 20, 20, 421, 298 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Edit Message" -FONT 8, "System", 0, 0, 0x1 -BEGIN - RTEXT "Msg",IDC_STATIC,7,7,19,8 - LISTBOX 0,33,7,65,81,LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_MSGTYPE,125,9,25,55,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_MSGSTATUS,185,9,25,55,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "From",IDC_STATIC,7,98,19,8 - EDITTEXT 6001,33,95,65,14,ES_UPPERCASE | ES_AUTOHSCROLL - RTEXT "BID",IDC_STATIC,7,114,19,8 - EDITTEXT 6002,33,111,65,14,ES_AUTOHSCROLL - RTEXT "To",IDC_STATIC,7,132,19,8 - EDITTEXT 6003,33,128,65,14,ES_UPPERCASE | ES_AUTOHSCROLL - RTEXT "Via",IDC_STATIC,4,190,25,8 - EDITTEXT 6004,33,186,177,14,ES_UPPERCASE | ES_AUTOHSCROLL - RTEXT "Subject",IDC_STATIC,4,206,25,8 - EDITTEXT 6005,33,203,177,14,ES_AUTOHSCROLL - LTEXT "Status",IDC_STATIC,160,10,20,8 - RTEXT "Sent",IDC_STATIC,116,96,32,8 - EDITTEXT 6018,153,95,57,14,ES_AUTOHSCROLL - RTEXT "Received",IDC_STATIC,116,113,32,8 - EDITTEXT 6019,153,111,57,14,ES_AUTOHSCROLL - RTEXT "Last Changed",IDC_STATIC,103,130,45,8 - EDITTEXT 6021,153,128,57,14,ES_AUTOHSCROLL - RTEXT "Size",IDC_STATIC,116,147,32,8 - EDITTEXT 6020,153,145,55,14,ES_AUTOHSCROLL - LTEXT "Type",IDC_STATIC,105,10,17,8 - CONTROL "",25,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,7,35,10 - CONTROL "",26,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,17,35,10 - CONTROL "",27,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,27,35,10 - CONTROL "",28,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,37,35,10 - CONTROL "",29,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,47,35,10 - CONTROL "",30,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,57,35,10 - CONTROL "",31,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,67,35,10 - CONTROL "",32,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,77,35,10 - CONTROL "",33,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,87,35,10 - CONTROL "",34,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,97,35,10 - CONTROL "",35,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,107,35,10 - CONTROL "",36,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,117,35,10 - CONTROL "",37,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,127,35,10 - CONTROL "",38,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,137,35,10 - CONTROL "",39,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,147,35,10 - CONTROL "",40,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,157,35,10 - CONTROL "",41,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,167,35,10 - CONTROL "",42,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,177,35,10 - CONTROL "",43,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,187,35,10 - CONTROL "",44,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,197,35,10 - CONTROL "",45,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,208,35,10 - CONTROL "",46,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,218,35,10 - CONTROL "",47,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,228,35,10 - CONTROL "",48,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,238,35,10 - CONTROL "",49,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,221,248,35,10 - CONTROL "",50,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,7,35,10 - CONTROL "",51,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,17,35,10 - CONTROL "",52,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,27,35,10 - CONTROL "",53,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,37,35,10 - CONTROL "",54,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,47,35,10 - CONTROL "",55,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,57,35,10 - CONTROL "",56,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,67,35,10 - CONTROL "",57,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,77,35,10 - CONTROL "",58,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,87,35,10 - CONTROL "",59,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,97,35,10 - CONTROL "",60,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,107,35,10 - CONTROL "",61,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,117,35,10 - CONTROL "",62,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,127,35,10 - CONTROL "",63,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,137,35,10 - CONTROL "",64,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,147,35,10 - CONTROL "",65,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,157,35,10 - CONTROL "",66,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,167,35,10 - CONTROL "",67,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,177,35,10 - CONTROL "",68,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,187,35,10 - CONTROL "",69,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,197,35,10 - CONTROL "",70,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,207,35,10 - CONTROL "",71,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,217,35,10 - CONTROL "",72,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,227,35,10 - CONTROL "",73,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,237,35,10 - CONTROL "",74,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,260,247,35,10 - CONTROL "",75,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,7,35,10 - CONTROL "",76,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,17,35,10 - CONTROL "",77,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,27,35,10 - CONTROL "",78,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,37,35,10 - CONTROL "",79,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,47,35,10 - CONTROL "",80,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,57,35,10 - CONTROL "",81,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,67,35,10 - CONTROL "",82,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,77,35,10 - CONTROL "",83,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,87,35,10 - CONTROL "",84,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,97,35,10 - CONTROL "",85,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,107,35,10 - CONTROL "",86,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,117,35,10 - CONTROL "",87,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,127,35,10 - CONTROL "",88,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,137,35,10 - CONTROL "",89,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,147,35,10 - CONTROL "",90,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,157,35,10 - CONTROL "",91,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,167,35,10 - CONTROL "",92,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,177,35,10 - CONTROL "",93,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,187,35,10 - CONTROL "",94,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,197,35,10 - CONTROL "",95,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,207,35,10 - CONTROL "",96,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,217,35,10 - CONTROL "",97,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,227,35,10 - CONTROL "",98,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,237,35,10 - CONTROL "",99,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,299,247,35,10 - CONTROL "",100,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,7,35,10 - CONTROL "",101,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,18,35,10 - CONTROL "",102,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,27,35,10 - CONTROL "",103,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,37,35,10 - CONTROL "",104,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,47,35,10 - LTEXT "Key",IDC_STATIC,317,267,35,9 - CONTROL "Dont Send",205,"Button",BS_3STATE | BS_CENTER | BS_PUSHLIKE,262,281,43,10 - CONTROL "Send",206,"Button",BS_3STATE | BS_CENTER | BS_PUSHLIKE,311,280,35,10 - CONTROL "Sent",207,"Button",BS_3STATE | BS_CENTER | BS_PUSHLIKE,353,280,35,10 - DEFPUSHBUTTON "Edit Text",IDC_EDITTEXT,24,275,38,15,BS_CENTER | BS_VCENTER - DEFPUSHBUTTON "Print",IDC_PRINTMSG,150,275,24,15,BS_CENTER | BS_VCENTER - RTEXT "Filter From",IDC_STATIC,104,30,38,8 - EDITTEXT FILTER_FROM,147,28,62,14,ES_UPPERCASE | ES_AUTOHSCROLL - EDITTEXT FILTER_TO,147,44,62,14,ES_UPPERCASE | ES_AUTOHSCROLL - EDITTEXT FILTER_VIA,147,60,62,14,ES_UPPERCASE | ES_AUTOHSCROLL,0,HFILTER_VIA - RTEXT "Filter To",IDC_STATIC,104,46,38,8 - RTEXT "Filter Via",IDC_STATIC,104,62,38,8 - DEFPUSHBUTTON "Save",IDC_SAVEMSG,67,275,24,15,BS_CENTER | BS_VCENTER - DEFPUSHBUTTON "Save to File",IDC_SAVETOFILE,96,275,49,15,BS_CENTER | BS_VCENTER - DEFPUSHBUTTON "Export",IDC_EXPORT,179,275,32,15,BS_CENTER | BS_VCENTER - EDITTEXT EMAILFROM,33,169,177,14,ES_UPPERCASE | ES_AUTOHSCROLL - RTEXT "Email From",IDC_STATIC,4,168,25,17 - CONTROL "",105,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,57,35,10 - CONTROL "",106,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,67,35,10 - CONTROL "",107,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,77,35,10 - CONTROL "",108,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,87,35,10 - CONTROL "",109,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,97,35,10 - CONTROL "",110,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,107,35,10 - CONTROL "",111,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,118,35,10 - CONTROL "",112,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,127,35,10 - CONTROL "",113,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,137,35,10 - CONTROL "",114,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,147,35,10 - CONTROL "",115,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,157,35,10 - CONTROL "",116,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,167,35,10 - CONTROL "",117,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,177,35,10 - CONTROL "",118,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,187,35,10 - CONTROL "",119,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,197,35,10 - CONTROL "",120,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,207,35,10 - CONTROL "",121,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,217,35,10 - CONTROL "",122,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,227,35,10 - CONTROL "",123,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,237,35,10 - CONTROL "",124,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,337,247,35,10 - CONTROL "",148,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,237,35,10 - CONTROL "",125,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,8,35,10 - CONTROL "",126,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,17,35,10 - CONTROL "",127,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,27,35,10 - CONTROL "",128,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,37,35,10 - CONTROL "",129,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,47,35,10 - CONTROL "",130,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,57,35,10 - CONTROL "",131,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,67,35,10 - CONTROL "",132,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,77,35,10 - CONTROL "",133,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,87,35,10 - CONTROL "",134,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,97,35,10 - CONTROL "",135,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,108,35,10 - CONTROL "",136,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,117,35,10 - CONTROL "",137,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,127,35,10 - CONTROL "",138,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,137,35,10 - CONTROL "",139,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,147,35,10 - CONTROL "",140,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,157,35,10 - CONTROL "",141,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,167,35,10 - CONTROL "",150,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,247,35,10 - CONTROL "",142,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,177,35,10 - CONTROL "",143,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,187,35,10 - CONTROL "",144,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,197,35,10 - CONTROL "",145,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,207,35,10 - CONTROL "",146,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,217,35,10 - CONTROL "",147,"Button",BS_AUTO3STATE | BS_LEFT | BS_PUSHLIKE | WS_TABSTOP,377,227,35,10 - EDITTEXT FILTER_BID,147,76,62,14,ES_UPPERCASE | ES_AUTOHSCROLL,0,HFILTER_BID - RTEXT "Filter BID",IDC_STATIC,104,78,38,8 -END - -WELCOMEMSG DIALOG 26, 5, 365, 281 -STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE -FONT 8, "System" -BEGIN - LTEXT "Normal User Welcome Message",IDC_STATIC,5,7,130,8 - EDITTEXT IDM_USERMSG,5,20,340,50,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - LTEXT "New User Welcome Message",IDC_STATIC,5,75,130,8 - EDITTEXT IDM_NEWUSERMSG,5,89,340,65,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - LTEXT "Expert User Welcome Message",IDC_STATIC,5,159,130,8 - EDITTEXT IDM_EXPERTUSERMSG,5,172,340,12,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - DEFPUSHBUTTON "Save",IDM_MSGSAVE,166,264,50,14,BS_CENTER | BS_VCENTER - LTEXT "$U : Callsign of the user $I : First name of the user $X Messages for user $x Unread messages",IDC_STATIC,0,222,365,8 - LTEXT "$L : Number of the latest message $N : Number of active messages. $Z : Last message read by user",IDC_STATIC,0,234,365,10 - LTEXT "Signoff Message",IDC_STATIC,5,190,130,8 - EDITTEXT IDM_SIGNOFF,5,202,340,12,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - LTEXT "$F : Number of mesages to be forwarded to user (if a BBS)",IDC_STATIC,0,246,365,10 -END - -BBSPROMPTS DIALOG 26, 5, 381, 266 -STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE -FONT 8, "System" -BEGIN - LTEXT "Normal User Prompt",IDC_STATIC,5,7,130,8 - EDITTEXT IDM_USERMSG,5,20,340,35,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - LTEXT "New User Prompt",IDC_STATIC,5,59,130,8 - EDITTEXT IDM_NEWUSERMSG,5,70,340,35,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - LTEXT "Expert User Prompt",IDC_STATIC,5,110,130,8 - EDITTEXT IDM_EXPERTUSERMSG,5,120,340,35,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN - DEFPUSHBUTTON "Save",IDM_PROMPTSAVE,166,250,50,14,BS_CENTER | BS_VCENTER - LTEXT "$U : Callsign of the user $I : First name of the user $X Messages for user $x Unread messages",IDC_STATIC,2,165,353,8 - LTEXT "$L : Number of the latest message $N : Number of active messages. $Z : Last message read by user",IDC_STATIC,3,175,347,10 -END - -IDD_MAINTRESULTS DIALOG 0, 0, 181, 114 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_THICKFRAME -CAPTION "Maintenance Results" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "OK",IDOK,66,91,50,14 - LTEXT "Killed Messsages Removed",IDC_STATIC,11,10,103,10 - LTEXT "Messages Killed",IDC_STATIC,11,21,103,10 - LTEXT "Live Messages",IDC_STATIC,11,32,104,10 - LTEXT "Total Messages",IDC_STATIC,11,43,103,10 - LTEXT "BIDs Removed",IDC_STATIC,11,58,103,10 - LTEXT "BIDs Left",IDC_STATIC,11,70,103,10 - LTEXT "Static",IDC_REMOVED,146,10,30,10 - LTEXT "Static",IDC_KILLED,146,21,30,10 - LTEXT "Static",IDC_LIVE,146,32,30,10 - LTEXT "Static",IDC_TOTAL,146,43,30,10 - LTEXT "Static",IDC_BIDSREMOVED,146,58,30,10 - LTEXT "Static",IDC_BIDSLEFT,146,69,30,10 -END - -IDD_EDITWP DIALOG 0, 0, 398, 265 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "EDIT WP Record" -FONT 8, "MS Sans Serif" -BEGIN - COMBOBOX IDC_WP,9,9,76,190,CBS_SIMPLE | CBS_SORT | CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP - LTEXT "Name",-1,100,11,47,10 - EDITTEXT IDC_WPNAME,165,10,128,12,ES_AUTOHSCROLL - LTEXT "Home BBS 1",-1,100,26,53,10 - EDITTEXT IDC_HOMEBBS1,165,25,216,12,ES_UPPERCASE | ES_AUTOHSCROLL - LTEXT "Home BBS 2",-1,100,41,53,10 - EDITTEXT IDC_HOMEBBS2,165,40,216,12,ES_UPPERCASE | ES_AUTOHSCROLL - LTEXT "QTH 1",-1,100,56,47,10 - EDITTEXT IDC_QTH1,165,55,215,12,ES_AUTOHSCROLL - LTEXT "QTH 2",-1,100,71,47,10 - EDITTEXT IDC_QTH2,165,70,215,12,ES_AUTOHSCROLL - LTEXT "ZIP 1",-1,100,86,47,12 - EDITTEXT IDC_ZIP1,165,85,128,12,ES_AUTOHSCROLL - LTEXT "ZIP 2",-1,100,101,47,12 - EDITTEXT IDC_ZIP2,165,100,128,12,ES_AUTOHSCROLL - LTEXT "Last Seen",-1,100,121,47,12 - EDITTEXT IDC_LASTSEEN,165,120,128,12,ES_AUTOHSCROLL - LTEXT "Last Modified",-1,100,136,47,12 - EDITTEXT IDC_LASTMODIFIED,165,135,128,12,ES_AUTOHSCROLL - LTEXT "Type",-1,100,156,47,12 - EDITTEXT IDC_TYPE,165,155,59,12,ES_AUTOHSCROLL - LTEXT "Changed",-1,100,171,47,12 - LTEXT "Seen",-1,100,186,47,12 - EDITTEXT IDC_CHANGED,165,170,59,12,ES_AUTOHSCROLL - EDITTEXT IDC_SEEN,165,185,59,12,ES_AUTOHSCROLL - PUSHBUTTON "Delete",IDC_DELETEWP,106,215,56,17,BS_CENTER | BS_VCENTER - PUSHBUTTON "Save",IDC_SAVEWP,171,216,56,17,BS_CENTER | BS_VCENTER -END - -IDD_UICONFIG DIALOG 0, 0, 400, 151 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "UI Configuration" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "Save",IDOK,7,98,50,14 - PUSHBUTTON "Cancel",IDCANCEL,342,98,50,14 - LTEXT "Mailfor Header",IDC_STATIC,5,5,50,10 - EDITTEXT IDC_MAILFOR,61,3,331,12,ES_AUTOHSCROLL - LTEXT "Send: Mail For Headers Null Mailfor",IDC_STATIC,242,25,127,10 - LTEXT "(use \\r to insert newline in message)",IDC_STATIC,62,16,125,10 -END - -IDD_CHATCOLCONFIG DIALOG 0, 0, 224, 120 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Chat Colour Configuration" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "Save",IDOK,50,95,50,14 - PUSHBUTTON "Close",IDCANCEL,120,95,50,14 - COMBOBOX IDC_CHATCALLS,10,5,100,60,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_CHATCOLOURS,115,5,100,60,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | WS_VSCROLL | WS_TABSTOP -END - -IDD_UPDATECHATMAP DIALOG 0, 0, 274, 146 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Update Chat Map" -FONT 8, "System" -BEGIN - LTEXT "Click Help for full information about the Chat Network Map",IDC_STATIC,5,10,195,15 - DEFPUSHBUTTON "? Help",IDC_MAPHELP,220,10,33,11,BS_CENTER | BS_VCENTER - LTEXT "Position",IDC_STATIC,5,30,35,10 - EDITTEXT IDC_MAPPOSITION,5,45,145,15,ES_AUTOHSCROLL - LTEXT "Popup Box Text. ",IDC_STATIC,5,65,70,9 - EDITTEXT IDC_POPUPTEXT,5,80,200,35,ES_MULTILINE | ES_AUTOHSCROLL | WS_HSCROLL - LTEXT "Popup Mode",IDC_STATIC,215,80,49,10 - CONTROL "Hover",IDC_HOVER,"Button",BS_AUTORADIOBUTTON,219,92,45,10 - CONTROL "Click",IDC_CLICK,"Button",BS_AUTORADIOBUTTON,219,104,45,10 - DEFPUSHBUTTON "Send to Map System",IDSENDTOMAP,5,125,90,14 - DEFPUSHBUTTON "Save",IDOK,100,125,35,14 - PUSHBUTTON "Cancel",IDCANCEL,140,125,40,14 -END - -IDD_MSGFROMCLIPBOARD DIALOGEX 0, 0, 442, 306 -STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Send Message" -FONT 8, "System", 0, 0, 0x1 -BEGIN - PUSHBUTTON "Send",IDSEND,333,5,50,14 - PUSHBUTTON "Cancel",IDCANCEL,333,25,50,14 - EDITTEXT IDC_EDIT1,4,57,431,245,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL,WS_EX_ACCEPTFILES - LTEXT "To:",IDC_STATIC,66,8,12,8 - EDITTEXT IDC_MSGTO,83,7,147,12,ES_UPPERCASE | ES_AUTOHSCROLL - LTEXT "Title:",IDC_STATIC,8,26,22,8 - EDITTEXT IDC_MSGTITLE,50,24,277,12,ES_AUTOHSCROLL - LTEXT "BID:",IDC_STATIC,240,8,20,8 - EDITTEXT IDC_MSGBID,262,7,65,12,ES_UPPERCASE | ES_AUTOHSCROLL - LTEXT "Type",IDC_STATIC,8,8,20,8 - COMBOBOX IDC_MSGTYPE,34,7,25,55,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Select",IDSelectFiles,333,42,50,14 - LTEXT "Attachments",IDC_STATIC,8,43,42,8 - EDITTEXT IDC_ATTACHMENTS,50,41,277,12,ES_AUTOHSCROLL -END - -IDD_HRHELP DIALOG 0, 0, 415, 182 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Hierarchical Forwarding Help" -FONT 8, "System" -BEGIN - DEFPUSHBUTTON "OK",IDOK,182,158,50,14 - EDITTEXT IDC_HRTEXT,4,4,405,150,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL | WS_HSCROLL -END - -IDD_EDITMSGTEXT DIALOGEX 0, 0, 492, 356 -STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Edit Message" -FONT 8, "Fixedsys", 0, 0, 0x1 -BEGIN - EDITTEXT IDC_MESSAGE,4,25,480,327,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL,WS_EX_ACCEPTFILES - PUSHBUTTON "Save",IDSAVE,5,5,40,17 - PUSHBUTTON "Cancel",IDCANCEL,125,5,40,17 - PUSHBUTTON "Save Attachments",IDC_SAVEATTACHMENTS,50,5,70,17,WS_DISABLED -END - -MAINT DIALOG 26, 5, 382, 298 -STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE -FONT 8, "System" -BEGIN - LTEXT "This sets the parameters for deleting old messages. Specify length of time (in days) for messages to be kept before being deleted",IDC_STATIC,149,13,226,22 - LTEXT "Read",IDC_STATIC,159,46,46,10 - EDITTEXT IDM_PR,224,46,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Unread",IDC_STATIC,159,61,46,10 - EDITTEXT IDM_PUR,224,61,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Forwarded",IDC_STATIC,159,76,46,10 - EDITTEXT IDM_PF,224,76,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Not Forwarded",IDC_STATIC,159,91,49,10 - EDITTEXT IDM_PNF,224,91,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Forwarded",IDC_STATIC,264,46,49,10 - EDITTEXT IDM_BF,324,46,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Not Forwarded",IDC_STATIC,264,61,49,10 - EDITTEXT IDM_BNF,324,61,20,12,ES_CENTER | ES_AUTOHSCROLL - GROUPBOX "Personals",IDC_STATIC,149,36,108,107 - GROUPBOX "Bulletins",IDC_STATIC,259,36,103,44 - LTEXT "The following boxes allow you to specify different values for different Bulletin origins and destinations. Normally these apply to Sent Messages, to apply to unsent, check box below",IDC_STATIC,151,148,214,27 - LTEXT "Specify Call, Lifetime, eg ALL, 10",IDC_STATIC,151,176,154,8 - LTEXT "From",IDC_STATIC,176,189,28,9 - EDITTEXT IDM_LTFROM,151,202,64,55,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "To",IDC_STATIC,247,189,27,10 - EDITTEXT IDM_LTTO,221,202,64,55,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "At",IDC_STATIC,316,189,15,8 - EDITTEXT IDM_LTAT,289,202,64,55,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - DEFPUSHBUTTON "Save",IDM_MAINTSAVE,166,279,50,14,BS_CENTER | BS_VCENTER - GROUPBOX "Lifetimes",IDC_STATIC,144,0,231,275 - GROUPBOX "Parameters",IDC_STATIC,3,3,133,275 - LTEXT "Max Message Number",IDC_STATIC,7,68,77,10 - LTEXT "BID Lifetime (Days)",IDC_STATIC,7,87,77,10 - LTEXT "Maintenance Time (UTC) Enter as HHMM",IDC_STATIC,7,21,83,25 - EDITTEXT IDC_MAXMSG,102,67,25,12,ES_CENTER - EDITTEXT IDC_BIDLIFETIME,102,86,25,12,ES_CENTER | ES_AUTOHSCROLL - EDITTEXT IDC_MAINTTIME,102,23,25,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Log File Lifetime (Days)",IDC_STATIC,7,107,80,10 - EDITTEXT IDC_LOGLIFETIME,102,105,25,12,ES_CENTER | ES_AUTOHSCROLL - CONTROL "Delete Log and Message Files to Recycle Bin",IDC_DELETETORECYCLE, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20 - CONTROL "Suppress Mailing of Housekeeping Results",IDC_MAINTNOMAIL, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,182,115,20 - CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,204,115,10 - CONTROL "Send Non-delivery Notifications for P and T messages",IDC_MAINTNONDELIVERY, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,162,115,20 - CONTROL "Apply Overrides to Unsent Bulls",IDC_OVERRIDEUNSENT, - "Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,153,261,195,10 - LTEXT "Delete Inactive Users (Days)",IDC_STATIC,7,127,93,10 - EDITTEXT IDC_USERLIFETIME,102,125,25,12,ES_CENTER | ES_AUTOHSCROLL - GROUPBOX "NTS",IDC_STATIC,259,80,102,62 - LTEXT "Forwarded",IDC_STATIC,264,109,49,10 - EDITTEXT IDM_NTSF,324,108,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Not Forwarded",IDC_STATIC,264,124,49,10 - EDITTEXT IDM_NTSU,324,123,20,12,ES_CENTER | ES_AUTOHSCROLL - LTEXT "Delivered",IDC_STATIC,264,94,49,10 - EDITTEXT IDM_NTSD,324,94,20,12,ES_CENTER | ES_AUTOHSCROLL - CONTROL "Save Registry",IDC_MAINTSAVEREG2,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,222,115,10 - LTEXT "Maintenance Interval (Hrs)",IDC_STATIC,7,47,93,10 - EDITTEXT IDC_MAINTINTERVAL,102,45,25,12,ES_CENTER | ES_AUTOHSCROLL -END - -FILTERS DIALOG 26, 5, 382, 371 -STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE -FONT 8, "System" -BEGIN - LTEXT "Reject Messages:",IDC_STATIC,162,26,70,10 - LTEXT "From",IDC_STATIC,83,137,28,10 - EDITTEXT IDC_HOLDFROM,58,149,64,83,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "To",IDC_STATIC,152,137,27,10 - EDITTEXT IDC_HOLDTO,126,149,64,83,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "At",IDC_STATIC,223,137,15,10 - EDITTEXT IDC_HOLDAT,194,149,64,83,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - DEFPUSHBUTTON "Save",IDC_FILTERSAVE,171,341,50,14,BS_CENTER | BS_VCENTER - LTEXT "From",IDC_STATIC,83,40,28,10 - EDITTEXT IDC_REJFROM,58,52,64,67,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "To",IDC_STATIC,154,40,27,10 - EDITTEXT IDC_REJTO,126,52,64,68,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "At",IDC_STATIC,223,40,15,10 - EDITTEXT IDC_REJAT,194,52,64,68,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "Message Filtering Setup.",IDC_STATIC,152,10,95,15 - LTEXT "Hold Messages:",IDC_STATIC,166,128,60,9 - EDITTEXT IDC_REJBID,262,52,64,68,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - EDITTEXT IDC_HOLDBID,262,149,64,83,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "BID",IDC_STATIC,289,137,15,10 - LTEXT "BID",IDC_STATIC,289,41,15,10 - EDITTEXT IDC_REJSYS,58,265,270,66,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_WANTRETURN - LTEXT "Composite Rules (like fbb reject.sys)",IDC_STATIC,152,236,134,9 - LTEXT "Action, Type, from, @BBS, to, BID, maximum size",IDC_STATIC,59,251,247,9 -END - -WPUPDATE DIALOG 26, 5, 382, 287 -STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE -FONT 8, "System" -BEGIN - CONTROL "Send WP Updates",IDC_SENDWP,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,90,18,71,10 - EDITTEXT IDC_WPTO,112,82,154,113,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - COMBOBOX IDC_WPTYPE,193,17,19,55,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Type",IDC_STATIC,172,18,21,10 - DEFPUSHBUTTON "Save",IDC_WPSAVE,165,204,50,14,BS_CENTER | BS_VCENTER - CONTROL "Reject WP Bulls",IDC_FILTERWPB,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | WS_TABSTOP,222,18,71,10 - LTEXT "Send To.\rBPQMail only automatically processes messages with TO of WP, so for P messages format should be WP@BBSCALL. ",IDC_STATIC,98,38,176,35 -END - -IDD_RMSBULLDLG DIALOG 0, 0, 277, 258 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "RMS Express Bull Configuration" -FONT 8, "MS Sans Serif" -BEGIN - DEFPUSHBUTTON "OK",IDOK,66,237,50,14 - PUSHBUTTON "Cancel",IDCANCEL,164,237,50,14 - EDITTEXT IDC_TOCALLS,82,76,54,112,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - EDITTEXT IDC_TOCALLS2,144,76,54,112,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - EDITTEXT IDC_TOCALLS3,208,76,54,112,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - EDITTEXT IDC_TOCALLS4,18,76,54,112,ES_MULTILINE | ES_UPPERCASE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL - LTEXT "Common",IDC_STATIC,63,47,48,8 - LTEXT "User Specific",IDC_STATIC,174,47,48,8 - LTEXT "TO AT",IDC_STATIC,39,62,79,8 - LTEXT "TO AT",IDC_STATIC,163,62,79,8 - LTEXT "This defines Bulls that will be downloaded to RMS Express Users. There are two lists, one for all RMS Express users and one per User. The lists will be combined, Updating the Common list will affect all users.",IDC_STATIC,7,7,242,37 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - "BPQMAIL", DIALOG - BEGIN - END - - 102, DIALOG - BEGIN - TOPMARGIN, 47 - END - - "BBS_CONFIG", DIALOG - BEGIN - BOTTOMMARGIN, 303 - HORZGUIDE, 87 - END - - IDD_USEREDIT, DIALOG - BEGIN - RIGHTMARGIN, 292 - BOTTOMMARGIN, 280 - END - - IDD_FORWARDING, DIALOG - BEGIN - RIGHTMARGIN, 444 - BOTTOMMARGIN, 314 - END - - IDD_USERADDED_BOX, DIALOG - BEGIN - BOTTOMMARGIN, 65 - END - - IDD_MSGEDIT, DIALOG - BEGIN - RIGHTMARGIN, 415 - BOTTOMMARGIN, 266 - END - - "WELCOMEMSG", DIALOG - BEGIN - BOTTOMMARGIN, 266 - END - - IDD_MAINTRESULTS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 176 - TOPMARGIN, 7 - BOTTOMMARGIN, 106 - END - - IDD_EDITWP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 391 - TOPMARGIN, 9 - BOTTOMMARGIN, 258 - END - - IDD_UICONFIG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 392 - TOPMARGIN, 2 - BOTTOMMARGIN, 144 - END - - IDD_MSGFROMCLIPBOARD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 435 - TOPMARGIN, 7 - END - - IDD_HRHELP, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 408 - TOPMARGIN, 7 - BOTTOMMARGIN, 175 - END - - IDD_EDITMSGTEXT, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 485 - TOPMARGIN, 7 - BOTTOMMARGIN, 349 - END - - "MAINT", DIALOG - BEGIN - RIGHTMARGIN, 381 - BOTTOMMARGIN, 266 - END - - "FILTERS", DIALOG - BEGIN - RIGHTMARGIN, 377 - BOTTOMMARGIN, 355 - END - - IDD_RMSBULLDLG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 267 - TOPMARGIN, 7 - BOTTOMMARGIN, 251 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDC_BPQMailChat MENU -BEGIN - POPUP "Actions" - BEGIN - POPUP "Start Forwarding" - BEGIN - MENUITEM "All", IDM_FORWARD_ALL - END - POPUP "Logging Options" - BEGIN - MENUITEM "Log BBS Traffic", IDM_LOGBBS - MENUITEM "Log TCP Traffic", IDM_LOGTCP - END - POPUP "Disconnect User" - BEGIN - MENUITEM ".", IDM_DISCONNECT - END - MENUITEM "Housekeeping", IDM_HOUSEKEEPING - MENUITEM "Send Message", ID_ACTIONS_SENDMESSAGE - MENUITEM "Send Msg from Clipboard", ID_ACTIONS_SENDMSGFROMCLIPBOARD - MENUITEM "Rerun Message Routing", RESCANMSGS - MENUITEM "Import Messages", IDM_IMPORT - END - POPUP "&Configuration" - BEGIN - MENUITEM "Main &Configuration", IDM_CONFIG - MENUITEM "Manage &Users", IDM_USERS - MENUITEM "Manage &Forwarding", IDM_FWD - MENUITEM "Manage &Messages", IDM_MESSAGES - MENUITEM "Manage &White Pages", IDM_WP - END - POPUP "Windows" - BEGIN - MENUITEM "BBS Console (F2)", IDM_CONSOLE - MENUITEM "Multicast Monitor (F3)", IDM_MCMONITOR - MENUITEM "Monitor (F4)", IDM_MONITOR - END - POPUP "&Help" - BEGIN - MENUITEM "&About ...", IDM_ABOUT - MENUITEM "Online Documentation", ID_HELP_ONLINEHELP - END -END - -CONSOLEMENU MENU -BEGIN - POPUP "Options" - BEGIN - MENUITEM "Enable Bells", BPQBELLS - MENUITEM "Flash instead of Beep on Bell", BPQFLASHONBELL - MENUITEM "Strip Linefeeds", BPQStripLF - MENUITEM "Wrap Input ", IDM_WRAPTEXT - MENUITEM "Beep if Input too long", IDM_WARNINPUT - MENUITEM "Close Window on exit", IDM_CLOSEWINDOW - END - POPUP "Edit" - BEGIN - MENUITEM "Copy Output Window", BPQCOPYOUT - MENUITEM "Clear Output Window", BPQCLEAROUT - END - POPUP "Actions" - BEGIN - POPUP "Chat to user" - BEGIN - MENUITEM ".", BBSUSERCHAT - END - MENUITEM "End user chat", ENDUSERCHAT - END -END - -MENU_2 MENU -BEGIN - POPUP "Monitor" - BEGIN - MENUITEM "Monitor BBS", MONBBS - MENUITEM "Monitor TCP", MONTCP - END - POPUP "Edit" - BEGIN - MENUITEM "Copy Monitor Window", BPQCOPYOUT - MENUITEM "Clear Monitor Window", BPQCLEAROUT - END -END - -MENU_3 MENU -BEGIN - POPUP "Edit" - BEGIN - MENUITEM "Copy Monitor Window", BPQCOPYOUT - MENUITEM "Clear Monitor Window", BPQCLEAROUT - END -END - -MENU_1 MENU -BEGIN - POPUP "Edit" - BEGIN - MENUITEM "Copy", ID_EDIT_COPY - MENUITEM "Clear", ID_EDIT_CLEAR - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDC_TELNETSERVER ACCELERATORS -BEGIN - "?", IDM_ABOUT, ASCII, ALT - "/", IDM_ABOUT, ASCII, ALT -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "BPQMailrc.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""AFXRES.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#define MAILCHAT\r\n" - "#include ""..\\CommonSource\\Versions.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define MAIL\r\n" - "#include ""Versions.h""\r\n" - "#include ""StdVer.inc""\r\n" - "\0" -END - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// AFX_DIALOG_LAYOUT -// - -IDD_USEREDIT AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -IDD_FORWARDING AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -FILTERS AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -BPQMAIL AFX_DIALOG_LAYOUT -BEGIN - 0 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_APP_TITLE "BPQMail" - IDC_BPQMailChat "BPQMail" -END - -#endif // English (United Kingdom) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define MAIL -#include "Versions.h" -#include "StdVer.inc" - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/BPQMailConfig.c b/BPQMailConfig.c index 1f7fc2e..9f65c87 100644 --- a/BPQMailConfig.c +++ b/BPQMailConfig.c @@ -1917,6 +1917,15 @@ VOID SaveFWDConfig(HWND hDlg) ForwardingInfo->MaxFBBBlockSize = GetDlgItemInt(hDlg, IDC_MAXBLOCK, &OK, FALSE); ForwardingInfo->ConTimeout = GetDlgItemInt(hDlg, IDC_CONTIMEOUT,&OK , FALSE); + // Don't allow blocked uncompressed + + if (ForwardingInfo->AllowBlocked) + ForwardingInfo->AllowCompressed = 1; + + if (ForwardingInfo->AllowCompressed) + ForwardingInfo->AllowBlocked = 1; + + GetDlgItemText(hDlg, IDC_BBSHA, BBSHA, 50); if (ForwardingInfo->BBSHA) free(ForwardingInfo->BBSHA); diff --git a/Bpq32.c b/Bpq32.c index ff4e881..801eb82 100644 --- a/Bpq32.c +++ b/Bpq32.c @@ -1314,7 +1314,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses // Fix handling of disconnects when using RHP (17) // Fix propagating unreachable in INP3 (18) // Add STOPROUTE and STARTROUTE commands (21) - +// Fix resolver loop if no Internet (24) +// Support SSID -L for Winlink local messages (25) +// Fix crash when APRS pages requested when APRS isn't configured (26) +// Add setting modem params to QTSM command (28) +// Security fixes (28) #define CKernel diff --git a/Cmd.c b/Cmd.c index e3e3785..b059b32 100644 --- a/Cmd.c +++ b/Cmd.c @@ -161,6 +161,9 @@ extern int RigReconfigFlag; extern int DEBUGINP3; extern int PREFERINP3ROUTES; +extern char FX25Modes[8][8]; +extern char IL2PModes[8][10]; + struct CMDX COMMANDS[]; @@ -168,6 +171,7 @@ int CMDXLEN = sizeof (struct CMDX); VOID SENDNODESMSG(int Portnum); VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD); +VOID LORACMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD); VOID STOPCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD); VOID STARTCMS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD); VOID STOPPORT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD); @@ -2581,7 +2585,6 @@ VOID CMDC00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C int haveService = 0; int i = 0; - #ifdef EXCLUDEBITS if (CheckExcludeList(Session->L4USER) == FALSE) @@ -4700,6 +4703,7 @@ struct CMDX COMMANDS[] = "FINDBUFFS ",4,FINDBUFFS,0, "KISS ",4,KISSCMD,0, + "LORA ",4,LORACMD,0, "GETPORTCTEXT",9,GetPortCTEXT, 0, @@ -6186,14 +6190,17 @@ VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct KISS = (struct KISSINFO *) PORT; - // Send Command + // Set Channel bits - KissLen = KissEncode(KissString, ENCBUFF, KissLen); + KissString[0] |= KISS->OURCTRL; + + // Send Command PORT->Session = Session; PORT->LastKISSCmdTime = time(NULL); PORT = (struct PORTCONTROL *)KISS->FIRSTPORT; // ALL FRAMES GO ON SAME Q + KissLen = KissEncode(KissString, ENCBUFF, KissLen); ASYSEND(PORT, ENCBUFF, KissLen); Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r"); @@ -6212,6 +6219,79 @@ VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct return; } +VOID LORACMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD) +{ + char _REPLYBUFFER[1000] = ""; + char * ptr, * Context; + + int portno = 0; + struct PORTCONTROL * PORT = PORTTABLE; + int n = NUMBEROFPORTS; + UCHAR KissString[128]; + UCHAR ENCBUFF[256]; + int KissLen = 0; + unsigned char * Kissptr = KissString; + int Param[4]; + int i = 0; + + // Send CONFIG Command to LORA TNC + + // Get port number + + ptr = strtok_s(CmdTail, " ", &Context); + + if (ptr) + { + portno = atoi(ptr); + ptr = strtok_s(NULL, " ", &Context); + + while (ptr && ptr[0] && KissLen < 120) + { + Param[i++] = atoi(ptr); + ptr = strtok_s(NULL, " ", &Context); + } + } + + if (portno == 0 || i != 4) + { + char ErrMsg[] = "Invalid params - format is LORA port freq bandwidth spreading factor coding rate"; + strcpy(Bufferptr, ErrMsg); + Bufferptr += (int)strlen(ErrMsg); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + + while (n--) + { + if (PORT->PORTNUMBER == portno) + { + KissLen = sprintf(KissString, "%cLORA=%d, %d, %d, %d", 6, Param[0], Param[1], Param[2], Param[3]); + KissLen = KissEncode(KissString, ENCBUFF, KissLen); + + PORT->Session = Session; + PORT->LastKISSCmdTime = time(NULL); + + ASYSEND(PORT, ENCBUFF, KissLen); + + Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r"); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + PORT = PORT->PORTPOINTER; + } + + // Bad port + + strcpy(Bufferptr, BADPORT); + Bufferptr += (int)strlen(BADPORT); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + +} + + VOID FINDBUFFS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD) { @@ -6400,6 +6480,13 @@ VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct Cmd = strlop(CmdTail, ' '); port = atoi(CmdTail); + if (Cmd == 0) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "Missing params - usage is UZ7HO port Command\r", port); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + // remove trailing spaces while(strlen(Cmd) && Cmd[strlen(Cmd) - 1] == ' ') @@ -6457,15 +6544,45 @@ VOID UZ7HOCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct return; } +#define QTSMKISSCMD 7 +#define MODEMREPORT 1 // QTSM Modem Info subcommand +#define SETMODEMPARAMS 2 // QtSM Moden change settings + + VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD) { int port; struct PORTCONTROL * PORT; struct KISSINFO * KISS; + NPASYINFO Port; + char * ptr, * context; + UCHAR KissString[128] = ""; + UCHAR ENCBUFF[256]; + int KissLen = 0; + unsigned char * Data = KissString; + int fx25_mode = 0; + int il2p_mode = 0; + int il2p_crc = 0; + int i; + CmdTail = CmdTail + (OrigCmdBuffer - COMMANDBUFFER); // Replace with original case version - port = atoi(CmdTail); + ptr = strtok_s(CmdTail, " ,\r", &context); + + if (_stricmp(ptr, "HELP") == 0) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "QTSM portno displays QTSM configuration info (if avaliable)\r", ptr); + Bufferptr = Cmdprintf(Session, Bufferptr, "Modem, Centre Freq, fx25 flags and il2p flags can be changed if you have sysop access. All prameters are optional.\r", ptr); + Bufferptr = Cmdprintf(Session, Bufferptr, "The Modem name (if used) must come first. Others can be entered in any order. Values should be comma separated.\r", ptr); + Bufferptr = Cmdprintf(Session, Bufferptr, "For example QTSM 1 AFSK AX.25 1200bd, 1700, fx25 none, il2p only\r", ptr); + Bufferptr = Cmdprintf(Session, Bufferptr, " QTSM 1 il2p rx+tx\r", ptr); + + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + port = atoi(ptr); PORT = GetPortTableEntryFromPortNum(port); @@ -6475,23 +6592,194 @@ VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); return; } - + KISS = (struct KISSINFO *)PORT; - if (KISS->QtSMModem == 0) + Port = KISSInfo[PORT->PORTNUMBER]; + + if (Port) { - Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port %d has no QtSM information\r", port); + // Check if connected + + if (PORT->KISSTCP) + { + if (Port->Connected == 0) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "Error - QTSM not connected\r", port); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + } + } + + if (context == 0 || context[0] == 0) + { + // Display + + if (PORT->QtSMFreq) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "Modem %s Centre frequency %d fx25 %s il2p %s %s\r", + (PORT->QtSMModem[0]) ? PORT->QtSMModem : "Not Available", PORT->QtSMFreq, + FX25Modes[PORT->fx25Flags], IL2PModes[PORT->il2pFlags], PORT->il2pcrc?"CRC":""); + + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + if (KISS->QtSMModem == 0) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port %d has no QtSM information\r", port); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + Bufferptr = Cmdprintf(Session, Bufferptr, "Modem %s Centre frequency %d\r", + (KISS->QtSMModem) ? KISS->QtSMModem : "Not Available", KISS->QtSMFreq); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); return; } - Bufferptr = Cmdprintf(Session, Bufferptr, "Modem %s Centre frequency %d\r", - (KISS->QtSMModem) ? KISS->QtSMModem : "Not Available", KISS->QtSMFreq); - + // Set params. Layout is + + /* + 0 QTSMKISSCMD + 1 SETMODEMPARAMS + 2 Freq + 4 Modem + 24 Reserved + 29 set flags indicator (2) + 30 fx25 + 31 il2p + 32 crc + */ + + if (Session->PASSWORD != 0xFFFF) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "Update requires SYSOP status - enter password\r"); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + if (_memicmp(context, "fx25", 4) == 0 || _memicmp(context, "il2p", 4) == 0) // These have space separated params + ptr = strtok_s(NULL, " ,\r", &context); + else + ptr = strtok_s(NULL, ",\r", &context); + + Data[0] = QTSMKISSCMD; + Data[1] = SETMODEMPARAMS; + + + while (ptr && ptr[0]) + { + uint16_t freq = atoi(ptr); + + if (freq) + memcpy(&Data[2], &freq, 2); + + + else if (strlen(ptr) > 8) + strcpy(&Data[4], ptr); + + else if (_stricmp(ptr, "fx25") == 0) + { + ptr = strtok_s(NULL, " ,\r", &context); + i = 4; + + if (ptr && ptr[0]) + { + for (i = 0; i < 4; i++) + { + if (_stricmp(FX25Modes[i], ptr) == 0) + { + fx25_mode = i; + Data[29] = 2; + break; + } + } + } + + if (i == 4) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "QTSM} Failed - fx25 flags invalid\r"); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + } + else if (_stricmp(ptr, "il2p") == 0) + { + ptr = strtok_s(NULL, " ,\r", &context); + i = 4; + + if (ptr && ptr[0]) + { + for (i = 0; i < 4; i++) + { + if (_stricmp(IL2PModes[i], ptr) == 0) + { + il2p_mode = i; + Data[29] = 2; + break; + } + } + } + + if (i == 4) + { + Bufferptr = Cmdprintf(Session, Bufferptr, "QTSM} Failed - il2p flags invalid\r"); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + + } + } + else if (_stricmp(ptr, "crc") == 0) + { + il2p_crc = 1; + Data[29] = 2; + } + else if (_stricmp(ptr, "nocrc") == 0) + { + il2p_crc = 0; + Data[29] = 2; + } + else + { + Bufferptr = Cmdprintf(Session, Bufferptr, "QTSM} Failed - invalid param %s. Enter QTSM HELP for more info\r", ptr); + SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + return; + } + + ptr = strtok_s(NULL, " ,\r", &context); + } + + Data[30] = fx25_mode; + Data[31] = il2p_mode; + Data[32] = il2p_crc; + + KissLen = 33; + + // Send Command + + PORT->Session = Session; + PORT->LastKISSCmdTime = time(NULL); + KissString[0] |= KISS->OURCTRL; + + PORT = (struct PORTCONTROL *)KISS->FIRSTPORT; // ALL FRAMES GO ON SAME Q + + KissLen = KissEncode(KissString, ENCBUFF, KissLen); + ASYSEND(PORT, ENCBUFF, KissLen); + + // Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r"); + // SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); + + + Bufferptr = Cmdprintf(Session, Bufferptr, "OK\r"); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); return; + } + DllExport int APIENTRY Get_APPLMASK(int Stream); DllExport int APIENTRY GetStreamPID(int Stream); DllExport int APIENTRY GetApplFlags(int Stream); diff --git a/CommonCode.c b/CommonCode.c index eb6c011..2c01b7c 100644 --- a/CommonCode.c +++ b/CommonCode.c @@ -3244,6 +3244,13 @@ DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call) ax25call[6]=0x44; return TRUE; } + + if (callsign[i+1] == 'L') + { + ax25call[6]=0x46; + return TRUE; + } + i = atoi(&callsign[i+1]); if (i < 16) @@ -3348,6 +3355,13 @@ DllExport int ConvFromAX25(unsigned char * incall,unsigned char * outcall) return out; } + if (chr == 0x46) + { + outcall[out++]='-'; + outcall[out++]='L'; + return out; + } + chr >>= 1; chr &= 15; @@ -3798,6 +3812,10 @@ VOID ResolveUpdateThread(void * Unused) Sleep(1000 * 60 * 15); continue; } + + // Resolve failed - try again in 5 mins + + Sleep(1000 * 60 * 5); } } @@ -4968,11 +4986,16 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st // // For now at least will report dial freq if using RIGCONTROL +extern struct RIGPORTINFO * PORTInfo[MAXBPQPORTS + 2]; // Records are Malloc'd +extern int NumberofPorts; + DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString) { struct PORTCONTROL * PORT = GetPortTableEntryFromPortNum(PortNo); double freq = 0.0; uint64_t freqint = 0; + struct RIGPORTINFO * RIGPORT; + int i, p; char * ptr; int n = 3; @@ -4991,7 +5014,6 @@ DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString) { // Try rigcontrol - struct TNCINFO * TNC; struct RIGINFO * RIG = 0; @@ -5000,9 +5022,43 @@ DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString) else TNC = TNCInfo[PortNo]; - if (TNC) - RIG = TNC->RIG; - + if (TNC == 0) + { + // No associated TNC but could have an interlock group from which we can get RIG record + + if (PORT->PORTINTERLOCK == 0) + return 0; + + for (p = 0; p < NumberofPorts; p++) + { + RIGPORT = PORTInfo[p]; + + for (i=0; i< RIGPORT->ConfiguredRigs; i++) + { + RIG = &RIGPORT->Rigs[i]; + + if (RIG->Interlock == PORT->PORTINTERLOCK) + { + if (RIG->Valchar[0] == 0) + return 0; + + freq = atof(RIG->Valchar); + + // if port has QtSM modem centre add that + + if (PORT->QtSMFreq) + freq += (PORT->QtSMFreq * 1.0) / 1000000.0; + + freqint = (int64_t)(freq * 1000000.0); + goto returnFreq; + } + } + } + return 0; + } + + RIG = TNC->RIG; + if (RIG == 0) return 0; @@ -5011,10 +5067,18 @@ DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqString) if (RIG->Valchar[0] == 0) return 0; - freq = atof(TNC->RIG->Valchar); + freq = atof(RIG->Valchar); + + // if port has QtSM modem centre add that + + if (PORT->QtSMFreq) + freq += (PORT->QtSMFreq * 1.0) / 1000000.0; + freqint = (int64_t)(freq * 1000000.0); } +returnFreq: + sprintf(FreqString, "%.6f", freq); // Return 3 digits after . (KHz) unless more are significant diff --git a/Debug/BuildLog.htm b/Debug/BuildLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..2bc0071f89ac579c9b85cf0e42d7df3c85f87b48 GIT binary patch literal 6926 zcmeI1eN$Rj5XSfK&h$Inq0^Y84On7Qqe&(KF-=F*sHuIS2nrW+po0+~IQG&z^mGcF*2_{(fo)*0UpP*>n5SzA)A6wrjQXdf7_0WiKtVANb$0 zb$dX|8+&W7?I(L?87ta}9kWW^-wzn`(c089%-KuzX|%@u!8>=p^P-PCVAqay>Fu%V z2j2Va^qoCsPE4ETq^Ya2evSR&5pC9}pVxYE~dCH6q|B;u(6_xh;r-~@;GQZADQQzdd_9+%$CSPrtb>e55)$aQ)X$c=Vf0MlJItM$v>zr8i&`4>B_z<5VUR68X zYNae?w2r5>vgnczS|e+WTn~@X2;qw`;v;R+uYgJ!baKHepsA2g_*bzX8GC>f|3 zseey--m*?n+mT!-A@m%^^q?`nx!&ZUSlX0>&Ip`%4~-|xTEtpjV|Ai1**a?E4s%OZ zfFrLa7+Yk=RnD>orj{lcUuNYZcPmVd0Ja~hj>arwZeg_%W`?e?K7cT4cZFDj-hClKf z*WX^Bd@_4|i$*P^bT3F<{_(WWv4-PP5@kkv&{%hdHCeV_L>49Ns6<)ubq$wXJ4jYhf#NjPv()7Qn;>$C0fs3bV38pDe$M6$mYo=N7g|`XSO8k25EXI84nPz1B36lI>O5yEZ~L z@&FOw zeZ2qWvX8kRd;go|)eCsPEswuL6kZsk=T+CH4AwqL6#fEz-6K+0ETkK5(!WK03?1Aa zA|j_d9wGcyozzX9Wz#;MoIRM$4;-NtfK-Q!jK$kJ2a{%!jPjl0w0v0{8d)TqEU1y9@#2C(^+}NDw2j->1J z59D$)ELOMJF0yXHx7!Sza>rNC8z*zcA!-PkE-mY#@yfFed|w8=3%R-la8bFK&*O{Y zZwD(_LIX?*Uu{CPGa6eWzMe$bbHsV#Y{*?sc+YK3S*^5vhra2&nC_K|NG^U?(RUi< i&_(AnP-FCWh0)(y{$FPMzx-E@`(^yiNMi@zzy1XdXn|n> literal 0 HcmV?d00001 diff --git a/Debug/NodeMapTest.exe.embed.manifest b/Debug/NodeMapTest.exe.embed.manifest new file mode 100644 index 0000000..4b15fbf --- /dev/null +++ b/Debug/NodeMapTest.exe.embed.manifest @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Debug/NodeMapTest.exe.embed.manifest.res b/Debug/NodeMapTest.exe.embed.manifest.res new file mode 100644 index 0000000000000000000000000000000000000000..7b55d19001b1a6c9becd61f77f12ffdedbbaed6d GIT binary patch literal 468 zcmZ8d!A`?43@s8DkhpV`i!+}rY6E-te zwqePN?PvS>B?y9mk#9D?PT`4toVEBh^-w|<1sCUS)A#3BHeBn9t-ztOCg*V&aRx@( zQki+qUndWplr!|gl%lc*a^3*);o#~r6NsRTs$sOiV9sl2`Y0Em1$MNO&Z3?9jCuk=2 n4SxP;CetD*?nDf63Q55SS@-`*t%`0d>{LefSKkRf%nyPsVFr%a literal 0 HcmV?d00001 diff --git a/Debug/NodeMapTest.exe.intermediate.manifest b/Debug/NodeMapTest.exe.intermediate.manifest new file mode 100644 index 0000000..b390755 --- /dev/null +++ b/Debug/NodeMapTest.exe.intermediate.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Debug/NodeMapTest.obj b/Debug/NodeMapTest.obj new file mode 100644 index 0000000000000000000000000000000000000000..e304913be07779298300c8daaa9d3fd924064b71 GIT binary patch literal 105675 zcmdSC33yaR7B*ag5JCcyU{pZV77$PY!zuzwLee3DEKL?R(GZeA0@+MDY;KJqNE@Q4 zfViXLzK%LGFv=Jl22fE^(NPB!6qN|Bfa1#kzNhZ3bUJBlo%#OxzWXHoo;r1EKXs~Z z-Ku+2L+(_Q6TU5;ogJdyX`|#CSWsD*@19qvT}rhJQR6QtacAmx4tQtp=^t0;QE?3eo2!9(3;Na$@x41$ z3v~pyG^OTVteGbQ98shVjoTn9j06!p)Y-#a@E zG3bl>*ZxwaBJs})!7TlQTuO7flOWU0U(PRos}Mmi$gIzm=+w!8*7A1{aw}&j<(aAF zIstV4npaFX_-*pFjQtxI71yGFuzV3MRMs_Ce;<;^W8H0J$$9^Y~mX7YS&sULwFhwM5IR-xqrl_MG6Q!j&U!#^(sYqeg&k?x-%v$0adR6Br_!!Lh# zAcC(TQ&+9!&Il0S49IPor_`AXwOo5UK0kX(eVJ{^Xi28qQeP-n9;Dp-Amy$OQtsLy zfeWYw`6%d{vOS{mSFVx2cCxdm(f0ZCY+N!nGEkIz_369>V_% zTJCK?YyF&h`r}qDWB;}`KL~?on{Bp)#@6ImzVIOA7+=RA<+=nZ*EI+^+MUybkYjuH z4MHvkasz{q8wk0vLCDeWRsf{^3*bEJh_%Wubg?!2$9i#mrDg2j*4l%1t$z@5oQK2)A;)?c7K9w*8xe#Y z^LJqoa^aARZz0#Re{_IcN(;G`dQUr^8H615Wl9ioEbp`+w}P^y}B<5 zIkwxMf{>#<{c{j<96w$NLXP9n_8{bSG6=b7$c2vh?RrM@s*{3{!}L!L z4nnRwRjA@tTmN`p+%E{Z-jEv?gdFQ-Zjf^B zAmnI2uM9$t_P`s2+_{ij9fTamflWckQUCrCgdFYrt3k-I{&of-Hw1FKgOFo?iyHac zdLZ+^*5v%gOU~w?Mv2fn>tn%v0{KDxoD=r%{czQy4X=!P+6-aJJNUi~cp$>FAevwj-m$U0hncsJLvl12I+tujL?w)z?y4-G zU71(vNJ3;)j(({4v!^#DI;ps-I317m$-L4kyQ z{=nGy=_xv=jsa6tRb{>!*i2RP6{_nGDI9tQY{7K9%GrISKmB^D!h@Rj(JRoS+IW;_ zQg&{pGs~Gd$(bnp66t9PDX!eal&lH4Nja&hsypP#4^iaDCnPwtvY>nEDF}0><=001 z(w&o?nYojknOP|r>AB7+DOuTBMx?EXpwG7yu~P`uvA`x!rIS)q60+4GD}{FAmz|lD zmCY1Vl2Q`lvzbgnMw%-l-I<=9o0gK5m6ASAoofXNlOWD1&fF|#Y7z=M4jFQ0>R{O^ zY0iwCY}LaOZZE<)=~?kf&fM&b-1xB>nc1qV>;1=+oBrNlHm|($Gl_(`a zmBqOT;c{kXPtBc%GOLr|w-|mQ;+LF(x=BpWl61&!)5K13O&SV*r|4_I*H=POo|}fT zN}UeA+h(iu>e88ol^L^|{26Y3vv8@!Wpj@gPWyL3xCc!*omTf&)6#xS=gwyG$4iG{ zw0|_hahjs9s`C7~s2N{YK8h;rQ^4kfRDGr9Rk?F2@EEdC^+ru*;npBTWxH|{;!{({ zq6tvjDH)k5sO|KO%(VDa)eBPdkiif&HYGhVD?2_rCo4AzB-9T5C?h8`!HL?`LT!A7 zpwH>f1PpHD)ESn4TVMZ7jDVSzz*&|+sIS0SXm5IA#^m(WjQGUF`0RL-nJ`~5XL@2Y zA@&94xV^7Xv$#zE$x{6+;c#E!lysCcH5EDckv!Xy?BFZuleUkjU1t%#qB-oS3GoTZ zPK^1ksj8479y02otWdy%2wSVvr;NQCo`4mpPQ1Nof)6*%vN@db@B~vcgXlj z@hPeCV^f{#94nO*e8nUeb{B1u?PJMy_LY^2%bJ>wJX>}|6o(ZYdX|AR*B4G z(X*hWFsrEAT~I#1O!c>N-Q71hr;9NB7^++uSt%S1;)-K3x&n1@Iu+wr zf-{BVz1?YgHy75i<+xlhXju@m>#|R4Vz7WtnG(3NjbPt^f|<_oD60|d7f=v2lZF@v zS~W7zR}eifi{m&3e5>fDM0O3v`pQfHrlw?Oq?#B9HIrzeMz%Rnww)X7D=)3;oRaNI zjZaC(q$4dp8#-qz_z+)FSI*efl&oYJ3uA=r4mH$Qjw+lQKb5nDCP|J-Y|UZ5l37`) zIa6|>n`6=OCZK&{Fr@v3i&}DFCe6DG(_e-+3(JXKrkSZUr4-d{SWGXUZ^ED7EPQ%O zQWB;>mZ511&k4+O>9m$<##{?iM7dp*`4BxZNzrzjp2-tZ)6{7Qb`yLsd(3E>H>Smp zr)#iGi)KkcSA1p`=7jO-8R?kzrKU`C;;DN3XnM9$+A}FL1*S4}stMKB^2l-~CUW#cue{@s8b}|4okZy zB9;K>nH1v#=_GKQa;*_#I9N^pdDWq%ik(`41!&O zU?Iwtm1ER`oplYk5emb5=2X_EHPvw9<{~?Dsu}``GDx&hR`=jdLCUyX)Ob4PBhK86 zOx#Rh{NO~unVA}&fbPIKL<9K)IFoFsP)GOwdR8zaDW$d!SM5wLdX-?q7b7CR07*`4VhYW#60kI5SEz_K%O zuY>U`OUwwR+BHexh9d#i+m+)=i%-XGfha3)3n&+68n3Tee6dO7|!JM;c`U$ju-}`0Na=Ei&n5!qG-1Cp{rID;@(X%Ye?7FhSWVcQHcaoZ0N> zx#%dkUr2RI?}zc=qzp>SzQ9;dGy$^X$Bu=i9h;dkS?+0h(@u#PBOwEUOliqK$?)x_ z#t@M*PT%X|#sm{mnH^B}!m0XJrfD7RG`Dgr_pCRJ4>9#=-(3c1>=cGb|_w*UAM)!V1K! zR08bDIOhcD9IHCbnKl-aV(JIIQN$+iM3|;*7z2^u073~Atw|!wnJo*fVi4$yLN@cY zM>uWZIEqsWWp0wfDgGP-GmyZGb&1 zl=@!*fewrbnujijSsI(0v4!Z^P=#jbC%cVi<2E8QWo!WQB1tORhQf%St-XOc4$z1=C3U*_AsUzB_&rN)oTrJdo*lVxeBKa42M zHzJe&a4YSMG|4|TlfoS|+iq8r)rjW&Tv@2%h{r&Yex6C0@#7@cE~;bnl@QPu7S-KF zG8)_qUR#BJ&gx@Suxr*FiuJ`>@6B4r#2oe&H}0LH7nx}E0&j9*UI7-=JE`z!ti!9E ztYj{?b%fJFCln_W(~@vm*2%%}o{O6x)LD3RPkN_jV9+Or0Sre1aCL{?{71^+(N7^| zci!yyiV8g7$aCYdNH(6NU{y0b`U!ZsQWDd$QY>qh3w6$MN<5Fjk4r{*1qGEbZsE}# zF~=?`&(A9o?GRvtj>2!0hoa-%t>>z#n~MpXBFgD6>47}XBR~Cu+9!^jh!3{ z79Rb8<|SgjB)n+w)@dHBiLg!vi`9;ju-?(@bsL@t{$0qKy;zsXGbaqso(5rbH3@$L zSX|=68hcrJu3M_ImtB=oS22*FVj_@U+@fYe-@>DD=tWhyiz?A%r8DzcdQ1_+Wl=I0 zHxr4exhY(ljE#*Q1QQu9v$|YFBlEfp7w0vSULVAccCRc*aTk`N=Z8n14$kDPc*!&? zq8HqDrRNrxK{Iu(vErI4ZOv7_YWU~^tk&7p3$PL)b!k3U`zldH>K3&Dk8uj&>;dOE zl*Hw`z^B&&&@HKJ>#Ta@qN22m6Y(ci7GCBob5|B)4#|35snf(@E-SFTz~U`TW?@B1 z9-gixlvgGfRALFWu(CKmv2a##8N#us>=bAWXL?SWlw={?sR_AQu3^Ei*RdvHGGUsl zjG0ZynM@-{8Qw#262WwF3nj5$2VQYmt|%#UM^!}mtR;AK*6`>8MlFrkq`j8%viG#b zqc+#14CI5tIY`sDew^u(QZh01nluEaBwSWVeZB4VQEA?`2%D?ZuxkHrxGkxw$j|Jll@>6l~=h7(VlF8p~x!hTlB;3+KHT_NntCH)p>cjCB;>4aogI%#ZW3F zm%RNHa>uL#Y}K00T)wTHnJF5S_3ZTfo-qk37>}iPsm)Vi@l%i z$Nb+0j=iWal|=pFY*~!;csN++St)5Q+{ti`#Wi}#P=!vTY36~+XLxji6(S+k8K0ix z${m-PfnVG_COA`@!c(tD+mcqKxmHDq;g7RDeWQ^c8H;3jhiTgf7Gi+K6CFMSj1n+x ztxSM$N?DaVucSnqOSU5WY&AMg*=&iF6HL?>%ZEmpgb78s%>1c^a-WN-vvr4xrKN1K zxV$MBE#*3irKhyq;mEpWxzRDjax2AskX^B>B?K51^8DHjYesf@{NPz}r>k*~?|Kvm zZ-js49r2_7Tybanzdk->f9l8kk0=!<{Dmp~ZmVBA=<=HS-v7uAQN7hRj4f9Q|DlI&y)ER5&dz<%?ih9`t0?z!??r7^e~6g|G8z>!V8x6_LY~fy>pOWw`>#7Y zu$%Hs;ott<_NB3R&Dy;s>YcqWR!?1xO|`;bP&#y6>20w^`|kdA%IvrPz8MuH{OD1i z9V@xywrLZNm2bL#N&gG6nMwG|yUyNmOXe9}hj(dr`@|Vrr{VyJ@V`3JdFtLdaVg7A zd%PrJ#?{z;@|^H%b}syDWS0Ry>~q}nQPKFD<|*~Q@Mq>dzOB>VXWQoeP`S0{%ez-# z(}?iZuC3ocv%UD7%NM@6?ZJajBOY#GjS5MMzQ0|^KL0#$_Ly}QH+}rsnMw^6e)QM3 zZ2s)n(WfuDy;m;T9@Amck;aXkqaV2;(~HAd z!k^avj3+~X3_n(#d)XUpj`es0t3%j>5f$>}l$-DT_}4{0CqA*Vaq8#SW7pOI;dg#y zP~H7A77y4MyZyx_cU+JBj~9OLg@69$yfa=*>N;!D{tuR)Q;fq}!augN?d;2*xb&HJ z?~hn^?%M62C{-)`4aun;Uq1JXV+K&T!Nmy<*m=w~kgHdG(6X zN_{5$U*klyIma?T~&nqz&J*Q6g=N`;rMO8{QBL+Yu4S+`JoNy0K)%w zzdQc2^vP>8@0xM%^QX=n=D}e;;dlR6dgM91-}$wB#@0{VW8S}3si%dX{@JOu>)Osu z8QcBUocp{3hhhV<@aH~u|Dp}ooWHu;p4T>h^VaK6V)Lo+kDR>o&YM4qYxCjj-G}Bs z`R>smQvRUzfI>A?{|8=ciist&hItml`M4jdxigX)i;0J zRPo)f4Yz;w-5IBy-GI%)!e7{}V&W60T>5b5o0l%Q>tB7du<2L$IbSwjwq;oLl4rmE z;xFCO&qllaD*Q{&{UrRgPhWXq$E6RyHTt`CI2_vp8_}Xd4$j?l>GZs_9$(Y*l+#Op zdhB(jE)f1L$1YfQ{R2hMxoXZFb131=mFVxn-&cIo{f{Tl1@T(C>2Uxa_r`lb1&Y`$gJ z)YqR+d1T0Vw96Ruv8a$YzP_q%>fkIies-}ZjRmxnfgc4_iQ-#oqPmhru?(AI(R z-`b_^JFDxrJpS{+l92jUdoTd>6aImh z(*;T`75;$PPwn0mxi$K#sPV@x8Zc@h4%`ZV(YIME$GjiD@`}F>&3k-)&qt7d;U~W7 zSU&%>dxxF!&m%vK8eV-3HYp2#-Kdg(rrrDNciV0rG$`rv=~HkR7&~>NLXL)2|Ev45 z@?8U#Mjsn>{-aBA5J&hQzIAQgia037wek zH9NP>-TlDHT{0J(_2be3`>+dsfbeJisM;SL^VYEs_J8=ux;Zyt%$Xqkc27Oyx+!7M zm#gpJyrXPp-#FZC3%}b_SJ(dig@m-U#3=_0>i>#*t`mOAi{9Y4zslmtdC;q3O#xWyfB(s)D)G=V7B(p1pxPxC5g2TX)JQL6&^mX=m6#2sB}Ab(`Bpm0_o-^z;ovVwq>$KuV) z4-^))J`Y8n7s#J+R~1(T@-EF^5XfsbHoG1t)5unFdA_?OQ1J4+;(~ylEK_Ozf1$}L zu~Rir4p8(!Uf2%%8@a0}FAtb|L|l+x7%1+F%BrH{b(FGzo`|<9&r0e@z z&TrkEaP2C;6mkJOoMlml1}bPd7Aym+-^|}KW)+2%0edTScXmN>poHO@Uv8PIKU~97 z!D4FvvnZ@KYH81{>KlBVQj`_C=g$q~UtAj4)RmP5>~>`{hr|Yo5*3FH{DFMux=W91 zfMKah1NK+MTZw(ff#OEWvI+Y*{$(WrH8G!dQV0FRjfJ77xconiBfk;{CuRlAW_4u= z9%Te7VnNAlE94(9gKfE5(YEpm4*&mo0rRS=>@oHa=W`w&!33_Rl0}6JD)P##25niC z;xeu}2dc)>ss(|yu&SuAq$IE6c$Q;kUR6NTjRIF3$E4B3q7?(>tg50gAM+@fu7DbX zp(nShx+36Ip}K5t+5CVS|I^W+a6x|HyEXT`^6G%y4%x3P3}{F2IJ8QJk>1&{j^2ec zD;yUBiYpv+4|SaDxKtS6lc60|+A#vY5Ka}Jf%!AD^5zv5WERfGfi3b~!lw}YTzNP# zR>c77|F48tngx=F!GmLwCFK2ok@hega{FJU%>#D-qqGNIF#La(_TZr-{|{_oNr zK4QrKvc=CII_!Vf=EH{%iyituYxSYS?X=aU?XY%^Ww%H*)1o5OJWz4MTVzoYYBi{M z;oW9Y5$Xw0V}MgC`86BGk#Cl7!dY zq9W9AP$Pvm(xM_%3aAmnOS7m5H3QT*;qgfcsR%U$YmlRacfLhMsQI9<42=9;Zc#WQ z6@~Rs;U!sAgt{ItkV_TbO%@fQ-UgK>y!R|BLM0aF9?uMDA^U)YVDmXX=S5z$5H> z*ByMy3VeL$7Zv9hIr1!D$}yA!DP!eE@>N*iaF-(=WpjZ{rqF@2(U?*?O7j*%+U+P@ zfJ{1yXEB?V5;o6-)}_)*3OLvA+FT$J$;f*K~Vk*cXB4N1;3;IK{yn1#K068kI zD(mZZloj$726>gmB@0m&hmLym%u3X2TE7bWAN$uW_y*&I6Rumtcrj|zW|s&gK- z~(cX*;sB-0KXZiT&%QX*<4mUGk_vsf6&uK4O)9-U}s&T`jm>g~fi zntSQRi#M|xMjaHvx=$|o$1pf)anU6BO%RHG3J-Fyb%!qv(L6V(DfkbQeIwJv_eT6q z7V1{~>R28Ir9(UgY7+j#)Zg%{L%d*oH-pk4UN*e94R5!hJ_nV9{}}a)p-x1@>i9yz zJA!}4WM8MkmxZJsuYP!rgiSi)j(|Jb&;LgF$6!|&uW#^wFa8IrC_J%kx)|r_aJC1o zg5}p&ND}U^($OQaHLOb%(`>+hSN!YPK*-fuMMj5%;!cMI*azrmWb{#J;nj#r!gmDY zAQ-IWV(jUaZb09hC4I3AXj!$Nzt zz@j466&4kt-Zwm?EpicxZORal>Py38teO{YQEV%H7F^eh}@7ifF1ATmhzW3#>X;B~U`EGOKja(1QNqmgc=$BGn(pTG-4+l5dhb|ewVX_**Y0kiaKyJY>;pJ zpJ-Vx@{KOgq-}>V+p5^dWUaOH0%TcfvY5q{7XK?W49gGm<{1OT<9-i^k?(=Cfhf0! zt@I3Iv|Dz&mF*DfsX*Of6}uR&;|(e#%+q8uYoW$o*qaS-;eN|0}KQ92g2-l z1_Gf$V$x_9wMiqTO&X~P*$7GPh*U4)msEs$6~EMzNcDzAMbPMqK1I^Z3Kc=aDY_V` zP)?yDWZt9G;Jint0Z+MH&Ozzv(*~fC#o+A&Qw&}Y)a-@};4*WVJ(Q=B*&{|~4+w2! zI@hym;WTE(n{(8fAk;-?iUrW~nR75VsY?zYl@?WfMxC=G<~>L2CWiV-ghQe+0=cxk zj}xBrrdGqhjO;XKqX2b>=XA9vJ3bSoIbHt`&XTO+hU!_~R!^*D=vef$gI*M{qiul$ z$s~u0aFjQh)ghBAwu_Jb90q3+{`I8FDHQFKwo#WG>Q+NNXQ=l;O~HSd`WV03GNBJx z6D?@F6>}t7LC4$$l%8l&uXPAoKkeHGl+FvaT=V!kPR*m0(G)FWHe!!aoHuJ~9Vi`N zYu4{E__E-(_3@u*-RtM?h4u5DX#ERe{U=(C^K|gn0AGhW(U(lL=cpYJBSk@RIEnQb&IBLDxOC4zM{vpLHg*K8W?!)n#E^g;#PjQ=p1Bxr*&5$-tQ z&A=~JDGWodZEhAC-U?9KwA=3g_8gNnm{nEEGvbu8OKY14u`2`j|Ejqe^% zarh78eS#I@8^im-P#9vZd$?|fIuBG}(?SEqZXSw%UjC*9D%;H8-?Z#N82^bC<79WE zTHZ|yAeWdH`*fb%#|1VoEha>^ZMXx`wQ?VKl4{GDja=>VJ4BP6U~p{vvS5Ksjc8NY z)p^-Ag~KE-+osT@um$al<)KM|RaHwYCZ@V#QqbW%Obzc7^^62!;l;yN9t))5gL#nq zy+q)(a3=xp0b&sF&^)C8KLm~k^1eG2*a_*S0Uf|}AnP#$NE2}b{|*JWk;?Z$jdTwDG9}1`Ya8CPYslE5S^N&bOyI z&1XRl-|@dLEykN1RhQG%>xu!tkt44itl8`ck+n7@GLdzZSP@xQiL3`B+lh=ej?_~n zM=LgJj^qEJf!dG6vC^fdLH6wE;8xFQC>;tZrEDqFe0H=ot|M}P3=3tx;aat9oHUKa zzn(P33q|{;ZCr(+9x&8KLmdL8EgQ8}+ZF1owrnSX(lK**)G=f5vn<67l#hc4s_aYiImEwTG%Qkzw zC*x(CJ&?3~qG;sfVtHx#x`XCT7B5V6#PUr8a_qVkm=2r)6QK0=@w(2JQjQ0W!@JAnUvg7>abuftawV%Yd9bR{}2qx`B{Y)j-e+6D-eS;C$c; z-~!;Sz=gnjfs25T0WSw`0OFLJhwXP2kQVhe{A-I!N?TM?5uDzMZzLynLPe-yhIfJC zxePDc@MO}}fN10y{CUQ=D7_PeTiFG;Qb#3gsppJ5b!!SNKI0N9k7ymIT z4!_fc3dQdc{3qhyzLG&S;6L1A_-p$`e*W#C8NRm&^WZ<+Z-InyQrm~(KiiD2Aqm!k z6dqo1jigG(@&?H8pBHPj>EiMPbM**P%!6NKH2vwCDI>DhI#!N-FE zy9UVo)L5-|4`|(bq;%_%ijb9Q&7-yd6Pv)DL1DBl=Eet(R(qiR{)eY&`9e}8n_ zSzV^~ocnfPV#U?&_s8XF7ME36#)yU8OLqFTpt##D>Y!T`bxfgsenR5*5!$!gxl=bZ zbZ2+h-OhcstK;sj>rpdGdOG#cr>FOU^L_k>DfR{3(>Wr)Cp_L|ye$-$;xx|-ik37? zJ%ry^g<6l_mxOxL@V*13Lxdr5-gAU0&Mh^s52#JT!<^LOO#!7-gVnWou&avmfG~9n zD4p7apmb`R4DVx5I_5*5bZVWT{hD_os0|X!xuE_m)F@DY5{fs1nwkOXapCcEG@7@_ z@K%BfYzz5;MOLnDhx~0J&szEVFNQ7hwS~;{06$yEIB5%)0f$F}kSin!Z|BDQ!NdeI z$_D%o#lM|2NL*bk6UeoZRJ=LGU0x|eG^OIft4Ph`iwpFquNmcKco-EKy%Po|9#W~6 zd!Ow_0GiUnmRmo{vW?|qD3E@1B_sL>w1a)I9JH+z<;;xNwXmfu8y3;Uw$=kj!F@e& zED%c-a!-SH_soZT4e%=9ZNL@4JAe-W?*wiE-UXz7tOb4m#3<}x<=hA4h`tU;1MvVb z7Wfb_3HUH@7Vr@uO%g_J&(**ufXIV-68LA}Q$UX3PXk{8J`3Cngr6q_W%~;-9Jn5M z8t`wx3xF`1p0PlL^;`A|k4xeZbbM~`uJU6eo@~D>Uf;%EKB-Tx8HidYx zwrnlFG6f%tMceri{=;NNLifiqxC8f0&N3JY=L5X_du9oEzW%@X^~{^#-`}riGEQpm zO#I&nd3}XoXM0I`g>+2D*nt0z)<3|y*u|I^c1*sUg)?tTRp7s%5Ic&c6LKa^i3)e6 zJRxS)@_G`fH9aAAX{P)#PwZt}i%7KiTcAzMCp16IN zFMIK?wU3n6K2rLLuja9rX&(ET<{dS><7-FjvmQ$w+)#yZ7jAu%sijlWd)B@f+vAp)h^r-`3z|j`-9keO)^l#w# zz}-MjKtBLx0QUfyUsy9~`$o{Z?MdmjCl#T#;aBrmFPgW<@b(!V+J621h!A~OC$rwJ zM}9rF;csJ&b+`wz`U!r0ZTPRpj(Ka>{c`Ns)>;>SS#4Wu6G4RtHNsG#KmU4+0k_sJ z`N^hw9JMKjMb+0X`R>3;8s*uA{Zj2aojo89_T$`?=Uw3D2Y(2TO$YwO=ECy+|G) zLT~L3q$7o>6Vkq?UyK~>$ZaTZjmd0m8hYY#$ySn(`niyN)ocRmJHqBo1z ziuWDx))VnvBFbrayUQ=IS@hPdJ~oRH>dE?vHp`ZZujXx?#6u*zPV%?AmZ5e}iL#xN z?3Av|7;Cge#_H->EN{Gn5-ffTiCZm^#rBv)DwRlzLcfq7OUDViSGXp>Wo0BvZM&)z$j?B2OpGYuC5~MQxrolxZiGNq)Vx zJz&)8>g9Kp{7O|vUc;)cMoUswKZ4ekCW^R>Ux4@4uRwFxY~-(UUs6{~qAodRR6WB~ zkFKkgLey!oO0JAj*n&AD{B4g{2hhJ- zt+3*4Ihh}Ca!kMs1RS!AV?zco$*I z=yS9k8J3ttp>O@23M~cxzfhrBZ!Hv>%%BxI6OBYArq=pcwm4B@GGTGsBf{nq+Twl% z4WSbIg=KfqOf)h&A+0abC;B}Wo9M$nYO#qvZ1#LcA{IaXY98VOTN>AG4* zStsG^VitQ>WlKc-Rn-IMbZv@7!Q1-!VYTN#};m6;i)Rr4bwVXYZtJvxN0`i15J@9)$1#z z)df$C)to+l;k}ZAW_l&#Y-v9QIB4kw(WLAZeXxdz&P(1$7Hm5ohsILX-CAu(`pt=I zY8YwK8_BJ!XHnQZRy#K_>tdF9SB-}6acY;|Ua5Z3Q~x@}NF@?_q(aS0Vf>|Rq0l<1 zSMJjj!fpuGYU52ZLuJP8AAPJ?F2_l^UjL-Xd^+1gFr9;-E&vlgxKf5A;1^Jm}G zb%og%r@pCk*iL=R*Uxrp-&kq_>!?Mk>gpMbH-5zNv`|DACqn_eH>Oezn$_*`@8%fR zcaK`*G%$XLP1)7Vru-N5c;R=+F%W^H;`GLqhp)pt?da81l*Ruf))b2afHBhOJGI|flI+TUO$nM zK*aGv;8fK(a2mBlhao*D`H;lGO1)h83qhl-rAi$4hFCnf=x@EU0-? zVIF}+Pwy%&j{0WfXIaDKuX3NpY>>3G!4jHm%!#U(%5(WvXl;XgSlwZrG5ZW;ZLBrP zBD&^Gl;rHZ+l!4wbNX5nbgSkAMGq_I7kzIldZJ6>X*Gp_mDVh}ng$1+N!huxYZedh z@J8f@&PzN{<*l_{krH(UQ*BgVWGySvJ*ugSy|rA|_UgqSSq>T{GFO~(^$B(L^cz*r zkaEzBFG$9s?2kIit+g|Lu&Hc_FqxW-^o^_PStnw;zP-z9E5NN=MZcOCL%c!^X{dhV zcZy?49qBY*2uEK6&sAT~EKICl#XLa`nG`G$dnca7>5k&99RZn|jr=`U-6KFPH?p^D zA>2(Yhr^Do6HBP0g7TbKFH8MMc{y}#;vCFbF<8~FIto{&7y+$+-r5*&4kWf7%Yfe( z3)aLL8#7X~QK&0VvU+7lv~&w!80-U(uh~dFI97d1fHK!ftXr0}`;L*%X(w8#A8VLS zgd$f5^tm{oPrUtfq(5pM=V>ri;&T$Cw@s6K3e;@muX0D$)sonv&O7i*z^JoqBQ%~p zkj9Ts-0E2^P=uE4z&iNNnm9ZsqFFDqYOKDN@wLcxQ%CY2Pxz8VbFkN z!*`$dWuAR~$=3H)mWUk^w@9a24O3swI83OTpy5pb zRV}DRBNj>Hquxj)`HR@u=&Lb@pt2ktpk=XAB5=m_8H%U z#`inp%k73GaD}NZpmfYVKZ-UY#&w~A%Drr<0YAqC_GyUR&%K(Z1acHONrOhMEORhph*tbNa5KdZAbA zJjWU8GEh3tmxI!I`7W9aYLnm(z(ht)IFed4ju)ibN`~@Z8yCApe_wz&->Q!_*$c@h35gq^}aB*6qL3! zD?sV^{til8nr(*nZ&2FOd}4TQPO$ApXHdHTb_1nj8DM;e8Q(F+H_P~5YJKH7i2x_X7ybCB@@*bdcp2vgICC@gz*`RdE zFEhOBL1`O%J1AZ9`;G4gI*}C3u>JB9yPpQ z4X;BC?yw}56F`j=xo(DcI;auC>t%cg8s1RD8)bM|hBp+V@OQx?au)rQ72|P&&R8P&z&rC>^30l#Z_) zl#Xwq@%4a;mDH9R-xbDp4Jd914pVm<-lL$-72cl>Z!aia2g#?{rJN5+=Whq7a}Xj% zeG2Mq340KfuJP|c>71U_)ed_qsIw$QoZ%&b;tV!MT?}f3)MOqgEw|M0mV?rAkAdnX zA>IeoQ_|f7N~ildD4p&xP^XJ;WH>hIK2SPWpM%o5It)t3@++ulNv&OXo7WLkl<>NN>L^q%<9iM$ z-3o(2T_CBAFw}*HN&uy;K#JjI7+$I2xec`l6nBWks3$;icSwxdZm340M$n1mVpWp zY9%No)LKwnmkCpkf%;Xb^`L$cYBQ*xh1vn?C!uzM`cbI;pneeQFsP$KVW%zMD1-Pq zg8ELVuAq(x)f?1dp<+QD5^6N4Z-q(*^^H)Nj%SzzloO=;^O$T|YGK)IcM*>AMn-d?e;*UUr(f~u z%)uha6&(h(7fzUGKL3{Jc;Hg%hYwqY!=potiwisa!m?S6A#)EBnsRW){@sVpvK zNh4beJ&cn(U?c*5EwoDFAcQNt`I~IvN zqpW11G!LH^81fYn`D=;r5XsdHS^lWzlC3wBf`?lSocYM>$s zAH$Lc;L}fuU-zRy5|j@dsu5dh-U7b&UNXW*;UefNuc)qI3rZz(uYs`H=U5Kz8PE*W zvXn(KSYWd?i<#+Rv)G6d8Mkhj7XY!v_~4Vr*r~#Dl$}gIsPpMKgCzdVc4TZ8oZN>T zx3O6{#`lO>C0q+-TiZ*OzHbiUcK>(`g1C6Lj@y`6p>t5Ewg{pxEKbPkB7j2N*-s(; z;x%8v&k@suSP;R*tZ>g-Ey|%4pDN9bX6GVasYu_D+=MrT>F|{!kq8|ai6SGoW6y-C& zK%$pJ!M8Mt@<9bfp_0uq%yb{cOc57j(G3?3)iQ~ zz}mE3OupjfF$sY)F7TrJRX=w--OOsE<Vf!q>+7>Uny`Hz+cKf_%x$XAp z#0efQyS|6`xu^QMul934X1VSBedOnk!nzPIJ3q;m+s;p+<+k&4tL3)y^MarI6F+w( z%FWA`udv*9{oUZ_PO|Keo!=rq_q&$c&TkY}Pk7n+9bmcb{N`D1JN;|@+>iUY-|}<+ z;O9PvgC#CIe>42t^_JUC@6UezFb{HlWa&eO<^J4q&-L@)Z@CXy{*l_~C_DT(%WeCY z`uQ*MbFa4CN38fBw%m4oeU3Y8UUq&y(ALYi^SWt&9tovB@3-8x{Lhw~?+B&;DcYo| z6X2%Z`WC^vT78Z&@jiry2jgH@I$HewI270)eqRG=ld)4&j%VX;(vu4J5#S_X=QheS z1K1rn2j~Fuxmj=Ea$sNJY9J0HdDa4P5Z|*2cpmU$;2_}Fz#+hHNPie`Fc3D(Ga86z zMjj56*uO0=Vz~&o1nxNC^*}sH@;nQ~)<@6#z(k-zS)9N=z$75|!;J?{0Zssx1Ji&D zfaySm(c41NLtcus3irus?7ba1`)j;CSFAz!D&idVAIYbAcOy zGk|Xa^MHGR`M@85IQis>!T>fGI1E?{Oa&ruo_t^ha1rn_;Elja;6p$+@Si{&A@{rt zoDcjExDeP5b{VfN@SFs^3fLFu0mcHa0bUNQ0bU8j(>6~Xa4E1Jh$HA8e%RqU;IqKx zz<&Vif&7re^}qwb8-Ss(_csDN0a0h3A;6WuF~C*8RNyVZi-Bu^r9kX;^^^l|16~Qd z1Ly_b4O|6W3%m`u4)_4@e&9wRo&b720zM4<0r)5|3eTP%1NH?z4!j76H49G;@F`#= z5N+t04}1pb0X_??1>*DUp4))yfepY7z#YKnfS&+g0DceL1mw;BKY$Z}n}KOSJbm;` z2W|!O)6y>i=K{9_Yk{u;R{~!L-UoyZd7cNp0elA>BL9#7y-Nyh^Mrk)xb``2Z8wPz2{HBXdtJVCjq|zo&x*<*cBLs z@w^+bFYr|0P~d661mNkw=|Bf?HLxe}ufSfw-9YqV58r%!7LcDz?hEV=><2spcn&Zh zcrLICH~_c+7z?}&I2iaKa42vGa5%6Lcs}qD@B-jbAZ&xD7smO~z!czxz;fV4z*WFF z;9bCY;C;XZ;CsMC;4xqlFcjlBY>TH4Fcmlim=2r{bOEb@6M5-z@LCqfM;U7m<}8OyabpC#1nB(8gK?M6F3t%8(08b3M>TP51bAB23QRI0XPR3 zg7Ksj$TwY=0nY%I0|x>tfENNQfw{mcU>(p6ya$LmrsoMDp2K^#0v7_e11|@D3A_^c z6Yy$aZ;bzVO7FQ4cnxqIa0xIKxD+@acrEZw;4rD@H${;jQ`7lU4iw$(||Vs zCj(aiuLRx%ybrh%_!w{%@J-+?z<&X61-6M%>ULlk;2pr8z`KA0fNOyxftV|MoIva) z@LU312doA@1iTUW2=F%Gqri2*$AC`*p8!4wd=mIi;8Vc2fKLN=0iOYW3VarL7`Pr7 zg?Y&apab|E@ND4oz$D;CU^4IpU@ou$csXzr@D|`^;Df*|z^8y)fv*Bz0`gYvRp3v+ z*MO&De)0yeKM-S?hxcdy0!{2SDDO?E&rpegy1-dCkYbZop4~ zy?~zr2LL|fxiNafyaQWfgzz7r-5yN_X5L!yh{uR{skBbYyh4Bd&r>N6M!keKEMgU(Ll^O zJn_H`U=q*;gn3k7<6plFf|Pz41gQx17yNP^KTzsPH(KB&FZa{=M+{gp*W+x){`V!ppU&2);5&S5s^G+h~%q>go@zHgybnnq}pIn z5sG*He8Li`wpmn!D#i>*w+H7`x;?HpyqgT~uZH)W;eBIxM-1;w%ye{oXIWH);w(z@ zrW&5d@Rk_fqlWjS;k{{i?-<@Mh8Kc)kIr+fMMbKihR5AQI^9IWa~WQ?;mt6-0>i5? zJh$O_3~!0ytuQ>!(R5zc8s0j?d&=;hHM|DH+iZ9{3~#65?J>N4hWEAM9X32}Hq_LXRyr&HBS;K2Eyv>HU!|-+*-X6o-XLw&5-eJQ-SF-ERqF^HoFUIg3hS%HhVhwMo z;l&wVqT#s=FWc~D7+!(lRT!Sz@H~dM#PC)a-b%w;Yk2Dn?$8eW6pZ8p3ehPTu3_88ti!~5Fs4jUd;c+hQqq$$94a*>eS$;r zn|b)?-5?Mph52rkmRI4(sVKl3i5+-WREaOs;X{r1B#|R24-b25MpMJdjUyF7Tcn$cs{rz9+TLHgwRA=0?HC>GJbo>v+ z|2a`MKZJYvWrsrpSp4S&Ww9;?kWaBNRC2zpa;?XZ7ex2AB+f-#_DW`~#Un61+-WKN zDO+|ant^$^7RY=o12Qe{xY09QQhJ6z`;HYm@fc z`5az`7>O#dUWRxNWcBOLwmKODK60^~z*a0Gv7bNYI~X1$FMbvq?`TJZAGQvJE#nKF z>g4dHcSV2F&cjV#x|!2fBIG;jt{By5Z(~ z9Ef%lIFrqwWD|YZjE8KZ51Wx%hkvY??4x$}ktH0OiD{k)-ZT+0FM1A+M>k8lW~1Z~ zhq0c7&28?9x7s8!CHci0OHl1~_42z)etloa)X7wn)UMW^f%TP zO>E+H<*U3B7mcZ}?adVB)@e3>P$((Sx>{b-XH zw5)CCrF)?RV0vp0LyY=M^wHn_7Mtk9-es|gKI|QE)@&q`FJB5rMtQ(nqO{e%sU|i< zjNTG;OYilTwa&`^P$liK zcQJ+Pat_y7@5G^;j;l^W$~$pZN)-I{dnb-0wTfZnojBrb9t>|WV2mwV)8f~&p!gt{ zma1pDyvcaK4eQc+zYWP2s#I6cXyyGjY+^KSYc1ax0l&tpaLXA$Wme)D#+KR-VK86} zuYfR>ZfotqjhbrBFyr{BvIKDuvq__%Y{}poWvjWeBYN3DBmkDx%N%g|#tzLJjWB!z z6VXSPVi^_GL)b0bpINQh$Y0gD{sH6}uQ7q+`**#y+n?7FG6tUrp9LG%r)E9dTe-7n zi9|u_Rxw0f;*CFhYa2k-Y~-(U531S7Fv=~jt0dW?5q1q@b=B1~fHVawfKAa#y)+(# zpJX788K^$Fr6$rtvPHsM-xUFx>iR%u*adLpeL6yH;!s-D#fi`M3Vr*%myqUv0qHxi{CuCrc8#GJ5a zuz#^sb{6X;i+m+f;4E5skQ{i!TTk7Rv3ggyZ7Vy@nO;}xrvUGwk!m)Q3AKEahEF6c z&D;bA)zB|cZ-|>f)g}Tv9F$iE*a2&vRdff?mJ7sro9$#t4+}X>D*mQPfIlq*BlJr-J`cOJTZ61I2%kab>I~iSYnfy@rJP=3)~nXgQyNARZzdY z9jnQV)Aq#3x0>o|*?3-QoB%D`cqR&cJRPZ75USjR14y8vMc6k z@_akoSY2+dSFu_|+}~o=)iZu?Jl-&IJR7m?N0@88lp0O1s|e=Rj>@hWuXA(Fm76*2 zap|pGLKJ6jQO!k|Z31)VY zbk=a@08U7?JkeC-6GWPa)<4f2zZx#@bD#90k?xTc}E2^wSdvEMqw&f6xR zGwgNdX!tI4mr#_J*F&JgHL2G4(41-8d``}7ng$6shH_CURh*{TZ~07u*DUP)%yL)a zc3!_Do@+*eApcSM_wjhNl>BL%p7?gi>9{D;XG?(4zRFQxxLD3r`P zEpaiZZ2ZSySEqfhW1gW_fZ~poFm)@ad+{G5pFP?u6rUt$DgrW^;<=W0@E@l7;#Z#{ z83an-)APy3LJ2z=)Lx<7pmYv?0`;))&c>*80jMzUwXvufpuT_vzTpf?pMhBb>Rt(f zy&rs0JVLAirO&n93reTE4HO58Fxf+-eX(o7^2PoG%NIKftgycr-x%De^GQn>pW9m@ zMuA!;>Eao;mA|QmDh2hLgqR2FUXjDIU8}qgg3@*Hvf=GD)KNp74i(es_5-EMaiQUj zGrZ}BH_PxI1;x=TMjbHJ>6qr}I^~`lP33~pr!$K|=`@yt+ACpss#~8)dKi>0$Gf0j zma?%gPZhZzK(t@IE)ZuMDpZI-iau5tNQ41(c4Z$nZ)H?+Q@5hPYowQ>#JgT)ko_ zJ}JqOI%wAc&#fhY-9T*=suw6-^68*-dAT1(^A>^9@!bGQm;4S;{E$bOdKi?Bq z#0#JnN^1W$)OVnCx)Hbo*CAp+=@9)v@x4J|D$e+hH@+31bPkq-()Ds9C|xg47~V66 zw+$3`vW2NPLFqI;0Ht&FJt!RuPps=$PQbdzr4phmC>>%LD4lKwsAt4?DkyC&xC2Ma z)q#3ad{=?ez4mV7`zR=#?(>Fv8`Q&6L*IhZVSfar!-ir>O~>3Dlx~lKh8Jge;|-5% z)*RQuWI66nLUDb1w&ZFpsC=Q`1oe^l?gFLLzz5LPqvG2Mlx~?*KxyAIK|LtGeLyXi zJP!lq5o)ZFbAjTN0`K?$b-z$WpwTaQ)0>!=C zVG4$!#ro=(@a3=vwU*2O1lb-x|L?Jk=zD^!ANt(+ekaHzPQ=z9VNW(IuOY6=^8CW8 zDxPQ2E9kP=%ETKWT$13s*s5S){+~Ne#@+d>#|l)m?9P{+{T73VUU>RqGo}U}(HX-*1KFS37t% zWryvSLn!7j4d*qI2~0D5k5-_8RR;cX@wA5rVs6kaPkV4t_aTv!a|&)NnFOBK;=(!C z6{TwAfDliZaV3rUFDk_24UuE1xZvdfaw;4UzzgF*%&1D2@=IcF;2SdTBMs3 zGP^+b!3f{rA0yng81!*5SuO)g1>5J#_+>km)O@&`tAcBgT{(lp7=2^os$VUJa$GFz ze$4t9TZIYD6($oMMb?7R{5Z^JOGJ*jP!X0{v6SJQ+Sp=!EblQ(NKUHZJ1%o2_gscD zCutb_4l8JdoGT*du+5R^sR_GmPE%a|#p24;di-0(;$q0Pr~*c+Pn_{iT^E#(PZ%pF zwqw!leI~Um3vak6XqSa`&Rb+Qk>rsKPLSgf7FDcIX7PTl*-0Mi4HrXLl}*`Z0=)Sp z7f-zkal%lvmFpYimC3OnPQ`m8b~C+ZweV(L3Lu$a0Y=-LrucnZ`cza$Urb$avCr|I z*e;iJCSTbHAjFNuxL7J;b_L62pGd%N+h*=ATAj^_2J9Y_%Rb>S%FjK` z&wYv38)cv9n5HYj#K#@fylnqdFtg#s9h%H9cNFuo{kemfm+c>pIft*CZ`bj4^L;wJ z;;i^O>iSaliJQrmn94EP({|?XxEq)1hy7h7J`2j&;z_0SP!fP z(g=HjTY%RC-vr(OYy_?V@~#uR_dTZoZwB(c6f1$8wXFtnu5$~p1b8cOF%WNv@^JQY zH<0tedx8I7b7ulrWpVEPmjo~d6x5)oD6xPmOMnD}qB%=W_Hz;hs#q#Z5_U+;f+$c9 z1{8=XR>iG)UF*_|O4U~MqT&X)(~7OOs3JvbM91e8YiKR{N`J5PeF zYImLnStagl0=rW0o&__(=fIvIy9?r{f?L26@I`P6$Zmr;tAU+Yz}evIpftmO0$CmF zybaz7{snvtd5iWcr3UZJP!N<><4z|x#Qh1-V4kI zr7;@_4hK&L&jNX4jE@CR1M9&vKxxQ^fvw&w#W=@wY(Uf8!s4Q^9Y+YH%d&N-a1RoB`H@Gr=ptS>R*f9PkZr zF1Qbz4-TY#sRK^~F9t6Jo51N{Gq?n#?BbV$3&Fd=OTj;ai@;C8CEy_18Ok<36pVu* za2Z$(wtyAjRp4y!=U_d!25bg@0WJcs0cAxJbs~Nb$gY{VtQlfgWc*|Bc2N3@yTQY0 zr|tod0q+I-f%k)XAg8&-$Aas?S>OZUeDERgL2x~|9()x19rzgdG`IoW3T_1VfKP&d z1*wzq<7wxf0kNucI`sO6TWLM?`Uasgo#$|scgY^k7DHt^(sIcgP!H#ihRSr_hmv=p z9?nOG%2X?RDox%oL$AofG(#ccvcBNruW) zr_{*XQxA2TjZm4++5F0TR1bBwicpzO8Nc$b)d7CWndCS{odD|^-r{#TUd7oR}e#>KN zkDGsnBL6He%kr`1uU=7@~SLP+EZOOrdVE$<<(nWljW_nysIpa)oFto z$4qNDcTl5~J@_m~NM~5KGid0j=?;!Ogfv^rhX#wI`Jt+@Lq<5!%ECyt!#@_zInk1A zr@S(!va)hWzFtT6A^z36q<*|lJuXviW?j;j$Uf0EJCjv6i4WR6w?t%VytDVvR_|62sIDZ{x&;9TBG~aRj>P8&Ug=J-=4dPf)1vz`83x{d!h5ZLVFwB z*eJ=Jy@;1kD>nUXLVFcj`=LMUr-{H9`B#S*CGKOM3 zpFbwjX^!-CR9Ea@@mI*7YvlMr5v5;LCV8>lyd?KkY~k|W8odrFPMu)5n=qnN7P`r_ z*-_S|3m-BT$Q()Vf)ROY9!SF7#NR;vq@zd}IoU&El--r?cz(6Kp39q(c#@GA$JHpF zyz=j&MrFgVo+;PV@=9o4;pIphIV$0Rv2&D>J0Q;>Uapb2%79$rE89E7yg zGx#+44!9M35BxK@6O_l}eekc~hv47AkHB=|{Rt??X6*q_0RIy_8QcfTk!+uWA@DP> z0;GA5PXQSe#-(g%77R`cZ0FwIl<>Ppdd_(1ctwdxxN)dk9{ zBKzciWmdRF4#@R_(VopETo2EuJ1$xF-6}Y|HPTnJefJ3-CxQ$nWI8-ok# z#XW=Dn)lwo*TeQ#3r2R%&gWS1$WHguD@(CJRbZ8><1o3TuuPx+u?~|Hkb_#22TR>!5@KVfdfEkh=zhOFb5nD zjsT@WV&8sz8ki5x0Y`%iz_URq^9i67lYAN04V6&3p%N-not3G1CD=7@lA(Gy5{Bl< zO6limJ9nc^H(+DF<6`K)2JDFB4sjXz!m7x3TO#X(-oiRcIbmL&@r=6^(m)(Wbzp6U z@@*F#xGN~k8j_jfIe8I@)}R-ebm)PV9xY2Y$nuRpu?@0~1==dIEzip$Y_ob>21eV| zz-Su;FWi_V6_C1RW91}qJ>znvVn+1O)byb@jA!e@ITYAjmp39yTcJIU4 z8I96)O6j`2x62BPb+pI(xfVv2xv@S+mXd`s6mM)#&Fn3=b0~gRx48@--NnBf>|&mQ zW*tU~i1%t6fv7j~t0wGbr3Vf28G5Ptgr3K%b>^$uoP%6L!Fm>zb0%LhSjpWT@l}y+ z%bpYul9(ljZeCFiUA%X?X2!>MvCQ-Kjzvjgx%Hy6ja9F;UNji%Ds@$1tIDp{wUTMA z-o@NTeQ56?I-H!%EAD=p)g6i2vU$ZVOJV5sH!8kuZQ{jdjk_#O)&Q$ix!nex(C(HE z(igBkjdLT&o86{UZQCtgb?uP_zW+SPDlVT^cg;+?a@D$9o)j^Z9m#_r3xCl;=F*{( zvsFD;wW*q+66s#VxMn+{FYc{thf~ze>DBTq94*|k$yX_j#*(bDZEGdX?%Jgcooba2 zZY5^Dtpwk)iM5?9#8xx|f!4JuQlYH>Zk20Od2!ugk{5R2-(XYuym?_F%k9Jx;-2@J z`1fVxsICYK~`HhFGQvqUV* z^~5E$DqV{XO1fOZA5t!!a8$Xqu2osOypLq5ZQ|TY+d-BxQqf`a*d5%w;<^I$IK;7$ z45`Cr1#qwBGLxb*OfM7PMxwSvo)=%zusyHZAX#e1b*qia>+`K`;;CiKGAgm`jmDQ| zsYT+?ONp`g+*Iq{s#<4tSglV)*sa!6nAGdlA`23mBVZFwKbP+Jb}`nL2H;<`%x?k#jcp;xutO{!Em2_Z$-^b>1U#df23 zSfPGdc>hfI*8S9QWwnu(;91Tqk?A1P;wt-vxMe(TZ?`>D4^rnNyWa`)e&^O2n2PTE z&aLC2DO<(U3mHqqDr{{XjZe3MVn@$a65l7~*O6T{LL_t=t5GYZCy}daYmgkL~r;TIrw8lghP1V#{J-MN71xB})1^ zWR;^^*~XX#ZO`v`txegbKB*p(#CTxUgdME9RBccPkH^B^OU*z)y2%A;d)JBQ4036r z*^tCyRl_iSBoW*}HS>76G{Mn+E}Nk_t!gcFu&<70mcu=PL3&574l1>DiHFr#;K&HsFOd#C-+hq31j>693NC6b#ovYg%Z z4w7weopP&(`#7f>e2pP2sv`GX@hihoxv9bSi^8;p;dVssh*@tj{DFhi z5*gsgAhkkTjelv7nlw0;Ec?GUW_^W0w{Oh4HisUyf=pzoL|0^V7rk2EV3SfHFT3roZIrS5U({%Rhnh&z8#H$4 z$myI)zUi?u5fw$%ak!E0Bn^xlR6go*X1}3l#NZC0*uMi?x)^t`+2KQ_HKncq%|A$o z8GkhoNFCrFHNaBwXVr{kU@pdt?7+_3i1$=AV?KsozO;_ROxV zT02m+a_TpAW$U#@_CC0|DN_@@T4b(^9b~9r*y1$PK5Dw>!RDTuR}{cc-*cPFapUJ; zb06!+X=d(0`Put3mzj~~@sQ?vNZb3ypzO+5_FBfVIj3YAGRf21=lO@_rH=Q7NA@KhNOwkgkJ)d(?^ zBOEQRhlR?E(W1tX;zK`7o@$co4h=_q|HIbFAgfgkeeC!qY4oK+bjMuo*e5Zr%FdwE z>U;>)tL=8?4t=$$)9J1bp3RF8c59Q%Cv;&YMWwT{hd|00lWO53QTI}o8g7fNSf znr_cH+AS@WJ$kxEh32N`=KtT)Bb}j2kQ(51o}kX&&*ict5^JYkvb5dZp+8tkPUcdC z(9|{y|PFZzbI5su}rPBwkiFT zaBEP?TiawVL{S;k+UMIBzU>hLQlFGhW+7Xvdb@I}*-`v7-Xx!IU!(iEjfE`4PF-PI zHmEs{UduPB9OC)X^Bh^EqqFQ^>t?2SQkj_{spk519-pRWxqRK^YUgvYODo(*NBZK% zb0w)t%sx8WCM~R@+}RUPo7mSRQ_YiHkowu!QzGMqPFhCQ_I*zS*gySy8o;>9l^;4e z;f~r$eA#f8#E=;XQ`|yIC6Vcc&gKkkS<7~V|D6QNimsF`{1eFuR4<4B$^dGCn^Lz1Yu;*?HLAAxg z&^CG_J;0DJUG8Ya_3O^adV0iD-S(q*ii}I_)OJS_-?uGUzEOHs^IWaI@R4&e7w-fh zFfz61(rU6jpxBPgN4k8OSype+IC(Z_$X0_!v-?;?0LzuBaxcxT1b${k1@8EwX6lwlvWq zU#;c#knWDOs9His$XfI7pzgsn%lQ*jA%ESS5BLo$YAX6U1sdmi2u{L1udcjsy-tz|0|C)UH;VO>AAuH`g{I({>t zM4n|?P%D(gBFozjwM_ALL+LQSfYM=bBCjJi1hB^&O1qXqY1b`K@+qUc^Lxux)2XeR77r-lZz1=xf&>LuuECpd?4SJI`6ySFP(;P|eEq zP`>PH*`uJe?609NR<2K3*R9sIAERekM3v<{1jTIxgz-3(F1P2Pw3b~^MXG$ifQl&U zaVqL89V;j;@hX&-kTu)2%2m#n*RJP4Y1cL=?nWTA8?5Uc*7ad1U7t5vo}4y+hYI&4 zsDPq=4^^P3x1hL-0ev4p=`i*{>H7R%P?MCaoP(+B^FOV>qgb`A{mFjX3zWYTp|rnK zp|rj*l&t;f?o>hP6v-L)+I2CMj@6Y=I#zE$>6+Mw1r_?K=nti3PlM93g-}{{9F&$_ z1vOs9Wi6C`Do$fYZ4NQWaz25oQm(ScMQdR}o>QrK-J!}AbsUuTcM_ELC->NBf1|Cx zi=m2@#Lu8~{8mC~i5sE9%Jo;)^&#uJ1FAr|?y;_4TGvB+(Y`3xqoK6sY$&aH8dON- zX%kdXQP)7}^lq|L9;<}TR9Zq%T1y3#)=~pCQn_AiT^Ctb*-rO}dRDKquK#9TA7Gw+ zn38=AN^5=wN^AZH)EUb4kRx5!BcQbFaHx=qa{x-me*01E?NAc$LTP<+x38Ai4>dr! zc43*5cI^SBU5|m%_5LKw%dtE;XI}dYLg^Y?1hq(|tpZBd*dJSeOQ8x?{C*Au@Mt9%ox#2ukODG1O00ZbYGU-k)#%$tm!<#asiWTg*?P z4pE`~4N8aB3MF3=x;sOmbZBy0?1hwSmNOM9pvt!%O1B^x zENDtsp&bdOL+b~nC5Axh(9X2HbD?x-VWqO>#qGqgtOW!EeHQSCAIpH4G8{pX}3@)!lUU?7)>9 zGA|)YdTV_X_Sx!AP8kKuR$}jvR;1*!O%Px1^{6uYSdU$V`;J zIWEgzMEA_OO8Ghl_+p(}-85@KtsH64sQ5D6mO#B@YFWQ7U-u=DaNXRxX1xtxzW0cV z`E^xwjkB6$pTAtYDT8{^phn+j$SvE9<;~4^kEx0k(KwNqj*qIH*YXlzW%bBiL}jsu zgrsspc1Fu0RXG*Fo*f|h;uv4S8MSKdd<}M$Pn-uJxhuy8h?ZGu)$0aq{yQ|AjJ!&^ zgmNrGvP4N1%c?6x>!!O)Z6yLb&|r7dOEl%3>rN75uep@fwX$eQmd+|k--dfxH?*4S zhY^pmBq*_)-n$1|zF=+D9wl5^2xGTgd;P6P(+~!$7}*6bZ%Z9)W0wUxk`3|#C8?Bs z1n!?#+aml-Wgv@@=*hB|#Kw8A$BFn@sy#~dZp5Rz;k`q}qw#-?RDD^~%#jcHmvUUF zJbM+(7hE}X#CVK%>QOT2G{!O*iNQ=fN|{LoqJ5Jqe>J1BX=ZJM;!1JJw=T(uhFUr6 zy0%8eMn3ZCN+O!%^P7}thX*FeO!Zq?DpbiJHS^kGLCY*jtlw=e4L^^ zO6W4vXA8QcBHD!iQuVoT$z2Yu^4htY#%DiA`U{Nf{{>@rH?@z}HQ&0I=^AeB&m`Fo z(N)p9Z%nd3rmLQf?=y5QV%+!-=f%ZqUz=o?O9aGhqO2vovKdxP%%uMdV|VkbA1^6l zTzkye-SAE@osnz*NY{9$%INFMP+yE|Uu^8If4SyLjBEcS$)2Sj4C@{s-d_K8N%m`! z?7t-*UjNN`|F2iAUClKt}}dlo}Uul`}i?v{VKvAgmAD#?Fu28?1{|AUR)_1~Kz zo)|a1XBfNdzu4Ga|D_Cfy#8y9-SxlFW0z-Io!YR~RC*DVanm*)%A$1 zW2pvkB)AMb2V4Qhz$?M&;7agHa5Z=jconz~Yy*D-t^qfJ*MjeWYe8A0dOdgwcmpUO zaefJ23f>Cd4BiIb58eSj58eg74c-mD2d)G6f)9ZEL3ZrN=`S2+ZsIcHUk@G%J`8dv zrSk|l7Gx)Ed>r^&@Ir6{DDxtZgLA+qK<UPl4QJ=xhRC0G|cF2A>DhX}C6n z0dOnGop8=e;C%39@N)1qFpUOm8`vBCJt*gHzX8gbcyEFe!9RgBK~5ToH-mox9|qq6 zIq|`H50q0Dc7mURAAsFy2zP;;gy4J#P5?g!Yrs!HcKSQ}z^Xl2kD;!73(64UpWqab4Jz@=!8Gt{FddZpkh+1y)uFMC6IUk# zlv5FUfO4W1dxF*J2%L)-AB~;)GIft+A5aDr$AGeb_gGNI4#$JP08aql0{er12D3pq zJ>f^-`yjiC%b`>c^sb&UJR}T8^PN_c1*|b0T+R9fr~-8$B`qx<8r?UWfK1uTn@?* z>9~Fg%Ds-afER$bf-}Io!K*+{QdIXm-U~j0o!M7)zazJ1#s7x=0kAtA-h<#k@F7q} zhL3`I;P1c!@Ck4(xDi|iGItxl6?__e5Zna53_b(C4L%G01$++N3BCZHMn|~?909%v zR)H^p7lN;VGN^qGTn_#ol!4?MpqxIm9h6gi{s`^>sq69m;0{pkfqV}fL&r;1m#}GkHJ24#Jj=c!2bl#2KRwc@N;lA_yu?;_$BxtxF6gMeg(b`ehq#CayM)I zbMOFo4jnqrR=g1W1}p-<1*70Uzlg z)`Q&`kX#IAf(>9cxBx5wSHTs)zF;{)EzZCd$l}zB5rMeP^P~Vd*;)h0=E>%50XtGf^mgXQIq&^>DiJD-coA@TB9%F#(3R%ktRjZ+Kr?-a*StXWXG>dl{;SbCl)v zx4Z$CH_Y-zT3&(Wg)Ohr^2S--WXr3zygJKkw7jL3*J62VEbm&&yUp_Mvb={Z?-9#; z+VY;Wyw@%74aWnR-SXbBy!R|`m*stC zd0$%ILCZ^L+-UO8P~@NG(Sw<~JHYbjeGG4;Lz-e;EgrR5#8ymZFX zCjSgY{#jms%ab#ywZCDOCnuh1UV-I>Ew9q@##!EE%d56L8R3hT9_$u(^)0o$7R$TQ z^5nE@9qypU!ScUG{hvD*!+6d1^9M?g7Z2Fn`W`lyj4y`8qIW z8b>e@({t&V8DbxNFL3isVjeFjFU~Ex@H}oZl&SMbLqlCd<4{S7OuIKV>s$RKI5#VF ziq!A4xy`jI;+?q9XsE57pUOi+ZH+(SgQ`t-NXgi&*BO^HqUNMQjgy=~5ND|Z)5KYW z8i(mA{_N1D>VT<1Ik`2%#M`hzLr2tPYXRk%AF@*a*Iu=xrqxMRPI*!8#AtZPNCHZw zW{BL-7*wBdCJYEv*D^KGc{+H10Lc^pECCX(j@8gX)np4I&45Ml{R<;gth{gdqR);re z#?~uk8KrxZp{%T&-F2ooa2}5<&{HlixWB%5Fm@q66Yw=CK2G<9!TvQ>7C zayXUKvSg#v#34r;^%YAiW=O8@pFOlSvfZZ8U761gP?Fa2r2MkMU>Ie}U1V6!h-_~; z(6!f!6ND4lzPjX)m2D&8w??+EF3DKgb_(?DG*Q{6@Aoq$&W@VnL>IAUSBGZ{y}K5( zHM+g!nKU+^zjLcp9Cu@f>+Eh96t{P7m3(J^iv-+qU|jRz@2n8c+dH+(>~vy7_;QZ8 zdqoxD_rj{e7rsrg8$fGxYs)j~KQMeLe!`c;wj4NL!WWK&FStkA8mT#ne04+75frzr z?P8#XIerYYLnTqRSaw@9+GUAu%{tj-NwS3%Y&yzixxRw3Yfi!;XQ`tZ=c&r*=Bv9& zd5^rMQ46>aE)iR|7Eqgy)LFaZR}zvN``PDvwKde$=vLz0=f> zz+xSXH)rdJB(f%Np3_F5^jz8mm(_JPDCl5^&JE)5lt>0x7N57soNr3kz7`g z_CvmL&|vGzAa_JXU3%iFimwWsO~t}j^u!$aTh#txsnDjmRVU7kaUaSI5~pvHb*rUK zb@afhVE&#Fs?0qtX-D^&es4=EEn%s$x~R%%~?~M6tIv+uF9&e(-&n7!1o&dvN)R3J=0Ex(4+b5?v(TU2inQ*>PD(N zv1K{)_?5HqyQ|w~H1Ae;?PB7E5)2(ZhbzN*-uduEgp*|o6-PK(~TA!TJ-lSqR z6iVNSlMkg`qn3BR<;l9`&HS<2o?k8dAe5Hf0HtMLwY)!B-aAlQR_@f&5{WytWL8h} z&Vtffil81)ahCbL-zaJ>)C|(n-B}7%t*G0eo<)0i=T}e>#d`=!Yk3yx110;4<$Z2> z-&o!-s*v_K8cNHSTiyiAn`3$MwNd+93H83p$y=dxI_|Zu8!d0M<-G!>bK_$u9j?qA zYJFKe3YsVPc4^*lC>;j-BuyAq*0t91>MW0Q$4wY(ptL^ua;f#nw@aP7^7T^Z>FLa9 zO;G6=12tLYWD%5>kXyZ;Op|<`4yEf~y>|V(ogcqmg4KAbF)ej-xE#j`I2a2 z&o@G&WtMg2`<`*-i=J`io1F7o6)V2FnYEsLM>DSLp&nJPd;@bHQPftbhZV*5Dd#te z+6lE@QG8o+9#RxV-fo5G;WTp6G`ekF@=2Lplia`LYm@ir-EAmMzK2P4${W^=gxvlf zCYdYn+`}Y+Z^Cm=P+r3l<}jxxpUkZJpR@LMy14<(sB2;%3F}FoXO3ldm(s}_y_j_rt}GQhPRGjLUvpNH{lX;sWl8oYjNQGTMfSmqaqn{} zPqME|vcH^Uckjn><%iO*c=g?7>>rr;%e^CF-0|50m^KNgWj9hF@sxt~_^PDC64OlKjiPAY$D6e`<`~y)S2Zl6|MKyXpTrNxqVH zNsKFB=dnv2_yV_;CeOv6v}dyNDh9pS@NeXcrnGT4fkVLC!4mLJuo}D@oDDt*E(e*T zSNG)n2D~2oBjB&WN5N;n-+_Msp8$7*tni9=r`|jb_5fc1hk%>GD7Xcj2eLve-Uhw| z-UPBrCN3+Knd^_sL-z)_4SW-nr)vi&Upe0a4%ah zSAx62TfjZwUEp5uQ;^j-@xO!r1s+1Z`YYHIA@;w4SA%~C9|6AsH-HSX zIh2(*U>8tUVx@suAh%t{j|DS8d31Y&%fKVSwO|&w13Vg(JC3-^DV|CFISxD> z><7ws&=bKGU^aLMcoO&s$m*f^+u*6-yWr^{CmTCwfQM6W27||gL&4!7-!kG=;BasP zcoujGcs6(gcn0m=gj&2MfVNsb?i%FR%9~j2C)1e=}63lSYk^QAZC)>ZDMa&Jj>DPU+$FF;u4059%q!%QjS|+Iyno z{2e?U=SBF@yrqW9bndh~nOD{Rx=|yvze5d`>6~hLgDo%L^2S(RiRD#T-UXI7$?|4e z-dxLDXnBh*Z>8m3WqCJR-Yu4QpXIHyybYGO(ek!h-Yb^(mgViRyxo?!&+-mf-glOl zLG9Oh)zeU!PG8IGXL+Yu-eAjEbju#n`C)2EpM*nEwsGFmbcRK zuClxvE$6WA+h}=PE$gwQe4lf&4|7gGoi9Y;x`u}4`X=+S2nTIqf$YIfbZWi3>*gG%G*(pU5I#fu zK7A$*c=g!G%J0h8KJd=`q61eP%QN6qpEaquk-Io2&90j{e^TB2+L{J-{YQJaWXOYVP!`n{QY(wbPnsOj=N#pEI<+W||Ygv3}^Rno~Bo1RUr)=C;lY1>1q4Vrhyf!HAk<1_!?_b z#L$MCsZCQgkGhMLSlo3Ayd||M(q%dHkbWU(uBJ_i^-y zkvNfuw75+(9VY-+IMOQdN`bB3a46Fz?$1?xuDJly(~igOD5$C-mmbh&DUbBU?6HBeexR^Xd)5^&?9(wGqzHhNkL)lBFt)HC-%$t=?f+H zv#0#~3MFcPyrm<4)6@3hQJ!HjeN^d`Tz|kVF3ncIGW{r~k0UuYup%}*2U{Fz6}oU_ zM$x&-%Naf#j!g1eKf_1BnPNHKevp;S#K(Qkv0!YHwbk=G%{Ymat_l9y;?*qASUT@y z+T3+&Z%VRr&6gP`k<#^NE<0AW$%frp{dK|9lY3oe>?p`_bWL*>bpI@F-$GkP+cqJuEl-)c!PSu3Lut9v)6O)ZKeB2B3@pypEgNq0>+pttf|A;VN9o(d^i!d49l1z^lZ;$% zE2f{5Toy7iN>6hKtT+8)Bae>FC?(_l>1*_el)tU(uk^^YgVfs7M?TEsArX0^>!ZH` zJjR=fZ20ME@=?gm!~QB2XD%!&^@tcU--O;@r^1tmCn-H8{7T$^^z6E6I`q#j_&}H* z;|={s@OgHKri|yroTR9#mnJeANH+4hNX$tpbZJHXEu^6-J8 z@YGa#ZZ~>F%CF}%pPo^-=U$mg&jzDMr2KkL_vtz7vt?(b(zDIz5h=eO#60N={l__c zQR+N@WO6`^Ncr^)hLgyjV=o-^awmER~+VW&kNtemz5ddS*QQ z^{c7$ChG$4h+%k zX@8{0PET7Pzx*|&^}bU-@3%cMXeA7f@jma;tEZ>Q*x7yFhpXrPxk%uT9uY_xkIk*q z7c+Rq`* zzwvX3^9CPhB=Lzej7jJjNt_p2j(5yPBq*H>lj}7noVUh(Dh$g9GEFZ=r2Nky$wNltR^BT{}nV|;qx zr_xhl^oW#Sj|_VfWB!pZzeelTd3#$+1~H`rRE{e0%*ctbD1XL?$e@qh94cfITCwJJPB7gL2r z%Abb;IO%E9i-~#aS9zDD(vxHK1n{e4Snoa@iZglItobzo^#X`JJ1MLnyu|4Jva$E^ zjB718v@^1BMvO@L;~avMNc#hCzwmG>J@*?uBBeun*B57Ru7;Inx83;7%af3PfO5h=f(5;&fGe(+$*CxwmZ%7~PX^#Hdz zSPq-Jt?`E?uYrkv=ZHREryTpS`CA#0^6M${>G@#5`s>};XbJ!CkBuIY(s7>OX$;Gi zX16@P8MV5_mGSG;w#$qjk@Cl|Lg~pgLPZxZU6@J_+pCokDIGS;39RvJj>1n*b7T16 z92s@EHY;KYmK!J|Qrg#hKF#9D5&&!bVa4Dl>PBSBXER+bR=`8BBtRLF^6RODlZbQE z@rN?u(RrM+57l}^O8d$;9O3&lSHVe7>nRSHdry7;K37I_{J#;SN2L6E#==QYOE=y} z-1qK@sr1Y;dPGXc@Nyf&>?F(woyB+`M@HlomgDUU&c`KDdrumD_A|N!VRv9&GHDkn zf9<^hPGYqD+-t8qno7?zSzZxPz*SS7W3KWkcHV;yzpL)Hu_O9+A?%mUSA#NlLT(+Hmg! z@A05?uK8-CN2JuZfIO)!A9YyDKUJDd*22ciQ|TFP;v-UiJ=IE&o6j#l_2ToX^o%!pL`vsk zli`>VzNf{mQJOC?<$w6Nv4eFBSwFhh5jc5_w}q^Q&j=RfZoRKj)cVVcCnfGf3exG#2fkyB{i4O&Ct)8u0r3oXvE!qDY0E+ zLZ99)^qESJ9D?^b)G5!_&;%0|XW5r8?gKo=8~QBx%%U?~zSsDesX{;gPtPPtiSu11 z^qDGjnMXR4P`>NO7dX+Q=8>eKKZIC#I6S&X`8hQ7{rwyo`qO=!GwD<|`7}$%BXcrZ zv$vg}Eup9Nl_+B7-MsdoTURv4|GUAYLZtjPa}J#Jv_8iBuh!o4%T#*OrI;}y<<~P8 zPGVeFdByvKQ|YNPdPK^vXP(mIK5_r3dH0P}dag8jM9QyczS3hF8t3*!uki5cX9`SmoyNl$Z|nr~)3MXl~! z&l^UMNcr_NDLp(6$~-W0-sV(#dLFL*iIiWDG&|{OJTl5m{B+f2sr1wsJtF1Tvj9$d z+HqQqlXur)D^ltCtSE_uV? z9+C3vxm4+KpNo^a{CamPJ(Wg}Ncr`Ut>lk!c6Mx=dtE9$7aNZv<=3-F>2cF_$Op^! zrP6bg(IZlRJ&TndH(lcn%cp90UJqX|dPK^vXNl62!LOKq58b~Zm7e`Zk4X9T{0vTF zUgD0cmS3AnPfzneiwglJWj}@mFuA($mE>W+LU+vs~#RyOqf~<|3Lyod(15!TCmyNcr{9ln|eR z#`k5lf4DuBo`;Mck@D-gLg{g9LgnY1UrME?mwCuU%CF~2pPqg%wrxtKC*SB1DZieT zN{{IRo$XV~K1ro#ve6?_em$#{9@AAgGt+L^mP*ghjUJKm>shVzoWZY{hhKOqWgGRl z(IZlRJ*{vOZzZ2>`!Z#lnR%3i#{Pc(^h&2{_QGkCouv6H*opc18>e-J(Rqy;WHgJE zKZb2e&mlSxr|;cMzD%X3+~^T0zn-5fJ#LMfKH=`uQt7$a=n*L$>t7g-M8vOojnX_) z95A6v?oB!Vx!vdyDZiep;UxNyHmr9L=&lO~y3$Z9b=1zZ30w^=dOl5g9Sw_^idAp0Fri;ZeAG*3_W`KON~wLv}^C!|Ke>F(q3+9XH* zdi>BqBwbuWyjd(Fgg|8!+=XlHIWnnlVV!<*nFMi<8qIJs{sJs%l8BIVb^ zU=%%WN@GJ7QzJW1=|7Afk@D-|r4c=c@hj%2E$608*D-yxKauk5xdl$51b_b6yF5dk z$LAcQN2JiBXMo3x?pu|fDMEgaxd0sn1(U;p$vGpV<-t&_GF%)etgS8>7z_riOIcM} zWl^j&7>Ly^@VkVf!OHSburN?r-Q;&EE)EB)f@R^rxY~NZOKDMAQKYmu7zj4c@Vium zii4rz^724g^IX46X<<=uNhDl~%Y45}I2J7|uLwk^Uh3ypL@Fzaqh(crV10w%rLr(q z7AhzF=+q>alCn@?xTG=~D5{<2mnkbPDJ!WejReZ3n(+CMz+Q0KH85HB@9Wk1lVi>E zrqwo7PWP~c)F%x3T$5O?Jd6B0a51cksg3SI0h48GdTi=EwggPp_r7p1PfcxuGr5Q_ z;%ejk$* zsg1RE9lG}AvULo^Ls+h@(GdvbBpJ7E zP3_c{zz8WYmC@6u&uwm;>Dpk{O`ANud49F4Clm>UD@)6&!ZhXV$Slay=aCfT@vz91 zQU#-Y84xDr6%|EAVcO~tPeMUn(Ny+Ifz#_65H74L$dkLMB=zAU*af2t@@g9bZUmB2 zY7#R#TosE&iz(6JIR&}-1-bl=^fw2@GeVhH#9~!}^J*LG<}Rq!VKmw(3=GEH*qX%G zbA4Q$tqo^ZRg{J+E5apKfv!0-YMW-(H8xGVbUv-B)Crw)^$oM;H%)i*sWK2NjaHU~ zi`?KjAl8k5KZ}TItg@^qT2@>fn9)47p=K66NACQ(g3+_;3v%lkW)$Sw!czT6U44@( zuvvA~Qt4PIXBIZ8ooSjh*%S%~%F4qfk-}I-pmFMg+G<*zxpIVUL2lDRe=i&h6c&|5 zstQZXtk3qIDg#x)ii&V4X%cnGs!Tq}qgvBk?`F%?rn*_s(zyhxb2@I#s@u1Isxl&L zGjw=itUMa4s4Ay@FNyjp+2~@PF*=8;K%_LUBov|n$T3-Fn~SEpIg=aR!Wmv#5-KSz zF0Tv}_&rXqo?F)_9ff`tC}}HG8Hf~@S5y|4#8l$v%O<<_Sv0)7FkDr|2qa)e46drW zdbaVHa)}1Q(P%{|R9F%aHS8a3uV_T5vN%{;N$s6#Mi}x~tB0()KJi!&FJ>e}t`r9R z2~i6OMo~Ab8tSTR8ylscHzx<#NJNT4pK)z{mzR`O zR)&KCJm(aQ^c6yGth}r+S|oYuQ6bW97H}-Fn*$@ti^CPcLI!;W!zEx(Ai2ebMZs`U zS*eOvLGGyO{-X3hW+O|>izB76NF+)2$ zEEdYX@W~zB1L`&frHo9mb1%o9eURBAlY9EJ@vErggBqViBwFSv)M~8|k$||KJ zmsHxwn8XeY7yF8v#;+}3?Dg)?lo~3kx0=$nR#g_WbttH#p6pu%Wpi?RvUD)O zc%(8Ej&xKUCjB-Wl0q&H6czE(Qp)Rxrwo5k{wE3|@zNFwQSXXND&&DHj1~-+W7YNZ zFE%-oT-y@8rCSlmw{Wz$h#n@u$hg*50sPTPt`(;8nSxDf&O;2Pg2fbYRmbUDxUe8s zUOwm-y|q_mmyTqz!ty|@C`7|mr5hEKv56>(#=1E_Sl>vhUMw7{EL1IkJVi-0BT`Zl zWJpK#%uAdeUyvuS4}QO+t0J+gvf^^$l^3JQXz!ycP!Wv;=`U#E@WMdJo;RNyYDt8y zAY4&|M{^LpjIH!Z^gh3%%OkO}@|g6bH1@i5RVq~Ro6=Sdw{AsqYNk)0UTp{cZf`zv z`n1s=Lj$C{&4#J-YivtPJ0B_u#sd1h`{bcHFHDh=!m^UmU`0UQiS$AE1-ZJ`d3uG4 zK&+&)u!`|{piv!=@98m3uopKnj&#GNj|!KTle;CQQa9)5n&N-366G(CQNkwY>x=&m z>ryyGi*p0PkC=l@*WF>gP~|eMW`sCy1|0HkThL(0OP4Z;fesmlhU$K ziEcHyWI&YZNGqZsmsqJmkPX&H=<$(F`tYLSSW#iDQaAs;TpwK)ED2RHx-zlqI7Xw& zXp%}JWx9`|UFb00`Gvuva786UMSVd+!Dwd)sDHtp*EsIpBp=!Hl&vXSNilY^zHx{_W9jxl6z|6{f2BPwm`v;=A6%{n6(L!A{ z$cJ_v%?MteW1-538h47b%7B6Tz{!F6BZlYaxX*p4I8a_zS`;cNQx(3P5|%$1-kP(8 zbP?O(t_56;;JiJsY4D{4Zn$^ppSq literal 0 HcmV?d00001 diff --git a/Debug/mt.dep b/Debug/mt.dep new file mode 100644 index 0000000..3c6aa05 --- /dev/null +++ b/Debug/mt.dep @@ -0,0 +1 @@ +Manifest resource last updated at 18:43:52.23 on 29/04/2026 diff --git a/Debug/vc80.idb b/Debug/vc80.idb new file mode 100644 index 0000000000000000000000000000000000000000..6189aa58c27d5ada9736af57ac24e1409141c53f GIT binary patch literal 142336 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 Wz#-rea0oaA90Cpjhrlm50{LOCALAuth; BOOL COOKIE = FALSE; int Len; char * WebSock = 0; @@ -1677,41 +1676,8 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn) strcpy(URL, MsgPtr); - HostPtr = strstr(MsgPtr, "Host: "); - WebSock = strstr(MsgPtr, "Upgrade: websocket"); - if (HostPtr) - { - uint32_t Host; - char Hostname[32]= ""; - struct LOCALNET * LocalNet = conn->TNC->TCPInfo->LocalNets; - - HostPtr += 6; - memcpy(Hostname, HostPtr, 31); - strlop(Hostname, ':'); - Host = inet_addr(Hostname); - - if (strcmp(Hostname, "127.0.0.1") == 0) - LOCAL = TRUE; - else - { - if (conn->sin.sin_family != AF_INET6) - { - while(LocalNet) - { - uint32_t MaskedHost = conn->sin.sin_addr.s_addr & LocalNet->Mask; - if (MaskedHost == LocalNet->Network) - { - LOCAL = 1; - break; - } - LocalNet = LocalNet->Next; - } - } - } - } - encPtr = stristr(MsgPtr, "Accept-Encoding:"); if (encPtr && stristr(encPtr, "deflate")) @@ -1900,16 +1866,22 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn) } } - // APRS process internally - + if (_memicmp(Context, "/APRS/", 6) == 0 || _stricmp(Context, "/APRS") == 0) { - APRSProcessHTTPMessage(sock, MsgPtr, LOCAL, COOKIE); + if (APRSActive) + { + APRSProcessHTTPMessage(sock, MsgPtr, LOCAL, COOKIE); + return 0; + } + Len = sprintf(Header, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n"); + send(sock, Header, Len, 0); return 0; } + if (_stricmp(Context, "/Node/Signon?Node") == 0) { char * IContext; @@ -2019,40 +1991,7 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn) char * input; char * IContext; - - HostPtr = strstr(MsgPtr, "Host: "); - - if (HostPtr) - { - uint32_t Host; - char Hostname[32]= ""; - struct LOCALNET * LocalNet = conn->TNC->TCPInfo->LocalNets; - - HostPtr += 6; - memcpy(Hostname, HostPtr, 31); - strlop(Hostname, ':'); - Host = inet_addr(Hostname); - - if (strcmp(Hostname, "127.0.0.1") == 0) - LOCAL = TRUE; - else while(LocalNet) - { - uint32_t MaskedHost = Host & LocalNet->Mask; - if (MaskedHost == LocalNet->Network) - { - char * rest; - LOCAL = 1; - rest = strchr(HostPtr, 13); - if (rest) - { - memmove(HostPtr + 9, rest, strlen(rest) + 1); - memcpy(HostPtr, "127.0.0.1", 9); - break; - } - } - LocalNet = LocalNet->Next; - } - } + // LOCAL is already set NodeURL = strtok_s(Context, "?", &IContext); Key = strtok_s(NULL, "?", &IContext); @@ -2310,7 +2249,7 @@ doHeader: if (allowDeflate) Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen); else - Compressed = Reply; + Compressed = _REPLYBUFFER; HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n%s\r\n", ReplyLen, Encoding); sendandcheck(sock, Header, HeaderLen); @@ -2500,6 +2439,9 @@ doHeader: if (input == 0) return 1; + if (LOCAL == FALSE && COOKIE == FALSE) + return 1; + input += 4; if (port > 0 && port <= MaxBPQPortNo) @@ -2701,7 +2643,20 @@ doHeader: { // Save Config File - SaveConfigFile(sock, MsgPtr, Key, LOCAL); + if (conn->LOCALAuth) + SaveConfigFile(sock, MsgPtr, Key, LOCAL); + else + { + char _REPLYBUFFER[4096]; + ReplyLen = SetupNodeMenu(_REPLYBUFFER, LOCAL); + ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "
Not authorizedxx - please sign in"); + HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", ReplyLen + (int)strlen(Tail)); + send(sock, Header, HeaderLen, 0); + send(sock, _REPLYBUFFER, ReplyLen, 0); + send(sock, Tail, (int)strlen(Tail), 0); + return 1; + } + return 0; } @@ -2965,6 +2920,12 @@ doHeader: { struct TNCINFO * TNC = TNCInfo[port]; + if (TNC == 0) + return 1; + + if (LOCAL == FALSE && COOKIE == FALSE) + return 1; + KillTNC(TNC); TNC->DontRestart = FALSE; RestartTNC(TNC); diff --git a/L2Code.c b/L2Code.c index 1d63949..c2953f4 100644 --- a/L2Code.c +++ b/L2Code.c @@ -4726,10 +4726,16 @@ int seeifInterlockneeded(struct PORTCONTROL * PORT) int i; int Interlock = PORT->PORTINTERLOCK; struct TNCINFO * TNC; + char Cmd[64]; if (Interlock == 0) return 0; // No locking + // I think we need to stop scanning here + + sprintf(Cmd, "%d SCANSTOP", PORT->PORTNUMBER); + Rig_Command( (TRANSPORTENTRY *) -1, Cmd); + for (i = 1; i <= MAXBPQPORTS; i++) { TNC = TNCInfo[i]; @@ -4753,6 +4759,7 @@ int seeifUnlockneeded(struct _LINKTABLE * LINK) int Interlock; struct TNCINFO * TNC; struct PORTCONTROL * PORT = LINK->LINKPORT; + char Cmd[64]; if (PORT == NULL) return 0; @@ -4795,6 +4802,14 @@ int seeifUnlockneeded(struct _LINKTABLE * LINK) TNC->ReleasePortProc(TNC); } + if (Interlock == 0) + return 0; // No locking + + // I think we need to start scanning here + + sprintf(Cmd, "%d SCANSTART 15", LINK->LINKPORT->PORTNUMBER); + Rig_Command((TRANSPORTENTRY *)-1, Cmd); + return 0; } diff --git a/L4Code.c b/L4Code.c index 9a37668..e146218 100644 --- a/L4Code.c +++ b/L4Code.c @@ -12,7 +12,7 @@ LinBPQ/BPQ32 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - +13 You should have received a copy of the GNU General Public License along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses */ diff --git a/LinBPQ.c b/LinBPQ.c index 08dae7c..df0e334 100644 --- a/LinBPQ.c +++ b/LinBPQ.c @@ -864,6 +864,8 @@ int main(int argc, char * argv[]) printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring); printf("%s\n", VerCopyright); + printf("%d", sizeof(struct DEST_LIST)); + srand(time(NULL)); // look for optarg format parameters diff --git a/NodeMapTest.c b/NodeMapTest.c index bc71c77..7b0b735 100644 --- a/NodeMapTest.c +++ b/NodeMapTest.c @@ -1,4 +1,9 @@ +// Apr 26 + +// Fix for 64 ports + + #define _CRT_SECURE_NO_DEPRECATE #include @@ -113,7 +118,7 @@ struct ModeItem struct ModeEntries { - struct ModeItem * Mode[32]; // One per port + struct ModeItem * Mode[64]; // One per port }; struct FreqItem @@ -125,7 +130,7 @@ struct FreqItem struct FreqEntries { - struct FreqItem * Freq[32]; // One per interlock group + struct FreqItem * Freq[64]; // One per interlock group }; struct ChatNodeData ** ChatNodes = NULL; @@ -620,6 +625,10 @@ int main(int argc, char * argv[]) pFlags = strlop(pFreq, ','); pHeardTime = strlop(pFlags, ','); + + if (pHeardTime == 0) + break; + if (pFlags && strlen(pFlags) > 14) break; @@ -749,7 +758,7 @@ int main(int argc, char * argv[]) { int Port = atoi(pPort); - if (Port < 32) + if (Port < 64) { Modes = Node->Modes; @@ -986,7 +995,7 @@ int main(int argc, char * argv[]) { int ret = 0; - if (time(NULL) > restartTime) + if (restartTime && time(NULL) > restartTime) return 0; FD_ZERO(&readfd); @@ -1033,7 +1042,7 @@ int main(int argc, char * argv[]) if (nLength == 0) continue; - // ret = sendto(sock, RXBUFFER, nLength, 0, (struct sockaddr *)&txaddr2, sizeof(txaddr)); + ret = sendto(sock, RXBUFFER, nLength, 0, (struct sockaddr *)&txaddr, sizeof(txaddr)); if (ret == -1) perror("sendto 1"); @@ -1048,15 +1057,15 @@ int main(int argc, char * argv[]) *ptr = '/'; } - if (memcmp(&RXBUFFER[16], "LINK ", 5) != 0) - { - if (HostEnt1) - { - ret = sendto(sock, RXBUFFER, nLength, 0, (struct sockaddr *)&txaddr, sizeof(txaddr)); - if (ret == -1) - perror("sendto 1"); - } - } +// if (memcmp(&RXBUFFER[16], "LINK ", 5) != 0) +// { +// if (HostEnt1) +// { +// ret = sendto(sock, RXBUFFER, nLength, 0, (struct sockaddr *)&txaddr, sizeof(txaddr)); +// if (ret == -1) +// perror("sendto 1"); +// } +// } #ifdef WIN32 Sleep(10); @@ -1252,10 +1261,10 @@ void ProcessNodeUpdate(char * From, char * Msg) if (Port == 0) return; - if (pFreq) - printf("%s %d %s %d %s\n", From, Port, ModeNames[Type], Interlock, pFreq); - else - printf("%s %d %s %d\n", From, Port, ModeNames[Type], Interlock); +// if (pFreq) +// printf("%s %d %s %d %s\n", From, Port, ModeNames[Type], Interlock, pFreq); +// else +// printf("%s %d %s %d\n", From, Port, ModeNames[Type], Interlock); Port--; // Index from zero @@ -1295,7 +1304,7 @@ void ProcessNodeUpdate(char * From, char * Msg) int lineLen = 0; char freqString[256]; - printf("%s %s\r\n", From, Msg); +// printf("%s %s\r\n", From, Msg); if (strcmp("GM8BPQ-2", From) == 0) n = 0; @@ -1343,7 +1352,7 @@ void ProcessNodeUpdate(char * From, char * Msg) // Do we have a record for this group? - for (n = 0; n < 32; n++) + for (n = 0; n < 64; n++) { FreqItem = Node->Freqs->Freq[n]; @@ -1771,7 +1780,7 @@ void GenerateOutputFiles(time_t Now) { struct ModeEntries * Modes = Node->Modes; - for (j = 0; j < 32; j++) + for (j = 0; j < 64; j++) { if (Modes->Mode[j]) { @@ -1803,7 +1812,7 @@ void GenerateOutputFiles(time_t Now) FreqsString[0] = 0; FreqsLen = 0; - for (j = 0; j < 32; j++) + for (j = 0; j < 64; j++) { if (Node->Freqs) { @@ -2094,7 +2103,7 @@ void GenerateOutputFiles(time_t Now) // Do Modes - for (j = 0; j < 32; j++) + for (j = 0; j < 64; j++) { if (Node->Modes) { @@ -2123,7 +2132,7 @@ void GenerateOutputFiles(time_t Now) { struct FreqEntries * Freqs = Node->Freqs; - for (j = 0; j < 32; j++) + for (j = 0; j < 64; j++) { struct FreqItem * Freq = Freqs->Freq[j]; diff --git a/RigControl.c b/RigControl.c index fe90705..773547d 100644 --- a/RigControl.c +++ b/RigControl.c @@ -5624,6 +5624,7 @@ struct RIGINFO * RigConfig(struct TNCINFO * TNC, char * buf, int Port) RIG = &PORT->Rigs[0]; RIG->RIGOK = TRUE; RIG->PORT = PORT; + RIG->RIG_DEBUG = RIG_DEBUG; strcpy(PORT->IOBASE, ptr); strcpy(RIG->RigName, "FLRIG"); @@ -5657,6 +5658,7 @@ struct RIGINFO * RigConfig(struct TNCINFO * TNC, char * buf, int Port) RIG = &PORT->Rigs[0]; RIG->RIGOK = TRUE; RIG->PORT = PORT; + RIG->RIG_DEBUG = RIG_DEBUG; strcpy(PORT->IOBASE, ptr); strcpy(RIG->RigName, "HAMLIB"); @@ -5690,6 +5692,7 @@ struct RIGINFO * RigConfig(struct TNCINFO * TNC, char * buf, int Port) RIG = &PORT->Rigs[0]; RIG->RIGOK = TRUE; RIG->PORT = PORT; + RIG->RIG_DEBUG = RIG_DEBUG; strcpy(PORT->IOBASE, ptr); strcpy(RIG->RigName, "RTLUDP"); @@ -5765,7 +5768,7 @@ AngelRigFound: RIG = &PORT->Rigs[PORT->ConfiguredRigs++]; RIG->RIGOK = TRUE; RIG->PORT = PORT; - RIG->RigAddr = device; + RIG->RIG_DEBUG = RIG_DEBUG; RIG->Channel = channel; strcpy(RIG->RigName, Name); diff --git a/TelnetV6.c b/TelnetV6.c index d31093a..abe5878 100644 --- a/TelnetV6.c +++ b/TelnetV6.c @@ -3285,6 +3285,7 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port) struct TCPINFO * TCP = TNC->TCPInfo; HMENU hDisMenu = TCP->hDisMenu; u_long param=1; + int LOCAL = 0; // if for TriModeData Session, use the TriMode Control connection entry @@ -3356,12 +3357,37 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port) WriteLog (logmsg); } - - + // Debugprintf("BPQ32 Telnet accept() Sock %d", sock); ioctl(sock, FIONBIO, ¶m); + // See if localhost or a secure subnet + + if (sockptr->sin.sin_family != AF_INET6) + { + if (sockptr->sin.sin_addr.s_addr == htonl(INADDR_LOOPBACK)) // 127.0.0.1? + LOCAL = TRUE; + else + { + char Hostname[32]= ""; + struct LOCALNET * LocalNet = TNC->TCPInfo->LocalNets; + + while(LocalNet) + { + uint32_t MaskedHost = sockptr->sin.sin_addr.s_addr & LocalNet->Mask; + if (MaskedHost == LocalNet->Network) + { + LOCAL = TRUE; + break; + } + LocalNet = LocalNet->Next; + } + } + } + + sockptr->LOCALAuth = LOCAL; + sockptr->socket = sock; sockptr->SocketActive = TRUE; sockptr->InputLen = 0; @@ -3993,7 +4019,7 @@ MsgLoop: if (USER == NULL) continue; - if (_stricmp(USER->UserName, "ANON") == 0) + if (_stricmp(USER->UserName, "ANON") == 0 && strlen(MsgPtr) < 10) { // Anon Login - Callsign is supplied as user @@ -5155,6 +5181,18 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S Mask = MsgPtr[1] >> 7; Len = MsgPtr[1] & 127; + // We don't support 64 bit payload length, so if Len = 127 disconnect session + + if (Len == 127) + { + Debugprintf("WebSock 64 bit length not supported"); + closesocket(sockptr->socket); + sockptr->SocketActive = FALSE; + ShowConnections(TNC); + sockptr->InputLen = 0; + return 0; + } + if (Len == 126) // Two Byte Len { Len = (MsgPtr[2] << 8) + MsgPtr[3]; @@ -5187,10 +5225,13 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S { // PTT Message - char RigCMD[64]; + if (strlen(Payload) < 6 && sockptr->WebSecure) // check for user generated input + { + char RigCMD[64]; - sprintf(RigCMD, "%s PTT", Payload); - Rig_Command( (TRANSPORTENTRY *) -1, RigCMD); + sprintf(RigCMD, "%s PTT", Payload); + Rig_Command( (TRANSPORTENTRY *) -1, RigCMD); + } } else if (memcmp(sockptr->WebURL, "WMRefresh", 9) == 0) { @@ -5262,8 +5303,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S if(strstr(MsgPtr, "Upgrade: websocket")) { - int LOCAL = 0, COOKIE = 0; - char * HostPtr; + int LOCAL = sockptr->LOCALAuth, COOKIE = 0; char * ptr; sockptr->WebSocks = 1; @@ -5274,44 +5314,12 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S if (RigWebPage) RigWebPage[0] = 0; - HostPtr = strstr(MsgPtr, "Host: "); - - if (HostPtr) - { - uint32_t Host; - char Hostname[32]= ""; - struct LOCALNET * LocalNet = sockptr->TNC->TCPInfo->LocalNets; - - HostPtr += 6; - memcpy(Hostname, HostPtr, 31); - strlop(Hostname, ':'); - Host = inet_addr(Hostname); - - if (strcmp(Hostname, "127.0.0.1") == 0) - LOCAL = TRUE; - else - { - if (sockptr->sin.sin_family != AF_INET6) - { - while(LocalNet) - { - uint32_t MaskedHost = sockptr->sin.sin_addr.s_addr & LocalNet->Mask; - if (MaskedHost == LocalNet->Network) - { - LOCAL = 1; - break; - } - LocalNet = LocalNet->Next; - } - } + ptr = strstr(MsgPtr, "BPQSessionCookie=N"); - ptr = strstr(MsgPtr, "BPQSessionCookie=N"); + if (ptr) + COOKIE = TRUE; - if (ptr) - COOKIE = TRUE; - } - sockptr->WebSecure = LOCAL | COOKIE; - } + sockptr->WebSecure = LOCAL | COOKIE; } diff --git a/UZ7HODrv.c b/UZ7HODrv.c index 2adfe12..42e1fc3 100644 --- a/UZ7HODrv.c +++ b/UZ7HODrv.c @@ -92,7 +92,7 @@ static char WindowTitle[] = "UZ7HO"; static int RigControlRow = 165; char FX25Modes[8][8] = {"None", "RxOnly", "RX+TX"}; -char IL2PModes[8][10] = {"None", "RxOnly", "RX+TX", "il2pOnly"}; +char IL2PModes[8][10] = {"None", "RxOnly", "RX+TX", "Only"}; //LOGFONT LFTTYFONT ; diff --git a/Versions.h b/Versions.h index 87490b1..ec3c8f0 100644 --- a/Versions.h +++ b/Versions.h @@ -10,15 +10,15 @@ #endif -#define KVers 6,0,25,23 -#define KVerstring "6.0.25.23\0" +#define KVers 6,0,25,28 +#define KVerstring "6.0.25.28\0" #ifdef CKernel #define Vers KVers #define Verstring KVerstring -#define Datestring "February 2026" +#define Datestring "April 2026" #define VerComments "G8BPQ Packet Switch (C Version)" KVerstring #define VerCopyright "Copyright © 2001-2026 John Wiseman G8BPQ\0" #define VerDesc "BPQ32 Switch\0" diff --git a/WebMail.c b/WebMail.c index a97b9bf..f7ba786 100644 --- a/WebMail.c +++ b/WebMail.c @@ -27,6 +27,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses #ifdef WIN32 //#include "C:\Program Files (x86)\GnuWin32\include\iconv.h" + #define realpath(N,R) _fullpath((R),(N),_MAX_PATH) #else #include #include @@ -1467,6 +1468,15 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL char Type[64] = "Content-Type: text/html\r\n"; UndoTransparency(FN); + + // protect against malicious access + + if (strstr(FN, "..")) + { + *RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n"); + return; + } + ext = strchr(FN, '.'); sprintf(MsgFile, "%s/%s", BPQDirectory, FN); @@ -1480,6 +1490,14 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL return; } + FileSize = STAT.st_size; + + if (FileSize > 200000) + { + *RLen = sprintf(Reply, "HTTP/1.1 400 File too long\r\nContent-Length: 15\r\n\r\nFile too long\r\n"); + return; + } + hFile = fopen(MsgFile, "rb"); if (hFile == 0) @@ -1488,7 +1506,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL return; } - FileSize = STAT.st_size; + MsgBytes = malloc(FileSize + 1); ReadLen = fread(MsgBytes, 1, FileSize, hFile); @@ -1543,8 +1561,24 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL char * ext; char Type[64] = "Content-Type: text/html\r\n"; - UndoTransparency(FN); + + // protect against malicious access + + if (strstr(FN, "..")) + { + *RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n"); + return; + } + + // I'm pretty sure this should only be used for form sets, so name should start Standard or Local + + if (_memicmp(FN, "Local", 5) != 0 && (_memicmp(FN, "Standard", 9) != 0)) + { + *RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n"); + return; + } + ext = strchr(FN, '.'); sprintf(MsgFile, "%s/%s", BPQDirectory, FN); @@ -1558,6 +1592,14 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL return; } + FileSize = STAT.st_size; + + if (FileSize > 200000) + { + *RLen = sprintf(Reply, "HTTP/1.1 400 File too big\r\nContent-Length: 15\r\n\r\nFile too long\r\n"); + return; + } + hFile = fopen(MsgFile, "rb"); if (hFile == 0) @@ -1566,7 +1608,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL return; } - FileSize = STAT.st_size; MsgBytes = malloc(FileSize + 1); ReadLen = fread(MsgBytes, 1, FileSize, hFile); @@ -3534,8 +3575,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch sprintf(FormDir, "WMFile/%s/%s/", Dir->FormSet, Dir->DirName); - - if (Form == NULL) { // Not found - just display as normal message diff --git a/asmstrucs.h b/asmstrucs.h index 0fd608a..5465101 100644 --- a/asmstrucs.h +++ b/asmstrucs.h @@ -640,10 +640,10 @@ typedef struct PORTCONTROL UCHAR AVSENDING; // LAST MINUTE UCHAR AVACTIVE; - char PktFlags[64]; // Decode stts rom QtSM + char PktFlags[64]; // Decode stats from QtSM char PORTTYPE; // H/W TYPE - // 0 = ASYNC, 2 = PC120, 4 = DRSI + // 0 = ASYNC, 2 = LORA, 4 = DRSI // 6 = TOSH, 8 = QUAD, 10 = RLC100 // 12 = RLC400 14 = INTERNAL 16 = EXTERNAL @@ -740,12 +740,24 @@ typedef struct PORTCONTROL int QtSMPort; BOOL QtSMConnected; + int QtSMFreq; // From KISS reporting of QtSM info + char QtSMModem[21]; + unsigned char Version[4]; + unsigned char fx25Flags; + unsigned char il2pFlags; + unsigned char il2pcrc; + int StatsPointer; UCHAR * TX; // % Sending UCHAR * BUSY; // % Active (Normally DCD active or TX) int Hardware; // TNC H_TYPE. Copied here for access from application context int isRF; // For API reporting. -1 is unspecified + + int FREQ; // Lora config + int BW; + int SF; + int CR; int SENDRIFTIMER; time_t LastRIFTime; diff --git a/bpqaxip.c b/bpqaxip.c index 71f0ce1..5553b8c 100644 --- a/bpqaxip.c +++ b/bpqaxip.c @@ -626,7 +626,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff) // if digis are present, scan down list for first non-used call - if (buff->ORIGIN[6] == 0) + if ((buff->ORIGIN[6] & 0x01) == 0) { // end of addr bit not set, so scan digis diff --git a/cMain.c b/cMain.c index f355e48..56116a1 100644 --- a/cMain.c +++ b/cMain.c @@ -301,9 +301,11 @@ char BridgeMap[MaxBPQPortNo + 1][MaxBPQPortNo + 1] = {0}; // Keep Buffers at end -#define DATABYTES 600000 // WAS 320000 +#define DATABYTES 800000 // WAS 320000 -UCHAR DATAAREA[DATABYTES] = ""; +UCHAR XXXXXXXX[DATABYTES] = ""; + +UCHAR * DATAAREA = &XXXXXXXX[0]; void ** Bufferlist[1000] = {0}; @@ -1032,6 +1034,10 @@ BOOL Start() PORT->ALLOWINP3 = PortRec->AllowINP3; PORT->ENABLEINP3 = PortRec->EnableINP3; PORT->isRF = PortRec->isRF; + PORT->FREQ = PortRec->FREQ; + PORT->BW = PortRec->BW; + PORT->SF = PortRec->SF; + PORT->CR = PortRec->CR; PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME; @@ -2996,6 +3002,10 @@ VOID FindLostBuffers() break; } } + + if (Buff == *Buff) + break; + Buff = *Buff; } n = NUMBEROFBUFFERS; diff --git a/config.c b/config.c index 16dd091..57fe125 100644 --- a/config.c +++ b/config.c @@ -256,6 +256,7 @@ int do_kiss(char *value,char *rec); int decode_ded_rec(char *rec); int simple(int i); int64_t int64_value(int64_t * val, char value[], char rec[]); +int32_t int32_value(int32_t * val, char value[], char rec[]); int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF); @@ -384,7 +385,7 @@ static char *pkeywords[] = "UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE", "IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE", "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", -"ALLOWINP3", "ENABLEINP3", "isRF"}; /* parameter keywords */ +"ALLOWINP3", "ENABLEINP3", "isRF", "FREQ", "BW", "SF", "CR"}; /* parameter keywords */ static void * poffset[] = { @@ -399,7 +400,7 @@ static void * poffset[] = &xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize, &xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide, &xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, -&xxp.AllowINP3, &xxp.EnableINP3, &xxp.isRF}; /* offset for corresponding data in config file */ +&xxp.AllowINP3, &xxp.EnableINP3, &xxp.isRF, &xxp.FREQ, &xxp.BW, &xxp.SF, &xxp.CR}; /* offset for corresponding data in config file */ static int proutine[] = { @@ -414,7 +415,7 @@ static int proutine[] = 1, 17, 1, 1, 1, 1, 2, 2, 2, 1, 1, 19, 2, 1, 20, 1, 21, 22, 1, -1, 1, 1}; /* routine to process parameter */ +1, 1, 1, 23, 23, 23, 23}; /* routine to process parameter */ int PPARAMLIM = sizeof(proutine)/sizeof(int); @@ -433,7 +434,7 @@ static int routeindex = 0; /* Global variables */ /************************************************************************/ -int paramok[100] = {0}; /* PARAMETER OK FLAG */ +int paramok[120] = {0}; /* PARAMETER OK FLAG */ FILE *fp1; /* TEXT INPUT FILE */ @@ -642,6 +643,10 @@ BOOL ProcessConfig() paramok[96]=1; // EnableOARCAPI paramok[97]=1; // MONTOFILE paramok[98]=1; // RIFInterval + paramok[99]=1; // Freq + paramok[100]=1; // BW + paramok[101]=1; // SF + paramok[102]=1; // CR for (i=0; i < PARAMLIM; i++) @@ -1394,6 +1399,23 @@ int int_value(short * val, char value[], char rec[]) return(1); } +int int32_value(int32_t * val, char value[], char rec[]) +{ + int j,k; + + k = sscanf(value," %d",&j); + + if (k != 1) + { + Consoleprintf("Invalid numerical value "); + Consoleprintf("%s\r\n",rec); + return(0); + } + + val[0] = j; + return(1); +} + int64_t int64_value(int64_t * val, char value[], char rec[]) { *val = strtoll(value, NULL, 10); @@ -2424,7 +2446,7 @@ int decode_port_rec(char * rec) break; case 20: - cn = doKissCommand(i, value, rec); // Permitted Apps + cn = doKissCommand(i, value, rec); break; case 21: @@ -2436,6 +2458,10 @@ int decode_port_rec(char * rec) cn = 1; break; + case 23: + cn = int32_value(poffset[i], value, rec); /* INTEGER VALUES */ + break; + case 9: cn = 1; diff --git a/configstructs.h b/configstructs.h index de974ff..6c09c26 100644 --- a/configstructs.h +++ b/configstructs.h @@ -84,6 +84,11 @@ struct PORTCONFIG int AllowINP3; int EnableINP3; short isRF; + int FREQ; + int BW; + int SF; + int CR; + }; struct ROUTECONFIG diff --git a/kiss.c b/kiss.c index c456088..468d32c 100644 --- a/kiss.c +++ b/kiss.c @@ -88,6 +88,8 @@ int i2cPoll(struct PORTCONTROL * PORT, NPASYINFO npKISSINFO); #define TFEND 0xDC #define TFESC 0xDD #define QTSMKISSCMD 7 +#define MODEMREPORT 1 // QTSM Modem Info subcommand +#define SETPARAMS 2 // QtSM Moden change settings #define STX 2 // NETROM CONTROL CODES #define ETX 3 @@ -118,11 +120,15 @@ VOID CloseKISSPort(struct PORTCONTROL * PortVector); int ReadCOMBlockEx(HANDLE fd, char * Block, int MaxLength, BOOL * Error); void processDRATSFrame(unsigned char * Message, int Len, void * sockptr); VOID ConnecttoQtSM(struct PORTCONTROL * PORT); +int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len); extern struct PORTCONTROL * PORTTABLE; extern int NUMBEROFPORTS; extern void * TRACE_Q; +extern char FX25Modes[8][8]; +extern char IL2PModes[8][10]; + #define TICKS 10 // Ticks per sec // temp for testing @@ -500,6 +506,18 @@ HANDLE OpenConnection(struct PORTCONTROL * PortVector) if (KISS && KISS->KISSCMD && KISS->KISSCMDLEN) ASYSEND(PortVector, KISS->KISSCMD, KISS->KISSCMDLEN); + if (PortVector->FREQ) // Lora params + { + UCHAR KissString[128]; + UCHAR ENCBUFF[256]; + int KissLen = 0; + unsigned char * Kissptr = KissString; + + KissLen = sprintf(KissString, "%cLORA=%d, %d, %d, %d", 6, PortVector->FREQ, PortVector->BW, PortVector->SF, PortVector->CR); + KissLen = KissEncode(KissString, ENCBUFF, KissLen); + + ASYSEND(PortVector, ENCBUFF, KissLen); + } return ComDev; } @@ -1560,15 +1578,60 @@ SeeifMore: // ok, KISS now points to our port - // Debugprintf("%d %x %s", PORT->PORTNUMBER, Port->RXMSG[0], Msg); - - if (memcmp(Msg, "STATS ", 6) == 0) + if (Msg[0] == MODEMREPORT) + { + int Freq = Msg[1] | (Msg[2] <<8); + KISS->PORT.QtSMFreq = Freq; + strcpy(KISS->PORT.QtSMModem, &Msg[3]); + + if (len >= 32) + { + PORT->fx25Flags = Msg[29]; + PORT->il2pFlags = Msg[30]; + PORT->il2pcrc = Msg[31]; + } + + // If a response to a qtsm command display it + + if (PORT->Session && (time(NULL) - PORT->LastKISSCmdTime < 10)) + { + PDATAMESSAGE Buffer; + BPQVECSTRUC * VEC; + unsigned char * Msg = &Port->RXMSG[1]; + len--; + + Msg[len] = 0; + + Buffer = GetBuff(); + if (Buffer) + { + Buffer->PID = 0xf0; + Buffer->LENGTH = MSGHDDRLEN + 1; // Includes PID + + + Buffer->LENGTH += sprintf(Buffer->L2DATA, "Modem %s Centre frequency %d fx25 %s il2p %s %s\r", + (PORT->QtSMModem[0]) ? PORT->QtSMModem : "Not Available", PORT->QtSMFreq, + FX25Modes[PORT->fx25Flags], IL2PModes[PORT->il2pFlags], PORT->il2pcrc?"CRC":""); + + + VEC = PORT->Session->L4TARGET.HOST; + C_Q_ADD(&PORT->Session->L4TX_Q, (UINT *)Buffer); +#ifdef BPQ32 + if (VEC) + PostMessage(VEC->HOSTHANDLE, BPQMsg, VEC->HOSTSTREAM, 2); +#endif + } + PORT->Session = 0; + } + } + + else if (memcmp(Msg, "STATS ", 6) == 0) { // Save busy int TX, DCD; char * Msg1 = strlop(&Msg[6], ' '); - + TX = atoi(&Msg[6]); if (Msg1) { @@ -1926,6 +1989,7 @@ VOID ConnecttoTCPThread(void * Param) SOCKADDR_IN sinx; int addrlen=sizeof(sinx); struct KISSINFO * KISS = (struct KISSINFO *) ASY->Portvector; + struct KISSINFO * NEXT; sinx.sin_family = AF_INET; sinx.sin_addr.s_addr = INADDR_ANY; @@ -1984,8 +2048,32 @@ VOID ConnecttoTCPThread(void * Param) ioctlsocket (sock, FIONBIO, ¶m); - if (KISS && KISS->KISSCMD && KISS->KISSCMDLEN) - send(sock, KISS->KISSCMD, KISS->KISSCMDLEN, 0); + // Send KISSCMD to all channels on this port + + NEXT = KISS; + + while (NEXT) + { + if (NEXT && NEXT->KISSCMD && NEXT->KISSCMDLEN) + { + NEXT->KISSCMD[1] |= NEXT->OURCTRL; + send(sock, NEXT->KISSCMD, NEXT->KISSCMDLEN, 0); + } + NEXT = NEXT->SUBCHAIN; + } + + if (KISS->PORT.FREQ) // Lora params + { + UCHAR KissString[128]; + UCHAR ENCBUFF[256]; + int KissLen = 0; + unsigned char * Kissptr = KissString; + + KissLen = sprintf(KissString, "%cLORA=%d, %d, %d, %d", 6, KISS->PORT.FREQ, KISS->PORT.BW, KISS->PORT.SF, KISS->PORT.CR); + KissLen = KissEncode(KissString, ENCBUFF, KissLen); + + send(sock, ENCBUFF, KissLen, 0); + } // Try to open Mgmt Port diff --git a/mailapi.c b/mailapi.c index 1b44d47..d8e6ed2 100644 --- a/mailapi.c +++ b/mailapi.c @@ -16,6 +16,7 @@ struct MsgInfo * GetMsgFromNumber(int msgno); BOOL CheckUserMsg(struct MsgInfo * Msg, char * Call, BOOL SYSOP); char * doXMLTransparency(char * string); +extern BOOL M0LTEMap; // Constants #define TOKEN_SIZE 32 // Length of the authentication token @@ -856,6 +857,10 @@ void SendBBSDataToPktMapThread(void * Param); void SendBBSDataToPktMap() { +#ifdef LINBPQ + if (M0LTEMap == 0) + return; +#endif _beginthread(SendBBSDataToPktMapThread, 0, 0); } @@ -994,6 +999,10 @@ void SendBBSDataToPktMapThread(void * Param) // Have R Lines Rlineend = strstr(Rlineptr, "\r\n"); + + if (Rlineend == 0) + break; + Rlineend[0] = 0; ptr2 += sprintf(ptr2, "\"%s\",", Rlineptr); diff --git a/nodelog.txt b/nodelog.txt new file mode 100644 index 0000000..e69de29 diff --git a/telnetserver.h b/telnetserver.h index 63dcef3..a93625c 100644 --- a/telnetserver.h +++ b/telnetserver.h @@ -42,7 +42,7 @@ struct ConnectionInfo BOOL TriMode; // Trimode emulation BOOL TriModeConnected; // Set when remote session is connected - now send data to DataSock SOCKET TriModeDataSock; // Data Socket - BOOL Auth; // Set if User is flagged as a Secure User + BOOL LOCALAuth; // Set if connection from localhost or a secure subnet BOOL BPQTermMode; // Set if connected to BPQTermTCP BOOL ClientSession; // Set if acting as a client (ie Linux HOST Mode) BOOL MonitorNODES; // Monitor Control Flags