|NZYZ%OA!>Q_y3yR7
z722(=*1I!@;*t`p*qiX;A3|*IQ}rER){)G*PR;I^XIcyHp}X?z5P$k(D|bW=y4U+xTG)>yWMr$^4H
zWa;c3SH(`46#eJ8yxP&gu=8abI4IDWe4r`jb6dta;0xGi;=@j~PQrkE*Txt+4d=sN
zM>UD!Exewpm1FF>|D9|!QA$^(xMJEE(V@ha6lF|hu*(_z4vlQesK
zoEl;^{7tv<(OmM8S9vh)x{DI0qo%{1?a@(K1@)Ob3+rjUOb&YA?8;mXTE${DoibV-?MU+<9grELM
zN{o1tFP+Ry2wRrmKJU$5Mcg0%E_}wzC%jx8b{*EMcCb@}Emh-RQ}M^(Gr$7)bUM=H
z_y6c36&K5)J&yKQd4szGg3(#8M}>duTPDrpK;qMTdrNqoH_OgWOU0w{@?Bj)n6zlR
z`_h~Vy!&?sgi)<|a_N{nt^qmJ@{8Tl-6bh7n-hu4nYXQGddxh_*K8t?U610v)f!G8X4md?1DgNy!<6jFi*w_I73WvZlvB}w*zIsB5pod*
z)MPZ=X_w*CXe%U}!I!1$CFq~4Rs{-STLmxbbSII(Ymk>CyzTaF>X4Z?BEL*gOAL#B
zvt0RSfY%|3dqs(6FDxCP;i5}BFCliCORQtSbk!9ndzDZD>=x$kgR1H!qw!vJo%FMy
zGKs+?c6Wt1vXP+KFx3$}KF3(8Yw=&l4K_mqqodJIPH%a^t2j&IE+xeJ&
zTPBHqC%BrzUS+bp_0vNCVCiM17Zr#FMZlD_Ms1XKSCh~}yyS!<
zLv`^UH+|hiS#b@LhqF_AOndyeN!vpQZ;~bUeyMNC#hTkNWgF9Vjom24i$7!7hb((w
zDi#&^h!+u68{tl7-ggq3DxpluX*PKw=hnH8qTs+o-Hzglbz|@!X)-NmfEjpT>LSyN
z*&vD7kXGv@qP)++`k4NcP%3osxN$J{eQMV>&YiBQ_*AAIUohA(I6Y)(8dOrl2sE3!
zE3}XIi4g1xo?S*Uf@mgpBl9=6+uLG7bh8j}T%tF+fZf^nIJRP|bpJ~qOhoi2OgV!f
z?I7_W*=<0?X2MAKAkg-i$@8$8)CkCxv3aQs<3Ww8;*@Y3vmc*?3(Ph1n7_^g(=t{3
zxLVih!{f-G7=7-`5(iV$%WwT_QIDqxq8em9-
zyarC0=S_8Wm%H%Xy#U6R2N<(%S1sE%rOO#HdpH5`y%fEIjo+RYy}wym$!@Vk8j1e}
z9R4$A@cD~ZEfD%?wQzl^FKlU=+#TwWc`8C2C&W$r|v8SmL+XCu5IO*^TgwU|r~
zH(_nU+}jHooY#&b4rLZ62Xl7ZF4Q%&K06evXxi%DcQEr(Mwm7yggzy~hGxq@j7SoC
zv8e3Au9LJ_5&1N-Mz(g=U3&^2T>F$peIt`8;nwqXK@6egsKts0V^270kM5uO-QihE
z)hg~2rb6vw#JFG^|MRfpHmbx?%~V__Mc
zV&jwmF3F+H5W1R@*E@6_agihZEv^F1ZEBTe(l=c5+fMOaKEbC?W&sz*QK*W#@=&9f
z7ojLrVm>#})U-7i_TjM7Qs-s1YB&SNz6-%k
zPGLlFN`tl)3)9-b%aqUPwCu?T2GTuZD(P$6feoi<7Cxxy?S%o?3i6
zSF{wvp;>d6T#+(_FyKg;~$91o{V%xaCj|(cR7AeYgbS}
ze6bmShJBvS9#|r;;04G^(f_H2K-0%@;@?N}VEBBW;}f3gWGP^M5+6
z|9z-tHkoGOIJnISUt!MYJ`8CcE<@VL8I2A}kJKWHR)r;^9M^EA$a
z@B7M^W>nx?S#H%o8+_*2Vqc9FN_B$Z=(^k?hoSzfRX6eZX(nSSiy;4JSB2f3e#!1P
z1&a&W@sJM;f*=GcJNzYXPiFSo89?9qp5RgLkHugR2}6Y1E4Q&_v84{>gH;~n8#Rqk
ziCcx1=!GXtQ4~2%Rgepz{;~E$*$a%;g|~^G-EEvMY|Z#9Rr6I?pGN57xWVg!#9YwU
zslw}2hQ*RH1jlO=)475B5pmgF+S@j21wU#koIV<%IV_f>;D6ipF5uR6tbbSGX*ja8
zS{~O{504ENHsdcW-*>SXRQM?ma|VVAD`Jc?_BPTAqi2Mreo8-+K;^7IfLx{}i17id
z6bQGJBov=)Jo-b*Jyy{zve@Z|dkc9tIxmIl2p&nShSbqiO_byW$GyL+f4`(o4JGxo
z7+u5v^7TxiOIOthAV^bV9=Tq&hzVLRS~x1u=#ze46bk?5RxOn-QV(UZI_*d|g0dRR
zB$67DHe)sWIf{uY9BrAZj44t91h_)h(lsk`P|1cic4A&4
zj*-n>zT$HokWD$lw2k2b)fycf+*_muSO4d`?Z2(t
z0Kgs>XYC0g4or!9g9;SMrj+jr-%cCufZ(v-4BXPC9B}Cj1+raFT3x(`m33kQ#e4kl
z4O^f48A~jI`AhPr?+TXEI18+Z`l#GxZ;O~3D{OZcO8!-0cv!G)8AFJ`vInsaFy1l(%E8Nf(H^UL63K6rFq!A-atC)QDpbiQvX
zN~e=FL!Y(}8|0I^acDB@b~x7_ujJctir_U^9e44n8l7ux!K*MvRJLv)vwY`RvJ?W>psKg)rF$WPXESiiuD)VmpNavvVr4?ZEK@v6E30~)N9v&k?*t5
ztEk!t=+tD0<_&ebGl!@K%IY>My!bp}K2B<3+W+XK>v<)ZEO)Ru^CRZR^C$^MAybQ3
zR!N_@9>2{|RS+bM1ZoWq332Mhx=e@S@M11vY{+wIP
za-LDnvl2(yzZ6heyazInes_~=;1TA}G7HY`5xJ{%ks)kB2^(jC{E1~EtfHJKDzikd
z5PmTgyFC*9B(`PfrM{aHn_E1MY*e>Nm0Jxd1^0Hqbj_amf^iwjeY?oN{>1BCIRa!$
zdD2`A{v10iHY>VUfjtB89dZl2dDC$!at7Er|9hwleEIt*kjdJa^)wAgF50Kbk`{Sn
zvITZ8fEBJ3${OC?6-jVHxl|&uT#qF#y&=OoR|PpokDr+ut*?|My?Lt%T=LtZv*y?t
z%D_A2pRz7@ij?JfF7iXhYNS|U4_pJR2KW(nvZl68rwBEaIk(&?D`U?rEKj##?dHVq
zf3?qcx^rmXLQhAjIvBV_RjVqTj|$#a*6Tt)Cc@a@wLfa>Y0meeNWs+JsqXgCI#DZIDxb
zf1>n48i+s#yLpTnvU<@L_Cik*Jl`Sst=S>
zY1xRe-{`2z>fT{yMmO9TE~g;%!8s;yJ~r0JR|4E}hhHRsS31?-_S9=7NwCn@v4*U3
zjYu`@c^r$)ozm78Pb`)t_;A@8-Rg|mHspEkgqi8E`Jvddq8KGR(1V>YCZps@pV4Eg
ziJ@Q3480O5EONgCihx6yL!#pNY2CT*_4Xxe-IaGLTAEwTTTE25@sNb$IE1XMeF#&?
z5mQKQHsV~>`?qwr@o7ZG2EtOJ?$+$F1JQ4~(D*_EpRiV2h}|c5LnA*c
zv8@(o80UdbWSishh3jR-GXe0`tUsGx55zo>g5LI;D5wc_T-6R}USOl4vIY+kf$4X537;VrOiFV6h?C5+gU0CuAl&@=fYs|3rU{@lM%JS*dHq
z%!oS%uif@!wxbYz2H5bXQ_ibrGRgabIxPHl?&1IavU;OcQ?4w#%qvom%Lb!HeXaMA
z+`ZSn>)ft9Pe&!;jMK_qoM1ljqCjz{{pkEseGZ3iJFKl6!a!X7i+T~++DB(_?V+?`
ztkCMi$I@!Q&HzPcfOM-16U4gKfbrG>xljDb!nGk!5ejaz$uIgTV+jn=ZmvHXzjY-a
z!pXgiK2-q?=mGbU=N}QRo-JiMS*C8+mSDYeBa7e8t!<4hy6+fH3tQYuMzdgLU-$2^
zG^U$W9V@cC$+M3-KXVYZdm1iYDOg+rI|IM8QDLjF2@C
zT)z%dGxo5TsObF_xAkB#+2T-qwJH5UQEV2kNTC36KZ)z(n}X5zc6
ze+IY^Sm+u@@+j*Mz!Qw?B==!U7WY@=bbJK+93>b*jNN|jbJFkTv!dB!J7b)2HKj0G
zE2WY&M|+HjPeE0S{}KwPTkT&hnJiSJltzoXpLzq5?-+c8k^W_h=Zvtw&-{9}sjKX=9c*j^fxA1Ft#b$bF@BPUm*N*+1a)`gT*)^Dc
z^E-FwZosydxD??!_5SnJV-CH^*Yn8(8(H3`d^YdCtjZ^<3zB!e_G+SuvwU&{0+$zm
zoAS*=)hB;-+l@LnHxeyjv7VMuX)IZ4zg()>{kr6S?9eCHBDyK`>YGt(%zP?-Y%#V&
zvk6`WW|D1FHs4R(xS}^vs;o0|Xt%^W$7K@G+Ih62oa)GF8hpAq*=G5H_<4`P-kE?ARBrmTvTd0dn3
z_A#b=Oi(o6AHWIeL}I0bWESQOz}4wmz;*ke@l>TDZ^AhBo_$BE
zFy*0k61CF417;2?>wve)Z{r13(vYy$LKo8zDSmT&h|_lfAl|)yxx6=TS3MNO;G)Ln
z8$0f6RjK`^ByZ$p22r~0=e)f<5zeF9jtiBT^z^NX;4+;FIpIA%pRcrc8~zw>DA`O7^Jgj%ky*gwdZnPf3-OlSr~#`Hpk#Cb$YLumu#33o
z<0jSFc~~|jU8?$IdLt{XlAS|PV2K*JxXbu6d(?!aiU32va$&R0S=MslJi4Lc5}hE!
z2VF7CQO|7#`7stAP?UgnRn*}2QpGRSegQ6xLoKY1F4(_kv3pV$e*8l|e~(VDS{uOw
z)_7DO6)aCMh8G@bwDOEL;6hL%I?%*t$@KazAOD(A2Fr^NNz=L;Wt|)xw}T3nn_fOA
zgdRCYIGgA`;9=qztU+Z-h1sL&Y+
z;NK+YXgRqy^;aUN%vz#_pW}_rB}14)I&SlSSwT)r#=s^DI?z|g9QKpEp_3Vw)k~hq
zY&HEpASLHN1@+&Ye}%AE$1TllpQNbXoe8?F<%CAjgeJ!01Ab{9Kox%)cLQ0)*zwT?4K7D1-
z|MECYG4ymu#(MS)@Q_!Zj)kjr@-%dE?Qx#*UsCv6LJs#QQ0~LuXTd}-?1Q3g_kT~d
z8}&<&;A~@%&>C^nu*+LQj9A2xLi&2K_8iTU(&a0iwG+}#b!`uf>XYV$E_@@H;dD-{
z2fN#d%M5O&%S}(WddN_AE+1rK4ZV!`v}Af_NR_sZoAOY4lg!m7p+ns%gO}jppDWNB
zsmQ|Wy_(>iHM^gFxZlbC)+U2)JIWE+V4Y#~xQ=aDt@IB1Cn8FLQ%zuBEn1$Gj=1US
z$n_p_=$x_|wq0-O8=Wetd=)*ju{KU;_JJ-a;bMjxqq
zF-!k&VX6A0t#9d^8Raq@E^gATg%e`(k#isTb?5E*xIV6Y6m9*yr}owfM+Ekzx1Z~z
z9M%dClbL5vb(dkxW&H{;bz8`M+kNZWSv|FU!^#!QRZ`ZN$B*xbh+D1!Rrq-mjz5-%
zou0z1+|#Ynt*nkh*6!92xDUaNR_OXGPlt{sFq}SrcF0&Kv0Flx(_5aTe2D00h8jws
zCZ)8{&5q1q#AV4s7Sro*FW|CtRel$J9JEk19H0U!Y1|~V?%S(piTaQPkYx)>ce7^0
zk)JwusIL#=wi(5?!e-p-*`Jf59C96+GuWa&iu1FV&$O*G)w)Mm+FAaxWK%8dugkj6eorA&ZeKP9!oGd+kr1JH>0@A=J0FkPo7
zxgFu+3Y(9f!AJVDJDu7dwta4ibUN5#hCPNQkHTo6Lr85)=#N4gZDZsN`_+IWn?ukU
zz_v^w$aCwi_wbaneAD6Ggxo@;>^xKVzTcMQ_zCfcJIirkjRkRxy0qY;|E4}Njq)Nt
z)2SdG-NoLKB=%tBcLb;RjlPuBo35Ja33u(agn1YGvpXO?KyBF}c@at{ZT0J+*Y8SEHBL^YKbXX=zzO*}IoU
zS2@5YmXB+Q2t;3Ms5RL7$_I_mtG8r3+!UXC@JJ5&^`$`3W;WH5{dYd_%B}(am-{e4
zW_LkrX;E~byYl%QN90gY7ClvOOmR)CjVnDrJS`J+xnKEggEG}XEZ_1;UbRYAe(4Bo`5PUD
z#fPCrxWNg57Gv)+O6Jjx+7|5cK=3G!NP=gx20RuMW-pW3Rvn*?1-Xx|D9_;aevuU<
z(@67z0!D6*zmo;_R>jeGy%N86tr`{pAyB^2ymo){IA@*Uqo=dBs*`gQp5ot%44cMH
zPnw5PZ}BkWUm{jm*Y!Z22qcx)Ouy##jW+QHh}D5RrzY3p-K`6Ti4j(|9z!-$TFnnN
zDd{Dt+M37O#+pLYk_fx4gMxd&(BR#I{n=sRBQ^hq8*g&=aFQ5!K2s-6dG1_8TDU6W
z!>P42_X^d4+($C3$_mOiB1MWtIg-UBR@XD8{E`>a7h9)#NR6=>8>|`Rug1zfwMq)r
zorD)-Hu_N|BEkp>8CSlSL@19Si;;AIPjQ)nzHv#BDh^0?`A%QBo4j-5=kZ8%r9ad3
z7%QF2T!QQK>XC0M-1ND}i7(
zqZ@z6mQ2fym
zgJV<^mD^O0#pz%BmS`Z>t77!=2vA$m`H`K@bF0u^_ZD7KBD<~xYfQWwv>oYN5d29g#<~R9J0Lr#)l*CdPd_x!@$y`VH;1DqAQ)ud;v6Q~#>&NX
zV;rQ7xLQ~0LV{nBE-rjA;C$3n528!A9+o0?7*|Vr@AfD(1InDjx3Vm^$*}a{_5bjv+kecY>LzT`OM(@Kk
zH+|0lUwx^O{3d@txB&nO2HAXNS0+R6K0bc6mET2i*;Ec%(HN8-lzBvP*xZ6f<;iZx
zKafl=5v_BLFsKumF%OGi#F9&&*A33-cFixNhweB9mS*+sDg_2ns7iE;c~HblQK{%M
zU`?oh+2jDh<+fU7A-Xi+8UN2&86-burlHz#Ti+{`*Q|Zu?KvHDz%fCp8@}m4elOzc~w<4Mc
zB-ocw;71>>*L-=1{_twZBtlgDcc
zBSbQZla=#?Qdha~OB+d7{cbF+PKAGiNivTmeAOh%Q-1aDu3uRod>;;gx~xhhJBmc!
zoRhO|GHh#RTyxv$M6arU{I=W}ttoXpTvPQE0N`qgk?wYrU;gNnA6LKuYvrXylkOpe
z+Zjuy9;@DqD%3W8lUTrl_lmNU<9WXX+GX==nSQ49KFzOF)OzcEhXV*u?IhIX^6;z-HNEOw+Co?G3IQ
zAt=4fbu!V%l2+ECrd^eJ6yf0kpp5w578uU!eb_e@xImd#G2U(;#&BxE>iFH(-^?o|
zJ*qGH@p&gw?~+E*;G~^NA8Z|)bW;5Ii>OMlDYMOTaiJ;s{vJ--Qs1NV=zo1K0dSDW
zf~HVgn-C-t-1*&9>pJABd11D#J1Vm^*$R{^Sbuc5o=gE%BFGdF;)Y6AbEI^
zOq18ymJw=kFHN0Mh=7kRIX!&&}bR8VCe4rX&Bx8TO{HnNy`
z@AwR0^HwQ*$hw~zE+*Vd=;aiJ3UGCbn0V2Qa-@;P@2$uFIe(2e6sy3gZ`n?=a0q6p
z?Iuvk@jnqLdHpTBCBh~Z7;9%R9UBY3Rx-gurx{TTOWhqKJa<}$z>6Py8?UbhhPBYJ
z9N4@N^7z{0C16c$VTK9>JmGW>=<=sh>`VjB02V8rHCA8;%o7Uptj8qfczmSPQLcxk
zwmiRUROYo4q4jkv&b3}g7yChh<(9B4UdkB&pvJfl$a8Uw*PJGFVW2q~>!jRSbC>k6
z448`bh|@gJO$~6Uqs6hm9`Ah8tiLY2r#+QnI9uCkfgs;M=QPDdgp9}?-$e1@^^Ieu
z4476l2sU%Luac*kV;Y+u>UduD&1Tm>9dl)f?YwPl=4GFEy*W?Dj<@}xfS$6_(b$oV
z|8GAScSQxOX}Mmd4EXyRuEuuE$awJ9A_W<0Q-8AN5!W2;1e%{j+u1h7Y&Wg8$8BvQ
z?Hov@iv{i`AM5+2dmTOUy=L}SYd}klVHJe5;O7Sh-w@&gr%osK$6!LIN~Y2VoIi%c
zy+`G~tdN!=Rr7O@Oo}b5Wp{;)RZjj3vix}*n}DK#)-bK5Sr1+;>jUe7c)r4Uh;4bp
zsm9v|{83)e@3T^966NF3P|MskwH9~Hve6QkHMwEdqSOr|GlX>at5BK%Qpgp)>3J7^
zserEfBsLE*88d#5RP7H1saBr;f|N4j5R^afPu^9`t!!OAYl}ZfMc(=$I^463X|zlx
z5Q>c
zm83`A4qr^*hHOP))ygwE2}oYbo3c-jPhfVkkG#$R{)GPGGXTiP;83dk3@{i=#Rns-
zkI0oFov85B+>i;copV3R(0IbBo~z34!#hga3OMC0Up($n;5t9TQ6XcOGnNlBI5#$=
zr1$y+RAb_Cr>@5He!-N|ezsCn<#c5U-whzHvi#KsZ}I~D((Y7jLD{DhFN8l&`8tBl
zXJ%prOUuKWAL>-o>}8oi@TT=B$kqR28LEj$R|@E4`PcyYQ5lwr4;IOtC_AC3XqTNp
zM^$Er&I82^Ro3N>OhT63I?n))&|F6e(d&in{V1sXhqdv9S@aMxa1#~Iyl?0g6-e1s
zIh;jB{pYa>064k1>|)_t^&lVLT&kLo$bYo>*+wbRags$J95tiU4;p
ze`u;r&SCcQ+!a0~H3=Ay5QC<2BExCq*q<&`_B
zZRs0>_MAIzn1N^ma^-{!D2#z|(w!u1CoHErGwRAXkYXWmICt*W!GH|CvIzX=q@Dq0
zgKGaPbN^4=Uvu_`sAh<>o}9kqeI8X7Lf*2OtH}yEh4*E7{g(*rf8b?xxYc-Z!-j8i
zPTc-=;ob?3|28)=Fl2kJA&|3TR=;Te)9h{UeojZRjDdPCeIhs}_t>~4ZExB41==&~
zz_b7B9E-tP7aZp?^Y$O={g1+J$R@$WD{$-H2d7&VsUmCOR-EVT${WlS3e8T|#HbB}J*D(J*M72(}a3bQ$xZOKeu=y6hkdiLf5F<8QEIKF4$@
zV3oPJi0znm&Pnze*8dhDvfLM*qA;v<4iF)N?8NVxkQcB<3kN}cAIF?&lfiKqF(gC<
zD!h2}FbHR2zNbk+*s+kZh#t*jeTtMhaPxfzF`bD6xVP3oeh`8|h43NhbD%a@WO{7MR$OR|=v2nQZrI#A=@cRUo
zIH(sKdtf=k4>k10DktLa#X2&@hPa+o*M+)!E&Z_>Ju$GjdaugxX%8x^wKP_*zQZHG
zd?(MVaZ2|!sKJ!}!(5MaFDfRXazs8fh#5tkSKbmQ`@_=a{zLr#c*7_I7d;hgY=tY%
z`smckeX2Ut=_|#c8MjqzE#&4C3%rFN@GO`rJ3CS3dkL>g{mq*nnnGW4I;l80d5oU{
zcJbDKL8AH&)=n-l2Ao5p_A*0izMmK%BWbZoP=;(X&_@rUE?q5r-CYfOL|bB*z0Ast
z7G40bW$=D2Sag4)ab{9ACSQ6@t!YJGy%+~^6?+{SftNBb|NY$YMEnbfb+tuz&kK2u
z!wTn?>jJkK(ElR?e=l)P&H%5BD`u~cg}0Xmau`6z1A~Tl(lAY3leVa0Csg*ZO(sbk
zVOwBcpdQxZxpqIR!o*zcn8NHXCwxA+8`=%0kr?FW>dmVHJDH%IrLl7>*t^*9E@|Ai
z{^sl=wQg1V@Z5QJ#$*8vqtMRJ1=e2U?F`5x`s-yyxbNYwthNa+GDCEye_6>Gv^Tu_
z@%YftcI>Im(4hm>CTXK)s$L##@3ri5L(btLu(0~(e3R#DRcOndzf=E@SKa-^mm3_5
z!{FP4d|&!ecbq_&nF(cE@1TOasQF4V*eJM+`b~9f9O_bWxT+onX=KzvpWLiid0=9t
zEa7!6_V7ZB|N7@+VE%@3vC*f}5aKQkQ~?qmi%!*Tt+bQ<w2%VViQ=v6XBjEhOWXIo>ErZdFFN!Fxu$^I{qF9
zj9tE`VqUurq29R(mk8vD-=pALX
zqOa~_;_xYVh^kB8Pj8UU?@wFxOugOdCO;WdAE-X`Q`J}6=ck1aN%@=|N;Eq#bwl~(
zi!^0;7mO99Vi9`Gnp@9UleJ$A(j-Gm^ctEfJRx%@pVM{F$v)DIqSQwI9?I}{Nu_1X
zq7K)fTKha^0{HRz`{L0Ma?H+LtoEtO
zUhugh`p+qNazr1uxUr*w=H459T(anf>(r{irO8FwPtVD7reXy>mjQqWmzI5Z4hv9SO5Oy(7%KKd;KTnbVhH?w$jIdE`7z_7VqNRmUf&Xk(SIF=R02%^%}=;0%t8XknuF
zQD9m`|FUoq^uhD8s^ZGG=SDoB+4m%}_*eZ<{sKFl2;Tf$4LF9yzgjkwkKXEO(G}Ji=Ll)39gWb7mmj0*AK7<$g54C&DoB4Jq{Grw$1IFe`;K@{
zlxaQvziGIw>@k*C`CR`gxDF
zVnj^zjT!?s==-^ZY3~G-9NqP!En7WM;idh4MBP>W6W0l8@@pLY
z3CrNpst{~nrum$p3$se?Z#S)Z>vk~$>p|THOUI{+ay`8+o&~W^^o6p}w$$pPxQ0h?
zhS`S=)5Y!!bHiXFwgd-O7CdN433trm(vEImu=M6KunIqNeq?-1^gA3W<#|?Pche~5
z^wQI%QW;jXms1z%6G-pp{}+}6Y5b#BI>dHWBF~}ONnR0{nD@^bJO2QSTeOaM=tabik)hw
z3reu<#=$EZl@2}SV?<1b3VQR00000^WLAyd2egfY&0Ij
z&UB8Yq}r$2!&B%Qy)NCa$yN}wA?4Lx!<`QjS;Ezr^3c*`#$JBpcUyB9RwMraFL^?n{~#dbZ-`Rc|Uc;F{0hCcjt~vdn#Jw%+fdK?CltD3(hjlcCWhXm2um~T4EDu
z_+h;d_g|$O&Rr47(|C7Q;r;5Bg*o^rGiTj$ZR&b)@0PRr4`GRSrN&azk7Z%rmF$Nz
zjAJWDyNT6TPxNB-O5|?7*45!3aJ9sIujc;%HKB#sV&w?;_i++A6_)POoA~49g<)Tk
ze>Gt~*~T!hYw^#>O%cc1-Z)QX(_M?4rb}C2Fx~a%BdI_5lKL&^;i;^r_u8Ta_-8TR(~_Rcf=GIam|000000000000007
zZX^lw)$oG~T*dqRei0)*Azv?StJ~tr7oUHQGOurMe{5$zvl%^WRPoQqP3^`S(fChg
z+?|!2CNo;6Fx~bSBq?9`Qo<@I<|*8(_hGy%IsL|Ja}P!@RKB?D4Qjp-_X?~?%03VD
zx)@w)HWI&YXBQ)`*=Y?WykkEst1A4{`KJo^#xu2U74)Nd$-TJ-Z*l7UKZ4S}rvCsN
z1{C|QwY|VjeX{O^d^r
Date: Mon, 29 Jan 2024 14:42:16 +0100
Subject: [PATCH 02/14] feat: update version
---
apps/calcom/config.json | 2 +-
apps/calcom/docker-compose.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index d09732ea..dfa59696 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -6,7 +6,7 @@
"id": "calcom",
"description": "The open source Calendly successor. You are in charge of your own data, workflow, and appearance.\nCalendly and other scheduling tools are awesome. It made our lives massively easier. We're using it for business meetings, seminars, yoga classes, and even calls with our families. However, most tools are very limited in terms of control and customization.\n That's where Cal.com comes in. Self-hosted or hosted by us. White-label by design. API-driven and ready to be deployed on your own domain. Full control of your events and data.",
"tipi_version": 1,
- "version": "3.7.6",
+ "version": "3.7.9",
"categories": ["calendar", "social"],
"short_desc": "Scheduling infrastructure for absolutely everyone.",
"author": "cal.com",
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 3b8a0747..614a59f1 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -3,7 +3,7 @@ version: '3.8'
services:
calcom:
- image: calcom/cal.com
+ image: calcom/cal.com:v3.7.9
restart: always
ports:
- ${APP_PORT}:3000
From bc70013ff06ab0896c1c51bb9d8d60bc4d3190c7 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Mon, 29 Jan 2024 14:46:46 +0100
Subject: [PATCH 03/14] fix: restart only unless-stopped and add container_name
---
apps/calcom/docker-compose.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 614a59f1..5089c665 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -3,8 +3,9 @@ version: '3.8'
services:
calcom:
+ container_name: calcom
image: calcom/cal.com:v3.7.9
- restart: always
+ restart: unless-stopped
ports:
- ${APP_PORT}:3000
networks:
From d18be4b8d751841767b7af0901ba38845d348d6e Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 13:54:58 +0100
Subject: [PATCH 04/14] fix: hardcode NODE_ENV to production
---
apps/calcom/config.json | 8 --------
apps/calcom/docker-compose.yml | 2 +-
2 files changed, 1 insertion(+), 9 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index dfa59696..42bfe571 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -93,14 +93,6 @@
"min": 1,
"max": 1024,
"env_variable": "EMAIL_SERVER_PASSWORD"
- },
- {
- "type": "text",
- "label": "Node.js environment type (production, development, test)",
- "required": true,
- "min": 1,
- "max": 1024,
- "env_variable": "CALCOM_NODE_ENV"
}
]
}
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 5089c665..3a285201 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -29,7 +29,7 @@ services:
- EMAIL_SERVER_HOST=${EMAIL_SERVER_HOST}
- EMAIL_SERVER_PORT=${EMAIL_SERVER_PORT}
- EMAIL_SERVER_PASSWORD=${EMAIL_SERVER_PASSWORD}
- - NODE_ENV={CALCOM_NODE_ENV}
+ - NODE_ENV=production
labels:
# Main
traefik.enable: true
From 0fc5dd5872e0c4854635a037504f149b1aac52b0 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 13:55:46 +0100
Subject: [PATCH 05/14] fix: Set max value for port to 65535
---
apps/calcom/config.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 42bfe571..589a404f 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -83,7 +83,7 @@
"label": "Email server port (SMTP)",
"required": true,
"min": 1,
- "max": 8,
+ "max": 65535,
"env_variable": "EMAIL_SERVER_PORT"
},
{
From 88de8f459553399fc22eec2b10d338441cbcccf2 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 13:57:04 +0100
Subject: [PATCH 06/14] feat: use random value for auth secret
---
apps/calcom/config.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 589a404f..0b2f9a83 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -15,10 +15,10 @@
"supported_architectures": ["amd64"],
"form_fields": [
{
- "type": "password",
- "label": "Next.js Auth secret. Generate one with `openssl rand -base64 32`",
+ "type": "random",
+ "label": "Next.js Auth secret",
"required": true,
- "min": 1,
+ "min": 50,
"max": 1024,
"env_variable": "CALCOM_NEXTAUTH_SECRET"
},
From 8923e085b1d41ae06a5198b3d9fc768ceefcd867 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 13:57:24 +0100
Subject: [PATCH 07/14] fix: delete unused .env
---
apps/calcom/data/.env | 0
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 apps/calcom/data/.env
diff --git a/apps/calcom/data/.env b/apps/calcom/data/.env
deleted file mode 100644
index e69de29b..00000000
From f31b83e84a222857ad36e4c9d3a6c1cc96d086f1 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 14:03:33 +0100
Subject: [PATCH 08/14] feat: add separate postgres instance to calcom
---
apps/calcom/docker-compose.yml | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 3a285201..2c16786d 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -10,9 +10,11 @@ services:
- ${APP_PORT}:3000
networks:
- tipi_main_network
+ depends_on:
+ - db-calcom
environment:
- - DATABASE_HOST=${POSTGRES_HOST}
- - DATABASE_URL=postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}/calcom
+ - DATABASE_HOST=db-calcom
+ - DATABASE_URL=postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@db-calcom/calcom
- POSTGRES_USER=${POSTGRES_USERNAME}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=calcom
@@ -55,3 +57,16 @@ services:
traefik.http.routers.calcom-local.entrypoints: websecure
traefik.http.routers.calcom-local.service: calcom
traefik.http.routers.calcom-local.tls: true
+
+ db-calcom:
+ container_name: db-calcom
+ image: postgres:16.1
+ restart: on-failure
+ volumes:
+ - ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
+ - POSTGRES_USER=${POSTGRES_USERNAME}
+ - POSTGRES_DB=calcom
+ networks:
+ - tipi_main_network
From a27e0f2ca90eb58ebd269f063d3127126a7e85a4 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 15:08:51 +0100
Subject: [PATCH 09/14] feat: make calcom encryption key random generated
---
apps/calcom/config.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 0b2f9a83..42826579 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -23,10 +23,10 @@
"env_variable": "CALCOM_NEXTAUTH_SECRET"
},
{
- "type": "password",
+ "type": "random",
"label": "Calendso Encryption Key. Encryption key that will be used to encrypt CalDAV credentials, choose a random string, for example with `dd if=/dev/urandom bs=1K count=1 | md5sum`",
"required": true,
- "min": 1,
+ "min": 32,
"max": 1024,
"env_variable": "CALENDSO_ENCRYPTION_KEY"
},
From 6f6fa54348889bbc1168c2107018776381002568 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 16:40:42 +0100
Subject: [PATCH 10/14] Revert "feat: make calcom encryption key random
generated"
This reverts commit f4e1148dadc65379c56c9ce3cde4afe7e7f380de.
---
apps/calcom/config.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 42826579..0b2f9a83 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -23,10 +23,10 @@
"env_variable": "CALCOM_NEXTAUTH_SECRET"
},
{
- "type": "random",
+ "type": "password",
"label": "Calendso Encryption Key. Encryption key that will be used to encrypt CalDAV credentials, choose a random string, for example with `dd if=/dev/urandom bs=1K count=1 | md5sum`",
"required": true,
- "min": 32,
+ "min": 1,
"max": 1024,
"env_variable": "CALENDSO_ENCRYPTION_KEY"
},
From 74d21f7ee135bb132349198350d65a23ced5fd85 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 31 Jan 2024 16:40:54 +0100
Subject: [PATCH 11/14] Revert "feat: use random value for auth secret"
This reverts commit ba6e098ead8b647d6670771df3c3aaf939b3b25d.
---
apps/calcom/config.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 0b2f9a83..589a404f 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -15,10 +15,10 @@
"supported_architectures": ["amd64"],
"form_fields": [
{
- "type": "random",
- "label": "Next.js Auth secret",
+ "type": "password",
+ "label": "Next.js Auth secret. Generate one with `openssl rand -base64 32`",
"required": true,
- "min": 50,
+ "min": 1,
"max": 1024,
"env_variable": "CALCOM_NEXTAUTH_SECRET"
},
From 83698e7b3b8556c23673b68a80e1190ccae16a33 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Tue, 6 Feb 2024 18:45:37 +0100
Subject: [PATCH 12/14] feat: Add form field for google api credentials
---
apps/calcom/config.json | 6 ++++++
apps/calcom/docker-compose.yml | 1 +
2 files changed, 7 insertions(+)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 589a404f..8fcf2d83 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -62,6 +62,12 @@
"max": 1024,
"env_variable": "ZOOM_CLIENT_SECRET"
},
+ {
+ "text": "text",
+ "label": "Google API Credentials in JSON form. Used for the Google Calendar integration. See https://github.com/calcom/cal.com?tab=readme-ov-file#obtaining-the-google-api-credentials",
+ "required": false,
+ "env_variable": "CALCOM_GOOGLE_API_CREDENTIALS"
+ },
{
"type": "email",
"label": "Configures the global From: header whilst sending emails.",
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 2c16786d..57a3d3b3 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -27,6 +27,7 @@ services:
- MS_GRAPH_CLIENT_SECRET=${MS_GRAPH_CLIENT_SECRET}
- ZOOM_CLIENT_ID=${ZOOM_CLIENT_ID}
- ZOOM_CLIENT_SECRET=${ZOOM_CLIENT_SECRET}
+ - GOOGLE_API_CREDENTIALS=${CALCOM_GOOGLE_API_CREDENTIALS}
- EMAIL_FROM=${EMAIL_FROM}
- EMAIL_SERVER_HOST=${EMAIL_SERVER_HOST}
- EMAIL_SERVER_PORT=${EMAIL_SERVER_PORT}
From 2f047a834f58ef7cc165411693e82c7b2c382e07 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Tue, 6 Feb 2024 19:14:56 +0100
Subject: [PATCH 13/14] feat: bump calcom version to 3.7.11
---
apps/calcom/config.json | 4 ++--
apps/calcom/docker-compose.yml | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/apps/calcom/config.json b/apps/calcom/config.json
index 8fcf2d83..29286311 100644
--- a/apps/calcom/config.json
+++ b/apps/calcom/config.json
@@ -5,8 +5,8 @@
"exposable": true,
"id": "calcom",
"description": "The open source Calendly successor. You are in charge of your own data, workflow, and appearance.\nCalendly and other scheduling tools are awesome. It made our lives massively easier. We're using it for business meetings, seminars, yoga classes, and even calls with our families. However, most tools are very limited in terms of control and customization.\n That's where Cal.com comes in. Self-hosted or hosted by us. White-label by design. API-driven and ready to be deployed on your own domain. Full control of your events and data.",
- "tipi_version": 1,
- "version": "3.7.9",
+ "tipi_version": 2,
+ "version": "3.7.11",
"categories": ["calendar", "social"],
"short_desc": "Scheduling infrastructure for absolutely everyone.",
"author": "cal.com",
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 57a3d3b3..05183e6d 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -4,7 +4,7 @@ services:
calcom:
container_name: calcom
- image: calcom/cal.com:v3.7.9
+ image: calcom/cal.com:v3.7.11
restart: unless-stopped
ports:
- ${APP_PORT}:3000
From eec48b79760f073a84539922a1100c42e79f2a53 Mon Sep 17 00:00:00 2001
From: Sturdy <91910406+apollo-sturdy@users.noreply.github.com>
Date: Wed, 7 Feb 2024 09:58:59 +0100
Subject: [PATCH 14/14] fix: use https for env var to make google integration
work
---
apps/calcom/docker-compose.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/calcom/docker-compose.yml b/apps/calcom/docker-compose.yml
index 05183e6d..c3be3693 100644
--- a/apps/calcom/docker-compose.yml
+++ b/apps/calcom/docker-compose.yml
@@ -20,7 +20,7 @@ services:
- POSTGRES_DB=calcom
- LICENSE=agree
- NEXT_PUBLIC_LICENSE_CONSENT=agree
- - NEXT_PUBLIC_WEBAPP_URL=http://${APP_DOMAIN}
+ - NEXT_PUBLIC_WEBAPP_URL=https://${APP_DOMAIN}
- NEXTAUTH_SECRET=${CALCOM_NEXTAUTH_SECRET}
- CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY}
- MS_GRAPH_CLIENT_ID=${MS_GRAPH_CLIENT_ID}