From 539ce242c831b4a581ebdd6b74f3d9e361bd8902 Mon Sep 17 00:00:00 2001 From: Marc Sabatella Date: Fri, 6 Mar 2015 21:07:57 -0700 Subject: [PATCH] fix #41761: beam angle too sharp --- libmscore/beam.cpp | 56 ++++++++++++++++++++-------- mtest/libmscore/beam/Beam-A.mscx | 40 ++++++++++---------- mtest/libmscore/beam/Beam-B.mscx | 32 ++++++++-------- mtest/libmscore/beam/Beam-C.mscx | 36 +++++++++--------- mtest/libmscore/beam/Beam-D.mscx | 50 ++++++++++++------------- mtest/libmscore/beam/Beam-E.mscx | 62 +++++++++++++++---------------- mtest/libmscore/beam/Beam-F.mscx | 52 +++++++++++++------------- mtest/libmscore/beam/Beam-G.mscx | 40 ++++++++++---------- vtest/beams-16-ref.png | Bin 0 -> 8888 bytes vtest/beams-16.mscz | Bin 0 -> 8712 bytes vtest/gen | 2 +- vtest/gen.bat | 2 +- 12 files changed, 199 insertions(+), 173 deletions(-) create mode 100644 vtest/beams-16-ref.png create mode 100644 vtest/beams-16.mscz diff --git a/libmscore/beam.cpp b/libmscore/beam.cpp index 0b107e642ffb..a0b61918fc9b 100644 --- a/libmscore/beam.cpp +++ b/libmscore/beam.cpp @@ -675,8 +675,8 @@ static void initBeamMetrics() B(0, 3, 4, 13, 1); B(0, 3, 5, 13, 2); B(0, 3, 6, 14, 4); - B(0, 3, 7, 13, 4); - B(0, 3, 8, 13, 6); + B(0, 3, 7, 14, 4); + B(0, 3, 8, 14, 6); B(0, 3, 2, 11, -1); B(0, 3, 1, 11, -2); @@ -716,17 +716,17 @@ static void initBeamMetrics() B(0, -5,-4, 16, 2); B(0, -5,-3, 16, 2); - B(0, -5,-2, 16, 2); - B(0, -5,-1, 16, 2); - B(0, -5, 0, 16, 4); - B(0, -5, 1, 16, 5); - B(0, -5, 2, 16, 5); + B(0, -5,-2, 17, 2); + B(0, -5,-1, 17, 2); + B(0, -5, 0, 18, 4); + B(0, -5, 1, 18, 5); + B(0, -5, 2, 21, 5); B(0, 2, 3, 12, 1); B(0, 2, 4, 12, 4); B(0, 2, 5, 13, 4); // F B(0, 2, 6, 15, 5); - B(0, 2, 7, 13, 6); + B(0, 2, 7, 15, 6); B(0, 2, 8, 16, 8); B(0, 2, 9, 16, 8); @@ -741,7 +741,7 @@ static void initBeamMetrics() // =================================== E B(1, 8, 8, -12, 0); B(0, 1, 1, 13, 0); - B(1, 1, 1, -9, 0); + B(1, 1, 1, -12, 0); B(1, 8, 7, -12, -1); B(1, 8, 6, -12, -4); @@ -753,8 +753,8 @@ static void initBeamMetrics() B(1, 15, 11, -21, -1); B(1, 15, 10, -21, -1); - B(1, 15, 9, -21, -1); - B(1, 15, 8, -21, -1); + B(1, 15, 9, -21, -4); + B(1, 15, 8, -21, -5); B(1, 1, 8, -11, 6); B(1, 1, 7, -11, 6); @@ -766,7 +766,7 @@ static void initBeamMetrics() B(1, 8, 12, -12, 5); B(1, 8, 13, -12, 4); B(1, 8, 14, -12, 5); - B(1, 8, 15, -12, 1); + B(1, 8, 15, -12, 5); B(0, 1, 0, 11, -1); B(0, 1, -1, 11, -2); @@ -796,7 +796,7 @@ static void initBeamMetrics() // =================================== F B(1, 7, 7,-13, 0); //F B(0, 0, 0, 12, 0); - B(0, 7, 7, 10, 0); + B(0, 7, 7, 12, 0); B(1, 7, 6, -13, -1); B(1, 7, 5, -13, -2); @@ -908,8 +908,8 @@ static void initBeamMetrics() B(1, 5, 4, -13, -1); B(1, 5, 3, -13, -2); B(1, 5, 2, -14, -4); - B(1, 5, 1, -14, -4); - B(1, 5, 0, -13, -6); + B(1, 5, 1, -15, -4); + B(1, 5, 0, -15, -6); B(1, 12, 11, -15, -1); B(1, 12, 10, -15, -2); @@ -1164,6 +1164,28 @@ void Beam::computeStemLen(const QList& cl, qreal& py1, int beamLevel if (hasNoSlope()) bm.s = 0.0; + // special case for two beamed notes: flatten to max of 1sp + static int maxShortSlant = 4; + if (bm.l && elements().size() == 2) { + //qDebug("computeStemLen: l = %d, s = %d", (int)bm.l, (int)bm.s); + if (bm.s > maxShortSlant) { + // slant downward + // lengthen first stem if down + if (bm.l > 0) + bm.l += bm.s - maxShortSlant; + // flatten beam + bm.s = maxShortSlant; + } + else if (bm.s < -maxShortSlant) { + // slant upward + // lengthen first stem if up + if (bm.l < 0) + bm.l -= -maxShortSlant - bm.s; + // flatten beam + bm.s = -maxShortSlant; + } + } + if (bm.l) { if (bm.l > 0) bm.l -= graceStemLengthCorrection; @@ -1264,6 +1286,10 @@ void Beam::computeStemLen(const QList& cl, qreal& py1, int beamLevel uint interval = qAbs((l2 - l1) / 2); minS = minSlant(interval); maxS = maxSlant(interval); + if (elements().size() == 2) { + minS = qMin(minS, 2); + maxS = qMin(maxS, 4); + } } int ll1; if (_up) { diff --git a/mtest/libmscore/beam/Beam-A.mscx b/mtest/libmscore/beam/Beam-A.mscx index d156fa6f4fbb..befc90af70c8 100644 --- a/mtest/libmscore/beam/Beam-A.mscx +++ b/mtest/libmscore/beam/Beam-A.mscx @@ -260,8 +260,8 @@ up - -4 - -8 + -5 + -9 begin @@ -288,8 +288,8 @@ up - -3 - -9 + -7 + -11 begin @@ -420,7 +420,7 @@ - 9 + 8 4 @@ -444,7 +444,7 @@ up - 8 + 7 3 @@ -487,7 +487,7 @@ up - 4 + 3 -1 @@ -567,7 +567,7 @@ up -1 - 4 + 3 eighth @@ -588,7 +588,7 @@ up -1 - 4 + 3 begin @@ -616,7 +616,7 @@ up -1 - 4 + 3 eighth @@ -636,7 +636,7 @@ -1 - 4 + 3 begin @@ -657,7 +657,7 @@ -1 - 4 + 3 eighth @@ -723,7 +723,7 @@ - 8 + 9 13 @@ -743,7 +743,7 @@ - 11 + 12 16 @@ -770,7 +770,7 @@ 3 - 12 + 13 17 @@ -811,7 +811,7 @@ - 16 + 17 21 @@ -1064,7 +1064,7 @@ 21 - 16 + 17 begin @@ -1092,7 +1092,7 @@ down 21 - 16 + 17 eighth @@ -1113,7 +1113,7 @@ down 21 - 16 + 17 begin @@ -1135,7 +1135,7 @@ down 21 - 16 + 17 eighth diff --git a/mtest/libmscore/beam/Beam-B.mscx b/mtest/libmscore/beam/Beam-B.mscx index 408a5eb46fe9..bd04f946d15c 100644 --- a/mtest/libmscore/beam/Beam-B.mscx +++ b/mtest/libmscore/beam/Beam-B.mscx @@ -255,7 +255,7 @@ - 9 + 8 4 @@ -276,7 +276,7 @@ - 8 + 7 3 @@ -326,7 +326,7 @@ up - 4 + 3 -1 @@ -348,7 +348,7 @@ up - 1 + 0 -4 @@ -626,7 +626,7 @@ up -4 - 1 + 0 eighth @@ -647,7 +647,7 @@ up -4 - 1 + 0 begin @@ -675,7 +675,7 @@ up -5 - 1 + -1 eighth @@ -716,7 +716,7 @@ -4 - 1 + 0 eighth @@ -783,7 +783,7 @@ 20 - 15 + 16 eighth @@ -803,7 +803,7 @@ 20 - 15 + 16 begin @@ -830,7 +830,7 @@ 21 - 15 + 17 eighth @@ -871,7 +871,7 @@ 20 - 15 + 16 eighth @@ -1142,7 +1142,7 @@ - 7 + 8 12 @@ -1162,7 +1162,7 @@ - 8 + 9 13 @@ -1211,7 +1211,7 @@ down - 12 + 13 17 @@ -1233,7 +1233,7 @@ down - 15 + 16 20 diff --git a/mtest/libmscore/beam/Beam-C.mscx b/mtest/libmscore/beam/Beam-C.mscx index 4ace955ec9a7..5ea0ff481a82 100644 --- a/mtest/libmscore/beam/Beam-C.mscx +++ b/mtest/libmscore/beam/Beam-C.mscx @@ -233,7 +233,7 @@ - 8 + 7 3 @@ -254,7 +254,7 @@ - 5 + 4 0 @@ -281,7 +281,7 @@ 3 - 4 + 3 -1 @@ -323,7 +323,7 @@ - 0 + -1 -5 @@ -533,7 +533,7 @@ -5 - 0 + -1 begin @@ -560,7 +560,7 @@ -5 - 0 + -1 eighth @@ -580,7 +580,7 @@ -5 - 0 + -1 begin @@ -601,7 +601,7 @@ -5 - 0 + -1 eighth @@ -686,7 +686,7 @@ - 7 + 8 12 @@ -713,7 +713,7 @@ 3 - 8 + 9 13 @@ -754,7 +754,7 @@ - 12 + 13 17 @@ -841,7 +841,7 @@ -5 - 0 + -1 begin @@ -864,7 +864,7 @@ -5 - 0 + -1 eighth @@ -943,7 +943,7 @@ 17 - 12 + 13 eighth @@ -963,7 +963,7 @@ 17 - 12 + 13 begin @@ -990,7 +990,7 @@ 17 - 12 + 13 eighth @@ -1010,7 +1010,7 @@ 17 - 12 + 13 begin @@ -1031,7 +1031,7 @@ 17 - 12 + 13 eighth diff --git a/mtest/libmscore/beam/Beam-D.mscx b/mtest/libmscore/beam/Beam-D.mscx index 49ab30cd7ed2..b5cc5f1bcdec 100644 --- a/mtest/libmscore/beam/Beam-D.mscx +++ b/mtest/libmscore/beam/Beam-D.mscx @@ -237,7 +237,7 @@ - 5 + 4 0 @@ -258,7 +258,7 @@ - 4 + 3 -1 @@ -286,7 +286,7 @@ up - 2 + 0 -4 @@ -308,7 +308,7 @@ up - 1 + 0 -4 @@ -330,7 +330,7 @@ up - 1 + -3 -7 @@ -563,7 +563,7 @@ up -8 - -3 + -4 begin @@ -591,7 +591,7 @@ up -7 - -2 + -3 eighth @@ -611,7 +611,7 @@ -8 - -3 + -4 begin @@ -632,7 +632,7 @@ -8 - 0 + -4 eighth @@ -698,8 +698,8 @@ - 6 - 8 + 7 + 9 eighth @@ -718,8 +718,8 @@ - 6 - 8 + 7 + 9 begin @@ -745,8 +745,8 @@ 3 - 6 - 10 + 8 + 12 eighth @@ -765,8 +765,8 @@ - 6 - 11 + 9 + 13 begin @@ -786,8 +786,8 @@ - 6 - 11 + 12 + 16 eighth @@ -874,7 +874,7 @@ down - 19 + 20 24 @@ -898,8 +898,8 @@ down - 17 - 23 + 21 + 25 eighth @@ -978,7 +978,7 @@ 16 - 11 + 12 eighth @@ -998,7 +998,7 @@ 16 - 11 + 12 begin @@ -1066,7 +1066,7 @@ 16 - 11 + 12 eighth diff --git a/mtest/libmscore/beam/Beam-E.mscx b/mtest/libmscore/beam/Beam-E.mscx index d98f2e895207..fa78fc3bb059 100644 --- a/mtest/libmscore/beam/Beam-E.mscx +++ b/mtest/libmscore/beam/Beam-E.mscx @@ -159,8 +159,8 @@ up - -7 - -7 + -10 + -10 eighth @@ -237,7 +237,7 @@ - 4 + 3 -1 @@ -258,7 +258,7 @@ - 1 + 0 -4 @@ -286,7 +286,7 @@ up - 0 + -1 -5 @@ -308,7 +308,7 @@ up - -1 + -3 -7 @@ -330,7 +330,7 @@ up - -3 + -5 -9 @@ -399,7 +399,7 @@ 9 - 8 + 5 eighth @@ -418,8 +418,8 @@ - 9 - 8 + 8 + 4 begin @@ -442,7 +442,7 @@ -9 - -3 + -5 eighth @@ -463,7 +463,7 @@ up -9 - -3 + -5 begin @@ -485,7 +485,7 @@ up -10 - -4 + -6 eighth @@ -564,7 +564,7 @@ up 4 - 9 + 8 eighth @@ -585,7 +585,7 @@ up 4 - 9 + 8 begin @@ -633,7 +633,7 @@ 4 - 9 + 8 begin @@ -654,7 +654,7 @@ 4 - 5 + 8 eighth @@ -721,7 +721,7 @@ 13 - 8 + 9 eighth @@ -741,7 +741,7 @@ 13 - 8 + 9 begin @@ -768,7 +768,7 @@ 13 - 8 + 9 eighth @@ -788,7 +788,7 @@ 13 - 8 + 9 begin @@ -809,7 +809,7 @@ 13 - 8 + 9 eighth @@ -875,7 +875,7 @@ down - 15 + 16 20 @@ -896,7 +896,7 @@ down - 16 + 17 21 @@ -920,7 +920,7 @@ down - 17 + 18 22 @@ -940,7 +940,7 @@ - 19 + 20 24 @@ -962,7 +962,7 @@ down - 19 + 23 27 @@ -1058,7 +1058,7 @@ - 8 + 9 13 @@ -1087,7 +1087,7 @@ down 25 - 19 + 21 eighth @@ -1108,7 +1108,7 @@ down 28 - 20 + 24 begin @@ -1130,7 +1130,7 @@ down 28 - 20 + 24 eighth diff --git a/mtest/libmscore/beam/Beam-F.mscx b/mtest/libmscore/beam/Beam-F.mscx index 8d6fde05e47e..4391f8ac90b1 100644 --- a/mtest/libmscore/beam/Beam-F.mscx +++ b/mtest/libmscore/beam/Beam-F.mscx @@ -159,8 +159,8 @@ down - 24 - 24 + 26 + 26 eighth @@ -237,7 +237,7 @@ - 1 + 0 -4 @@ -258,7 +258,7 @@ - 0 + -1 -5 @@ -286,7 +286,7 @@ up - -1 + -3 -7 @@ -308,7 +308,7 @@ up - -3 + -5 -9 @@ -330,7 +330,7 @@ up - -4 + -8 -12 @@ -418,7 +418,7 @@ - 8 + 7 3 @@ -443,7 +443,7 @@ up -12 - -4 + -8 eighth @@ -464,7 +464,7 @@ up -12 - -4 + -8 begin @@ -486,7 +486,7 @@ up -9 - -3 + -5 eighth @@ -565,7 +565,7 @@ up 3 - 8 + 7 eighth @@ -586,7 +586,7 @@ up 3 - 8 + 7 begin @@ -614,7 +614,7 @@ up 3 - 8 + 7 eighth @@ -634,7 +634,7 @@ 3 - 8 + 7 begin @@ -655,7 +655,7 @@ 3 - 8 + 7 eighth @@ -722,7 +722,7 @@ 12 - 7 + 8 eighth @@ -742,7 +742,7 @@ 12 - 7 + 8 begin @@ -876,7 +876,7 @@ down - 12 + 13 17 @@ -897,7 +897,7 @@ down - 15 + 16 20 @@ -921,7 +921,7 @@ down - 16 + 17 21 @@ -941,7 +941,7 @@ - 17 + 18 22 @@ -963,7 +963,7 @@ down - 19 + 21 25 @@ -1088,7 +1088,7 @@ down 26 - 20 + 22 eighth @@ -1109,7 +1109,7 @@ down 25 - 19 + 21 begin @@ -1131,7 +1131,7 @@ down 25 - 19 + 21 eighth diff --git a/mtest/libmscore/beam/Beam-G.mscx b/mtest/libmscore/beam/Beam-G.mscx index d3a254e14daf..7c602419c87e 100644 --- a/mtest/libmscore/beam/Beam-G.mscx +++ b/mtest/libmscore/beam/Beam-G.mscx @@ -258,7 +258,7 @@ - -3 + -4 -8 @@ -286,7 +286,7 @@ up - -1 + -4 -8 @@ -308,7 +308,7 @@ up - -4 + -8 -12 @@ -330,7 +330,7 @@ up - -4 + -8 -12 @@ -418,7 +418,7 @@ - 8 + 7 3 @@ -442,7 +442,7 @@ up - 5 + 4 0 @@ -464,7 +464,7 @@ up -12 - -4 + -8 begin @@ -547,7 +547,7 @@ up 0 - 5 + 4 eighth @@ -568,7 +568,7 @@ up 0 - 5 + 4 begin @@ -616,7 +616,7 @@ 0 - 5 + 4 begin @@ -637,7 +637,7 @@ 0 - 5 + 4 eighth @@ -844,7 +844,7 @@ down - 11 + 12 16 @@ -865,7 +865,7 @@ down - 12 + 13 17 @@ -889,7 +889,7 @@ down - 15 + 17 21 @@ -909,7 +909,7 @@ - 16 + 17 21 @@ -931,7 +931,7 @@ down - 16 + 20 24 @@ -1032,7 +1032,7 @@ down 24 - 18 + 20 begin @@ -1060,7 +1060,7 @@ down 23 - 17 + 19 eighth @@ -1081,7 +1081,7 @@ down 24 - 17 + 20 begin @@ -1103,7 +1103,7 @@ down 24 - 16 + 20 eighth diff --git a/vtest/beams-16-ref.png b/vtest/beams-16-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..7015a238d8d35db87ded1ea655c4e5f05d35d39d GIT binary patch literal 8888 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 PBc^Dm>ZnvGSx5d4FQf!M literal 0 HcmV?d00001 diff --git a/vtest/beams-16.mscz b/vtest/beams-16.mscz new file mode 100644 index 0000000000000000000000000000000000000000..3d2bbcda04e80ce14a4100f129355a032abae514 GIT binary patch literal 8712 zcmZ{Kbx<6@vnK8?!2`j9ySr;}hhU34L4vzGK^F}!!CBnhU4pwya9vsp^?OX1b@p{!|rV;qaiKppc-Bi!5cL8!O(OKD6u)`Sc-5(wgGT^2#!-W=@W7 zrZ$ciE-ao7_Mp0&kx4Z=MP`PniD{4)#{#FSy4eMdtcFb=6w>v1wNM@dqKQR~r|E)pphz#Lpdcp~ zvF|$h0)d^zOi&D>0UfR%t-q|kfG(pJXSKi304O9Vu!?N|D0m~meR_?Yk=pHFvhq?k zyo#IASR6p?(f~kAmA<-HQDA)=wNyIA0)s>k!yCK3?J1A}6gQYh~TAknUW85)n-2GSzNl{?HqO zxQ2*mNP_EbQ!FAI5a5T_nKGJE`GlYId-_mdt zqb5ehiVWwlZfdta7i&$S3Z`+*!YuzoF-<%O1Wd?}jviMF)YUl~44N@W z7Ia^p3%GM8^D3YeTsAvTe{z0=|BcVBaL>b{lw3*6tWTu#3Tf=q%GavgQKJJysnlG zlU}B-8fT6|Ij?&m+!o)@OUZuv<&-q{8#!+&#ue`>8yYp~wSOm*nx3v9?x3j}{g(ov$ z>#N<6<$HE^mi(Laty4lwY{pb$+_jxEGkdMC4`yRgYi=0Nk~UaX%+}VX*xUlUt+my{ z(qeMjL+0%G%;{Uc86ffJ!^3&A)BF+qzo7z)U=_@EP2G@~FxR@@l)0pi4W-Uyc_gv{ zkaJ*;g*%~d)%od|D6xwdc4fv_Ge>5K7gkhETuem7?jdd7?q8WD!8hyN{n*ND177na z|DyhtKBD&aGe2MNwx^e~n9R(~Cb`{;__JIHq#;0vloTm8HkQkky1JpEK`t~~{`lmK z01waP;H3ljwsEeZsTr!rhL6AKmW(ORMdXSoH#RnS5T`u*@_3mH0_}ALEWME4snl%0 zF?9t728O0+9u2?=v$9@3Oew!ep3|sVlb;t9Eqs zRg8&kdEru*lq_s%xXS{z1VWuu=+wlDKBIEADVs1-;Obf6Dspk4R8)+97WKDh6U-yK zDZo?&kA8^)fjE;Q%czV+*2fmP{T-(m)EVqmACiz+-mHBvPyD{5#)`TV-6KZ*@(WUfr0tn)D~|o z&s1bNi@vf&;AMgre*}=Fu>?Ci`+XgblCD#nmf*wF0^Y}#KP@bZe}Gt>Ox0$mE^9Qc zVk*;-23FM04h|ug21?%|kEb5eJHQ83U~g}M$IEojPqUM?eP|4Zwd-z0$H(UlKi!yk zpI|h+(LQUvJoR|JPh-M}6x!05nYHPxtk|T=+zryu(9zS&`1-zHv#L1uT6*RFezG}K zn7f)Esv`Ug?Hrj(|n=TM#F#rI_f+B=^3e+`n9k_Z>_3e{PhUe(p`Ib z!JXUs`c-3wolWRWufYhyYG-Y}f3RO=&|KX&Kb3+~W(jWa@YMKb@9$BLX|5&U?e)XI zP2eFO|1S3sFd=;Ye&_72Tla)PKp?`GQrP~oA(UZa`e+k{Q+?rWs5nkd3RC}@Kz@>z zmWC#xrGuJgYau(kRokpj#$eJd-5V=aZfob!&F;;6N8bY*3gFcD>V`xb<5!D!++|##6dvmr->#YPam{ z7MSRtt|_Wk-ak8P1_7yGUMb=*N=xdltHWio>ojG^Er)n`cn;Ij3l$VwgOwpEiwldL z&Ky^_xP|!j6yl_;Rz3@S7z9Z#zq`DGV9qsS$*H-;iOxxMn*_*@!<@${4BV17;Bey*~ z{1nKbK+d@J^Yb77L>u|XZL7Dom9i{vO~r@7#KaVk86t;{oa9)r zOmoYl({)g=w2bx7_~~On(q~cW?JBtEDsgrIPX%yv=SEnMmefwe|ITbSH@BXh5yd3n zx0eV$)xywam1Ec7(Uj5906oq8tAGB&C#q|prlo$=k=@$b`f?IG+hRxMT^BI=lAL2- z1Y^6d)zOs?4KjSU*rF8W1R3U(D=|NF+bKbn=9 zX|lxtey;j~EGVVD}}>B(Dyt^0TYl~8t^xI$w}wq=zaj?VA? z;?iOI-BLf^$F~xqB2Gy!f^@pLs|PPGFSj-~m^%u;MM^d0o0b2BRPDQCV4f93J?Fku zqUk;sqsB5lG{XIM{7u?Y6nouXE&`z;Zm}ca*E&a`DzURwKzshqT>UycJ3DK;`zE<3 zqvP$49`{_u?4qZq=jOpHSY{|C1*cB_T50S1`smcITR9}Cg5kGR=cLLpZe#bgplWx2 z`Nrn`O0-P2YkTe#Dr(KJrmQTn8MH_0>G!pI)T+3)K8cQvE%Eus?a}lc>->CoY0}bo zho{wwt=ji{h~FRYaw>il9V*G%0m$m1<#kq3uC$lm8v!IgiK?*h)+ExJ&1bq1+X#mi zIp<))YPxoKc({sX3PQBBy6rwZ?@Ia{iI!7#nw4?QJNDDv9lFGmYkzirewdni+v3js z#}Rzpr8$s|i;HXG-dAEcT8FW_fkAImr613ZhLf*n&%ul!1^Iz9C z%~KvrY~&&*s7{tFo3_Bk6sD}Fc_jV4@zyBz&tm=eG z_jIe3DXgxJPjubnp&JM?9$j1gRL)W0Y!#9KG#(F6T3KE7w|8WDePZV{+%%;q?Oc7G zpSf!|)PWZ1a-XKa#r0;>9=_izMpL|_?hb^aCW^NEQO??bm}dW7M;4F1a1Wd{rT}kY z(J_g7m~wYVmsfp~wta5dN-pZpx09;x>wkxL0Z%~w+fWxM!5&@oM)bMPxyKkp>mx+C zk**p42qiA2rI;LYa?$`Lhq{3ri%{a?5}9}lTPUyQY(u7@fsUSkJXMu6)PKh?;UfpxLVJA4vxXX#*G%;`dGuK22xl5oc6H)Q9wVl+n>w|e8ayr#_B zGh|ggFPZ2r9j6(2+?QlAt5t(!BUj&LJq|RukURTsOg1|g7Bq)zY;A4nBIWLuYU*;8 zEKkje{FZvs`J|;a0*svCDioMmkIIGNVAWhVBqS7y;LOHzNF9(Z2KuGCJcw}ZPjexp zPcS2OD(BVkkp%?S9#Oqk?ntSbSrzc1>jsq%FgeTQu3?h+C9TLbB7lFe|9% z3X#zxztH{SOi+ivDv?dIng7zzl1^fmr|7Yzq@-FaEzN-9IupfASX#X}zpG{F%jy}b z-J;NTob`7VfDarpNw&2xNdB=`zJ?BT183w zUM;48hXZ!>iMG-N6{{Y5=R5AWyVk~8UIQm?LQ1-^t&Z8HZdnondXrT;QX8IiQtjfT z0f31yoJ&wyo>vu%l=A3$6aPK5bdVGUMV&VyLR-Fi!?ch3%3$q?2?hYTmTHX2<$-M^c+{QU z-3hr&zhp(?Vh3OgBZDyjuiHVB-`6y#iS){We5|bbi594qtmdZ6Y6Cnw|X0I^)5 z`BUj}nUJT3Q>$NZx!ub10u+fNYdxw6&`MFuzz{JFK|CQX0T*y;| z&h?MYk{gs?KRqkgR!tpFo?|Qvme>(JUql9VpgdlUf4OqyI!XVZh3ld&nyb5nXxv95 z#b(KEMv_l5(ozG?0=(b*F9K*}(14F~T1txq(3@;7$l7rkwg!2Uv1wU1H@7P&+QAC<&{jKoc<7XqEWqM_FL! zO=JwCruhdZZHa)OPjl-q1Ws5zi$1?R+C)Z1Qgh2MG&Hn9-G~WLtE;Q)DJ6?@REm8* z?ImD&%+B_NUJ`qPahH%6=JN`%DAXYf8J=)+TYmUPN80FIgNmGr3{>`JK7Y$v^D^HP zmM?Dt#|ct)w?3x^Sa$(4>%$S);e>XBLI@+d1bBG*JJg@UyCvISP!7qjEA0Zb>{$u=dqDvr)sE;F4VKpXv)e|6Ajg@+;2|hpC0ZRPmRC zwl`L=W#D0Fud_^}GdfGUMp6WSC8`pDB&)SSz_1ngne@2=% z6r81XMu5rm^t7?Bb7x7%clSv~ssexP&ic}d(&4E_7)-oeL@rnX`7M{p0Bk%eDk{l1 z3uIskJ)Il^U?SzN9b@xWknAu#k|}fV*sOrz9PV4>9EcTo;)zQRHHGM-DTKSz^d?7K zUGaD3lznaYT00NUI8}{y*!hvDe^ww^PEnoj$+5rL zd04~RKDrFcO7|uaMVE-+sbL!|_}=m-1rteMS9>T2QaAOMZa#krwp%vFM_X|Z%*%vn zGP2vGo$E8qa!7S(<@@1fcO3>Dh#@bhYZ8JEPrR+!=ZXPcU7SRFA;dQr_K&6)uBFwp zRwSI7();0HoD3E=#HCp0%hA`iI$pgx_9LwJb}~I)(sKlR=eoK-%m%ppnm9*YUEA7D z$1mVitPWW6o-5gvPW`pd90K0ppM=84@s(XS8K$O@%e^O$oZ3ecH!Of>cX!_H$uNg@ z`Az+%`kuGlLv$I~8B#fuB(A?dwa-z`NltclOeZ5S83Matz3TTXD=U9uU;teSqIwLc zE~G5c)1Tj!&D=aG#mo{5@OL#eHF0oo{*XxEyD-Y6_0sUFh%4qY!cHX8#b6Ds`S?Wh z@SF!&bq)BTEZ0A){W(C6LilX+Z(FrViOU|sy;cbGJLOA3l@g2g-^ZJ{Q-h+*S>xN~ z2k%G(F5)=;ne9@VkJ~-kanP%dALwXn8!fL8jlhM#+{ApL+uD|7ZEej(<1Aep75P1g zFFq;;HG-zgdk_ncH2VPs*>;nEvyP02L}Ney0+>6+j@KN*@BG_AK5vIJ_Q#qapK4k% zs>Y=MTP6)19nu>UTJ)=DCoVpEcMS6r?_pUX!_(eg$k{k-t1pB<(AQaQ@;)pmD5xC) zVZlWGz`iU$c_44pyYyykOybtg?oc^@RTbwWCohz?Z};Mo{D{Kc?@#Qnz5VK(8c*f# zt^pJXNK|>~WQK-JGBQJzQA<$HZ0o>|BR7@kIKS0pI)C1%108V;;I12poc++6VDm`N z)3dkTLxK|jG>p%ge~izpKn@;wstZbAU*&)H-uazdTB4pyrtD?%_q(oU%HL%^Zaz7Y z``*IXa-uk^_!*fVS>dN-Y=SM!hq7sl&ieEny8ZAxbS+14+ zQcxn(V*bXe9)~HdAW=X}xO`{Kd(PG%M*E8t$ zcBS!ZVLfMPH|^b-fB8S$W{@^Ct%T1{mIJyq6nIgwFFSoW7 zD7#cs0I7wreZ!p+Zcz=o%+4|Ny`SzH^n~`9|G}%9Y0UE_<|8B*w|eyjyxT~4S>O>6 z=%@fLPcF21S@|~&=Tz0T9c2qsvqx^6_Ft@dMPY~7?9fdS9x83D>GF5nbhx-J;PA%r znuZX{sMt9;^vwnk1a%hw@(5|n8Z4Fs1sB1KEUcY3ZwjjCzu!B%GW;_KlZM@xsC;?@ zVfV%a+;9jBFFL(hRR)O;RkQ!e^~Kyqw|awGQUrF9)H03DX{PKIrNUe& zUW)@-F-c+MT1XtFyUrv${7o#Lm3Rk zxjViGvkbTow_9Ilm@=khmYlW$bA);a3is4+63fj_hK^;cg*rE{Eu|7FRH74LCnhHH zm5`n7aJ&pBZ*(~vSn(AL^RZsOpN>PJ!$m{7n&+Z`jePEB5!whe0f5~u=gbbG*j&mklSjK2f z?mKX7JAGqc$b#AqvHP0U=t(vliQF3{M*>UB{xU|&lUsimc5`( z9Boo^RMaT0ZOPC6{yJM%XMSC`RHMQAq0&p0?sG?h-C;u@AsMmV>2b9Gw^(y;Q zL*fTImuyF-&jO7vKb@hmm#&F>!$(-M9;#V{ti7*CD%CiTYPMbJC+ zf3MI!HHJs-5D%PQ;fw~j{Y^Mc+_A7R-ftz;22CgBeyoF(4;j@)_&ZzZ7^`&x9OC5bg97dLYIWcLmO}{;uPOokzS7j*qnX*>X0udYpXhN~d zNO&xQT6gmMJ7-Hlp#>l~eq42q)Yxr0z)7 zj!+ENS#5Q!ZL4C?SCI%Vz}85P<-TLjNRFda*t%MHL6Vi_EkqO54w!^ghrTt|E=5(I z2*>sm-eTq&Zw(jMW_r6??oP&zCEX!5(cKmHg6Y^x!J^U{5}HjKO_SgKGqjJtpZh`w z$_!|`oShWfO*%weM01{!#6UcF@V< zt3e-uh>5%ADjEebYmL6hOSwV#LYvcSYf$7KqXO5rproTj(SJ7}(3L8)kTt5Y6akYa zzK%$8%PC{EOY^V~Csm9M)?!lHC4c9hI?g$URi5YOo}b&upn7%gY#R?Ji|q`DHh043NxE z8*!p#Vxxf1Jh@^B;?PC=SwLw#uNvF4<^*OKr}8qrUWu|?N~5#*x2of8c9Gi~7j9ZQ zd^JK2@Z2{FH$6JdZ|xw-byW^86%I#4?!xMxH-q6^!zX;teEob7-pr`<{x>e%xOuon zaG)lD$bX{(@$kkmn?|Y17W}fuRrd3Ohs5%Yz(?Q-FwL5b2`U6X17s