From 23a10c7a2bb8516c6fcbe164d5f8196789dabcdb Mon Sep 17 00:00:00 2001 From: Winston Chang Date: Wed, 24 Oct 2018 10:21:24 -0500 Subject: [PATCH] icon(): add fa4 and fa5 lib options --- R/bootstrap.R | 60 +++++++++++++++++++++++++++++++------- R/sysdata.rda | Bin 18957 -> 11634 bytes man/icon.Rd | 19 +++++++++--- tools/updateFontAwesome.R | 28 ++++++++++++------ 4 files changed, 84 insertions(+), 23 deletions(-) diff --git a/R/bootstrap.R b/R/bootstrap.R index 7adff9802..3fb8f29c0 100644 --- a/R/bootstrap.R +++ b/R/bootstrap.R @@ -1490,7 +1490,8 @@ downloadLink <- function(outputId, label="Download", class=NULL, ...) { #' #' @param name Name of icon. Icons are drawn from the #' \href{https://fontawesome.com/}{Font Awesome Free} (currently icons from -#' the v5.3.1 set are supported with the v4 naming convention) and +#' version \Sexpr[echo=TRUE,stage=build]{shiny:::fa_version} are supported, +#' along with backward compatibility for v4 icons) and #' \href{http://getbootstrap.com/components/#glyphicons}{Glyphicons} #' libraries. Note that the "fa-" and "glyphicon-" prefixes should not be used #' in icon names (i.e. the "fa-calendar" icon should be referred to as @@ -1498,7 +1499,13 @@ downloadLink <- function(outputId, label="Download", class=NULL, ...) { #' @param class Additional classes to customize the style of the icon (see the #' \href{http://fontawesome.io/examples/}{usage examples} for details on #' supported styles). -#' @param lib Icon library to use ("font-awesome" or "glyphicon") +#' @param lib Icon library to use. Can be "font-awesome" (the default), "fa5", +#' "fa4", or "glyphicon". If "font-awesome", that means to use the icon with +#' the given name from the current version of Font-Awesome +#' (\Sexpr[echo=TRUE,stage=build]{shiny:::fa_version}), and if it is not found +#' there, then use the icon from Font-Awesome 4. If "fa5", that means to use +#' Font-Awesome version 5 only; if "fa4", that means to use Font-Awesome +#' version 4 only. #' #' @return An icon element #' @@ -1508,8 +1515,11 @@ downloadLink <- function(outputId, label="Download", class=NULL, ...) { #' #' #' @examples -#' icon("calendar") # standard icon +#' icon("calendar") # Standard icon, from Font-Awesome 5 #' icon("calendar", "fa-3x") # 3x normal size +#' icon("calendar", lib = "fa4") # From Font-Awesome 4 +#' icon("battery") # This will use the "battery" icon from FA v4, +#' # because "battery" is not present in v5. #' icon("cog", lib = "glyphicon") # From glyphicon library #' #' # add an icon to a submit button @@ -1521,16 +1531,30 @@ downloadLink <- function(outputId, label="Download", class=NULL, ...) { #' tabPanel("Table", icon = icon("table")) #' ) #' @export -icon <- function(name, class = NULL, lib = c("font-awesome", "glyphicon")) { +icon <- function( + name, + class = NULL, + lib = c("font-awesome", "fa4", "fa5", "glyphicon") +) { lib <- match.arg(lib) + if (lib == "fa4") { + lib <- "font-awesome" + fa_ver <- "v4" + } else if (lib == "fa5") { + lib <- "font-awesome" + fa_ver <- "v5" + } else if (lib == "font-awesome") { + fa_ver <- "default" + } + # build the icon class (allow name to be null so that other functions # e.g. buildTabset can pass an explicit class value) iconClass <- "" if (!is.null(name)) { if (lib == "font-awesome") { - prefix_class <- find_fa_prefix(name) + prefix_class <- find_fa_prefix(name, fa_ver) prefix <- "fa" } else{ prefix_class <- "glyphicon" @@ -1566,11 +1590,27 @@ iconClass <- function(icon) { } # Returns the default Font-Awesome CSS prefix class to use for a given icon. -find_fa_prefix <- function(name) { - prefix <- fa_icons$default[fa_icons$name == name] - if (length(prefix == 1)) { - return(prefix) +find_fa_prefix <- function(name, fa_ver = c("default", "v5", "v4")) { + fa_ver <- match.arg(fa_ver) + + idx <- (fa_icons$name == name) + if (sum(idx) != 1) { + stop("Unknown icon name in Font-Awesome: ", name) } - stop("Unknown icon name in Font-Awesome ", fa_version, ": ", name) + if (fa_ver == "default") { + prefix <- fa_icons$default[idx] + } else if (fa_ver == "v5") { + prefix <- fa_icons$default_v5[idx] + } else if (fa_ver == "v4") { + prefix <- fa_icons$default_v4[idx] + } + + if (is.na(prefix)) { + # Will only get here for v4 or v5; there are no NA's in the `default` + # column. + stop("Unknown icon name in Font-Awesome (", fa_ver, "): ", name) + } + + prefix } diff --git a/R/sysdata.rda b/R/sysdata.rda index 473a610e5d49daa0ee2f7ccb5b859e2d67e920a5..7879148bba5cba092b1a656653121cc5dca26d1d 100644 GIT binary patch literal 11634 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[Jgkmqt^mt48|L( zzoX}XLw4{;LKMKS#XJ(i_exFF*xY<(X~w3f#-&4B=2`XZI`otW(Kp!@1@q)ZhMBQp zj*&@8N5K~G$Pa|hj^2+Hqk}W!8r~|S_-559nmqR8bcy3&lEZVu}Rcr31);n2H}hH?*j0>i`i&^rHgYRtRW7r z2Aj}#%Ucv*@V3=LE$eK#n<*N1`KCbOiIaygO29->CmX5j??dTfW)`uZhiSq*v}pt@ z=U=y*F6u;w?NWb;P+bxNF^w6cu|x8;%1Ls(plPwkm!5TWu(xWb zhR%k41q~0<{%Y;O;TLB*KL1=KDDK>t4HH`u)^8WQO%Cyf=GaM{pBJp0ga+{tA=9O! z5CE8-#R>oyj4sl3kA(2!_Y6H?jPHS=QA9=V_ps6JdM7%*l!2~*na0j;O!)qmdM@o^F^B@h3N$ZNK{0rl zbi($>)^9h))>k&T7(~W!6uRtC;v@>`I<|U7gY`ZNL&`*_x|RNjZQ5py^Z^y-;w|;j z7qt(EugBOK59(QOcCgU*=E|9vZyW<1m(VKzuUC?|?avR9tRk=?g$pCYDhu5dmahYC z5Xkx8Dl1( z%P#Uv11_~p3Uw%OPscBSGxa?X_8kQ%M27x}?c~H@X$rI9+eFf*x*tzsM`?a53eIaf339DFpu6&2Fqp3;uw8uXwzyT;^Es&VTw zifQ;v+=@w*QRZQyryMMzZNJ3=+Yf&M`;UJ(FW3MNF;SD9Up{U)tzr&g20!B5p76J5NhZFn#chK*crA97QT+HZGdmvCv)To=cGOS6nHMM03s|%cY7NziQjcyDZq%LS zDEoTG9>ulB$Pv4sedIh5fp%gR#0qBzR_ba3up_4V9}C*z2k)K`HBZdRAUyAUc4h$qI$j||$5CIc zvDpWJrU1T>CJEIIDt>EpBAM$d_4!R7oF&V~o3Kv|RiC!H22-5(fx#5W&p;h0VkJLw zm=$f}Y-@<)6jIGle0!;BR$LBHIa&ECP6jR^d-JP-vl2=PY%9V@K$hkjrp*R@-kirI z?`4FM75(upE7t*709ZdSIFV*D^4OLyP(i>+pIzLa%7{XKbG4CAm&}(^c?v8(G&7HG z<=U7X5MGoN^i%Ogkuc!lkdF*_;nhGdwaHvgO?06N9RA+n~ z<({xhpE`jZj(9+TM_LKw-|>1Rm^F1xC@n_`|3*$m?JUCDW-S3(4 zF_%R~S(23!DwcM12S+CA4iFgqWG_Ot^a!SJ8qvKq2AM5i%5Nsk-hVNfPy#u={0mdG^== z%Lh&BtL|hFFXbh$_aPlbodDoq74XcRKzUIv5w4?&%{~>Q39#0|^2ZG;jiE!7QM|ki zk(9wvC&SqJLqhnKJUWFpfk#Qt5o1lhu!Pq_2$pK@X^o3HK>*QK&;;KCUnIg8ETr*R z&_>L8rBGvw`2jjY=`iaoylqH@#V`P9g{}3yql4g|gVE60bCIVn__P4lU`?mvSc<0O z0Gs3h;wN0|A`-mM0hm5HePsPH*I)W|a6W6&lcYS<&Ay{C5DyH(k1rbFpRa+xUIYJf z4J`HyzH*Q&@@JmFRJnn(MdBOB&5twwN1k-`1C6WX0D8eHm==SC#r@Q?5%UHnDB815 z!hPwZ#0A8{8LJ$kQ0B5g&@avb;{3Ra)jmcIAFrQkhlgSkbC|`$|nXHL(0BV zx73887-Rm;&PhU_e3-#A-C|#>mC$xU^|An*!a~tZQo89sO+7liu>e+7Z{kVGf>!Pz1&dRC)r!u6O#ncZuAaGdoCaPN8^w-! z1}OXFx|Mx8z7WhDr}L|`G++nH6h()#RvE?j|IxB?pk4l9lFGYjhsF^owDk$0Vetf3hn^r@<)rrBp9HX7K) zo?wUnHI`pC5=KTZ_@0vD%1Yy(B-6mrHTdCCx(o@R7_?zE5*j7)7@h{C05>KvAtQp7 zL9A=DhLdfR)AaG%oTjBRA%O zX1Z}*JG-fEe4likVSEUn@`H^TpoAkY;aFy5o?$2A3w6YoQz2mYr=ZC2bW+D0F6H~R zzhryH+2;pB-#Cx7&eQlpn?pz12w3G1TWE8HE_Iz!frnh?XWM5HteJ6zZ>ge}`c?tu zjsu=su+SDzVv8F#Q*Q1;5?d%AGfHh-?v28{SBiC?pzj{+ z@J04~I6CMBoISkeygtJ!pgt;MTW3nf!1+c!t54>$FA_d-j7+Q?J%WdE^nQpk>;)Vy z%1|5VdOZy?Y{A!?j2 z7YsIDoRVU?2)rwKe<2_8B8;9~T)e=#(1&}b7dANaOPD6~t+Y)}@(aI@1!gwq$H6xg{G_?WilWX*o^!tg8D~zYfuN zP3K}A)<)lS;knQJYny&e)|-*XhTm zW8Sq7Z9WcbY(B#*(51aH!U43oFv#$QSI=cR< zWU_7!@#m)RHudhySQchQW)s~;OytFB|&96@XHqp&>^SG(* zs?s@CWwp^G<+{p$>twG=KQ_gA48Do%T$8uDHdN{DwsX3Q|2}fw_18qN-{NmfzMJ%K z-MBQ7x3PY0bj?SMeVbq1dh}lX+4lDya#=Sg#;CtZon8L%GTPSNM2EInH=5R8H@CZ# zeXFjj{I_(?wR}zZ=rX6;u0?&v#BL(R%hSh?N(c_ zl`*uOU90Cau0=!ry6U_(veUH8Cgom}2VQ<1eRm`6+PrK!pQ_5P%G0E*x?j~C7-K#( zY0FS!duyEfw6AI$yUu~O_1>!g)>>Vs4{zl!^U{XzuJ2#V-*lb0mA|PhjG?n{tx4s) zbz{(^eO=bmI^EW^oIbxQ-P?qhDxQX(_if9#wU)GP=NSE7RsYay*sb@vj9r}$ZnLhA z)u*>~aosy(kM$70ru?;O%PqaubRDQl`-nchHLrNuwf5KLYa{1XZ z>-w`z{yLtU%!j+ua~FR4$WfbL+j-GO_Ph3fmHb!r^{sKc*5;=5G#TTnez?Vd*I$z{ zyOv&6R$bb)d~M{l2|rEBt>dAtUDw{d*2cPgP2{bLhcYj1+JEcUWFA$`m#X@jlyi6Y zmcLv5S2Z8o%(W_>oAT3SjO)rO^U$QsI=QPWx5=+=zSZ?%({iiI?E3FoJyrEKnG3h% zxlZn{wXLqKYx&#Em0MU-xxe;Y#arFGP5QTrk85<@_*U`Slx zt7=bO+ivkwRY%+TaqWHn_gXt|&7UqZSoPkmcdwPvL=KzEch&e;^;eU!>e_ItKW~k9 zU7l-cReaR(*|yB8JWc4T_ixpItMBXjyNaJ%Wj7gvx_Qz?2Ack>d#`C*>-zNCyLD}< z8uvO`YAQc%+Fr*`(|)RIdsSI=co$y!jD6Gg-5Qs>yZSQ9?^KmrRZksnRpnkQ?^gL$ z{MNOn>R0z(RScf<(WTBIetp{7wXgnv`u!fquj{)_)`Y(NG}Q%T{F>;SG3%?V_dVpS zYHZ8ARMAys_2udJ{OdBu#`-lW`#ts9kabn*rdx8{rcau_GjtzzsjrDm*0%nx`tbKS zhnw2lL)${P)`U76zbaqTI{KvD`i)WUEg$70f4BULw)3ZpFH^_YXIhs&x~@L@dZ>Qv zGY8t_9lCG-8P}`uj`S$V4&Ta^{tf0Qy%Ez09-7L3%34=bi>8RoQ zw`v5tJW^TpPeaz!lc|=%(KxSB!#m7|DKHPKm757)`>PVXwb)oL;DG4>+ejE`p@B!7s+wDzMIwE zwStdXV!G(YAq08Q)_$1A>8G8B9_cQ9dP@Xba9bfY9j)^BbEk&x+CdG^ksCaohgRnv zbuYF5{BNP$J66_fdFszW7sIyy#2B!yPI_ddrSu(blmUI4aT?IrROo4!^|U@dEF{uJ zNA&If29u$&W*IM>1jiRN8W$4Y^c}H8S12xld$+ z4c!YJR*=q(Y|;7S&a3fM=SV%<-x2MoGY0hthtpdhIJw4%e+;QShushu&IGx!hJTLv z(62Q^4&�?5`lY^+-?s(0O_9FJpa8=GyhLn?=~$xa%E~?74q1&T>9%Y`(rT$6q4a zOv_dqAS2jc0|dK=TfJKhe%E+mM~kbc+8J=isyko3hP+FVuV>EDM6MPJ_c57J*B2a zMD)h!4jU@k-kEpuRld8sKUUU1eni`IG?ez~ zI!^sH%Fw(G*Vo;8Vi@WEOj0_|syxIz9m@uL&))yYwRijy+O8bKaWIYz)^FZ-nQ8B3 zOOCVZ52-`Ok%5oV3T^wU?>f`h4jw~?e4HE)!Q-%Nc)uAlq_x#fnueFc?wX}v&keT@ zce7kRpQkj`-;a^saU^Qom8ajF@7FiOjpoP6(|Bv*uq(tz*m+&`_;8~%j{Wq0T51d( z+;9AcwAqK(TtklcP!c~*`D4zFF?*=}xD2_LkH0STU315<3CHlHK0-@&n-N3J(;?^H zaBq&YhL0&rL(Hwd*38(t_5EkbN6zRWR^4H3xBi}OUwh*tWMnw~IOJS?ADQSs55~6L zy7c!L*1#~cX`KH32rV%5T%%kJ4M?X_~S7?)_Tuo^|${AH%K&LwOSY z+BUTHGqi3SU)siziI24pKVpu)r^oa0B@d~G$MOaG+680Si`{IpEVXTXR9q-4t>)*QZYxme}Dh^RYXI46iLW8_- z%6|vRH%b_|&-<+{?=>Y_YNO5?J$VG>1@D^p0}IA?x`ty zI=~%eXJ9k4`|RnjR{ICHZz=v>Bm9B!x6vQFbj@%Rvg?d`mnd52N?K2)u`Q%`HF5e* zo1SiHJ7v?`_~@(7h9A};R8%t!+R#sX2fJXDUAHcwmm$`|5yD~v$BCNgt9}M(PetF@ zHXg}K9Q1J%^RjJaoo3K*i_KUg(Z!$o1oqK5Jc=sl|h&O=&T8PE!%^J*>1J9 z*-F^OuIp*0^$hxTj=&GUI1e4)uIjw8Reqak*K*@vF#Bncknz~IYBxFW6%-vpkqorA z)0d|n!OV_E%O?=No<{s|i{D_AcIX|c&Zhc6)3YxlL-_4O$;kLF@KF4ZwV3rZYQ|ew zTg<5O_L>G>(LPk4k0Uh0iS^jtV;7fv`t+S;Vg&WoSyCED8f!*$=wJ+_PQJk7PdPLV?4wYF^$hZ{!G`n zD|;o*ALp*v*{Pr8(* z9)5RoGjsFsw@?1|P3Lc&d-v|$zqeQa)xGr>Fj4to($c>}MEettX2d z>|~&)sByX(66xtIp#pn4bc$Enj_0Xps#Q$EbLSH^b|<3-@`d>*^&Ed()ZpJaa~0{a z;}2q!x#Le$X9``0r41vMXn)FSYpzxU5}5^DXWxwi?NT=WRC%7JmVE#K30Ho>74l7>{-9KP~x#A;B3$kbXHM9I{FjuzBUNQ@)pB>GZuU8m57Mb&GL ze=(zahv6Vjf`|u50St5yQx;)JLjeg-iT9x}j+fW~cVN?r#xq$KAg>%ALQvGfc;-Y! z0$(^$6kK77gRzdrb^~1x6m9k8wLsZykFJGM3qHt#u4iWlh^!u20fBs{93|rHC#IQ23HLMI`4J(7#!^%LEOvBKzl|(E$y2r?1wgkJh(v2xjK^Ngi zPV6n4yuWjR7soh?2RJR24?%-?0Z;Rok^(By@dXt!Ud-nziFAS7cZ%ZHoy2pB7i&%u z%xOTTF7kZp2OyzCRXmP#h)kXmPvNCtq$z3-5h(OTe-y0rQair-NR0?&5>Oegn7!{g z)VS@DGrovJhj?5I0TFk9h{q0Pzc+Gxj_)gnS3e>=7>Wz+}Vi>+O&lq75Vx&H41wENY#BA#$F|wN@Jzk8NbB{EP z<_~I|P&V2R#<)&!U+XBDxy}MakPGo%GD^qL-NghZz^)MFmy84LQ~h+p-R;2uA0%2) z-Uy6TL?faJ1@~Q+KXP&q&H|sS=V{;N7lP@OUTEj!V8lSGk|3ZF*(HGD)JB2lisyu% z=OT`;#PgJ&1D<0j+_{P*!3+pOm_epo`&6!7 z`#@?RW$Q%Gc?_nD80MAZ(sUj>MXz_D4RCHGBtW*175gqpRlR~1`5X{7o~d!su}3ya zb>`S}?NiZ@Y?QeI;RUi!Na)e)hZeXbFKmJ9c^QpUhvHa5PliaLCqpc$D}yq= zWl4TkfRy~K09*1a1xd-T6tubwQu4C`EXmIbp%+>iOf*JI2G_*Fwt>YMfvzZ0zCRw* zXc`Z$X=6x00vVT7RABXqxHUP(0CkN64Ph^^kF;_+0BhSCsg1zfRJ)X z{0D&;l zRm!&`MZC5?0^~A+QF&cmD+gH<&&-wp||)~f@Cg@L3# z_5zC1G=vy5o{-XjV9CM|kiKJdD;^;jD|I zfHV{d9!cz4a#GjIk+~-6F-s3EZfpq5SqkX z_zYt~BnPC<(#b)|6bNCtFUMGX$!WV79fAXq7--OmS!F~eLnn?!+F``p3~K0)L1mgk zXRz*ts1I6^t1gvCTn-xCPaKwqfFEhmpGW~)q$LKrA>?TW&yq7hzocTWhmNm`%#RAo z-2f{XP&DuB}F$0EYmi5viP7@wIma#iP0zJ_* zWt&hf9~f>ikX@L~a=mCFATk0vaYn30)<6TEP#8S>Joy@~a+&|MUFGSq4ydO90Is}n ziLo_Z6<>tZ9fnM(N%vs37S(`9?Z9Lu16R+5PM(9D=3I~t({{Bp^Ve~dEkEYCyt8rf8nHnoUn;I2ZA)R65tgvqhlKQ9YY(7k`*Jl3b;7aq9yj>Stl^O zg0UhC;KKq;pq{}ra>5xW9sxVk%uJd_5N9FVkZDBS)^PPDYgTnvfBHl#oa@teiW`8? zG7{7U$-#TvZw-rYcQeXt-B9`f(e{NQ1`|-U*^~xJ_$<9c5&`IfMvR~uAS5gw9ax=g z(YVLRfEzWqs}|hZfXGwqg{1-blthmnP*;O6@D_}<+(?f`EPo#s zv@L=oj3NcdS)jh-@Y`H6m58rrfFGXHASpp_a#zq!L!hw(=CN z>||%@;I>>CYu-U%sF;`5b2N^ZEzJrA3Iv5qojbo2G z;3MeoJ}@#^yDvBe0g4nJ+W}T<|7Ka3cz2JDiCuUc;8fyG&Nf1p_zHj><^H7T%GSgg zD`Eca6!f52{T>oBhb2(?Y^Q!eAt2Gi63C`j3b3m6c!FzNj64!W%E8oO^WFXg4YQ@a zqn-glwUB#H6Q|%A%?ZdnY{BT}q!cAU(I8elQFGRcx)Uq{ME;;SGVhPI@LBeEMqAs# z2NGl3W`^QUoc*rZo1;N)FsWD(z!N%${3LRS$7BT?$Cp;5(h8830Y*6q=RHO!{ceth z0f`&gi+b+xWMicCqMnNv^JxBMz_Q09iIr3_6J*=xk0f@j>F2?v<`Ogv7FcZ(x)ZAw zKo9IL2xmdUU66HOsK-evY(|F}iW>wWsGwwLDZvy!4~VYqxn{{D8*?xNs~|DjnoDCr z@Zc^1r6#v509h?j+OcbCkW%7TEHZToC=J<9I^@L}5mr!fW_Th&4>*nvMc`cYOClzu zMs5*C+>Q{L+TsB|!}vp~Bn8Qx_Z%@`LZSiW7y%pLE#htlKo#hfLjg%^h=Gmh!v!F| z29UeF0sIC$!AkB=C9S1!z^dQZXC*jwB`;`hkUu zM*PwW0O>1`yVq?D&Ai-1o(2G|gv%aW+njqI6K*vCYX7 z+#om1Sa>2d5go-mR3efk>l2~dHVq+WS4MJYG@%8?LfoCCz7Kra;*gC=nv4PxY%_|v z&eZW>P0-^(q{4IrBdwSR6aXtVD;`Z;YC~cjt*H|a!jx)OpE{ScRP0Sh1%97J;Hjdb z)$y5h@~JB7(V3cUZjTjZKoVe@V#EDDseAx>K%9!Ig0=YT-?boQs@#u zWq~9DmXCWGH85(OcnPu4BlU?PVl58^WcU2O3@NgGEWwg|X(eU#Y?0Iz`f75+2VojH zb85TDanoEcaLBR+Xd=8lYd~L8rO~RWoS$atTYq8=g5@hFeBtx!P z+sW!90IW|qm<5skghpsml?;4|+nX!^V&jBDKB(iKJkPr*Whr8sdem<-djxc64zAY& zUy+a6Ljl>5J6TA?E@q9HGoQ0_2vB6mg_J>RgJCgZxza$hKstmxlvvhhMXOmMDXk<~ z!k+#lyygVN>$L%`eft6uJ9@nwl4kpMjdL&K) z7M<$|#WKej27wpy05L_4XY7{NC4f~LfYJ-?%(#>|5GH0kaZ=40NS_G_TTti(W}g^G zFq{_`G{g30u1m#qg=79qI&(FV5)MvC8rL=2d}2f{Z-~akbn9~DHw_^=3&|1lH^>8I zm>?9o!wklTm+9zKN-ehK>oXmOq@V!7ZH{V%V;Wu5Nuy&pEl)EPN){jkQTNtnEJ)U8 zLEvfXiXiewtN=kE+nXUU4uzSuSI|-kA&h5Cfy9eBOLX0HPVgpoAlEss%f;i z^hrvo&yu$2i-;W#4_crTnOORIY@$%}%*quAeTAu0WS3YwWBAY(eB)VM$VqK3lS$0Z>@7qy&g}r3bh#L0JdUWy)2GiXGLK2SpNIx2@tpQSqYZ zguKt#%_wPfY=XWiG(U(RClgXjGs=nh-LS1(Sl7 ze8$rgH5diy!Uod72E_W^F+l9FXJOl{d85=L??VDaMcLD?gU{BPh?>}aXyG$VS)UWj z=z->jDIi;~2ABs*9jNpp7cp|=22D-4R<-b1N(F}ICC-p3IjnfWI8(&T4hyBnQdc{3 z&SK-qBM-EW0UwBxK6IrZ=|fivvV7=DVeEq{0;FIoU@6!N*b;07&hobh)TNG@v-iAo zIz=n{Sa#)tl5gVLmBP z&*R8VlsWQ5ScWvsv%NWK)R0ApW{?ZAY925m*9_AXwA`lF|1CM7y~bc*$v#5x9kJ!GRlyQhek!r8P%J$LEad zbLFxX0f~^L+6Hcnkjb!>QG>Y%z0iqBhsF>Dsf69E=fF(GzRliTkslvC4n`iU!gU0S z_C7))3OwVMq!vn)YtC{t6xt6W(prFwKzJkeH`ilO$Yz>H2myE!S=k!FxxgPF%~J=6|4o1(jl}l*Pl|d4mPY~c%6)r zyInaV8>Kc6+>iXe&z@a%q!yeQ5CfsA955oXI27oWLsq;;C0OpRXF<}j_E11_odh@) z&Y3mg*V@2mHl4t*N${|Q5W@CzEL3sAJM!}Y8e6m&=yCEe7-X6H346suBB*@WMuYl1 zjfq`0eJ6}L49H7yXujqvIy}4&T=go5EFGW)#fie@Z|Ik5`lRWs<%OK=-oMs5i zUc!DyKu&l>gwovH%{o5>R!XaffY=IRKy*;&SdlZH!QdLOw%JBdI>kXrB4Gz zayo@YM@Su^FbF^qkcq39=T-p>LTWF9thyh;Y(p#c1f3mX7CP$o#57Y9I#*w^`%(tF z3TB${-Kfd^EqpHRVhM;1#0c64svsFUOj;BBW8Lc;W8EbiTmoWYI1F6jlvoP`K8}sg zB(Uy1WXk(@&p_8;}|^n^`0? zD)arHek$;v=4ta|C9!_0Cs>#?9Z!Y zh;=&Sr!=Cqw++)QYk{IB?7s=IT>grLu>lcxt4E66%^J8D%&a3)BeE7XBWN<{FG0#9 z`XDb2jO#C_vp4=|0$PELyT(elAQ{a@{FQ8=jJrMC71xO?gyi2i@ z6M>|uNQT&p=ukid-L08>2a#3%bBb_}aW!6@KbO81LSMva*(HxY^Gvn1Up0A^*4 zvtABaA4ZC#x(pend~!Wv_m3zpaj(6I&3chYp<@WkwO%gb2Zlh;^$|#JMLmx)^xEcf z9=o)=+>BCRp4p4iP>Jk;klF9W|4jQ4vEvTLY~M#RVQ-j5Y=o_%A7b8jhC1x&rDqqhwEmP92XejCpMUaSfS`xY$v0n`>_x^_VF2afd>HJk4vZGRw~=rR zJW~IW$waXM5^BM=wfKVF4v!2mFvrzKVq?1%Uo7Oemf)oYFUPUR!?I(D!Av-RN?E)a zqdOPP=yp!>F%SdD!Ca5$!YpJ6xv|pBkid>0_EaE3a3R|&BM0I`OR?{Sg7Y5~^gue^ z9TIAL%*B3iHSvVc0s-t^5eMTjeznFC9{{QYc)^?`z!OyR)Mzahs%vcgH$7061`eHs zJrpQ@+G-ihcHVsfvmrkNjiE@Sd?aC!w2h0cA&Ij|HACs`wxLCGIl$>;>7$(tR6_CQ z0}B@^lmf(7gcU$VY8sd~8;rlXv`Oy8Az4<;$GZkO51<4<`njNq)QCeZwtRu|eMx%a z;C?+0+2q&6jeI_2-i}dI5cZ*l?Yfn7W8om&DlzE8;)^0dAQ?&iru+`sfmuZcrL#jh zil6eBcziS!P~PCcO0;HvtLHQl81BOLayNvR3l*n)7 zWYlEfI+tW6>lGmGBvOAT&LZ2^;|hvRT0@kV$PAP2D3G5DuN}!TpuLv_C0C#^NrOkv zoYX@<^^~<)gDs?=!M=cadovcB*2cHW*0Tk~+7yCUjvR*K!;tOlqmXjp0dtimhj2grul>m!0;WIdKf@gq0=x2EmqNQ^XebbQ7 ztqI7kc{@%=nT||FNJsoV%2u3$I>{~$M+IH%+tB2vFH6+nk!=+*NWqa&^kWMu=PACS z*+eQ3f<}tRJz^e-rccEAvSxgxg@fh3AD7Kq#N!gr84J(6@LX=T5y$p#t!Wccng#RHU@<<+g;nm32-?*^oMB z=7A^s=2l1S3y40xXo3H{4E$yp_~&I{v1jl=f|8LR$pFF1EnF-Tk0fq?obexI(9#by zc9I$Jg@MqGx(10Y@h69DCt(6fBxvVQ36P4HVc)H%i;KuMsH zbI7f~W&%u%w{Gh4lZ`;|#yAur(t03FL``$ZlXeG=fW)urC=k1(%HB4(@cG&Y01rnD zJZT3^#1|5~K=|=gev$G}KvtKEuhg{-VKK%?ezUWd@FyP{@XV*!ySNfMF0dY|4nzpT z*@E+7zuSF74DethFHt#YZ};^IP?*hfEQHZXJ+sHon2p3J*c6a(Kq_`*_cN*_5`iXq zp<`rcWH`N_kX0^`d$&!bG&+Ax1mm@x{Q*arR$rq`q({LyDcVIvFMR|5G1z z51Nxr+?o&R8#@i_1nXWJkNDB0n()U2TKFt?mI~V90y&Bjm+z3lp<__#v(U{DOPCZ8 zYu6blDw>spKULK>wD>GU&j6E1E8+Zau>7!*vLb5#L&}UROHF=~%m8!ODvz|%Wrz>S zkPK^(z)Dft@C*ILkIU%^$zbX3!&BNqEn?rNn2r!lS7n8fWnHxsJy&&)yYt26(i#rSUrk^1FCP1PqL|m`fXuUTz!huzuS}&ur`v!a?6cWd|zaV4dVq9WO3q@xo_ZF-}E|k@ht%ddn3;u9VeIYuh zxd_sPzm?X@NqOM+pup_ve46Q5imh#KuEE=Fmj8aW;{PhYb!l#sPSv#6rTMGU-==uW z-rJ>2Hz`j!PSvu=I92+sobER5v+1{OKbPBnQ`}``{?(fB+ZcCM$I-H~tn160wCzpn zwJM!WV`Ei4)}>iBohs#AmG`E0y^Xf3Iv3Yr+whxR%6yagw{7^cv0mlfs(fcv+*NJ0 z3s0*uZ_DqjEAJ|NUAe0C^Rlw68~f|{W7R(2wGB6=Rb_6jYxgSrrCiP`^KM<=uPaNH zIk$=j+{U_4<+p1aR%w%U`EApm>+)Zh$F9FsV{+XblFwD&uQHETjnj3%s=RSi8LGsq z!v9v)cN33Y6{j3`QyEv4sVdK_QpaubFQ;8jrz*W|UaS7!ru^Hi6PvJg>96CdtIANN zkE(=KouB1$ZTqV-?#tm-%2Nfe`m55;o918@ezb1ATQ}#|<+}-AH^x@|s`A!tdBV2* zsQkRHEUU`4EdIJOtmC=c^lg=PUq^3S?@jTm)_K>lvZ;LQ@~slKP1?J>x31mSy|e0X zn>?!UiB<32lqXk7XIFl;ZF#mW%Qoq5^IOM%tMKM^^SCPSTE%l#rL_$oDd$!Gf8E$y z#UHEU(gt5;>?|8^>*}zIZ*M!NSC#)J<9yd&6~4Zye0N#yD($j}MYnH{U zQjT5b)V6EUP5b2U?YC@w*c89&{3xfps*S6Z;U?pH)x6%8XKyOorn)XmGoRX^@J2e!?3Q~sOQ>UI2ZQ~YvSwkh|n?=OpAb)DE0zv@`H3!c4cO)AG-*9TSV zx669Ej<;1!=O({ZythhOR+Z_t=l!;6Y+6gUt>;~|`>OnJdkx$4-Y$K&jt6hEuHIFf zZsNu3-nr|(zKvhi@@-R>O?<8DIQ?-2CmS^2>n>Jfl=56O! zmHgMW=Qi=zmAT4%xL11Kr93woN89|iofq4T{axFC)%ai4)|>imS)HrqQ>BkrwZo?J z@A|9KXUoD@rL`_>S-fq=YnAd;Nq1ct*41m-yUXghE?$-KwyF%}vTRfTO}{GhXw`gK zm0y)~?%lgyzD@17YCdi=*H)FeYI&;k@w&9iWvG(ox^cHI-73Fz^KD%lR!w(Rn!Elj z%V$--Rp!E`@w{%_FRRRQ&~3EbyMEkjQdUFV_DhOjk`_dT34@a=Ha^Zx2ba(uhO4Y>a}h>uX{(*_m;$4 z7k}6OST!!I#9x*Fs<2h{Sy#7BZ$Z zRsXMQuPSM+tHY-D+|=Le;w%eWRgQJ#+&0ZsajMX(-rtn}rnX<#-mA*9DeWqKux_60 zG6t&tt$VL(UDvhgvUk_jX;r_k8%tHk&o*^mSDvcvw5sl_(prb_QkI+aebxGH>X&=> z)~8W^XH~kZ@>y55Rp~BEZ&UiK%Db*UtA6X=TV;cn<=7?9+xXq2uDiC?|DS$;kNvmn zyH(bNo0g|4FSv_e6@GJ<`K`K|E~P-?{N-SmA7wO7TUBXtdsFq#jBdfO~N+)?jqey zI?B)a+oWG?JAZc3W!9DJm$WYZ+^8R~C|0cik zSpB!$7Wk{er+)4_d@i~8uExbLwOw!Hx2erOSKWWfh>bnO^cs`W+b?eEyO6 zfBDm&!s09UhsWkR8a?t<|K*rJ{10#%2Xu?mZ;!`6r8?I575upW(jNy=7(@1XhUAz#We}cEr-MiQRSNN5~PVq_+JFMZjA5#7V{&5(7?bCe}tz$R4KBxHnJzm1( zX$LPtRCHhZ{;`hw&+v+JCGN{S_NDgGWf*49muGe|P~HHaA=bs* z$DR)9qx|h-&r{J<)8#CUi9q@|l z{?H0|E1KZY3i*L9LCx+J6L*&6h}EEe`QEQq2Jv00kb1P}KNA;?X2@xzoJ8|w^MIy& z19$D%zo5IDU?}y6;{r#|C29E$xQGd9I6E%YtiBkz`-2iXwXD_bZ~v{`u{SIMh=QRu$mE z^=ykutopwgEUOB0xV#7*2Vr}#7{nSZ2C)Z=fnc!M`5%?49It56xc{PjnSHsn;{Lnh zUi^ryey{}O;lXGT}{UqRLpoWpDVoU^gs1qCGOY6OX>2OV{ton z?KlbOe(K}Y)qJDU10;j~6O~;Zig&q`8E={dz&|GXBQr+lQae7~chWcpGNF51FUmd?6{;`+@C(ign-Ui$%U1Pg{;utp9A3{qOk@m!8*(Z4E?=f*K zLyz&2;PtKE968ZAaOv`u6TVXlvWykpu+%@{YnBdA%;oK67~V@}8wdCLqCkFl2i>Co zRNPqEE5K*sw#owg=l}f83j8li@ju)6-U+R~wUOd(JyA2Uq8#L8e`wuOGg6*cszB!i zu>R0og;g3oC+d?1=6IS$#MkO4V*E8v^mrjI&OLegIv9OWW4aseMEk)Q`7`&9j*^+{ z03+v1&f6zC8KveL%u+W)fVdy5cEb1NefbQgZ~yp8#lc+lPw<-f{yE>5W`GkF(M^2K z6Hi{vxSx~#GjZWo{lw#opx}jII;9udIoUs9AXW0_$!kDu6wsA#2d|KS8Rl>j(4|ea zlVCpLXTD_+o~N7&-RgUUvQG=0?kMCkI!a zDVHOL7~Q+nf=8Kh9cYqsnkSK?J&)T@+=tmdiL{!Cdy*f#RxUEsemUUqBnlju^>NZa z$6Jv(wSX8O5Gh^Nws&%VN{=bsd3Ta(&s=V4SFi=5mIpEt^BkaKwcy51A?)6N$LIg! zh<2jk`_P_1qPLyhtnuXX<9+$eBT+-J<&jiaq7{K+B>D%?aO)> zU>6?yIcF?J8bYVyPSq9yLru#AlmbL(DdOaa5UIKuB88R*8I&+W;hGN5N9g{B)MQGO7<8Ot$q^pt!Uh`W&ZjlYbGdIyCCD9^5Xq_Qc7SZ zWa`_sIA4$$yd>~9PhcKI{{-)O>1av#<0m>E2bZ|QTnjt=_Vi>4{N-ySOd+x)^dXcZ z1P-$#WN7Yipl=OF=oIbIGJ7N&&yskunEJRCd} zVr=liDPEfiX*xzj;cmy+Y1tg~8^QE3*z};d%=j=vuXHl&zvjDa4+K0+%WBY<N`6^Bx@hR-eXZF=?;Gf2-zn$?f&V9L`X5I`%Z_ zmA}0n2gFg2IneJ`M(F>?m8CHG(85s;Jw5#sjVK{glqXN5jd2N+sB1$QuI14Kfq~awVb)X?Hm6|GEDvm=qF})20Q41(Hmt8TXz%eaEk&F)TTLdtUIMC(ylf5Y3zm(qh_Av@`W#5i8fF z_C&Mk3!nQ>zWEbnYUuyMX#n|*4a7MRq>+`t_r9IrkVbsR(C4#A*)h(q0#0%|l`XRm zfKFhTeLq%Yb9-2T=TOUF8ad&NbBKUzYGzqYBcYRo&^BZmQD-%t=u4qzJ<*>&Sw{Q4 zCvT1^YA}A0js$f<((m4rpsclbvlYVdq+&E8w4kaX(SHVt^N8$Wkg8xHkVFvmGwFjW zfRHd}bYN*)E(+J41ee^rOR5f8reLc@fA5&{jbUTN_io5{68WX1K+vG zJs2XP3MEES>q$Bvjd*o!=5w6tw{Sd~dYz|E~xwPd$ZF17GaT=KKCr52VwW%n1()vwbs9jvLsk1_MdS}FqS>v#_mqr) zU3l!{d78#we&UOmA|Ey>%LSBQ&s(dsj+i4t9469_1pTVN!#K_-J<{V6& zIjzI{6DLjvrHz)J0VhEuu)Swa!5f;-Kulq4gU|ztfRbhJnVR#4O?QHYP|@H6ZOqr6 zX;wi+YK->s{m=|6$qm`Q)sm35QI?hj>?77k0X}kwGqf^r_|A${V%8lPm&#j~X4gcA z(H5{V<>egr-B(6_ITw+88RTCEEC&2eVi}+PVOUbD3PZSPEuo=Wp({q-*^_6>!%L&< z4DIP5=!eO&Dm^e|J&VNlVcw%A09l2Tq)XPHWi4Z=)SY)A6)f*yP#oMUWycX#tT=6a zhUuw85jdx@sy+7UfWqK33nNX+ZEeDA{Q*7?fG0A%DDBsTr=b#(ck?-{S0QnO z)^i7yeX3>sxdXz`%K2~Sz4u%dCGI>od$t~%e*j59m^NF-`QUs09QUgu<&TR&{ZK%* z$Wnhk3wQ!fHO`;I1vAWhYME^O51*Db#+7Q|Lbv(gcpng1Ki^6YZ zaJEYnTM@pH5n^q>-FO~M0?{UcH<7asfWVEELmEVv04gj(=zb=qdoPDznIOfjh<4_Y z3c}Dep0+Q7Ag7X)ECa1hEna(%LOeM#J`ch)a*CmQ@H}$dG?$tka=`*LK}W*=SJ?A9 zEUa%e2)Lwrp^XXn>G{mz<`r1qs0;n`fb-IGXH2Z3C?zb3ehHMLXG!q?W`P-78KV0k zARrwV{qvh;(XOC?dHC;(cR2Wkf?+xkY5bbffVPFTyHt{Yd<$F(F=#(@et71gBLB)s zr!zL^b%%))4TedS(&ojNoaH%W8Kd*Ww?Q!$jznkx0zr}6KiFkh65}`TL7P|;{smP> zMkKBYlFW4EeZhrs5)3pkk*iS-e0+?nRKfU{Dr}Wqn@sixpCqkoRBdPq^Ro6~_AG z#)YC(kTVB8I!o^sVG8?eX;@a+vmozyv2$1o5gUh(>=3zccw`6Bw&8(+Ru!=O78bMR zL5IV!j^hBv@ban+!zHhlh6@Ig9{ECf#z#PcZ9~k^H>;#_KtOt-ooicIFF-*~NFwXK zH$C@HF{GOC;8|SIfZluYFF?Kz$gb0Ufs)Ds zL?Pl&wHeEh^%p_lX=?8v@<*%!K_Hu5TOhWC!t^LCI4_Ej(%>oZ{%|oz0k0@vko3<< zW`Rr++Qw=C@qwmf`vpj_QzLk+pMLukvHz4TJ_iiGaJYuKKa6TU!1>w)&CbM6Er~rgLy$)@h|%)%9*1y7?U;e@k>|vxnBn^&nJ#c z**z+S3IC9Pycky|-b-Vr2k73rLfKn3m&5;9NC7>jOMju@>4K;P}QAo`V98{zaH1v7OQ?mOq zK?;2nXm{sZ=hC5P_O}6R_uX%UVD34x*T47{#uJ+S za!<+kGnhwZVeb%2GBk#d{#W0UOY@f{*j^c1AL3`)byl#bEhPU+Mmdrm^4n?)$gzet245B3?m(jfW}I<`_%y)+;CEUAS&W^@XQI z^OX}B%`hi{BP3r>NQBNwyGMSvMD{$)k3w6z-wr!l5N2yn?Qw?3wmS8+0;90pZ$)&5HLAEVV1_%YRS6R|;96aGoUC@s*Y2hRgu{tTIttnCFE3m=#RCe)V!E!XW= zC}WBJLve2870CbBJu;U^5F+G1ER7%~$zLyxv83CUcVp)j#D1q^Ht+UcrPC>zxrKLV z&0A2Bny(?y=QAO&OfiQCg3sr*Upw0CpQPT!hC-N#xzEVqaU-FyxGV*OA15MQ%s5= zn+;?UY-LpcHTAV}FUSzK_nMp};5C&HvxC>Bj@%Y`qtYb89Sr7?4~aVmX_8wd?P3Z| zz0maqe})|AEJ#Bw{2+2>Oh)6B{lQ=BaTLH{qY*SmAQUG(1uCXkNI8a-k8(VtbP{y!snUI!zywIiw} z?37t(nNPp|{>k4cHFz&7uPz-#7qGgLQX-qN9CrBLxm;X_1wULKp_?Jn1NDn?HZrgU zP%2y*YsM>dl?4?>DV}stal(7kuY>p}GTcBVL1UArnjnJ|CMPimNCefAT#ctmmd3;* zn{S*jPOdST+8Y&+^8Fr^MYsP(C079nObwhky#I`bnGkIm<)!hBo{v28UwDJ%@ZF$4 z1mT8U5}R*e_5At+8On3A|Lu^H2i4EW5mc{y;}OMma{BVaf;;TJ8UELzkKVupH;2M$ zK=!^j2fr*S=pe^_@TUUZ|K9b33)J>}(5s7)WP!Gb*ZdyVm{VFBdf$6)c^~5b_r$|+ zaTe=Z1L>E=hDseMa_idvJ_I=rhg8h1{-xPA8G-^a#%)}vq&#k1|32ZU&F|AhXl4&W zST+9w@@#fQo|oJ983cG*=tXA^?#Rj`O}z|4&d2GW!4jE}>eK*o!mdtd(%Rh3Y+h%c zb4~tgo1n2r+;IO4r0nqwMp~bbd9_0Tr7sv{9to>Q>kPU^@c09u6KCS!lC5JprG=>C z6q1PDgzBM_k_rUX#W}Q8HQhUNuDFtTo`X_XV$<@BWH50~h`}~I!UDv*KurYR=)%;| zL2@aVJ+hJ;lTUXqqxx@CZ{-#Z#_<;*p^Y7v>#71gBLjmn5`~GzJajra$+{90Khkm~ z>7LD;5$?0F8`J|}?+RvM{~4(9O7M}RA^_{>M%)E*J?NfYTfcfaBqv{vy+gP1>pk`2 zY(+yHo@rojXBtPP(98w*UmoFr;lYf|biWai&(2Kz{#U>T{z&bor&Cx(*kD~hGb(@4 zn1)rWn5Rnt^v|fx2(s#b1ak`AGAHQq9J5SO56xUFrW6t=nCnX#u7?@;M8VWDUKIH% z5Q@Dh+?QHD3rvuG7N~aS(P2kOC1rNvm8FQT+@&gsx@UnoYe|U)wDdOcx&MNCHwZWq z>FupE-~y4u`=e)gx=*TMZR2$UO*Wy|BdYQ~K9{Y|y(K;8RXLp-7W*EHaxmOrJiZd+eY$Pnw)!e7&f z7Si_HeqQ0SfB|t_{^r12w8;?bs=rn2fYrbw#;?hz;jJ1euYU~EyEuv7dw}$%ql$mZ5p=iFz-VceUwC3+c?3(d* zI9%_)+<9w09V0!wv$eGtO-P_K^$27qI+$-Uw1T=q40Wvg4b^7m!{nwU^d*K*tK14;9+I{Q0RHe5bmfqsi z1dSMdNXfD1x<_eIIz0#eh#znu?lXKjJbz2`r8(3I@aT}sPHt`W;RSyj<)I<)YYlih zY9#iDTk*xh5ueq8*A}#rc82ByBJ$`=hSaJ4AG;CY=Ip^#xpq@g(pmo z{h`>7Sg}1*(lC~6Ks1N*KKh(aEFB2PHRIyxSDvICG@gd|$vTHzNOQE$$d>`S2}Sk~B);

Ah~vCGk;Hh66#=x+`W9VBuBr8#bDy`sYO6}hX8#6sP)lohYmHT zk?AVhfWQq<&=kEw*AOQg%{!L6!3NI-^FlD`KXER}@4HukxEV$rm^h1U>xv7mNMGm~ zqPz@cm~_6_2l+F+c96q>w)b#%h~GQ349k$7Hr`vWQ&##6w#c^IOHyDgHeQEj+jXhR zfk9Ues~mOtsXV#<3b-)@b&xjok>aN4BBhf4JFTv`l_L#n*(?gu=}f$(sdBCSV;w`0 zN`M8M5KDnn%n_1z+Go-02*5drls|-^Qwd)FP~w)J+>X;xraw|a($N(utF2)Q`WNrq z9~E@5MM3lT+9wCPLy#?_5SL)$j4?vx?94X>OYgq8=A+*knr;!Njhe$NEqwC!4T)U; zEC_hPUHHy4V7J5?0ENv|C`bZr4i}N;d0I~#@gLwHWNO-&F%ih=jnh1rcr&BQ zi`ioteT=S9Y+c>sWw!>8BvPLX{r4QCA`$Sh7zpii7=ngpQcM_yv`u3Oxr^I6SDq3Y z|3N`7wW#hx10W0PzgKz`a1s$TKgl{>Jp4D9Df!J016^sCN^+l`TFGnx%OJ#303e#@4ZVpimR3OVs`atEBN-q* zRQFiorH|f~!v3-{j6Qx>nj*;zrgWTrdu7Fza~_2@9-uJ*FuKM{;r?6;rMRAb^s49r zB+7hqdDgW=n4ZoxeIX=G~@FCJ&A+~tz96iYTG*xw1##F*`Cf9~m1-|Cs`@!`j+l+etAfBm6|~xc^F8ozBH~;krQh z@l<|{Pwekq55$+L=?<-!*F^E!IUkO1z%w8Dg|Sd2`)ee)hf8KH=`{|uNR2um z-BEMU-Y)7Dps?6Ce$Pw|4%J z;u0R@q%Dus&lh3v=c3tu;N#HsA71j7f9r?&2wSmO+z$#GU8vYD`GYx?qxtiN04y=X z3AFoz4|4!5aAa3J0x0{|b3gkwby3|MXBWpt>U-={gcLjI9LemKe4(iM1L$dCNcI%# z)Z*R`!;|ue`hkyL%c{i7+)EI(X8M6aj-i%;?~qd5F{s?b?qrT`4)u2mjsH_DJV+W$~K5|E`O z?MYb+sd2=H#|)A-mCm(x%&L4&0zppm$9vwYd2nfUOC6tMS&&$?+2b@GfXwDQGyDRF z?@FGw|3jkuSc5Vj^7o}$IY?s9I|q5g3TC|jP9gIwO}TeUxPBPI_7m!4m~bX)zSEBQ z{%PHus-+an5nJ2-{f@s8RLAF-2{Fa9WJ(Kao}6g)#ydT8Xnz6Tn#;`R<;<-JP!eJX z_um!XseA9<6i2lW-{DsGf=^zSi(@t%rJ`Lxui4z($sw^$<_PKGjd!VVgJ`~YJYgwm zSVy+n@1Zg?bnaNut&R6ejmXGfm*O7;i3RWAh2xu#`B~^8P#?A5|LVO$Gdr0B-UIPZ zF@9aVkhB;n9n5(@Q_35gZw!`9Fz;WyJ}va6+IvmsTf6V|g~rb*IQ{n=Opf_zPIB?f z-1wE0QksW(*lQ51=lYW>!`hedK@PuFu}}`185(nGd}Z&`bqpkrGzt}-!ioX(o*Ygd zXD3bK!pZwIV594!_jsi63@r@!sZhte{$=de`@ol54+nTI{mgvjQfQ7xh-TluG$u+e z^w|k4U&8DH$kW1MzNq@yvmm0cfH&Ub0aOyd{x*0^YG&vQv{yI>o4RD|2?I3qw2Jz4S_;aicn`Ymwv9n*4 z7;!iA;}`n4MI|baySqs9rpa$y5>}1%+b{p!_umcMau<>C#$BBIbpN6_=FW=j4Q0!_ukUTDUpuVpw_Lue40t#7{H7V)!jP^wIqzIZy)_~E zMk3zbu+v-A%x^j(b}QhWm=?BS@;6!hZ%t?WoD6fjCGPg7)*YA|w`%__SZ`Is+%`h! zZr0Q--rA)rZ>C(|{yUX<=w`-xqk&uHv9hUsM~U?&Ldnl>M7YDpEi|W_O_ZCicstCl zyAg)&K<>H4JU_=|y|t#?ea*ZXf8K5ZxOJgrtB&14BmBiE2D`0@JMPr&phZ_-OtxID zs`ljW6JQeyzgYr5m&SPeeh<6Nh3YE)?Fbg1VXeQJbb4c!yOkh+GnT$xUG7+#+QdS( zXpLLYfIh?HZ5a)#&%&(~qG@kpSa;?BDcj;f~ZO*Od#QFa%0d9zi2 ztGw^k?!)7+a;WY*bMraRBlv6PU=6{F{SS{(k(TF-_?|RZO`OzAO8K>;;Ogrl&wWh) szr#QO`mg`b|6VTGIKS5MNPr#JNt~}Ic(VXd|1bXie_=W41WjiF0J%)Ni~s-t diff --git a/man/icon.Rd b/man/icon.Rd index 6c1830871..214a0377b 100644 --- a/man/icon.Rd +++ b/man/icon.Rd @@ -4,12 +4,14 @@ \alias{icon} \title{Create an icon} \usage{ -icon(name, class = NULL, lib = c("font-awesome", "glyphicon")) +icon(name, class = NULL, lib = c("font-awesome", "fa4", "fa5", + "glyphicon")) } \arguments{ \item{name}{Name of icon. Icons are drawn from the \href{https://fontawesome.com/}{Font Awesome Free} (currently icons from -the v5.3.1 set are supported with the v4 naming convention) and +version \Sexpr[echo=TRUE,stage=build]{shiny:::fa_version} are supported, +along with backward compatibility for v4 icons) and \href{http://getbootstrap.com/components/#glyphicons}{Glyphicons} libraries. Note that the "fa-" and "glyphicon-" prefixes should not be used in icon names (i.e. the "fa-calendar" icon should be referred to as @@ -19,7 +21,13 @@ in icon names (i.e. the "fa-calendar" icon should be referred to as \href{http://fontawesome.io/examples/}{usage examples} for details on supported styles).} -\item{lib}{Icon library to use ("font-awesome" or "glyphicon")} +\item{lib}{Icon library to use. Can be "font-awesome" (the default), "fa5", +"fa4", or "glyphicon". If "font-awesome", that means to use the icon with +the given name from the current version of Font-Awesome +(\Sexpr[echo=TRUE,stage=build]{shiny:::fa_version}), and if it is not found +there, then use the icon from Font-Awesome 4. If "fa5", that means to use +Font-Awesome version 5 only; if "fa4", that means to use Font-Awesome +version 4 only.} } \value{ An icon element @@ -30,8 +38,11 @@ of a button, or as an icon for a \code{\link{tabPanel}} within a \code{\link{navbarPage}}. } \examples{ -icon("calendar") # standard icon +icon("calendar") # Standard icon, from Font-Awesome 5 icon("calendar", "fa-3x") # 3x normal size +icon("calendar", lib = "fa4") # From Font-Awesome 4 +icon("battery") # This will use the "battery" icon from FA v4, + # because "battery" is not present in v5. icon("cog", lib = "glyphicon") # From glyphicon library # add an icon to a submit button diff --git a/tools/updateFontAwesome.R b/tools/updateFontAwesome.R index 3a5f60313..d73252727 100644 --- a/tools/updateFontAwesome.R +++ b/tools/updateFontAwesome.R @@ -73,11 +73,6 @@ copy_files(source_dir, dest_dir, filenames) # v4-shims.css file will make "fa fa-calendar" (this is V4 syntax) display one # icon (which is very similar to the V4 version), and "fas fa-calendar" (V5 # syntax) display a different icon. -# -# In this version of Shiny, we decided to minimize visible changes for the same -# code. That means that if someone uses icon("calendar"), they will get "fa -# fa-calendar". In the future we may change it so that it defaults to "fas -# fa-calendar", which will result in the V5 icon. # Find the icons that existed in version 4. These icons will have the CSS class # "fa". @@ -113,17 +108,32 @@ fa_icons$fab[is.na(fa_icons$fab)] <- FALSE fa_icons$fas[is.na(fa_icons$fas)] <- FALSE fa_icons$far[is.na(fa_icons$far)] <- FALSE +# The default behavior is to try to provide the v5 icon (for a given name) if +# available, and if not, then provide the v4 icon. fa_icons$default <- - ifelse(fa_icons$fa, "fa", - ifelse(fa_icons$fab, "fab", - ifelse(fa_icons$fas, "fas", - ifelse(fa_icons$far, "far", + ifelse(fa_icons$fab, "fab", + ifelse(fa_icons$fas, "fas", + ifelse(fa_icons$far, "far", + ifelse(fa_icons$fa, "fa", NA_character_ ) ) ) ) +# If the user specifies v4, then only use the v4 icon. +fa_icons$default_v4 <- ifelse(fa_icons$fa, "fa", NA_character_) + +# If the user specifies v5, then only use the v5 icon. +fa_icons$default_v5 <- + ifelse(fa_icons$fab, "fab", + ifelse(fa_icons$fas, "fas", + ifelse(fa_icons$far, "far", + NA_character_ + ) + ) + ) + fa_version <- version message("Writing fa_icons and fa_version to R/sysdata.rda")