From 25c26835a4aefc32e2e57ac0565aeee29d567e69 Mon Sep 17 00:00:00 2001 From: Nicolau Manubens Date: Mon, 22 May 2017 21:16:14 +0200 Subject: [PATCH 1/5] Solves #195. --- R/PlotLayout.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/PlotLayout.R b/R/PlotLayout.R index 7d5eee1e..0eb1254e 100644 --- a/R/PlotLayout.R +++ b/R/PlotLayout.R @@ -251,6 +251,7 @@ PlotLayout <- function(fun, plot_dims, var, ..., special_args = NULL, #n_plots <- n_plots + prod(head(c(rep(1, length(dim_ids)), dim(plot_array)), length(dim(plot_array)))) if (length(dim(var[[plot_array_i]])) == length(dim_ids)) { dim(var[[plot_array_i]]) <- c(1, dim(var[[plot_array_i]])) + dim_ids <- dim_ids + 1 } plot_dims[[plot_array_i]] <- dim_ids } -- GitLab From 88cf5912312c2917fb0fccbd1d105c27b94c49d5 Mon Sep 17 00:00:00 2001 From: Nicolau Manubens Date: Mon, 22 May 2017 21:56:04 +0200 Subject: [PATCH 2/5] Added usage of remapycon if available. --- R/Load.R | 4 ++-- R/Utils.R | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/R/Load.R b/R/Load.R index efcc74c1..05649661 100644 --- a/R/Load.R +++ b/R/Load.R @@ -262,8 +262,8 @@ Load <- function(var, exp = NULL, obs = NULL, sdates, nmember = NULL, if (is.null(method) || !(method %in% c('bilinear', 'bicubic', 'conservative', 'distance-weighted'))) { stop("Error: parameter 'method' is wrong, can take value 'bilinear', 'bicubic', 'conservative' or 'distance-weighted'.") } - remap <- switch(method, 'bilinear' = 'remapbil', 'bicubic' = 'remapbic', - 'conservative' = 'remapcon', 'distance-weighted' = 'remapdis') + remap <- switch(method, 'bilinear' = 'bil', 'bicubic' = 'bic', + 'conservative' = 'con', 'distance-weighted' = 'dis') # grid if (!is.null(grid)) { diff --git a/R/Utils.R b/R/Utils.R index c748a508..6ec7f176 100644 --- a/R/Utils.R +++ b/R/Utils.R @@ -202,8 +202,11 @@ } else { is_2d_var <- work_piece[['is_2d_var']] } - if ((is_2d_var || work_piece[['is_file_per_dataset']]) && (Sys.which("cdo")[[1]] == "")) { - stop("Error: CDO libraries not available") + if ((is_2d_var || work_piece[['is_file_per_dataset']])) { + if (Sys.which("cdo")[[1]] == "") { + stop("Error: CDO libraries not available") + } + cdo_version <- as.numeric_version(strsplit(suppressWarnings(system2("cdo", args = '-V', stderr = TRUE))[[1]], ' ')[[1]][5]) } # If the variable to load is 2-d, we need to determine whether: # - interpolation is needed @@ -331,6 +334,10 @@ common_grid_name <- grid_name remove_shift <- TRUE } + if (remap_needed && (work_piece[['remap']] == 'con') && + (cdo_version >= as.numeric('1.7.0'))) { + work_piece[['remap']] <- 'ycon' + } if (remove_shift && !explore_dims) { if (!is.null(work_piece[['progress_amount']])) { cat("\n") @@ -404,7 +411,7 @@ filecopy <- tempfile(pattern = "load", fileext = ".nc") file.copy(filein, filecopy) filein <- tempfile(pattern = "loadRegridded", fileext = ".nc") - system(paste0("cdo -s ", work_piece[['remap']], ",", + system(paste0("cdo -s remap", work_piece[['remap']], ",", common_grid_name, " -selname,", namevar, " ", filecopy, " ", filein, " 2>/dev/null", sep = "")) @@ -741,7 +748,7 @@ } else { paste0(lonmin, ",", lonmax, ",") }, latmin, ",", latmax, - " -", work_piece[['remap']], ",", common_grid_name, + " -remap", work_piece[['remap']], ",", common_grid_name, " ", filein2, " ", filein, " 2>/dev/null", sep = "")) file.remove(filein2) fnc <- nc_open(filein) @@ -778,7 +785,7 @@ fnc_mask <- nc_create(mask_file, list(ncdf_var)) ncvar_put(fnc_mask, ncdf_var, array(rep(0, 4), dim = c(2, 2))) nc_close(fnc_mask) - system(paste0("cdo -s ", work_piece[['remap']], ",", common_grid_name, + system(paste0("cdo -s remap", work_piece[['remap']], ",", common_grid_name, " ", mask_file, " ", mask_file_remap, " 2>/dev/null", sep = "")) fnc_mask <- nc_open(mask_file_remap) mask_lons <- ncvar_get(fnc_mask, 'lon') @@ -808,7 +815,7 @@ ### } else { ### paste0(lonmin, ",", lonmax, ",") ### }, latmin, ",", latmax, - ### " -", work_piece[['remap']], ",", common_grid_name, + ### " -remap", work_piece[['remap']], ",", common_grid_name, ###This is wrong: same files ### " ", mask_file, " ", mask_file, " 2>/dev/null", sep = "")) ### fnc_mask <- nc_open(mask_file) -- GitLab From b2faaa2395d96e6c3a515a0fdb41d8a325b9e57b Mon Sep 17 00:00:00 2001 From: Nicolau Manubens Date: Mon, 22 May 2017 22:09:36 +0200 Subject: [PATCH 3/5] Small fix. --- R/Utils.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/Utils.R b/R/Utils.R index 6ec7f176..603d4716 100644 --- a/R/Utils.R +++ b/R/Utils.R @@ -335,7 +335,7 @@ remove_shift <- TRUE } if (remap_needed && (work_piece[['remap']] == 'con') && - (cdo_version >= as.numeric('1.7.0'))) { + (cdo_version >= as.numeric_version('1.7.0'))) { work_piece[['remap']] <- 'ycon' } if (remove_shift && !explore_dims) { -- GitLab From d373ffbc63b2fb3c28e82699d8c8ea5639e45569 Mon Sep 17 00:00:00 2001 From: Nicolau Manubens Date: Mon, 22 May 2017 22:18:15 +0200 Subject: [PATCH 4/5] Support for remapycon in CDORemap(). --- R/CDORemap.R | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/R/CDORemap.R b/R/CDORemap.R index 49bd9dbe..55f12904 100644 --- a/R/CDORemap.R +++ b/R/CDORemap.R @@ -395,6 +395,12 @@ CDORemap <- function(data_array = NULL, lons, lats, grid, method, if (nchar(Sys.which('cdo')[1]) < 1) { stop("CDO must be installed in order to use the .CDORemap.") } + cdo_version <- as.numeric_version( + strsplit(suppressWarnings(system2("cdo", args = '-V', stderr = TRUE))[[1]], ' ')[[1]][5] + ) + if ((cdo_version >= as.numeric_version('1.7.0')) && (method == 'con')) { + method <- 'ycon' + } # CDO takes arrays of 3 dimensions or 4 if one of them is unlimited. # The unlimited dimension can only be the left-most (right-most in R). # There are no restrictions for the dimension names or variable names. -- GitLab From a23764bc5c2488eed2ad0914c93b5dad31767109 Mon Sep 17 00:00:00 2001 From: Nicolau Manubens Date: Mon, 22 May 2017 22:23:52 +0200 Subject: [PATCH 5/5] Bumped version to 2.8.3. --- DESCRIPTION | 2 +- man/s2dverification.Rd | 4 ++-- s2dverification-manual.pdf | Bin 371555 -> 371549 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d36c898a..bf75372b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: s2dverification Title: Set of Common Tools for Forecast Verification -Version: 2.8.2 +Version: 2.8.3 Authors@R: c( person("BSC-CNS", role = c("aut", "cph")), person("Virginie", "Guemas", , "virginie.guemas@bsc.es", role = "aut"), diff --git a/man/s2dverification.Rd b/man/s2dverification.Rd index ee3fca80..23d31299 100644 --- a/man/s2dverification.Rd +++ b/man/s2dverification.Rd @@ -10,8 +10,8 @@ Set of tools to verify forecasts through the computation of typical prediction s \tabular{ll}{ Package: \tab s2dverification\cr Type: \tab Package\cr -Version: \tab 2.8.2\cr -Date: \tab 2017-05-15\cr +Version: \tab 2.8.3\cr +Date: \tab 2017-05-22\cr License: \tab LGPLv3\cr } Check an overview of the package functionalities and its modules at \url{https://earth.bsc.es/gitlab/es/s2dverification/wikis/home}. diff --git a/s2dverification-manual.pdf b/s2dverification-manual.pdf index 8c8bdc7fc49c2a8c052aefcaa8a4d462386c393c..73866213b995894800577557a2ec44459e2bb07f 100644 GIT binary patch delta 5512 zcmai0WmFVgw`PhO!XbtZrKP(BhE${k>2d&pp-Vn75|>XF)n52>rPJ5lMvrhSk-~KPZ!I|o?!q(`F}gXmuX);o zo*th0H3fII!8U^V5F)~fCoe7K|G1Y(Wj%Mu=o|CfdsVd%`tBZ}s=OytJU{i6^DVCd zKcW@h*YdzM=`~xYOMR8ei6H%CV5?qB^1*G{LRvZro9u1~98+e&NGqUuskhhU+Apj{ zj*O_7@2$JN2QCxTI#lBd0?@Qpu>Wz><=o0_9cN;4js5^FKus-pL; zENz-C@eiHnT>Q;ok4dAZ z-lp#(M!1;5qXEIm<$OvxhsMYd3ZoGPG1JfqmZFYsdK-11`A(&P7aW++))Gi2 zWG%}!b<8`%o5%LMpU!PLyd3DS!TuK z4{rTX7e572{yAMPkUTd=?N`NSBN>+R<+9$6wx;6Pm9rB>>7FLtd8_sMqCNR{acl_08>!`FLm| zMr^3tPnP;c^CTiI_@TOe=gU9Q5yhR0kF*$!cXTopU-;fyd~}3-Az*$Ka1IaZoiRuX zzV-_vN-OQBR-(MI9oxP6G=7Jl2cA8Gr4iZsGm{Le`GxK=RScP`RG$yqfD7JMqqluk z>Y+cTAm}#t=KV(=#e`_4?q@0ibT#GIq80TD^E=+`Eq@6`M;?=>@D{|D7h<*OJO1B# zSYQXxj{`mr`M#6fN7WSPzY*fI2x2xyJ;ofEH=Yvam&2pi<9DJ!&RVUqZuTenDyKg) zXX3*RJ%?7;0neX1r*J2D^`kx$CE|bktyhPd28;MsdfnHwZ6GL|xmx*1u3?cA^zIv~ zL$amfSA7x)ij}^azvq)pUw6h^ng>|2^U8kR)}hI=@?Xt6EWi^|6ypB0at~Bn>dD;4 zJd(RMXPoIqx$0*6ojN(O$RrRe&_CuJ!&9+UD<0B*DUK_9Z3KE4EIj$-{{F)I6!!8n zY7e}mqlwW*Fh;kTpI!ZA;0rC%yPVzJL2xf`I^0E$wLr38bLftC`dg5gM1<}y2F2`> zBy{fL_Oi®D$f8(TqblM_Mvzo+WYARy&-j`FxMx`Z)0z=Z)@$LK(6Qm`K9O_HA1 zw|J|gtmM0c6)&E&@~D9Hf#8CeWN2;~KZq>>tp>UBg{-Wv8q_8w6X~H@T}%e012RU)b0*&*l(d`8h6@ zLkUl9C(8-eG4|DZDMU%jX7)|gEsM-c5FC~sVEE|Z;Oht3uwwN;QC`JA3e|JLx|dGw zaDv^Cx(%2j%-Ov=oJ!KBWn8or^Kvt*6a-}B+AO&5DoU>-Ud6nTYl6I4?o!zXA(m?2`$Kucoyanl{*Z9uDT+fPkVcbyL@|=s1b2{S%2RL6G47X|RWRQ62SrnI$noMW zacS{6oU?*`50E;uDnuw7Gd2!ILms`o4t7CdqGW%F^8*toMilp?>j>3Z5D}1cUDrZi z5=e|q8X$!b`A`qoEU?+AqYiJ0Vqh1l3*{|dOzlmkrdV5l(0Vj5WhYZ$=^(QMnsrXE1BcF7 z4vTM zBJbL(<*B}^O;av=#1^8X^LQ%0(oQdQM}{av#9pcXz+9m`YkB+C{hRK80*P)!Z#LuT zg*Y@jqfV&f%>|U6jSj9wH`6v}{3LYN(>!j(XE5?DWuPLH6MLq|FR=0 zKJ2NYeE%|(;=ZX;ja+>TL7D!QDy91thKGPOBqFMBN|4Vz6Ro!tVqjd-Yxs2O1gcgWxj4SM z-!8yg>O{Z*XKlNn3~`^4ncC%)nrnXvQBOCp`#HtniY01$Dhr>-))LG>!V}Qal{~ZqWaKpdu%(U@u)DLZgt?x*lm)4HF`9<^fKb&21Y#wimD+Vz z?QnHPfKNSF+I)J3Rc*eh`>` zg9wi4kdl16ryf|G-3It$NKwW3(i2GiX(K^yjv#MDPv!|hS+$k5*t3GEJc z^8RV$tB>SN!CD5>r2yJ9XU*i?dN8>K;WKP)z&gAiLe}o$hSP+i%ufFh6G{k_xR(&$*Yj=JsY3hht0}I23+lKJ<*!s z%UltobVEdH2| zFD8^8dH+J*KQS0d_U_T?eDUFsT9~s08KWnaMHk$I$D9%g$Qb-KUB4IypkM6Yh%1Y! zxv2Ev%>8h#O|dpi$sF*L)ZwCAQ6BYI!OJvs-6By}v^@p`nua6^*O^#CGcw{H@(O%e& zjlw2J+nuFY+%aU6!`_Kkh3D|Wq>vJX51}hyxw~}}r3GmePb*06tc%JI%8bL)vgO;l zxl+7Uv@5UX>wSqWOJoH|a5}MZ-a*FTwjt8pq*Hv3bILQ9zb2MJq3>=j zImrj0F@Kr}3G)y%$F$255;q7DeQz=nbKiaTS?(YiF#H2ZO&B|*$8*kwr$nV}p>&#N502R*{^2Q%=}h+TBK z@rYmai1t2itqAa-RDc1?SqS<8P#hW5ZL)}Pk!LW%Rldo^iniwBDv7K}denCU?wl_T zuKUlT#c5jXng$ZD5y>hiUGxM%7+w$Ck@_O=x zXRBsD79@Im2zOgu!Ra7l(LBcYCi0!5uVFz3>IE@;>UM*G`tHF8@wZh?*Z~cr*x5yatKnzK^vp8~Ff$OEB&C6B? zwS%4CEpZnM5r(|}oaUZm+ioR+7nslk3uY?>4oEpa_)B~7fRluu$5QV)9+sU`X2wee z3Y)hoFfz5w40r&Pbp*X8uSPQ(2c2uOebi6NcvNyyzLrY$U2V?<$>Q9y)okiL&;xFx zuar7D2`_2`2IBqT-7jwzP!B&@`veH9X?Go$hA#SJY@RyE(QE>xU9?9S+AU2-j7tUT2~~z^tsYT~5*=ks@#sU2rwK zkjQZMhS%g8t?S?GXP8Jiu)cm^CNuQ04D1(HAu`GzeOiU^% zwyX&(Tm&=_6oLO##vV)5ReqB8Rj(Za3wz37irr(PXok1H9u~L!zG@)HUrQ+r#Ty&rb4 z7(=1@wOMn7%FPi_#84LPlX-aRK@ELzZiMS{WMbJjy5zbOQ}6B0-p#Dyvfe*gM$Y?A z_f}{K_<0fYTs4>Fdx_&Bjp89Syv?Z16@qD#Y-5KojYw)&?^l*=6H^)aH@&l=v*m`$ zSy`g4%R!M)WN6}`h-j|THcQ1&{M&R_%!1lkj=j@zY_-_HVixZcN0aFH+(~m$?v&Yw zGXE@I6h!=K^-Ia#NxLc(N$D5>r8y%0`FiK4Z6lCS$~8fPH?aCQuYOvz>iXY(2gQ!g zH5`Oaeg^I1(PY3ruA=ly(2>^UFK_}j$32}&np8}!1wUQLTWg%wKx2S~U@66cbTtj; zQTyE)^+`?W5kiNP>Y}%0a8P*HcKcOk988X02G1quMX~d;_T)9i8p}cIuzpDHIqFoS zlV*$6B%USFHpus$SB4n)>N?*=KjWj3Fe%){@}1EfMe^L@yasT*kvoWDxTJeuW8E6{X5Z(V-I-)X$nuazV_;wwg1_IOP&)8NWz3)l@Y8xT{6sV!hep)!iNte%`#@`>)@6Xid@6gBnX#?O-?2QI|HfXdhn!%;b9HlCkexfOK zsmoYReUCcRkM5;Vq%!a!t(FaSd)v%TRL3FI4Z< z^ZjtXR7aa%LuT@yCmX39{{4;eqxim9C!gkt(dKC4*LQzF@uz!HM${ue)RPHJP!k4>CfWZE}V4eR&By2OS@bw3& zq@1%f4OQk|s)2B^nWZewc}>b{`<)EsVt7wm4Wb2VxpmuVI0MMMlOjOhOd_X%1a5M8mb@=0fB@dC`3R-ib#nO1woJ!>1v|% z8bCmL6qG8U(geZtoxAVf&E1dPdFI(?cXnoXW_MuiAlSB6Yy3o9FI{y;2B9Y~`8XC$ThoBzle}ZYasx@p&8*8;ji2ErL%S}wil=bA?#oa7Y!Q8$6#m>;wD}~b321ll(SBEEX(qeB^g&_V z6L?rM@TB-DiTcRXsAv2iJRg&-6|LoyVMTt=;W-r-c$n>YlAyg@O?Xv&(2H4ALHtzb zj1@<&i`XcprTxXHI|>Svc4RlmQNN*ZYUGM`Y{(yOjdCq=^*llC%@zlbD0Q(l+3-T{ zW9gs1(x_oP0Bui0^SA{0@eC208bwxjug569;_cj$P)vZNw`KFXC+`i@1*FxnQg7=g zn7#ewC|{-CXJ1zcQYh~V4-P7_e3<+Y_M(Cr5_1Ow3q5=gC|?`SvDb93J|c_qqV#w> zkeaPrs{7-LV@i;#%n4u}%l~JpVC%Tm`JyQ)jkqn|5K1``Uh!UBtyl z6qj^kf>`%1t=($;YEs(Gd#=lY9*>Vy&4LVMe33?~eSCB}*|EggJhMWMo_JOtmp1i^ zhIzQ~?Q0{dqVZ6AxEVj)?)X@RqJDvik(VUbzUj($!>@o{v*KFSL;Zk$X^Ch{YeD8k z)4WyjNp>^#o#iu2y?MuYH^uZz@2p~C3VmX{Fg^>l!4!|{Vc=kd$(?+|ZFd8vLej!w z94K=5#~DHPLK(B<=R_aRtq0X#Mt|x$K1K&hxzJxLTMjhVj`4o=#C~qM=&Rou`^msc zQt#lKFcpaTT&RSl&O2d61pJqQzQf|qJJF1Dzsma_K7jV^m?YPav&)_~WANIa!zImi z$}n-q)hK5N=aYx(!=TFzr2`7XwitOyi@w}-HmF6GF z%-bjFtIP0rY%xf+E4&&DU#e5@56HS&P^>Y0Z9($(64@8grZvI9{G>=%rIzkkR=3#Zci{0n?Tc7uF^1k1pLsv@C7gk!|z~WL(7W*A?&FJ^(0IEdJlL z2UG}hp?}2Xqeq;@Sn(2$cCYX7~hk$F{WE%On|>e-!jGo)KTQTrhFYK z(R9sJKDpn#ab?WetVK`@Xi5(vw&PiE`RM@v8mPrj2aHFYSJPC}*3j0_Ij^cNtEwt1 z&#Yp1HPFm2Hb`8~?1H+gnzpLue4Vr;^`bxPv^C`EWCrL(+pyeb{vev2wdPoXD+mIA9xLGOKzYnQ%{6oj zon&z27? zf{igkf0ED`e)x1HmGvg7k}4x_LBOE_--5>sInDIA{tl-J!$0) zXAz3?8dG+eXA4C!P?ep+fqK;AF$?)^PzP1{akk?;^nfr-fVzY;+!!mMX2_wj$xtOV z5}xNU4TzefLgYn3x2SAHA3{8TED^K*x}-85By28Zj+Yk&`k>gU5IIqX1!yfJ^;o`) zPIe4U*mv3jR8se@k2>i?6UP$AMx6D5BSarF7pMFas?1oT{02LeuwXLbur4$Dq(9e% zXCIp_n=7-Ah!slIHAN+=$jWbY=Mdru>zsiD(j+O=0#DEy|Ew*q~GH;Y8))>wt8lgvz=kGH*I}t2y_xq=(6-iObM-8Uw1m@HLMZE{HUT%371! z<^LuzE1Km%zGP~19+ibTbg9p3W{KeI)~wG#^V``i3&iK3VG#`7*^nO=0ZUDWw5}j~ zYV$S08=}Movl^$0hE-nD35qmW(o?1_c;o41Y|Fo#E2$JkTK~(n5aq>ddE)$qis^|8 z$76!UCO%KAgl1FGqIQO(++RAVJ!8f4KeT=rpwut7^gO~09TJs@u5zDE-mpjT+U2IF zCA^<~)(}j(E4jUTi#j{Dcgf0rF>@*t=6EjdmlMfCFEnT0-a33SUF*(4iDbxV$5XnqQq?OJk+Ed_Ndcuj>`jOxtI&vB^gB%ldJHzNrKe1Yp2j+ z&xzK||G*~4F0u-BU> zy_hbSjr4Vd=uggdx&@kW5k#Ak+IpqRJLb0q)*;^PG8>B0xxSE*(>gVkQKQ7m%5A>zPrn+9V0#a&RGi+?y`Q-f1@W zO}m}Z(kzUivIQgTY`E1!!x=QG5Hz+F$@dX@fJN8yQANI5<0H}+Fg zRO$SqL|Jio8W(@Fc-b_s6c%x@4D$)a<=u?j^SYo1=}C?J&D;ujrdV`*yV@Jvj)r+N z;E^M^8I|V)N~-LUY2YZn4-|uX`U1rwOtd>Y*|eTjG*uQ3EKLrjjN?zdz+p%cec&i1 z1B^Mf1h|`#72^+*c}+$0Ax;qxUY5m^!3$%cStC4nr~F^nKf1h1Qe!i&QgZW-SKi-o(qKBb8xv2IT}-Sw1?X0k>^0eAYUd+CivZ&jQ_biXBVi%e5>or06_^g~sLqiDS9= zvv@;^em^tT)3pcIkmA4@A4u`qae3W~gu)Y34Uu3m&UVc=@_dq z0cNZef<-3AceO*BX{FaMSD4!0HX3K{Gsb%>jBq*$4r2X!ebEMv6JZB~@LC?f# zwW}UtMq3E-F$Qr#XEZHj#WO9www4QjaY`6vTEbQg;xMx{gZx<8)^b{k2}5}a5q+1#tDXLTUMK*$&#W& z+r<8@yNym%4W6Vh7D-2rR2(CZ89|)B8{JfwR*kU*G0&?+y(OR0AF})fuhvxc_O+|; zoPf9aT779LsVCqmnB_18;cQ^yLIv>bahhwtygB8GXM`3t5iciZT32=7R+^8ZPu?*(D9+grcQwU z5nL6m|G&sY>90kz2UAK5|) z&@DPWiZT^^P?St-iTj4AXWwFAAY+W97=+SV?GxJ7b%u5dQxw-8U5{U0 z@$^A)^3he-9mO@^DUz;>rr%0e6k?BnpZvPIndPU-3?F{Y3U3o(C>}=uT#Pi_p}()j zkQfEeQWPg0d>CvUWmoAY#;pYi149>Ocd#7X(>S|()DR3BwJ*D4^Y1lO2O<6NLJ^yP6l$#bPf>#R)j|-@as_ z)mUb6{Xn`@+W8+9# zMsfbkU{Xp&fJIE;aX+ISniu8d-}COk?qANSpM;}iS=nN=)cx-*H1AT~CMVj{7gI;> zmu#tdkm@%bT+^w6?0~-wI2;J;H|*}Mx~4w}43zT%vd)BMku%cO>^hyfS#QEpPJ?(` z(z4RIn-m&t9m4>MY#%(JRT1D9fDc8j(}HhR=ZFJCjG?y2VR`_U)7i+f`~61Q&rNC< z-lc1~Ze!?9C;-BYwYE<9r}0YHFN`|OIjPGuxQ^ea3BKHaw?IbXRTE+Q-QjPeE2G$y zsF8QGxX_p={_S9AcrTh9S7 zd1IvaCVz6PEft;p?{VSxIN0AmdG@hXv|+bnq1sZ*x$zzvK!5-K<2?}hh%_eldllg- zqZ^_k4qMkX;&+yzgh;Xe(WpwiDIv`&?`OpTNU**|CsQc}J6qCpm0^{ax9$aGJabpf zN~vf9ohzj`6PJdqYhq92>z++3g&Ndg20-V6l*{~+5``3ZSB@U}M!l|~otvHoS?pBtBm zLQ9uUnB29^O!Jz& zc2W1O(QlaG-OY@mS0XSs|9x_5%ng4&+lT6dQ?8!Gw74dxVQ@0xIbS zhrX*@@{#|+r|jo!lme3pVysyH5{5zw!CVaUPyQ`3BR}}>6U5)NcD=4<0Mtq^L*Xfc zOp{q#!GhUG*|{58LP)lG&~-|udAWA!YbcB?62-2Fla3P8r)zX$KVsB}IACEP%5bjr zkSU7Bt}ult40#1T^*rF0n?nFhlpN@Mi=NG6#BkJatVYi^L3SGE0$O?_a~H}y;@xHpYSIv4n;*Y5%#}l4V?B2vOyk-7gb@G|x7c9{s-<9re) z5~vVKzg5)rcUm7g@iT9-Tj;fzmcL;LkXbsRM{18u)x6vqdg5--2`PO?khPp%xL!dM z0-93-plkbpEAHom8DxSt<=k>pSnG#jO?>=eo*4QPkmqNMYB-OOTvCBOW~GR;lkEGtLZGw54!P6p=1k2CjJ zczFJFO4Sq2n%})w;^3inp6-!3Gj%zdeTnpLWEVonQL$$7koIUuEvaC*9cAQ45wz#cMZOnW6 z=v@gjdPE#0#~2~Jk#=v7M(O993MHz+ZssP-jM)KKM!(lafx0+3ERBQ#(f=f93o z^LOz3BM0@G@WrkpyE{w&yBm&}+RM!DdD*#<_J`rc>pq`Ccnw&B5zZ_vZSG*f{9hdR B9Nz!{ -- GitLab