From ce88841e4c39f70da4603909378967a0fd5c48ae Mon Sep 17 00:00:00 2001 From: "Maxime Chupin (escudo)" Date: Wed, 23 Nov 2016 00:19:18 +0100 Subject: [PATCH] Fonction pour tracer seulement les points du maillage --- luamesh.lua | 51 +++++++++++++++++ luamesh.sty | 123 ++++++++++++++++++++++++++++++++++++++++ test/animation-crop.pdf | Bin 260205 -> 277109 bytes test/animation.pdf | Bin 32011 -> 32710 bytes test/animation.tex | 19 +++++++ 5 files changed, 193 insertions(+) diff --git a/luamesh.lua b/luamesh.lua index 060d389..5227f86 100644 --- a/luamesh.lua +++ b/luamesh.lua @@ -301,6 +301,34 @@ function traceMeshMP(listPoints, triangulation,points) end +-- print points of the mesh +function tracePointsMP(listPoints,points) + output = ""; + output = output .. " pair MeshPoints[];" + for i=1,#listPoints do + output = output .. "MeshPoints[".. i .. "] = (" .. listPoints[i].x .. "," .. listPoints[i].y .. ");" + end + if(points=="points") then + for i=1,#listPoints do + if(listPoints[i].type == "bbox") then + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + else + output = output .. "dotlabel.llft (btex $\\MeshPoint_{" .. i .. "}$ etex, (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end + end + else + for i=1,#listPoints do + if(listPoints[i].type == "bbox") then + output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolorBbox ;" + else + output = output .. "drawdot (" .. listPoints[i].x ..",".. listPoints[i].y .. ")*u ) withcolor \\luameshmpcolor ;" + end + end + end + return output +end + + -- buildMesh with TikZ function buildMeshTikZ(chaine,mode,points,bbox,full,scale,color) @@ -323,6 +351,29 @@ function buildMeshMPBW(chaine,mode,points,bbox,scale) tex.sprint(output) end +-- print points to mesh +function printPointsMP(chaine,mode,points,bbox,scale) + listPoints = buildList(chaine, mode) + if(bbox == "bbox" ) then + listPoints = buildBoundingBox(listPoints) + end + output = tracePointsMP(listPoints,points) + output = "\\leavevmode\\begin{mplibcode}beginfig(0);u:="..scale.. ";" .. output .."endfig;\\end{mplibcode}" + tex.sprint(output) +end + + +-- print points to mesh +function printPointsMPinc(chaine,beginning, ending, mode,points,bbox,scale) + listPoints = buildList(chaine, mode) + if(bbox == "bbox" ) then + listPoints = buildBoundingBox(listPoints) + end + output = tracePointsMP(listPoints,points) + output = "\\begin{mplibcode}u:="..scale..";"..beginning .. output .. ending .. "\\end{mplibcode}" + tex.sprint(output) +end + -- buildMesh with MP include code function buildMeshMPBWinc(chaine,beginning, ending,mode,points,bbox,scale) diff --git a/luamesh.sty b/luamesh.sty index 081cf5a..ccb1863 100644 --- a/luamesh.sty +++ b/luamesh.sty @@ -159,6 +159,129 @@ \fi% }% % +%%%%%%%%%%%%%%%%% the trace Points macro +%% engine of drawing +\newif\ifluameshengineMP% +\define@boolkey{tracePoints}{tikz}[true]{}% +%% show the bounding box for delaunay +\define@choicekey*{tracePoints}{bbox}[\val\nr]{none, show}{% + \ifcase\nr\relax% + \def\luameshval@tp@bbox{none}% + \or% + \def\luameshval@tp@bbox{bbox}% + \fi% +}% +%% the scale +\define@key{tracePoints}{scale}[1cm]{\def\luameshval@tp@scale{#1}}% +%% print points +\define@choicekey*{tracePoints}{print}[\val\nr]{none, points}{% + \ifcase\nr\relax% + \def\luameshval@tp@print{none}% + \or% + \def\luameshval@tp@print{points}% + \fi% +}% +%% the name of the point +\define@key{tracePoints}{meshpoint}[P]{\def\luameshval@tp@meshpoint{#1}}% +%% the mode for reading the points +\define@choicekey*{tracePoints}{mode}[\val\nr]{int, ext}{% + \ifcase\nr\relax% + \def\luameshval@tp@mode{int}% + \or% + \def\luameshval@tp@mode{ext}% + \fi% +}% +% +% color +%% the name of the color of drawing +\define@key{tracePoints}{color}[black]{\def\luameshval@tp@color{#1}}% +%% the name of the color of drawing the bbox +\define@key{tracePoints}{colorBbox}[black]{\def\luameshval@tp@colorbbox{#1}}% +% +\presetkeys{tracePoints}{tikz=false,bbox=none,scale, meshpoint,mode=int,print=none,color,colorBbox}{}% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% the difinition BW Bowyer and Watson algo +\newcommand{\tracePointsMesh}[2][]{% + % #1 : the string containing the list of points + % (x1,y1);(x2,y2);... or the name file containing the points + \setkeys{tracePoints}{#1} % + \def\MeshPoint{\luameshval@tp@meshpoint}% + \ifKV@buildMesh@tikz% if we are using tikz + \directlua{% + % buildMeshTikZ("#2","\luameshval@tp@mode","\luameshval@tp@print","\luameshval@tp@bbox","full","\luameshval@tp@scale","\luameshval@tp@color")% + }% + \else % we are using MP + \mplibcolor{\luameshmpcolor}{\luameshval@tp@color} + \mplibcolor{\luameshmpcolorBbox}{\luameshval@tp@colorbbox} + \directlua{% + printPointsMP("#2","\luameshval@tp@mode","\luameshval@tp@print","\luameshval@tp@bbox","\luameshval@tp@scale")% + }% + % + \fi% +}% +% + +%%%%%%%%%%%%%%%% the trace Points macro inc +%% engine of drawing +\newif\ifluameshengineMP% +\define@boolkey{tracePointsInc}{tikz}[true]{}% +%% show the bounding box for delaunay +\define@choicekey*{tracePointsInc}{bbox}[\val\nr]{none, show}{% + \ifcase\nr\relax% + \def\luameshval@tp@bbox{none}% + \or% + \def\luameshval@tp@bbox{bbox}% + \fi% +}% +%% the scale +\define@key{tracePointsInc}{scale}[1cm]{\def\luameshval@tp@scale{#1}}% +%% print points +\define@choicekey*{tracePointsInc}{print}[\val\nr]{none, points}{% + \ifcase\nr\relax% + \def\luameshval@tp@print{none}% + \or% + \def\luameshval@tp@print{points}% + \fi% +}% +%% the name of the point +\define@key{tracePointsInc}{meshpoint}[P]{\def\luameshval@tp@meshpoint{#1}}% +%% the mode for reading the points +\define@choicekey*{tracePointsInc}{mode}[\val\nr]{int, ext}{% + \ifcase\nr\relax% + \def\luameshval@tp@mode{int}% + \or% + \def\luameshval@tp@mode{ext}% + \fi% +}% +% +% color +%% the name of the color of drawing +\define@key{tracePointsInc}{color}[black]{\def\luameshval@tp@color{#1}}% +%% the name of the color of drawing the bbox +\define@key{tracePointsInc}{colorBbox}[black]{\def\luameshval@tp@colorbbox{#1}}% +% +\presetkeys{tracePointsInc}{tikz=false,bbox=none,scale, meshpoint,mode=int,print=none,color,colorBbox}{}% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% the difinition BW Bowyer and Watson algo +\newcommand*{\tracePointsMeshinc}[4][]{% + % #1 : the string containing the list of points + % (x1,y1);(x2,y2);... or the name file containing the points + \setkeys{tracePointsInc}{#1} % + \def\MeshPoint{\luameshval@tp@meshpoint}% + \ifKV@tracePointsInc@tikz% if we are using tikz + \directlua{% + buildMeshTikZ("#2","\luameshval@tp@mode","\luameshval@tp@print","\luameshval@tp@bbox","full","\luameshval@tp@sc%ale","\luameshval@tp@color")% + }% + \else % we are using MP + \mplibcolor{\luameshmpcolor}{\luameshval@tp@color} + \mplibcolor{\luameshmpcolorBbox}{\luameshval@tp@colorbbox} + \directlua{% + printPointsMPinc("#2","#3","#4","\luameshval@tp@mode","\luameshval@tp@print","\luameshval@tp@bbox","\luameshval@tp@scale")% + }% + \fi% +}% % % %% diff --git a/test/animation-crop.pdf b/test/animation-crop.pdf index 8aeb3f026209ac9f6a96745c8d8de772dfb97b3d..1167450b580f07b3605b6514d72608e3a813cef4 100644 GIT binary patch delta 4637 zcmai%Wmpq#_s1OrC8WDsqz2o7fzpheV?dsQP8$wgB^Di^ke@HW7_I061y#oYhpm4Kd_y=rpkDQAyJ z)>ju?8FG|(VsE{(+W3Ry*iWfFP?9pK*@SxL(Kq?(o29&`IZyvD~(m*)OA!PoO!Jv2lV8Sif<+>PK56qC~is zW+B2rWik`em1RCjRzJ~F-3oE~z*U)ar&{+6ZOx!SvBqJ?+;E>DER;U_0;M3K?RoRh z1gzu|;qd*PUGgxAP8zg0jlV7SGRZ9X7;OTw8knCdcznm~u$j~}090w7DAPzDsFiou z11?*Vmr#kqPG_c+t+P3Q3;~p5K$YZ7>B$;88cmO1Fixl5b7XzsST`-(O;_(z&ckG;O#;pa#6B+U$2ltXw%kY6!7A841 z?@krU*qbalYJ6$LUjXp@qw0Oh11DQbKIDRTfetl-~Sx=}zq;kUB4_QY*HaX-1VMyJU1 zADAQd@Qj^Qij~CV3E2E4eeP>|W!l9E+qMkbN>imUYZ`82KLy7F-Qm3^u7;<|xSvIX z(;DfR!heCpt@bLj?uxxPkL*F1t5S{6fv4SHX;#`6VEFsWu_1p58kmUtVa9gYHNjKt z8ZDp(V1lLx8{cf=YUFBpXX0-s6+5t&5Era5K*3i(RQn@Smy@#*Q)p?NZ`asVz1ABJ zHm=5m|9tm;HArvZ9@ic2QAf_ZW6qAdZuiAVV&0W9sNS*{Hy?Wv<+~skE`kI&aNUv1 zZk1g6%0eCJj`7}D6Jk#7_$CeAe>C<8i%T-Ma&2j(ULh8a+bx19Zqn+1VqfwmBdX+9 zzsg)uhE1Ea@pYxWm6P_|E$Cy<_XS@zY52+NZpY(~K!LrH7c8%^t%tj_c~2`^DK(t6!IZ3rmk1?*UfjUO}6au zJ$HYX;Wf=vNgpt)`xSzsB}vUK5$0|0ny6;ZyI23@{DgXjRs@FCb09A4n22Sqo4qDd zj7D@5;f)3fwF3W|$f-WE)_N2446eBqPRRT?H?S?n(5>|Se@~Cu3TX` zC`?Iq*sLRo6Ab7P-#gY>G(G=Pm3U7VyIrzkz_k3N3*Zkc&cT6?uScsuhg_w>P{Ww4 zAt;tYrJ*8voTMRU;hD3@b3-mNbX6Qtl99SBc%eYdR;zjAKL)VxJ zVpm}B2q%OOzbi3D6fT&`#|mwx6pOd-Wq@yI)x^>Cps+uSSRbuBPfDQ5V`m48E!YO8 zGQNqZzn;6fh|n{CI&4X9pD7^+^PS=;$CWG9OX*Tp(Fg@*0&A@ZJPpthYY9y`OT{?i zVD0xXdab}gn(&vuNi$&cjJ^@QjPmrG!au8>bFf-u*qOAFtDihFqt(1XgNS|H zu&21dH4-eg_7mDwxPkWcalmtfjgSCYE!BZCm0ZuAWn1KqX+&77 z-?KShM&*BSA^8@^uD2&;j^mdq5l8J;6?bI!pE$0$%S@u?2S}JVhO?>c ztr0Zk;UZ#u@Fz|uTU+Bt zeY@38_rC^f*PT2hQhpWL??l1e*4Ec*c8h7UWEZiwlj{_o z0@|=#*UI3HXth>F&XX+kN4mwDTG}6%AB3}F;!Jk7W=p4g`g8-P_mntoZKt=?28MP2 z>@$yJjZ!4ctXmWppA3_B12Q0y&bDYiM5% z61fd82LiLk4uB9mG1TQP*U_y2h4)Wwv6Z(r-d(li*e3jF%^@mFTvcoLd9UKWo(iu^ zsx0rJ7so<^u51>w$A8PEMe_owe@`Wjd!&0Tlm#od*#;p>=LSMStO4ED~;#(-nTZbK93Qs zV+c5_w|O>b3G@ndckU2_-iIJqKe@Lm=75w5C2<*E-vyc_k?$qxk&zbJpjB2aR>LLi zs5Yx^13Ia`bhz(3gRM;~>25lxhfsn@6fQ)NSLx&Eu5J8DXIl(A5=ixjlN&4On2B@{ z7>&TOeVq_4y>^XUyPR0GaG~Eeix90R{db#!QK?SxIBXx{F_L2=0a3KjDl;@}%CW&L z6@Rd*SES=MhSNHG=$6{YA%)FtPxeA`eLsu!dZd>s$R(^-EvNj?@6pM@}sQF zy>G7&H41Bf13C7Smx;N^J7e`WzGKo-yE(ae6nQ7*i?{~1r)qupoBC3$`TNbXuI<}w zGI=%;{TC(o#>B;GICxoZaZt&hDySW9SoR~wPmfg84p})}1?c|sWD}tOlE?!H4!I;} zWQ6T)5(X85#})||NWg=D*ZPkbun9=G>kGUlWS=Jx1thfLfeuOlnG`@2BQCEN2)_*_ z!(nPwK{q_ZZ+8AgH4^}wVl?Q?43?vmGBVY)1nGJ?d&Auv(R>hTS)7^}Fq{@5EypL# zXCkEqmA+2GaB5p5Vub6RG>ilY0YeDJbbwaQYXv3v>H!P*uaz8*=NHg`3<{NnLU6vn zfIR<|slR|#>QCZafq|#_cwQN3-N?u zBHtsN`F?ZFgoa`Bl9LIFY%W1>QvK@5!&7}hDQd}hkA&_ag#7I+Q&S1>NVj2q@to;1 zZEJQ9O~9RAeu<`jJ*_EM!I2{VowOmL<^X94U#Ccv_@~>%_o`Y{zqxwQXOAITR?-WC z!ma)6bzE$gFKW~3W0z2r>CM9yl+FScx-+iQ>PbzfK73eL7=%FMxv^TK4bkJktMzq7 z3PmQ?)S%A1knt`>rjrxDtL1f~#T{hl&EDp0MBHQcd_k=vg+s}5vv?MktbEebiKY=R zX)@byO00_vB$+@(tHF9Y5!UfB2v*XQ;<*j;`}OHKg#Q z!iz5Jd;z;9SO)*PfrE3ct{wRO-qg1k?OFbp!mG+Hd*h=ii}N75heejm)syuL3-6F`@H~2Lq*8_H`MX2= z(_LEl^5N6>znA;vR;)d?>psvt9k~32+`B~jrh8$(D2f_zKsx%*pB<+qxRTup(6oBc z*u4-ap3p$_gzD+cYnIc*9*&ykJ`&bHEG1?U$^!I)E-ccnQhxl<0^ZQKpsokiW<@{$9eU;y#Q73T0NhKGk9P$GKQ&QcpQ~lrlr4T}N$QUy6O70C3&vX*Qnr8yp+gsr2E@+i+iZF>e*xr6julk|08bCa2Zl5cXQkJI&q1 zUKb6OA>Ne}nfTQ(r=Aq`W_c6N5t1K#Pp7E(*`|)*@pTg_XP1LJ753$szA3eK5s!k} zJ`!uVVCX4fD&miqyU()?BF@XSe(Lk(5&ZxIIJhLBQ7lvEZ`-^FjH**GUs^?`vv-W&gs8QtB_quA~2;>pFt-*(l0E zVVasS4S87&1qCfFI9x+kO-^1$4GvS6(~{AWmsRHb|1H$l7yTDnvhp&x{92$WmU~jy zBi^2=fByutyyLpH6KY_3>)vEKjWdDCQ{SvIsuC}#-Ww&EWT#etPk^Df6dXy`tM1_u zYq_N*l&nR{sV^i~ICkX`^6_wSFDNB=`QIqI-qc7R5S+glrCy)GD0EKDahdOihLJny zsB#o*L`A}@ribptk9nwwvEqfW#kIjBQEt-Q&fO0N!-^wo2{YU+b~zn8@eYFxv){nH zly)p5Q3^)nnhYRwo0Hwh{mnX2--T>!up}NVH#hqBKkO#SV(@?zx$?Z?J7( zFh@!m+wqoLPB#@h;0QZXmGX#^tY>c4HBEL|Y(DA#X6XGhOgT#*@B$ zxJKWM67uoF)~|m4S@9%n=fOML-+gpkq4x6Rf((o24vVa?_!yVVNz|_%d(MENqP}w3 zWcaY)YY7{xX1s?!ZfoF#&-YxZXtSv+Ir2fA5>JcKD9L8ch)pH|;*DC$67*eTzn|Z> zC_lf~BruqEIwDEZNNrV;y5G*+bUJzLt=EH_1;~3zb3kwGhTOmIm3k zETbqwp^_v^wiJK=_x+vs>-*t3=X&nvI_LRz@BZTavB^=_2mmR{VIJWLDkMpN&0H%N zu35M=-?4@-S)2U=SiC(z(w;a} zX7CpB%zcpyNk)klH2yIgk&pZuIHZwuUEOU+EJEYe!?AWdaBka4)ScGN609(6|6-Ud zdo=mGZpeV=WbMh9UZoZYlmrgp(}=qm!|279R-BxWsPN3a_VZxhlN?Z_nOd8wj1Zfk z*qyG+?UkOQKGieZi7q;^cPFRoQ&?E~wJAwV^~>DJUnK-bZf6Cd=M}H!zV26}hgdOi z`x_(gm~>m!|6E_xN?WZ}NV#4rn3c9dQ>c0d|+gj*^W2SZ|UoOW*R^ z3HuPRof2ppD)H_s0xCfF7m?{?94_hV(Kc?}^hU^RaoC1GOL70rC)SA;=*cX+HOK9j zu5ARLnsfI&qfq&d2XvetQ{d>=Zta&?H0)piXm)hgcnx;`$A_c9F)HlPJ@S%j>0U;a zZKX?n+ubj|F7VnEM!-3_@!pdgk9vHWz6tZgm!z`P3xXac? z?mFtlo#$b(jWA-QANmi$VrS4wR;&q}LGcLx%(yCqLEs#Fy zykA3e`FV0W1PEzRWMITKO#fpBZg{Q3glmu+ngBM4B{AWsOe}zNp!(5Mx?l{TF;F?# z0jIo}27rR7(`Eo>92GPLz=5dyj{qzz zh?gw?K)@G2D4If)$c??jv;zMrye21;qSza!S#{sbDL@4Y3%FdVD6%ocMKp32z5XCi z_8s9d8%6V)+Ve^%NPZ=-zIV;bpf~$nk%i8C=r*T2h2j4DNIf9}=~YEH0j=98Tu?6- z`)nxt+WFWtrv#l%01u;q$Od59hMDQ!?L#OKJXmon>0=?#Uj*ULD56x@F zeCyJ+^z%&R$X;!g#~A}jT4i`*VTN(+1W=%Y(UP@O7=|F;Wx+3-8VSRS7+SL^mRE1E zLNeiYGq>!67-d{Z7ik9~N>4o`2$sFNqO=}tc|QY=D`He})xo^Jjo7cnIO0ZWO)S~d zq-p<%jn+4}35LHK5x70xwwsmbJnbS;|7yv0MK8pdBSo&85W=b5DAx6IGCx5!%b7Bv zeC}Ld>(J$tR?*HnRx4t^F5A55k04)p7h~g+MKulEscAQ3gBgT4 zA8)(!Q-P-HeD7u(E2{QUP$t_tI{GbPQX`M$WHa@tANhC@NFqJJ74)gg@1@H>gomQl zPGr-k%z~rs3oKe4?NhlXw!WEq5|5OutySMT71rcB><#?my+-HwRVkF}oKxO0NeoWR z-^aZz6Bs)4EAr`3X9@260 z)J)`p-It%l4ogMLZ@VO&v6|<6;jgn`iRuH4LEhlUA<`F^H%?x z-!T_0s!w2}{G8)7Z=NaY_XAqO=6Tag^om^oS9a&}&Y`p>C`%ipX_@SO4^y!p-b5#s=saDZey6ql!oLW1lR(AX(65evS znz2EXH~8Uj0cpGZd2uttj;!0dOc$rhq;4xb(GBl2EP2^N7dOw@DKqP^hJCKBV=1`o|{iEQ+Lqge|qj{JCbv2tNP9T&r<#N6Lr=2DOs@BOCL7aPnEN&U#APVVxB+P8BU7pzuyk6k1n3Tky0!-7#!*vmftoQmNP_gk#>bRjkMlUD)1?FaxVxj%Qrx`G5Fh^rsDu}ZYI(=s zGJH_o9+JC`5Yh!F|6otx<-k9!YTtcKEhNN|M4D?g(HR^jCPM0_J zK;$4DXmOhlTAX8agz0l2}=7zXlz##Za?iEOaJ?ZY-EKO79^kxCk z>C)&7dUtnV#_X(77@m#@JYy*KaY8Z!FPdlqIoP^)O@U`DBLhZ^b>;rZnQ7pR1O}i1 zU+|9t%sqf}!`~5<(pG&d8RL&)Ve}-iaR8*3g-x36@ESb!JXcjSqi#T~{uL&D`q<_z zZ%Nm!EoKMX9HHW`H|^b0`y*|fZxWb*rOj&D#k^u!IUB%kYvjP8n4|5|m$Yx92!CUiJ9zRDu7SiD_O6 zEm@n`<|B3YC}>4bVhQ3Bcg&u*aH|L(bMMl7!u4kiv!iP@mpEKgOLZx}t#v$tz5eOc zcoT}D+=ItLJVGm$l`by%-h#io(NvRmHbYeEvZM!0Ec0{U9&fpr-@Q$(*evxm{gl0!k0ABVJp!m6Ty)A&F?+4X^DRk{9xChOd2E&9t#YHF zZgZBsGSZR$!y=hhq#~6gD%3_)_^eka4*4*Bo@wN>n;-za&U8IS$$s*ztau%@1_kWs^OKim2^-_1cDqMi$Tk2 zVdRw*v~;ivSPT}gg_qaTfdBsr+v%f!TLptb|8J`Z(v^*_nL+!uj^@v?f<%&;LCe4d zk)#Cp(gP5?$e>8gM{G@*upMU!28Ps@uCCz~?Jv`!Sg^3LNT(pIW^WXydzFAOF(`8i0wH6n!Q zg>=ijlMeX##9`Cr`eD?Z?|TkG7=(9Ui&>?JWe*Q))9Enr3e_lsJR7ueWsK-0pEQP@ zi74V=*TS)O6&|cqhs;$xPWPOK#u8vprP+I&u|T~~P=Wi9r3S(*&8k$*tFB)eO5!1r z`j_+vyCep?Z(u>5eK^?LjXCDe*2#Z^<%M$jPJX27#F?Fwo$S1sETvkv-c?V?Kfrb7 zX;Uf;dQ>CJ7`8Ecwr*U)?4zo3Kf7Lnc242E;Tv=b->(M}d}1%Gn95)yQkj7N=Kl&z zi83?Zp=w6qI&R1_{oi#|_05%E+f5-jdkXo&?PugwKlAY~?H@?*y?oTj VMk)+~tQcjKGKLw6)G^g%{tsxu^(O!T diff --git a/test/animation.pdf b/test/animation.pdf index d437093960cbecde06aa1e644b65248f3bbae69e..5f3dd5141bf57166cdd2530f6f77d83952ddcf53 100644 GIT binary patch delta 2623 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 Kim8p6z`p^qqrq1I delta 1970 zcmajeYdq5n1HkcYR?M}(W@wvDSnlm&O)f_pLgFEzqh~EHMJa-S{?yT+vW%sqln;J7+P%e z^DgNj-o_!k9eUL*PU5L+ETP3R0xb#^#>-#d4?JmxCnXIOkGSITe00P)qn__Z&Ew2)9NZ{1(La=M(Gor|?>2jws5Fu5pol2{pyG5FyOBWUIu-mTOs%k^uLMsuW;rh z{<40(~;o6||rrnfy=0cF>S{L3XB1+Na{on=8cdY&J=IgYj7vtL9bw+DL z`1-=g1!jN>%NX=e7Ir@zOBXNO32L%@G;42HyVUhv;@OZ(fpa8htC-5uT+bfAl3dl% zcdyGL5s5d{8>PI43C{SYBt-DMUsY~X73wh$yXk&*HEUblGIQ3^(7N;_AooU;Sn+^JyOw#nc(J z)Q$?E8u=!$7-;~O!T=}~;g0~l5dhSRd;tR?qycnSM;i{_)B&L9`c3L!y*>aHp)hbT z2ek?6H1dRlN+SR=$2>uR00w|mgq?8kJ;4ClZy|((J1hXGck2oQe6$sSUfXBD!4CUP z&`EMV9E>CzK)Y#2;NUhI0R8Ed2?HyfHbMto$~MCs>ChUdn4m@mi<4OhGS$hE49+EE z|0_Ur%8=r~jEPSW;wfaZ!+w5TwD1U?PNw|x2}^Om#9J`T)X)5^LM0scty})#j@QuN zmyea{YFou3HFj+K5@`AQJgh$P*Hu-c^2(6cU3%P7NfjTJdH#nDyTZh!XnlH;Q+`KPZPAGhA6&d&Ya1tF3$~1{tB~;~Q0rRl{d-u0E@bx}(#5i{UNff%ixJ z<1d2P&RrXVLK;0iJc@>Ef@WvD*HIpy^(JM;WwGups|ZDQ5m zqn@yzt**E~Ssb28t^Kj5f@nq4TI#U0?erNq%e9H97@Oa`?BzB9qT+BfrKc^10;aZe zq06z7(UadwA9Z$hb)um$u^f#Ss7HSt7UgWXC1D>J^O^f4)r@449)XdLA6qORlg$pY zpqM{*>UAuxFXGtVVcQU4`vkny;o~8nYHHQgIUrtsB z#J>uw{eyjZa%Kw3(SuHkVX5Pn(%uF-rfIE=sN7Gip66oQIthv5(UA>_7n>rKQRu@t z58XzxuroI|7zz~nhgVAZYnfF)#5Y#=+&G@RM6x6@)Sd4x=QXz+P?Zoq*k5a_{-C&MDk);sH03m>Kzf24;l)Z|qloj%=~%uOliI~Od9SZ+Jnr5j4?Th!HMiH3u} zRcK$Y>L0{3jL3x<>`tbhB}W?9KB(JN?<}9!D0^hxqy9_HOLvl0eVXhn~uTgmD zHq7;so1NN%bqqwTz7pzc#t18jryf5qr=^~1Xr^~@GVXCa