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
literal 0
HcmV?d00001
diff --git a/source/image.png.MEM b/source/image.png.MEM
new file mode 100644
index 0000000..469105a
--- /dev/null
+++ b/source/image.png.MEM
@@ -0,0 +1,668 @@
+'SCREEN _NEWIMAGE(720, 460, 32)
+'_PUTIMAGE (0, 0), __imageMEM&("tick_warning.png")
+
+FUNCTION __imageMEM& (caseImage$)
+ DIM v&
+ DIM A$
+ DIM btemp$
+ DIM i&
+ DIM B$
+ DIM C%
+ DIM F$
+ DIM C$
+ DIM j
+ DIM t%
+ DIM B&
+ DIM X$
+ DIM m AS _MEM
+ SELECT CASE caseImage$
+ CASE "tick.png"
+ v& = _NEWIMAGE(64, 64, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIcK]7RFE45gEgMeMMGM]G#YAU59DDI2mdLR0OTiJf3B8T#1CYb2\Wm\cmi:P>kAW4X;Z[am[8BKdXK468QY#hI9\12kP`"
+ A$ = A$ + "?#hG8LH2o8QMChm8\D2CS``9LRATMaHOM9POFUg>inRoF3Q:5]Y[NDQ#>eTQ"
+ A$ = A$ + "oOV46;QGdkKoGARSBh=9<92W_B75SmQkG]:6E;QN8nO8fdCOkT]Y>U\K`7gT"
+ A$ = A$ + "fdH8\ifPo63kd7;ZGYgD\_jm]A>>XJooW7?`nN=1R?bneCAO`eG7Q]F6mK=f"
+ A$ = A$ + ";QaAXGNK#bE\m9mm^[lm:mG;7KT5_G_Bf=8^N84njfAoFS3AHl:oZGAhmZmn"
+ A$ = A$ + "#8OgRg[D4;PbRge?G`SG\hm:5aV1AhK>6`Weh?9L[2K^79"
+ A$ = A$ + "`kEjKW5_SHEGmoND5Y]M42KS`j8=_;_oSF4fbJ9gVYT3"
+ A$ = A$ + "Mo[4JR#o=l]jM]L<7\AiJ:Jd72?1Q_;7f1be2[7F]cNn`\NN_Fo_O\LXC`EW"
+ A$ = A$ + "PBfjHO3^FolF?5G7JM8ILJfi`NN7AO[`kSeZnOQVWWS?GKRj1lb=5`FUL:[O"
+ A$ = A$ + ";N?UeQ0^H2OBRffdmmYK^F_F#EZh1_F0[SDiLmh9N^FihiRQg3UoQ\?c8AKl"
+ A$ = A$ + "n2HOeY\?FfL>T7:1inl:iF>im#ie1lP963J83McbFVgdCUPl^KAoiHFiTg3U"
+ A$ = A$ + "G7gWQWPmna2oGJOEZR[3<1I]T>HNGWG7`3TPM?3EOdnN:SkGaa0l^>_^^kom"
+ A$ = A$ + "m4afo7E<\BG;GKJ4AjoQ5]Wmm>BNWc[C63gM4OH>2KB?6N?Ajke[JO7=_[c]"
+ A$ = A$ + "00iJ6;OaN;J?cSgLTn\BUN>FPgea7N]lK;R_\05OPo^]8mA>NYmVgkN0M[cW"
+ A$ = A$ + "GV73`OHh;oTZ]m>7LOk=_[O6EbIQN^PiY97aW^DAOR=fo\jPhM^ocT`69\62"
+ A$ = A$ + "3fPgIkS_nk=lYWFd^UKd^=jKCEM#lNXW;_S0];DNMcb`_fW_=hm2nMSfeX_M"
+ A$ = A$ + "JIG^hmNhJnIkgf`^>^0l^nmW_#Sn3PLm6Ram?Z[imH]mRgiac?C4KO`IXKfn"
+ A$ = A$ + "hhbAShk03#H?FS;G]Q<`I[lL6gOm2idN]nNS9h"
+ A$ = A$ + "kkC8;[aU0ca#>O8Qgehn?Lk4_cnnITP_3LA2iIIOaRWkbEHfhBlkce#FhLTf_am7UG6Fl^N?I2QDbWo;B`gWG0I7KL9NO"
+ A$ = A$ + "Po=3iM0GQcP>VoKaklhknAh99\M2KR`=:jG\liG#2nNC:K9UiS0#^]I]60On"
+ A$ = A$ + "kIYcQI4Gk\#GWB6mOI1h;=_Wbn;_mRPgiH`akbN?=hJ?8;m>23N7GcW?PenU"
+ A$ = A$ + "=E3NoZC`gakZdgLbk\mQOSlTbjmQ?8Q_b#gSeelhG[iiob8n`2m]CNFCGF2n"
+ A$ = A$ + ">`YE4l^dnjWQ\ak7HE_2ceebaBQFO7H39h7gUXmHM1[g?Ua4:BNGf6[m65ci"
+ A$ = A$ + "^_6kET8GbaP?=WnNa`k`N2K]_YOT#>ab[;Uia`n?^U4Jg[D"
+ A$ = A$ + "2hMNmVGf#?8oF[cd6[?`?cJUG7SlL>YIQEG2hmJM=G;H7`#GhikCR`OIdV[A"
+ A$ = A$ + "I?IUG7OmRK3nnnL]MNGJOWN4ma[__>SflZ6lNXlj0VGAhkH=ZcX4`kBkK26j"
+ A$ = A$ + "3i4aS]]NOCTk8_G3iIOKFA>mo1E2iM6OVQnF^XMm?R]]HUL]bWGFKQ;:AOOB"
+ A$ = A$ + "UHN7HPeIiLDG[?oWK?RM"
+ A$ = A$ + ">KQ=Vbib8S1=UQo^HFkg7`;XjW\noP>b"
+ A$ = A$ + "J_2H0GOFQZo?PaWPimbei6al7nm#C`^G"
+ A$ = A$ + "T#>QZo?FG[91Iai5FG4N_LMNQBNgJ?nH\OGce2HFeo7[ojB#N0CgeBnZmTgU"
+ A$ = A$ + "encOWP]f?GcSkIi4ZnohaaCX\>?^B5_;7[Ubck0ln_8SYIEoOmBH?a"
+ A$ = A$ + "ZW66XF4kSb_:7l^dfOm4]]V4bGF_Bjjo;D]#1Hm^ABlK^2W;[NNUBInl0hK="
+ A$ = A$ + "I79JCkDI7Qd=kkbe_TWQ8`BBDO0H?eVB0k>?lNXJCJL^d[iENnUei4[[3"
+ A$ = A$ + "<^^YU]Kmi#g0H?AaI_M9^hi142`V>7GQaDO#>emFM]^NHbRgSI7bf?eLJ7K2\ol8WTccEH^LLVdhK0L_5Y^FJ0nEckPOijo;5oGf"
+ A$ = A$ + ">43\>CmD1fc9KRDf;hD`S;\cHeWXNNZD0?o4h]g_4IcU2P_79ig7INZ;"
+ A$ = A$ + "eDAXliak47kM6;W0_[2>cA>_3ilVYToQnKU=42mMC8WK4caVB]7GZ1ZO;in5"
+ A$ = A$ + "6Z61]hmZMQo6C2mlO:O[>hMJW_;NmgfF0FKmU8Li2mbOk[iQgkZ?NU2o[G3A"
+ A$ = A$ + "??:^F>G2bQh:M5NG[ME2lIlMRSidKdejj<#?^<;k;DNWiegigeD_6B=ZfXkg"
+ A$ = A$ + "Ei:lmWPJ8McnH2f[A^f3`N;Ri#`g#46kPc72kIh3i:l>VQVWVe]N_WRIOEYJ"
+ A$ = A$ + "CWnO[?8;%%%0"
+ btemp$ = ""
+ FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
+ IF INSTR(1, B$, "%") THEN
+ FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
+ IF F$ <> "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "cross.png"
+ v& = _NEWIMAGE(64, 64, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIcK]6ZEE45fSgcmmmjmL]nAj]P27b`Ng?::[oDXR_[XT2Q<8CR:X<=Z;n0;FU5cbRaKaP5b2Q6mC;Jd9[60ICfE"
+ A$ = A$ + "[2IC]9W`fKbSl6R5CaRWcIKoC6a1\he]hF]hl4SAJgB\=C"
+ A$ = A$ + "ah[^Mj0bE\n9i6=n1=lN1hgS`R_oXXM;1=oa=0jCNSohB]fN8N??h;8OdR>6"
+ A$ = A$ + "JgB\6;>9PSHM>W9^]WcIgX?Cbki1OcUHa?no0KFR3IaD1M^CSoiVUX1Q?Cbk"
+ A$ = A$ + "TOYIgoNRIDg>X5OU5[gR7fDL>\9j`X\HL>MoQ<5W_oC=IOMSK7h<=lOXiAKd"
+ A$ = A$ + "DJ>d7?3jbKKaT\H#YD?8d^YH>0?_57>3S;b_mG8KO[;jSgie5WA:6kmKA_FL"
+ A$ = A$ + ">1\=b7Sce#aGhJ:B#_K_H;fN:dSEhholVbG7D>flhg1lklVBiA]`DU"
+ A$ = A$ + "7o#l^VeQ8LnFlU:e]IkjC;2>^ICii;b_Gd5<6JiLD^mcaM5IcnSmX#^?S#^eCN?YljN0UnP292k^MCU[?6;^oU3`kn"
+ A$ = A$ + "l9E3_WgSLU[EeTc>Xom?[F"
+ A$ = A$ + "NWGWV>CQO2dQG1dMiLhmcig?D4kX7?fne4Y?[AdNikb;8Qn=;QMYQgIKOL98"
+ A$ = A$ + "c=ha_RifLCA\UW0h2^oOMTnP_;;WWO#AjkB4mE3_7c66F2f>So8#OgU`nk95"
+ A$ = A$ + "L__e?_`8mG67T;Sl>Ra0f^<_>j_gFTn?LX?GKTf>T4hMf7>H5j;QU:h\\`k<"
+ A$ = A$ + ">1CYH8IL9okM4Xo;3Jg;5XM_7`?nFOWGGNf:eKI^XYUg9d;hg25G>g0bhGLf"
+ A$ = A$ + "0icnm0]KL>I9U]_e?ej3#O?7kZUgOFCYh^#iMBhLS8[;eR;>`c9oBg`hQl^<"
+ A$ = A$ + "_>niJbMV`M0mG;__NX?bl?Tj7kG>H0iAleM6hiKFh?mak]IZE:Gi=7hiCcDJ]Zd^?>>g<]c7D;iML?9WN0iCgSd>3ll9jTA"
+ A$ = A$ + "e^om#caD?hMDoXLCok46Sn<5gCGbGNT0S5R5:lMImLUXoNLVT?C3^f3BB?6KE`kHNMSGYMS0c?8"
+ A$ = A$ + "[W[4m_7X9im3_KCaj^89MH:`hWENGKNMn`:nTNnN=UfSI]VgaegW^bn\H`NS5Gbk?"
+ A$ = A$ + "\_0bSb_UV?i_2dVaH:?NbGMQ`kQ=;kSSaCY\_hi8ag=#BaUWL4I=BGkNW0]i"
+ A$ = A$ + "E3`k=0SeEU1N?Wh_a>oN6?Z[m]jQgAmk638S3J:5KO;1J7Ucf0=UVoEjkik?"
+ A$ = A$ + ":fI>;imT^oPUYd78[=BOiM6jPhmaMZE1_kkLK8\d8bT[_TTf_AXkbQ>G[f5]?flfc"
+ A$ = A$ + "ce>l>KQNaeide5YOK"
+ A$ = A$ + "5j75c9_3JN^4jLE7TYBK?=kSC^7fA8loM0b=?H3874KN8nn_aLLR]7mk7j;6"
+ A$ = A$ + "gikn_aeVbJm1hc7WDn7GI4MW0GOFbk=RaDE8Si:\Aim`:_?^jEMQT7l5SDQN"
+ A$ = A$ + "_L#>bk;\=H\N;5bRc;TlQbjBANOLeSj21im#Wa7SMj67\^2`a_3Hlk#Ql8g\Yl_UVJ9_cP"
+ A$ = A$ + "nFCfTBMjK4jQ_aViMIM4QnmEZLl8#WY6NVEBXQgKfCo^NSnJNUS9Un?Oc7ik"
+ A$ = A$ + "kOP[_>\MJS3H#W[:MgKGPaoj\a05?BiBAk=mCBiH_ACU[_iKn8OeoWLm[VjliYLBXm#B[YBW_1Mo7Qf?F8\:QmXMM8"
+ A$ = A$ + ">fDF7l55#W`L_TlN>?l^lkUUm78_cn\#iccP>3X7c4O_gE3XJfR^"
+ A$ = A$ + "cP;BH7Qd?>_lHgC<_O2\nVKeDIl2^^8_626gA?Sn61Ycc>F]8[1oZYhj1SeD"
+ A$ = A$ + "ikOJe?hTi4eXX=bL3UOKEn0i;XlXYJ8UVcTZgTOfDZf3XkPVV3I"
+ A$ = A$ + "k>o5m]oAe\4]FiH "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "face_sad_x.png"
+ v& = _NEWIMAGE(57, 112, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIiLU7KDE46gob#862aH86SaX81E2bE#Sa3l6A0S81A4_86SaXh5N4?9R8F"
+ A$ = A$ + "Ji\P2D:UbAZ#i#]]LH51\PE\D:GEXPM?jNlj^K_fMkNfmji>__imfIgg[52c"
+ A$ = A$ + "ljh^nBnem]MCVikgkKNcgJ`#1gnPh]?N;SdR#2"
+ A$ = A$ + "WL_4jVQ4?LgG4h4aHD\Mo"
+ A$ = A$ + "^okOlki]AbE4g=]RAN]lF6Y1f;kiVPXR]NR;P_2ha`LG>Y1QJ"
+ A$ = A$ + "mdk7h4il TdF1X33fbO^KN;Od2WEn>c#DciB1MH[o"
+ A$ = A$ + "h[?EN;SdRPfZ_2PCTf3a_7ff5><_U?JQ]]n<`NOcH=KbkSbeNoXGTgb8]`g5"
+ A$ = A$ + "fG9Tj=bkSjceYJ>_KI0lF6Y1VFiX7BlNlYJMYbj#geEd2h]g1`:>2^Q]G0c3AMOh8iLbn^hn;9R7KeQ6kkoOne=k"
+ A$ = A$ + "hWOcYeO`?;5o8g^X6f;TeY>[h]W1=]_Ql_U14\UJg9d7TfLU^G8\con06GfM"
+ A$ = A$ + "RGkX>>>ml74[hB"
+ A$ = A$ + "aAIO9JBb?LGa]][mma8k=29R5A<=o0AL1oVXPkSG\^<_VeBNRA9Z<6BmJgL]"
+ A$ = A$ + "g?Lfddn1]MldJ?]99lKALKiHj17KoP;l=Q^AmlY9oOF<\TQ=#JJoTc_PK<]e"
+ A$ = A$ + "QhO4gOa\IYX7Lh\VSQ\g#ET?;9_W5[o>RGQ;K>Rn4?o7chWQ2^e1V8JHcYg?"
+ A$ = A$ + "YdYMlkioNdf79Wc<]WKJCAlJYl:D_Ql_i[VUL\eM?5[j7T=OUnAI^]4Bg;_FA"
+ A$ = A$ + "9KD[JLDISB;4dbaf=d1Zg7E0coa>IEoPF7H\P^?7ic#LW1MObe9KMSCN<\VO"
+ A$ = A$ + "6Gj`_VHQldTZn5cgf>`Gmj<]oFf86\_VZZXH1kjL97gJ6=f=N8_=eMCEFTYE"
+ A$ = A$ + ">VQ`JnQPe=lhSDU>DBUXd7Xe8cKiS50cSdhXll[Mgh^G=_U?FPXMk"
+ A$ = A$ + "X1PHZ]mgiAGa7cKiSFHnk^[KZh]V>_UAJQm]:5k9b4C6?\gVh]la2h^N"
+ A$ = A$ + "`g6Y_>EhMa#i0W9528oQ1:=e[Ceg5fO9lFnH12HnXU3lRTS`mN?mfF6_U?FP"
+ A$ = A$ + "NjbD]Tj>hFim5_hgQgb7;#4_f[78VJko]O`_>[?>6#0IO0c<2>2cafOigJm4"
+ A$ = A$ + "6:HXXmc8TY]OIk82Uob?6_UAjih]>`_Ji_Df_]So?HOlB]>W]WmcA4B"
+ A$ = A$ + "T8^=a<^T7[j\RiVek_:4jkmM8M^bLG6YVSN\FG_aa>ZY0Z?Geo;0iH9A[hh0"
+ A$ = A$ + "O61LG6Y5nKngf:`Aenca_Q3E6_U?F0?=\Yl0JYnlS3gn5?<_U?F0L\:7_3HK;LG6Y5N>1Ho#[h18BG]X;aOHo"
+ A$ = A$ + "=JkGn\i8A8Eae14K`VGeh_1N;Sd2lI5g[aWS`>b^cAL4#n38Zof>3#aI]f5TG:J^^ehQld4[SEOC[J\G_[ml1cfMmKLAN"
+ A$ = A$ + ">iFcgIE_g<=EhXeUHUC6hgi4D5S`HMI[kRMi8G7e\TiUNl0;7gJQW3mNfMFXNaa0V>BiTj>hNP_"
+ A$ = A$ + "\8>m]]UYMgRbi7SFaK]DLj2eT67DV[7A^"
+ A$ = A$ + "\VG]eMnZCB?iXc:OK8WikUJTSSOn:o<2jl8;o3EhYTMa8HkTY\?jn4U^8mTO"
+ A$ = A$ + "b0UKYb?KE^DZgHdU_78oWXD7N8NW8NHOG\m3m=mKWo0Nm8IClI5f_`?4#alAZcdBmn]lNfMUC4;mn^`N;6XU6e`"
+ A$ = A$ + "a81JfDQi0n7XT91ieJ6G:[C_1f\>MN3=[g3:L=V=C[LDImi`3>F[4Di7MlhG"
+ A$ = A$ + "?=\Uli]R173bg3=GkC#;eb\LMUWX]ZoBYjAZZmaS[1K>[hMW9_UAFP#2hJ"
+ A$ = A$ + "8P6eEFD^gfLNm_[7C?PURU]UTnU\^=GIn7\_2bY[iL8TZ>cZf_?XJQLc;NXI"
+ A$ = A$ + "mSI=_jkiVR7E;O>SSOYcDn:h] "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "icon.png"
+ v& = _NEWIMAGE(32, 32, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIeFf5BC5667_;S8J1BB1Qd=maeR#F4BHGdTnJ:U#UA1FT2A5IgTcnfXlRX"
+ A$ = A$ + "KBF^U3Vd7<]BX9edZ5^Ma\878S1U:E\iLP7gBg\JfnhYcoUMhhIWcnZ]3d;l"
+ A$ = A$ + "3>kmmiio?H?k\cQ8J9doYHIDSe0TK_>llf]eHgKM#UJFQO0^6kEXm>i\ON]G"
+ A$ = A$ + "clQ3eT_m>glc^_21mPNcE_^l=DYWiYEfo2ch\b=?lS<#FIZGV#CDLK_nhJZjN[DTIL^1b"
+ A$ = A$ + "2IR\CUkgmEcEZBgZmT_l:4T=L8UoFko8M:E_G`dnXKKYAAM0F?RF3LT]n__m;B"
+ A$ = A$ + "lGlgekKUll]"
+ A$ = A$ + "ahnl3o#KbZOhh4?^<:Hh09nL\haXKmZjUEoH_V=YRR4mGLcTcn\M8[n1]K]9"
+ A$ = A$ + "^k;WN^9Y^ML7Ie?`TC]LW5=F4Igo^jX8JHgF8Q;ib?Hoj;QL7hC5E?E#\_WWXWmGDYK=9N"
+ A$ = A$ + ">e9=^I9[1>Tb_;Of;kP6F_[DihO1T=L8UO`gW?hBkdnUJI_J;>]_[GV2b2IR"
+ A$ = A$ + "\CUKn "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "tick_warning.png"
+ v& = _NEWIMAGE(64, 64, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIcK]7RFE45gEgMeMMGM]G#YAY59DDI2eDIB4hSa8b^H\_^4`?[bKWLOaO[Q#URfdE?Z#8WJb"
+ A$ = A$ + "`o?32SS`;jm]o[8aA9lV4VE17IakjW;ha;FlNURHcP9l=73hcJlW4^5Q=gS"
+ A$ = A$ + "4hm:m]cRgA\Z[nO?jRdf>2Q]AHM4V_[`LHSfSQCXA_]??2_1Q=k:ne=VR`g\"
+ A$ = A$ + "hmJlG;KWVgUgoA;2KI]463QCF8cD16k>:2;cc]iE_beldl>la^YdG8NWKcDc"
+ A$ = A$ + "Q^oE2=AH06nFm^F>V3fXL=5=j3QWP`gU3k0iJQe3[fI?OHF?_G[og?F>d9hZ"
+ A$ = A$ + "C#9KM\_1G[ON[WR[3]>T<>=WLH?_SX_EhmaJEo_#cccaW[>Am0Ni62H[B>Ue"
+ A$ = A$ + "_5_Wbj#0G4Q?9AKK6nnd=G[G;X:ElPG;PeAZL^Nl4?G[LlLa`kQbo#fWIVX="
+ A$ = A$ + "N_1\_jDf7;K>7b3UPLONUL;WlNXlj0NP4S1=TQ^II;cKjYB#NgUXoL<[LbkQ"
+ A$ = A$ + "b[Skc8B`NoHQo;]_:Eae1UP\FB7<_[c[3hnC`^WYZ?JO?Uam[hH0NGWGGgmo"
+ A$ = A$ + "n^SHkoS:6FY[U[==b8mo`RfcnN79_cie9SQk>R?goIAHS4F3"
+ A$ = A$ + "QQH`k\maGom6ndC;Jgb=Jg6m]YZ>8N?dcUgNPf5:_^IKhGkcg6lN1o^AkJdg"
+ A$ = A$ + ">]\;GlN?L=o\mKKHG7G0NGoncGPAo1#^N3ehn7eelN\fNaklhiW9R]?TSk_NQLJ_FO_a4"
+ A$ = A$ + "lmm9TUehBPiJ8W]#hM=^o3e>ak\_gg4lMP;D8?;k;FlLG^2SacjnCBHSY`kJ"
+ A$ = A$ + "O??lNmA\56SA`ga6GROO>6b2WSdn=^oXmb`Rgek9C8TBnlOA2nnl38kHS;ak"
+ A$ = A$ + "3l_I8_3h:L6dalO;NW7OgO2?9Q]Chm9LmRn5;On5TP_gTbFBIn80TKKF[1`W"
+ A$ = A$ + "oNFjLh6ae>;deYTAoGF0nBckY\obK_8hM>6Ll^\gC3^f3bB_SdPgaeli3H]O"
+ A$ = A$ + "ICcPg_b4lMl^:m;Wl>KOhg8?Y\NOh3Bh[SYKX3\W`FkKj79TC\ljBIN<\oSK>Qfm:"
+ A$ = A$ + "U0NWG_iU=d3b_ej<]aj3lc\Fiea8?WCJFHeU0N_FGce2f1PiG4n>FSZ_U0NGJOCd#"
+ A$ = A$ + "O8W8N\]ekKRL7imJ8?kKc:bYo?hB8_chc7VX]HL`gJdf3;J;_?PafONng[=RMl8ZHHYPg1\>;WSjJmioLKA\"
+ A$ = A$ + "ci8\aD>G6IXD`"
+ A$ = A$ + "k#WEhA\gUnl5m[;2iLCAjgN4m;Uj[C_olmcc=WEIPgig5cJon0N1EoTeo7dA"
+ A$ = A$ + "FkE0SI9hN;N?DMFYAYPgUe[de5af1hjc:Dmo1g8Vo`_7F2fm"
+ A$ = A$ + "R4b9DmoajJ=98;>_`jR`kU[c;DbkFka7SmkJ^F0cZnoHmGG2b3H6^FbG]Wl^"
+ A$ = A$ + "\fOnk4\enkJNL?;W#eo7?>NB963Te1UeiaEZhMiH]DNN7Pgo5I<=[jo[G2k9"
+ A$ = A$ + "Fmd`0eRHODnEiPgUfn[WX]eT#nbjEBGoOQZ5:0[g=BROcEhLIec[D:cW70O["
+ A$ = A$ + "9k8AKJW:k8T^IOG^nUl<41FBRj30kYfD3HgiQg3EKBSgUN=_bS9ea_\>WHMM"
+ A$ = A$ + "Pae=]\M[?7j60k9:>k=W;NN0Q0\YcfEHhG^noBaoU]"
+ A$ = A$ + "3a0[cD?EPmL2cIPcV8Um2>5lh2kaaNWab9`kZPcLTck#>_I:iOXoFI3Q#Og4bi6aL\YDkaUJPjgB^OQ"
+ A$ = A$ + "QZA#;N_JGh_aT#?oWbgZ3NWf7f5_nKK;0[]nB4^DQNi_mel`kMe7_BQoe[QX"
+ A$ = A$ + "W75G;W;1i#Li^2_[e^:1naaLj=jJMM6X7GVUm5:_cljklkJZG3Y6EKdmk"
+ A$ = A$ + ":L5nnC#=T^9O<1ke8Gk1H_5aL8hK82SM`i3Qm "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "srt_logo_16.png"
+ v& = _NEWIMAGE(75, 16, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIcK]7RFE45gEgMeMMGM]G#YAU59DDI2mdLR0OTiJf3B8T#1CYb2\Wm\cmi:P>kAW4X;Z[am[8BKdXK468QY#hI9\12kP`"
+ A$ = A$ + "?#hG8LH2o8QMChm8\D2CS``9LRATMaHOM9POFUg>inRoF3Q:5]Y[NDQ#>eTQ"
+ A$ = A$ + "oOV46;QGdkKoGARSBh=9<92W_B75SmQkG]:6E;QN8nO8fdCOkT]Y>U\K`7gT"
+ A$ = A$ + "fdH8\ifPo63kd7;ZGYgD\_jm]A>>XJooW7?`nN=1R?bneCAO`eG7Q]F6mK=f"
+ A$ = A$ + ";QaAXGNK#bE\m9mm^[lm:mG;7KT5_G_Bf=8^N84njfAoFS3AHl:oZGAhmZmn"
+ A$ = A$ + "#8OgRg[D4;PbRge?G`SG\hm:5aV1AhK>6`Weh?9L[2K^79"
+ A$ = A$ + "`kEjKW5_SHEGmoND5Y]M42KS`j8=_;_oSF4fbJ9gVYT3"
+ A$ = A$ + "Mo[4JR#o=l]jM]L<7\AiJ:Jd72?1Q_;7f1be2[7F]cNn`\NN_Fo_O\LXC`EW"
+ A$ = A$ + "PBfjHO3^FolF?5G7JM8ILJfi`NN7AO[`kSeZnOQVWWS?GKRj1lb=5`FUL:[O"
+ A$ = A$ + ";N?UeQ0^H2OBRffdmmYK^F_F#EZh1_F0[SDiLmh9N^FihiRQg3UoQ\?c8AKl"
+ A$ = A$ + "n2HOeY\?FfL>T7:1inl:iF>im#ie1lP963J83McbFVgdCUPl^KAoiHFiTg3U"
+ A$ = A$ + "G7gWQWPmna2oGJOEZR[3<1I]T>HNGWG7`3TPM?3EOdnN:SkGaa0l^>_^^kom"
+ A$ = A$ + "m4afo7E<\BG;GKJ4AjoQ5]Wmm>BNWc[C63gM4OH>2KB?6N?Ajke[JO7=_[c]"
+ A$ = A$ + "00iJ6;OaN;J?cSgLTn\BUN>FPgea7N]lK;R_\05OPo^]8mA>NYmVgkN0M[cW"
+ A$ = A$ + "GV73`OHh;oTZ]m>7LOk=_[O6EbIQN^PiY97aW^DAOR=fo\jPhM^ocT`69\62"
+ A$ = A$ + "3fPgIkS_nk=lYWFd^UKd^=jKCEM#lNXW;_S0];DNMcb`_fW_=hm2nMSfeX_M"
+ A$ = A$ + "JIG^hmNhJnIkgf`^>^0l^nmW_#Sn3PLm6Ram?Z[imH]mRgiac?C4KO`IXKfn"
+ A$ = A$ + "hhbAShk03#H?FS;G]Q<`I[lL6gOm2idN]nNS9h"
+ A$ = A$ + "kkC8;[aU0ca#>O8Qgehn?Lk4_cnnITP_3LA2iIIOaRWkbEHfhBlkce#FhLTf_am7UG6Fl^N?I2QDbWo;B`gWG0I7KL9NO"
+ A$ = A$ + "Po=3iM0GQcP>VoKaklhknAh99\M2KR`=:jG\liG#2nNC:K9UiS0#^]I]60On"
+ A$ = A$ + "kIYcQI4Gk\#GWB6mOI1h;=_Wbn;_mRPgiH`akbN?=hJ?8;m>23N7GcW?PenU"
+ A$ = A$ + "=E3NoZC`gakZdgLbk\mQOSlTbjmQ?8Q_b#gSeelhG[iiob8n`2m]CNFCGF2n"
+ A$ = A$ + ">`YE4l^dnjWQ\ak7HE_2ceebaBQFO7H39h7gUXmHM1[g?Ua4:BNGf6[m65ci"
+ A$ = A$ + "^_6kET8GbaP?=WnNa`k`N2K]_YOT#>ab[;Uia`n?^U4Jg[D"
+ A$ = A$ + "2hMNmVGf#?8oF[cd6[?`?cJUG7SlL>YIQEG2hmJM=G;H7`#GhikCR`OIdV[A"
+ A$ = A$ + "I?IUG7OmRK3nnnL]MNGJOWN4ma[__>SflZ6lNXlj0VGAhkH=ZcX4`kBkK26j"
+ A$ = A$ + "3i4aS]]NOCTk8_G3iIOKFA>mo1E2iM6OVQnF^XMm?R]]HUL]bWGFKQ;:AOOB"
+ A$ = A$ + "UHN7HPeIiLDG[?oWK?RM"
+ A$ = A$ + ">KQ=Vbib8S1=UQo^HFkg7`;XjW\noP>b"
+ A$ = A$ + "J_2H0GOFQZo?PaWPimbei6al7nm#C`^G"
+ A$ = A$ + "T#>QZo?FG[91Iai5FG4N_LMNQBNgJ?nH\OGce2HFeo7[ojB#N0CgeBnZmTgU"
+ A$ = A$ + "encOWP]f?GcSkIi4ZnohaaCX\>?^B5_;7[Ubck0ln_8SYIEoOmBH?a"
+ A$ = A$ + "ZW66XF4kSb_:7l^dfOm4]]V4bGF_Bjjo;D]#1Hm^ABlK^2W;[NNUBInl0hK="
+ A$ = A$ + "I79JCkDI7Qd=kkbe_TWQ8`BBDO0H?eVB0k>?lNXJCJL^d[iENnUei4[[3"
+ A$ = A$ + "<^^YU]Kmi#g0H?AaI_M9^hi142`V>7GQaDO#>emFM]^NHbRgSI7bf?eLJ7K2\ol8WTccEH^LLVdhK0L_5Y^FJ0nEckPOijo;5oGf"
+ A$ = A$ + ">43\>CmD1fc9KRDf;hD`S;\cHeWXNNZD0?o4h]g_4IcU2P_79ig7INZ;"
+ A$ = A$ + "eDAXliak47kM6;W0_[2>cA>_3ilVYToQnKU=42mMC8WK4caVB]7GZ1ZO;in5"
+ A$ = A$ + "6Z61]hmZMQo6C2mlO:O[>hMJW_;NmgfF0FKmU8Li2mbOk[iQgkZ?NU2o[G3A"
+ A$ = A$ + "??:^F>G2bQh:M5NG[ME2lIlMRSidKdejj<#?^<;k;DNWiegigeD_6B=ZfXkg"
+ A$ = A$ + "Ei:lmWPJ8McnH2f[A^f3`N;Ri#`g#46kPc72kIh3i:l>VQVWVe]N_WRIOEYJ"
+ A$ = A$ + "CWnO[?8;%%%0"
+ btemp$ = ""
+ FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
+ IF INSTR(1, B$, "%") THEN
+ FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
+ IF F$ <> "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "srt_logo_17.png"
+ v& = _NEWIMAGE(85, 17, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIWH]6REE55NUQ196Z#4EPUm2:99a41CZdODBQ2JFAiS09XT\R4RXSV>Z=JSiSVd:M:=;=[dkcN_Nl]G?fk3UUV45#iXi1d1=FlGRn71ZOoG0K2h]1F_0eog<=>:=V"
+ A$ = A$ + "Q;#F\^V`H:d8#F3hC]CNH>NdOF2L6:3VCSdc#[ATSB7o0`Q0n2jVPNjTeG0m"
+ A$ = A$ + ":dKQaZ7`U^=\fCbf_7m4D:X1CUC7C\[WRF:;;2bI<#^iP"
+ A$ = A$ + "=W3?77?V_8[b0nM3I\KP5:_gW65TCG`OcQi>9bQ>8c;NR\JPN40RAFii:1F5"
+ A$ = A$ + "#;2F=?n^`J3GW;]MFo>0NRoVU]a9[UMgQ<\^oNJMHMKTgc8JnRMG1VQWf6oK"
+ A$ = A$ + "H?G5;O7<;?IOeU>2nmU`jgC\U0Pg3h30NOP]`oNhH?[;`oiHk?;hFElB=0;V"
+ A$ = A$ + "f1c1AbdSVJ9id5ali3T`G>8`aelYb_Z6X6J:\>DXJPjTmnD2ZS]im[e_7]Gf"
+ A$ = A$ + "?L5o8;c[m2ooQ>dP4^[=Sa?5dAOUhV#k8#lkb"
+ A$ = A$ + "1F0SARmY;`lIDlX3MFX_[Pf?J;hg7[8n"
+ A$ = A$ + "g=N^kQ7cEhkDlkW3KcnR^ZVnDHo_0TaLaHU9HfH_Ja0M9nW"
+ A$ = A$ + "bVn#>g^93Mk1Oef?ShdeI=0jk`L>2WG\E[L;"
+ A$ = A$ + "EMUZXIA_1Ng9=hd?VV6fOBV[]GTidK;>eE7c7QGBc[ALEahddBMRfimk1Qoo"
+ A$ = A$ + "LJIj`ie3V[94HPjUJ:=SgjHXoe#g=7gdTTOlOUCcX[m4I[?D9b=>;b770_?n"
+ A$ = A$ + "9Jm]f4i>iPooj[gVieOIPF6]c[Y#L"
+ A$ = A$ + "JF\Z6PdCfG90AiZjAOT`1Y:0WZTWZFoJYkQeW[F_MRn2m5Id4]L9>`g0aaog"
+ A$ = A$ + "8Tc8`l7>noA0=f;^oDhNhPP\69nm`acQQMX;UeG#2>e5LZZ6lGci::M=mlZg"
+ A$ = A$ + "i3^Z1h5>6LZ3hdGhmo<7Mk#NCTkG6fcLL2^El^1b`Q^5H3c0m66"
+ A$ = A$ + ":ZfZRGk?6Cm^[5hJHOg]0aY;2LjGRa?7cg?_>G96]caS^#cn9hD7]mAJ>:4c"
+ A$ = A$ + "[4e=L]VK69^a^7e>e5LJ=dUQCbXRCW=j[T;A=\fTJ1Ze]B3iIcY>DLMHG"
+ A$ = A$ + "=7_o2HW75X?FLJdiNBbYNFb\L3o87h6El_?G?e7W?=V3f3K;Ec[i0JNC]?\<"
+ A$ = A$ + "L6_U;e6K2E?Lbcf:6WjZ[OkgSjAe9[SJ#liR>eWR>ojm[mUXcD_AD?M]\=od5h>0G4hlFlIM"
+ A$ = A$ + "8k]:jjek_m\nn7Pc5co\;=V8V[`LJ63NYN=WfZUMiScfF1PM=e]Ia[Y;1W68"
+ A$ = A$ + "kIQggKFjkMDhLg#>eAjihQCV4=?EOZE26BECM9\L726OR0S5cAQ1RO_N]\Dc"
+ A$ = A$ + "_5=nEeCFg2hhkGVm_XiD5m]POZ3cC"
+ A$ = A$ + "M7m8D;`WWPC:cjKPDjLog9?OGMgb=PKmX>WL70Zc1dZD[_HLZ?hd#n_GX;l^"
+ A$ = A$ + ";Po=MV[DlnY4iVR6ONm6laMaCScXh;gg?4kDGg9j<`Vg7kGhml9`iWfj6lIM\mkXmIO4YX^GJ3LnifB`ASW"
+ A$ = A$ + "R>SDB>=55m=565Noi=lU_1i4S6fm9PFn9ll>hJN=I`?Z_cg5mG5knh2Debn:D__JnKb5fg9ZgZj>JNhV=Qe"
+ A$ = A$ + "3_GMm\BaYQmc7:NnShi9`cal_L]S%%h1"
+ btemp$ = ""
+ FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
+ IF INSTR(1, B$, "%") THEN
+ FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
+ IF F$ <> "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "srt_logo_18.png"
+ v& = _NEWIMAGE(85, 18, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haISHM5SEE55Mc7J<892ZH8::5A498UHR9R:A\RA8H2OXOa7nQJd_m3Cd?##"
+ A$ = A$ + "Y<=VfkfN_Q1#::838P:5AP8XAJ:5;DTF<1d5k4d1U3cI>dK9Wcl1nBPm3L#PM#g?>WfUc;RNGimA0nd"
+ A$ = A$ + "3QeNFAn3X9C=QaJFA]0i0^TZ7fHcd#YYCWDU[GWJEf;N?7;U7S52T7jW_8oV"
+ A$ = A$ + "mJJ0WcJ?f6`fW[1m]8VkT8?jG5N9#g[FXG4P4D#O^8P?1Ha:nDIl_"
+ A$ = A$ + "3[e\>OJSbik14XjKNiiTBfk^26>MOd:ajF3`20n8E^[2kB#RH"
+ A$ = A$ + "53DkZ?MDi\SA>E>F;`60F?`G3l=d#`Zj0lOAAn;0KeB`h\mX>J;274_WQd;;"
+ A$ = A$ + "kAUhdI9liCVAGn=PCW`W\N=KPjQOGmHno0JWRNh[fQi"
+ A$ = A$ + "Z?mYOj6R?]ASd4XZ5mc\OVmMa>c9Tj_bM[`JlcSakQjgHhc8E_IKc<0V>=Hl"
+ A$ = A$ + "k;:lI\oX7MIXWmPn<9nH527hNFCTZYRnY?QcL=fQ]ROOb:XO?G2?iK9SabL0"
+ A$ = A$ + "hddi^MI4#_Y5Wcf[3QWc1kaB`h;Ea7Se\:PoeBVJCR]WK2Ob?GH6I"
+ A$ = A$ + ";VCG^eHW5[]kFbGZlJVkP0^#9jY?hdYCmR>0VcaXK3ld1MR]RThi9#O#6>mk"
+ A$ = A$ + "YA3kCfH]C3i^OM2WbhYCd[VeWERCmdhM>Oh2YK1koacH_O^4kB\^6AVLW]PX"
+ A$ = A$ + "MO=FTWkBQodZ9BS_;UCCmCK[4>=BUcl>Lj01>G5da;3oPN1?DRfU4Kf;\nOg"
+ A$ = A$ + "j\hHWRH>SW>3Noa1f:mH#f::nkfWO>J0RnHcYn:L]S?U8GcFc[4KocbYLn1>"
+ A$ = A$ + "_k>0F>mn9WGCBNbfTLJ;e:?GVSOf2n5Wc^Eeg?K\O18kQbh^L"
+ A$ = A$ + "J4hdLZ<^P4k?coWYTHDK>e7lHSDJMe0jf1>\cliL5O?=28?g=mNdoUTo8n\I"
+ A$ = A$ + "k6OfccRC=e_g=`>BlGB]ESAhcUAVJF1UQCKBhB^V#O`j=eamDklJYAAO;IZc"
+ A$ = A$ + "eTU_NXno=;kgD0F6hUUSaZFbOEWNNQ8?B>\;n`ZaeUZ5j\WUfWAJNl0dGBLMa\L:WS["
+ A$ = A$ + "EjVaJ>F9iDV2b7ciLf9aeQ;UC3dHe88Iab[W\f#Q;GX6CjUQC][E7GC:W`cg"
+ A$ = A$ + "4j_kFUjE]XSi[?[AOJcYQPC[5LJKJN_iAm5fVCi43k;nGm1bDE>nYNPCmXdn"
+ A$ = A$ + "FBaM2Ld:hO7cW3:InNJ^[J0Wf>6_3jN`jJ_TJhnX^RG9iWMidHKN:_f=PO>3GbXMPNBIkO[ej14NgXoa[cDSZAjAM>gL#?K1Wk2XhnaFUC_0E2Vn"
+ A$ = A$ + "j>2bQg=Eobf;e0X\eXlUJD4]>9GjA`iEdi\lYaUdoB0bQD>>=WbYiE>`dcC_"
+ A$ = A$ + "LlEC1g3a0chG7W7c^^oFBZMHfCgjUN2^4N7OoUEk`Yli?KI==TT_Q_gclAD8"
+ A$ = A$ + "W7ncTha_B6[[hD3V\U\feem3aMGH^NF`FG7IGoPOgCWdCH#G`YamHKdoARgo"
+ A$ = A$ + "G>WMYboch`Y=E1>eegWcGLneHkBod#MOigG]ToL`hYin7AU8c^LJMbcg9INVJOK#jQ"
+ A$ = A$ + "?^6P_UnIh\Ejh7\8jeTnCWKR7R6:6obUI_fNR?7WCU"
+ A$ = A$ + "eU6XGa9WFC#Jl#\N8jL881L=odna=m?n6J=`:UocVCG>UUC[5HCd;9eoi_Ye"
+ A$ = A$ + "99COced9LJ0hDFVW9lKb3oAgmlJ#>6^`EZ5Wf^ho><9>`mL=O3U8blmEVYjOT3FdbW[Xl87HQVYdj_YeE:mK"
+ A$ = A$ + "XHN_;WbWe7PkV_K;I^3M_ZBU=Co7;fZWP;3NlFEOYekh_4:iC7Q\NK>MCJ<^"
+ A$ = A$ + "7j=_#Wkl5ACDnF7fL:ommV6UfOT"
+ A$ = A$ + "1e[m`DD^OcRdca7MRU:?G7cKD9a;IidVXhkYg?AVBcS_;4[>:`Q76k?O_d1:"
+ A$ = A$ + "jClgGVg;nlnG7oD3:0N]0ROSXO1Lg3BC5S=Eeg>>gUa7[6=obfj4L8Ln[3jM"
+ A$ = A$ + "g5kBlge>mk`fM9>?2kS7=Ni>7L^_JA_oi5oR[:mObc=;WN15GRBondk5gk\>"
+ A$ = A$ + "j7`jnK\^a;lC3RNm0Jn8>_d8CjoYchd0A678Vk^PlMHP7io1JYh[%%%0"
+ btemp$ = ""
+ FOR i& = 1 TO LEN(A$) STEP 4: B$ = MID$(A$, i&, 4)
+ IF INSTR(1, B$, "%") THEN
+ FOR C% = 1 TO LEN(B$): F$ = MID$(B$, C%, 1)
+ IF F$ <> "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ CASE "srt_logo_bottom.png"
+ v& = _NEWIMAGE(401, 30, 32)
+ m = _MEMIMAGE(v&)
+ A$ = ""
+ A$ = A$ + "haIkM^eLDLL57On:XGR]cSj[Pn:h4T#H38YER;24BP4>faQ#2P0\3fVH1bVH"
+ A$ = A$ + "1E^lP0QMhR0\L8?04L2;PQD18a55D>HRMYDK5K80B##BhR:6A1LBOJ]SB[cd"
+ A$ = A$ + "gVIWIWAXNMm_\m^MgcdMO>WOm]I40P7hTC>iTC>iTC>iTC>iTC>iTC>iTCU9"
+ A$ = A$ + "elRF8Z_3Cm`dP9FLcWUY[`4<3GO>C?GJgO"
+ A$ = A$ + "hTC>idd9aRKfK68nMFAmUfm7>iTC>=MB\hVG?34k>[X_>]k?Lb9W:?b[Gno0"
+ A$ = A$ + "2jiIbcBQY]CBnAU_hgKKihEbRK>J68fMFAgaBK_>ddo9f_KZ?FVb[`6CfeA<=dnLK5e_afjV9YZX`jRVjj]=HcQf?GdRn[>R#O\>6R\["
+ A$ = A$ + "9=MUJ\Z`FgR:3AgHdj#ANDa#:EO#I]I5:fFTUH89AmDYmGJ7K?3c#\e7aVbD"
+ A$ = A$ + "U]NHR;4Vh;Shmo7o6M^858];dabYL>86I8;NAlHf;_eU1KY[g6N_]]=[EgKY"
+ A$ = A$ + ";XmUg6?oHLk=^Qe7Zl;ZgLCo<>31IBQmn#DoR]m^lk9=L4C<4IS1DGLfhPQD"
+ A$ = A$ + "UVd:>VnB=FEH[KAUQLA=iAehkTa#R3O#E]IZHFY1399[WZDPaUndXTHSJRQ#"
+ A$ = A$ + "]?;h=EoQZl2j796kFW?M_Td9K]7jVD>j^ok`;hh>47o6mn6R\mA#ejbBmC"
+ A$ = A$ + "Ym7dfKj_;jcAkK5WS\YkOZ]QXO4e6DdVH:aXZRQPSkO1=V3^jE_:?fk#g"
+ A$ = A$ + "jF`Q>h1PngonP3donE:lgadM;Fja?Gi:G1Vg;<7h?Ofcbooob_h;PmlKo0]U"
+ A$ = A$ + "QHIM`nkWcR`?k^_M1;M9=cnnYV^m__m1Od030?h1?PW^lWh?1kM?kABi]OhU"
+ A$ = A$ + "OYE>UeH;4<4JK^YeX?^H8RSUXKRmY^ad7VHEaEMC539?YN8Sm9N?#7_7mn9^"
+ A$ = A$ + "l1ea#TegD^I89Em#k#J7O?3b#XfTj6oVF]:UT7SkAV:6b2be0\jE]:hA?jA`CNbCP=oV_1DK=E3e=_iJDeFc\P"
+ A$ = A$ + "OnVgXVMec2ffkn>llnG_`5TVVibHD;I"
+ A$ = A$ + "a;2^gm6SW^=^n>ig3bBKDg?49nmjFglhRQ#k?[b;HLI89Im<`NN#nM739XX[;T9o3JjmmCYf#Z6GP:K"
+ A$ = A$ + ">aml:\c3QN]XfQMk=EO0Sc1A731G7[e_^eaS9o`7n#nhgmgKK<>\>QcOYeFF"
+ A$ = A$ + ":LjCO:hLWk_0oPEfaT_R>Fab"
+ A$ = A$ + "Q_iK^7?M8_CcjE5E6R\a\>RWieCZDH8mB^FbR]4VmXF539^ZKZ^g_XTk5AfG"
+ A$ = A$ + "5T[;mnATQ4WnPd[CWN1??:EYY\BB6BBF?Yc3Q>FU;VfagcHCUC6BBF?5GkkZl26k8W=a>V^;?kI81NF9K<]oRj^fQim1Ua#ll2^o2nOOiTQTTeCMJ6aI"
+ A$ = A$ + "bZ<`#D=?T`f_6ViQXBHN2<6#Qf1jH8hgGa13aold>`7N8>kH\A736K<3JdAQ"
+ A$ = A$ + "kOok?9giP7XOH>eD]biQPUOK;[5hCodofTi1i5hNh?j8S0S`doL`1QgYk]ZT"
+ A$ = A$ + ";D>I85Kc[b#oW^H]fb#4SgBWk"
+ A$ = A$ + "?4EGW:mbfWiCn4Y<4nnggH"
+ A$ = A$ + ">nl;`iSPO#>dFkZ;ngQk[2VOMH8HLiGmENI8o9>1l7ohS3[X]Fiad=]O"
+ A$ = A$ + "jCl<]G7\bfK7nf_mobSY_VObZQCV?_B6Ron_fN?lc5\QcBE"
+ A$ = A$ + "Jb#DIcXKL:f`#TMVo=jo;YL:56BDZKf`#Xke^X?R_?P>6BLj3ZSQ8[mS>fbT"
+ A$ = A$ + "TQTTecl5]Qanf0kkJJ7K?Sb#XmIQii3QJGA]S\mgPGm7n:"
+ A$ = A$ + "Po7LN1eFm\VL?beYGXfI3[n7_:nii2?G`o8FiLZCNB]<4oimklnoKEYQFgR;O#C<4IaV;GhkYAi5nH`Dob2NCM\KbN>eUM"
+ A$ = A$ + ">iUmlld;9Mfl>b;Cc#`hihl>nkOfWaS;SkCn7ln_?dg^f9\knjCSf5G3>hPl"
+ A$ = A$ + "lmEOeo2JPa0>kI>SA6R_ZSaAfjFjJbmE1??F8C3E:b#lmk7#BO5]_DgIoc43"
+ A$ = A$ + "Q>^OE?7Qb>_QDKe`nlQDZe=KH8NNbOg?96Od439^l1]QQDYRkgb139YZWdcf"
+ A$ = A$ + ";]?NPd>nN:a#DY>4J7U]ocZ4JgXjig:\[eP\a8VYI8XVhI4I]`]7NH8:O6i^"
+ A$ = A$ + "g5N[gHCliULQcONngQ[=V962WS<_i2KXc>QQ;N]_lU_4lBMd^dWaLO6bhS?a"
+ A$ = A$ + "cYnK_ig:9I8f8MW3CC<4Z]U^bR>6IjjI5eWa`XFg\UQ8KOF4]o=a#R;O#KH8"
+ A$ = A$ + "j^F9=39YZWD62ml^fFo>EfUIN62:lMV8"
+ A$ = A$ + "6kNkmlNleHbF]SNjQoL9f8;F>^>Dhk=AlkOm=^1M_[AVR`gc^hjPQiKGk\GX"
+ A$ = A$ + "ce^6Yi5WcdbFjBhkO2VFlIJdf[A2`#Dm^CeF6R=_KYD5OQN]SK6RYjV]<4C?"
+ A$ = A$ + "3ff`#R3O#KI8XT5gXL`#BRjY\WCMY[7FJ7W?3b#lE>5i_G;j?5E55kgXnmbn"
+ A$ = A$ + "KoadB6Rohlahif\G8nRo^OGH]WJ:Gml_GfcgQ>Q[OUOIZS;PL4okACk1ODH8"
+ A$ = A$ + "5K[kDSMGWFf7ZSQ4fmAEfigBLM>2khM;ejV]<4Jk0MMn]UQDZnPQQQ8k\=E^"
+ A$ = A$ + "H8aMmDjkgM_Pc[M6aJJiDYYVMo=XBDFmgP:WLb9WLJ2e\k_5^Rbmg2GWLb9W"
+ A$ = A$ + "2QHa=gI68fMFAk>]k?Lb9WLJjTHa=O>Vnl<#lkdFo3Vn^YMoQC>iTCCW4;^9"
+ A$ = A$ + "ZWQYM`dGbd` "%" THEN C$ = C$ + F$
+ NEXT: B$ = C$: END IF: FOR j = 1 TO LEN(B$)
+ IF MID$(B$, j, 1) = "#" THEN
+ MID$(B$, j) = "@": END IF: NEXT
+ FOR t% = LEN(B$) TO 1 STEP -1
+ B& = B& * 64 + ASC(MID$(B$, t%)) - 48
+ NEXT: X$ = "": FOR t% = 1 TO LEN(B$) - 1
+ X$ = X$ + CHR$(B& AND 255): B& = B& \ 256
+ NEXT: btemp$ = btemp$ + X$: NEXT
+ btemp$ = _INFLATE$(btemp$)
+ _MEMPUT m, m.OFFSET, btemp$: _MEMFREE m
+ __imageMEM& = _COPYIMAGE(v&): _FREEIMAGE v&
+ END SELECT
+END FUNCTION
+
+SUB LoadImageMEM (This AS __UI_ControlTYPE, FileMEM$)
+ DIM PrevDest AS LONG, ErrorMessage$
+ STATIC NotFoundImage AS LONG
+
+ IF This.HelperCanvas <> 0 THEN _FREEIMAGE This.HelperCanvas
+
+ IF FileMEM$ <> "" THEN
+ This.HelperCanvas = __imageMEM&(FileMEM$)
+ IF This.HelperCanvas >= -1 THEN
+ 'Maybe it's an .ICO file
+ This.HelperCanvas = IconPreview(FileMEM$)
+ IF This.HelperCanvas >= -1 THEN ErrorMessage$ = "Unable to load file:"
+ END IF
+ ELSE
+ IF FileMEM$ = "" THEN
+ 'Passing an empty file name can be used to clean the canvas
+ IF This.Type = __UI_Type_PictureBox THEN
+ This.HelperCanvas = _NEWIMAGE(This.Width, This.Height, 32)
+ END IF
+ ELSE
+ ErrorMessage$ = "Missing image file:"
+ END IF
+ END IF
+
+ IF LEN(ErrorMessage$) THEN
+ IF NotFoundImage = 0 THEN NotFoundImage = __UI_LoadThemeImage("notfound.png")
+
+ PrevDest = _DEST
+ This.HelperCanvas = _NEWIMAGE(This.Width, This.Height, 32)
+ _DEST This.HelperCanvas
+ _PRINTMODE _KEEPBACKGROUND
+ _FONT (This.Font)
+ CLS , _RGBA32(0, 0, 0, 0)
+ 'Place the "missing" icon
+ _PUTIMAGE (This.Width / 2 - _WIDTH(NotFoundImage) / 2, This.Height / 2 - _HEIGHT(NotFoundImage) / 2), NotFoundImage
+
+ COLOR This.ForeColor
+ __UI_PrintString 5, 5, ErrorMessage$
+ __UI_PrintString 5, 5 + uspacing&, FileMEM$
+ _DEST PrevDest
+ Text(This.ID) = ""
+ ELSE
+ IF This.Type = __UI_Type_PictureBox OR This.Type = __UI_Type_Button OR This.Type = __UI_Type_MenuItem THEN
+ Text(This.ID) = FileMEM$
+ END IF
+ END IF
+ This.Redraw = True
+END SUB
+
diff --git a/source/loopy_srt_monitor.bas b/source/loopy_srt_monitor.bas
new file mode 100644
index 0000000..9fbe04f
--- /dev/null
+++ b/source/loopy_srt_monitor.bas
@@ -0,0 +1,2633 @@
+': This program uses
+': InForm - GUI library for QB64 - v1.3
+': Fellippe Heitor, 2016-2020 - fellippe@qb64.org - @fellippeheitor
+': https://github.com/FellippeHeitor/InForm
+'-----------------------------------------------------------
+
+': Controls' IDs: ------------------------------------------------------------------
+OPTION _EXPLICIT
+DIM SHARED LoopySRTMonitor AS LONG
+DIM SHARED FileMenu AS LONG
+DIM SHARED OptionsMenu AS LONG
+DIM SHARED HelpMenu AS LONG
+DIM SHARED SRT AS LONG
+DIM SHARED Status AS LONG
+DIM SHARED Settings AS LONG
+DIM SHARED CurrentScene AS LONG
+DIM SHARED DebugFrame AS LONG
+DIM SHARED Stream1 AS LONG
+DIM SHARED Stream2 AS LONG
+DIM SHARED versionFrame AS LONG
+DIM SHARED FileMenuExit AS LONG
+DIM SHARED RMTPLB AS LONG
+DIM SHARED clientsLB AS LONG
+DIM SHARED VideoLB AS LONG
+DIM SHARED AudioLB AS LONG
+DIM SHARED InBytesLB AS LONG
+DIM SHARED OutBytesLB AS LONG
+DIM SHARED InBitssLB AS LONG
+DIM SHARED OutBitssLB AS LONG
+DIM SHARED TimeLB AS LONG
+DIM SHARED rtmp_nacceptedLB AS LONG
+DIM SHARED rtmp_codec_nclientsLB AS LONG
+DIM SHARED rtmp_codec_videoLB AS LONG
+DIM SHARED rtmp_codec_audioLB AS LONG
+DIM SHARED rtmp_bytes_inLB AS LONG
+DIM SHARED rtmp_bytes_outLB AS LONG
+DIM SHARED rtmp_bw_inLB AS LONG
+DIM SHARED rtmp_bw_outLB AS LONG
+DIM SHARED rtmp_uptimeLB AS LONG
+DIM SHARED InBytesDifferenceLB AS LONG
+DIM SHARED StreamFailTimerLB AS LONG
+DIM SHARED FailCountLB AS LONG
+DIM SHARED ServerPingLB AS LONG
+DIM SHARED UpdateIntervalLB AS LONG
+DIM SHARED Kb_DiffLB AS LONG
+DIM SHARED Timer_FailLB AS LONG
+DIM SHARED Timer_Fail_CountLB AS LONG
+DIM SHARED tPingOutLB AS LONG
+DIM SHARED td_updateLB AS LONG
+DIM SHARED BandwidthThresholdLB AS LONG
+DIM SHARED StreamFailDelayLB AS LONG
+DIM SHARED MultiCameraSwitchLB AS LONG
+DIM SHARED Bandwidth_ThresholdLB AS LONG
+DIM SHARED Stream_Fail_DelayLB AS LONG
+DIM SHARED MultiCameraSwitchStatusLB AS LONG
+DIM SHARED TimerLB AS LONG
+DIM SHARED TimerSnapshotLB AS LONG
+DIM SHARED td_displayVarLB AS LONG
+DIM SHARED mouseXVarLB AS LONG
+DIM SHARED mouseYVarLB AS LONG
+DIM SHARED __ERRORLINEVarLB AS LONG
+DIM SHARED Debug_TimerLB AS LONG
+DIM SHARED Debug_Timer_SnapshotLB AS LONG
+DIM SHARED td_displayLB AS LONG
+DIM SHARED mouseXLB AS LONG
+DIM SHARED mouseYLB AS LONG
+DIM SHARED __ERRORLINELB AS LONG
+DIM SHARED InBytesLB2 AS LONG
+DIM SHARED InBytesDifferenceLB2 AS LONG
+DIM SHARED failLB AS LONG
+DIM SHARED multiStream1LB AS LONG
+DIM SHARED Kb_Diff_stream1LB AS LONG
+DIM SHARED Timer_Fail_Stream1LB AS LONG
+DIM SHARED Scene_CurrentLB AS LONG
+DIM SHARED PictureBox1 AS LONG
+DIM SHARED InBytesLB3 AS LONG
+DIM SHARED InBytesDifferenceLB3 AS LONG
+DIM SHARED failLB2 AS LONG
+DIM SHARED multiStream2LB AS LONG
+DIM SHARED Kb_Diff_stream2LB AS LONG
+DIM SHARED Timer_Fail_Stream2LB AS LONG
+DIM SHARED OptionsMenuDebug AS LONG
+DIM SHARED HelpMenuVisitWebsite AS LONG
+DIM SHARED HelpMenuCheckForUpdates AS LONG
+DIM SHARED OptionsMenuFullscreen AS LONG
+DIM SHARED IndicatorLB AS LONG
+DIM SHARED HelpMenuAbout AS LONG
+DIM SHARED StatusLB AS LONG
+DIM SHARED PictureBoxLogoBottom AS LONG
+DIM SHARED OBSRemoteLB AS LONG
+DIM SHARED OBS_RemoteLB AS LONG
+
+'InForm v1.3 or newer required else this section gets removed (InForm_Deleted.bas)
+DEFINT A-Z
+COMMON SHARED Error_Display AS STRING
+COMMON SHARED Error_msg AS STRING
+COMMON SHARED Ver AS STRING
+COMMON SHARED VerDate AS STRING
+COMMON SHARED bout AS STRING
+COMMON SHARED tout AS STRING
+COMMON SHARED BG_Count AS LONG
+COMMON SHARED ConnErr
+COMMON SHARED Refresh_Request
+COMMON SHARED RefreshDisplayRequest
+COMMON SHARED rtmp_uptime#
+COMMON SHARED ba&
+COMMON SHARED winstyle&
+COMMON SHARED timerFree
+COMMON SHARED BG AS DOUBLE
+COMMON SHARED BG_New AS DOUBLE
+COMMON SHARED BGA AS DOUBLE
+COMMON SHARED __BGA AS _BYTE
+COMMON SHARED SpaceLength AS INTEGER
+COMMON SHARED ProgressCounter AS INTEGER
+COMMON SHARED updateResult AS STRING
+COMMON SHARED updateDisplay AS INTEGER
+COMMON SHARED updateDisplayCounter AS INTEGER
+COMMON SHARED verCheck AS STRING
+COMMON SHARED CheckUpdateOnStartup AS STRING
+COMMON SHARED file224 AS STRING
+COMMON SHARED __FileStatusOutput AS _BYTE
+COMMON SHARED FileStatusOutput AS STRING
+COMMON SHARED outputBitrateFile AS STRING
+COMMON SHARED outputStatusFile AS STRING
+COMMON SHARED iniFeatures AS _BYTE
+COMMON SHARED Debug AS _BYTE
+COMMON SHARED q
+COMMON SHARED Timer_Failed AS _BYTE
+COMMON SHARED WebsocketMethod AS STRING
+COMMON SHARED MediaSource1 AS STRING
+COMMON SHARED MediaSource2 AS STRING
+COMMON SHARED MediaSource1Time AS LONG
+COMMON SHARED MediaSource2Time AS LONG
+COMMON SHARED c34 AS STRING
+
+COMMON SHARED image_data() AS _UNSIGNED LONG
+COMMON SHARED Scene_OK AS STRING
+COMMON SHARED Scene_Fail AS STRING
+COMMON SHARED Scene_Intro AS STRING
+COMMON SHARED URL AS STRING
+COMMON SHARED Port AS STRING
+COMMON SHARED OBS_URL AS STRING
+COMMON SHARED OBS_PW AS STRING
+COMMON SHARED urlStream1 AS STRING
+COMMON SHARED urlStream2 AS STRING
+COMMON SHARED titleScene1 AS STRING
+COMMON SHARED titleScene2 AS STRING
+COMMON SHARED titleScene12 AS STRING
+COMMON SHARED returnPreviousScene AS STRING
+COMMON SHARED shell_obscommand_1 AS STRING
+COMMON SHARED shell_obscommand_2 AS STRING
+COMMON SHARED shell_nodejs_1 AS STRING
+COMMON SHARED shell_nodejs_2 AS STRING
+
+COMMON SHARED config_dir AS STRING
+COMMON SHARED obscommand_dir AS STRING
+COMMON SHARED nodejs_dir AS STRING
+COMMON SHARED temp_dir AS STRING
+COMMON SHARED config_main AS STRING
+COMMON SHARED obs_change_scene AS STRING
+COMMON SHARED obs_get_scene AS STRING
+COMMON SHARED obs_get_media1 AS STRING
+COMMON SHARED obs_get_media2 AS STRING
+COMMON SHARED filePrevious AS STRING
+COMMON SHARED fileStat AS STRING
+COMMON SHARED fileCheckVersion AS STRING
+COMMON SHARED obscommand_file AS STRING
+
+COMMON SHARED Exe_OK AS _BYTE
+COMMON SHARED Exe_Fail AS _BYTE
+COMMON SHARED Exe_Fail_First AS _BYTE
+COMMON SHARED Exe_Fail_First_Stream1 AS _BYTE
+COMMON SHARED Exe_Fail_First_Stream2 AS _BYTE
+
+COMMON SHARED __MultiCameraSwitch AS _BYTE
+
+'Tooltips
+COMMON SHARED rtmp_codec_video_level$
+COMMON SHARED rtmp_codec_video_profile$
+COMMON SHARED rtmp_codec_audio_channels$
+COMMON SHARED rtmp_codec_audio_samplerate$
+COMMON SHARED rtmp_codec_audio_profile$
+COMMON SHARED rtmp_codec_video_width$
+COMMON SHARED rtmp_codec_video_height$
+COMMON SHARED rtmp_codec_video_resolution$
+COMMON SHARED rtmp_codec_version$
+COMMON SHARED rtmp_codec_rtmp_version$
+
+'Timer01
+COMMON SHARED mouseX
+COMMON SHARED mouseY
+COMMON SHARED Timer_Fail AS INTEGER
+COMMON SHARED Timer_Fail_Count AS INTEGER
+COMMON SHARED Timer_Fail_Stream1 AS INTEGER
+COMMON SHARED Timer_Fail_Stream2 AS INTEGER
+COMMON SHARED FullScreen AS _BYTE
+COMMON SHARED BG
+COMMON SHARED srt_warmup AS _BYTE
+COMMON SHARED Port_Client$
+COMMON SHARED td_update#
+COMMON SHARED timer1#
+COMMON SHARED Debug_Timer#
+COMMON SHARED __returnPreviousScene
+COMMON SHARED returnPreviousSceneTime AS _BYTE
+COMMON SHARED returnFirstCheck
+COMMON SHARED filePrevious
+COMMON SHARED PUT_Refresh
+COMMON SHARED NoKill
+COMMON SHARED file92$
+COMMON SHARED file96$
+COMMON SHARED findSceneName
+COMMON SHARED findSceneName2
+COMMON SHARED streamsUp$
+COMMON SHARED previousScene$
+COMMON SHARED previousSceneDisplay$
+COMMON SHARED rtmp_naccepted$
+COMMON SHARED rtmp_bytes_in$
+COMMON SHARED rtmp_bytes_out$
+COMMON SHARED rtmp_bw_in$
+COMMON SHARED rtmp_bw_out$
+COMMON SHARED rtmp_codec_video$
+COMMON SHARED rtmp_codec_audio$
+COMMON SHARED rtmp_codec_nclients$
+COMMON SHARED rtmp_codec_nclients#
+COMMON SHARED rtmp_codec_nclients_temp#
+COMMON SHARED a$
+COMMON SHARED a2$
+COMMON SHARED d$
+COMMON SHARED I
+COMMON SHARED i2
+COMMON SHARED i3
+COMMON SHARED stats_rtmp.xml$
+COMMON SHARED tPing1#
+COMMON SHARED client
+COMMON SHARED tPing2#
+COMMON SHARED tPingOut#
+COMMON SHARED EOL$
+COMMON SHARED Timer_GET!
+COMMON SHARED __MultiCameraSwitch
+COMMON SHARED Stream%
+COMMON SHARED multiStream1#
+COMMON SHARED multiStream2#
+COMMON SHARED pos_xml_m&
+COMMON SHARED Kb_Diff#
+COMMON SHARED Bandwidth_Threshold
+COMMON SHARED rtmp_bytes_in#
+COMMON SHARED rtmp_bytes_in_temp1#
+COMMON SHARED rtmp_bytes_in_temp2#
+COMMON SHARED Stream_Fail_Delay
+COMMON SHARED SD
+COMMON SHARED Kb_Diff_stream1#
+COMMON SHARED multiStream1_temp1#
+COMMON SHARED multiStream1_temp2#
+COMMON SHARED Kb_Diff_stream2#
+COMMON SHARED multiStream2_temp1#
+COMMON SHARED multiStream2_temp2#
+COMMON SHARED Scene_OK
+COMMON SHARED Scene_Fail
+COMMON SHARED Scene_Intro
+COMMON SHARED Exe_OK
+COMMON SHARED Scene_Current$
+COMMON SHARED Exe_Fail
+COMMON SHARED lastStreamUp$
+COMMON SHARED returnPreviousSceneRemember
+COMMON SHARED titleScene1
+COMMON SHARED titleScene2
+COMMON SHARED titleScene12
+COMMON SHARED OBS_URL
+COMMON SHARED OBS_PW
+COMMON SHARED Exe_Fail_First
+COMMON SHARED Timer_Fail_First
+COMMON SHARED Timer_Fail_First_Stream1
+COMMON SHARED Exe_Fail_First_Stream1
+COMMON SHARED Exe_Fail_First_Stream2
+COMMON SHARED Timer_Fail_First_Stream
+COMMON SHARED Timer_Fail_First_Stream2
+COMMON SHARED td_display#
+
+'Misc
+COMMON SHARED FGwin AS LONG
+COMMON SHARED file4_var AS STRING
+COMMON SHARED file4_val AS STRING
+COMMON SHARED BSOD AS LONG
+COMMON SHARED OptionsMenuAlwaysOnTop AS INTEGER
+COMMON SHARED AlwaysOnTop AS INTEGER
+COMMON SHARED Myhwnd AS _UNSIGNED LONG
+COMMON SHARED y AS LONG
+COMMON SHARED HWND_TOPMOST AS LONG
+COMMON SHARED SWP_NOMOVE AS LONG
+COMMON SHARED SWP_NOSIZE AS LONG
+COMMON SHARED SWP_SHOWWINDOW AS LONG
+COMMON SHARED HWND_BOTTOM AS LONG
+COMMON SHARED SWP_NOACTIVATE AS LONG
+COMMON SHARED About AS INTEGER
+COMMON SHARED Answer AS INTEGER
+COMMON SHARED Pt AS LONG
+COMMON SHARED x2 AS INTEGER
+COMMON SHARED Px AS INTEGER
+COMMON SHARED Py AS INTEGER
+COMMON SHARED NULL AS INTEGER
+COMMON SHARED xHeader1 AS STRING
+COMMON SHARED xHeader2 AS STRING
+COMMON SHARED xHeader3 AS STRING
+COMMON SHARED xHeader4 AS STRING
+COMMON SHARED xHeader5 AS STRING
+COMMON SHARED xHeader6 AS STRING
+COMMON SHARED xHeader7 AS STRING
+COMMON SHARED xHeader8 AS STRING
+COMMON SHARED xHeader9 AS STRING
+COMMON SHARED x AS STRING
+COMMON SHARED l AS INTEGER
+COMMON SHARED rtmp_naccepted AS DOUBLE
+COMMON SHARED rtmp_bytes_out AS DOUBLE
+COMMON SHARED rtmp_bw_in AS DOUBLE
+COMMON SHARED rtmp_bw_out AS DOUBLE
+
+'OnLoad
+COMMON SHARED config_dir
+COMMON SHARED config_main
+COMMON SHARED URL
+COMMON SHARED Port
+COMMON SHARED fileStat
+COMMON SHARED Desktop_Width_Position
+COMMON SHARED Desktop_Height_Position
+COMMON SHARED file4$
+COMMON SHARED EqualFound
+COMMON SHARED MultiCameraSwitch$
+COMMON SHARED urlStream1
+COMMON SHARED urlStream2
+COMMON SHARED returnPreviousScene
+COMMON SHARED returnPreviousSceneRemember$
+
+
+'SUB Indicators
+COMMON SHARED AliveIndicator!
+COMMON SHARED __BGA
+COMMON SHARED BGA
+COMMON SHARED aioffsetX
+COMMON SHARED aioffsetY
+
+'SUB TIMEms
+COMMON SHARED tout
+COMMON SHARED tout#
+COMMON SHARED tout2#
+COMMON SHARED toutint#
+COMMON SHARED toutdec#
+COMMON SHARED plus
+
+'SUB calcbw
+COMMON SHARED bout
+COMMON SHARED bout2#
+COMMON SHARED bout#
+COMMON SHARED boutnodec
+COMMON SHARED bits
+COMMON SHARED boutint#
+COMMON SHARED boutm$
+COMMON SHARED boutdec#
+COMMON SHARED boutdec$
+
+'FUNC calc_srt$
+COMMON SHARED convertTime#
+COMMON SHARED includeSec
+COMMON SHARED t_hr
+COMMON SHARED t_min
+COMMON SHARED t_sec
+
+COMMON SHARED RED_WARNING AS _UNSIGNED LONG
+COMMON SHARED RED_FAIL AS _UNSIGNED LONG
+COMMON SHARED GREEN_OK AS _UNSIGNED LONG
+
+RED_WARNING = _RGB32(205, 64, 32)
+RED_FAIL = _RGB32(255, 32, 16)
+GREEN_OK = _RGB32(123, 151, 163)
+
+q = _EXIT
+
+PUT_Fail:
+IF ERR THEN CLS: _PRINTSTRING (20, 30), "ERR, _ERRORLINE:" + STR$(ERR) + "," + STR$(_ERRORLINE): _AUTODISPLAY: _DELAY 3: IF PUT_Refresh = 1 THEN PUT_Refresh = 0: Refresh_Request = 1: RESUME NEXT ELSE RESUME NEXT
+'END (InForm_Deleted.bas)
+
+': External modules: ---------------------------------------------------------------
+'$INCLUDE:'InForm\InForm.ui'
+'$INCLUDE:'InForm\xp.uitheme'
+'$INCLUDE:'loopy_srt_monitor.frm'
+
+': Event procedures: ---------------------------------------------------------------
+': External modules: ---------------------------------------------------------------
+'$INCLUDE:'loopy_srt_monitor_light.frm'
+'$INCLUDE:'image.png.MEM'
+': ---------------------------------------------------------------------------------
+SUB __UI_BeforeInit
+ $VERSIONINFO:CompanyName=loopy750
+ $VERSIONINFO:ProductName=Loopy SRT Monitor
+ $VERSIONINFO:Comments=Monitor SRT Streams
+ $VERSIONINFO:FileDescription=Loopy SRT Monitor
+ $VERSIONINFO:FILEVERSION#=0,9,0,0
+ $VERSIONINFO:PRODUCTVERSION#=0,9,0,0
+ $CHECKING:ON
+ $RESIZE:OFF
+ IF ERR = 0 THEN
+ $EXEICON:'.\icon.ico'
+ _TITLE "Loopy SRT Monitor - loopy750"
+ END IF
+ Ver = "0.9.0"
+ VerDate = "05/21"
+
+ 'Always on top : ------------------------------------------------------------------
+ CONST HWND_TOPMOST%& = -1
+ CONST SWP_NOSIZE%& = &H1
+ CONST SWP_NOMOVE%& = &H2
+ CONST SWP_SHOWWINDOW%& = &H40
+
+ DECLARE DYNAMIC LIBRARY "user32"
+ FUNCTION SetWindowPos& (BYVAL hWnd AS LONG, BYVAL hWndInsertAfter AS _OFFSET, BYVAL X AS INTEGER, BYVAL Y AS INTEGER, BYVAL cx AS INTEGER, BYVAL cy AS INTEGER, BYVAL uFlags AS _OFFSET)
+ FUNCTION GetForegroundWindow& 'find currently focused process handle
+ END DECLARE
+
+ 'DIM Myhwnd AS _UNSIGNED LONG 'Commented until Always on top can work
+ 'Myhwnd = _WINDOWHANDLE
+
+ FGwin& = GetForegroundWindow&
+ '----------------------------------------------------------------------------------
+END SUB
+
+SUB __UI_OnLoad
+ 'SRT
+ SetCaption rtmp_nacceptedLB, "-"
+ SetCaption rtmp_codec_nclientsLB, "-"
+ SetCaption rtmp_codec_videoLB, "-"
+ SetCaption rtmp_codec_audioLB, "-"
+ SetCaption rtmp_bytes_inLB, "-"
+ SetCaption rtmp_bytes_outLB, "-"
+ SetCaption rtmp_bw_inLB, "-"
+ SetCaption rtmp_bw_outLB, "-"
+ SetCaption rtmp_uptimeLB, "-"
+ 'Status
+ SetCaption Kb_DiffLB, "-"
+ SetCaption Timer_FailLB, "-"
+ SetCaption Timer_Fail_CountLB, "-"
+ SetCaption tPingOutLB, "-"
+ SetCaption td_updateLB, "-"
+ 'Settings
+ SetCaption Bandwidth_ThresholdLB, "-"
+ SetCaption Stream_Fail_DelayLB, "-"
+ SetCaption MultiCameraSwitchStatusLB, "-"
+ SetCaption OBS_RemoteLB, "-"
+ 'Stream #1
+ SetCaption multiStream1LB, "-"
+ SetCaption Kb_Diff_stream1LB, "-"
+ SetCaption Timer_Fail_Stream1LB, "-"
+ 'Stream #2
+ SetCaption multiStream2LB, "-"
+ SetCaption Kb_Diff_stream2LB, "-"
+ SetCaption Timer_Fail_Stream2LB, "-"
+ 'Current Scene
+ SetCaption Scene_CurrentLB, "-"
+ 'Debug
+ SetCaption Debug_TimerLB, "-"
+ SetCaption Debug_Timer_SnapshotLB, "-"
+ SetCaption td_displayLB, "-"
+ SetCaption mouseXLB, "-"
+ SetCaption mouseYLB, "-"
+ SetCaption __ERRORLINELB, "-"
+ 'Debug titles
+ SetCaption TimerLB, "-"
+ SetCaption TimerSnapshotLB, "-"
+ SetCaption td_displayVarLB, "-"
+ SetCaption mouseXVarLB, "-"
+ SetCaption mouseYVarLB, "-"
+ SetCaption __ERRORLINEVarLB, "-"
+
+ 'Variables
+ c34 = CHR$(34)
+ BG = _RGB(32, 32, 32)
+ Exe_OK = 1
+ URL = "127.0.0.1"
+ Port = "8080"
+ fileStat = "stat"
+
+ 'File variables
+ config_dir = _DIR$("documents") + "Loopy SRT Monitor"
+ obscommand_dir = _DIR$("documents") + "Loopy SRT Monitor\OBSCommand"
+ nodejs_dir = _DIR$("documents") + "Loopy SRT Monitor\js"
+ temp_dir = _DIR$("documents") + "Loopy SRT Monitor\Temp"
+ config_main = config_dir + "\config.ini"
+ obs_change_scene = config_dir + "\js\obs_change_scene.js"
+ obs_get_scene = config_dir + "\js\obs_get_scene.js"
+ obs_get_media1 = config_dir + "\js\obs_get_media1.js"
+ obs_get_media2 = config_dir + "\js\obs_get_media2.js"
+ obscommand_file = obscommand_dir + "\OBSCommand.exe"
+ filePrevious = temp_dir + "\returnPreviousScene.tmp"
+ fileCheckVersion = temp_dir + "\checkversion.txt"
+ outputBitrateFile = temp_dir + "\outputBitrate.txt"
+ outputStatusFile = temp_dir + "\outputStatus.txt"
+
+ IF _DIREXISTS(config_dir) THEN IF NOT _DIREXISTS(temp_dir) THEN MKDIR temp_dir
+ IF _FILEEXISTS(filePrevious) THEN KILL filePrevious
+ _ALLOWFULLSCREEN OFF
+ RANDOMIZE TIMER
+
+ 'Check config
+ Bandwidth_Threshold = 25
+ Stream_Fail_Delay = 10
+ Desktop_Width_Position = 160
+ Desktop_Height_Position = 100
+ IF NOT _FILEEXISTS(config_main) THEN RefreshDisplayRequest = 1: Error_msg$ = "- Unable to read config file in the " + c34 + "Documents\Loopy SRT Monitor" + c34 + " folder" + CHR$(10) + "- File " + c34 + config_main + c34 + " cannot be accessed, check if it exists. (#1)": _DELAY 3
+ IF _FILEEXISTS(config_main) THEN
+ OPEN config_main FOR INPUT AS #4 'Basic INI management, nothing fancy needed
+ DO
+ LINE INPUT #4, file4$
+ IF LEFT$(file4$, 1) <> "#" AND LEFT$(file4$, 1) <> ";" AND LEFT$(file4$, 1) <> "" THEN
+ EqualFound = INSTR(file4$, "=")
+ IF EqualFound THEN
+ file4_var$ = LEFT$(file4$, INSTR(file4$, "=") - 1)
+ file4_val$ = MID$(file4$, INSTR(file4$, "=") + 1)
+ file4_var$ = LCASE$(file4_var$)
+ 'IF file4_var$ = "bandwidththreshold" THEN Bandwidth_Threshold = VAL(file4_val$)
+ IF file4_var$ = "streamfaildelay" THEN Stream_Fail_Delay = VAL(file4_val$)
+ IF file4_var$ = "xwindow" THEN Desktop_Width_Position = VAL(file4_val$)
+ IF file4_var$ = "ywindow" THEN Desktop_Height_Position = VAL(file4_val$)
+ IF file4_var$ = "sceneok" THEN Scene_OK = file4_val$
+ IF file4_var$ = "scenefail" THEN Scene_Fail = file4_val$
+ IF file4_var$ = "sceneintro" THEN Scene_Intro = file4_val$
+ 'IF file4_var$ = "serverip" THEN URL = file4_val$
+ 'IF file4_var$ = "serverport" THEN Port = file4_val$
+ IF file4_var$ = "mediasource1" THEN MediaSource1 = file4_val$
+ IF file4_var$ = "mediasource2" THEN MediaSource2 = file4_val$
+ IF file4_var$ = "websocketaddress" THEN OBS_URL = file4_val$
+ IF file4_var$ = "websocketpassword" THEN OBS_PW = file4_val$
+ 'IF file4_var$ = "websocketmethod" THEN WebsocketMethod = file4_val$
+ IF file4_var$ = "filestatusoutput" THEN FileStatusOutput = file4_val$
+ IF file4_var$ = "checkupdateonstartup" THEN CheckUpdateOnStartup = file4_val$
+ IF file4_var$ = "multicameraswitch" THEN MultiCameraSwitch$ = file4_val$
+ 'IF file4_var$ = "urlstream1" THEN urlStream1 = file4_val$
+ 'IF file4_var$ = "urlstream2" THEN urlStream2 = file4_val$
+ IF file4_var$ = "titlescene1" THEN titleScene1 = file4_val$
+ IF file4_var$ = "titlescene2" THEN titleScene2 = file4_val$
+ IF file4_var$ = "titlescene12" THEN titleScene12 = file4_val$
+ IF file4_var$ = "returnpreviousscene" THEN returnPreviousScene = file4_val$
+ IF file4_var$ = "returnprevioussceneremember" THEN returnPreviousSceneRemember$ = file4_val$
+ END IF
+ END IF
+ LOOP UNTIL EOF(4)
+ CLOSE #4
+
+ IF Scene_OK = "" OR Scene_Fail = "" OR Scene_Intro = "" OR OBS_URL = "" OR OBS_PW = "" OR FileStatusOutput = "" OR CheckUpdateOnStartup = "" OR MultiCameraSwitch$ = "" OR titleScene1 = "" OR titleScene2 = "" OR titleScene12 = "" OR returnPreviousScene = "" OR returnPreviousSceneRemember$ = "" THEN verCheck$ = "Settings missing in 'config.ini' file, check 'readme.txt'...": iniFeatures = 1
+
+ IF Bandwidth_Threshold < 0 THEN
+ Bandwidth_Threshold = 0
+ ELSEIF Bandwidth_Threshold > 9999 THEN Bandwidth_Threshold = 9999
+ END IF
+
+ IF Stream_Fail_Delay < 3 THEN
+ Stream_Fail_Delay = 3
+ ELSEIF Stream_Fail_Delay > 99 THEN Stream_Fail_Delay = 99
+ END IF
+
+ IF Desktop_Width_Position < -(_DESKTOPWIDTH * 4) THEN Desktop_Width_Position = -(_DESKTOPWIDTH * 4)
+ IF Desktop_Width_Position > (_DESKTOPWIDTH * 4) THEN Desktop_Width_Position = (_DESKTOPWIDTH * 4)
+ IF Desktop_Width_Position < -9999 THEN Desktop_Width_Position = -9999
+
+ IF Desktop_Height_Position < -(_DESKTOPHEIGHT * 4) THEN Desktop_Height_Position = -(_DESKTOPHEIGHT * 4)
+ IF Desktop_Height_Position > (_DESKTOPHEIGHT * 4) THEN Desktop_Height_Position = (_DESKTOPHEIGHT * 4)
+ IF Desktop_Height_Position < -9999 THEN Desktop_Height_Position = -9999
+
+ IF Desktop_Width_Position < -9999 AND Desktop_Height_Position = -9999 THEN
+ ELSE
+ _SCREENMOVE Desktop_Width_Position, Desktop_Height_Position
+ END IF
+ END IF
+ IF MultiCameraSwitch$ = "true" THEN __MultiCameraSwitch = 1 ELSE __MultiCameraSwitch = 0
+ IF returnPreviousScene = "true" THEN __returnPreviousScene = 1 ELSE __returnPreviousScene = 0
+ IF FileStatusOutput = "true" THEN __FileStatusOutput = 1 ELSE __FileStatusOutput = 0
+ IF returnPreviousSceneRemember$ = "true" THEN returnPreviousSceneRemember = 1 ELSE returnPreviousSceneRemember = 0
+ IF __MultiCameraSwitch = 0 THEN __returnPreviousScene = 0: returnPreviousSceneRemember = 0
+ WebsocketMethod = "nodejs"
+ IF WebsocketMethod <> "nodejs" THEN WebsocketMethod = "obscommand"
+
+ IF WebsocketMethod = "nodejs" AND NOT _DIREXISTS(nodejs_dir) THEN
+ Error_msg$ = "- Folder " + c34 + nodejs_dir + c34 + " cannot be accessed, check if it exists. (#2)"
+ ELSEIF WebsocketMethod = "obscommand" AND NOT _DIREXISTS(obscommand_dir) THEN
+ Error_msg$ = "- Folder " + c34 + obscommand_dir + c34 + " cannot be accessed, check if it exists. (#2)"
+ END IF
+ IF Error_msg$ <> "" THEN
+ _DELAY 1
+ CLS , _RGB(1, 120, 220)
+ BSOD& = __imageMEM&("face_sad_x.png")
+ _PUTIMAGE (50, 50)-(107, 162), BSOD&
+ _FREEIMAGE BSOD&
+ COLOR _RGB(254, 254, 254), _RGB(1, 120, 220)
+ _PRINTSTRING (37, 12 * 18), "Program encountered an error and needs to restart."
+ IF INSTR(Error_msg$, CHR$(10)) >= 1 THEN
+ _PRINTSTRING (37, 14 * 18), LEFT$(Error_msg$, INSTR(Error_msg$, CHR$(10)) - 1)
+ _PRINTSTRING (37, 15 * 18), MID$(Error_msg$, INSTR(Error_msg$, CHR$(10)) + 1)
+ ELSE
+ _PRINTSTRING (37, 14 * 18), Error_msg$
+ END IF
+ _PRINTSTRING (37, 22 * 18), "Program will exit shortly"
+ _DISPLAY
+ _DELAY 15
+ SYSTEM
+ END IF
+
+ shell_obscommand_1 = "%ComSpec% /C " + c34 + c34 + obscommand_file + c34 + " /server=" + OBS_URL + " /password=" + OBS_PW + " /scene=" + c34
+ shell_obscommand_2 = c34 + c34
+ shell_nodejs_1 = "%ComSpec% /C node.exe " + c34 + obs_change_scene + c34 + " "
+ shell_nodejs_2 = ""
+
+ IF WebsocketMethod = "nodejs" THEN
+ OPEN obs_change_scene FOR OUTPUT AS #64
+ PRINT #64, "// This file has been automatically generated"
+ PRINT #64, "// Any changes made will be lost"
+ PRINT #64, "// https://github.com/loopy750/SRT-Stats-Monitor"
+ PRINT #64, "const OBSWebSocket = require('obs-websocket-js');"
+ PRINT #64, "const obs = new OBSWebSocket();"
+ PRINT #64, "const WebsocketAddress = " + c34 + OBS_URL + c34 + ";"
+ PRINT #64, "const WebsocketPassword = " + c34 + OBS_PW + c34 + ";"
+ PRINT #64, "var sceneName_1 = process.argv[2];"
+ PRINT #64, "var sceneName_2 = process.argv[3];"
+ PRINT #64, "var sceneName_3 = process.argv[4];"
+ PRINT #64, "var sceneName_4 = process.argv[5];"
+ PRINT #64, "var sceneName_5 = process.argv[6];"
+ PRINT #64, "var sceneName_6 = process.argv[7];"
+ PRINT #64, "var sceneName_7 = process.argv[8];"
+ PRINT #64, "var sceneName_8 = process.argv[9];"
+ PRINT #64, "if (sceneName_2 === undefined) { var sceneName_2 = '' } else { var sceneName_1 = sceneName_1 + " + c34 + " " + c34 + " }"
+ PRINT #64, "if (sceneName_3 === undefined) { var sceneName_3 = '' } else { var sceneName_2 = sceneName_2 + " + c34 + " " + c34 + " }"
+ PRINT #64, "if (sceneName_4 === undefined) { var sceneName_4 = '' } else { var sceneName_3 = sceneName_3 + " + c34 + " " + c34 + " }"
+ PRINT #64, "if (sceneName_5 === undefined) { var sceneName_5 = '' } else { var sceneName_4 = sceneName_4 + " + c34 + " " + c34 + " }"
+ PRINT #64, "if (sceneName_6 === undefined) { var sceneName_6 = '' } else { var sceneName_5 = sceneName_5 + " + c34 + " " + c34 + " }"
+ PRINT #64, "if (sceneName_7 === undefined) { var sceneName_7 = '' } else { var sceneName_6 = sceneName_6 + " + c34 + " " + c34 + " }"
+ PRINT #64, "if (sceneName_8 === undefined) { var sceneName_8 = '' } else { var sceneName_7 = sceneName_7 + " + c34 + " " + c34 + " }"
+ PRINT #64, "obs.connect({ address: WebsocketAddress, password: WebsocketPassword })"
+ PRINT #64, ".then(() => { return obs.send('GetSceneList'); })"
+ PRINT #64, ".then(data => { data.scenes.forEach(scene => {"
+ PRINT #64, " if (scene.name !== data.currentScene) {"
+ PRINT #64, " // console.log(`${scene.name}`);"
+ PRINT #64, " obs.send('SetCurrentScene', {"
+ PRINT #64, " 'scene-name': sceneName_1 + sceneName_2 + sceneName_3 + sceneName_4 + sceneName_5 + sceneName_6 + sceneName_7 + sceneName_8"
+ PRINT #64, " });"
+ PRINT #64, " }"
+ PRINT #64, " });"
+ PRINT #64, "})"
+ PRINT #64, ".then(() => { obs.disconnect(); });"
+ CLOSE #64
+
+ OPEN obs_get_scene FOR OUTPUT AS #72
+ PRINT #72, "// This file has been automatically generated"
+ PRINT #72, "// Any changes made will be lost"
+ PRINT #72, "// https://github.com/loopy750/SRT-Stats-Monitor"
+ PRINT #72, "const OBSWebSocket = require('obs-websocket-js');"
+ PRINT #72, "const obs = new OBSWebSocket();"
+ PRINT #72, "const WebsocketAddress = " + c34 + OBS_URL + c34 + ";"
+ PRINT #72, "const WebsocketPassword = " + c34 + OBS_PW + c34 + ";"
+ PRINT #72, "obs.connect({ address: WebsocketAddress, password: WebsocketPassword })"
+ PRINT #72, ".then(() => { return obs.send('GetCurrentScene'); })"
+ PRINT #72, ".then(data => { data.sources.forEach(sources => {"
+ PRINT #72, " console.log(`${data.name}`);"
+ PRINT #72, " });"
+ PRINT #72, "})"
+ PRINT #72, ".then(() => { obs.disconnect(); });"
+ CLOSE #72
+
+ OPEN obs_get_media1 FOR OUTPUT AS #72
+ PRINT #72, "// This file has been automatically generated"
+ PRINT #72, "// Any changes made will be lost"
+ PRINT #72, "// https://github.com/loopy750/SRT-Stats-Monitor"
+ PRINT #72, "const OBSWebSocket = require('obs-websocket-js');"
+ PRINT #72, "const obs = new OBSWebSocket();"
+ PRINT #72, "const WebsocketAddress = " + c34 + OBS_URL + c34 + ";"
+ PRINT #72, "const WebsocketPassword = " + c34 + OBS_PW + c34 + ";"
+ PRINT #72, "var timer1 = setTimeout(function() { obs.disconnect(); }, 3000);"
+ PRINT #72, "obs.connect({ address: WebsocketAddress, password: WebsocketPassword })"
+
+ PRINT #72, ".then(() => {"
+ PRINT #72, " return obs.send('GetMediaTime', {"
+ PRINT #72, " 'sourceName': " + c34 + MediaSource1 + c34
+ PRINT #72, " })"
+ PRINT #72, " })"
+ PRINT #72, ".then((data) => {"
+ PRINT #72, " console.log(`${data.timestamp}`);"
+ PRINT #72, "})"
+
+ PRINT #72, ".then(() => { obs.disconnect(); clearTimeout(timer1); });"
+ CLOSE #72
+
+ OPEN obs_get_media2 FOR OUTPUT AS #72
+ PRINT #72, "// This file has been automatically generated"
+ PRINT #72, "// Any changes made will be lost"
+ PRINT #72, "// https://github.com/loopy750/SRT-Stats-Monitor"
+ PRINT #72, "const OBSWebSocket = require('obs-websocket-js');"
+ PRINT #72, "const obs = new OBSWebSocket();"
+ PRINT #72, "const WebsocketAddress = " + c34 + OBS_URL + c34 + ";"
+ PRINT #72, "const WebsocketPassword = " + c34 + OBS_PW + c34 + ";"
+ PRINT #72, "var timer1 = setTimeout(function() { obs.disconnect(); }, 3000);"
+ PRINT #72, "obs.connect({ address: WebsocketAddress, password: WebsocketPassword })"
+
+ PRINT #72, ".then(() => {"
+ PRINT #72, " return obs.send('GetMediaTime', {"
+ PRINT #72, " 'sourceName': " + c34 + MediaSource1 + c34
+ PRINT #72, " })"
+ PRINT #72, " })"
+ PRINT #72, ".then((data) => {"
+ PRINT #72, " console.log(`${data.timestamp}`);"
+ PRINT #72, "})"
+ PRINT #72, ".then(() => {"
+ PRINT #72, " return obs.send('GetMediaTime', {"
+ PRINT #72, " 'sourceName': " + c34 + MediaSource2 + c34
+ PRINT #72, " })"
+ PRINT #72, "})"
+ PRINT #72, ".then((data) => {"
+ PRINT #72, " console.log(`${data.timestamp}`);"
+ PRINT #72, "})"
+
+ PRINT #72, ".then(() => { obs.disconnect(); clearTimeout(timer1); });"
+ CLOSE #72
+ END IF
+
+ IF CheckUpdateOnStartup = "true" AND iniFeatures = 0 THEN
+ file224$ = ""
+ updateResult$ = ""
+ _DELAY .25
+ SHELL _HIDE "%ComSpec% /C curl -H " + c34 + "Cache-Control: no-cache" + c34 + " https://raw.githubusercontent.com/loopy750/SRT-Stats-Monitor-Version/master/checkversion.txt > " + c34 + fileCheckVersion + c34 + ""
+ _DELAY .25
+ IF _FILEEXISTS(fileCheckVersion) THEN
+ OPEN fileCheckVersion FOR INPUT AS #224
+ DO UNTIL EOF(224)
+ IF LOF(224) = 0 THEN NoKill = 1: EXIT DO 'Overkill with EOF checking, but just being safe
+ IF EOF(224) THEN EXIT DO
+ LINE INPUT #224, file224$
+ LOOP
+ END IF
+ CLOSE #224
+ IF _FILEEXISTS(fileCheckVersion) THEN KILL fileCheckVersion
+ updateResult$ = file224$
+ IF file224$ <> Ver THEN verCheck$ = "A new version is available..."
+ IF file224$ = "" OR file224$ = "404: Not Found" THEN verCheck$ = "Unable to check for new version..."
+ IF file224$ = Ver THEN verCheck$ = "You are using the latest version..."
+ END IF
+
+ iniFeatures = 0
+
+ 'Port_Client$ = "TCP/IP:" + Port + ":"
+
+ IF Scene_OK = "" OR Scene_Fail = "" OR Scene_Intro = "" OR URL = "" OR Port = "" OR OBS_URL = "" THEN RefreshDisplayRequest = 1: Error_msg$ = "- Variable/s for scenes empty, check if " + c34 + config_main + c34 + " exists. (#3)": _DELAY 3
+
+ IF __MultiCameraSwitch = 0 THEN
+ Scene_Current$ = Scene_OK
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + Scene_OK
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + Scene_OK + shell_obscommand_2
+ END SELECT
+ END IF
+
+ IF __MultiCameraSwitch = 1 THEN
+ Scene_Current$ = titleScene12
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + titleScene12
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + titleScene12 + shell_obscommand_2
+ END SELECT
+ END IF
+
+ _DELAY .25
+ _TITLE "Loopy SRT Monitor"
+
+ IF __MultiCameraSwitch = 0 THEN
+ Control(Stream1).Hidden = True
+ Control(Stream2).Hidden = True
+ Control(InBytesLB2).Hidden = True
+ Control(InBytesDifferenceLB2).Hidden = True
+ Control(failLB).Hidden = True
+ Control(multiStream1LB).Hidden = True
+ Control(Kb_Diff_stream1LB).Hidden = True
+ Control(Timer_Fail_Stream1LB).Hidden = True
+ Control(InBytesLB3).Hidden = True
+ Control(InBytesDifferenceLB3).Hidden = True
+ Control(failLB2).Hidden = True
+ Control(multiStream2LB).Hidden = True
+ Control(Kb_Diff_stream2LB).Hidden = True
+ Control(Timer_Fail_Stream2LB).Hidden = True
+ END IF
+
+ Control(DebugFrame).Hidden = True
+ Control(versionFrame).Hidden = False
+ LoadImageMEM Control(PictureBoxLogoBottom), "srt_logo_bottom.png"
+ Control(TimerLB).Hidden = True
+ Control(TimerSnapshotLB).Hidden = True
+ Control(td_displayVarLB).Hidden = True
+ Control(mouseXVarLB).Hidden = True
+ Control(mouseYVarLB).Hidden = True
+ Control(__ERRORLINEVarLB).Hidden = True
+ Control(Debug_TimerLB).Hidden = True
+ Control(Debug_Timer_SnapshotLB).Hidden = True
+ Control(td_displayLB).Hidden = True
+ Control(mouseXLB).Hidden = True
+ Control(mouseYLB).Hidden = True
+ Control(__ERRORLINELB).Hidden = True
+ Control(PictureBoxLogoBottom).Hidden = False
+ SetCaption (versionFrame), "v" + Ver
+
+ ON TIMER(1) Timer01
+ TIMER ON
+END SUB
+
+SUB __UI_BeforeUpdateDisplay
+ 'This event occurs at approximately 30 frames per second.
+ 'You can change the update frequency by calling SetFrameRate DesiredRate%
+
+ 'BeforeUpdateDisplay ----------------------------------------------------------------------------------------------------------------------------------------------------
+ IF NOT _WINDOWHASFOCUS THEN SetFrameRate 15 ELSE SetFrameRate 30
+
+ IF RefreshDisplayRequest = 1 THEN
+ RefreshDisplayRequest = 0
+ TIMER STOP
+ CLS , _RGB(1, 120, 220)
+ BSOD& = __imageMEM&("face_sad_x.png")
+ _PUTIMAGE (50, 50)-(107, 162), BSOD&
+ _FREEIMAGE BSOD&
+ COLOR _RGB(254, 254, 254), _RGB(1, 120, 220)
+ _PRINTSTRING (37, 12 * 18), "Program encountered an error and needs to restart."
+ IF INSTR(Error_msg$, CHR$(10)) >= 1 THEN
+ _PRINTSTRING (37, 14 * 18), LEFT$(Error_msg$, INSTR(Error_msg$, CHR$(10)) - 1)
+ _PRINTSTRING (37, 15 * 18), MID$(Error_msg$, INSTR(Error_msg$, CHR$(10)) + 1)
+ ELSE
+ _PRINTSTRING (37, 14 * 18), Error_msg$
+ END IF
+ _PRINTSTRING (37, 22 * 18), "Program will resume shortly"
+ _DISPLAY
+ _DELAY 10
+ CLS , BG
+ TIMER ON
+ END IF
+
+ IF Debug = 1 THEN
+ mouseX = _MOUSEX
+ mouseY = _MOUSEY
+ Debug_Timer# = TIMER(.001)
+ TIMEms Debug_Timer#, 0
+ SetCaption (Debug_TimerLB), tout + " sec "
+ TIMEms td_display#, 1
+ SetCaption (td_displayLB), tout + " sec "
+ SetCaption (mouseXLB), LTRIM$(STR$(mouseX + 1)) + " "
+ SetCaption (mouseYLB), LTRIM$(STR$(mouseY + 1)) + " "
+ SetCaption (__ERRORLINELB), LTRIM$(STR$(_ERRORLINE)) + " "
+ END IF
+
+ IF updateDisplay >= 1 THEN
+ updateDisplayCounter = updateDisplayCounter + 1
+ IF updateDisplayCounter >= 300 THEN
+ file224$ = ""
+ verCheck$ = ""
+ updateResult$ = ""
+ updateDisplay = 0
+ updateDisplayCounter = 0
+ SetCaption StatusLB, ""
+ END IF
+ END IF
+
+ IF _EXIT THEN
+ IF _FILEEXISTS(filePrevious) THEN KILL filePrevious
+ IF _FILEEXISTS(outputBitrateFile) THEN KILL outputBitrateFile
+ IF _FILEEXISTS(outputStatusFile) THEN KILL outputStatusFile
+ SYSTEM
+ END IF
+
+ ProgressCounter = ProgressCounter + 1 '| / - \ | / - \
+ SELECT CASE ProgressCounter
+ CASE 1 TO 8
+ SetCaption IndicatorLB, "|"
+ CASE 9 TO 16
+ SetCaption IndicatorLB, "/"
+ CASE 17 TO 24
+ SetCaption IndicatorLB, "-"
+ CASE 25 TO 32
+ SetCaption IndicatorLB, "\"
+ CASE 33 TO 40
+ SetCaption IndicatorLB, "|"
+ CASE 41 TO 48
+ SetCaption IndicatorLB, "/"
+ CASE 49 TO 56
+ SetCaption IndicatorLB, "-"
+ CASE 57 TO 64
+ SetCaption IndicatorLB, "\"
+ CASE IS >= 64
+ ProgressCounter = 1
+ END SELECT
+ '------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+END SUB
+
+SUB __UI_BeforeUnload
+ 'If you set __UI_UnloadSignal = False here you can
+ 'cancel the user's request to close.
+
+END SUB
+
+SUB __UI_Click (id AS LONG)
+ SELECT CASE id
+ CASE LoopySRTMonitor
+
+ CASE FileMenu
+
+ CASE OptionsMenu
+
+ CASE HelpMenu
+
+ CASE SRT
+
+ CASE Status
+
+ CASE Settings
+
+ CASE CurrentScene
+
+ CASE DebugFrame
+
+ CASE Stream1
+
+ CASE Stream2
+
+ CASE versionFrame
+
+ CASE FileMenuExit
+ IF _FILEEXISTS(filePrevious) THEN KILL filePrevious
+ IF _FILEEXISTS(outputBitrateFile) THEN KILL outputBitrateFile
+ IF _FILEEXISTS(outputStatusFile) THEN KILL outputStatusFile
+ SYSTEM
+
+ CASE RMTPLB
+
+ CASE clientsLB
+
+ CASE VideoLB
+
+ CASE AudioLB
+
+ CASE InBytesLB
+
+ CASE OutBytesLB
+
+ CASE InBitssLB
+
+ CASE OutBitssLB
+
+ CASE TimeLB
+
+ CASE rtmp_nacceptedLB
+
+ CASE rtmp_codec_nclientsLB
+
+ CASE rtmp_codec_videoLB
+
+ CASE rtmp_codec_audioLB
+
+ CASE rtmp_bytes_inLB
+
+ CASE rtmp_bytes_outLB
+
+ CASE rtmp_bw_inLB
+
+ CASE rtmp_bw_outLB
+
+ CASE rtmp_uptimeLB
+
+ CASE InBytesDifferenceLB
+
+ CASE StreamFailTimerLB
+
+ CASE FailCountLB
+
+ CASE ServerPingLB
+
+ CASE UpdateIntervalLB
+
+ CASE Kb_DiffLB
+
+ CASE Timer_FailLB
+
+ CASE Timer_Fail_CountLB
+
+ CASE tPingOutLB
+
+ CASE td_updateLB
+
+ CASE BandwidthThresholdLB
+
+ CASE StreamFailDelayLB
+
+ CASE MultiCameraSwitchLB
+
+ CASE Bandwidth_ThresholdLB
+
+ CASE Stream_Fail_DelayLB
+
+ CASE MultiCameraSwitchStatusLB
+
+ CASE TimerLB
+
+ CASE TimerSnapshotLB
+
+ CASE td_displayVarLB
+
+ CASE mouseXVarLB
+
+ CASE mouseYVarLB
+
+ CASE __ERRORLINEVarLB
+
+ CASE Debug_TimerLB
+
+ CASE Debug_Timer_SnapshotLB
+
+ CASE td_displayLB
+
+ CASE mouseXLB
+
+ CASE mouseYLB
+
+ CASE __ERRORLINELB
+
+ CASE InBytesLB2
+
+ CASE InBytesDifferenceLB2
+
+ CASE failLB
+
+ CASE multiStream1LB
+
+ CASE Kb_Diff_stream1LB
+
+ CASE Timer_Fail_Stream1LB
+
+ CASE Scene_CurrentLB
+
+ CASE PictureBox1
+
+ CASE InBytesLB3
+
+ CASE InBytesDifferenceLB3
+
+ CASE failLB2
+
+ CASE multiStream2LB
+
+ CASE Kb_Diff_stream2LB
+
+ CASE Timer_Fail_Stream2LB
+
+ CASE OptionsMenuAlwaysOnTop
+ IF AlwaysOnTop <> 1 THEN
+ AlwaysOnTop = 1
+ FGwin& = GetForegroundWindow&: IF Myhwnd <> FGwin& THEN y& = SetWindowPos&(Myhwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE + SWP_SHOWWINDOW)
+ ELSE
+ AlwaysOnTop = 0
+ FGwin& = GetForegroundWindow&: IF Myhwnd <> FGwin& THEN y& = SetWindowPos&(Myhwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE + SWP_NOACTIVATE)
+ END IF
+
+ CASE OptionsMenuDebug
+ IF Debug <> 1 THEN
+ Debug = 1
+ Control(DebugFrame).Hidden = False
+ Control(versionFrame).Hidden = True
+ Control(PictureBoxLogoBottom).Hidden = True
+ SetRadioButtonValue OptionsMenuDebug
+ ELSE
+ Debug = 0
+ Control(versionFrame).Hidden = True
+ Control(PictureBoxLogoBottom).Hidden = True
+ SetRadioButtonValue OptionsMenuDebug
+ END IF
+
+ CASE HelpMenuVisitWebsite
+ SHELL _DONTWAIT _HIDE "%ComSpec% /C START " + c34 + c34 + " /B https://github.com/loopy750/SRT-Stats-Monitor"
+
+ CASE HelpMenuCheckForUpdates
+ verCheck$ = "Checking for new version..."
+ SetCaption StatusLB, verCheck$
+ file224$ = ""
+ updateResult$ = ""
+ _DELAY .25
+ SHELL _HIDE "%ComSpec% /C curl -H " + c34 + "Cache-Control: no-cache" + c34 + " https://raw.githubusercontent.com/loopy750/SRT-Stats-Monitor-Version/master/checkversion.txt > " + c34 + fileCheckVersion + c34 + ""
+ _DELAY .25
+ IF _FILEEXISTS(fileCheckVersion) THEN
+ OPEN fileCheckVersion FOR INPUT AS #224
+ DO UNTIL EOF(224)
+ IF LOF(224) = 0 THEN NoKill = 1: EXIT DO 'Overkill with EOF checking, but just being safe
+ IF EOF(224) THEN EXIT DO
+ LINE INPUT #224, file224$
+ LOOP
+ END IF
+ CLOSE #224
+ IF _FILEEXISTS(fileCheckVersion) THEN KILL fileCheckVersion
+ updateResult$ = file224$
+ IF file224$ <> Ver THEN verCheck$ = "A new version is available..."
+ IF file224$ = "" OR file224$ = "404: Not Found" THEN verCheck$ = "Unable to check for new version..."
+ IF file224$ = Ver THEN verCheck$ = "You are using the latest version..."
+ IF verCheck <> "" THEN updateDisplayCounter = 0
+
+ CASE OptionsMenuFullscreen
+ IF FullScreen <> 1 THEN
+ FullScreen = 1
+ _FULLSCREEN _SQUAREPIXELS , _SMOOTH
+ ELSE
+ FullScreen = 0
+ _FULLSCREEN _OFF
+ END IF
+
+ CASE IndicatorLB
+
+ CASE HelpMenuAbout
+ Answer = MessageBox("Loopy SRT Stats Monitor v" + Ver + " (" + VerDate + ") \nby loopy750\n\nGitHub: https://www.github.com/loopy750", "About", MsgBox_OkOnly + MsgBox_Information)
+
+ CASE StatusLB
+
+ CASE PictureBoxLogoBottom
+
+ CASE OBSRemoteLB
+
+ CASE OBS_RemoteLB
+
+ END SELECT
+END SUB
+
+SUB __UI_MouseEnter (id AS LONG)
+ SELECT CASE id
+ CASE LoopySRTMonitor
+
+ CASE FileMenu
+
+ CASE OptionsMenu
+
+ CASE HelpMenu
+
+ CASE SRT
+
+ CASE Status
+
+ CASE Settings
+
+ CASE CurrentScene
+
+ CASE DebugFrame
+
+ CASE Stream1
+
+ CASE Stream2
+
+ CASE versionFrame
+
+ CASE FileMenuExit
+
+ CASE RMTPLB
+
+ CASE clientsLB
+
+ CASE VideoLB
+
+ CASE AudioLB
+
+ CASE InBytesLB
+
+ CASE OutBytesLB
+
+ CASE InBitssLB
+
+ CASE OutBitssLB
+
+ CASE TimeLB
+
+ CASE rtmp_nacceptedLB
+
+ CASE rtmp_codec_nclientsLB
+
+ CASE rtmp_codec_videoLB
+
+ CASE rtmp_codec_audioLB
+
+ CASE rtmp_bytes_inLB
+
+ CASE rtmp_bytes_outLB
+
+ CASE rtmp_bw_inLB
+
+ CASE rtmp_bw_outLB
+
+ CASE rtmp_uptimeLB
+
+ CASE InBytesDifferenceLB
+
+ CASE StreamFailTimerLB
+
+ CASE FailCountLB
+
+ CASE ServerPingLB
+
+ CASE UpdateIntervalLB
+
+ CASE Kb_DiffLB
+
+ CASE Timer_FailLB
+
+ CASE Timer_Fail_CountLB
+
+ CASE tPingOutLB
+
+ CASE td_updateLB
+
+ CASE BandwidthThresholdLB
+
+ CASE StreamFailDelayLB
+
+ CASE MultiCameraSwitchLB
+
+ CASE Bandwidth_ThresholdLB
+
+ CASE Stream_Fail_DelayLB
+
+ CASE MultiCameraSwitchStatusLB
+
+ CASE TimerLB
+
+ CASE TimerSnapshotLB
+
+ CASE td_displayVarLB
+
+ CASE mouseXVarLB
+
+ CASE mouseYVarLB
+
+ CASE __ERRORLINEVarLB
+
+ CASE Debug_TimerLB
+
+ CASE Debug_Timer_SnapshotLB
+
+ CASE td_displayLB
+
+ CASE mouseXLB
+
+ CASE mouseYLB
+
+ CASE __ERRORLINELB
+
+ CASE InBytesLB2
+
+ CASE InBytesDifferenceLB2
+
+ CASE failLB
+
+ CASE multiStream1LB
+
+ CASE Kb_Diff_stream1LB
+
+ CASE Timer_Fail_Stream1LB
+
+ CASE Scene_CurrentLB
+
+ CASE PictureBox1
+
+ CASE InBytesLB3
+
+ CASE InBytesDifferenceLB3
+
+ CASE failLB2
+
+ CASE multiStream2LB
+
+ CASE Kb_Diff_stream2LB
+
+ CASE Timer_Fail_Stream2LB
+
+ CASE OptionsMenuDebug
+
+ CASE HelpMenuVisitWebsite
+
+ CASE HelpMenuCheckForUpdates
+
+ CASE OptionsMenuFullscreen
+
+ CASE IndicatorLB
+
+ CASE HelpMenuAbout
+
+ CASE StatusLB
+
+ CASE PictureBoxLogoBottom
+
+ CASE OBSRemoteLB
+
+ CASE OBS_RemoteLB
+
+ END SELECT
+END SUB
+
+SUB __UI_MouseLeave (id AS LONG)
+ SELECT CASE id
+ CASE LoopySRTMonitor
+
+ CASE FileMenu
+
+ CASE OptionsMenu
+
+ CASE HelpMenu
+
+ CASE SRT
+
+ CASE Status
+
+ CASE Settings
+
+ CASE CurrentScene
+
+ CASE DebugFrame
+
+ CASE Stream1
+
+ CASE Stream2
+
+ CASE versionFrame
+
+ CASE FileMenuExit
+
+ CASE RMTPLB
+
+ CASE clientsLB
+
+ CASE VideoLB
+
+ CASE AudioLB
+
+ CASE InBytesLB
+
+ CASE OutBytesLB
+
+ CASE InBitssLB
+
+ CASE OutBitssLB
+
+ CASE TimeLB
+
+ CASE rtmp_nacceptedLB
+
+ CASE rtmp_codec_nclientsLB
+
+ CASE rtmp_codec_videoLB
+
+ CASE rtmp_codec_audioLB
+
+ CASE rtmp_bytes_inLB
+
+ CASE rtmp_bytes_outLB
+
+ CASE rtmp_bw_inLB
+
+ CASE rtmp_bw_outLB
+
+ CASE rtmp_uptimeLB
+
+ CASE InBytesDifferenceLB
+
+ CASE StreamFailTimerLB
+
+ CASE FailCountLB
+
+ CASE ServerPingLB
+
+ CASE UpdateIntervalLB
+
+ CASE Kb_DiffLB
+
+ CASE Timer_FailLB
+
+ CASE Timer_Fail_CountLB
+
+ CASE tPingOutLB
+
+ CASE td_updateLB
+
+ CASE BandwidthThresholdLB
+
+ CASE StreamFailDelayLB
+
+ CASE MultiCameraSwitchLB
+
+ CASE Bandwidth_ThresholdLB
+
+ CASE Stream_Fail_DelayLB
+
+ CASE MultiCameraSwitchStatusLB
+
+ CASE TimerLB
+
+ CASE TimerSnapshotLB
+
+ CASE td_displayVarLB
+
+ CASE mouseXVarLB
+
+ CASE mouseYVarLB
+
+ CASE __ERRORLINEVarLB
+
+ CASE Debug_TimerLB
+
+ CASE Debug_Timer_SnapshotLB
+
+ CASE td_displayLB
+
+ CASE mouseXLB
+
+ CASE mouseYLB
+
+ CASE __ERRORLINELB
+
+ CASE InBytesLB2
+
+ CASE InBytesDifferenceLB2
+
+ CASE failLB
+
+ CASE multiStream1LB
+
+ CASE Kb_Diff_stream1LB
+
+ CASE Timer_Fail_Stream1LB
+
+ CASE Scene_CurrentLB
+
+ CASE PictureBox1
+
+ CASE InBytesLB3
+
+ CASE InBytesDifferenceLB3
+
+ CASE failLB2
+
+ CASE multiStream2LB
+
+ CASE Kb_Diff_stream2LB
+
+ CASE Timer_Fail_Stream2LB
+
+ CASE OptionsMenuDebug
+
+ CASE HelpMenuVisitWebsite
+
+ CASE HelpMenuCheckForUpdates
+
+ CASE OptionsMenuFullscreen
+
+ CASE IndicatorLB
+
+ CASE HelpMenuAbout
+
+ CASE StatusLB
+
+ CASE PictureBoxLogoBottom
+
+ CASE OBSRemoteLB
+
+ CASE OBS_RemoteLB
+
+ END SELECT
+END SUB
+
+SUB __UI_FocusIn (id AS LONG)
+ SELECT CASE id
+ CASE 0
+ END SELECT
+END SUB
+
+SUB __UI_FocusOut (id AS LONG)
+ 'This event occurs right before a control loses focus.
+ 'To prevent a control from losing focus, set __UI_KeepFocus = True below.
+ SELECT CASE id
+ CASE 0
+ END SELECT
+END SUB
+
+SUB __UI_MouseDown (id AS LONG)
+ SELECT CASE id
+ CASE LoopySRTMonitor
+
+ CASE FileMenu
+
+ CASE OptionsMenu
+
+ CASE HelpMenu
+
+ CASE SRT
+
+ CASE Status
+
+ CASE Settings
+
+ CASE CurrentScene
+
+ CASE DebugFrame
+
+ CASE Stream1
+
+ CASE Stream2
+
+ CASE versionFrame
+
+ CASE FileMenuExit
+
+ CASE RMTPLB
+
+ CASE clientsLB
+
+ CASE VideoLB
+
+ CASE AudioLB
+
+ CASE InBytesLB
+
+ CASE OutBytesLB
+
+ CASE InBitssLB
+
+ CASE OutBitssLB
+
+ CASE TimeLB
+
+ CASE rtmp_nacceptedLB
+
+ CASE rtmp_codec_nclientsLB
+
+ CASE rtmp_codec_videoLB
+
+ CASE rtmp_codec_audioLB
+
+ CASE rtmp_bytes_inLB
+
+ CASE rtmp_bytes_outLB
+
+ CASE rtmp_bw_inLB
+
+ CASE rtmp_bw_outLB
+
+ CASE rtmp_uptimeLB
+
+ CASE InBytesDifferenceLB
+
+ CASE StreamFailTimerLB
+
+ CASE FailCountLB
+
+ CASE ServerPingLB
+
+ CASE UpdateIntervalLB
+
+ CASE Kb_DiffLB
+
+ CASE Timer_FailLB
+
+ CASE Timer_Fail_CountLB
+
+ CASE tPingOutLB
+
+ CASE td_updateLB
+
+ CASE BandwidthThresholdLB
+
+ CASE StreamFailDelayLB
+
+ CASE MultiCameraSwitchLB
+
+ CASE Bandwidth_ThresholdLB
+
+ CASE Stream_Fail_DelayLB
+
+ CASE MultiCameraSwitchStatusLB
+
+ CASE TimerLB
+
+ CASE TimerSnapshotLB
+
+ CASE td_displayVarLB
+
+ CASE mouseXVarLB
+
+ CASE mouseYVarLB
+
+ CASE __ERRORLINEVarLB
+
+ CASE Debug_TimerLB
+
+ CASE Debug_Timer_SnapshotLB
+
+ CASE td_displayLB
+
+ CASE mouseXLB
+
+ CASE mouseYLB
+
+ CASE __ERRORLINELB
+
+ CASE InBytesLB2
+
+ CASE InBytesDifferenceLB2
+
+ CASE failLB
+
+ CASE multiStream1LB
+
+ CASE Kb_Diff_stream1LB
+
+ CASE Timer_Fail_Stream1LB
+
+ CASE Scene_CurrentLB
+
+ CASE PictureBox1
+
+ CASE InBytesLB3
+
+ CASE InBytesDifferenceLB3
+
+ CASE failLB2
+
+ CASE multiStream2LB
+
+ CASE Kb_Diff_stream2LB
+
+ CASE Timer_Fail_Stream2LB
+
+ CASE OptionsMenuDebug
+
+ CASE HelpMenuVisitWebsite
+
+ CASE HelpMenuCheckForUpdates
+
+ CASE OptionsMenuFullscreen
+
+ CASE IndicatorLB
+
+ CASE HelpMenuAbout
+
+ CASE StatusLB
+
+ CASE PictureBoxLogoBottom
+
+ CASE OBSRemoteLB
+
+ CASE OBS_RemoteLB
+
+ END SELECT
+END SUB
+
+SUB __UI_MouseUp (id AS LONG)
+ SELECT CASE id
+ CASE LoopySRTMonitor
+
+ CASE FileMenu
+
+ CASE OptionsMenu
+
+ CASE HelpMenu
+
+ CASE SRT
+
+ CASE Status
+
+ CASE Settings
+
+ CASE CurrentScene
+
+ CASE DebugFrame
+
+ CASE Stream1
+
+ CASE Stream2
+
+ CASE versionFrame
+
+ CASE FileMenuExit
+
+ CASE RMTPLB
+
+ CASE clientsLB
+
+ CASE VideoLB
+
+ CASE AudioLB
+
+ CASE InBytesLB
+
+ CASE OutBytesLB
+
+ CASE InBitssLB
+
+ CASE OutBitssLB
+
+ CASE TimeLB
+
+ CASE rtmp_nacceptedLB
+
+ CASE rtmp_codec_nclientsLB
+
+ CASE rtmp_codec_videoLB
+
+ CASE rtmp_codec_audioLB
+
+ CASE rtmp_bytes_inLB
+
+ CASE rtmp_bytes_outLB
+
+ CASE rtmp_bw_inLB
+
+ CASE rtmp_bw_outLB
+
+ CASE rtmp_uptimeLB
+
+ CASE InBytesDifferenceLB
+
+ CASE StreamFailTimerLB
+
+ CASE FailCountLB
+
+ CASE ServerPingLB
+
+ CASE UpdateIntervalLB
+
+ CASE Kb_DiffLB
+
+ CASE Timer_FailLB
+
+ CASE Timer_Fail_CountLB
+
+ CASE tPingOutLB
+
+ CASE td_updateLB
+
+ CASE BandwidthThresholdLB
+
+ CASE StreamFailDelayLB
+
+ CASE MultiCameraSwitchLB
+
+ CASE Bandwidth_ThresholdLB
+
+ CASE Stream_Fail_DelayLB
+
+ CASE MultiCameraSwitchStatusLB
+
+ CASE TimerLB
+
+ CASE TimerSnapshotLB
+
+ CASE td_displayVarLB
+
+ CASE mouseXVarLB
+
+ CASE mouseYVarLB
+
+ CASE __ERRORLINEVarLB
+
+ CASE Debug_TimerLB
+
+ CASE Debug_Timer_SnapshotLB
+
+ CASE td_displayLB
+
+ CASE mouseXLB
+
+ CASE mouseYLB
+
+ CASE __ERRORLINELB
+
+ CASE InBytesLB2
+
+ CASE InBytesDifferenceLB2
+
+ CASE failLB
+
+ CASE multiStream1LB
+
+ CASE Kb_Diff_stream1LB
+
+ CASE Timer_Fail_Stream1LB
+
+ CASE Scene_CurrentLB
+
+ CASE PictureBox1
+
+ CASE InBytesLB3
+
+ CASE InBytesDifferenceLB3
+
+ CASE failLB2
+
+ CASE multiStream2LB
+
+ CASE Kb_Diff_stream2LB
+
+ CASE Timer_Fail_Stream2LB
+
+ CASE OptionsMenuDebug
+
+ CASE HelpMenuVisitWebsite
+
+ CASE HelpMenuCheckForUpdates
+
+ CASE OptionsMenuFullscreen
+
+ CASE IndicatorLB
+
+ CASE HelpMenuAbout
+
+ CASE StatusLB
+
+ CASE PictureBoxLogoBottom
+
+ CASE OBSRemoteLB
+
+ CASE OBS_RemoteLB
+
+ END SELECT
+END SUB
+
+SUB __UI_KeyPress (id AS LONG)
+ 'When this event is fired, __UI_KeyHit will contain the code of the key hit.
+ 'You can change it and even cancel it by making it = 0
+ SELECT CASE id
+ CASE 0
+ END SELECT
+END SUB
+
+SUB __UI_TextChanged (id AS LONG)
+ SELECT CASE id
+ CASE 0
+ END SELECT
+END SUB
+
+SUB __UI_ValueChanged (id AS LONG)
+ SELECT CASE id
+ CASE 0
+ END SELECT
+END SUB
+
+SUB __UI_FormResized
+
+END SUB
+
+SUB TIMEms (tout#, plus)
+
+ TIMER STOP
+ tout = ""
+ tout2# = tout#
+ toutint# = FIX(tout2#)
+ IF tout# >= 0 THEN
+ toutdec# = (tout2# - toutint#) + 1
+ IF plus THEN tout = tout + "+"
+ ELSE
+ toutdec# = (tout2# - toutint#) - 1
+ IF toutint# = 0 THEN tout = tout + "-"
+ END IF
+ tout = tout + LTRIM$(STR$(toutint#))
+ IF tout# >= 0 THEN tout = tout + "." + MID$(LTRIM$(STR$(toutdec#)), 3, 3) ELSE tout = tout + "." + MID$(LTRIM$(STR$(toutdec#)), 4, 3)
+ IF LEN(STR$(toutdec#)) = 5 THEN tout = tout + "0"
+ IF LEN(STR$(toutdec#)) = 4 THEN tout = tout + "00"
+ IF LEN(STR$(toutdec#)) = 2 THEN tout = tout + "000" 'Output to tout
+ TIMER ON
+
+END SUB
+
+SUB calcbw (bout#, bits)
+
+ TIMER STOP
+ bout = ""
+ bout2# = bout#
+ boutnodec = 0
+
+ IF bits = 0 THEN
+ SELECT CASE bout2#
+ CASE IS < 1048576
+ boutint# = bout2# / 1024
+ boutm$ = "KB"
+ CASE IS < 1073741824
+ boutint# = bout2# / 1048576
+ boutm$ = "MB"
+ CASE IS >= 1073741824
+ boutint# = bout2# / 1073741824
+ boutm$ = "GB"
+ END SELECT
+ boutdec# = boutint# + 1
+ boutint# = FIX(boutint#)
+ bout = STR$(boutint#)
+ IF boutdec# = FIX(boutdec#) THEN
+ boutdec$ = "000"
+ ELSE
+ boutdec$ = MID$(LTRIM$(STR$(boutdec#)), INSTR(LTRIM$(STR$(boutdec#)), ".") + 1, 3)
+ END IF
+ IF LEN(LTRIM$(STR$(boutint#))) >= 5 THEN
+ boutdec$ = LEFT$(boutdec$, 1)
+ ELSE
+ IF LEN(boutdec$) = 2 THEN boutdec$ = boutdec$ + "0"
+ IF LEN(boutdec$) = 1 THEN boutdec$ = boutdec$ + "00"
+ IF LEN(boutdec$) = 0 THEN boutdec$ = boutdec$ + "000"
+ END IF
+ IF bout# < 1073741824 THEN boutdec$ = LEFT$(boutdec$, 2)
+ bout = bout + "." + boutdec$ + " " + boutm$ 'Output to bout
+ ELSE
+ SELECT CASE bout2#
+ CASE IS < 1048576
+ boutint# = bout2# / 1024
+ boutm$ = "Kb/s"
+ boutnodec = 1
+ CASE IS < 1073741824
+ boutint# = bout2# / 1048576
+ boutm$ = "Mb/s"
+ CASE IS > 1073741824
+ boutint# = bout2# / 1073741824
+ boutm$ = "Gb/s"
+ END SELECT
+ boutdec# = boutint# + 1
+ boutint# = FIX(boutint#)
+ bout = STR$(boutint#)
+ IF boutdec# = FIX(boutdec#) THEN
+ boutdec$ = "00"
+ ELSE
+ boutdec$ = MID$(LTRIM$(STR$(boutdec#)), INSTR(LTRIM$(STR$(boutdec#)), ".") + 1, 2)
+ END IF
+ IF LEN(LTRIM$(STR$(boutint#))) >= 5 THEN boutdec$ = LEFT$(boutdec$, 1)
+ boutdec$ = "." + boutdec$
+ IF boutnodec = 1 THEN boutdec$ = ""
+ bout = bout + boutdec$ + " " + boutm$ 'Output to bout
+ END IF
+ TIMER ON
+
+END SUB
+
+FUNCTION calc_srt$ (convertTime#, includeSec)
+
+ TIMER STOP
+ IF convertTime# > 3596400 THEN convertTime# = 3596400
+ t_hr = convertTime# \ 3600
+ t_min = (convertTime# - (3600 * t_hr)) \ 60
+ t_sec = (convertTime# - (3600 * t_hr)) - (t_min * 60)
+ calc_srt$ = LTRIM$(STR$(t_hr)) + "h " + LTRIM$(STR$(t_min)) + "m "
+ IF includeSec = 1 THEN calc_srt$ = calc_srt$ + LTRIM$(STR$(t_sec)) + "s "
+ TIMER ON
+
+END FUNCTION
+
+SUB statusOutputToFile (outputMSG$)
+
+ TIMER STOP
+ OPEN outputStatusFile FOR OUTPUT AS #48
+ PRINT #48, outputMSG$
+ CLOSE #48
+ TIMER ON
+
+END SUB
+
+SUB statusBitrateToFile (outputBR$)
+
+ TIMER STOP
+ OPEN outputBitrateFile FOR OUTPUT AS #56
+ PRINT #56, outputBR$
+ CLOSE #56
+ TIMER ON
+
+END SUB
+
+SUB Timer01
+ 'Timer01 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
+ td_update# = TIMER(.001) - timer1#
+ timer1# = TIMER(.001)
+
+ 'Debug moved down from here ---------------------------------------------------------------------------------------------------------------------------------------------------
+ 'Get OBS scene moved down from here -------------------------------------------------------------------------------------------------------------------------------------------
+
+ IF _DIREXISTS(config_dir) THEN IF NOT _DIREXISTS(temp_dir) THEN MKDIR temp_dir
+
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SetCaption OBS_RemoteLB, "Node.js"
+ CASE "obscommand"
+ SetCaption OBS_RemoteLB, "OBSCommand"
+ CASE ELSE
+ WebsocketMethod = "obscommand"
+ END SELECT
+
+ rtmp_naccepted$ = "": rtmp_bytes_in$ = "": rtmp_bytes_out$ = "": rtmp_bw_in$ = "": rtmp_bw_out$ = "": rtmp_codec_video$ = "": rtmp_codec_audio$ = "": rtmp_codec_nclients$ = ""
+ rtmp_codec_nclients# = 0: rtmp_codec_nclients_temp# = 0
+ a$ = "": a2$ = "": d$ = "": I = 0: i2 = 0: i3 = 0: stats_rtmp.xml$ = ""
+
+ tPing1# = TIMER(.001)
+ 'client = _OPENCLIENT(Port_Client$ + URL)
+
+
+
+
+
+
+ IF __MultiCameraSwitch = 0 THEN
+
+ 'Get Media Source times -------------------------
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _HIDE "%ComSpec% /C node.exe " + c34 + obs_get_media1 + c34 + " > " + c34 + filePrevious + c34
+ CASE "obscommand"
+ SHELL _HIDE "%ComSpec% /C " + c34 + c34 + obscommand_file + c34 + " /server=" + OBS_URL + " /password=" + OBS_PW + " /command=GetCurrentScene > " + c34 + filePrevious + c34 + c34
+ END SELECT
+ _DELAY .01
+ ON ERROR GOTO PUT_Fail
+ PUT_Refresh = 1
+ IF _FILEEXISTS(filePrevious) THEN
+ OPEN filePrevious FOR INPUT AS #92
+ IF LOF(92) = 0 THEN NoKill = 1: GOTO LOF92 'Overkill with EOF checking, but just being safe
+ IF EOF(92) THEN GOTO LOF92
+ LINE INPUT #92, file92$
+ MediaSource1Time = VAL(file92$) / 1000
+ LOF92:
+ END IF
+ CLOSE #92
+
+ IF NoKill = 1 THEN NoKill = 0 ELSE IF _FILEEXISTS(filePrevious) THEN KILL filePrevious
+ ON ERROR GOTO 0
+ PUT_Refresh = 0
+
+ END IF
+
+
+
+ IF __MultiCameraSwitch = 1 THEN
+
+ 'Get Media Source times -------------------------
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _HIDE "%ComSpec% /C node.exe " + c34 + obs_get_media2 + c34 + " > " + c34 + filePrevious + c34
+ CASE "obscommand"
+ SHELL _HIDE "%ComSpec% /C " + c34 + c34 + obscommand_file + c34 + " /server=" + OBS_URL + " /password=" + OBS_PW + " /command=GetCurrentScene > " + c34 + filePrevious + c34 + c34
+ END SELECT
+ _DELAY .01
+ ON ERROR GOTO PUT_Fail
+ PUT_Refresh = 1
+ IF _FILEEXISTS(filePrevious) THEN
+ OPEN filePrevious FOR INPUT AS #92
+ IF LOF(92) = 0 THEN NoKill = 1: GOTO LOF922 'Overkill with EOF checking, but just being safe
+ IF EOF(92) THEN GOTO LOF922
+ LINE INPUT #92, file92$
+ MediaSource1Time = VAL(file92$) / 1000
+ IF EOF(92) THEN GOTO LOF922
+ LINE INPUT #92, file92$
+ MediaSource2Time = VAL(file92$) / 1000
+ LOF922:
+ END IF
+ CLOSE #92
+
+ IF NoKill = 1 THEN NoKill = 0 ELSE IF _FILEEXISTS(filePrevious) THEN KILL filePrevious
+ ON ERROR GOTO 0
+ PUT_Refresh = 0
+
+ END IF
+
+
+
+
+ tPing2# = TIMER(.001)
+ tPingOut# = (tPing2# - tPing1#)
+
+
+
+
+
+
+
+
+
+
+
+
+ 'PUT_Fail moved from here ----------
+
+ URL_OK:
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_uptime# = VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 8, 16))
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_naccepted# = VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 11, 16))
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_bytes_in# = VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 10, 16))
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_bytes_out# = VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 11, 16))
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_bw_in# = VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 7, 16))
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_bw_out# = VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 8, 16))
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_codec_video$ = MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 20, 4)
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_codec_audio$ = MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 14, 3)
+
+ rtmp_codec_video_level$ = ""
+ rtmp_codec_video_profile$ = ""
+ rtmp_codec_audio_channels$ = ""
+ rtmp_codec_audio_samplerate$ = ""
+ rtmp_codec_audio_profile$ = ""
+ rtmp_codec_video_width$ = ""
+ rtmp_codec_video_height$ = ""
+ rtmp_codec_video_resolution$ = ""
+
+ 'Tooltips - RTMP
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_codec_version$ = MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 15, 10)
+ rtmp_codec_version$ = LEFT$(rtmp_codec_version$, INSTR(rtmp_codec_version$, "<") - 1)
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_codec_rtmp_version$ = MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 20, 10)
+ rtmp_codec_rtmp_version$ = LEFT$(rtmp_codec_rtmp_version$, INSTR(rtmp_codec_rtmp_version$, "<") - 1)
+ 'Tooltips - Video
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_codec_video_level$ = MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 16, 6)
+ rtmp_codec_video_level$ = LEFT$(rtmp_codec_video_level$, INSTR(rtmp_codec_video_level$, "<") - 1)
+ IF INSTR(stats_rtmp.xml$, " ") THEN rtmp_codec_video_profile$ = MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, " ") + 17, 10)
+ rtmp_codec_video_profile$ = LEFT$(rtmp_codec_video_profile$, INSTR(rtmp_codec_video_profile$, "<") - 1)
+ IF INSTR(stats_rtmp.xml$, "") THEN rtmp_codec_video_width$ = STR$(VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 14, 6)))
+ IF INSTR(stats_rtmp.xml$, " ") THEN rtmp_codec_video_height$ = STR$(VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, " ") + 16, 6)))
+ IF rtmp_codec_video_width$ <> "" THEN rtmp_codec_video_resolution$ = _TRIM$(rtmp_codec_video_width$) + "x" + _TRIM$(rtmp_codec_video_height$)
+ 'Tooltips - Audio
+ IF INSTR((INSTR(stats_rtmp.xml$, " ") + 1), stats_rtmp.xml$, " ") THEN rtmp_codec_audio_profile$ = MID$(stats_rtmp.xml$, INSTR((INSTR(stats_rtmp.xml$, "") + 1), stats_rtmp.xml$, "") + 17, 10)
+ rtmp_codec_audio_profile$ = LEFT$(rtmp_codec_audio_profile$, INSTR(rtmp_codec_audio_profile$, "<") - 1)
+ IF INSTR(stats_rtmp.xml$, " ") THEN rtmp_codec_audio_channels$ = STR$(VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, " ") + 20, 1)))
+ IF INSTR(stats_rtmp.xml$, " ") THEN rtmp_codec_audio_samplerate$ = STR$(VAL(MID$(stats_rtmp.xml$, INSTR(stats_rtmp.xml$, "") + 24, 6)))
+
+ 'Dirty fix
+ IF rtmp_codec_video_profile$ = "LC" OR rtmp_codec_video_profile$ = "MP3" THEN rtmp_codec_audio_profile$ = rtmp_codec_video_profile$: rtmp_codec_video_profile$ = ""
+ IF rtmp_codec_audio_profile$ = "Baseline" OR rtmp_codec_audio_profile$ = "Main" OR rtmp_codec_audio_profile$ = "High" THEN rtmp_codec_video_profile$ = rtmp_codec_audio_profile$: rtmp_codec_audio_profile$ = ""
+
+ 'ToolTip(rtmp_codec_audioLB) = "Profile: " + rtmp_codec_audio_profile$ + "\nChannels: " + _TRIM$(rtmp_codec_audio_channels$) + "\nSample rate: " + _TRIM$(rtmp_codec_audio_samplerate$) + "\n"
+ 'ToolTip(rtmp_codec_videoLB) = "Resolution: " + rtmp_codec_video_resolution$ + "\nProfile: " + rtmp_codec_video_profile$ + "\nLevel: " + _TRIM$(rtmp_codec_video_level$) + "\n"
+ 'ToolTip(tPingOutLB) = "URL: " + URL + "\nPort: " + Port$ + "\n"
+
+ 'ToolTip(RMTPLB) = "SRT Version: " + rtmp_codec_version$ + "\nSRT Version: " + rtmp_codec_rtmp_version$ + "\n"
+ 'ToolTip(rtmp_nacceptedLB) = "SRT Version: " + rtmp_codec_version$ + "\nSRT Version: " + rtmp_codec_rtmp_version$ + "\n"
+ IF Timer_Failed = 1 THEN Timer_Failed = 0: ToolTip(Timer_Fail_CountLB) = "Last Failed: " + TIME$
+
+ IF __MultiCameraSwitch = 1 THEN
+ Stream% = 0
+ Stream% = INSTR(Stream% + 1, stats_rtmp.xml$, "" + urlStream1 + " ")
+ Stream% = INSTR(Stream% + 1, stats_rtmp.xml$, CHR$(13) + CHR$(10))
+ Stream% = INSTR(Stream% + 1, stats_rtmp.xml$, CHR$(13) + CHR$(10))
+ multiStream1# = VAL(MID$(stats_rtmp.xml$, Stream% + 12, 16))
+ Stream% = INSTR(Stream% + 1, stats_rtmp.xml$, "" + urlStream2 + " ")
+ Stream% = INSTR(Stream% + 1, stats_rtmp.xml$, CHR$(13) + CHR$(10))
+ Stream% = INSTR(Stream% + 1, stats_rtmp.xml$, CHR$(13) + CHR$(10))
+ multiStream2# = VAL(MID$(stats_rtmp.xml$, Stream% + 12, 16))
+ END IF
+
+ rtmp_codec_nclients# = 0
+ rtmp_codec_nclients_temp# = 0
+ DO
+ pos_xml_m& = INSTR(pos_xml_m& + 1, stats_rtmp.xml$, "")
+ rtmp_codec_nclients_temp# = VAL(MID$(stats_rtmp.xml$, pos_xml_m& + 10, 16))
+ IF rtmp_codec_nclients_temp# > rtmp_codec_nclients# THEN rtmp_codec_nclients# = rtmp_codec_nclients_temp#
+ LOOP UNTIL pos_xml_m& = 0
+
+ 'temp1 variables
+ IF srt_warmup = 0 THEN Kb_Diff# = (Bandwidth_Threshold + 1)
+ IF rtmp_bytes_in# = 0 THEN rtmp_bytes_in# = 1
+ rtmp_bytes_in_temp1# = rtmp_bytes_in#
+ IF rtmp_bytes_in_temp1# >= 1 AND rtmp_bytes_in_temp2# >= 1 THEN
+ Kb_Diff# = INT((rtmp_bytes_in_temp1# - rtmp_bytes_in_temp2#) / 128)
+ END IF
+
+ 'IF Kb_Diff# >= Bandwidth_Threshold THEN Timer_Fail = 0
+ IF MediaSource1Time <> 0 OR MediaSource2Time <> 0 THEN Timer_Fail = 0 'SRT
+
+ IF MediaSource1Time = 0 AND MediaSource2Time = 0 AND srt_warmup = 1 THEN Timer_Fail = Timer_Fail + 1 'SRT
+ 'IF Kb_Diff# <= Bandwidth_Threshold AND srt_warmup = 1 THEN Timer_Fail = Timer_Fail + 1
+ IF Timer_Fail > 20999 THEN Timer_Fail = 20999
+
+ SetCaption (rtmp_nacceptedLB), "Acc:" + STR$(rtmp_naccepted#)
+ SetCaption (rtmp_codec_nclientsLB), LTRIM$(STR$(rtmp_codec_nclients#))
+ IF rtmp_codec_video$ <> "" THEN SetCaption (rtmp_codec_videoLB), rtmp_codec_video$ ELSE SetCaption rtmp_codec_videoLB, "-"
+ IF rtmp_codec_audio$ <> "" THEN SetCaption (rtmp_codec_audioLB), rtmp_codec_audio$ ELSE SetCaption rtmp_codec_audioLB, "-"
+ calcbw rtmp_bytes_in#, 0
+ SetCaption (rtmp_bytes_inLB), LTRIM$(bout)
+ calcbw rtmp_bytes_out#, 0
+ SetCaption (rtmp_bytes_outLB), LTRIM$(bout)
+ calcbw rtmp_bw_in#, 1
+ SetCaption (rtmp_bw_inLB), LTRIM$(bout)
+ calcbw rtmp_bw_out#, 1
+ SetCaption (rtmp_bw_outLB), LTRIM$(bout)
+ SetCaption (rtmp_uptimeLB), calc_srt$(rtmp_uptime#, 0)
+
+ IF Timer_Fail >= Stream_Fail_Delay THEN Control(Kb_DiffLB).ForeColor = RED_FAIL ELSE IF Kb_Diff# <= Bandwidth_Threshold THEN Control(Kb_DiffLB).ForeColor = RED_WARNING ELSE Control(Kb_DiffLB).ForeColor = GREEN_OK
+ SetCaption (Kb_DiffLB), LTRIM$(STR$(Kb_Diff#)) + " Kb/s"
+
+ IF Timer_Fail >= Stream_Fail_Delay THEN Control(Timer_FailLB).ForeColor = RED_FAIL ELSE IF Timer_Fail >= 1 THEN Control(Timer_FailLB).ForeColor = RED_WARNING: SD = 1: _TITLE "Stream Down!" ELSE Control(Timer_FailLB).ForeColor = GREEN_OK
+ SetCaption (Timer_FailLB), calc_srt$(Timer_Fail, 1)
+
+ IF Timer_Fail = 0 AND SD = 1 THEN SD = 0: _TITLE "Loopy SRT Monitor"
+
+ IF Timer_Fail_Count >= 1 THEN Control(Timer_Fail_CountLB).ForeColor = RED_WARNING ELSE Control(Timer_Fail_CountLB).ForeColor = GREEN_OK
+ IF Timer_Fail_Count <> 1 THEN SetCaption (Timer_Fail_CountLB), LTRIM$(STR$(Timer_Fail_Count)) + " times" ELSE SetCaption (Timer_Fail_CountLB), LTRIM$(STR$(Timer_Fail_Count)) + " time"
+
+ TIMEms tPingOut#, 0
+ IF VAL(tout) >= .25 THEN Control(tPingOutLB).ForeColor = RED_WARNING ELSE Control(tPingOutLB).ForeColor = GREEN_OK
+ SetCaption (tPingOutLB), LTRIM$(STR$(VAL(tout) * 1000)) + "ms"
+
+ IF srt_warmup = 1 THEN
+ IF td_update# <= 0.001 THEN td_update# = 0.001
+ IF td_update# >= 9.999 THEN td_update# = 9.999
+ IF td_update# <= 0.989 OR td_update# >= 1.011 THEN Control(td_updateLB).ForeColor = RED_WARNING ELSE Control(td_updateLB).ForeColor = GREEN_OK
+ TIMEms td_update#, 0
+ SetCaption (td_updateLB), tout + " sec "
+ END IF
+
+ SetCaption (Bandwidth_ThresholdLB), LTRIM$(STR$(Bandwidth_Threshold)) + " Kb/s"
+ SetCaption (Stream_Fail_DelayLB), calc_srt$(Stream_Fail_Delay, 1)
+ IF __MultiCameraSwitch = 0 THEN SetCaption (MultiCameraSwitchStatusLB), "Disabled" ELSE SetCaption (MultiCameraSwitchStatusLB), "Enabled"
+ IF __returnPreviousScene = 1 THEN SetCaption (Scene_CurrentLB), LEFT$(previousSceneDisplay$, 20) ELSE SetCaption (Scene_CurrentLB), LEFT$(Scene_Current$, 20)
+
+ IF __MultiCameraSwitch = 1 THEN
+ 'temp1_stream1 variables
+ IF srt_warmup = 0 THEN Kb_Diff_stream1# = (Bandwidth_Threshold + 1)
+ IF multiStream1# = 0 THEN multiStream1# = 1
+ multiStream1_temp1# = multiStream1#
+ IF multiStream1_temp1# >= 1 AND multiStream1_temp2# >= 1 THEN
+ Kb_Diff_stream1# = INT((multiStream1_temp1# - multiStream1_temp2#) / 128)
+ END IF
+
+ IF Kb_Diff_stream1# >= Bandwidth_Threshold THEN Timer_Fail_Stream1 = 0
+ IF Kb_Diff_stream1# <= Bandwidth_Threshold AND srt_warmup = 1 THEN Timer_Fail_Stream1 = Timer_Fail_Stream1 + 1
+ IF MediaSource1Time <> 0 THEN Timer_Fail_Stream1 = 0: Timer_Fail = 0 'SRT
+ IF Timer_Fail_Stream1 > 19999 THEN Timer_Fail_Stream1 = 19999
+
+ 'temp1_stream2 variables
+ IF srt_warmup = 0 THEN Kb_Diff_stream2# = (Bandwidth_Threshold + 1)
+ IF multiStream2# = 0 THEN multiStream2# = 1
+ multiStream2_temp1# = multiStream2#
+ IF multiStream2_temp1# >= 1 AND rtmp_bytes_in_temp2# >= 1 THEN
+ Kb_Diff_stream2# = INT((multiStream2_temp1# - multiStream2_temp2#) / 128)
+ END IF
+
+ IF Kb_Diff_stream2# >= Bandwidth_Threshold THEN Timer_Fail_Stream2 = 0
+ IF Kb_Diff_stream2# <= Bandwidth_Threshold AND srt_warmup = 1 THEN Timer_Fail_Stream2 = Timer_Fail_Stream2 + 1
+ IF MediaSource2Time <> 0 THEN Timer_Fail_Stream2 = 0: Timer_Fail = 0 'SRT
+ IF Timer_Fail_Stream2 > 19999 THEN Timer_Fail_Stream2 = 19999
+
+ calcbw multiStream1#, 0
+ SetCaption (multiStream1LB), LTRIM$(bout)
+
+ IF Kb_Diff_stream1# < 0 THEN Kb_Diff_stream1# = 0 'Dirty fix for now
+
+ IF Timer_Fail_Stream1 >= Stream_Fail_Delay THEN Control(Kb_Diff_stream1LB).ForeColor = RED_FAIL ELSE IF Kb_Diff_stream1# <= Bandwidth_Threshold THEN Control(Kb_Diff_stream1LB).ForeColor = RED_WARNING ELSE Control(Kb_Diff_stream1LB).ForeColor = GREEN_OK
+ SetCaption (Kb_Diff_stream1LB), LTRIM$(STR$(Kb_Diff_stream1#)) + " Kb/s"
+
+ IF Timer_Fail_Stream1 >= Stream_Fail_Delay THEN Control(Timer_Fail_Stream1LB).ForeColor = RED_FAIL ELSE IF Timer_Fail_Stream1 >= 1 THEN Control(Timer_Fail_Stream1LB).ForeColor = RED_WARNING ELSE Control(Timer_Fail_Stream1LB).ForeColor = GREEN_OK
+ SetCaption (Timer_Fail_Stream1LB), calc_srt$(Timer_Fail_Stream1, 1)
+
+ calcbw multiStream2#, 0
+ SetCaption (multiStream2LB), LTRIM$(bout)
+
+ IF Kb_Diff_stream2# < 0 THEN Kb_Diff_stream2# = 0 'Dirty fix for now
+
+ IF Timer_Fail_Stream2 >= Stream_Fail_Delay THEN Control(Kb_Diff_stream2LB).ForeColor = RED_FAIL ELSE IF Kb_Diff_stream2# <= Bandwidth_Threshold THEN Control(Kb_Diff_stream2LB).ForeColor = RED_WARNING ELSE Control(Kb_Diff_stream2LB).ForeColor = GREEN_OK
+ SetCaption (Kb_Diff_stream2LB), LTRIM$(STR$(Kb_Diff_stream2#)) + " Kb/s"
+
+ IF Timer_Fail_Stream2 >= Stream_Fail_Delay THEN Control(Timer_Fail_Stream2LB).ForeColor = RED_FAIL ELSE IF Timer_Fail_Stream2 >= 1 THEN Control(Timer_Fail_Stream2LB).ForeColor = RED_WARNING ELSE Control(Timer_Fail_Stream2LB).ForeColor = GREEN_OK
+ SetCaption (Timer_Fail_Stream2LB), calc_srt$(Timer_Fail_Stream2, 1)
+ END IF
+
+ IF Scene_OK = "" OR Scene_Fail = "" OR Scene_Intro = "" THEN RefreshDisplayRequest = 1: Error_msg$ = "- Variable/s for scenes empty, check if " + c34 + config_main + c34 + " exists. (#5)": _DELAY 3
+
+ IF Timer_Fail >= 1 AND Exe_OK = 1 AND streamsUp$ <> "0" THEN
+ LoadImageMEM Control(PictureBox1), "tick_warning.png"
+ ELSEIF Timer_Fail = 0 AND Exe_OK = 1 THEN
+ LoadImageMEM Control(PictureBox1), "tick.png"
+ END IF
+
+ 'Debug ---
+ IF Debug = 0 THEN
+ Control(DebugFrame).Hidden = True
+ Control(versionFrame).Hidden = False
+ Control(TimerLB).Hidden = True
+ Control(TimerSnapshotLB).Hidden = True
+ Control(td_displayVarLB).Hidden = True
+ Control(mouseXVarLB).Hidden = True
+ Control(mouseYVarLB).Hidden = True
+ Control(__ERRORLINEVarLB).Hidden = True
+ Control(Debug_TimerLB).Hidden = True
+ Control(Debug_Timer_SnapshotLB).Hidden = True
+ Control(td_displayLB).Hidden = True
+ Control(mouseXLB).Hidden = True
+ Control(mouseYLB).Hidden = True
+ Control(__ERRORLINELB).Hidden = True
+ Control(PictureBoxLogoBottom).Hidden = False
+ SetCaption Debug_TimerLB, "-"
+ SetCaption Debug_Timer_SnapshotLB, "-"
+ SetCaption td_displayLB, "-"
+ SetCaption mouseXLB, "-"
+ SetCaption mouseYLB, "-"
+ SetCaption __ERRORLINELB, "-"
+ SetCaption TimerLB, "-" 'TIMER
+ SetCaption TimerSnapshotLB, "-"
+ SetCaption td_displayVarLB, "-"
+ SetCaption mouseXVarLB, "-"
+ SetCaption mouseYVarLB, "-"
+ SetCaption __ERRORLINEVarLB, "-"
+ ELSEIF Debug = 1 THEN
+ Control(DebugFrame).Hidden = False
+ Control(versionFrame).Hidden = True
+ Control(TimerLB).Hidden = False
+ Control(TimerSnapshotLB).Hidden = False
+ Control(td_displayVarLB).Hidden = False
+ Control(mouseXVarLB).Hidden = False
+ Control(mouseYVarLB).Hidden = False
+ Control(__ERRORLINEVarLB).Hidden = False
+ Control(Debug_TimerLB).Hidden = False
+ Control(Debug_Timer_SnapshotLB).Hidden = False
+ Control(td_displayLB).Hidden = False
+ Control(mouseXLB).Hidden = False
+ Control(mouseYLB).Hidden = False
+ Control(__ERRORLINELB).Hidden = False
+ Control(PictureBoxLogoBottom).Hidden = True
+ SetCaption TimerLB, "TIMER" 'TIMER
+ SetCaption TimerSnapshotLB, "TIMER (snapshot)"
+ SetCaption td_displayVarLB, "td_display var"
+ SetCaption mouseXVarLB, "mouseX var"
+ SetCaption mouseYVarLB, "mouseY var"
+ SetCaption __ERRORLINEVarLB, "_ERRORLINE var"
+ TIMEms Debug_Timer#, 0
+ SetCaption (Debug_Timer_SnapshotLB), tout + " sec "
+ END IF
+
+
+
+ 'Remove RTMP stats
+ 'SRT
+ Control(rtmp_nacceptedLB).Hidden = True
+ Control(rtmp_codec_nclientsLB).Hidden = True
+ Control(rtmp_codec_videoLB).Hidden = True
+ Control(rtmp_codec_audioLB).Hidden = True
+ Control(rtmp_bytes_inLB).Hidden = True
+ Control(rtmp_bytes_outLB).Hidden = True
+ Control(rtmp_bw_inLB).Hidden = True
+ Control(rtmp_bw_outLB).Hidden = True
+ Control(rtmp_uptimeLB).Hidden = True
+ Control(Kb_DiffLB).Hidden = True
+ Control(Bandwidth_ThresholdLB).Hidden = True
+ Control(OBS_RemoteLB).Hidden = True
+ Control(multiStream1LB).Hidden = True
+ Control(Kb_Diff_stream1LB).Hidden = True
+ Control(multiStream2LB).Hidden = True
+ Control(Kb_Diff_stream2LB).Hidden = True
+ SetCaption (ServerPingLB), "MS ping"
+ SetCaption (RMTPLB), ""
+ SetCaption (clientsLB), ""
+ SetCaption (VideoLB), ""
+ SetCaption (AudioLB), ""
+ SetCaption (InBytesLB), ""
+ SetCaption (OutBytesLB), ""
+ SetCaption (InBitssLB), ""
+ SetCaption (OutBitssLB), ""
+ SetCaption (TimeLB), ""
+ SetCaption (InBytesDifferenceLB), ""
+ SetCaption (BandwidthThresholdLB), ""
+ SetCaption (OBSRemoteLB), ""
+ SetCaption (InBytesLB2), ""
+ SetCaption (InBytesDifferenceLB2), ""
+ SetCaption (InBytesLB3), ""
+ SetCaption (InBytesDifferenceLB3), ""
+
+
+
+ IF verCheck$ <> "" THEN
+ SetCaption StatusLB, verCheck$
+ updateDisplay = 1
+ END IF
+ '---------
+
+ 'Get OBS scene -------------------------
+ IF __returnPreviousScene = 1 THEN
+ returnPreviousSceneTime = returnPreviousSceneTime + 1
+ IF returnPreviousSceneTime > 2 THEN returnPreviousSceneTime = 1 ELSE GOTO Exit_returnPreviousSceneCheck
+ returnFirstCheck = 1
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _HIDE "%ComSpec% /C node.exe " + c34 + obs_get_scene + c34 + " > " + c34 + filePrevious + c34
+ CASE "obscommand"
+ SHELL _HIDE "%ComSpec% /C " + c34 + c34 + obscommand_file + c34 + " /server=" + OBS_URL + " /password=" + OBS_PW + " /command=GetCurrentScene > " + c34 + filePrevious + c34 + c34
+ END SELECT
+ _DELAY .01
+ ON ERROR GOTO PUT_Fail
+ PUT_Refresh = 1
+ IF _FILEEXISTS(filePrevious) THEN
+ OPEN filePrevious FOR INPUT AS #96
+ 'LOCK #96
+ DO UNTIL EOF(96)
+ IF LOF(96) = 0 THEN NoKill = 1: EXIT DO 'Overkill with EOF checking, but just being safe
+ IF EOF(96) THEN EXIT DO
+ LINE INPUT #96, file96$
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ IF streamsUp$ <> "0" THEN previousScene$ = file96$
+ previousSceneDisplay$ = file96$
+ EXIT DO 'Output to previousScene$
+ CASE "obscommand"
+ findSceneName = INSTR(file96$, " " + c34 + "name" + c34 + ": " + c34)
+ IF findSceneName THEN
+ findSceneName2 = INSTR(findSceneName + 11, file96$, c34)
+ IF streamsUp$ <> "0" THEN previousScene$ = MID$(file96$, findSceneName + 11, findSceneName2 - 12)
+ previousSceneDisplay$ = MID$(file96$, findSceneName + 11, findSceneName2 - 12)
+ EXIT DO 'Output to previousScene$
+ END IF
+ END SELECT
+ LOOP
+ END IF
+ END IF
+ CLOSE #96
+
+ IF NoKill = 1 THEN NoKill = 0 ELSE IF _FILEEXISTS(filePrevious) THEN KILL filePrevious
+ ON ERROR GOTO 0
+ PUT_Refresh = 0
+
+
+
+
+
+
+ Exit_returnPreviousSceneCheck:
+ '---------------------------------------
+ 'IF __FileStatusOutput = 1 THEN statusBitrateToFile "Bitrate: (#1: " + _TRIM$(STR$(Kb_Diff_stream1#)) + " Kb/s) (#2: " + _TRIM$(STR$(Kb_Diff_stream2#)) + " Kb/s)"
+
+ 'Execute Stream OK
+ IF __MultiCameraSwitch = 0 THEN
+ IF MediaSource1Time <> 0 THEN 'SRT
+ 'IF Kb_Diff# >= Bandwidth_Threshold THEN
+ Timer_Fail = 0
+ Scene_Current$ = Scene_OK
+ IF Exe_Fail = 1 THEN
+ Exe_Fail = 0
+ Exe_OK = 1
+ LoadImageMEM Control(PictureBox1), "tick.png"
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + Scene_OK
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + Scene_OK + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]"
+ END IF
+ ELSE
+ IF Timer_Fail >= Stream_Fail_Delay THEN
+ IF Exe_OK = 1 THEN
+ Exe_OK = 0
+ Exe_Fail = 1
+ LoadImageMEM Control(PictureBox1), "cross.png"
+ IF Exe_Fail_First = 0 THEN
+ Exe_Fail_First = 1
+ Scene_Current$ = Scene_Intro
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + Scene_Intro
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + Scene_Intro + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ ELSE
+ Scene_Current$ = Scene_Fail
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + Scene_Fail
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + Scene_Fail + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM DOWN]"
+ Timer_Fail_Count = Timer_Fail_Count + 1
+ Timer_Failed = 1
+ IF Timer_Fail_Count > 999 THEN Timer_Fail_Count = 999
+ END IF
+ END IF
+ END IF
+ END IF
+ END IF
+
+ IF streamsUp$ <> "0" THEN lastStreamUp$ = streamsUp$
+
+ IF streamsUp$ <> "0" AND returnPreviousSceneRemember = 1 THEN
+ IF streamsUp$ = "1" THEN titleScene1 = previousScene$
+ IF streamsUp$ = "2" THEN titleScene2 = previousScene$
+ IF streamsUp$ = "12" THEN titleScene12 = previousScene$
+ END IF
+
+ IF __MultiCameraSwitch = 1 THEN
+ IF Timer_Fail_Stream1 = 0 AND Timer_Fail_Stream2 >= Stream_Fail_Delay THEN
+ IF streamsUp$ <> "1" THEN
+ IF previousScene$ <> titleScene1 AND streamsUp$ = "0" THEN
+ IF lastStreamUp$ <> "1" THEN previousScene$ = titleScene1
+ Scene_Current$ = previousScene$
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + previousScene$
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + previousScene$ + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]:[CAMERA #1 UP]:[CAMERA #2 DOWN]"
+ ELSE
+ Scene_Current$ = titleScene1
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + titleScene1
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + titleScene1 + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]:[CAMERA #1 UP]"
+ END IF
+ END IF
+ streamsUp$ = "1"
+ END IF
+
+ IF Timer_Fail_Stream1 >= Stream_Fail_Delay AND Timer_Fail_Stream2 = 0 THEN
+ IF streamsUp$ <> "2" THEN
+ IF previousScene$ <> titleScene2 AND streamsUp$ = "0" THEN
+ IF lastStreamUp$ <> "2" THEN previousScene$ = titleScene2
+ Scene_Current$ = previousScene$
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + previousScene$
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + previousScene$ + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]:[CAMERA #2 UP]:[CAMERA #1 DOWN]"
+ ELSE
+ Scene_Current$ = titleScene2
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + titleScene2
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + titleScene2 + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]:[CAMERA #2 UP]"
+ END IF
+ END IF
+ streamsUp$ = "2"
+ END IF
+
+ IF Timer_Fail_Stream1 = 0 AND Timer_Fail_Stream2 = 0 THEN
+ IF streamsUp$ <> "12" THEN
+ IF previousScene$ <> titleScene12 AND streamsUp$ = "0" THEN
+ IF lastStreamUp$ <> "12" THEN previousScene$ = titleScene12
+ Scene_Current$ = previousScene$
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + previousScene$
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + previousScene$ + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]:[ALL CAMERAS UP]"
+ ELSE
+ Scene_Current$ = titleScene12
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + titleScene12
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + titleScene12 + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM UP]:[ALL CAMERAS UP]"
+ END IF
+ END IF
+ streamsUp$ = "12"
+ END IF
+
+ IF Timer_Fail_Stream1 >= Stream_Fail_Delay AND Timer_Fail_Stream2 >= Stream_Fail_Delay THEN
+ IF streamsUp$ <> "0" THEN
+ streamsUp$ = "0"
+ LoadImageMEM Control(PictureBox1), "cross.png"
+ IF Exe_Fail_First = 0 THEN
+ Exe_Fail_First = 1
+ Scene_Current$ = Scene_Intro
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + Scene_Intro
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + Scene_Intro + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ ELSE
+ Scene_Current$ = Scene_Fail
+ SELECT CASE WebsocketMethod
+ CASE "nodejs"
+ SHELL _DONTWAIT _HIDE shell_nodejs_1 + Scene_Fail
+ CASE "obscommand"
+ SHELL _DONTWAIT _HIDE shell_obscommand_1 + Scene_Fail + shell_obscommand_2
+ END SELECT
+ _DELAY .1
+ IF __FileStatusOutput = 1 THEN statusOutputToFile "[STREAM DOWN]:[ALL CAMERAS DOWN]"
+ Timer_Fail_Count = Timer_Fail_Count + 1
+ Timer_Failed = 1
+ IF Timer_Fail_Count > 999 THEN Timer_Fail_Count = 999
+ END IF
+ END IF
+ END IF
+ END IF
+
+ IF srt_warmup = 1 AND returnFirstCheck = 1 AND __MultiCameraSwitch = 1 AND previousSceneDisplay$ = "" THEN RefreshDisplayRequest = 1: Error_msg$ = "- Variable/s for scenes empty, check if OBS is open." + CHR$(10) + "- If OBS is open, check communication is available via Node.js. (#6)": _DELAY 3
+
+ 'temp2 variables
+ rtmp_bytes_in_temp2# = rtmp_bytes_in#
+
+ 'temp_stream1 & temp_stream2 variables
+ multiStream1_temp2# = multiStream1#
+ multiStream2_temp2# = multiStream2#
+
+ IF Exe_Fail_First = 0 THEN
+ Timer_Fail_First = Timer_Fail_First + 1
+ IF (Stream_Fail_Delay + 3) - Timer_Fail_First <= 0 THEN Exe_Fail_First = 1
+ END IF
+
+ IF Exe_Fail_First_Stream1 = 0 THEN
+ Timer_Fail_First_Stream1 = Timer_Fail_First_Stream1 + 1
+ IF (Stream_Fail_Delay + 3) - Timer_Fail_First_Stream1 <= 0 THEN Exe_Fail_First_Stream1 = 1
+ END IF
+
+ IF Exe_Fail_First_Stream2 = 0 THEN
+ Timer_Fail_First_Stream2 = Timer_Fail_First_Stream2 + 1
+ IF (Stream_Fail_Delay + 3) - Timer_Fail_First_Stream2 <= 0 THEN Exe_Fail_First_Stream2 = 1
+ END IF
+
+ IF Refresh_Request = 1 THEN
+ Refresh_Request = 0
+ RefreshDisplayRequest = 1
+ END IF
+
+ IF srt_warmup = 0 THEN srt_warmup = 1
+
+ td_display# = TIMER(.001) - timer1#
+END SUB
+
diff --git a/source/loopy_srt_monitor.frm b/source/loopy_srt_monitor.frm
new file mode 100644
index 0000000..a435c4d
--- /dev/null
+++ b/source/loopy_srt_monitor.frm
@@ -0,0 +1,866 @@
+': This form was generated by
+': InForm - GUI library for QB64 - v1.3
+': Fellippe Heitor, 2016-2020 - fellippe@qb64.org - @fellippeheitor
+': https://github.com/FellippeHeitor/InForm
+'-----------------------------------------------------------
+SUB __UI_LoadForm
+
+ DIM __UI_NewID AS LONG, __UI_RegisterResult AS LONG
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Form, "LoopySRTMonitor", 800, 450, 0, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Loopy SRT Monitor"
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?segoeui.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 1)
+ Control(__UI_NewID).BackColor = _RGB32(38, 40, 45)
+ Control(__UI_NewID).BorderColor = _RGB32(163, 166, 170)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuBar, "FileMenu", 34, 22, 8, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "File"
+ Control(__UI_NewID).ForeColor = _RGB32(255, 255, 255)
+ Control(__UI_NewID).BorderColor = _RGB32(170, 166, 170)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuBar, "OptionsMenu", 62, 22, 42, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Options"
+ Control(__UI_NewID).ForeColor = _RGB32(255, 255, 255)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuBar, "HelpMenu", 41, 22, 104, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Help"
+ Control(__UI_NewID).ForeColor = _RGB32(255, 255, 255)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "SRT", 753, 64, 24, 34, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Status", 753, 64, 24, 111, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Settings", 753, 64, 24, 187, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "CurrentScene", 199, 106, 301, 264, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "DebugFrame", 753, 59, 24, 382, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Stream1", 245, 106, 24, 264, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream #1"
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?seguisb.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(64, 252, 48)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Stream2", 245, 106, 532, 264, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream #2"
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?seguisb.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(64, 252, 48)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "versionFrame", 753, 59, 24, 382, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?seguisb.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(32, 128, 16)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "FileMenuExit", 63, 20, 0, 4, __UI_GetID("FileMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Exit"
+ ToolTip(__UI_NewID) = "Exits the program"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+ Control(__UI_NewID).BorderColor = _RGB32(170, 166, 170)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "RMTPLB", 65, 21, 42, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "RMTP"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "clientsLB", 62, 21, 98, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "#clients"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "VideoLB", 69, 21, 157, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Video"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "AudioLB", 57, 21, 210, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Audio"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesLB", 114, 21, 266, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OutBytesLB", 108, 21, 370, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Out Bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBitssLB", 110, 21, 472, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bits/s"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OutBitssLB", 109, 21, 576, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Out bits/s"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "TimeLB", 83, 21, 677, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Time"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_nacceptedLB", 65, 21, 42, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_naccepted"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_codec_nclientsLB", 62, 21, 98, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_codec_nclients"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_codec_videoLB", 69, 21, 157, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_codec_video"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_codec_audioLB", 57, 21, 210, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_codec_audio"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bytes_inLB", 114, 21, 266, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bytes_in"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bytes_outLB", 108, 21, 370, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bytes_out"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bw_inLB", 110, 21, 472, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bw_in"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bw_outLB", 109, 21, 576, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bw_out"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_uptimeLB", 83, 21, 677, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_uptime"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(125, 187, 154)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesDifferenceLB", 189, 21, 42, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes difference"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "StreamFailTimerLB", 191, 21, 230, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "FailCountLB", 111, 21, 418, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Fail count"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "ServerPingLB", 104, 21, 528, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Server ping"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "UpdateIntervalLB", 129, 21, 631, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Update interval"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Kb_DiffLB", 189, 21, 42, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Kb_Diff"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(131, 151, 163)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_FailLB", 190, 21, 231, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(131, 151, 163)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_Fail_CountLB", 111, 21, 418, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail_Count"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(131, 151, 163)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "tPingOutLB", 104, 21, 528, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "tPingOut#"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(131, 151, 163)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "td_updateLB", 128, 21, 632, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "td_update"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(131, 151, 163)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "BandwidthThresholdLB", 190, 21, 42, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Bandwidth threshold"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "StreamFailDelayLB", 190, 21, 232, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail delay"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "MultiCameraSwitchLB", 225, 21, 420, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Multi Camera Switch"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Bandwidth_ThresholdLB", 190, 21, 42, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Bandwidth_Threshold"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(142, 166, 143)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Stream_Fail_DelayLB", 190, 21, 232, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream_Fail_Delay"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(142, 166, 143)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "MultiCameraSwitchStatusLB", 225, 21, 420, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "MultiCameraSwitchStatus"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(142, 166, 143)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "TimerLB", 146, 21, 42, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(195, 4, 4)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "TimerSnapshotLB", 175, 21, 185, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer (snapshot)"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(195, 4, 4)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "td_displayVarLB", 125, 21, 350, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "td_display var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(195, 4, 4)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseXVarLB", 80, 21, 460, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseX var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(195, 4, 4)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseYVarLB", 90, 21, 540, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseY var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(195, 4, 4)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "__ERRORLINEVarLB", 130, 21, 622, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "_ERRORLINE var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(195, 4, 4)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Debug_TimerLB", 146, 21, 42, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Debug_Timer"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(235, 96, 57)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Debug_Timer_SnapshotLB", 175, 21, 185, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Debug_Timer_Snapshot"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(235, 96, 57)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "td_displayLB", 125, 21, 350, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "td_display"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(235, 96, 57)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseXLB", 80, 21, 460, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseX"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(235, 96, 57)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseYLB", 90, 21, 540, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseY"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(235, 96, 57)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "__ERRORLINELB", 130, 21, 622, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "_ERRORLINE"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(235, 96, 57)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesLB2", 65, 21, 89, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 221, 200)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesDifferenceLB2", 121, 21, 33, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes difference"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 221, 200)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "failLB", 107, 21, 42, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 221, 200)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "multiStream1LB", 77, 21, 153, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "multiStream1"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 181, 211)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Kb_Diff_stream1LB", 90, 21, 153, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Kb_Diff_stream1"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 181, 211)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_Fail_Stream1LB", 108, 21, 153, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail_Stream1"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 181, 211)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Scene_CurrentLB", 187, 29, 307, 265, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Scene_Current"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?ebrimabd.ttf?phagspa.ttf?segoeui.ttf", 18)
+ Control(__UI_NewID).ForeColor = _RGB32(155, 255, 240)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).Align = __UI_Center
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_PictureBox, "PictureBox1", 64, 64, 369, 296, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).BackStyle = __UI_Transparent
+ Control(__UI_NewID).Align = __UI_Center
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesLB3", 65, 21, 597, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 221, 200)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesDifferenceLB3", 121, 21, 541, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes difference"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 221, 200)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "failLB2", 107, 21, 549, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 221, 200)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 35)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "multiStream2LB", 77, 21, 661, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "multiStream2"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 181, 211)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Kb_Diff_stream2LB", 90, 21, 661, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Kb_Diff_stream2"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 181, 211)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_Fail_Stream2LB", 108, 21, 661, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail_Stream2"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(185, 181, 211)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "OptionsMenuDebug", 82, 20, 0, 4, __UI_GetID("OptionsMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Debug"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+ __UI_RegisterResult = RegisterKeyCombo("Ctrl+D", __UI_NewID)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "HelpMenuVisitWebsite", 114, 20, 0, 4, __UI_GetID("HelpMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Visit Website"
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "HelpMenuCheckForUpdates", 149, 20, 0, 24, __UI_GetID("HelpMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Check for updates-"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "OptionsMenuFullscreen", 98, 20, 0, 24, __UI_GetID("OptionsMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Fullscreen"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+ __UI_RegisterResult = RegisterKeyCombo("Ctrl+F", __UI_NewID)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "IndicatorLB", 20, 20, 786, 0, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).ForeColor = _RGB32(73, 70, 76)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "HelpMenuAbout", 79, 20, 0, 51, __UI_GetID("HelpMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "About"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "StatusLB", 310, 21, 450, 1, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?seguisb.ttf?phagspa.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(60, 180, 240)
+ Control(__UI_NewID).Align = __UI_Right
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_PictureBox, "PictureBoxLogoBottom", 401, 30, 200, 396, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(33, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).Align = __UI_Center
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OBSRemoteLB", 118, 21, 642, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "OBS Remote"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(3, 4, 4)
+ Control(__UI_NewID).BackColor = _RGB32(164, 168, 172)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OBS_RemoteLB", 118, 21, 642, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "OBS_Remote"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(142, 166, 143)
+ Control(__UI_NewID).BackColor = _RGB32(25, 28, 33)
+ Control(__UI_NewID).BorderColor = _RGB32(10, 12, 15)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+END SUB
+
+SUB __UI_AssignIDs
+ LoopySRTMonitor = __UI_GetID("LoopySRTMonitor")
+ FileMenu = __UI_GetID("FileMenu")
+ OptionsMenu = __UI_GetID("OptionsMenu")
+ HelpMenu = __UI_GetID("HelpMenu")
+ SRT = __UI_GetID("SRT")
+ Status = __UI_GetID("Status")
+ Settings = __UI_GetID("Settings")
+ CurrentScene = __UI_GetID("CurrentScene")
+ DebugFrame = __UI_GetID("DebugFrame")
+ Stream1 = __UI_GetID("Stream1")
+ Stream2 = __UI_GetID("Stream2")
+ versionFrame = __UI_GetID("versionFrame")
+ FileMenuExit = __UI_GetID("FileMenuExit")
+ RMTPLB = __UI_GetID("RMTPLB")
+ clientsLB = __UI_GetID("clientsLB")
+ VideoLB = __UI_GetID("VideoLB")
+ AudioLB = __UI_GetID("AudioLB")
+ InBytesLB = __UI_GetID("InBytesLB")
+ OutBytesLB = __UI_GetID("OutBytesLB")
+ InBitssLB = __UI_GetID("InBitssLB")
+ OutBitssLB = __UI_GetID("OutBitssLB")
+ TimeLB = __UI_GetID("TimeLB")
+ rtmp_nacceptedLB = __UI_GetID("rtmp_nacceptedLB")
+ rtmp_codec_nclientsLB = __UI_GetID("rtmp_codec_nclientsLB")
+ rtmp_codec_videoLB = __UI_GetID("rtmp_codec_videoLB")
+ rtmp_codec_audioLB = __UI_GetID("rtmp_codec_audioLB")
+ rtmp_bytes_inLB = __UI_GetID("rtmp_bytes_inLB")
+ rtmp_bytes_outLB = __UI_GetID("rtmp_bytes_outLB")
+ rtmp_bw_inLB = __UI_GetID("rtmp_bw_inLB")
+ rtmp_bw_outLB = __UI_GetID("rtmp_bw_outLB")
+ rtmp_uptimeLB = __UI_GetID("rtmp_uptimeLB")
+ InBytesDifferenceLB = __UI_GetID("InBytesDifferenceLB")
+ StreamFailTimerLB = __UI_GetID("StreamFailTimerLB")
+ FailCountLB = __UI_GetID("FailCountLB")
+ ServerPingLB = __UI_GetID("ServerPingLB")
+ UpdateIntervalLB = __UI_GetID("UpdateIntervalLB")
+ Kb_DiffLB = __UI_GetID("Kb_DiffLB")
+ Timer_FailLB = __UI_GetID("Timer_FailLB")
+ Timer_Fail_CountLB = __UI_GetID("Timer_Fail_CountLB")
+ tPingOutLB = __UI_GetID("tPingOutLB")
+ td_updateLB = __UI_GetID("td_updateLB")
+ BandwidthThresholdLB = __UI_GetID("BandwidthThresholdLB")
+ StreamFailDelayLB = __UI_GetID("StreamFailDelayLB")
+ MultiCameraSwitchLB = __UI_GetID("MultiCameraSwitchLB")
+ Bandwidth_ThresholdLB = __UI_GetID("Bandwidth_ThresholdLB")
+ Stream_Fail_DelayLB = __UI_GetID("Stream_Fail_DelayLB")
+ MultiCameraSwitchStatusLB = __UI_GetID("MultiCameraSwitchStatusLB")
+ TimerLB = __UI_GetID("TimerLB")
+ TimerSnapshotLB = __UI_GetID("TimerSnapshotLB")
+ td_displayVarLB = __UI_GetID("td_displayVarLB")
+ mouseXVarLB = __UI_GetID("mouseXVarLB")
+ mouseYVarLB = __UI_GetID("mouseYVarLB")
+ __ERRORLINEVarLB = __UI_GetID("__ERRORLINEVarLB")
+ Debug_TimerLB = __UI_GetID("Debug_TimerLB")
+ Debug_Timer_SnapshotLB = __UI_GetID("Debug_Timer_SnapshotLB")
+ td_displayLB = __UI_GetID("td_displayLB")
+ mouseXLB = __UI_GetID("mouseXLB")
+ mouseYLB = __UI_GetID("mouseYLB")
+ __ERRORLINELB = __UI_GetID("__ERRORLINELB")
+ InBytesLB2 = __UI_GetID("InBytesLB2")
+ InBytesDifferenceLB2 = __UI_GetID("InBytesDifferenceLB2")
+ failLB = __UI_GetID("failLB")
+ multiStream1LB = __UI_GetID("multiStream1LB")
+ Kb_Diff_stream1LB = __UI_GetID("Kb_Diff_stream1LB")
+ Timer_Fail_Stream1LB = __UI_GetID("Timer_Fail_Stream1LB")
+ Scene_CurrentLB = __UI_GetID("Scene_CurrentLB")
+ PictureBox1 = __UI_GetID("PictureBox1")
+ InBytesLB3 = __UI_GetID("InBytesLB3")
+ InBytesDifferenceLB3 = __UI_GetID("InBytesDifferenceLB3")
+ failLB2 = __UI_GetID("failLB2")
+ multiStream2LB = __UI_GetID("multiStream2LB")
+ Kb_Diff_stream2LB = __UI_GetID("Kb_Diff_stream2LB")
+ Timer_Fail_Stream2LB = __UI_GetID("Timer_Fail_Stream2LB")
+ OptionsMenuDebug = __UI_GetID("OptionsMenuDebug")
+ HelpMenuVisitWebsite = __UI_GetID("HelpMenuVisitWebsite")
+ HelpMenuCheckForUpdates = __UI_GetID("HelpMenuCheckForUpdates")
+ OptionsMenuFullscreen = __UI_GetID("OptionsMenuFullscreen")
+ IndicatorLB = __UI_GetID("IndicatorLB")
+ HelpMenuAbout = __UI_GetID("HelpMenuAbout")
+ StatusLB = __UI_GetID("StatusLB")
+ PictureBoxLogoBottom = __UI_GetID("PictureBoxLogoBottom")
+ OBSRemoteLB = __UI_GetID("OBSRemoteLB")
+ OBS_RemoteLB = __UI_GetID("OBS_RemoteLB")
+END SUB
diff --git a/source/loopy_srt_monitor_light.frm b/source/loopy_srt_monitor_light.frm
new file mode 100644
index 0000000..70ba707
--- /dev/null
+++ b/source/loopy_srt_monitor_light.frm
@@ -0,0 +1,874 @@
+': This form was generated by
+': InForm - GUI library for QB64 - v1.2
+': Fellippe Heitor, 2016-2019 - fellippe@qb64.org - @fellippeheitor
+': https://github.com/FellippeHeitor/InForm
+'-----------------------------------------------------------
+SUB __UI_LoadForm_Light
+
+ DIM __UI_NewID AS LONG, __UI_RegisterResult AS LONG
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Form, "LoopySRTMonitor", 800, 450, 0, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Loopy SRT Monitor"
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?segoeui.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 1)
+ Control(__UI_NewID).BackColor = _RGB32(233, 235, 237)
+ Control(__UI_NewID).BorderColor = _RGB32(163, 166, 170)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuBar, "FileMenu", 34, 22, 8, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "File"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 2, 3)
+ Control(__UI_NewID).BorderColor = _RGB32(170, 166, 170)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuBar, "OptionsMenu", 62, 22, 42, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Options"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 2, 3)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuBar, "HelpMenu", 41, 22, 104, 0, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Help"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 2, 3)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "SRT", 753, 64, 24, 34, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Status", 753, 64, 24, 111, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Settings", 753, 64, 24, 187, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "CurrentScene", 199, 106, 301, 264, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "DebugFrame", 753, 59, 24, 382, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Stream1", 245, 106, 24, 264, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream #1"
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?seguisb.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Stream2", 245, 106, 532, 264, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream #2"
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?seguisb.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "versionFrame", 753, 59, 24, 382, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("phagspa.ttf?seguisb.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).HasBorder = True
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "FileMenuExit", 63, 20, 0, 4, __UI_GetID("FileMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Exit"
+ ToolTip(__UI_NewID) = "Exits the program"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+ Control(__UI_NewID).BorderColor = _RGB32(170, 166, 170)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "RMTPLB", 65, 21, 42, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "RMTP"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "clientsLB", 62, 21, 98, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "#clients"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "VideoLB", 69, 21, 157, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Video"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "AudioLB", 57, 21, 210, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Audio"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesLB", 114, 21, 266, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OutBytesLB", 108, 21, 370, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Out Bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBitssLB", 110, 21, 472, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bits/s"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OutBitssLB", 109, 21, 576, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Out bits/s"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "TimeLB", 83, 21, 677, 47, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Time"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_nacceptedLB", 65, 21, 42, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_naccepted"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_codec_nclientsLB", 62, 21, 98, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_codec_nclients"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_codec_videoLB", 69, 21, 157, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_codec_video"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_codec_audioLB", 57, 21, 210, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_codec_audio"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bytes_inLB", 114, 21, 266, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bytes_in"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bytes_outLB", 108, 21, 370, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bytes_out"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bw_inLB", 110, 21, 472, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bw_in"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_bw_outLB", 109, 21, 576, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_bw_out"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "rtmp_uptimeLB", 83, 21, 677, 69, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "rtmp_uptime"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesDifferenceLB", 189, 21, 42, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes difference"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "StreamFailTimerLB", 191, 21, 230, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "FailCountLB", 111, 21, 418, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Fail count"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "ServerPingLB", 104, 21, 528, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Server ping"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "UpdateIntervalLB", 129, 21, 631, 124, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Update interval"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Kb_DiffLB", 189, 21, 42, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Kb_Diff"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_FailLB", 190, 21, 231, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_Fail_CountLB", 111, 21, 418, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail_Count"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "tPingOutLB", 104, 21, 528, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "tPingOut#"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "td_updateLB", 128, 21, 632, 146, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "td_update"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "BandwidthThresholdLB", 190, 21, 42, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Bandwidth threshold"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "StreamFailDelayLB", 190, 21, 232, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail delay"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "MultiCameraSwitchLB", 225, 21, 420, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Multi Camera Switch"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Bandwidth_ThresholdLB", 190, 21, 42, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Bandwidth_Threshold"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Stream_Fail_DelayLB", 190, 21, 232, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream_Fail_Delay"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "MultiCameraSwitchStatusLB", 225, 21, 420, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "MultiCameraSwitchStatus"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "TimerLB", 146, 21, 42, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(250, 73, 69)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "TimerSnapshotLB", 175, 21, 185, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer (snapshot)"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(250, 73, 69)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "td_displayVarLB", 125, 21, 350, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "td_display var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(250, 73, 69)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseXVarLB", 80, 21, 460, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseX var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(250, 73, 69)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseYVarLB", 90, 21, 540, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseY var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(250, 73, 69)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "__ERRORLINEVarLB", 130, 21, 622, 393, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "_ERRORLINE var"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(250, 73, 69)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Debug_TimerLB", 146, 21, 42, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Debug_Timer"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Debug_Timer_SnapshotLB", 175, 21, 185, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Debug_Timer_Snapshot"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "td_displayLB", 125, 21, 350, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "td_display"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseXLB", 80, 21, 460, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseX"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "mouseYLB", 90, 21, 540, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "mouseY"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "__ERRORLINELB", 130, 21, 622, 415, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "_ERRORLINE"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesLB2", 65, 21, 89, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesDifferenceLB2", 121, 21, 33, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes difference"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "failLB", 107, 21, 42, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "multiStream1LB", 77, 21, 153, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "multiStream1"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Kb_Diff_stream1LB", 90, 21, 153, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Kb_Diff_stream1"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_Fail_Stream1LB", 108, 21, 153, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail_Stream1"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Scene_CurrentLB", 187, 29, 307, 265, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Scene_Current"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?ebrimabd.ttf?phagspa.ttf?segoeui.ttf", 18)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).Align = __UI_Center
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_PictureBox, "PictureBox1", 64, 64, 369, 296, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).BackStyle = __UI_Transparent
+ Control(__UI_NewID).Align = __UI_Center
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesLB3", 65, 21, 597, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "InBytesDifferenceLB3", 121, 21, 541, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "In bytes difference"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "failLB2", 107, 21, 549, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Stream fail timer"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "multiStream2LB", 77, 21, 661, 278, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "multiStream2"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Kb_Diff_stream2LB", 90, 21, 661, 306, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Kb_Diff_stream2"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "Timer_Fail_Stream2LB", 108, 21, 661, 334, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Timer_Fail_Stream2"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "OptionsMenuDebug", 82, 20, 0, 4, __UI_GetID("OptionsMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Debug"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+ __UI_RegisterResult = RegisterKeyCombo("Ctrl+D", __UI_NewID)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "HelpMenuVisitWebsite", 114, 20, 0, 4, __UI_GetID("HelpMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Visit Website"
+ Control(__UI_NewID).BackColor = _RGB32(38, 40, 45)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "HelpMenuCheckForUpdates", 149, 20, 0, 24, __UI_GetID("HelpMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Check for updates-"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "OptionsMenuFullscreen", 98, 20, 0, 24, __UI_GetID("OptionsMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "Fullscreen"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+ __UI_RegisterResult = RegisterKeyCombo("Ctrl+F", __UI_NewID)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "IndicatorLB", 20, 20, 786, 0, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_MenuItem, "HelpMenuAbout", 79, 20, 0, 51, __UI_GetID("HelpMenu"))
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "About"
+ Control(__UI_NewID).ForeColor = _RGB32(1, 1, 2)
+ Control(__UI_NewID).BackColor = _RGB32(254, 254, 255)
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "StatusLB", 310, 21, 450, 1, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?seguisb.ttf?phagspa.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).Align = __UI_Right
+ Control(__UI_NewID).VAlign = __UI_Middle
+
+ __UI_NewID = __UI_NewControl(__UI_Type_PictureBox, "PictureBoxLogoBottom", 401, 30, 200, 396, 0)
+ __UI_RegisterResult = 0
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).Align = __UI_Center
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).BorderSize = 1
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OBSRemoteLB", 118, 21, 642, 200, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "OBS Remote"
+ Control(__UI_NewID).Font = SetFont("segoeui.ttf?phagspa.ttf?seguisb.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(192, 194, 196)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+ __UI_NewID = __UI_NewControl(__UI_Type_Label, "OBS_RemoteLB", 118, 21, 642, 222, 0)
+ __UI_RegisterResult = 0
+ SetCaption __UI_NewID, "OBS_Remote"
+ Control(__UI_NewID).Font = SetFont("seguisb.ttf?phagspa.ttf?segoeui.ttf", 12)
+ Control(__UI_NewID).ForeColor = _RGB32(5, 5, 9)
+ Control(__UI_NewID).BackColor = _RGB32(220, 219, 223)
+ Control(__UI_NewID).BorderColor = _RGB32(255, 254, 255)
+ Control(__UI_NewID).VAlign = __UI_Middle
+ Control(__UI_NewID).Padding = 10
+
+END SUB
+
+SUB __UI_AssignIDs_Light
+ LoopySRTMonitor = __UI_GetID("LoopySRTMonitor")
+ FileMenu = __UI_GetID("FileMenu")
+ OptionsMenu = __UI_GetID("OptionsMenu")
+ HelpMenu = __UI_GetID("HelpMenu")
+ SRT = __UI_GetID("SRT")
+ Status = __UI_GetID("Status")
+ Settings = __UI_GetID("Settings")
+ CurrentScene = __UI_GetID("CurrentScene")
+ DebugFrame = __UI_GetID("DebugFrame")
+ Stream1 = __UI_GetID("Stream1")
+ Stream2 = __UI_GetID("Stream2")
+ versionFrame = __UI_GetID("versionFrame")
+ FileMenuExit = __UI_GetID("FileMenuExit")
+ RMTPLB = __UI_GetID("RMTPLB")
+ clientsLB = __UI_GetID("clientsLB")
+ VideoLB = __UI_GetID("VideoLB")
+ AudioLB = __UI_GetID("AudioLB")
+ InBytesLB = __UI_GetID("InBytesLB")
+ OutBytesLB = __UI_GetID("OutBytesLB")
+ InBitssLB = __UI_GetID("InBitssLB")
+ OutBitssLB = __UI_GetID("OutBitssLB")
+ TimeLB = __UI_GetID("TimeLB")
+ rtmp_nacceptedLB = __UI_GetID("rtmp_nacceptedLB")
+ rtmp_codec_nclientsLB = __UI_GetID("rtmp_codec_nclientsLB")
+ rtmp_codec_videoLB = __UI_GetID("rtmp_codec_videoLB")
+ rtmp_codec_audioLB = __UI_GetID("rtmp_codec_audioLB")
+ rtmp_bytes_inLB = __UI_GetID("rtmp_bytes_inLB")
+ rtmp_bytes_outLB = __UI_GetID("rtmp_bytes_outLB")
+ rtmp_bw_inLB = __UI_GetID("rtmp_bw_inLB")
+ rtmp_bw_outLB = __UI_GetID("rtmp_bw_outLB")
+ rtmp_uptimeLB = __UI_GetID("rtmp_uptimeLB")
+ InBytesDifferenceLB = __UI_GetID("InBytesDifferenceLB")
+ StreamFailTimerLB = __UI_GetID("StreamFailTimerLB")
+ FailCountLB = __UI_GetID("FailCountLB")
+ ServerPingLB = __UI_GetID("ServerPingLB")
+ UpdateIntervalLB = __UI_GetID("UpdateIntervalLB")
+ Kb_DiffLB = __UI_GetID("Kb_DiffLB")
+ Timer_FailLB = __UI_GetID("Timer_FailLB")
+ Timer_Fail_CountLB = __UI_GetID("Timer_Fail_CountLB")
+ tPingOutLB = __UI_GetID("tPingOutLB")
+ td_updateLB = __UI_GetID("td_updateLB")
+ BandwidthThresholdLB = __UI_GetID("BandwidthThresholdLB")
+ StreamFailDelayLB = __UI_GetID("StreamFailDelayLB")
+ MultiCameraSwitchLB = __UI_GetID("MultiCameraSwitchLB")
+ Bandwidth_ThresholdLB = __UI_GetID("Bandwidth_ThresholdLB")
+ Stream_Fail_DelayLB = __UI_GetID("Stream_Fail_DelayLB")
+ MultiCameraSwitchStatusLB = __UI_GetID("MultiCameraSwitchStatusLB")
+ TimerLB = __UI_GetID("TimerLB")
+ TimerSnapshotLB = __UI_GetID("TimerSnapshotLB")
+ td_displayVarLB = __UI_GetID("td_displayVarLB")
+ mouseXVarLB = __UI_GetID("mouseXVarLB")
+ mouseYVarLB = __UI_GetID("mouseYVarLB")
+ __ERRORLINEVarLB = __UI_GetID("__ERRORLINEVarLB")
+ Debug_TimerLB = __UI_GetID("Debug_TimerLB")
+ Debug_Timer_SnapshotLB = __UI_GetID("Debug_Timer_SnapshotLB")
+ td_displayLB = __UI_GetID("td_displayLB")
+ mouseXLB = __UI_GetID("mouseXLB")
+ mouseYLB = __UI_GetID("mouseYLB")
+ __ERRORLINELB = __UI_GetID("__ERRORLINELB")
+ InBytesLB2 = __UI_GetID("InBytesLB2")
+ InBytesDifferenceLB2 = __UI_GetID("InBytesDifferenceLB2")
+ failLB = __UI_GetID("failLB")
+ multiStream1LB = __UI_GetID("multiStream1LB")
+ Kb_Diff_stream1LB = __UI_GetID("Kb_Diff_stream1LB")
+ Timer_Fail_Stream1LB = __UI_GetID("Timer_Fail_Stream1LB")
+ Scene_CurrentLB = __UI_GetID("Scene_CurrentLB")
+ PictureBox1 = __UI_GetID("PictureBox1")
+ InBytesLB3 = __UI_GetID("InBytesLB3")
+ InBytesDifferenceLB3 = __UI_GetID("InBytesDifferenceLB3")
+ failLB2 = __UI_GetID("failLB2")
+ multiStream2LB = __UI_GetID("multiStream2LB")
+ Kb_Diff_stream2LB = __UI_GetID("Kb_Diff_stream2LB")
+ Timer_Fail_Stream2LB = __UI_GetID("Timer_Fail_Stream2LB")
+ OptionsMenuDebug = __UI_GetID("OptionsMenuDebug")
+ HelpMenuVisitWebsite = __UI_GetID("HelpMenuVisitWebsite")
+ HelpMenuCheckForUpdates = __UI_GetID("HelpMenuCheckForUpdates")
+ OptionsMenuFullscreen = __UI_GetID("OptionsMenuFullscreen")
+ IndicatorLB = __UI_GetID("IndicatorLB")
+ HelpMenuAbout = __UI_GetID("HelpMenuAbout")
+ StatusLB = __UI_GetID("StatusLB")
+ PictureBoxLogoBottom = __UI_GetID("PictureBoxLogoBottom")
+ OBSRemoteLB = __UI_GetID("OBSRemoteLB")
+ OBS_RemoteLB = __UI_GetID("OBS_RemoteLB")
+END SUB
diff --git a/source/readme_InForm.txt b/source/readme_InForm.txt
new file mode 100644
index 0000000..e43837e
--- /dev/null
+++ b/source/readme_InForm.txt
@@ -0,0 +1,19 @@
+Download QB64 v1.4 or newer from: https://www.qb64.org/
+Download InForm v1.3 or newer from: https://www.qb64.org/inform/
+
+Changes to InForm:
+
+InForm.ui
+---------
+
+FIND: b$ = "Initializing..."
+ADD BEFORE: COLOR _RGB32(254,254,255)
+
+FIND: 'This.Canvas holds the children controls' images
+ADD BEFORE: _SETALPHA 16, _RGB(0, 0, 0) TO _RGB(255, 255, 255), ControlImage
+
+FIND: __UI_LoadForm
+REPLACE W/: IF INSTR(COMMAND$, "-light") THEN __UI_LoadForm_Light ELSE __UI_LoadForm
+
+FIND: IF FPS >= 30 THEN
+REPLACE W/: IF FPS >= 15 THEN
diff --git a/srt_stats_monitor.png b/srt_stats_monitor.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b710ec7f4ab1f4dbd5839678df8197cb96c8a4f
GIT binary patch
literal 24079
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