From 8b81fd295f138f43ac7250d0a1ca7afd4383aca2 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Tue, 28 Apr 2026 19:20:14 +0300 Subject: [PATCH] Backup for MikroYellow created successfully at Apr 28 19:20:14. --- .../20260428/20260428192005-Binary.backup | Bin 0 -> 116182 bytes .../20260428/20260428192005-Config.rsc | 2375 +++++++++++++++++ .../20260428/20260428192005-Diff-Config.rsc | 8 + 3 files changed, 2383 insertions(+) create mode 100644 MikroYellow/20260428/20260428192005-Binary.backup create mode 100644 MikroYellow/20260428/20260428192005-Config.rsc create mode 100644 MikroYellow/history/20260428/20260428192005-Diff-Config.rsc diff --git a/MikroYellow/20260428/20260428192005-Binary.backup b/MikroYellow/20260428/20260428192005-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..db9b02f50d547800e73d29034fbac15c03b9206e GIT binary patch literal 116182 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 Y>0)Qhgd8 zqve;?3|%6D<44?YUClhx)RB>l<95wN!ZQQ@z+Y z)r{X;`@~}i7l=et!3j5^p)wwjWaCK)xCTmVo>#0OE5GN3P;km?Ncz^65(7A#n{g|v zN!50JL?(ReyZII*kD3Bi=gEYBxm)ml`)s)qQR8)EUd+W2^5jO^6Y;34@#bFfbi)$J z0f;!a)2le0_m08QS3*;q7EEiFRs!d+>V|?E9ndzu3##TrCSV85g)^4WTDf@&rchp= z^HyQcupu?}3aca!FNQPK>vw!WWIMq>f-&D0#4*$+d;b&k@%aei zZWO5zw`bvaJO}*VXBw?t%%2d~gC`&CSkA9Tpqr^9eu$j6$w3#z@ni;nFH&w(F7Y4X z;TAGl@W*IJo{5T66FTr(Tv>E z&O+It2Ce#B$7js+;!!ygA@uN4ul<%)sIyYMh_jMLtaE1vlE2+LC&Llt!cOtOc8>nJL3HH+uHC`7BGoSnm)q^8c_?0_Krz zW+XGo39YeqvUE!*ucuGzTV+3YgjEQh{>&dFo4Czh`9GluObcQ2GAr>%Gn2UGm?dl& zEir()+25(9aykH(1@$Zc#E7~E(f*EX6lz`h)!?kvkq^17H3u(3dmfKpT}ZJ=RhVSI zJR@U1udGjIWBLT|m~lVLS;fxfls=AgzZ*?B?u!Ec0~^nkd9{kV@eiHlAb#M<#{FrY zbgmo{1H0GPLG)#Ufm2c*r9CKJXEFx9Kc^Lt! zYqtnxZ1(`EYgrOIv8_jQlE1_H5haM|8*x;1(J%w`}xg?is6$B!i*(S4Sc~t;xhE(x<5@cwsqag4L zkkNSJQRFhq3s|63ChS8bS@y>N&+wolZr`T#V>!5JSOqa%u zaQ#wwZTZDsM2?N985W8d!>MZ~$Fu~|)m}^Y6W5AQK}oSxVj!#i&9Iq?dFMPnMBa(J zd{10Xyp{MP&w}S1t5NjB*ls>tqBsz~+W&5~fXl*+X3pWmaC5a2tCuj*2?F<6p74v+ zJ+ohawZY~Ik?V5msPl0?cwTVbB9>bCUhqRr4f}zU{mJ*CNF*Nk5WEtN8P?Md^(V-& z+yQ856O;kn$cFmjhnd?+ZyK;J(Y%>lz|ZKXx4~N_>6>w8k#7k=I)<2tB@t3;=arKv zBf0+^He@=!5gK&AyQ}r4e9qKWSJ*glOpUo}=a~=aH+ny=fWPhX`L3?kq-$BNiuTUs z0n)(ZdlQpx34n+K75Ot1B`MdU*+d|lJA#Ozbmn!i8y1o6nD4ihv52LoPX)%dkOBE^ z{S$Jm-yz^pnd9&V^@HzgJ@0O&Ns>zF=$23X_tQwr1E!%yFDHLd0mZTov+?LXUYkVv zu8vHCRE~AEk8j~!iSB(LiP~D@e8EmNDJgmYP83a3e!B;q-7V2gehRAr%Ql?+2;1Tl zizCyss^)}?8AmgqHUv)zNc8(f(h)1QJUXqs=Q=BH`M2ccp60>J&#ooiZw?&3qwq|x zIl%sUoMx*#GAI}Xm~6&`6UkL*3}5~eZ5Mn!2tYkowAp_!x0{pF<4|#P+?)#t=;)f+ zWu*`EVrZig*gfR7TMU*K{qGNO=ibbmCY#LvM6Pj@7-lefeVn6|dEH9~5A`sXqgQIe zv~i-DmLcrw{;G{ooxT$G_TGPuoM8mx0N)^kv-2iAAi*i;cBAcY_$s=UR|ZG>lOj?x z4zy_<`i@Hc1WhzweqwG&UfVZlKW!s`G^->QEOA9cws<3QSb9aTtactnohL7A1`Suo z{a@(_u?7r>6P9KbH~t_)@B)+wsAY)O{{c6bqxD&62&gg`Pde?-p>zEQ(jNwm9sFMz5Klee85qOWsHN-oQ~hycIdCci`f%_--oFq$pdM5 zUg^i3EdmmG7VL5)S1caf+oA+Ar#bWdI-gn?R|8)Kn$cJ!o0SMbtA};gL#dn8h1%tn z4%vcHAXZZsm3w}6!c^%#hwT!0XFkZr)UD+fh5iBTRq9AeEiy!3J5xV2?ZblXdFBg9L=J1U{&V){r8cLm*Ccj zKq>Gitf@(p?Kvvo2#NMTKoZwA2VH;$wU0kJ>s6rSKhq99E%e;~H;~k02y5cKaKI8} z0*srzU=`bpcyKH`5^))S`<3{q?*!&=qs$kk{hNU(0>NI#%vR;nFgs@9cv6EGQ1BOj z0)+Vsw3BIU$@{dueokOGHGpwNxRhGBvUpMCw_}yfqg}$n=Fc@sMelZEWIQfjGX@KKKDr9Iy_P%f zoa#0yXBZ$c)DZoiw35YL3dZgG$SUGq45@~!#SS-()_iIH+5p-&YHZ3P zFaf>hlM43wIuOO5As_^f7^@3e=Dk8UkK0Z7oiYdX!%-Ce9c7w7__#oMY6fI7NwSYHI6Y z^!mM-??krIP>Qb20}pQ@AwPYRNeoU7&c=WLs2moXRx@jbzoqj!%=2OgWZa+AaV6fMbWmT_AA_ithh z5@IMJBvqi4o=`=};%)q#yDZj~=cwR<-(>-Z6Fmnd2OzI_FoKLGi>iox_IIBwy;yC7 zvJkadL&z_zHm*=GL^U$)C42A#ehxccjFawsvtC`GHuAE{-ycxQ-`roPd>7_=p-3+X zpA0rIc(wCG#oaUnS3o-<&I)?tQbZ*k-?KDA>b?`YNvsz564=G%rMGJ_g8=_O0KjEl z*~_YyCZCpZpgG-hMut}#g}y{`CjvYDrXcCro1N}Xulzj!kkQd8)9 z?KEW3+cK++53r2yjuI^+qzzHFpV^odBng7XfUP0YKx(um99*$%UX;@k$ue@G|Y z%ei?!SwJV@M`BSgzO-+|-pOxzW%=tV;~Kbw=)UBb5;6<}pC_tz{R3d_h8XC_6ld?b zpG+WC-$2WCDM@Ijm7)i9nl=zB`p?JdWZD+7&3XX9$K@ z9YazRC==HYFW-yhi+-AV&JR}ehaS^#@Ox#zd5!=eW;qc>#Qwp7wj9_fep3B*?~IM2 z?w_94vBiB{A3FQhRtg$9vaMpjtAmrFr|0?Y-yamhF?*a4=th>Wl5Ndnd;kup82cLg z9&ZRJOp+|~_@v_{0EpX2%erNtzEKfc`&p^RuWMpiH!xuzDIxw7N6LWtQelGlV?c~T~ zUjQ!%qD8+s+Xx&5?{}l;ICNtrMT{dJTF{4pn0B}~{cLb&MHo(X!APb~RO(7J_WCqi;crWA$JspuSkz4o7co1N}ix|${s_PjF4MUOFkT)hNT z&K)R2v?+@o$xHaw_@z8d_j80XlisGrq4mxyZK}c3$&WyvU{WC8HLkJ$2Njgh2Idim zdY-y7#L`$<+2!ns%RY+g{iRE$j@F)coRR~MCU6<6t1RLDaNWz{yw8Tdb~AH%#$>=S z?Jf9}<p;|3&0&w?h`O1;!Z?+71g;eoqp8hr1x$n`gs45q)~r~ z@03S6V$XrBqzWI&2a8~EV(lzC48sAioK(EGA0W>3OT0^rRGONVoJ%>lsco`m{vMr) zBr;!uJ($7Z|JS|KUx8}sEOS?YODj*$?U=AKn%A3)Az8q&q3UMw@!ZEaQ2zX>BiRX? zk)Kz+3krUcy(G0o_!O$oN|fGmC?j-5K{m3T<_v`R3e}Q0Y z;>+bJes%q0$`ZIFHGQmdR&~H(f`HMB5rlwuC={Y=U;AtE20V3&*4w-+BP#4RZ@;Jc zXA>IVu;MiojPTJ(au|2mx;_4S)7y>NeT=VPu0KS z2**w@O~>IyW--ia+*h~0EWgj3d37Lz>6U7BRLxwM)rNI&>;OJ_iXv(&>#mFO$*M%cj}{5ILh$-QRgiKDyt|^i z;S%k0;T|Vtjy4?@r@KNJdA42I*D~^P&jXtVT18E6;sPHV3IQG~vsa<4YR-I4dA%^v zR+$q8ksTz?5_kXoxk5(daTRkQ#{3D9^AonGLds82Ai1CV=V;Au>y4V_E?E`W7e-Wv zwDM6V-O5{e0I+B2WdI)WemIQeq%(lOI|9w&utIzw@HYgxKRc3>cm4%33{ zOs+YRLIQdLE!Nh*DaT;z@crD>7hvPN@<;2`$UWZ_&6!2!A3X(8VZ0E182_^9-Mmk{ zcl^=@X;iq%Ff*Vy0YAjmg-!DkW9vNdU=)#X@|gX{|0Z#64FCZYtAfkb2SepbASc>8 z*f;OX8|JD_Z6=V#H<0`BZ^>_J2Q^jqpV~BR#5h(`eO%q*J8aoD!i+Id%?`(Y=6G?0 zO_thAkV>c-S0ns0elbE4EeK%E1Ip^iMDsw-!Ye(MZoUDAT(OyX;nR_TEpHyNGr80J zm(^D-W^OhMFt@hG{@fP3j1r&^W6=d4wCY52n2FB4a2?+LBT-ofr1sQgJx4dcY8+ec zZjI;l5obVJXGKbTmXvCykb=UK>64^j!Vq<>%beNqcTXfLf8f)gT84MY z9pZXgY_}u4r-tIeY%u|gr_pk#Dky#L+%%R08Tu+vEB_{nxJe1tAi0%McJN@qs&fR1 z=#H|GcHvd2s~=N+h|YdzZ4kosU1IKTP6skfY^0a2!)N$RaMN6JQI~-eC-=%y&vJ@2 z*9)uUIt>n(rglzZbi>zk@=XtsxX{tuk_qh8_`rU6J-ykP|9954RT$~}*e31W+wS9* z!~n(PmpH*_w=Ey47=d>3-KCCb@y6MDtr845(Y5+>)E=a1 z;?76PQ!Xfl6&B^aq`N-mhyG4Q1f2%wJV!48__-zTK7ivL7%D5pSM_ zQEBI6ZHun+@RRJqWL%m(F@zONUEkkI6=VaaI7k(u>0O5elc$jO_|iMh0{|ve`q{}p z%O?hIN?Iw)i|m4XCRm6Du7$&Kz~d-%P5!jqNF z$U>HQ1BJ9imk?v1iK!q`u6@QAj5}Sw`Tx%@2#~r>XdMej|4|VH-gvTHz)gxvr7c3S z5+yhr4}vq!#m-W`@;2_+68NY(81`$Wq@P+fH(-N9#*NG<6vnXs`aIe7^Il!dVCU|& z#`kwy`g-GhOwaBSy%_v`J!q3&W)Q`l*YysOby$+&(J>b5e5&*+npgriV_}k&%?A=c zubb!{a8b)lx~GV4?(C0yFb|hOWg_6%e&SN~mO+x4u1^VvBF6oE#ivG;_@SG_QE>ae zoO-+rfyZ=0yfAAIbIN5IJkF7W^gL9<5m1w$eEEgl*W$W$sYFL)1|Immc+C+=b*Fn> z9`8XZ09PdQ$+>Zq(Rhtlf$0AMxXR!>pl0=#%6tyEbg$C69xp4h@l{_1Nfp|^0Kjdh zQBU?K<%waBI5>?+Te4NEJQAErTSAac26>)N86#&$uERzHBY7J#$4WSlECCj8OO)#p$4DdA$zOyu`mL;frZ0V}kGh59>b9BHOxn{ij$vY+ ztb_tElADEFHO&u-YbvO}soMIUDD$LYlaaNl1K72L1N=P+?@1<-B3WMo@>Uc4)pE{y z6;wT$%pUCBJ07|@t#15esd{;T*ZY*Qi|TJel`#SKp%R*>4N=*`E{Vh=u8O^&-~CQD z-NT1#d9oW#JigknAE6i>ZfX zdHKf@rpd^SVxlmM+n?HvY7hhU*+g<*z zT8vR&Nx_KSJViVkM7Q z*=Q*DraRF2A8(z32NI4CZSo)u5*wiY=Zeaa!UKCz;V9 zz6X$4{=g&88^{v;sd6KYBX*zSRuRd^mjKJ{861F3uxR3I%xWQE`4Kf0fb-@C+tHn7 zQ{2qT%;&p1xC?Wtv18KVXYM+}Y4>HJP7NkhM~R1=1gyQ&{oK6;iI^ca73HrE?Sp7U zf#FzQItW8C)(Vq>5yC(kZSq9q#)-N%SxzAxo9IbjM5;{*G$SzcE2p?_ zcTupwQKURjW}!4DtA6+X|pj78LpmUQJJr4{v+DPb6zw4geWKrs*t z$$DAicbttsY_;=WWp-HmKny{vy6 zdLy=-`Awf*)*DJo{ISyhTXAndl=zjVlPVz{%&1=R0z4f-z;{N24x$oZ@Lo{BJw6Vr z@R~ACXO7M_=xht>L!}*MxFTz1W$f9C#C~bMyrXyFhEiqg1pd?Y`hzCmy(4wqL`cC3)WuYkwovu5dX21Zt+lK%xzL>!rA=nB^0Eql$dPpU&uFAhEF0?pCt6 zbkR_9`Z4!ER7y?sI`u`)s~T7@YiXVcmDAFjN)8`M8j%9Hg;=K}Z=}`rl(#3)U~w=q z6wb;b7$mOOvnHN0o#oa_T&9xp@Z+E&!@8*dl9eHLd?NJ;p{UVCl%bn9X)dFJcvSpn zDz<0k>5mlD7NiWPeLCLxbpMZ5`Y_xc!3B3OVCz-#=;vKicz_yF`&g(tDGV_iMF2l; z3SobXNfd-spSrW!9d6dasA_d~^}AM6Ns|+pidk?qbsTKK@O(YE4=gB*o+m@y=en!M zxgS)y)(kWw=}}LdWDKP(lppRNG1#$K!6?M9H4R+cmPDj`{3Ei;?2S}F-S-Wu2A}H( z!bw{&50PKD5p2x#i1*@r1kt-Cmq}E3T>z{tQ^yblZM;c?tkv ziR|(45=)w3#KecA8Kqbya)(wp_)dLY9M)Jx{2hCAt2`c@z1M~Tq9sK- zI(p^VrO&8xT3V168_AB-YOXI;x)@lyEB6_V2r&VavTnp77?;@*BBG4iHI<`)eoV{i zPNUS0h3T2}6gRP>I2O|jt$I=MM>K(k3{IDr8t7PDx-IJW?TXXelu-G}zAVXMrb(S- zc=_nOj}_qNR0pRO^uN1aSDEx?u{G>=%i;kqrsbcBD4b&60!KB_Hi#HWkg${C_whoF z@(`xT1YrRvgVuF?;d43RRuJBr0zJ5Ntg2@;aPnHW=|ygRm~jN3e?uhIjtA=E2-6kT zKrq7<7qhIPY0*V>W;Vj(5SMFP-(5*XI_UQal?8O**(JGFlX`@soJ{BsQ5Rk+GYA#6~_L-(;3D;oGT)-aA=wYOX$XCShK8Ne6>bZNRuFuj7qn)>5gM94uNbql@C zX3c&f2@quz=+Y5XGy)D1cW?<{yT?Qpn~Mebg^+I1ZBq`Y;`5VPwEu z8Nz_OQYk7(cko-tAlxi+?8EL^eAW^QI~;MT#++Xow!pfnYtMRGJ-$6drw4jvF>)5E zDb1P+kZDN~%>Kq-)%C@xWj*%WgK~>-e?88f?Vru%l|2h^{Tv$9_U;~-77A)oX7~m} zwM4+k(Y?Tpvv>94pADX=kWfxj?p?`2DvaV@OBG9cdl;(P2D?fGrjzszAkbPH!Wqf^eQwj-V`iP5<^MCSK0g>-dG zBj@%flY+w?yJK#~s2(w`;osHoc z&t_ay#ep)aIisIl+c0jSq!;<`lRmv`g#G~@2jcLpKQwyLeqE&=?)nc>7pSk&pvDeV z2BK)l*sb2(Be2bIy#jMdI66|bxW0Mbv@YQW*m>GlFmJBO0$%{yR7aMq-Q}p>KW4XOE&rn@T375y-R<{ zCx0}*Q-^uwa+Z{p=s{`R^eS)$lxy7xxcp!?I8zh_3vB^R&+`R`{JU`A!&5z*#nWe; zixN2H0Ib5Q$@ZmstuzgUV+|mtnr{2&KDl>&cu4M5CYH50keauerItA)=dxn>B)~a4 zuc5E~ak8zuIE2<; z>!qK*8ya}!0)21d{_EIpBb(OjakvtE02RCvU#ax?mWq*4G;ZlULQFI>;z!X*2|V#| z%j2b20EYOM8ejJMo{gz|PQ8e4k&X1{!IRi3gg~q?QV@6%H{10?{5n5611`YR=QX}8 zOn5;+kjOE6N`A~59%3g6AXaPs%>0dRl3EY>9`5MJj_#4Cj*BSid9lduBg{tZBN*S`6k-z zOhTKx8U+))OUq(`@%!6b4sphT>r4!o`9=Df6){7vG9}5o4e>ndA`j+z_0`opMUi-{ ztnc?N&desOrrW_Id*`z!P#Q%?6@-iTEFFBnzP(YSyw~8~@AO_dYdDj#aS*Qv1?{UI zt7@I0bGh-VmOHDuh;r3%+m45Y0lxo(f4w|)8Zrj4edOn?;K|6a!pJg4!*wVJ zctgogCLtDjw_Av_pH-*%>`ifNs}M&X4yArrut={cDyezIu@vN*9(9KU0~2uhQ9oGlB(Im%=MY9Jz$q^=2dlSH%+4qi}(IT8R~djLYAhD zpt+fdT%anQ+dhgmC~ICh5tau;m$*efRMcVQ0W!|w8-Jm1_Oh<6|K$x-%5HZ9;>Yb| zB+L8pT*u{vvbafe_mBm}^_9d99Ea7STkH^Uj(OGt9eLI+KvbgKNc|Iy#3TT!wbE6+ zFuKlpHKqyq9t`%F5c{_o7Xf{H&^dz$y1P7`g#I63GX?l?a^4|nhOrxFeG*`R+rMnh zLs?fu1WybxLSe&=r`Sb=xrF}d^H>pHakeu1$e<;dts`O#D41ci@7QSo*QA5TGRW@J z4RaG37laGngG>w3u|E_$eZ(+QvyU6g%dQE)Xn6ci*0g z2tU(Swl)ELN0|%gTH3M zH~j0X!&$XI%bmf7WSzWzEMjr9ig$;jF5TwPgd%Zjhf7DJrl~QkO{o)APTHZ7TsD4dn~NiqqeD zmE4dh%w__Pj4app{`Tr2=$EfJ_)r&(s6FYTD8vJib#0VYa&S?r);LCYzvFcK@PSIJ z?#ZhtYht7jIf2O{6-qlX+2M}w;-KK!Jxdk?H|6V%!rNSU? zMa3)W|5;2F*de1GpVP_pEqD8Pzwt~isKY3`{0#`Y#`sbULZv0;-q#6>Z+Ut|+bV&2 zliY=oSpHIHfkVF^fUa??;M0E10P-Fm!<#j)?UU=c>Bli~d$yq+MNz3h;3(Fww052> zo3;@Z&#uvI`L`Ebnl^FH=q>XG_4$!@6_~JKJNv|}_|f2GTgfY;8(qsX43Cw>eW{); z*GOdjv8|ezbTb_alRdqdxNf>p5Y{ZKY_pUia+zp(%oOvW^AJ#{o6#9;1C+9-_Z;-( zpN5;BK~-s7hBOitg)bhpg~90Vi|E(ID6}6x8E*q_DUIUm<%dDb%#FbbZ`e1dmF`85 zYn-|-Z3>(0iD6)u1o6dfnldHist>Z8$yOy6JBtTiRw{2?$U%3j0YM?&Ihf`ol} zo~q}etVg&5aR$X9c5k3s&JF=9*7Gztx|X z5)?x7MWO|?G>ZB31Oe;!F^}EGLXil&@Q@JD9OL;gA!Q!v*^Hd49D_M)KA8#)^{k#Jhnm5&Y38hjkg992o(Gk7n z3hW>3vawO$E1w~pFL1-&m7UsY{f&-nYl!d9K)JBZ;7}qm2ZOlJe&VCqrnnCZIlYa) zNH3d(Kg2$CfHE)E7OGa9VcP5F`ErkD_6NlTI$|enRB3J1r*)f8W}47Nx2r#WJ&YhN za@R-}ttI|PV{oamOkM}1Za&&v;&SPjb`iN~5}3pb6zz%A^B-{YH`_vE;bqvvs_l9J={D z#~oFz=UkQTpCt3PN&tfaUuv8K!ihEhsv=^m#s@IBG4P+WC6WYwa&kJ`J%#tl0;tz7d{8%knM1c%AA0F=aSN_Fj?rrCE!?)` z`>bQLnMn~&63(Tp5!e|X$fo$*YgpIPpv&30%+lU(e<(OP;kf=IwRyTbX7OKoUt=qX z_$t zwZB*0L-pTj50~}S&|kG93ffs3)R#7s_D}zcMFrSX$dSoq%kFx1f3XuFgWWeJRGDGn zBgVQ!p?1y17af!J>sJrz=G2l$aQE@-iKHE9YJt%asoiVu@rik0IAL%QgT4Y)bQ<|A zw@&@_D1d@>gHsR+0|ZsQe6+^P9;5q!J~G9ZuJ*k_l`>4GfA(8Ykut=c%`wqHR z0{56}TIQ;MJAxbV7)-#ryx5D8>+4d2*KL6Vp8F|d-I)gsWF3d*IjTLOQh{%+C!%hA z^Br1}YHaJ=bkMK$TlU3R#EzStXaBfa@4LU5=>poTcemCty5>H!Od(umCc|fie)1Im zsYy&vay{O+Sw&t4B}T;#1IlhTW(0yiR&+PU)LoHWcdUsTWD1$32*I!F6fc?64(?HO zA57jEKhljCEpG>~blqrH%sNYRQz)1=Q;a7s`V7CU#)25bmHcYUzxdgVGzTEO?0>tB zL!d(-M_03CBiZSK`KCAje^L<;vaYwf@{=w6?VxQQ^yMOUBjfu%=ot~+)u{R=S*gs) z59%7mt(_`iZ+zv)#M}VaB%V*@gm*iV*B&2piX4^W(Xz#7rU62Saye|uxx^67f7T)4 zt6vM&7+g3Mouq1m-9sco@cP!hgsXVtaV%H%!YT?}y<=1LX^>DJy~Z{Umklz0ppdNH z&BhpjLi4k#fx3YBXqttX2Fuy(aae3XNw!{+3h|t>hAD!Gey%YUlBoM$pmhwwW%w4u zwfc17Qd1BCtLtpL_eO|H4#2oJ;NQTi?XP>(Cx^#!OtWJwf1jw z%w^X&I2WIsoja$raE=+v)%x)2&z|kVZi#9DhP5DYcOhuIY}%30*R8CRUQLcfjbkM#>Tw>-M4s9KrY%od6y!4PeHA5DJsF`cU=px7D}DlEQ3Y zc4qP&6^OHxg{-@uS8z^_gF&qd2EE1hkwKt!iY|P>X_A0!nTb6Xx(aG2 zVlSJW*T{{^VdxJdGB~#@Re41VntG(VW{{(?0?r&C1IZf>7R`*Zpj62n42QF;%&p?5 zWqcP5j#BDu(m5rUv6eO`LKM9pqTDdi8yxoaT(W6jVc&3uxgdSAcuShs!B}?j3*(Ny zIfb#fn4zmz?D*#PCCOG|PeW!F#2;$t)6S^y%L=uiHa=^zvK%4#vPm?AC7TE)Y@zx` z-X}~Z*q15eP;pkjP)D#y8a^!)$WuNaTGmZKun6(2C&O6$CcBQUQ##{5hnzOTsBon- zId)O(IY(*&Na2%$2X=P`m3z)2&Ln{^dB+2%#^s6zjtrq@ zkPU_H*ObrZeY#=4^Z+X4d9x>vO3= zespt1_+00VrO>ZR@&NOU1ngm70q7OSWO!NXBK zQzp`jzAQWU3UAn!{2!j%%(7?9JP=SMyAINTrfof7gq***@;|v@2wkz0vIx?NOVMiADn6-V=IE1tPKnx zbzzm*uc$a`u$=tZo>1qx*zM7Db9N6@q6EH9>bd-Ve^@Gbd5cVK&V^p=#ZF4sUd`2E zBm5$4##^TN$?-2xHoTPaic}Op_=v@}b6n0S<#+h%S+z6dL%Qtl2XAN1;&%y@wX&zu z0;9WyB^Sl+$c@e4uF#njeb%t(v`GRKXmckMpclV-m?&OFf6aL~kUN=Mvd^<4G=Dz~ zrr=Vk3y#hv7W#aHz;}U*R-JGaTYQJ(D7iEH0*4W>)(!zK zMZ_Ce>a2NEAt(44HS^ns;f(WQhtWgd2V0?7mGA&QsEe*`&(Eb+`LRNP%_h26cDfEu zo84bxM<<%}ze4nm)$8N)jFeP@&5a-bfglm?@X5(Uc!7^CGt_5fNawe-3)L@)D#9|d zj5$KNcyQ6tRN1!1d6!R3%98S61{(}q1;uw!G1=}nAb%1jHIq6+YdiEgf4~LH6iu`A zeB5v=*0Y|sl&lL9(v7uRQs^Z@Yf)72{Ca|SqJ*es_Ydkw{qt@*AE<`C{BTi1V(a&d zfx2il3;XR)mmFrW_aNz(d5fP!rTJ(W*+U?5OX)x=fGAVl74piM{@n;3R>J# zl7m%1T^?8oNDUZQP#{SIK@DG0L<8%@2Z=#FC2u>We4~Tnd`ze$xU4*<*93r^8f~rZ zg?V&oP)*ZR1(8~*C)qUTpU^%9WBaSeba;t}RI`C&P+nu0>_K-}F$B29IlBp#6h0Oj zz#5H~SOq|PLFnZ|RwduA#zS^8Im1cx#79X14f%DZ9-ONVp1vJ4&5ikWCdb)!e)P>@ z?jdd(D2{e7KDcVRprslKi-SE^-}fwDtben145l(qWKz`u5ulQoDdngjkskV74Ul_A z$$_+TN9Fl(zHBs`xn;pJmGU?d{v-xd2Ul0GfmS;vjRCEE;{^6Ki1lWnr$-ff)e-A$ znuVazmaNDUIEgj5i*u3yG4?ZYG6~u&fb^E%Lqn82%<9_=G=pvdYf|}8qNUhuo-06V z8n0fwLW^GEZQ#C2Os^`yN2AtL=463ReDe>Ys9=EgHe1eW;-zLd#I(wvmJ=DXmCpk7 z`Sal{weV}ADPE>-%J#9-9*Z(6 zq5D7H`LtYUqrmTZ8uZ1bz-iqD)T>Qv->0(A-E~agZTt#G*cuPj_Zex&4Hp?`OYe(V zcf?M_N_9H7`H{ z02gl@JzTz-ZPZiWJh|5aa}Lw#ks5`#FYg%A6x9A|H5;yjhVsXt5o<0vIG5xolQNsS zGdP}!s7hl9(dqLh;}Gge#eMV9x6GPgON?+BY}+maYV?5NiE^Eq`47EPhCoU00QgL5 zDCSXJCk^CG%+MB5V%uE$(zPvIOwWMjoRTLJ$x%7JJdPHSLGbVt#DW&P95xJnIk#2YAjq}`BEzF$Dp9s{< z0bb*r75t^<6Tm;yPNh+aQG0HfZG2fa{&&~w2?@$|ZvS_Ds!yy=D$Q#k9sLC5%D>*Q zp+>zOr7k7vv7=T&)H`^v_rb~*93pnUIu0}PzT%r{Y4dU^4|9(;l4WdZ#7m0)wi_LO z)f%w|MbA_Kh0%2(jMD%d>l(pnxAlj5U{U@lQ37y4POjd&2KS1NeQg@&tt#a7{b|!M z4N6hdYJ8aIUv+^lY7pov7HRRi$3`p))+)%KtrqD?5XNqV1VOCfEudPyT27D%#NNgm z1oozgr;=+gP1kFVSe!}lW$o2~>JB$(XWh8)F_sQ!Cd47Z&Sal+kij8B=fDI}>Pm6| zcv3|k#?noLx|QZR1X2&YswZjmEx|TS*XCMcIB!9J`sVe>I`u>=%{_AXnKQB+P1!#S zW6cJF9?{iClg71q9f35E4me0(lIgQfgVDg;C4LiJIOi$KI$#~6$`=RN24Q!EpkMZa zQv$pruvqGge%`XE*e{+u*RX}nMf-=YV1mV%smmT34v1rzmQksk^@-%qEgHoBdA@Ql zo8rKLBY{#KcEbqTetq_vt~~Vn1<>C0BIVe%E&)8DXD*MZ%&dH7U+YC<8YZP%$u#QP zg4)3I7WHWbxl_m6x7M-zy0LiYX#&dg)#mJ*sO5VnZ@eJ`XW|>Tqv`ldU zA~ANq)qMrlDKJDrFG*2rcAg3qZVlKw0)MzIAjwEC=%r!ATF-;cLg4?|xSDmAxo56t zm2*}2gH9mk-STrd7X){q6Of4*dgUB;Cnmw+;K`Kt^RcX z1$KO`6y8BAMk6S zX!U5E7He)RH#mRk8G0b~GhL%ii2Ai_6~k>Wus3XX@dZ$rHyT2Udx}YWh7=@z?mxau z;E+2`PS;(8KMKmmNgU@DgKtdR>*Gu!&o4Kr2n&ib9t8LcS8idN#&*#>jZwNKc3~3l z%FCsjFGvf1O9dXew^KEAwX5wZJBS3LW)ya@~Y|8%2TC2Nc&fef-T#>Oo)ms`Effh8~$~&f-=9 z7R7#-vpk1pKXP&VT!I`u4Pj4u&>Mo%Jy3QVHr6)DwRtccB>bpzPI+O*YR!Va_vhDG zWYey#Yt*Jg(@!xws4(P3LW7*mfk!L zMi=J19?mj*3iY#8x!jQNb5AVNeZ)$&B7U7X)QzqCb@@oKwG!>Wk<`hgF(5PsPy$M? z%l#82KBa533sLDx7+qrL_M_E_uUDjh?`Rk9(?Li_hYlh@I;^pM5MV1h@3Z!``%t_d z)9IJ+G2H>V5kb#g*fp8dqA=OM!PtbNbc^1o6)%{IqB_V+1i~j@=rN5)M`>Z%7MR$< zogYRGu_&KfXZDof+&mqi{%{1feXQv5pzjaUgVnZc)*4GLd+5IA%9Mb^e zhD-7w>KA0F;sCOUX+Meq^m+X5Gl8V9rBMr;dNJNV9Y@z+K^YX9?6<{q9xQD$b&eNI zCV{Ip1VBWE)2gw@nzrEoNuhKHxlLSh{1SZbsTY3we9BgvT75P2_5#l6?)3oAKnOM5P9~ ztHYmwsgyy*pd4Ar`8}vuPE_hUu8n!@0|MvhYP*fVc<%~+1kO@X3al@uM0Dm^R9l5W>#)85=Eq889Ln@rZCjmifK z&N-tTKY^ZGoowiEi^eu=e)T}6kRbfuN*&pArCGJ}$qiQ+?aZD*t@4E}qCq;NOk!;a zPDq8NSvRJ@#SVn{d3j))y0h12)H)PECaI7_5VP%QnWBd~(yx;? z73DxyMk7+XE|Vat801oMRfwDama%c*_yO(DrEFu3jZ3y}+^;ZiG33@0WcKCE7 zkLIVYY3$Rltx&AC_fh;7nc*}?zykUQ9s^J=B-wI1rq?S1NeKFpIIIHRb8Y3(Z4>FW z{$I^9W+joHI8}*w6|ymRC46CSjEz6ND0B3`Y`0SJUagPETh^I*PJd0s7179n0nAOv zXgmUdvplUsW*HUp(Xr`Bih*Q{DW@dj8ir!SXm*JqMQFe-T&;KpWy7U5P!wpf|#zvWmF#X;lzyFEdudVy&;|2T!?Yba#r5q3mEAQtG7u6Y$ToAhGi zkkp+xPKJppA*mWC#1r}=iXWK8`y1%nqF#MEyRzd8#V$wJbJssKDlgx z6-o#Xf2qJp7xWRwU;!5m5ZseN?KQuChpR7%RLf?!kHo$NC2@1J>2PnRq{gcfd&Te& za9rRQ!)V=KV`;yj1o%svE|05}aP(Ewrvs{-co@-_XU*`7b@fu#t^jYks=2g7r!VGV zTDVjAkZtW@Rci55g``(kC-S1LpEK57q2Qle0#rMhJ30S6sEfFM=C!Q?x1c(=ufI0~ z|IzLC@Na+D+hS{}_)UT6YO!qv!EE)mSPtlzI`07Ma1hM5t-yEVZNGtJngJ79UKr1^ z@uTUjiv!iCXMmxiZ3u~u+;&ZqUT5~sKLzlqFLM}nOk;L}A#RW%>%sp)n`ygbO|GeB z9PBUFPZhru$S&sn!D_mYx6RPLl~CPQI9gyAT%KRTo3+I~V)qvHLy-FMW<)D~`C=0V zr~MU~L@p(wEAv^i1?=QEaq~0en0eNuSL;c+lmRKNeIQLhwWGMNd>$5P!90@|Lv%bT zJ|@Bzg{`xWhp-x!io0yW<4GXC%SZ^#PBO~7r+5zQ3*`c>Yi4kDt6&lIXB*~oJ&|+r zB-i&l{OK&?PTe(iFw@*UWJ@M$9010a`rf|b4B6x|@mm`0VNG8WQqB)E2z1IBy0QY_ zAvQ_rh6A#qM6g(qPZWwy2i^iYknt9t_Fz+5%n4ZzP_GJfVkhVX87vl471YiL1nn-3 z+P^v6ILdQ-m~Gl=t#i{W+~y{dIx(8SAREJB-LG(1sl#Btnd5VhSjgKc>ej11_~0kE zR*n-EB`0t;l{_D%jZ@6@zwQLOS=#<3uehQ!?i-0kf_{v*gn>^~ClZpq7=86*a(kqCK)7^zzFfP&%0w`k_$;Pv|jSTwgl3Z<|8 zI8RJJ*GJHW&OUw3MD#LXtA8#0>&bEnF6_6G40D;-HzKCRk>?lWnRgV3Qc5;oI8CT{ z?ikZb_lb$dRUJ=6%w<}i(Ni_Nr-7M9n~m~qvOdJdu+)if>y_IdRE3ZL3tmwIKkQyJx$!K|3C zfA|`a>#@|oI$&wB@JO(YcJsgN!Y==O4uV8gC`U%A!ul^(V)3-1x z;7es{1ogXv;#pD8- zRh`zLkifb-)oa_C;arI=y~V!uQekJ(zDp%qjEIf<&OYao)i5n)7fQMVkpCcVs~?;b zHU%i#Rask!eDL8E<=2%hbX>K_s?6f)uLxr|v^agqncdLtIISzjY>VK(+5p`{(Y@5FKXI{JF7G$1#3yQBVYl^6jp{J0DU}xlh-*gMee;_f=w6nwa zF7vD!IGL@)BUG8`j9z%B`9Y0${Sl6J)d_@+2u79X-9bSkqZk60=rA#zIJ^#P$*Apz^4xb3@abpjH1@ndN+1;qYw z!5tEId!Ld*<#1^~<&sXX{tkp{jD=^O1{CO7j_QLQOp=+a4>m8b2~2Uk=e`52x({CZXG3*ti^XEte_i2| z5M?2iuUjv%BXM$Ig#hqz#A!W36#yqfBVgKLW$MR-0LH^8F85>agrQHUT_~p7Xck>q zvk%Lc3xmNNQQ@@#))V%4(piml-k(!jE{)I?dY4BQU>G4=@IXm_!F{ymTNTJ*8*V(F z!Gt$(T02Qc%z^G+iKE^Xblm(GOGaz)#ZkKLA#se0nxc@VvT{9cw{na^FKS?mcwMxY zC_1Dp{kTd;T1g#k(elc?Hw$`@t!Qa3&%BMZ=6u&9>DZWXr~DMEs+CAd|2f1T3-b{% z>mN!A&rV^YJ=!w6U^b0@d3Lm`@SAVz1;Bc8wD6MLru@c$$LWb_W9}RDLVsQ$@n=L ztfXnBMVU=aMVioy@`%$LA{nfUJiNr{VIyZOtcHB7#C?P^BfeZQpf4{?3zN^#nE#re zh)sdy+WeQFd=rw4^uW6o$cJvA!_jJ6__seOEdk&Agl%Be>(}5Yx^#$r+#4>7JGaj( zaWwhcaXv&JddyTpLJQ5d^gFvL8&mdOUIfk;K51VdpPmYUwusc4M5NIa?-9?7w3Et|+Q=TrO@CQN}AH_r+ zGvdg8XYzbn8ktL_a%+dGJfVEKVI(cN_Q*}i4PFQxg`dm4f&DT?<7UgGk2FQ2vGgRk zOfYOVJvI(qJ!745CvlEU81n4kDo5Z(T6uv&KV;c>4VjsspZU@5V5WJ)j;EB^i^ZH# zP0ApdA4M>+KU*?7@HqGXtt8c?CY3p=9h8mP5ln7*iwL^)L8Q2IEX>x8zD05!Q^y}! zA_cPADy!aKWw^C9dW&)Zi~hL}iNhra{57X_eKri^vFLZ(YdSa22I9(;5NUNVAGy~< zZ0@q?ht4q9##t6^g5svHRs+iAe6omZL2FI?af1zW4p$Lv0y7m&J3JJDPqf!6`?V|s zT~LbzF4qL@#mmRzv8h#r?97BfhPkAMSSzsaq711k$?nR(ATA7I8?mNp7}Z8M(m?f@ z1L}8G$ghvr_|xJUO#(IP4_kxcoBaQ^DVZx>N6e9fF;$1KiG?nyTU@62H1=C4qnwbA zE<|Hrn&-5Q*od(!p=HEbnh%h#N{}?6fS#m>5#)I_qCK66)c(pkN7{=`2>NwcHRydv zseZ1EH-7Q-mS2zJ?Djc;^?axyCZMKlsn0{_25foXf^KqQyuhe>E}~8wz!$&S&wY(! zA_-w$LWjtc>IzGqM1D>htXND|_r3lmAT2{!*qmTY^)#|=qiwM$DgFAKpZK{OBtYs8 zp2XupVsoMquqw6FQ_iYECH-K^+pB_x#=zHUPM9#8r=nfyn6cBKwh{)~McQ1il7V_B zq0hTZvSf4n7tT!0mm5B_&1y?w$(U;=NE_jH0&&hyQ-gD*Cs2ZDR16D8Z%-G8^%d2m zXPEnoFm7V)re^%KV3JL#J#fglGn}Ro8T$xp)G2u!9WUczxD4Sh1_Yq^?1)Bl8U2gZ zjfPEqsXrlEL|p$Y^SHEZzOXUB0@bYAoJLm$ItSA?lq^Ly%1L&UagrvWpI=aa8ZTGp z)OS*ND6GT~P8XBJH(nDr?$VhkKYIwiT+*8_Avp+qmH?ZxSQLjE=T{&RN}1x2hPMQ8 z1ToqBQ6sU8&@=~TT+ztZm1(|^fuHtKlfYySCSm_?@Rw*!a$AV|-)>~aVHUK7xf78@ zoKVgKTy=>s7GKR(7Jm&lK_7Gk!OWWI6rPP|8xz>@4vpVbRv$~?*hyDI|I>K;@Gwz( zc3S(aNiwD8(UYxubUMm`q&Gga8VyE*lsARWh}=p!G+gGkH3ujA4U7?FB!~_TgSYxS zvQdC>rJD}op8zgqV=woK!o>MqYGC+NT{2&9+y1PfT|R6Lj1PD-n3etRNC9>ENUN z!_5Rm)>|G{zx4Ml@D0nUPbBOSy=YVtEUS8kxH0 z(Rs}@)nCJ|G{Vhh2MK7^S^0QCbx1yHYe0iHQH>g?%vsueMa;}Z>EOj~7U%*>w=4@n zl`|gr%ATjxGG=O$`D(e~D8%;>lQ_rbih-H+mJS}GM7knuf&O(9h|D;jOij9YE8iLw z|HrBh7FJ}V+%5Z|#X$ffUTLC=-xQ)Nh4y7MCL_D0k=noTe_RKRw^M9K^r`3`1}otd zjoz@i#3gwvh|`L#0C^FdbX^w4LC22U!UxqJJa%qUnzMgo!Fc0(LcZJcj#;Gm=Wd(O zcf!yo*1D@x+?57zl$#aJzZV?0PHG^dQT6bQyz zu<{~saD5O8QWUN02_@Y@ZVa>DOvY1IL!yrnOw}R^9j+iS53YcLxK#_jMM*1cK!Mz) z-<}2~eKYKh+>~N>l>vr=d7}(I*frSmrK7c5oK0E>8c}*Ze;Jy4w^@-zh;b9Zf9xBh z;o7}sR%yv+NjhDA$nTurpbFb(&KeA$Jr$Eu5V0VbXv9DvFlF6WHoi)atiimgCX-_W z3hdC3r76Wl6Bni^B4wz48;!JfwAXUTS~Hvmxe1)5sUy!3d@qAw1v2TXiFpV-uBi0R5RRpz_XMFt(v&@jY zAlivnyG>vB-^3fL-K~Dp5BqCL;r64*a$d%93;{V2WR*(HCvCjo-C~#MT&^U7r9)BT z10(0WN)S_#2!{pYWgE4u)~9kEZFGQ=5pRrrF(R~yOid?PORiWD3DqdQVWy5!B%*pH zhIkkOcD~WV2C}qT-?t+>-Qr$$4wlQ%ItfNKP5STd}hDI zuYxW8Hb*X%8*dT$>}ab`fO&$sjFXkkA0&Z!9Rs~3WyR1@M$@}z(@9b-oQQ?%63+gT zif_QHAo8O#jAx)&^2&z~3?U37;P1E9B%q5%&I3G ztLX)lmgOHkwTn|3i>US#;P^QuAwMwA;w&X*MQQbcVMLxrD%AZap#Q3FD1Lm4?bJ8FyQQp8)@$wc+&>x$sNUu80mvP%U9S^qp%l7N zAznXdWB}~epdU-&|8&(cp0npFV1_Nye^Zp(79LkD1+l)p|DvyB$6RN5yK>t=*kr=$q&8ECTLa?&gVJU4Jlp-{EgHZ2gZgSHe`P=vp&;@N^{ff@ z8;ge`ynPm&DY;|`*Orn9Vy+Sn+lmKK9dbUXbrJ^?fHe9g!x{=*hJ7kIeFa+gm`Ve@ zpy^%k&I)5HRYN-5M8VVjN5Xiqhe>U0>|H}SGbiU1Y(KSc;!s~j)CjXDf}3$G#9J;D zHSkS>un4w3!=h-D8RI|ekH_My3;7*n@5Y$KOiOt(DVHfAbfSH5{%_V@X#$F~7ZXK= zeI<@QbH)pX5a&XUds{}YGN25fl$~Iq539pE=AiMQDPA--07W!+zealRbJR}4Wn~Hw z;l&~fYrU4M3GZ_7mW{clEXPDEWq?N>a{$8I@bw86Wn3y4?5~&G0^DnZF{FUiLNt<{ zRr3h;18b{>mIi4Z8eAi5K@4{`gj4xW^AX5%=+#=iAs?usss~qq46OWYJeQ{0&A=DU zl~8UH=RT8PvG{m&*&Z(wfnACQu2{d2o_P`y<)0!gJcY9ruX;dd?wOjZ)-iQj4eng{ z8qLB!^w7grv}Bw}L5peV_|l~P`nJ+sc1?K8d0U9^+Y)A?0Iy85G!l%18Xf4}_9#kA~zG1LIQ(&fcMtNhCKApq-GNglMTws z{EuC7Q-s?3sN6w%DfFy&#AgH=`bDM(v0@15NAM97bnIM^_$ygOf?Hy}J_=}%tR;f1 zi`a7qSnR1sQ4!VE-{Kg_#Zl(ZVr_U9D?OfnR1~BPc*ubco{~b-+p;km(a44uZNJUYGAo#GGUB$R zqJirO59jbL!0{q%34~W?Z%mN-ko#0m%>}!fC zT={bPR6cJi9|`b5q=IA9yHQB?U$#=@)QSvd~xeDiDMM=Z$#7Kx$m@KXGf*s)EkdtYkO9F%QGpxX&(GYSi6vXfw&gv+>JJzGG;0B|J;e zatqd9rNUtt06n_QW6MwEy)Xd}7S-!vn)+;@<)x$6P9l8_=XKH#Tyij$9z1f{tBAXf z9WKuX4>U7DSTR~s7O%GZEE(V}}OuU4j{4uYEa2tp#li`5V!H(`Fey=j6 z>O8>j*OJ-P>1kkGi*C=KGV_?~O{n#(_--`iVVA1%ZK@L`|Bb_*IlpD$*WyeO3P@?c9~ryV z)1VUYiHf&2eF{4EXm4r@Cibz6kBBaLPQz=@!MJn_K!LlPSo*6ex%0slxHzK10jZ^K z+nnp6$zI2B?uUiIC3=1+nh~jy@%|SWj9&iowDL4>=~58DOh|E13`0sSa}E~!+ng56 z&*#M&6L;-g-I!TQ&wK=V161>dY3rTEXue{ipEn5i7`dgu*L+ofTT&A9%?BP!p=0of zHN1fQM0y!YDX>V^nj?hp7S9@Q2vzdV92f-9oJdN2n{oCfC8E@~h4|?yip(m#@=_>5 z`)6H1BX=yAtw5~>s(?6;#%z^he&$a0>W>CVH7kKd_t4d4MpP~Y8Jawg-@iUqFany7 zME)Os6SRCe|HSJ}uob8^c?=3>3Eb#|1oi;xKOrP6KR)4a^q9UQkJ8xu;L znJgzZR+zLol)PBQ&fQCSYP*sJ30(nDLmb1W5P(l5@<)s*e$%L*^){^1rxy*&QNB z!5+f(!8H0nraaC%iOlfaxdwNa*jn~R6Dr*Lm|q0)zBRI8>#093qLuM@Ci%2UXOkTK z8|fJLdbf#hjNPmO%Jl&Ztk}j#-g)rUmVAg5SUVufj`c>a-hwI)NKH#fx*E}eD37DZ zUSFj^pjb4sKSNBxans?U$neKIEF}Csf0tRPRY}lc8rHzR3hAd){dt-_p?S{%e?OOH zod&0(D^VLK)>TCu@oZ6PxqS$;6w7_dMDPOhhdCP^3uyqOh`YDFy*Ra*y=JNut`MVG z0LIMNfAAP3l6%>$k8_Kw*H+KA@uRW+{_}PpyD<3g}bBsOa zi4L_XtEtX&GFlzdZ?82JKL%6=G3;Nq6l}L zQ8L4AR;1mhV4};4zF4T$lJh|2jpL2g|9uHLfCnsI5Y^3XHn9D1g;>%X5xG~f1gLDz zfeQ%WkOo=n(8J*5st;WOUk1H|FRRz(ZRqZ=L~9OHb7||$p<8aq26znONL({yHlv#< zbbi?=G=c1R@CO2C!{H6Ni{T~M+ew=K*J>(>TOx!95x;&pCdw7SU6T4^2c5(OWwlp^ zt3xX)#*#grO{{>28rC*KK%K*65nA!6a9r;+S25$4xNkdVNja5^a5TVQ-AMT6fe!!WD{#_MSN|3H=)TW_l5ZF~P4=#&dGPrPvG^Bry@QCbY(dP+uuZj;EMC z5Q#lJgi>Brv7BRR9Wn*6QfTYhvid0BP>H%0;)F2HO-uLg+L4>|XQ~oH>?4N$2B)2I zK}`6x8=E6ByIK}n9y^sCmGnRX(K)KWzz)Dn=7xCTt@)e=uY3stSI7>l_%dcELmA7@ z)N}4A<=+ZGYIW1#KA=u*1^}k2f+(`nSTI5dcQ}6y1?U8{Q9C}R$E>|u&RTsiXxUim zWp@1J>Q`E#Y!xL;HzwNNIdN6b!CA2WR2DW$ z`!;yDCTH1N<>58HW?g!jY)nleR)G(iiE~XvG|;Xv6N}EVgF(CTO8;9f8DE;4R(z0Y z+)p4@Af>4^r!)I>5X3hjkJ0-;AzF;Q8rZ%brGoQj>MdV!joG`F@ZcRV@1(Ufj5Lkf zyc=~3dPTKB6<$@M}Id$(*OP>f3ZBeY&9ZggA`yo|I zbX)E50e+uTqsZ4n-d0%o2A4}f&*n#3IQs6#${qnn@trgqg5-Vtg*f1TS48ddKOprr z`N3PhZEWp9%Knji_DR{-(JNK||9%edayg6t{xRCco zE_IGcG1)>znm&{rEfeuji0^Yiumzbp!J830;|p1As&%H5&F=mE18kzTDM(InaY=+a zDYPP|yV`YHgqh%-v#1N!&LSgTYeLQ8^aA>@fa%JTZZ{-ReTD9rBEtkpN-9~bp=`p5 zOrb29=q>W8B1kGG#^HDRl5{UR$)|>}2sQecri%7%_9D9%Jx){ed0q<*F<(y8pYRa^ z*N{uQIab5Mw0%`mV}NVz30zT1h{N)d(myq!bHJwtztJUV!Z{rjI;aFzigAr-r$TQ@USRzoTG z|Gl?rA}LjZt39EhKzi+%-s>K$G#nk@Ly`1hx=-R1{STU%lW9yUDnBUY4~;SdHMQ|A zc;;=4T`!B_z|h>B;zuw0Sb%%{6hRjW#50}aXq{mTc4&;Pb0TT2?s+u6x2ETh!9_-( zIAB{;r95?TsT;r$j=tpnF6a6sI>8e63%<$g)mEc00h7}x?CO1aW@MvbX{qbKbEWjS zZfE*wM(gf_PR`aLr#2J!gEwFFrW$Ck%A4VD}d=y$3OHS$H0FsVZ!VU3tpZ;3VV34ed!>n$6q* ztDNl!FWi)@Ttmm(vWpE`Tn9VS*HqX}#P>G4_=jE);8VwBozEXBxYKc%bsPc%%STOW ztsFzxT5?FtksBxkx;mSo0Kgg55k%F;ikt}V#E7GOaxt$vKg$I`2{}MhM`o<`b>#a4 z&>?ry%PgBL?t?ZYFUjLQ-*)b^oK&lJtGc_#qe!;|57NGZglf_czC~3*6@i3V`-d=l z3vh-vT^0t@}E&fG^XD5Vskm!(f zCZozU>bQYdP}||K{S>V13O+!r4|_EggrsltBbMaYdfHE3Zyfw#7vN=#m$9g;umo#^ z)*dFx6U>3;jeg)6Vx`amY;3Wu`qU@ixHgAh>9>EA32SdiizyNAV3doY`syYZ^!1Hs z^)0>xK#ZAY4hPQYc{wV|U03kR0&4Assr|wwl)l5BYP{y0;|WiOCbuI)h@uxY-R76< zNiXo!(~(+N7XyZGCQzY^3EyeW4j;bf{ou4Wgx+lvhQc@hs(?H194ACwrnSTLm4ODv zdKt3;-$uXhUgl#Ol*?efi}}Zm);X$5b4Z}2N!=GWondoFIwDKv3r2XS+y~xTX@Mom z?6za7DW`h|2eHwhPfU=&S{S=`qiq)~R^HkvpHCQuWfGe@tX)`U|6%aVuO0&gSJEm1 zM&Ph7<}~yGHhxPoS@E_olYkuFG{dAq3`(n)tclKMueBp=nWnpPIr>vd1!hXDPKUAa8+d1Fh%pg zgzT1MY{glqcQ%KND!{3}Fvlhymh1(1b{k!GF<|3+K|wn5P4h9ptGwHaZb{fzTOgA@ zOGDgH19W*U6A&unH7uquU?O@oBgDflnx>`!dL?hDL#w75oaPZ>unpLK@L2MZAC02M z^ETSVcylHIyF6^HY*KhLcK#2VdW}`dRry3QgDi9^IInLE5#Rh}`QE(qj`$^&@&rNj zzv9*{f~2c>^SX{Xslb6Ry=yyLicx_lG1TsL{ZDmBee+#oX0LLP$@ynLz)fh%mYLMW zNhxzzYxRC&9!_Z{x$=g;kcRrqi}8xV;w{^6Fa9lm)@!g97sF~)$VCcgs`sdce!6fy zzA{&IK~%W#dE)QaW|$B#`~@VoFYBrAmNF%%1|?mDPLQ|!*}el#zi4x(OKcpa;$ffv zv*1_&e@_cB)%^Tx?zZX1N1AL~UX$31#E4wQE+z(=*SBa=I@<9kkG=W3v$q>L$Pdm2 zkO0l+R~5P153O58nqC!DjTZg>%yI?7Dn#pJLTsQygldk|jQ-%32QnXK%_RC2))K&Z zyA1uKG%-^bJ&+SyTTybM)!R42)v`{bRK$!7rM*d(3Y?}8OfHWKTSzzekpa!|KiFOS{gKz*vDrg4`txW!o{T7>+(Jf%dN<&VHjE$_Qzhn zCp35T_n^HfOW#~tNlUUF2I!2zgy-zUOGdrz;COCsV{7?HWJvx1PBaVTrPgrlSbOcf zohBDN=#_{$s&>W=@|SdiY*89v^dx#;*Md01o54^D_@LzL8tSVs&@-b|xqqKWPnrYX zN4dtRy%XpB1>EYpano^_yMro&1@i31d38tJmzphq0OTgWz4)X+FDJve7yV0iGR-7D zBxpp$=bvI6Q7GDbgiNyyEKoUqw9KZ5)TJYj)>yNAQ)A3UuFC^{j!TZiF6>ko<``ub zHqOo4gx^&LgL&%(&WgBK8tK{I;m+jPhHp>8m-buT2A9yW^*=Xn#v)kc7t99h#;*xf zM%ppn7P2IQS;jYDn6j%o@1*=M|3GuwQ%g$L9BXNYQ`bl#yI{U6n$N%dOCWS~^dhn5 zmg$EWgaGL)Ml?@>%w^)E-&Qmi_o+IBYk0HWo1uEa-YLxux)^pCi6-B6nwgF!Q{mb^ zS;8_+hWZ@A9q3ET4|6le9~iDeT#AC|pE{o$PIjKr}=SbAlG=|rY;W(QL{_T+4e3by+9LkR~sF!Wx$(z6H3Z$Tfx zD$YK40SFQJ=ev_cX?M3gc3@WO)lO^4JC)|pt@0i(WSDVuDK0iyiHg>)vm zwPW5k;~HU{6*mxIrkqEHScJ8jMgPbc***=`PCg*qNHlVdVCaWFrz1_LuN+kF^VOu6 z%b~VRv>OsKn%`9^XQX!^h-H7Et3OCqS~2*+v;v21=z30Ay-K(r|60AfCg~EOpY9i% z7gc++@bHlk3>lo-V-{FXLVe6c7ej|2Fg)4fLP}YW!mADI*jw_eIltW}>01=;$FUaz zTs1U{JHyJ=1hrSqtLU!FsQGCSRyzhx_WPdQbQ7|B8ZIYJ3%r?L~R-E&V`;xs7(i@{^kC=_0bQ-zI4XvFgj)={#DOAm7=A@TK#nF6_}SU~4o~ zS_#yLaPE;8_k@|!Y5z16d8kJPO{_PCK|d3?C0}nwOISb@9_nvMNwvC~BKsJ&^KDuu zKP)vHJkFLw|8Kg`b7uBke?Bey@zl@4!V()7Rw5$eLD#@u;CPVIOmp=4*Y$t2mr_}j z^1LQ^?mM5H=b6ip3Yy_XE#ayhXU>`{i|=+vP%@ zKrqDw@4p$tQ!Q-)^Q;u9Pey+wnFPm-C$>N-JwCrU`|?5o;|)QbIC#J-p3i>{H-Um4 z{fN~aMnd42^S1%QS^oGt&gA!4{ce`QelJTEZdhzc)r!&ez%yKK<<&4d_L2mu^DtEt zu0-O?sM?GFK>LzAM2NOGsR`12?r}&{CU9u*FCv@iSPODXJTt~pk55lHKDxe z_!P7^B0^Y!JfIrff!$ls@-Ogm6L*7iAGd;S3M6bZ7iJ~F3vt5n4m_h&B3G~t42hqN zFbhb~5opvFAu`Z!t|0r55^5@Lpcf$u+~$w$#8pdvx#XV*8vTHkAQ@2!9Fa1U) z!B>FgV={})cKX9>WlJI)tuFyl1&4yQaM9d_pVZVp@QV_t!?M^3ke|s@7Qc72(u&^i zd}-wu-VX&@2#W~X{58A1DDK#ebul~Y6Ok4p{d#)P`n@$=yjFql%GohF&1-W4FjTpm zwJaJWnQtuqFMK_O=5))MN2Ja;ulfAx;hb=olfU9f^U!xpZSeaKyvIJZ`MHcg*J5E- z3y-S;LC@#gHlfKFDCTuQh?(co?h3(R$GmaN$bVk~nCWP+JVPdCo$0~J+bK})x@O&W)$T_K% zAy2$(sdJck<8D|kt&ONxW=^g) zsEn1UcN-)7j|q~o<$^B{HE@!fSiFMQn!G3Qx3(GwgyZ2fzmmoanF-xoxuuYuibJzx zK(D@2x$}VB2Xo-BJ}UsMR?*n1P(;s~)5KdqDhvI{N~Z?edJi>Y8iIdLHW zO;I@Nuv`3@{PR}X(!89;1G9zIM-;0Rgx)oK=76-c-I?+&2YdlY>qtcGm($!6@K`nh zv3+&70-`=IF5PonNC0_UbN9{{g z3^biUpxRja9dW#Huc8o%#}5~K=vM{%`!(Z4O1K8J;P%p~m-;1~FEg|Hen14X!>t?g z>$AxtuTdkZyWuZLDE_p`X#xR@I+w+gt8;JU6cdDG%jR7|>SiGA)Tw=A-rXw~Uz+~| zH%rafVh;wM?!boJDUBc`&jnfHn)D0;daK1w&90f`f`iDo%(@g`k%bj|pE&I`4$vQ1 zc?@?ZS;@~Ywh_rFPkS6tWxtRl8)7BB89j|>*}eK8NhmrHWXJG)uxd_>7kG-w@@>xd zAk0&x*BV3FW2#n*WQskDi#7;}{F^a$un`)^8{&q0x0hEe`k!ip$7W^iD~^juh~<>1 z;w|^nFPCY0NU6)gS8~W;-7KX4j-iG=f|6x6hL=aame%f2hR20GKDa7K7U>?+izuKY z;yCKaDM~?BKvXE|k^a&p9v?)sLoK`r#b$oWp3jA;D$F}d(yke=3qooI*;byws z7FvZY?;#RBq?InNj5By_A{|<a% zF26Wa7sgw-7=bK9MO---0#KQ>^5W`V7hjIp;;{ENQe7cf5yQZl1U)fp7Y>Sl2Fjvg ziNl?xMunfzl@s$fpU}e2T2DZZy}vO`@p_QyJ$tHvu^3)xbk@yIJr=qKfQ*jAulU z8)*xM;CigvthT$pbg>&uKBV&R8alxPPsdT8Oe^GE9xMghb2EM%U#j--mvxgb_sQK| zqVK?jO{o=kNqaUfdm&ruIb)pvU-;Qg&Nu!~Lug%rm`4+o@m?9F-s4=XaSfp$BR89m znj1euGCtg`(_k#k@2&*xMIwsq;Fzp~Mig(Vss7ZISbbq%5xucUU;Sdk^Kr=VGVyT4 zlInpF#p(`~E=IL*_5MXEo7E39UT(x2A$0Jqh?%is!aTD?HF8i%iG{nWr(tqQhJK4H zV*MwNrkx+plT6>;z`6hVj!0EB;usJXflWW0Q^?r|R(lHTEh!;GmZLDjUP#Nv-*}xFIfNRuvl|nffwPP}W_g8yp z(qXy@_qqeT3%J}^DkdsJGZ^Fg7^s2B_B=YNhAtWulNb-am*h}o%nl6hJ&6yV0Mi5a zX?sEhn}151V&{J9Q~wvwG`<-P32qQB^-yDOnQ~yqFWy%=UZgPVac`Fv)?~F&vHPt6Qa` zeFnGe$&1_L8gZ`!YDz6Vxs%RVcy04sc>(hqJKJ}W0m8&4&ssC)bhOk^z?drf9>V+N zE0fP?Ya<7K8W=1DWT%TH;A#C_1N#N$6(~1Pvdyh>LUg2wR%d68O45qVn;s}zdScmJ zm&{PotE459JvNN_m+4`y2Rd&{80&f!U@Qp`!~c?qcPUFMl1br0tL#F?j?q22V0hZ5sl^4>#3KF=#72(8l*^>2Arzo(E7io(ZiVG)$y4xL6+ zv-^dgg(u&Ut@W(ogkUGWAX$c$wAMV-rMBM-d$4vmBBEE5cB9Km z{)y&eM=Kz((mNfn?h5jwc974Pw?b*fdm!bQ1!Kp36Z9t1$xwaA^t9kVUZ()Om-$(N zPEB}!9V|ae((sb_i=LZnsHm4$mCzo{`^3Cl`NGsankeN`J=X67ChT*Rf7C$lR*%Gz zlj;k_#{tvNPD5Tmb|AwP1!%hWiX(wVjy>DER7*_&Q;Tme`r-{h-!m zJP-o)b5sV_bm8hI$Yz!@m6p|K9f^fNj*s?0Slg&bB~W*bL9|6iTzGF_cV()=-c^-& zmI$R+10$b;w?(a_VzWMuu>t6|Fvj*T`X{(Oi>O2=&Q>B=Hs`TELRE`W0jUp#Q}L{q)+W z9Y2jv?`>HYij!6zgTwRg|EI|uqVY@UIKUa+ockrLV#(1`2g{&#c-~*NJ&C(S)-~6QZQoDjr}2*NoXsXJSbgs z!gk`nsj+>SVnn69XpY7J*S3(uYZL{_e`}}!9Fg&>&@i)@Z(cZio4X&uMQlqVpdu!~+9k*Lo?yA!-M!~s8Ylw37s-qf-?2pi|%pz3T{(j)#mPBxRP zgMs&a6iuR24f%DEcmSbnX-nlYwVe3C2zCf}nsjs{sKTfx7n0Y2CRb=pN)>Poss=a1 zGZ{;F0~LSmWJvf?nDf8M2x(EDd5n6|1fFuie%od^#~YCz-Ul^#6)E6C^|Ny+7mc}@ z<|L3^>H=A*T4rwnE68-XpvbL1q#_$1&ICBccKAV3LxeWr*1G~b>p`QdBE@!D)2I=G{a@29=T&G$ z)ktwo=!Mf$)_MK}C@}nqdJViC`R3s3wQIs?#QPz1lK~Y;$iBmoA%%;06XpS9UrH%0 z!07Vl@RgehKCBbkd(t3*EcT z612%Phh!DGi$Ro*DN*&C4*&!?cIIM&uo;~}OqOL2Bc~crDzEuYJQ8ryQ$v8vL8{Db zP7$W*$?bJ8YN|VVV;`s#2PVdyhXu#LTfut$e~p;nPlFFVSg3i`>Ggjk$Li*d&#+1X zT8nHu=DH;lS1$f>E<3_RU`k&y`WZ>4hDvMj%%*&jA5_qw#j^hQd{JiggE~wn8bhBs zg_=aH%8wpdE-a8n4q^WhTNs`pd^~h@*VBJ_{*dVSbs&Io=%C0;PcOEQSnj^MX+^9W*%mWTqOPUXF)Kr?Vyo$dj#_D-&|)ML znWtaX7@a)V+v#b8&+_R9OhmNhM~0fjt;$H*H6R%3Q9}7XILe9TQ9&w;GKh?NZBPT9 zsk_nbaK!=GWFI^EVOl)_M|=mFUD}@Ml_mG`X?{^>{l=N>p1yN>Ykwryj(Lk+Mg}Pe zxOLhQF^|O~j|N>oFF*rCUE=@6l^+Q)1zbL9bi4%+kcEuq)V`^vk4XD1dqE90;FwHT zN>VYwp}b^UkG-Nd4-wY&vxIzc;L~p7`4Y8 zx6r&jNt0-1i|`~3Id5lp7RW0qP%H{m~ZTvZZ z*(G`K!lY62?sr+%f@uM}wb3X;ZAk@jxRx{HaV&V?LZ(g{ehBb!&(p^)Zj%f?{mQ9LA1vW&A_D>mj5 z=!{HKFby&zj}x!_-2a7cxc+nP&rvzvgUxqhHQOTU)lxMGQJ-#P3`uc2%{z;Hg~ZE~ zEMKQmkmTe}x9u$uVge3v*0k9&`HvWZEvOXBQ<5f+%*w8S?jHb)Se;(&aOZD8Du`GV zluk(YcIP;FgZwZ8QJ72eC>C2Zyl`3il%=92{DyfF&EWVnI=U??*qjSn(cao5Vs&t& zx8-cd9V%z;1~oQ78NWXsC_eMPopY@XJz$vJQ|`JNO{Rb5&jV?gB!hDk9%?X=CX}C zn1C`ka5sFF(_+OiQD349u4S}ZpO2k+=xM=&Jlv1mPy#Ks!)TVAoB5R%*%+u#+=cr% z`uN|$YtD~kibxng1rDaS1trKNZsJD(Dlio-Ub6{5WgyGaQxl)}Fa@@6TInbsL^nrP zcybW|B9wzCb^_{svGAgJ3FBn#mdpdz)nUgr&`LRkfKw8UgYH0}^$2VM?ZzYC&PuTg zIIqs)bh&hylouRIA)4+ao1BnUkJRu9U-8XyA>^CG*AO28&w4i2a^~_)sMGvHvWU81 z_fLt&EVV~B(Q?0nzMtR(;Dl1l!3ZE_3Fi(J$g+{?{V++v6oECDT#vW8ASujViXS9S zlW8p~M#*(n17c%(?#-n@C+KJfC!w+za|w(RE?JsheB45ut!V$ zu`Xu^^r&4p5X$4A$VYJ?lbtsh>MhxF7M3h^lhDQVq24k8q7E(Qx>5j6PX!vzj=?eA z_s0GD=k015jNw|5xR0`dzJaVTDrvZtPO6S}FC<{4H8Xz**o7vm^!8I@mXfG&J$E>S8I0?8LtXZ`S0{P}Tz=C5laksocTn$Y zIMI=4cH{G+)0IYk9({I#vi=S1_xf)lICh)OfjgVGv^GEFGc8?k&s4W#+jHTKFLRS- z#lpf^JST-Y0rRKNFS4&ik41vYjNAnDrCAA21Va|{f{mmTXKoF4)%hrx>-;^OexO0Y zzl;>isAV%?KW$iDk~jMJ(d{+=ZXG&L0;Bd9Qsr-%`8m9|c-(9qC;ko7qmTFQgOXC_ zXXjZuk+ot_j3u#r$4|?xXTR~2F;uLs!x6g@Z0J^DdE$BklW$m51lO(pu_b@s!_9!D z5tLtIIMM`uMubdP3Mfw5fzrX;R>?i`Jbl7`?9#EYs}gH|9ZVgYrYVilm)g>Is@mSy zAtZ=E_lT&#)am*|0Tz~-32ju!+c5cI+{#nkqTEWVBfKI{;`2NFk>;mn;Kf;*r%Kn(ac8*w_!PUSu*%W+Xa4ZDh#2#@+qSJ>_{(_=EpP z-nfX1`o{U(21#=9$b+6v1#k7U)k2<}ynu&z(KxhyxA?dY8&_061p)GUY~7<&FAa> zK2lUOQT0DJ(75Wc&WquTYm_b|w#WS>V6!r!CIRROA-4c3K$S-D*?v5!)K*!vXpqtK zTJA;^^7hnn{Z1U+Nvb%m+2hbpUB-{G@sfGxLEkwPWGMtn1H9JIF|A^WB85dMJ07PV zTyBvR4`LXVn)M!kcp3i57-RDaV40sW1K(DoPY}Litfy7ZxeFMy`(d3VI~2|(>F6EK zU{BJy&_0z+ZZt8Pb;SOfIr~-C2|mpg)bg(cvFmT(>rmJ4j4a}5T+$#^ZkE}Sy)Zen zdp$-KbF@56YXwf|Y!>UqKoal2d99m{k7KcJJH~`DoL+L0y(`CqTz-;AEL=b z>C@t?L&i@8up!TdxnIuBDcloCr+Nw$4zNTb&qkJfdD#6Ac}TU(c#{o`CvIE0?GGPy zgR)J)&0GF2+CvKwu}^Z;G;}_}aH<6D#BNV-fhH6`r$7F?5CcKOK%Xo{A?R(BZX9XGR@UR+EElO<^HO zw%5m`Z)*d1!Mf3)Vp}wT=J)cN1ISOkG6%!Argb)9H`;Diq)z6Ceku72@@iaoiz12~Ah=+oW; zS_*-RYNz3Tw7y7&05haPB5n>9sXt3MS+8~eWSX@VN)L&IYX#=R`%=|eicX6cj)a|g zW7V^2%^@>o9s$|~CHjPD0gs7cpBsBMFtgc2#t2XOaMsAkipq6D04E8q64HlTawddi zN}PJ!?H{T9m?uRdL>S%QsCNtsl3Ls}&G+tV(Hb2`t*#OJFJ^#Pskx!~n_jy6#LZ$r z@z^5A)Hy?^oz9O@O*vijU*vGW|`>mAMxyg%`kJb zbD?}cD2pLu3Xr(e5C?|p9*+Vms%p>}hgrS4&g`%Za% z=kR6~G*7%dv_-VKzMDHSPr~X(l&p=Xm*6oGhG~QR;UB1V0Op7^FA$ET4Vc*XafW&6 z^4bf;t5l2B?f8&u8Dfi=L+9#c<~r5D4MEmlD3?ou$ayb#CXOCmaoj#vd+lIIkQw*P zcr-na2pLCaAE+;oeM&M5wci9xm9dx{AXOvUncz<#q;RQ^;1LF+jjPvhfGI@T{(CbH zU*zm`*VMOL^?mK!XBk2R&R>EImA)P3+)Ko-w}3HFe(VHMqMTT3QN?HZuZO`UG2Tb| z^;Ma34JmsaM?uX_!cJW45B!SibVurIR0*xlnwsLIFf4w5(wYI<_FF2slDy z#dGM(Dg6SwOw)o!12DWehKHNma0v1&h?dd6-XDyetLc&)5lkB?rcf2WL4V7*-1YH+EAn9DbDG4J`Zm0od}0<- z5tuV)s`|4dPw69nXHWubjzTyowh@$UK~EY&`oj#j1(vpo{AYUQ-mqH^iB{uQS+(f# z=H+=NCe1GSjx|LSQeBxSHgebW7~>8eC2u3od>{AhbAundxK$8fdCyo>`r%!f3$KoB zgw@_}E-FmzN%aceIpYaqKcTn#=5n9)VgNXXP)A=$0x&!5 z7{+%xY1T0aU)Kbud~-;8t6?7zkys4%sc&=a$6vm*k6R_7SJ<>5+>~LR+x5HB+L|Ub zbV}z^qmUNlcX4*7+k-1+}kD9{hiy;A>|@o^uwPKRK&>dy`Yl5WI-J_27=8C3J809K#~p%eA0 zL~Aa@#po&$%IKbzEr+yhL6j%!JH6QY9MQGfSg!GWZsfEISJEO1?)4O`EeNlQXdpWj zeiyBNF8-T?F>%t&!vr4R;5+zw?@*u{Lryk;o88hKFO3sFsJn-)jDiSUo<4zn`o}dg zhQ`Rzwj>!AOhlmISIN@7<5di0xIx5wQVwPK-m^q? zsJ%UcA>TMNrwJ7tIjYopTC7V-xbr>%4x~m+PRgttR1r|Y3-f$)0=yj)$XV<&+po(Z z)ohYor{@I#JN{t`xrgB2)`Y8~;2uqfxObY`jKh1SroHC*M}#ZsECKS)%wgXb&&K{} z0-nQzN$BZEr#A0 z%0<2>>2rt!x*HGz*Wb6Iy=DYdM%at2!)n5M#00cHGx`yw;-UQ@Pzcp=XPw3(hd H;F`TM?0?\"data\");\ + \n#/usb1/mikro_bak_rsa.pub" +add comment="Script for setup routeros scrypt system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros scrypt system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n\r\ + \n:global ScriptUpdatesCRLF \"LF\";\r\ + \n#:if (\$ScriptUpdatesCRLF != false) do={\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$S\ + cript;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Scr\ + ipt;\r\ + \n# }\r\ + \n# }\r\ + \n#}\r\ + \n\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global RunOnce;\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs true;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n \r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/\" . \$CertFileName) dst-p\ + ath=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint \ + ] ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n :delay 1s;\r\ + \n };\r\ + \n\r\ + \n:local MkTmpfs do={\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n :log info (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :log info (\"Try to removing directory 'tmpfs'.\");\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/remove tmpfs;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n# \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/g\ + et total-memory ] / 3);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get tmpfs;\r\ + \n :return true;\r\ + \n } delay=222ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\"Creating disk of type tmpfs failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n}\r\ + \n:if (\$tmpfs = true) do={\r\ + \n :put \"Tmpfs variable is true. Checking for tmpfs/scripts directory...\ + \";\r\ + \n :if ([/file find name=\"tmpfs/scripts\"] != \"\") do={\r\ + \n :log info (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log warning (\$0 . \"Directory tmpfs/scripts does't exsist.\");\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :log error (\$0 . \"Directory tmpfs is not created!\");\r\ + \n :return false;\r\ + \n } else={\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=/tmpfs/scripts;\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get /tmpfs/scripts;\r\ + \n :return true;\r\ + \n } delay=100ms max=10;\r\ + \n } on-error={ }\r\ + \n } do={\r\ + \n :log warning (\$0 . \"Making directory 'scripts' failed: \" . \$\ + Err);\r\ + \n :return false;\r\ + \n }\r\ + \n# :return true;\r\ + \n# [ /file/get \$FileName ]\r\ + \n }\r\ + \n# :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove\ + \_global variable tmpfs!\");\r\ + \n# :global tmpfs (a);\r\ + \n# return false;\r\ + \n }\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global GlobalConfReady false;\r\ + \n#\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in AM-Init-Script or AM-setup scripts\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix \"\";\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\";\r\ + \n#:global EmailGeneralCc \"\";\r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n:global CertRenewUrl (\$GlobalScriptsUrl . \"certs/\");\r\ + \n:global CertRenewTime 2w;\r\ + \n:global CertRenewPass {\r\ + \n \"\";\r\ + \n# \"v3ry-s3cr3t\";\r\ + \n# \"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n:global CertWarnTime 1w;\r\ + \n:global CertIssuedExportPass {\r\ + \n \"\";\r\ + \n# \"cert1-cn\"=\"v3ry-s3cr3t\";\r\ + \n# \"cert2-cn\"=\"4n0th3r-s3cr3t\";\r\ + \n};\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# Git commit id & info, expected configuration version\r\ + \n:global CommitId \"main/247/016960a4\";\r\ + \n:global CommitTAG \"unknown\";\r\ + \n:global CommitInfo \"Autocommit in repo: ros.vados.ru, generated by owne\ + r: root, in 03:45:02 16.04.2026.\";\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 138;\r\ + \n\r\ + \n:global SumsDirAndFileName \"tmp/checksums.json\";\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global GlobalEnvRemove;\r\ + \n:global MiniDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n#:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global ExitError;\r\ + \n:global CharacterMultiply;\r\ + \n:global CharacterReplace;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n\r\ + \n:global CommitBrief;\r\ + \n\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global FetchLargeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global LogPrint;\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if (\$CurrentChannel != \$updateChannel) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \r\ + \n }\r\ + \n\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel (\$Update->\"channel\");\r\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ + \n\r\ + \n :local StatusPkg \"undefined\";\r\ + \n \$LogPrint debug \$0 (\"Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([:len \$arrDeviceInfo] = 0) do={\r\ + \n :global arrDeviceInfo ({});\r\ + \n :local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};}\ + );\r\ + \n }\r\ + \n # else={:local arrDeviceInfo ({})}\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [[ :parse \"/\ + system/package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"\ + Error\")};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannel\"; \$Cu\ + rrentChannel;};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentVersion\"; (\$U\ + pdate->\"installed-version\");};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannelVersion\ + \"; [/system/resource/get version];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateChannel\"; [\$up\ + dateChannel];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateVersion\"; (\$Up\ + date->\"latest-version\");};\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n\r\ + \n :global arrDeviceInfo [:toarray {\"section\"={\"key\"=\"\"; \"value\"\ + =\"\";} }];\r\ + \n #:do {:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system/package\ + /update/get\" ]]} on-error={}\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devRbCurrentFw;\r\ + \n :global devRbUpgradeFw;\r\ + \n\r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global ROsVerCurrent;\r\ + \n :global ROsChannelCurrent;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :global ParseCustom;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global devBuildTime;\r\ + \n :global GetPubIp;\r\ + \n\r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :set devBuildTime (\$Resource->\"build-time\");\r\ + \n :set runningChannelVersion (\$Resource->\"version\");\r\ + \n :set runningChannel [\$ParseCustom \$runningChannelVersion \"(\" \")\ + \" 1];\r\ + \n :set runningVersion [\$ParseCustom \$runningChannelVersion \" \"];\r\ + \n\r\ + \n :do {\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :local RouterBoard;\r\ + \n :do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on\ + -error={}\r\ + \n :set devModel (\$RouterBoard->\"model\");\r\ + \n :set devRbRevision (\$RouterBoard->\"revision\");\r\ + \n :set devRbSerialNumber (\$RouterBoard->\"serial-number\");\r\ + \n #:set devRbCurrentFw (\$RouterBoard->\"current-firmware\");\r\ + \n #:set devRbUpgradeFw (\$RouterBoard->\"upgrade-firmware\");\r\ + \n :if (\$devCurArch = \"mipsbe\" || \$devCurArch = \"arm\") do={\r\ + \n :global devRunning [ /system/device-mode/get mode ];\r\ + \n } else={\r\ + \n :global devRunning [/system/device-mode/get running];}\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n\r\ + \n :set devRbRevision false;\r\ + \n :set devRbSerialNumber false;\r\ + \n# :set devRbCurrentFw false;\r\ + \n# :set devRbUpgradeFw false;\r\ + \n #:set devCurrentFw \$runningVersion;#:set devUpgradeFw \$ROsVerAvail\ + ;\r\ + \n :set devRunning [/system/device-mode/get running];\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Error in Function getDevice!\");\r\ + \n :return false;\r\ + \n }\r\ + \n:return true;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global WaitArrDeviceInfo;\r\ + \n # \$WaitDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devCurArch;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global PiblicIpAddress;\r\ + \n\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :local Return;\r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n\r\ + \n :set Return ([ \$FormatLine \"Hostname:\" \$Identity ] . \"\\n\" . \\\ + \r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location:\" (\$Snmp->\"location\") ] . \"\\n\") \ + ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact:\" (\$Snmp->\"contact\") ] . \"\\n\") ] \ + . \\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board:\" . \$devBoardName ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Arch:\" . \$devCurArch ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Model:\" \$devModel ] . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbRevision ] > 0) \\\r\ + \n (\" \" . \$devRbRevision) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbSerialNumber ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial:\" . \$devRbSerialNumber ] . \"\\n\"\ + ) ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"nleve\ + l\")) ] . \"\\n\") ] . \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \"Running Channel\" \$runningChannel ] . \"\\n\" . \\\ + \r\ + \n [ \$FormatLine \" Installed:\" (\$Update->\"installed-version\") \ + ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :typeof (\$Update->\"latest-version\") ] != \"noth\ + ing\" && \\\r\ + \n \$Update->\"installed-version\" != \$Update->\"latest-version\")\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Update->\"latest-version\") ]\ + \_. \"\\n\") ] . \\\r\ + \n [ \$IfThenElse (\$RouterBoard->\"routerboard\" = true && \\\r\ + \n \$RouterBoard->\"current-firmware\" != \$RouterBoard->\"upgrade-\ + firmware\") \\\r\ + \n ([ \$FormatLine \" Firmware\" (\$RouterBoard->\"current-firmwar\ + e\") ] . \"\\n\") ] . \\ \r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set CommitBrief do={\r\ + \n :global CommitId;\r\ + \n :global CommitInfo;\r\ + \n :if (\$CommitId = \"unknown\") do={\r\ + \n :return \"unknown\";\r\ + \n }\r\ + \n :return (\$CommitInfo . \"/\" . [ :pick \$CommitId 0 8 ]);\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# !!! The function is not ready !!!\r\ + \n:global FetchHttpInfo do={\r\ + \n :local Mac [ :tostr \$1 ];\r\ + \n :global CertificateAvailable;\r\ + \n :global IsMacLocallyAdministered;\r\ + \n :global LogPrint;\r\ + \n :local Url \"https://api.macvendors.com/\";\r\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\r\ + \n :do {\r\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Vendor ([ /tool/fetch \r\ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ + \n :return \$Vendor;\r\ + \n } on-error={\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\r\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\r\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\r\ + \n :return \"unknown vendor\";\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n :global LogPrint;\r\ + \n \r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n\r\ + \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ + \n :do {\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ + ervice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fail\ + ed to detect public IP using default service: \" . \$Url . \".\")}\r\ + \n #:error \"Failed to detect public IP using default service: \$Url\ + .\"};\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ + ervice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ + service: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fai\ + led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :if (\$PubIpAddr = false) do={\r\ + \n :set PubIpAddr \"not-detected\";\r\ + \n } else={\r\ + \n :set PubIpAddr [ :pick \$PubIpAddr 0 15];\r\ + \n }\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n :global CertificateDownload;\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n \$LogPrint warning \$0 (\"This system has low free flash space but \ + \" . \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ + e . \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n \$LogPrint info \$0 (\"There are \" . \$CertCount . \" Certificates \ + with CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ + \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n \r\ + \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ + onName '\" . \$CommonName . \"'.\");\r\ + \n \r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({ [\ + \_\$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ + Suffix) dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ + Name '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"Required certificate is not available.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({\ + \_[ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n \"https://mkcert.org/generate/\" http-data=[ :serialize to=json \ + ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ + onName '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ + Name . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :global LogPrint;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (https://amster.vados.ru/; main/3419/3ee\ + 19780)\");\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetRandomNumber do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n \$LogPrint error \$Name ([ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\ + \$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\r\ + \n :local FileVal false;\r\ + \n :do {:set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\r\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n :global LogPrint;\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ + \_\$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n \$LogPrint debug \$0 (\"... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]};\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ + \_\$Path ] ]};\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ + pick \$Path 0 ([ :len \$Path ] - 1) ]};\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ + . \"'!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# read parts of a large file\r\ + \n:set FetchLargeFiles do={\r\ + \n :local ScriptName [:tostr \$1];\r\ + \n :local fetchUrl [:tostr \$2];\r\ + \n :local CheckCert [:tostr \$3];\r\ + \n :local fetchMode [:tostr \$4];\r\ + \n :local fetchMethod [:tostr \$5];\r\ + \n :local FetchString \"undefined\";\r\ + \n \r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\r\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\r\ + \n \r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-value;\r\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\r\ + \n :onerror Err {\r\ + \n :set FetchString (\"/tool/fetch \" . \\\r\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\r\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\r\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue);\r\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\r\ + \n :put [\$FetchString];\r\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$ScriptName ] }) as-value];\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ + \_- \" . \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global CommitId;\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SumsDirAndFileName;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :local CommitIdBefore \$CommitId;\r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \$SumsDirAndFileName . \$GlobalScr\ + iptsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\r\ + \n }\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\r\ + \n:set GlobalEnvRemove do={\r\ + \n :local doRmEnv [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ScriptsUrl;\r\ + \n :global LogPrint;\r\ + \n :if (\$doRmEnv != \"True\") do={\r\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\r\ + \n :return [];\r\ + \n :error true; \r\ + \n } else={\r\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\r\ + \n :delay 5;\r\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\r\ + \n :delay 5;\r\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\r\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\r\ + \n :return [];\r\ + \n :error false;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Setup Global Environment for scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n#:local Resource [ /system/resource/get ];\r\ + \n#:log info (\$ScriptName . \" Loaded on \" . \$Resource->\"board-name\" \ + . \" with RouterOS \" . \$Resource->\"version\" . \" and Architecture \" .\ + \".\");\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n:log warning (\"This script \$ScriptName Loaded \" . \\\r\ + \n [ \$IfThenElse (\$CommitId != \"unknown\") ([ \$CommitBrief ] . \" \ + \") ] . \\\r\ + \n \"on \" . \$devBoardName . \"\\nRouterOS: \" . \$devCurVersion . \"\ + \\nArchitecture: \" . \$devCurArch . \"\\nIdentity: \" . \$Identity);\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err;}\r\ + \n\r\ + \n#} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n# log the successful load of the script, or an error if it failed\r\ + \n#:if ([\$GlobalFuncReady] = true && [\$GlobalConfReady] = true) do={\r\ + \n" +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/interface bridge +add admin-mac=48:8F:5A:8E:1A:BC auto-mac=no mlag-peer-port=ether1 name=\ + Bridge-LAN port-cost-mode=short +/interface wireless +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set [ find default-name=wlan1 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 2ghz-b/g/n basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps basic-rates-b=\ + 1Mbps,2Mbps,5.5Mbps,11Mbps channel-width=20/40mhz-XX country=belarus \ + disabled=no frequency=auto hw-protection-mode=rts-cts mode=ap-bridge \ + rate-set=configured skip-dfs-channels=10min-cac ssid=vados \ + wds-default-bridge=Bridge-LAN wds-mode=dynamic-mesh wireless-protocol=\ + 802.11 wmm-support=enabled wps-mode=disabled +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set [ find default-name=wlan2 ] ampdu-priorities=0,1,2,3,4,5,6,7 band=\ + 5ghz-a/n/ac basic-rates-a/g=\ + 6Mbps,9Mbps,12Mbps,18Mbps,24Mbps,36Mbps,48Mbps,54Mbps channel-width=\ + 20/40/80mhz-XXXX country=belarus disabled=no frequency=auto \ + hw-protection-mode=rts-cts mode=ap-bridge rate-set=configured \ + skip-dfs-channels=10min-cac ssid=vados5g wds-default-bridge=Bridge-LAN \ + wds-mode=dynamic-mesh wireless-protocol=802.11 wmm-support=enabled \ + wps-mode=disabled +/interface wireless nstreme +# managed by CAPsMAN +# channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +set wlan1 enable-nstreme=yes +# managed by CAPsMAN +# channel: 5200/20-eCee/ac/P(21dBm), SSID: vados5g, local forwarding +set wlan2 enable-nstreme=yes +/certificate settings +set builtin-trust-store="ipsec,wpa-eap,capsman,fetch,sstp,ovpn,radius,userman,\ + openflow,tr069,dot1x,www,api,reverse-proxy" crl-store=system +/interface bridge port +add bridge=Bridge-LAN interface=ether1 +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-LAN interface=ether3 +add bridge=Bridge-LAN interface=ether4 +add bridge=Bridge-LAN interface=ether5 +add bridge=Bridge-LAN interface=wlan2 +add bridge=Bridge-LAN interface=wlan1 +/ipv6 settings +set allow-fast-path=no disable-ipv6=yes disable-link-local-address=yes \ + forward=no +/interface list member +add interface=ether1 list=WAN +add interface=ether2 list=LAN +add interface=ether3 list=LAN +add interface=ether4 list=LAN +add interface=ether5 list=LAN +add interface=wlan2 list=LAN +add interface=wlan1 list=LAN +/interface wireless cap +# +set bridge=Bridge-LAN caps-man-addresses=10.30.30.10 \ + caps-man-certificate-common-names=CAPsMAN-51B25E507D07 certificate=\ + CAP-488F5A8E1ABC discovery-interfaces=ether2 enabled=yes interfaces=\ + wlan1,wlan2 lock-to-caps-man=yes +/ip address +add address=10.30.30.86/24 interface=ether2 network=10.30.30.0 +/ip dns +set servers=10.30.30.81 +/ip route +add disabled=no dst-address=0.0.0.0/0 gateway=10.30.30.81 +/ip service +set ftp disabled=yes +set telnet disabled=yes +set www disabled=yes +set reverse-proxy disabled=yes +set ssh address=10.30.30.0/24 port=2222 +set winbox address=10.30.30.0/24 +set api disabled=yes +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/system clock +set time-zone-name=Europe/Amsterdam +/system identity +set name=MikroYellow +/system scheduler +add comment="Setup Global Environment for scripts" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup diff --git a/MikroYellow/history/20260428/20260428192005-Diff-Config.rsc b/MikroYellow/history/20260428/20260428192005-Diff-Config.rsc new file mode 100644 index 0000000..2cdd2ed --- /dev/null +++ b/MikroYellow/history/20260428/20260428192005-Diff-Config.rsc @@ -0,0 +1,8 @@ +2286c2286 +< # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding +2307c2307 +< # channel: 2422/20-Ce/gn(18dBm), SSID: vados, local forwarding +--- +> # channel: 2442/20-Ce/gn(18dBm), SSID: vados, local forwarding -- 2.52.0