user-role-editor.php000064400000005042150212007360010453 0ustar00Please update!'; if ( !URE_Lib::check_version( PHP_VERSION, $ure_required_php_version, $exit_msg, __FILE__ ) ) { return; } // check WP version $ure_required_wp_version = '4.4'; $exit_msg = 'User Role Editor requires WordPress '. $ure_required_wp_version .' or newer. '. 'Please update!'; if ( !URE_Lib::check_version( get_bloginfo( 'version' ), $ure_required_wp_version, $exit_msg, __FILE__ ) ) { return; } require_once( URE_PLUGIN_DIR .'includes/loader.php' ); // Uninstall action register_uninstall_hook( URE_PLUGIN_FULL_PATH, array('User_Role_Editor', 'uninstall') ); $GLOBALS['user_role_editor'] = User_Role_Editor::get_instance(); readme.txt000064400000013504150212007360006541 0ustar00=== User Role Editor === Contributors: shinephp Tags: user, role, editor, security, access Requires at least: 4.4 Tested up to: 6.8 Stable tag: 4.64.5 Requires PHP: 7.3 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html User Role Editor WordPress plugin makes user roles and capabilities changing easy. Edit/add/delete WordPress user roles and capabilities. == Description == User Role Editor WordPress plugin allows you to change user roles and capabilities easy. Just turn on check boxes of capabilities you wish to add to the selected role and click "Update" button to save your changes. That's done. Add new roles and customize its capabilities according to your needs, from scratch of as a copy of other existing role. Unnecessary self-made role can be deleted if there are no users whom such role is assigned. Role assigned every new created user by default may be changed too. Capabilities could be assigned on per user basis. Multiple roles could be assigned to user simultaneously. You can add new capabilities and remove unnecessary capabilities which could be left from uninstalled plugins. Multi-site support is provided. Try it out on your free TasteWP [test site](https://demo.tastewp.com/user-role-editor). To read more about 'User Role Editor' visit [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/) at [shinephp.com](http://shinephp.com) Do you need more functionality with quality support in a real time? Do you wish to remove advertisements from User Role Editor pages? [Buy Pro version](https://www.role-editor.com). [User Role Editor Pro](https://www.role-editor.com) includes extra modules: Pro version is advertisement free. Premium support is included. == Installation == Installation procedure: 1. Deactivate plugin if you have the previous version installed. 2. Extract "user-role-editor.zip" archive content to the "/wp-content/plugins/user-role-editor" directory. 3. Activate "User Role Editor" plugin via 'Plugins' menu in WordPress admin menu. 4. Go to the "Users"-"User Role Editor" menu item and change your WordPress standard roles capabilities according to your needs. == Frequently Asked Questions == - Does it work with WordPress in multi-site environment? Yes, it works with WordPress multi-site. By default plugin works for every blog from your multi-site network as for locally installed blog. To update selected role globally for the Network you should turn on the "Apply to All Sites" checkbox. You should have superadmin privileges to use User Role Editor under WordPress multi-site. Pro version allows to manage roles of the whole network from the Netwok Admin. To read full FAQ section visit [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/#faq) at [shinephp.com](shinephp.com). == Screenshots == 1. screenshot-1.png User Role Editor main form 2. screenshot-2.png Add/Remove roles or capabilities 3. screenshot-3.png User Capabilities link 4. screenshot-4.png User Capabilities Editor 5. screenshot-5.png Bulk change role for users without roles 6. screenshot-6.png Assign multiple roles to the selected users To read more about 'User Role Editor' visit [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/) at [shinephp.com](shinephp.com). = Translations = If you wish to check available translations or help with plugin translation to your language visit this link https://translate.wordpress.org/projects/wp-plugins/user-role-editor/ == Changelog = = [4.64.5] 16.04.2025 = * Update: Marked as compatible with WordPress 6.8 * Update: Minor changes were applied to the CSS/JS loading code to minimize "Plugin Check" tool warnings. * Plugin headers were extended at role-editor.php and readme.txt files according to wordpress.org recommendations. = [4.64.4] 15.12.2024 = * Security Fix: Users - "Add Role", "Revoke Role" buttons: Cross-Site request forgery to privilege escalation was possible due to missed nonce validation. This issue was discovered and responsibly reported by vgo0. File changelog.txt contains the full list of changes. == Additional Documentation == You can find more information about "User Role Editor" plugin at [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/) I am ready to answer on your questions about plugin usage. Use [plugin page comments](http://www.shinephp.com/user-role-editor-wordpress-plugin/) for that. == Upgrade Notice == = [4.64.5] 16.04.2025 = * Update: Marked as compatible with WordPress 6.8 * Update: Minor changes were applied to the CSS/JS loading code to minimize "Plugin Check" tool warnings. css/multiple-select.min.css000064400000006670150212007360011745 0ustar00/** * multiple-select - Multiple select is a jQuery plugin to select multiple elements with checkboxes :). * * @version v1.5.2 * @homepage http://multiple-select.wenzhixin.net.cn * @author wenzhixin (http://wenzhixin.net.cn/) * @license MIT */ @charset "UTF-8";.ms-offscreen{clip:rect(0 0 0 0)!important;width:1px!important;height:1px!important;border:0!important;margin:0!important;padding:0!important;overflow:hidden!important;position:absolute!important;outline:0!important;left:auto!important;top:auto!important}.ms-parent{display:inline-block;position:relative;vertical-align:middle}.ms-choice{display:block;width:100%;height:26px;padding:0;overflow:hidden;cursor:pointer;border:1px solid #aaa;text-align:left;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-color:#fff}.ms-choice.disabled{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.ms-choice>span{position:absolute;top:0;left:0;right:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding-left:8px}.ms-choice>span.placeholder{color:#999}.ms-choice>div.icon-close{position:absolute;top:0;right:16px;height:100%;width:16px}.ms-choice>div.icon-close:before{content:'×';color:#888;font-weight:bold;position:absolute;top:50%;margin-top:-14px}.ms-choice>div.icon-close:hover:before{color:#333}.ms-choice>div.icon-caret{position:absolute;width:0;height:0;top:50%;right:8px;margin-top:-2px;border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px}.ms-choice>div.icon-caret.open{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.ms-drop{width:auto;min-width:100%;overflow:hidden;display:none;margin-top:-1px;padding:0;position:absolute;z-index:1000;background:#fff;color:#000;border:1px solid #aaa;border-radius:4px}.ms-drop.bottom{top:100%;box-shadow:0 4px 5px rgba(0,0,0,0.15)}.ms-drop.top{bottom:100%;box-shadow:0 -4px 5px rgba(0,0,0,0.15)}.ms-search{display:inline-block;margin:0;min-height:26px;padding:2px;position:relative;white-space:nowrap;width:100%;z-index:10000;box-sizing:border-box}.ms-search input{width:100%;height:auto!important;min-height:24px;padding:0 5px;margin:0;outline:0;font-family:sans-serif;border:1px solid #aaa;border-radius:5px;box-shadow:none}.ms-drop ul{overflow:auto;margin:0;padding:0}.ms-drop ul>li{list-style:none;display:list-item;background-image:none;position:static;padding:.25rem 8px}.ms-drop ul>li .disabled{font-weight:normal!important;opacity:.35;filter:Alpha(Opacity=35);cursor:default}.ms-drop ul>li.multiple{display:block;float:left}.ms-drop ul>li.group{clear:both}.ms-drop ul>li.multiple label{width:100%;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ms-drop ul>li label{position:relative;padding-left:1.25rem;margin-bottom:0;font-weight:normal;display:block;white-space:nowrap;cursor:pointer}.ms-drop ul>li label.optgroup{font-weight:bold}.ms-drop ul>li.hide-radio{padding:0}.ms-drop ul>li.hide-radio:focus,.ms-drop ul>li.hide-radio:hover{background-color:#f8f9fa}.ms-drop ul>li.hide-radio.selected{color:#fff;background-color:#007bff}.ms-drop ul>li.hide-radio label{margin-bottom:0;padding:5px 8px}.ms-drop ul>li.hide-radio input{display:none}.ms-drop ul>li.option-level-1 label{padding-left:28px}.ms-drop input[type="radio"],.ms-drop input[type="checkbox"]{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.ms-drop .ms-no-results{display:none}css/multiple-select.png000064400000006464150212007360011160 0ustar00PNG  IHDR((mgAMA|Q cHRMR@}y<s== <8Xȉ9yP:8p΍Lg kk Ѐ$t!0V87`ɀ2A. @JPA#h'@8 .: ``a!2D!UH 2 dA>P ECqB**Z:]B=h~L2  5pN:|ó@ QC !H,G6 H9R ]H/r Aw( Q(OTJCm@*QGQ-(j MF+ 6h/*t:].G7Зw7 Xa<1:L1s3bXyeb~19 vGĩp+5qy^ oó|= ?'Htv`Ba3BDxHxE$Չ"XAP44077&9$An0;T2421t.54ld+s;# V]=iY9FgM֚k&=%Ō:nc1gcbcfX.}lGv{c)LŖN퉛w/p+/<j$.$%&㒣OdxTԂԑ4i3|o~C:&S@L u[Uo3C3OfIgwdO|;W-wsz 17jl8c͉̈́3+{%lKWr[ $ llGmnacOkE&EEY׾2⫅;K,KhtiN=e²{^-_V^Oo§s]?TWީrjVQ=w}`嚢zԶiו8>k׍ E  [ly邟~_Y53rW򯎼^{7so}x>|쇊z>yz pHYs  ~tEXtSoftwarepaint.net 4.0.5e2eAIDATXG͗kQҡvssQ BA1=" :(tT\DlVDJ9sɽOIw8H_sN^ސ7cUUJOP *=A'Tza]Fcnaˠt.<_P7%]J CvIj+\Hټs)}]yN;ślk/vc |R r\̢ع *=A'TzJOP *=A'Up],YG*Jހ_ n}Kr_TDE>RGcqxI֑`E]+S]p ~kCҎL?5U( ?K!}bڑ`.HΫ I;2Q dA?8LҎLD%^2!81r߆7jT$KO :RQAbm:RQaV. HEI zQ)̯|0>IENDB`css/images/ui-icons_444444_256x240.png000064400000015520150212007360012675 0ustar00PNG  IHDREr@bKGDD< pHYsHHFk>mIDATx{leG}?gK$U!>TRu &H`oE*U.B RE*%B$EFdE)݈†>lB^PRU%9g^{}{=y~9Mn<.` cAb/@[VD03AX90N_B &>~> c;abDߎEQz'kMayԉ 6!:u::@RŤByDD'L-f]Sq!f SQ&S7MCr==3dJ{fZS0Ms:0K٦gʿ&HU=mc4i?UĔGU4hcQb]!hLW/  @pxh8~|AQf?ێ1f¸=uQGJHpPϠIw״m췥ԧ>2"WÓP&{nT:sfqH@.cI ~Ss+^|Bn29 dH]v-ˌ-meh>q&تg 9x#cn~!pxh84^/ o #Z@S^4 KZKPd9C@F[,a+]8vKqHlw9ק84KBץ|&#[\C`R!:F zC6)AT1wU.Iҗ!4ig3wE:q7n0uAmPy TK(5ͬlNæbTrwDV]te47 L[C0P&0++  @pxh84Y`OEZj,*-E)e{U, \uoV: `omKet_WOdW3Z Քrv|~^g`jycp*fb]M59.LNq+%ۯ0vccJEM5kk#I<x_ I#0Dw4xh84^/ ^c drDM{wQte{^`br./M:0գ*z`]|SB(e)h͎/Vܮ"aO!o ,u^Љ^=zt`WeCCM Qϱo0q%Uo?<@6HG/uAQ-_u||ִ*2lٍuG@ j !Br qL!*)h.V{3-!w$dP*/P[ t1l3hlyp0bgL} 3$%\/.)TwQ"uK7d+2! @pxh84'aY$mf6lB'.D Рx7SxtIe We}d0RW^ݢ0](U݋Tx|T|@v^Df׹Lb(2H0n8;_QO}D&3{YWw5*e˗?̖G :H iZӖ)/MP(:!/|B[i:Gf L`~:z$aa^ʭ|P- kbݞ<ەL&xJAABȼHvᑢ[ySəwNJuy %pw0_a"zx 3i1|= @%JWAm\ l>arV-PSוjA^&v&^WcqMz-&| ϜCʥxx}\ZW4Ig8YL1  aROQ.PU(>K&c.mO-M\8SY.'|5*܊B@֘A%Mo2:c[K93-tnNjBo2`*]9aZAq?Wկó)%0"_ϮqpyV!/hI.($]!rW+p P; 44E*0r"77`\*!s<@Zbn0͏me HEH]XSM~#a1&|VbYQE}e%ͦ@~NN>8o7*GBMR-U=-³K E+x p c\UWs5Wla?Lsf;2vy+o*m m-t8 W<,o̰8f=CH`⾿h)_}(%m'& ;(ݚ!{:^R@N ү"*<V敡5oh~q+`6IiI<%Z=^JE\`0]1DA^a0f(c %[Gxh84^/Ordh9M7L)-ӂ-?K(stբh-?:_XڧCr]8YB3|C| leXW_x!V8Ɗb8bQ7N4Jl!= D ?'a`^aq8:-YPx[o֝XQ"GִW} 1>cÚbYV 6=*ۿŻ)8hs/8'Ϳ,lEb\Ye.M6܈d9uJZĽj-l&8:s\Кty'hs[Gmh-mk2^SJe%u\j5 n|;଴δa[;Хˎp?|yRaC$_a/)NUNƍȄp~Ú/kn|J)/9Q:,K xR! B%]lq+|w ս_\GW)"3]aCJ%>|' _ƅDP*07³=VZEgV-L'@}2ƪ[P' rEm["vO# 5g$$?mƟ'zJ^SxHjg4D=4@F7# ъ~z'o To㩋b̓ddcBU%T9ҊD@.!+Nwuer>n-U$U`Iv%AQEd ;Ә:+a&XĎ y%k Gс "4pxh84^ @d6((Ԕ{C::[>H, ɴNVNhr.~NZb3+Q|,%t%n!作*7fg(m!f y"kI6Y/eZٳ+zg6W8ɦbQ%y8Ï2ŕ#b-tY͕8ynO{]!ټ*\ (p2.Hٙd.>Z(N &l2&k U&ף~.ו658A7}P:BlkU[8)j1$W !s\ QFn(qRK:'X@=$ x#|5:@]2Si.&W $` 8t3 =&[#ߥU3Wҳq .H{➇Z,ȣ"AH#珁W(+̱1Ɏ;8/<EE C+nU:|a ɔM|?LW1$~}W ,oVRl{7 ^;<,t[T"3SU9l˾H[yV&a@E&I?U7xG4c *i'xƨ" I3c1e\ӎe($ztnꅧHv.|mO9QFL&y Πg)5ޜlWv' 6zK,`]ǫ2@}Ϟ9=>4=O5͍sp 'UX⻹{J FalrF}c@`fQȎчxm܃ #<𶀆 @pd`.6Ip۞]A+"y Pns3oz7hzeDp'm&MwMh<Ǧ(I'G>W%QWVoHtMtjDU͕l n IwoO_5~YXw(Rm)'Dɸ5=@+~jy^`O`$!_U#!GB |V:ĵ>de=Ay<Շ*^_b T)}7 bPohhh~7rM/dFHGI>&Ql/L^b:גTDM9Q<*y =2~/?J,+%qqޗS?ܑ ^e]GSVpu^س~oBo l84^/  @!/ONGۮ2t]С8cݮ5z=7ˮg@/aE[y#3#z7L.| (cRcSmQ$6ץ{ Da{T_j84^/  @ñ`/_g "d`ɾ0 { Cj_9jDՋa~? dc[0*a,& 0&+ OB4!1~Ix>8c&G)jI=@5@v&J?QlÇ@Q?x^y 3%tEXtdate:create2020-10-09T20:20:16+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`css/images/ui-icons_555555_256x240.png000064400000015514150212007360012706 0ustar00PNG  IHDREr@bKGDUI pHYsHHFk>iIDATxleGu?wKֻI -Ti};T[-e$boE*Uh]@JD6_$)(j7 »QP zBTlU}n6ku}w+{}Μ;gL<=.` cAb;@zD03FX9:0N_B &>~> c;abD߈E.BH!6 Cu8tuI?!B *Oz.[aͲlB >h>M,4Ro 1zzf^ 4"Sj߱`沛u`M( ,7M { ƞi;~:)7qqF6g]$ױt pxh84^/  @ی2v،1c쩳nʾ~7 |wM~[O}f7@q?@# e.L3noF| Tel8iu{t`neӋOhmP&Lv5zވe]lMԧ7qX ] Wqw(BPpxh84^/ G8gJo}iA )s5~aJYTV1pTVP%تrO?ph *sKM,Gf -։Ckuu@FkmS0(b\/Chjgb)(; z-tVn R71%ݪ-`.i۠@/8PjY%؜Mźh[2 R h7Yo8j~10*Xt0Ua2^Ma%WW/  @pxh8ápihxѮB&=wwn-`r5YJǖ0V\)P>YD@k}Z@XxXY l]l;ul3e4ұp!bPdmgQO c:(); WA}(HWY\URP7Y,]`߬('u LdT˿sf) &)0(T}sLU4!V;Kjs Q:7ػ^{VJ {Ϸ_a*Ǫj.,TGy6 #v1f1i Dx4 ^/  @9l0٫\>Vo/]`Y`K,vL{|<<3Xߔ-ҮsS݂۹]=޴Rn֟6>0Mf{U*o0q%U dP"PX"]`C@f˫v: SE|Bd ZӪȰg7UABTM/V k*)h.V{3(lkl{IB%bj5pPAc*Lt5K|w 5Paļ~@mP @IK^[]REnWe@փ @pxh8OZòH ͖m2لNT]myA9wnI :Jm^NzuRtT}v/Ri&~Su "{=\2= ٿˬ#տɨl:yGA>7Cb ȚfJ_}t2ר/-_d3[FEWA"IӊRןm9|%\OC%lP=2kdz#[/\# /Wn2om+LєUy?>#E*3͔8>K>ap06D9@4 Ag6cl /  @ñ`"]iK{s D07ӕSzb!䬴[,'XI(cOmlm k#K#m~Pa&. )bmuLI fnQ! Lü#鷭mcȱDuBVVD`2GPkpAWNTPU(iJş6 ȗe\Նg=Nj6g t ޟ?[d>^Kߤ,An"hf h6T xXֵ$C a"D0jHMoTBfx^""#rl,ip7u, XFcDJM$"Ĺ}江Wo*B5V-U=-³ E+x`Z%y=s=a 3 ksN4lTBƸhf!NjHa?6B|^,/0rDF[5 !m` '$J~1ofDx;k 6(jPx)_4?Koq&[T:E9/J0D`RWg^V $Y|&yeᯈ9BR*ˆ ׄ/j&RE 21{a`7<* @px](Al=\ntÄҢ>)زoӄҿtZtG@ KtTnFKYfM~-L+K@a,*,OY` NKrw&}9$ߋFݑ[ @{z&f ͿӢ 49 q6ahx1ie^ bdM+@;z7m0:Oa<n-U8/U`^v%p wGJlyTAasS>ge?L^D_i\Sxu5_<tO0 PA𶀆 @p4O"qGA餦vGbQ przEss] 6&K_)ČZ/y!wr'!x!}E~7C~?Cn 1]C'I_2 ,J͞D\\Ig, 1*Q ǹx]~)LOk <"mkvsxb* PaBF+ߐQ!Fj4LqbSqfX֘e A5YkOد2?զ)[lSPҟ0K(JHAt&sUmo T&@oaqABf9bI7ge/P * uN0.p_{Hs|e:@-2Qi.&W $`8tf&mSz sߪ{t+ٸ9u_~qC~LWy\$;W)W]q0 `9!ٱbx=/p&z,jMZq-ѩ c Olsa=/NfxHrW XG5y 9,=yDng6-6yi(De3^o*DgrX}?'xN&b@iE < !i&[Ny`nen3Tgms[Il_D/IoYS4@osѶ _f`?Xqy.sYVm,G g3TG$ɨ(<#5ЌT?ljڦ1_PO ^Ԥ !Nzڱ^!4 tS/4=Ke͍3,rg 'U߫J Faq{i1 0 w ڸG <:Fx~?@m  @v@]]<ҟPj74"}u67s~WF$ Z.h~oxl⛈dIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2020-10-09T20:20:16+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`css/images/ui-icons_777777_256x240.png000064400000015527150212007360012726 0ustar00PNG  IHDREr@bKGDwdǭ pHYsHHFk>tIDATx{leG}?g l^CKd*M&6JRm붔MފRUd'Ѻ5@TʣB$EF"nDaWiSRI6Dyq^3s|s̙o~3g~3 >Go.4^dL21L$`l[~&+&щ@G`Vag'alNXb0t(P5RH&<ą-`r22)Kz,$[RpR su8r]aj#zTMS$\Oό3!ZPYo)D N#Yʦ2: )P}_US2L]a?szՙ/lljٛ<2ݎ:+g/  @pxh8z|aQf=ۊ1f¸;{ã)!)fB=&5]ӶߖfO}Ϭ(0oY03(Kdl1U+թLMz{D@>]D-omu ]ZV,ˌMmyhUzfi=@]S؊tTo6g%SB_qw)DPpxh84^/ _G8Ĺ{Ja bR(xhi@IzJҼy tsY@eeC뱅rjm܍C&[LM%m{e^3JM3@ӰX7mkA ".v2MuZfPy -!LUis_hxvv+3  @pxh84Y`>HԀEZn5{Dn{DY l]ysx-[LqmЭq `_XA*fLOtL17:0k SYB> /SA]CgݳX:p:L*YQNT\}="dLM 5-l} 0(TT|sLE4!;K~pm {˷aʜǢ.Jm.718(I : sdbSҞ^:S)!" @pxh84gW@~= &{K'jڻ ,#Vvh=L*}yLʼ=Ƌc6m^P?,LD1DV2S$_`U3 UfaQvFX"&!k֘D`:G㊐(qAOVPU j(iJlWqK li3 x T!sXD@s 9+y8u\mY"r7v֗u- v!H 4<@(B$"PdVZƜ wߠs0kB5h$]dpϪ_@0+4@"hOtckQi c%}TC5|jfJ򭼕da?L sf9[2Vq7; y6mNi  b-"?[fXhE!MLqRTDW*ZIhD$w{mÊ: ~fE㳔&GESdJ4ye]U/Vx06ȃ"XW Nj OFS gc>$C^xT @)>U.,-z)E}Zeg ttG@sKtTk$ZKyO~-Lk+@=2GXVX`3"SMlriߍR{wn''8SjoOI;tXa.0N7N. (O< ;vɤVyY5(aU_}h?Gx8񈦂XgMOz!V.qįi|LHL_F yUғ_J`B]L"tYeM܈d:uJZĵjmlC&8sךt﹅m6T469K) %HZߒ:.՚nz w> c^68#ͦ1mX֡C][5 : a2S-II\q#`pPe^b|~.?=-5OK?09Lx%8qIT d=\&'=n)X[8SDf‚<|'O!) 63Uag}osk;'Z9Z]HQ33uBn6BMf E-l2=)Hx V `Vj,&Jr0YeT]GxL뼪 ])is9NG^WiH6Ͻ `7"Hʬ)\ 1Rsv6Xe=Nc ` Td=az8M?UU^Wҟ<0WKHHAth֪q*SdI&FB8YbI7g=^D=;@qA,U`b]=oO˷1J1VR;@x՘2Ht!6ɽ\8\'S367tkl SPVأ~\N-(; mjksOfjcA=@9C'*B| eXBdR j oMs!F=zo*ikkf7빞끛Y^#i[.. e""ҿ~A~/#]@ R* XśsTG$ɨ(<#5ЌT?͉ym<[=(xZ}W#N awpQML`KqSFMRdSijg|۹I͡ Z}+c^ԄhE^UxG4c *IO&'5)1?sHf5[CP 2c+j]3eYgt,@+g-OJ`eLa1CYZn]3*~:g("褿[12n2kYL_|.My/y/ ({F$i=|KA,%}[қdFYg1iFUOQD>go]\zWbT=).xY"IUf8˂Z ,CHX|iz6)X0Ovث;J FalpF}b@`fQ={Ɂi <5Pŏ._px[@pxh82P~;GMtM-v@]ܠ.߰ >K94}6. /n:&"O'"'G>P%RWV~1KtMt1jDUlP%U |^ӿ]C` _i/{җVQdz16zfudO?P{f_?Azf_? o#j3URmUqmfh7sIb_.`8G.篘B5nJM47sIb4@4FXb)&PqFHGI>.Ql/LVb% ) .(?Vr 飸UUzX!e|Ul_6~yUY: )5WJ/?GpG~/_17lz DXǭpu}^kسAo Bo l84^/  @!OMG۶2t]ȡcݶ5z-o;3`c6FzAmǸm` cHIDATx]]%uzfV^;lY03&)]P 'M@+ȋa k`J!&~H2ք F?!0_&`>u޹?U_3sSu|U]:!D@t 8"t@M;ljH=&Omk3FB8F;@* cOy=kWڅە 3ANI*vP-ast $Hp As21E,ځ ԪGE'ihe]iSǼjvqPr /Y e-ڦt R5wgf I;&ImJmqkۦw4BsȠWM &_ /1n;z_$ 8H`# pDH 8|3h2oF)e>}Hl>LBV-}uҾo|ڵ/l| "o]}HSwǗAs!803@j~yӇ 4h >@")J_9]L;njq (pDH 8"G$@'MqXi}"03]AS(~ @@-$M6 W3'79+OqOh\O< `xTOHp/dg4 "GlՈf+)CO'u*c'TMKh^< uWhzHʇڸq풁| vAM1|B2 t3XbhW rsnZLwpO~8 pđ 8"G$@# pCR~O xDsM* |{oWC;]Հl5)^^ #šNv97> tm aϿ_ k{bW%p@ݖC>۩`ͤqǽ;~>iCZX^[HfalsX'0M _I~9'}~{.@62,hPU@U൓)UCH _\f.*@/gN*C-{g7H4ɼkor?_59]bU/_kp)m/qToLZ8D88"G$@#`ܘ*s> ʧ轎I{`>@1%,`35"G # pDH1{Hg[0 ˖\6%Hqx,Oaflxt! b[WX7wNyZ.ZuCTk qh_|kj~Q@n2=A6-kϺ"-RgZPv \͹8f/-Kp[΃:%,AL&S&D'Ms>A' FUf` JvQ8]6"?_޽C$n\Ba#¬#,5D3fq# p,'?'޷:0+n֚^vx] f 45b{=6v=NWxG8£K3kt͒] -F⛛./復Ou{~#qRyB+xۂJP1 !%3/` >\^dG/N-^ZvP#Y"ho \[LugHz~]()`+8PS~3OY((My~;HĻ}x 9 2SwG 9M\f/A1n~p SN<p-@o.-t>0-[\_g@6 nYNa .B|9>.N&hD[/3 oL59G0>*Z;"x}Œ.QٟJ| LQG5c̍ >Iէ-}{s=5}  _<Գ{ɂWZgԔ5~c|- 8"G$@X,WE Zm}p-oCCmȹA'[69~ ӎP#0*)uQDvi)FF4dAntÐ˞lO6;R,:ElPǔ K:Dۄt).kL9AOqrџWԧlJߢ\&;߈2AK9DiZyQ#5۬|{MHD#JD\8)ju9|1~=O=\Vn~'/PX(,u'0MPŃmq | J~yL1ާ{W/?o ]}uܙ F&*S\=u3~NzߤYq6DR_/MwElJCǯq!Lw]*ԐjΛ O]DCBɡB&@_fd]zva{!_nmSQnoMkn[qP3.)#{>oCz!U&6~߃JeتI]Ӻe9Qa.%sj=;x{DŽy:8"G$@ sɠ|6zCm79V ^Vzk}4*HAɿ6ZtF..2>Ot-fV;W_ٞ,O >Z|ya~萻B ki#@u"ڥ! *7! f3DckTɰCk.sPש;C<}Ra0L;7Lw5@6JCDV#NXFa곮8y>B %:dH Ar'@+2oH:͢ Ӻ]r8C`W;ErV۸ruEP;3*'JcIzkRl `OW*}Cc |NY+UOr1\LSZ5):aPlNw"Cهf9K`>3Jghe|7IqN[ʥ^c7Mq=M*3+1qKʯ3!KfŠ6|#y >_&lʶ&1_TjW`iHCڥټ ,Z7֟Ԫl;w*QwyFϜhc14R6i6h~ P6S]*r3pC۴NB;G~gj!|hϔ}vQ{z,pQGD{~9 )ߛzn&@T>51 偠0I˫\!\rrh3>]Y7PtӴDO[5nA ] alT2A_&\An4'':aOHc 0  w޺{Gg3/R1T0+ޔ0Rm柅`o*~ _g uFjǟ=sxpE)VU9vuZO=j<_>o5@HPGx#;I 0Q#zG$@# pDZK*6Aa\n6v[K(Ѯ0zLI/jnЮ|y.4qE صẄ́xjq {Y>.]!a[!i.d&~RJ4`&@Sۥ sy7wphq= lefy y_Eŵ^ըwXQ" tloޡs9eSR~ڥ|;i6\/$ʗʿx8_t+xp+ި$@'q_Ǔ.t-o\}]m&-t-o}dC>rFO|Ӗw8KCH7V'J M֝`\ W#|{B ̪$y4,}F>nk-PWEAtH=jiY'W;S'QOQL7DO=@w=KFR™?ЛΕN8#(p̯/ b,?Pw%tEXtdate:create2020-10-09T20:20:16+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`css/images/ui-icons_cc0000_256x240.png000064400000010705150212007360013013 0ustar00PNG  IHDRIJPLTErYtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>dIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2020-10-09T20:20:16+00:00%tEXtdate:modify2016-07-13T09:26:54+00:00͠tEXtSoftwareAdobe ImageReadyqe<IENDB`css/jquery-ui.min.css000064400000074033150212007360010565 0ustar00/*! jQuery UI - v1.12.1 - 2020-11-08 * http://jqueryui.com * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}css/index.php000064400000000034150212007360007145 0ustar00 */ .ms-offscreen { clip: rect(0 0 0 0) !important; width: 1px !important; height: 1px !important; border: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; position: absolute !important; outline: 0 !important; left: auto !important; top: auto !important; } .ms-parent { display: inline-block; position: relative; vertical-align: middle; } .ms-choice { display: block; width: 100%; height: 26px; padding: 0; overflow: hidden; cursor: pointer; border: 1px solid #aaa; text-align: left; white-space: nowrap; line-height: 26px; color: #444; text-decoration: none; border-radius: 4px; background-color: #fff; } .ms-choice.disabled { background-color: #f4f4f4; background-image: none; border: 1px solid #ddd; cursor: default; } .ms-choice > span { position: absolute; top: 0; left: 0; right: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; padding-left: 8px; } .ms-choice > span.placeholder { color: #999; } .ms-choice > div.icon-close { position: absolute; top: 0px; right: 16px; height: 100%; width: 16px; } .ms-choice > div.icon-close:before { content: '×'; color: #888; font-weight: bold; position: absolute; top: 50%; margin-top: -14px; } .ms-choice > div.icon-close:hover:before { color: #333; } .ms-choice > div.icon-caret { position: absolute; width: 0; height: 0; top: 50%; right: 8px; margin-top: -2px; border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; } .ms-choice > div.icon-caret.open { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .ms-drop { width: auto; min-width: 100%; overflow: hidden; display: none; margin-top: -1px; padding: 0; position: absolute; z-index: 1000; background: #fff; color: #000; border: 1px solid #aaa; border-radius: 4px; } .ms-drop.bottom { top: 100%; box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); } .ms-drop.top { bottom: 100%; box-shadow: 0 -4px 5px rgba(0, 0, 0, 0.15); } .ms-search { display: inline-block; margin: 0; min-height: 26px; padding: 2px; position: relative; white-space: nowrap; width: 100%; z-index: 10000; box-sizing: border-box; } .ms-search input { width: 100%; height: auto !important; min-height: 24px; padding: 0 5px; margin: 0; outline: 0; font-family: sans-serif; border: 1px solid #aaa; border-radius: 5px; box-shadow: none; } .ms-drop ul { overflow: auto; margin: 0; padding: 0; } .ms-drop ul > li { list-style: none; display: list-item; background-image: none; position: static; padding: .25rem 8px; } .ms-drop ul > li .disabled { font-weight: normal !important; opacity: .35; filter: Alpha(Opacity=35); cursor: default; } .ms-drop ul > li.multiple { display: block; float: left; } .ms-drop ul > li.group { clear: both; } .ms-drop ul > li.multiple label { width: 100%; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .ms-drop ul > li label { position: relative; padding-left: 1.25rem; margin-bottom: 0; font-weight: normal; display: block; white-space: nowrap; cursor: pointer; } .ms-drop ul > li label.optgroup { font-weight: bold; } .ms-drop ul > li.hide-radio { padding: 0; } .ms-drop ul > li.hide-radio:focus, .ms-drop ul > li.hide-radio:hover { background-color: #f8f9fa; } .ms-drop ul > li.hide-radio.selected { color: #fff; background-color: #007bff; } .ms-drop ul > li.hide-radio label { margin-bottom: 0; padding: 5px 8px; } .ms-drop ul > li.hide-radio input { display: none; } .ms-drop ul > li.option-level-1 label { padding-left: 28px; } .ms-drop input[type="radio"], .ms-drop input[type="checkbox"] { position: absolute; margin-top: .3rem; margin-left: -1.25rem; } .ms-drop .ms-no-results { display: none; } css/jquery-ui.css000064400000106235150212007360010003 0ustar00/*! jQuery UI - v1.12.1 - 2020-11-08 * http://jqueryui.com * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-draggable-handle { -ms-touch-action: none; touch-action: none; } /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; } .ui-helper-clearfix:after { clear: both; } .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); /* support: IE8 */ } .ui-front { z-index: 100; } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; pointer-events: none; } /* Icons ----------------------------------*/ .ui-icon { display: inline-block; vertical-align: middle; margin-top: -.25em; position: relative; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } .ui-widget-icon-block { left: 50%; margin-left: -8px; display: block; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .ui-resizable { position: relative; } .ui-resizable-handle { position: absolute; font-size: 0.1px; display: block; -ms-touch-action: none; touch-action: none; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px; } .ui-selectable { -ms-touch-action: none; touch-action: none; } .ui-selectable-helper { position: absolute; z-index: 100; border: 1px dotted black; } .ui-sortable-handle { -ms-touch-action: none; touch-action: none; } .ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin: 2px 0 0 0; padding: .5em .5em .5em .7em; font-size: 100%; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; } .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; } .ui-menu { list-style: none; padding: 0; margin: 0; display: block; outline: 0; } .ui-menu .ui-menu { position: absolute; } .ui-menu .ui-menu-item { margin: 0; cursor: pointer; /* support: IE10, see #8844 */ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); } .ui-menu .ui-menu-item-wrapper { position: relative; padding: 3px 1em 3px .4em; } .ui-menu .ui-menu-divider { margin: 5px 0; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { margin: -1px; } /* icon support */ .ui-menu-icons { position: relative; } .ui-menu-icons .ui-menu-item-wrapper { padding-left: 2em; } /* left-aligned */ .ui-menu .ui-icon { position: absolute; top: 0; bottom: 0; left: .2em; margin: auto 0; } /* right-aligned */ .ui-menu .ui-menu-icon { left: auto; right: 0; } .ui-button { padding: .4em 1em; display: inline-block; position: relative; line-height: normal; margin-right: .1em; cursor: pointer; vertical-align: middle; text-align: center; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Support: IE <= 11 */ overflow: visible; } .ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; } /* to make room for the icon, a width needs to be set here */ .ui-button-icon-only { width: 2em; box-sizing: border-box; text-indent: -9999px; white-space: nowrap; } /* no icon support for input elements */ input.ui-button.ui-button-icon-only { text-indent: 0; } /* button icon element(s) */ .ui-button-icon-only .ui-icon { position: absolute; top: 50%; left: 50%; margin-top: -8px; margin-left: -8px; } .ui-button.ui-icon-notext .ui-icon { padding: 0; width: 2.1em; height: 2.1em; text-indent: -9999px; white-space: nowrap; } input.ui-button.ui-icon-notext .ui-icon { width: auto; height: auto; text-indent: 0; white-space: normal; padding: .4em 1em; } /* workarounds */ /* Support: Firefox 5 - 40 */ input.ui-button::-moz-focus-inner, button.ui-button::-moz-focus-inner { border: 0; padding: 0; } .ui-controlgroup { vertical-align: middle; display: inline-block; } .ui-controlgroup > .ui-controlgroup-item { float: left; margin-left: 0; margin-right: 0; } .ui-controlgroup > .ui-controlgroup-item:focus, .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { z-index: 9999; } .ui-controlgroup-vertical > .ui-controlgroup-item { display: block; float: none; width: 100%; margin-top: 0; margin-bottom: 0; text-align: left; } .ui-controlgroup-vertical .ui-controlgroup-item { box-sizing: border-box; } .ui-controlgroup .ui-controlgroup-label { padding: .4em 1em; } .ui-controlgroup .ui-controlgroup-label span { font-size: 80%; } .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { border-left: none; } .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { border-top: none; } .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { border-right: none; } .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { border-bottom: none; } /* Spinner specific style fixes */ .ui-controlgroup-vertical .ui-spinner-input { /* Support: IE8 only, Android < 4.4 only */ width: 75%; width: calc( 100% - 2.4em ); } .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { border-top-style: solid; } .ui-checkboxradio-label .ui-icon-background { box-shadow: inset 1px 1px 1px #ccc; border-radius: .12em; border: none; } .ui-checkboxradio-radio-label .ui-icon-background { width: 16px; height: 16px; border-radius: 1em; overflow: visible; border: none; } .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { background-image: none; width: 8px; height: 8px; border-width: 4px; border-style: solid; } .ui-checkboxradio-disabled { pointer-events: none; } .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position: relative; padding: .2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position: absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left: 2px; } .ui-datepicker .ui-datepicker-next { right: 2px; } .ui-datepicker .ui-datepicker-prev-hover { left: 1px; } .ui-datepicker .ui-datepicker-next-hover { right: 1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size: 1em; margin: 1px 0; } .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 45%; } .ui-datepicker table { width: 100%; font-size: .9em; border-collapse: collapse; margin: 0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding: 0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width: auto; overflow: visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float: left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width: auto; } .ui-datepicker-multi .ui-datepicker-group { float: left; } .ui-datepicker-multi .ui-datepicker-group table { width: 95%; margin: 0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width: 50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width: 33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width: 25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width: 0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear: left; } .ui-datepicker-row-break { clear: both; width: 100%; font-size: 0; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear: right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, .ui-datepicker-rtl .ui-datepicker-group { float: right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0; border-left-width: 1px; } /* Icons */ .ui-datepicker .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; left: .5em; top: .3em; } .ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; outline: 0; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0; white-space: nowrap; width: 90%; overflow: hidden; text-overflow: ellipsis; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 20px; margin: -10px 0 0 0; padding: 1px; height: 20px; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin-top: .5em; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-n { height: 2px; top: 0; } .ui-dialog .ui-resizable-e { width: 2px; right: 0; } .ui-dialog .ui-resizable-s { height: 2px; bottom: 0; } .ui-dialog .ui-resizable-w { width: 2px; left: 0; } .ui-dialog .ui-resizable-se, .ui-dialog .ui-resizable-sw, .ui-dialog .ui-resizable-ne, .ui-dialog .ui-resizable-nw { width: 7px; height: 7px; } .ui-dialog .ui-resizable-se { right: 0; bottom: 0; } .ui-dialog .ui-resizable-sw { left: 0; bottom: 0; } .ui-dialog .ui-resizable-ne { right: 0; top: 0; } .ui-dialog .ui-resizable-nw { left: 0; top: 0; } .ui-draggable .ui-dialog-titlebar { cursor: move; } .ui-progressbar { height: 2em; text-align: left; overflow: hidden; } .ui-progressbar .ui-progressbar-value { margin: -1px; height: 100%; } .ui-progressbar .ui-progressbar-overlay { background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); height: 100%; filter: alpha(opacity=25); /* support: IE8 */ opacity: 0.25; } .ui-progressbar-indeterminate .ui-progressbar-value { background-image: none; } .ui-selectmenu-menu { padding: 0; margin: 0; position: absolute; top: 0; left: 0; display: none; } .ui-selectmenu-menu .ui-menu { overflow: auto; overflow-x: hidden; padding-bottom: 1px; } .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { font-size: 1em; font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; height: auto; border: 0; } .ui-selectmenu-open { display: block; } .ui-selectmenu-text { display: block; margin-right: 20px; overflow: hidden; text-overflow: ellipsis; } .ui-selectmenu-button.ui-button { text-align: left; white-space: nowrap; width: 14em; } .ui-selectmenu-icon.ui-icon { float: right; margin-top: 0; } .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; -ms-touch-action: none; touch-action: none; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } /* support: IE8 - See #6727 */ .ui-slider.ui-state-disabled .ui-slider-handle, .ui-slider.ui-state-disabled .ui-slider-range { filter: inherit; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; } .ui-spinner { position: relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } .ui-spinner-input { border: none; background: none; color: inherit; padding: .222em 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 2em; } .ui-spinner-button { width: 1.6em; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } /* more specificity required here to override default borders */ .ui-spinner a.ui-spinner-button { border-top-style: none; border-bottom-style: none; border-right-style: none; } .ui-spinner-up { top: 0; } .ui-spinner-down { bottom: 0; } .ui-tabs { position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ padding: .2em; } .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom-width: 0; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav .ui-tabs-anchor { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { cursor: text; } .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { cursor: pointer; } .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tooltip { padding: 8px; position: absolute; z-index: 9999; max-width: 300px; } body .ui-tooltip { border-width: 2px; } /* Component containers ----------------------------------*/ .ui-widget { font-family: Arial,Helvetica,sans-serif; font-size: 1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Arial,Helvetica,sans-serif; font-size: 1em; } .ui-widget.ui-widget-content { border: 1px solid #c5c5c5; } .ui-widget-content { border: 1px solid #dddddd; background: #ffffff; color: #333333; } .ui-widget-content a { color: #333333; } .ui-widget-header { border: 1px solid #dddddd; background: #e9e9e9; color: #333333; font-weight: bold; } .ui-widget-header a { color: #333333; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, /* We use html here because we need a greater specificity to make sure disabled works properly when clicked or hovered */ html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { border: 1px solid #c5c5c5; background: #f6f6f6; font-weight: normal; color: #454545; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited, a.ui-button, a:link.ui-button, a:visited.ui-button, .ui-button { color: #454545; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { border: 1px solid #cccccc; background: #ededed; font-weight: normal; color: #2b2b2b; } .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited, .ui-state-focus a, .ui-state-focus a:hover, .ui-state-focus a:link, .ui-state-focus a:visited, a.ui-button:hover, a.ui-button:focus { color: #2b2b2b; text-decoration: none; } .ui-visual-focus { box-shadow: 0 0 3px 1px rgb(94, 158, 214); } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { border: 1px solid #003eff; background: #007fff; font-weight: normal; color: #ffffff; } .ui-icon-background, .ui-state-active .ui-icon-background { border: #003eff; background-color: #ffffff; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #dad55e; background: #fffa90; color: #777620; } .ui-state-checked { border: 1px solid #dad55e; background: #fffa90; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { color: #777620; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #f1a899; background: #fddfdf; color: #5f3f3f; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #5f3f3f; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #5f3f3f; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); /* support: IE8 */ font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); /* support: IE8 */ background-image: none; } .ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; } .ui-icon, .ui-widget-content .ui-icon { background-image: url("images/ui-icons_444444_256x240.png"); } .ui-widget-header .ui-icon { background-image: url("images/ui-icons_444444_256x240.png"); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-button:hover .ui-icon, .ui-button:focus .ui-icon { background-image: url("images/ui-icons_555555_256x240.png"); } .ui-state-active .ui-icon, .ui-button:active .ui-icon { background-image: url("images/ui-icons_ffffff_256x240.png"); } .ui-state-highlight .ui-icon, .ui-button .ui-state-highlight.ui-icon { background-image: url("images/ui-icons_777620_256x240.png"); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { background-image: url("images/ui-icons_cc0000_256x240.png"); } .ui-button .ui-icon { background-image: url("images/ui-icons_777777_256x240.png"); } /* positioning */ .ui-icon-blank { background-position: 16px 16px; } .ui-icon-caret-1-n { background-position: 0 0; } .ui-icon-caret-1-ne { background-position: -16px 0; } .ui-icon-caret-1-e { background-position: -32px 0; } .ui-icon-caret-1-se { background-position: -48px 0; } .ui-icon-caret-1-s { background-position: -65px 0; } .ui-icon-caret-1-sw { background-position: -80px 0; } .ui-icon-caret-1-w { background-position: -96px 0; } .ui-icon-caret-1-nw { background-position: -112px 0; } .ui-icon-caret-2-n-s { background-position: -128px 0; } .ui-icon-caret-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -65px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -65px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 1px -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-on { background-position: -96px -144px; } .ui-icon-radio-off { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { border-top-left-radius: 3px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { border-top-right-radius: 3px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { border-bottom-left-radius: 3px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { border-bottom-right-radius: 3px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa; opacity: .3; filter: Alpha(Opacity=30); /* support: IE8 */ } .ui-widget-shadow { -webkit-box-shadow: 0px 0px 5px #666666; box-shadow: 0px 0px 5px #666666; } css/ure-admin.css000064400000010223150212007360007721 0ustar00/* Document : ure_admin Created on : 10.03.2010 Author : Vladimir Garagulya Description: User Role Editor plugin Admin Settings Page CSS */ /* Syntax recommendation http://www.w3.org/TR/REC-CSS2/ */ .txt_left { text-align: left; } .txt_center { text-align: center; } .txt_right { text-align: right; } .nowrap { white-space: nowrap; } img.input_radio { vertical-align: middle; } a.ure_rsb_link { padding:4px; display:block; padding-left:25px; background-repeat:no-repeat; background-position:5px 50%; text-decoration:none; border:none; } a.ure_rsb_link:hover { border-bottom-width:1px; } input.warning:hover, a.warning:hover { color: red; } #ure_container { display: table; width: 100%; } .ure-table { display: table; } .ure-table-cell { display: table-cell; margin: 0; padding: 0; vertical-align: top; } #ure-sidebar { width: 270px; padding-left: 20px; } .filtered, .hidden { display: none; } #user_role_editor { } #ure_form_controls { } #ure_role_selector { padding: 10px 0 0 10px; } #ure_user_caps_header { padding: 10px 0 0 10px; font-size: 16px; } #ure_user_caps_title { font-weight: bold; } #ure_role_select_label { font-size: 16px; font-weight: bold; } .ure-caps-option { padding-left: 20px; } #ure_caps_container { width: 100%; } #ure_toolbar { margin-top: 10px; border: 1px solid #dfdfdf; -webkit-box-shadow: inset 0 1px 0 #fff; box-shadow: inset 0 1px 0 #fff; -webkit-border-radius: 3px; border-radius: 3px; background: #f5f5f5; padding: 5px; } .ure_toolbar_button { width: 100%; margin-bottom: 3px; } #ure_update { width: 100%; margin-top: 10px; margin-bottom: 10px; } #ure_service_tools { margin-top: 10px; } .ure-modal-dialog { display: none; padding: 10px; } .ure-label { clear: left; float: left; display: block; width: 150px; } .ure-input { float: left; display: inline; width: 200px; margin-bottom: 5px; } #ure_user_roles { vertical-align: text-top; padding-right: 10px; padding-top: 5px; font-size: 1.1em; border-top: 1px solid #cccccc; border-right: 1px solid #cccccc; min-width: 200px; width: 20%; } .ure-user-role-section-title { margin-top: 5px; margin-bottom: 5px; font-weight: bold; } /* Multipe select */ .countLabel { color:Gray; font-style:italic; } .storageBox { display:none; } .copiedOption { background-color:Yellow; } .ure-caps-cell { vertical-align:top; padding-top: 5px; } .ure-cap-div { white-space: nowrap; } #other_default_roles { display: block; margin: 10px; } .ure-dialog { display: none; } #ure_admin_menu_access_table td { cursor: pointer; } #ure_admin_menu_access_table tr:hover { background-color: #04a4cc; color: #ffffff; } .ure_table_row_selected { background-color: #04a4cc; color: #ffffff; } #ure_caps_groups_td { padding:0 10px 0 10px; min-width:25%; border-right: 1px solid #cccccc; } #ure_caps_td { width:60%; padding-left: 10px; } #ure_toolbar_td { width: 15%; min-width:200px; padding-left: 10px; } #ure_editor_options { margin-bottom: 10px; } #ure_caps_groups_title { min-width: 250px; vertical-align:middle; border-bottom: 1px solid #cccccc; border-right: 1px solid #cccccc; } #ure_caps_select { vertical-align:middle; border-bottom: 1px solid #cccccc; padding: 5px 5px 5px 10px; } #ure_toolbar_title { border-bottom: 1px solid #cccccc; } #ure_caps_groups_list .ui-selecting { background: #DDDDDD; } #ure_caps_groups_list .ui-selected { background: #CCCCCC; color: #444444; } #ure_caps_groups_list li { min-height: 20px; line-height: 20px; cursor: pointer; } .plugins { color: #444444; } #ure_caps_list_container { float: left; width: 100%; overflow: auto; min-height: 600px; max-height: 720px; } #ure_caps_list { -moz-column-count: 1; -webkit-column-count: 1; column-count: 1; column-width: auto; display: inline-block; min-width: 100%; margin-top: 5px; }screenshot-2.png000064400000133452150212007360007572 0ustar00PNG  IHDR^_=PLTE        #  "*/$  6--0 :8+$!)$$&+ 05*2/7$0% - *6%'4#< +.(@=! ,@8"$'$(<7#;#&'1.&&)91=+31' &*, 1H?)/B7+5.0C+ A, 8H,2%5GD-> 6D'4D?@A3 !? H3@'A/@46AB;F5=6.08A%;IB6((;D>D>K+@59;9:85@E<GE<>;&F/ ELJF/3JNEFDLH!AGNKH(;IN?ID9KJ\?]CGZ_@PUDFMH7QBmGIFAKFAHhHK:`CDDLBIJHMJ=KJCALMWFIGKMEMIYI;JLJ69IMPNME14mDGLNKTMA*/@CaJHCMzIED=DYl7Y7>{"~6q+7{p>*Q3kJ^I$UǫߙsT}a ^I$Rv5(*g]EN^a/|P_2Qq\ڮty+SvZsWeIDc9mn.DY+ra}uEi ]kIJ3ӝ M˔0^6>ۉW6O휘jl4VKH$R5_ vs<~{_΁w{r ]|!* v݆jTW@vDc9-H$R՗{@QݹWcw+cVxWw3g0W)hzr5* HlkHU ] @s¤^zSy>N٪;-ײ!wĂ5ќH,&l9s|Xƫixz.#0^_y4^#]1D"2傅[l+4揍Wv׋y ri+Dښxu U1 m. H55ՊWx귏9# ^R=[[ѿ.0UV1+D`8y.:& Jx W}V.cQv̪dWf«$)x-/j}QZz*nkLb}`:c]U+vpACW9K:og-GaEgLdcWx{* B?`ljBTXbʻh߱~\{t~XX3`Kf`hJ"2$D"H$D"$D"H$D"$D"H$D"$D"H$RZuD"Hh>f$DzaM?%H$D"$Dx5)D"6O $Dx%H$+D"^ $Dx%H$+D"^ 1)qB"^׏ק5Ex%^ +$+u#x%+N>5 oMĵ\T^Jx%WTd5`iAY emT/z jz#V\ydv~9zvRi-t^ $Rj* yWd~[fSsj+2@\ +#gU.ё$Ҫx b1:^=!r( N*IƫxsƫY]Jx%b㶂+kQP0f T:y ֫JkoEEk arѐz6 @*+GRj,]XE=@*ԆީR?chK՛\|?hA/WW8^ܟ~[#^-yV@Sߞ:?]>=:DJ ^*Sㄼ/lr^UzGA &*[LZ}SYU_C0fGuLI&k.=a6y^-0[ZkE&+,Zm+J*-EcjVT]5M\6YzlD @Fī^G|E ӍO+ک)v$3zOm4-V$R&!#wZ]:p"1>p _ ؊ qY)LkU^^'//jݓZ-( xd!\Ox凊z[ @v3y$NBW^@kGJZ(z8c,hGv2xck]%K$^DWWiYZT6uE~h`k uErpZ|΋.'_Uu7u@Yk%AJ :55HlE26/"j6[आMWgc^%ly|۵E ^+d7v;'jQWxO]*509ɾu 8 T]nE_~^a*sNd٧sa(ȳPMW&BDY@+^o 𺦩PUuIx xkDJ1k-vNW1-uR fr^LoX{55(ƶd5 nm9Wī'oᤢ ܹX^v1gUըӊ/Fa]y"*clrOAN KIک5`Zv|H=0<߻S{"Ah` ]I}l+7\w>CW)N•}ݻwTE0qWmU;Qz52)dWRňׅ#@_NQATkU6dMg0ZPk(kZ^H+yqxjv Ocq h60zR^d.W>䔃5E x%Q0U(o ذ+MZnB:$W+vlw n9jr]?t^Wx0^U\{J &5: xo{8Bk]QoXfty'@i}--൨a[^ގs cM'b#b,r>4WW99rRU \4ؓZL/J:'/rSڪd"XDJx%*`ѢzwqU3P'ʾ $Y5W bѶZP45s$~u΀WxSW)"y -0kاjhKM@zfºF/tvY⥆q[1^Q=l 6%:Gp WA+zRNr_Ú>WՅ+ԀW9o"B:Dx%⯽6pi{yZIzρE}:^Ž2ŗ[6$^Ym pq@Nj䭭jTp"W|/^b[ULiW[z7DJ"e*^'KϮ?lO(9U慧*D@i-KcmrRb55 wrAgu|4^6eDr2񊼼W $5R]M捐r8%sW|MЯH$2kVL_ƪ8*|W2 -D"mogЖ{ݛ H״kph=o] k~C H״+J"^ WJx%H+`-^I$FJCtWD"H$D"WD"H$D"WD"H$D"WD"H$D":,D<>V+ED"m^^)$ijɿJ HWT4P6?jXk}ukmL_3ލ;n𝯵:v H :(&ZO'6Zh|2jAm w67RAfWx$uoRk3 %H_0pp.8'|2Zcj;hqyRŽX xz+8 DJ%Hi@^\0lh\0i.L`^o6[K^&lfs/8,*BafK`kUlvk nM[+P 'P`Eѹ"^[kVw2%y߆1&O,SE1I^qr1ckx@L$^Ida&#"@UwR|>ѳ<9__Q(R *V[m)UVJBt[X'2aFG9doe^{X@W@N\1Xk@uYs@޿_8wԫ#6"īhhtrR%a_*֧ls7.x[`xل7^$9&H$RZ^$D[T H$H$D"HWD"H$D"HWD"fRH$+J"WDx%H$+J"ס(QpH$+is4BIkG`Pm$^q˒קIPVu'x/'k2Ʒ n$^o#K5Dx%^ $+)͋Ikfv Rc)ћXkһG$'PKWR:~\5pTs4 b+Bx%% QYo5n,ou ku8*کkxdC"Qa.Bڼ^xhJJ^[0)QfsA٢c JNxf!Vsyotk%|][pN ZOumIuWl^+7.ZE'TpfxaU3ᕔmxqVJ"{2<X,oT5[ĸ91xEtl|\Kv1=_&+ TDxR< +A-b]_EfE.^xW1xEQJ3pYA[<f3q l @gy{WO],`3[0g#mWRR.ǴХTxElmt^.s$\+\YMWX (WtMg%{_yEz51h1[[*{nAJJLpN9N5IJlaqfl dqO"#uVF 9vl2?C(݌І.\xd.ƃc1/}N«l)Sǫī'Zdk\bγKuE|qL/\?dd,WRB,f3O~لooᵨi.# @` "T?,xPۘ8U^{(uaO:y+ fkkU+d>Z+V}\#]'F\UWױ S5?͖xv{WmH)!4{<ծx&*rs[.xFUIX,JJ ^!}j٫k^M ]CWdwb KM|2གWR['[  ^g )]ƕWYBN+vhN}X#/V̝[ W#xk+t4p Wd˲WU?AJS?ocՀWh[xd-S:^ݥKoT|:"J|.z/+|Mة0{u K~9$9bn*g ͚,+4(s [*-W"!8"{0Q}xEPȉ{?=]+2W;fMVX^Uf0NB .E[פk>Cxl z/_$*{.OiB~jg28k' x]E 7jЅ*nYWQC5QZW[+"T;Bx姇 ܤ'Vq20 J♄' kI"%kv%9$䂆J"n%&v@BqJz!' IDATMFp($c'<Dx% R^IW+J"WxM6$u+5) nJx%yD"^I$J"$+D"^I$J"$+D,%H$Rܢ앲WD+D"$Jx%HW+D"Vkm2D"6 V+EaKJJ^m]Rr5<$R` 0cS[( WR~z]eQLJ "0^[_Y@z]i W^xqUwJx%f^ǀ+$,GچvNOӞ{Jre…FFadf }cB`dw:nuN߮᫰um/߁WoŊa칄WkT}gij ;ɍiץ]8z&XU C.CNᑽ\c~{^b#9̷+ R]c߆`jyI[FL64jN$^{˄t2~1\6jsU|@#0DO@PaQ R}CuَT5E}m^o1\yy+5+`~ed U׋?1n߶)TmV}ڑӪv!yiwFs%/sǻ@pD9xqO0} {sq'U15o ;g:F(+Tvu.mgWo-ۯf[t^ WJ =?PR)y.2{}Ss[*CnxsY4^wA))QT Qmս@YyY/6#H{+rv k67n;VRJg_ߕM4(L(`  ?}2Wy|(^c- .\&nJx%n^ٴ1o WQy 5 p- .gwZbhvtvvvsb*20 ׵l?.i2EL\S~ܶL 0˵@cmwTmQ(V+W6ǎ‰^`3A3/k7 G  ^r^Q7k[[Ogn&^{zEu.xZrO*+Y}"ׅWHܢ%ţfȂ3|ژ ČvF wsob]"%=&8^?R3 " Q]PǬ8[+d;/~^^1Wu1ۆE?+4Q"L]]eXGEN͖Fx̷Vrmݻ2ׇW]ƞ)O@w@dzs{;:'{`~ wksx[L WGM.=f՝_Ҫv}yml`N~پ+1fc7㕵^ӛxmݱ0ſ3X! rUy=WܡxX#pRo(9 4{0OyW𴧩lO)/,04^eE=~2^B|: C7 7ŗF0^k![m-ڵE1T(}0j*הGL}4%f :MMx]UހמC!>t|݌uYZLX#_.޻w3WY&Hm&+^E$׻=՞XD8^ j޽U&)Dxז"\8Q8.@#wbMV>7d`KH$582j( b'._&op7 㵥.^ `%.끫x_8$ ]lCyhy lP( [> Xy'`m^_ީj1,2`unO"@,l EaˇSFJ5  5^օ0Y Jr%JLl Jx%׵`rW9>G6ucϫJD3f0W+u@|f0I5f0 ^ xiv`Dpcb1w;ʎUv=@*wpme6SQsxc;-W >)a6zYbLBadJ?~S%x] qaӦr44oL55̘9 J1|p8>~;/~EU7sEjW'jm 2 I̹Jvp5)J#߻o0ݤͦ̅ ՙ+ic fd7(m9k%\>ɗ:^ڷ2IWO `9zz>1&!I19x; %ŁuH#&m6 /d^Sטf0-E+ sH׷U5@7/xӡ"D}RUj1 I {.]\)Jk4ыHK񰥁 xas=nP<1{};&n |ɋ^{_ehex5h/PF\)JN3v(.#SmCx%^w~,rcY{8@}`u ] xU>)a.%$$)f0Ua| wTGMimCx%^uz+zEnP">*+?n = d_۾s #yUOJ 1 IP(uyV3a\SQQie}kx^ וu1)[ڪf0 5k^3ua`n 1HbBf0 C>3Ὼ~;-5x]_/fe V5!D׹@׿sHO䙷 [{ Dx}Q?Þ9~μy3opx kO|}'H#_|Yuo-  ևuuxx}0fҾvM,$ a%Vsx`AnZv5NMf ڜx%BVgϿ/~\9G=bә3Ǐ;x}-p돚*Cud9(ZO*A JlP( Yg~ͳ_;^?s^P3.MOOxu˫~rK\=6+bzDγ*eeu`Bf0Qa43/?Ϟ}~Vϼ>wq^?m?^ϴӼZ'/%KWV]lrjeDxf2f& &E &* +-]Woy^M_ 6sX:rMk?wǏvx3-:j6y"U0[ C%08^[`U ?S#.d[ 3Ch-8^ &9+kpx:~ny4ݛgZPCsMo)w{ԇ_xm̌ \(/tnsԫW JO˞"d{q f0񺂿Jr &I+kV*?:w gE3g.'P|3ګr6߀Hd^˂xzk`vl/`#D:^$jp]9澽5]m)S̕t6ѸdrL9l2{Nae3axjFo>K<)W/gϞ2t g%!1xxρ1^O8^9㷶S}DU0mHe]f^3?5_bYxM .׋!ŐJוc'wcN *7M_ͩTGΝ su°{bW!Mϥ6{?Ϟ?wkF^[`@\s;/za4@:x ,v;~K~& f!Qhbt]9V ϞA>4yi _t7Av|X f0pjܹ|J0P+@jVG:sLFuWwk*`8 (bz U+|Wf5xMg3īi nKÊf0&ȁDJ*F'^i,V `0{}i*(bz1f(xelr~ sk+`D: x-Yj;m5gL>w+>#^SګsA(bzB J4^ +7ׇ3lMf0')'f] K~"^ +5xՕ(3wOKm( V/R_Doר( MGYמ0 ὾Z r =H~~Ex%%+k`KdwFΠ #Om׌qkj"3Vk'i\IW3iZ7# goX5^Sui`1 ^{U3*5cJf04Xwk5ExHiϟo56ᕔ E!ճЀ.曟=7yt^ +٠P2< W3_*^?k+5x%BǑ]ݲ~ŏ]JxM^ 0d?hژ rx & &}]P Fj3 gv9]7A+̺i,ᕔ`& &]P &x4Y{Ė_=7`|9V ~}FxM^WESh&{6IOh@ 3޵|J_ ͳWُ4~kr8&kh3KSl$gyct5\P{.I Jz,fXf0UL?tvJ]TNO)?0`q6BOcp>`%ZEQwF賥TA쩐sqt:luear`',9tAyiwrA F傒f05 u0;L|SRϞ}_7/y?{ P!VÙxmlp.wM `V;,[& @L>Xuy{ 84&1{a-ȧW,ʝoDZ0/ /ֵӧXOx]z [3RP}jVO{uu,/xE3Y픬6g ^m!<:<Q+< Q;.(iÛMfu8)B| iWLa_k:W05N<-fYIUB4‹W("QSv3/2dlr`Tˍb]P6%]`duL4^+#e9?Ixͦ@\f02ߊctue30^slYW! 5(m<2M^"^벖(1ZDxeF'ym/ h"R`*Sp¢}pJ)f07;:xΛ7::C|쵛\.?{ÎNkvw|O ܼ}Gƴ;:uO9eqyon6(eaex٫?Z9l<(oB}WqK i>7T R?b4 :zU^`|m*SGskB'W)9]mL;6dNݢel^c@~4yCO+ΝyϚ~$E|޿4n\MXT_uEߩuT^5Uai#h#*>hyP!2O^ z<ܥWUt?nw5k8{`KxuL%Xf0bmS ~} ,#8? QE ~G^ȘЮ`3 vgh>s)O˰nO=:^\SRXf02{ xsRͨO>Qx_|,r٨ګBZCk&^cpn"K"a9W490kGo-;؟Ӭf^cvtvvvTsE5aԅ!īᣍ+Kzd'0~9jQs]"jkH[^xVWW^`DҔnf|W#W-Zwp2w0s fVp.UU,/7bf˹Il({Ň7Ԕ!kG=\~$cb8F 12{EҺ˔ .7mgLV~¹N IDAT un6x}K ,kh%Pf0sA,e"E;|ī\5`O0q ړ {9pT$xasQ5`w=, k&}I+C^ W@^!ګ,k:وW]=r8^sVg6זs`-#y}sjL(`O`%\_5p3@$^ \ k@g)ÎkV#t@0 5buymIA˃:A|*j5RCρU:,қax+zY׸5; " 3fRt?uEfKlTV% 8vlfaLnx :iגx]O /igьkawkWtdU/]eXaU jև[JVxM2[VMkl`heav]:Aa]0a!|P|ˆHkKAlW,`aPY6+2ԏ-jUK=-Ȣ,fC,D"n^Gf4'&๯D9`k&QpHcɒ+٠P( M^":Yv;yE;D X'Ae* E@xN^bX]Z9*&N^Y:xWex ?T3t3:Y+/ f0$%PN^Q3& f0dqgex}|7c8"E님mWnF'qreE3GqhV(8+οW1x4وpLL(@קWvӐ.), FjW6xTe1`6אL5ExM^c!F \Wo'v]2 S9ZNiU4ka5Up17\Y}g_ fIOiu2d 0^G*rIī{ۀ1&Wk,3aN]MеTaKy*H vs.NJL3#Uߞa߾v6xU rۙ6̐۬rCGXY3Ʈ!yiw`Zi^E^, ZyvD!̱^n/Fp{ ȗ<.«XwE$:Łik F &|On}a Mg5cxo㸦Xx+q/(C !ᎂ+v MJ>"*1%Eoj9wWx[ e3 C,3d8cpK 4ҎO2;w#v> b+Lt& F xntF'k5Ȯ<;D Ad*r)W_r$;G1H[fz:^ʹ Wh#Q800AgIɴ]^j ה;]K^َO"bAx~5^b h룈5$.Fdiht&WbRgery='unxM }utY˲Wq{5aaa6U;U%&^/Wc9x_m6f0œ訩c\ŜP0|!Nk 35*V'Bs $^4:E(#/{p`~U;Ʋ$!{bν^97 œ k 30^:Oǫ47wq#^Ӫ1&We=)%hW2%愊5N(^ێ78^ V(}p{NQ$^:EEu[= va=~ {&}<7w`1W╵^Jj gZnԕ=dG" g.CL׭׸CE%cogN.VfOx%%.ÌNVz ]piwE%^` i5=Ⴡ;s&^I N'{ݠ_۟GAgJ?_ݫf$n+D".kJ]k*W#f^@aH$^})QmoP-vULYZoτ8157מkx_͚`BQaH$^K'U jtW:\i?YުUksvOoUҝ; ~f0otW_0WR6YIJdqRSW%٫k-,֊^]~k a'KVW+bpmડ>6L][?\I31Vf0+0<LW_DV%^aĈWBE1U٧j,^YZ+ᜀ5!T+}αj0+>3cf'^ &Ex43xj J]P"j?tX3zq+k*zjniH?f\x\U#N"^=%Ct^0#ܸ^5;?'nUi9rH[F'kq%f08 үsw*g׮8J7]̟&! 1`׺;{ 2{Aȧ 滉#q,Z,)FD1̒C !{m[ > 踮d^ʏb%^y WQaxe^*wI.˴SYXf0\]M.WC; ٫#s2щ$݌NJ``M* WF 6n<C,3ݾ6CJ§~@0nh?PОtNAf(p9ډ|ݾn:--^qKh-[^S~FxMoӀj5^qW_ ,J]ىXf0|d>3?ʮr v #^ sXщq43:Y8f0ۼ|mp@^ݻec8a007A;KML$Aⰾw"7`pQkSh4׀7 4KFUWdρy[#p@7p(t9:#Ntߒ3:ˣ<3f𓶼K/+ YMQŁَ{7u =B7-n{9_SSҞt/hMxWI|@=قȴ &NLB7)1xtft:W &O>AGJc>P>}LxM)^Seɖ^7{nFwϪ݌ckᕴ4Ym4c*n+DJOf)+٠P( WRbJ6(-:ŁikJ6(5:= )+02Y216dd PaE֕0lLwx_m^3IHqr%]`^b^6fa`6w Łd#^ &Exd3MJxMLZŕԚvOlc[KANʎ!p!q$\_{ۀhvs {l:7]a2#%w_{#{[ L71o08E #j8{.m3 TᏎ&+^{V+?𾚍xMLZŕԚxy#JCÕ0or1~+]}M C,3|^~j8&pdFϾ uw/wWӎqɗtʠVgc/]ͩTGMxMSGe#^br5Sj:4!ٻ1>wnnb!ˏ3R 9z^x/xA3 c?`p x z4| ,f[A*8d=nkah _9qeW5f0)7:Y)5yvCS6F."\F#}kz|_&a gIɴ]^j5sGYw_{E2?F(iz4t+*=~nW1?"`U 1O;f5JܬZyoFV+rs>/R/,q.ǂڷRiFԎ\:m1U&a T8$1!K{NǫzW^q?8.ë<+&^Fׇ~+ ″b}MbO?&s ݗ^KB8K̝k*8:EWñWcA+pmNJ>€@J}'v}|*Wx6W:j6EF;V ʲ>OIx1&^=0Bb歃R Mf0/k/vT%xu+*$/ }R2gxR -(BRWqWX1'sYv{?WY5 f^Sdf\!3;;WAxUHSzEd{"U}Jd+]9^}'\5WAaڎ+| ;we^LfnʢW?[*{T?˳WkW͂>5+{ZiW7T{opWxLvWެ6^N"C[y:J=m.x+jk{xJk5.Z'RTef3x谘g|6QY\)Ve7[WX&*;^IloVaiU::~K90-*ira_ S>["ҠdƯbw|]E,Jf0Wt0^_L5kBJ6(-F:ZPOEʶ fW( `2gH&Ds`@f0+x ?6g*ΒZ}!]_d ^C0„WR g>XQ=^'绣FΕDLZ3'SSIq+)aŁ`bHH^4D_o &B34W߮dJJ^cx;:o`ڇU;͎owޛs v|z|0{f7<^<<ڇS{7+b5kSr,}72 Qn3DXH3̦{$I46HM^DCێcjʹS[Ns`W2&m`0{7ؓvU:V5,:oa>\/;iwn۹w΅VöwxfUuHkiu(HMhI"^j#t!E_j=vf瀪X8Ƃjr8C15xedo~rQ7 i}NڀpQ ~eÓks̞XB4C++z{R5eiÒ鐜6tm`&>,Bx&>8$&{^ߟ+jkSalNİ"-YGon'`e6ubk+%cS1| YW4ipcŋlLv^ $+5 +L~0[.TŊYliT?l.nݣ',kf`x&fkqR5Ux=Vgn j+qOvXf JxM3fCk+%x!cH7a^5XیLFf-xӣWa6^agg'N={}5f0+O|~?-O'oVCK_qɟaqlګƲ|t։M U#^S}a'Mr6~mrj1< IDAT3ye쥥Waӱ%SӜk~ӟdz_%uʣϿYX |,kw41YvUf.^8<ګkpFBh}ik~ݢ|U}ًf0Vh}PFvaok$ \|_Kx}QO9?ďWy\rc_:2 wlUN͠bح«X`7,!xens2Yj8zɈWM S!L9EOq 7+«vݕ*׿ѐn^_P o_ÿH^7s'xH`U(B*RK&'\3 VB Mxi9vzE7>(#/UC mCDu|0Lk99Uv 6;Xb?NZT9Cx~s^_NwQ!c53 3q?!X/9dws3sL+£;?p]GM}`ސɎ4A ȃ{ȵ^`WsykWMu 5}%^nUkk3N4Pveǯ^`"9ґC; ٫/*M=e$Y;+OM՝}`p\VK!WC1j_1aO? L?^»[o?z_GeZXo~{oU /(nO%{-.fYB+E$,ZY?[4"g5kq<מukWZR^4]J7󷾠}?sm/e<9̜9==oVtN+08- &\f ov {Gf6<. 3,B&; 5C*ծcAҠzDDw} 9Ƈ/2*ZUWMqCzjճ; GīhuګD(w<9ڤ .sbd?seרeM?ŧُف(}x]^QTSȪ?=URR -GŸUoךp:6^yi{M`ny0? &Eg =ֆ(KT\Nj奁mOg^&y/z5^ڲ5>֥j} ճ;U8r ^ͼUƪGȽ^];dtQm890Slg}n\TxMlτ

X~Św]|`݉_ť,^Ud@Oatv_xk E[w2<2=<#+$k4gpp0˽N )v${燣Lw=cu+4[K6^W`@ 1N%I\VG5> sc\;^s`r@L^]/3WWW(xUWD2k`@ў#G-ZI>A29ZrI 2K5;w[VSUoD=Ӱޯc[Q l;=\ի2gw6(vgL\Z'3N8cX\ i{5Wk\񡼲SӍSVf`+pHx3^s+w`9WsKTw(Vxڷ~*^vYMQT:$4^<^O >Dl͓ O~Qgٿ.}umuپK[ F /ArIͽrn#r&%w&|TⱦnaL-;9@qK:*\*\9‘DڕzXG 𪸸wQXE&v~wX9 4G !*Wӏ,Y.u<&U\' xKz0!9V K,nqON̦`VWQ9s;c4 &q$lUBx%jnJc^h<ʶKp]"s]ivikHІ&`W"x~a _:Vah jYg{ݬE;+w [fqbh P=UG^3/suxy5>)Zqֱ: tHu 0+*둷o?Ori:JWˣ* >=Yw:![ўW`raD+K2^[9e Ü1|X2'|4W«=-&ź\Ri69e3+Z@Q`!h^h\`0qp9c}2yGy_{)}FvbosDpG4).~..GCM[HEWyrR&ѱe`H쳖zfϒBab :ç)3a85|-i󌐢p“#w@l |3Ip8zdYTt`0S~'^PX_n„W fҟ#@tk.K8^5gݣqo 6ޱ2"cJ$lvybc3]s)t9z[W~ղuмax 'ȿB4OX"pRyoUsf0^X6Ϻ ]nyL_;sیߤYWǔ.Gx#jlʽ1%j^)&p1 #jkgpݫv`rH E.m^JglvaV0Usx- uR$>7Fϒ2 ^cKX`U$OxՐ>2|^"«#wpl$.s}uѓӤoWMR01հ.4ftaj1k8q>a0ΗD%Va122/z4^ЀzI3}=vKxݨr^%GToW=Θ՜H5\٫`D+IɁ8!mg ϽOzu\z/Ɠz5XDx^cӑ$g{C?kۏ>V`l9 M^4SÊ ak\ ϶\k+Kөr@Oxu.j "`&_ X.Tܶ-xݹ;ٺGݫ I,-3GLͳEªcD(v^m?tcԇGSŽɋ=jqް3j x V+Z)=+w]>z-=jzwӦ7;u2k[e\h Hh 3^w6A'ojo0曗Wik+jmU+UxՒ 1j%kM#./L*C~/eתw= ?.{9{۰J#o|{[֝c]۝x1 W ^9HԤe*^[ %«%3%ʌ(1#5ḱc6uZ$;?HW[=x]W`~Hw*Z[a_uW/5Yki*UbuE>?cVū`qdW[V>V`3WsB2o:_%XWx^rSôOUsmjr`՜ b>ѲOHz«`@[zG靫]؜Sk=WEW ^O+//ך/x5e=2(?!9#[x=g_}s^5b^2G ^5dd !|l&N^Yx=z~URs^vo{mW }Զɪ>/׹3{~Wx:uRL'tLf^O^xbo8p{`et]eVjwܧgxb\09eXu |l:+qJJzmGWgF8&RDfbShh@f021P1<X*.k쩰rV(/-X@8ֽ+Xp⠽c*j}/5\k;|}z\4zyzkQ|Mnx>)yίE倲&)y$'VꔯVv^/cII{pzqR0zq*V8!ilbFh|2:хSpex?ֈLE@xY_* @mWmg*ΌA *Tۮ^ؕ6Vv^ Ɣlh[PbY0$VRr))1R|X8)̐١ ^T^ԉ[':C7x%3 WM5od+j9^tXx|x n-_ ^ 'x5Ǜ)[B 1B%"Ba?>Cu3lW`+e^<| ^xx/iuk>:K 40G)4fX͝9DG uk`nsA/s|+W?u,9v6Wu=KJx^A-9zEsVkvT<9cJ +,Lךwv_k '׵pyikW"^uWV9Weׂ&W̱*J|XRf]_c NFT^oZ0&WeI.x-ʁ6v+ᵙ¬w?-{k>|b03^b ۮ"' W=^JMmq--l!tYj(tn3F>4Vi6(SFFB/# YXu1nJf0W +jMY^ F+xm8Jx 3RW+xu.66)T2 W{9%^ n-4)05߽|Kx0ulW+@sf0zkyctij[f.Jx%` SS瓒i͋pf[Uy>5鷒Es/GGreQRom|Ks8C<N"P[5Y4g-W3]+ Yl8z]+ e}{+fBW« 4uRyCī3Rij>axM•KkQZ-S࿼ !kC*TIzFR&kRx]lf-V+xM':"ߏ<)dמ90C55Ц j&Dx%`nRР!Sꔥު $݌pD.N `ґKKSʻbci3>rgp2;!/cWӬo+\̈́W^=0)8^pq.VGr0ܤu͜hO|jR+5Ǻt R^:O<릧xUJ%^Jq[>j%o|8 ШLJx^=W~=k sW5(^xvQ)XUխgCFuic0,WPL^Al]+ǫn&Dx% M`0WjY̵C~4xVGu We*NRk$>3{6OW%H8rڔ2yd ˽N p̽.P {Ts!WW3k_;? WGr`Mjy^b9khu9Z+PZ*9uKr`Qj*Ex03l,*V[%-†\9#xxOߞ u>^7_E^זG+׷ >{e4V |]p+3 AdB,i)^_Wk3?ī J𪉰.|lX|{W(Hifmykw +EMM 6Ns?m572h05ҙ 9C06dZtXt.0swܫݿnߧuM +ՅaŊ͒.:Aa[>^!0kom ,x@ nS=' Gd|tE~_صr+9@xxM͡8k҉CX j?rZŮx͝h0Β!gZ+2.?z1l3tRW"өSF/'Fb~[ֈLn5e z4;\kqW񊽙wGn]Kx%^[EہW$+Q9,Oƒ#  L+f߽ EMٌY POtG3LPv7o+{W^y]i-&-}/e׆o^߲8Z"=g?{as/Jx%f _Qkp|A{Sdb^q钢4«e|&JSDh29p$<Wbc3'L o?^;qgjvC"O;ѻ zlՆS"^ϯ?pa7!^W{s '֝źf-^ۇW~UgIWВ'FxEFN7L5+ U a<>}Jhddp"[Q+ fF]#{6V)F/2޳[xE)l\U$WO T/|z-m[gHf{[ [-zoO Okur '^ف>Ig^xSh^ul5zꋝ;.Mz+$n /%6ƫyc1kHLkZ.5N4g Go1cc^z{/8gWZayk-FZ}-/[k'z]EF~c / IDAT;w_?}xʗ^ *36Zr,E{F,tj|We0픰5+ER&VBF iz4?!N1j/ast@*zf )~>iL6?dsmr{!CucIPR{&I! j& x:EIP6sޠPA:իBP߻}ԫ ^Y_j8HuLaw̄AxmΚ[Bx,^Y08Ï7F>4W1jG*r@ ]Vk6rʃP0Rr9`kphk`>>F8^=WŐi@xEsLyWު7|X7aSyZFd%e än)ssQK?ᕴ%RV<%I E*k ;jXW3ǠϩmW.麊W?l Lm8^}ks5Õo?ݵ ߼IN+zؖuֹ3XZ.,^]`?g~ḡ]k&s]z!439Zs"լ̆C^L;fl2I#^E8zӚB$`ٔW{GV82X !d)+Q쏊Db ^^߲\͎/+?pAQ9U\S[?S񊊳#\ km@Kڰ?c劆^=ptu&zתOUtɗbx66d˃ٍ90sJNxI)>ooX73tH Ya1(j*^Y a}ZPr\а^Ŗjچ{<1b@p1<K4>$^)xRO!>{9{ l-z}u^]`Y\jafa&6KnD@ڝj].(^=05Ck5_|TXyիa=yDz e6 *tFZߵNZҬz h^[kݩz+)\E_*TzG -[HXԫG&y#&v`#ǀeb{#)E˹V,c>m3@Pݙl"_aRV/;< tw]ך7^?|joWLe.ou^S^98^hF?{!^W5\+C"x97-;w̓š&Ѫ׸ ?PZ8vXX%ҕ{dXKPR{.'0xDPi^fvŁVWt'`?<;ֳj}rxWkt2~p0« HmrZkν앯_wc^0h3 ZrP{^u{~Kx%m0(88/xM=3oW1jOp[~~7]Wvxm`_Xoq,k/Vf0W«A Jx ^q+ ^ W+Jx%j7Jx%^ `W+Uxա Jx%z4!^ W=չU3O^}y8.Rf^=^sZ mUf0%F$@ ,q^obL{*MMjw<;2N|6k ׫LԊz{3j F |Wu}$W F1(\-%^vWp\z֋}V W^^܉Y9Zq WygI!ށ6{tSZ"1Jt4[@ NX"P1/˨boSj =6^ϣl@㵮 >W{K:`p %;'8,H+?.T'1"q~W-5[ͽޫ8seWWrAM^E)vo׼z59..xNffq}(Wijh f4 >+<ֵ|$xK:`polaX{WBurVȓ&a%׮ǫ*36e"Y U$lU̶F$:Ij5Jh|Y0D:+ׂ1y:.rB@k-NN[u/|.\.kk+&f㍑)1G$dcZ9WϼrxCJV:F/ P&RD1$O<i6(SFFӕ cddMM [‰Ar-Uf0k:«Jf0׶G[[ˮ+{ա;^kvCՆۮڂOt ^ ^ëBn5;םډת.z%^ Wpp]Wk>Tzw AaT`Ey]߽'8Nx%^){J{9{Ն'՞OvV8igc6uT^^ͫBx%^)W=T8w`݉Uo24x׿(Ԛ*ϙWYVsb?xJ- Z8Wҥov?9u{nv{ TiK<7p3]^+_qCA)7=@Iο!_;pJx%z4n6|R|WO ?SOGڙpkO:g z4o.š.oꗮ>x%(&^ ūsQf0M XW\a~Rnk]u.k ]-YW VZȽֈkr5;?~錋VxZiSsxYAx%^uW7/|X^~d~jוR~ֽrH?`s;B(VWoTT;p \+|?.} {OkA<iU>;pZ]]w^Ŋ{ρ ۮ6}+(QNx%Rttr@f0M׳v,^RW+߯N;|15_o8V൮Ya\mOmT3^o^ WLRpK) N3{ 0xmۏZך/kWLܵvKYQ ݟy(_)9@xhj f [a%mvIJ +fgz,ziq~?u1^Aֿs]k813ydzxFVH ifa&{i<ծ?.Gt#9?J^1?W8.z^o|-Jx՘2gw6(,֓zeYV!^s_!CqľX` Gw_ᗶZ O7ӞEj F [> ek''Tk[1WWfxi랓o^j8-{?&¶Xf1^ *mܬ[]8-F`0s aw j>W[WGy\6`0:붩raDEAQaMGG.> 3^rdҜW=s܍PӺŶ7La01>Fcx 3=UkAx%v ^ BMe8K)и@+2w8Kbx n[ūg4>4$g8C\ZB;9&n^wKk+JxmWyrR&e`uu2.NV,s*fS^m=2ڦ!< 2>Bл[Jx^ J8i_n\riڐֈ 2Y%dW"Jxx^c[ď$96qxʋz%`t|^d\ Ki-U+`N6#os6raWJ W88£IG=8^QǏ5ɿ9:^˽z0Y5O?NNNNxMe(Z~61bs6ԑI5+Չק!x >&7+0MW«n Ur2V],rP2`0%JTRo^U|+Uxmje<dUi8X٢hu^Y ̡Y0:ϦJ^)VErfk ɫ1{e"EL ^ zƫcʁ5spAIkʁ9ȯ&u$r8*K~sEےJx]:7Wr@nɩrfYgrcxmyܫWs;xmk@&%-!R0#f ᕂ++x~^} 4cJx ^-*_(yJAx%vnĴ_|&Jf0Wk3גLĢ{N4 a0( hh B3.S  a<-BKT3W.)+~:mu *AgY-`( }7BvJbn0Lq߭5"QPޜN S?rZ.-F,`Bׅf[lű02v16aؕ0dCx/!(^r0zAZ ѱ%A+BS8eWӆ)557O a%rt"M J@LR<*G+NZĨHT~ij ikƫ%0Sxf3dv)%s{\b4 fݛ$@d$K/`}v8XX=Aq^],e^׮0iAx%^}Erɓ3AM2Z3x'-cM1I=f\| x^Nu:DzLo^535JNg=A~ɩH?4^Al^ӂ{.ߦ)":JdA/yģYもhwbpPb_E8iFd*ԫe|b#?ëPmZu8qs|,O+<ZȽv +&g)/CO7ٛ,|h7)n<9`04^g ;s!Ox9aGrzf *cD!~Ucxbn^; FUxAݾk޳m"7cPi?pBӃN ڷn@WW8'쀋dW `nhWO٭]n|ex} Un#r ުHir^mb d+r6Wk,U:8Yf00l#zr^/oõC[)?cYUR+C@<^D  Ugxmytt{/{*҂fBhM]ںe`kAx^; Ʋ7iqVw[RY{y[?Dߒ[5-(88g&xmt;z ~l=֭gIz%^YNKvⵋJAxF|{[ ]#^ ^+^jtM=^JxuU?f0ZInʝY"^ N F+E[nTiH^ Wh7=ܺu>k,ڭ\Ը&Cz=l 6k`W]3`ׯk_e\ʞ%)VyģW«Nogystre'du|A:x}['|i9^moCۛg=Gl .~1q# ^[b3Q{,0DI =Qr_}G\PKx6;kNMݑxD3_9^A(C4]fGًotL\؁C7f0&ˀ6%II x;efHlmZ&)tIDAT5J4+\h0g2D3gN4m4ˎ|UeW-+{utDRvzk `E*`Ig};MF/DU$)cL>䠣pw{`,ϧYsʽ4YP~&euז aFf[r𞉄W5m(A۬"c2˹[+^2'(i;Ջ1EəY%"ƖSar;xupf0kW%rhJCmK -1?,8Vb75-ȯ%t^B[y<2FFF2:r4xmytC3k#/vl뒲K4O z1EUU Z'f|CJZ/mu[?wW;'%eΓ4nyך^`1!2X.X+.+Җ<D yrQ宾xy[ [yX,)#){x|B]9GU8fAx`">V!v_I[ĹZI~{e{<|ϗWX?8~?gvqx~Dp͎#G|t qy:JAf0gRVW~3['oTu]9lL{-|ƅߣy?|r}zz+ᕂ`| >i?8sj׵w_ zju'W!3-+ _rx]G ^) g™ݺfֺ37Nת7^Aa*=pBݑ+jvCV͍?9RNx%Rŷ7.#a#_)SǸz=+4Q-%rbzxUExhWb,.Zk[avz^oC}Œ5*PU`$Ngpr_xkJm^<+oxql7b?\MB f>?z̉W㵃`Vc^[eV8K^)P3k.՗~Kx%vv &0鹋pR]ڂ=m,JMZ]~M;gUsa%esKpM2d>,RvMRҜ-J"^ok#PCydLC{+Y&HJp!^ 66,1vץɫq XWc*cC߃5rEQ cdyځ5^KI^[`3)J=t{uVx2 x 90Q1NPf )iKfdӤ6>,1v åp^$Nl SyQR3K<ŸB}qs̈́W`mp>AR ﰍ^%<*Vf* C@A)q2bJ^{83L,aUW<#qSU8Dr%W]AckKɁۚ(zFŒ(9gppPۨ_`Q̽^g"ք~e6,5vR5繪WWʯV5ƫ ﹩d^zK[1G<6Ȗ=p|*hGM굯G:4']g WC`Rg5u5eaTbU@{MZfx]Ü 1R4cJx ^)2Jx ^)nW2 ^)W2 ^)W2 ^)Wbc3'Ăݒ͙x«<U~AjW+ &gПH l&xr_耞%Ufé6o;S0=qP銒7zׂ!~fL ĎbHsXOx{$JxVxdc f W0dgUko\ܷC\tsYe*^qeIտD)W$TK`T&${PY+r`f<57,% ^ͼU+yd9};^Cb%̽3g  Uq{&+$j#~Ax"^ zë3淁5C_jrWCW ^*Uג5+{ᵩ L"ZYuDI,[UB Ej^o/m'+,p@+;Tf2)93!ů͔{%^ īA`F6CMUUqA~a6'o<ޙX&~3~Xp]ꕱ >䀒䏗Đs痸!> >{.ƻؚ GaP3w?tSqA~:)>a~a'{?(i.>:X}>5Z ECn<}dS|䑹\]?~=~wS#?6+@1dH^3 L|@\i8-xZ#~faռ?"^^>!a!:wŶ0Cx:ޡ\i7*r 5L +WJxFxzţ+8RтiI"&^ Z XR+{U^)5^_afCFJx\ h)6o*] ^«`|V,vK8-=A!^^oнw;xՁL'pťwo^p e髻n Rx E4@8W>-P/Mxu|զ?q;-$^^k8 \)zȕ!8BܛDڄ.c7l_kB+ᵻ$nxk ^J@.ƫ8?@~!ݮJx&xռLpFmnJYHJYu 5KΘR8qX~03]~~$硉x=A R`t=Ђ RGʖft (؎5'AbTN )Uؠ 6+շ}3HNPFk,@Lh7WVnqEfAgHYN W I<}ؾ`Sf0e2 D* h3ftīln(K}պ/(*b_l>0xՁ y?+0mpŃ6«KO &;h- f: k:w~Gʖ\JXSlj[U*^Z벁U +r7a+C[M{Af/(e8?gh݈`+^pKArrvlnXow:v4lMmz eu'xej Wë`zm8^C+[&m/,1^]_^&UFuzr0*[6FxUwEU-tW|pWW«oUf0`5bxxh/,ᵿ㺕KO2`$Or\`RR}hu&( 7kGʖ톲*M*vrr@[|̽Ux4^R7 ^}jh f4|=/צ{AfW>jiKOﱠ'scxbw^ }b#^e[w|WXvmIaCJ}%6 ^ ^[15\iu@`jsJlwW*ZV詭նZU9ԭVJ=**֣n+"Me{T@))҈I@! kL2JV&c͚oך  ى ?s bA AA# sAى;ʰhA;SeWCC ]=,\"ݩzA}|~p#%GFi]蹡!!PnC$X q$S<GrC%Vu Bg$Vp\9H|1Ysk\k{&_C7D%Riuzd}64IV|~ Xybn i (ّk:OLɐT+Tb|@ Bgi]ŻR#>ύ? _|KBŏ RO`dMyIƠ7Џ|T%NϞ :' %Y!RWDaSSDt^P_.|[x) z&i[ʷ?jdK=͂xTZ7݂YSB"H=uA2E|~QW0=^U8# &.p1ޮA?It̯seQ}0Q;{l~ #vCp~;`SUWS)SaE3N$I뒜1Yاǯ$Ϲ;ur< >\\c1ߢ .#<(#a$=r֨:B+Ls"^RusaԳʡӤ/ev >)%AN^?[f6!KJOukї.$o)yϬlEZFgBٲMZGCʮ ˭=n]uAF|:1828=Q=ب0ljD8LpNR$$˷ds|2WH+~,<#TjTA^mKSb4:dM\\+ "d0򒛮]wLIt XRTخ @sWI[mϡXm5_vMipBM8X2A:Ko  F21s$F# < >gAuAbTNn)0uKI=[\Z ZYFNϓHj]f/'N p#8q>7d.{`o+ =%B k\*_3]VԉKlE9y褤CNu_&QeS# p$$҉4[O TɷI"I+hdx:x,`zAKJ_2ԼH,lr |*bs.5r6]D\ڛl:>'Y'5ZZ{5n[1=ֈ HcΉ.ECJ/|Iq6NxaӮu|^'eGNt#ީg&1])|S凤@ aWΦu^}ew* }XFRsΙ brhny"i$x,2|>hy"k>$JEz[p7紟J_iptrTw/ z# ^'1v,t&>WN-0^Y8WFV2rNs.ujrss2 YmXػAF}9Q4Ff]] |[E2 YNABl,ߢ3+_ <p%5kcbN>χ"1q̔Ew y㒐.Y|W{DiM mBO)ikJuϨiQ[<2vdhNŗ,*C8:q>W(߳t߳? cܖ߳Pp7D v4 AA# sA} >GAτAoo[~-0A9} }>G}>GAAsAs9 ϋϵsA9U|p} Ҹ ,/~~dk%-CG Myd+R6W|^Wf+ύ<3#Ίw\w>-w7WjA0~PS,ˉ_M9 >kXu b@1Y&p9sn}Y|AO??>])U|)4G $l Ai(&]usrҧ?JW׀3?H~}wS~tsҘ!\t7~ >?-ͺD僃6#0vW~p;*>JSt<|oגy̋#5]Ynqo{|M9_cڀv}j9 ssj?ڜFK}d3#_!8|;RO`>ފH(1|ҔЕŷ>:_fڀv}L|lE}^?$^ʋ٦ȚmLsSԋ4CżۀpTmiW4n@ >쯈 bҮ#}wۤ{>7?`˻+[ uy&Pmo [ Sioq}sAs9 ϥsOm6F9;թI-BOAw8ߎ ڢ_a29=u8u-:OAw4>P@{ԡ|k!AyGy$rt~~kÑ >>*%>:5Uvk@Wo. ]7|޻f W\>aۻOK<%yݟ\G#>|[0Cet]G流}aCR̞#'ȒtYsS"E`pv.:=9ssAms=%yx=eKrT.5'(fȂ=T\tO(d5se(m!t^܅‰NTmOdv.:iG>?&^o6D#(ilA-\KƮˏG$+_p:`.\tyID?urGƤ/iLy\sNNKJ\9M}8;<&(iWϷH#y|Klaqò>/)ɯ[Z%3"Q2sNB:x} l.tZŸnEV|.D#bW>WY{lō.I䝹pd {@CPv.#ٿ}~) ^4—:Mj,%KF-M_ڽb87d|v\>E<#d;U>gKsK̟'牔 ¾Y}BO1߲@ =_~j@ \ں>);(Po>OfgXg oǹ! {^鿬\ϘA#|`;0lSBߖxtz g!st >׮uv[ ɳpC6~R7Ms%+ŁܐX|䚘rp} E|~y.$RuN\{d8݂QUa83C%bH**x[[7];/3;S1N ԯ˷0|Ms[NWJ]\F$/-sA2&a6v)$ i;׮e>\-sAΝ^hswz?[ %Gs(|Λ^?߂#>oGkit9@#o'@AN@;urӰb~Et9 ƁoO# s9 AA# s9 } >GAAsA9A} AsA9A} AsAyYA}|P>G{w ۰Myٍs-jxgE^\朤OL]6QҔmy$eg^ H?*~UyR`sܵvYi mkr-ڰKJ~=[LE+(~gxճ36?íuT=;F|n.[CA:3vMhO…|g`#=Y4r%9yo]9r䒿.-s-/kjui#Ep_Og\X(mź>Slq5ۺ{n4ƍR_vp>Zy#G.ϷXW]s|rl osxʎ&\7Nc:4o.KK] j8PL 4szk>])iɶ<bW ;5+7LZlZZXXv-3&]Nz>׮ZoD"i:5zsC б#:Ou(?aqU\6BpynWHR!|\FZzkѷET@=۶=Ԡ5%bX)G OhJ46b[Wc!z'`礄K7T{R QJY8KB&;~AVTM K]>]e礢)  DO {iH4F}75"AIWxy42` d .Y> /N: =0J>_Uf>Ҙ/RR֔KwM+M)I/m)&Lf@H_7ЈюR2`+׃o y>?M*.9^$u&)4;EL6{~Ovk 5.`7`/_~N];C-Aj>1H˫[l}5ka*fIYl)3Nka׵k.|3R_cOSӡ*Q&rUDP~-+1XcآD<^‡%&mT*%fM3-c_ȺaOv+)+"u9oKIb]&,˞WLG('o3 >LC*f-qd+\;?dz'ǔšTdMn;d!9ڵ2ڦf.[ī)e OR$۞WB|>#9s>R+aj WҕhIyM9i{ik~ wEPϯM"=-#Ow+&>[T_8UN KO)B܍GV+USr{,ħiw-*Kx3]R!Cl-+>ph^]PL?s$mcF%T6c">s>@ESɮ7$_^_Ԯ {|͕S-T"S+ja!ɥ:\qƄ `Wc{/fQxx+hvl5SNP7ɮ-t^, {@g;\itTq,>YuN)/M |KkX[qX)iËq,x(&!~tĐMAp"lzAU\9 (i(MfAJF"Xglj-Wy$(PP7GL>gaM/qILwx{3n9]間0#FChy5[_ I$b 8b#Ѥ _טD,&JdbpiK2̠׋kr6:ˁ, w41дmMcHQSz2%J?w=ds1+)cre͟3%`9ZVd-n]f#WS sZ"FyLb!$>Jn]?PdϿdsfOɴ#7\cW~ˆϙmz@鴜Un?w*EpG=N+g?gR"g  鋜ǪPY6#KGL?xGc֛VCLK~|Nts&L&'BP8r|Ne.-7vKzT%骺>W25bn,ߟ^cz}aj Vmqa6-^|!kwћ7-[ȒixչeZ(Cfdā̭I}޴mguRa_8T5s x769{[X%A'l|m7<Ę52-(&I}?bϽv[rjCi3$?>cl]`6-]װǁã]76t7,?XM. IDAT6q[iRN}@|ut ^tps<8\Vd̐ɷ7Q]1y=ZN60Z 1RKᨕNr)ߦ .{HVm?K'ݯ_C0a7mxbZo1'dDeJq@&cm8!$vQvtV5-A&sp?qQ&-2+aVIhc5+-V6,95hЇ|~1BY2i>>\4dzǁωne'1$nS"=qz͝eݦ >YR-rbr}&|NN zUɟ[- :i1>g|8>%NoE. 7{y r8qbi[G\/3a [7(8ғpӡx4t& *w9[|/. ͷ%*:4Ǔ|aٖUڿ.ӻNFpϊg4޴# S}FfOnLQ0io?a6t>7vȥI;툥հ[j N$ dVRݖrc=J/蹥˟Ͷ0[*Q1)Kv/.*[Sلb"ry &m;'aJE)7'0[ʪL/H0FGؒ|FQLEU%@~KIGRv :8s6h1+av-E;fRB^>/^Iv~df\7g>>3?p[lZ%M#=Ph 'e>nsOWp!Ehʷӝl ː3Uv9<\z;Fw)nMz# svaߒ6􄘵 v֞k)"štcȦfg^wEЊag,fhcLv?lmoLC5--Ugn ѢYGP7s2q HXs%ѹBq#}bS}^)rFL=Z4֚s=Vyk೔3J)>'[g[qZC Wh9<pdT=Hs;ܼFψmVw`]=뢮}*jL߂%Buʼ֭jFǫhOS} |As9A9A}>GA#bd;&̾&sA:wSպCmQsA|:㡣mUP>=yuIB#>GAsAw+iCe9Ka;#R;ϣΐsA۷ϫVϢ6b3O]#yn*ljFƥ zC4&% f 쪬htQ ј&Thpp} A+`HrB`neo(K{]"]ڂ /_Y+SQ+΃CsA-znhyKij%rdzͷ<q*Ʉ|]ٜ 휠J777!r;2H?$} -C˶!1>D31QqsaUɿ7fWe,hs]+m9 CvF6%Dwc } z;#.bc|3>Z= FBXN4$ɪOf kωsC-|O84UVdsA}~.Z&?&A|~e&H=5jnRZ9tTqDZZ$$f_/Po s̷ >sү_!ue 2>}v|^EFToyQ/_">q$R#&( "gݚ(Awo1˷ǴeCrZ9GmݑˏO>G}A|oU|~cB|de%{dTH9ɟdr0{\;Y|xKw.7]خ F..AwyKKQ.ޓž> PƮˏGAw?7y0pz8EqC'Jf%ϳI%} c9[ɛ+;#./"6>wَ9 sխsm>ύsvƾ趟WNS)H\8:\Y 웅>G}N}ښBWsy$me}\kIK->gz-JsAn]me} b'X̟sЭ}Y7R2G=\'Ú)K逩g0?Sպ6EBF-տha3hʒj:|[DlkԞg7P5mޞ>o@|I6Lw mwț) i-oI6' >o[f}t۴3i5~[{gi?}ovs9iZf}>Gϑ񹾅O&9}>Gss~ۑ+64k ?JOkKm^jY?Wr˨D#syEuN[)<{V1^Օf6̥ͮZe'[M >:\W/# N5)̋k*ͦECMsBa}^%q-ΈQ݅N-K.[ּ|(*mDʹ͕-j{\f)$ ʙ}nl'4W.$cD#76Cuiźʆ|~>Y~S}^@QJwT8,` >ϖd\"st?:9B0ϟxU[{7\,:|j}P0Ie' 2I. 7W3>τ8@7lqCԻF.~ Ι[:2jj%Hp\-6WH,晬+0\U$xH.&A>/G_]z?v }nI&553"A ڈtXR]4po.n$AWk >΢t&vӮ=M91Ttzvvٽ5Ss <{|{s^UyZlDzN`MW蓒ǽdN+,9~粝 k<^dHG&/ɺϣ^`qc$:7DWs!Rt^?xJjZW_G~ /տT%K|J ?8A;gP+ʼVXyNI\HQM܅! Rj$z [}j -&CX>'no0ccݯ9v5=L|d(Kӫ#0v넰#g$* -]4ԵtYsa`Ә/pZ1. {ܿ㺎GFd+בؓ>]= [臮vxn}ﮎ8j kT  }ytR <;sTz3Wx0ͷ )"[N/!9Ae@Gkx^AVcI|{?Dz/ TH|YcK= g~p> /jg{JLd'Xgσf!luҮP*8o:<ђωK$4.'7"2K9^|єYZ9{ Ґ~g%΅5+t*>'#0?ti#ҋߥErai\|^(Hr|~iwuZ˷ys;_g{σ4f>4&>'I 5YCe뷇-s?sorK8ϻ~$fʟoGo!MMM9췙xYoo1beyL5oipLs2P[-7l%xKD[3ؕ[.ɟUm-y2vxVn;6+H< /_⊱=9a}n(j554bXkʷdBu9{ bϵW \(v-ړym?XD|k6N oٻ^vrIV tbɯ_KC'!Y[BJ]_}Yǫ'i(I H{(cg,rIG_RFE܎3M\0bTX.m"+vL_5szn<˽cI=ʫO}t>l{(Ԯ2^u+Z)f0>/eyڠ]`5yΛup vӠK9-^( \Z G9-7ϭ,'y"ebrs6g9CNsR*eHK)sy>W~ 3I,Wl牚տV-םGzp;t|QWpҦ`M|)|3%;w74}\Dm-ڟK'Fqeo1| l緆 U|KyS}ޫ`>/Onvp圛Džϛ#:OrkN{r|L!_%+ ^ߥPa l-?>?G#Vbc_;Ea }>GvɲܯLUs{fp"%Y!9L| ]uFMlx&+Nw &>_FF 9-su)5)NEϟ-g <Ͻ1gΜ9 9U9ϛ)K>6 35IEϛv] EZ8-={YƵێgTj{nyTS(T[ agyz/ob=y"C%}O.rIhS9ӔY%JEv>WD+rv^B+: z'ܚ(^!sl#ؕϛKKy"A-!#'V&+AcZ}y€ ܢP7s;= 9 s9 } >G# sA9A}>GAAboԆBh*z}>?\툽|_yALyyڌ:>dVYL K>E3//XusqPwSG^Oc~wk Aυsy@D\im2ܖ""Z w\R/E:> }ŋ+}~ "3~<54[,v۾BjNl#x g2>]!K'tZ GSC>Sm1c06nsjjC Nϟ,p޷}zx .[] R|F߫]"As(<P}MC*y89ۯڠH,$t1\%kŻlg yatj u\(\qfinSbj3<5M>o=jwPM|^T5>2[g#Kw]'& M@F7cN@ù dBzþt<~a| 3|ҋ /]=IuXL}N~դ2ծS&m{ߑ;|;@&ګϷ*#Aw\ܹm \.b1+7\֩cFV+'׮3`"Nuvjr]vL!MUBt,si^^S}RM+ܕPmMjhsF;N+^"~'-j>i kne2Y^ϵ'd>7ĺWpOx{|0(&Y)S)[.OB\'p^Wm P 7J6yumxj=ԀqtH|L)'MٴeL k|Φg53]Y}^},\&>ǜ-ڭ >%[\:GLޅ[Vs:gm΃esCxqB7J uߟ}eIdb|Ky'>bj$k-R6>PԸϰ_W3e{R}^i}7~/ WF[z~6rI$U:"&^Wn"vIg0}N+g`ܰK>S%!sP* }^{rXv7p-Ǥ"Y,.}}N]zi7P@(]H0?.z69 5} `<3{9-d9 ]\>ӅU>+d>Aj|Ud 0Y !#A7]2/:{\nN{aEϝ_w^bgt3L|"%o?#-{8R>Gi;qz,G-Nk &㿎8tma2ot k| ~_. &TBK2%~*e3>9g f>*1f/ϝ!B'N!E#ZH.(g+Z9;syDwA9 H`G9 ȳ} ,>t>Gi,A[zA9 } >G# sA9A}>GAA pj >G#ȣZݼX">ïBs !GojfU |>wO>\qzwK\mF |˦Ef繛U;|X;ŢϫNI'>v“9?]oDǪpدWfgFxhyR3|&'Wj(pϕz8xFFt(2'U^Cw55} zueWvTK>bJVL}<_o&X"/>Ep]mBv>T-zz&P_i&r[|FosJ>?61+hԫ=4^ihd0xј]Us*C$L?W1H4&ɇ"pզ7D\IG-4пH_ ѬǦ;~>?mq>b UkS`? q 6 MX>I[TWfdeV˦(N3rBNO59}0\So!2dz9(˦)=CuhBr݆O $#^s#RD '>z[`j%9"Ns/ݭgFltVQmԅI$n Dlޯ5Yɷ< >&MӋ@GO/I<4*hԡ}>}0>W_`x_sρz6yӄ cy U{C^ڈoYZI-`n7G\>Z4>M ^qtQG#Rȇ;U{}'M}nϓZs(Pk*}&_G&E_{L}~̇|6P!u"pOWS[9!9_OHp窆|7* {i:HSÐ]E}v;f(a9s+9uO愱>ZQZu>wV}j}>#lH4G#-R{K׊+SN"i?_Eڀ%>z;h!jzVZZTfꊆsfĦ?`>۰Rl͡std%2΋)i|K8+rҿE<k}WU|nb9(2&{}{}Y;kHXyhD=x’9^4:[`~tD>ۿ]Z%^GuO}w`1>/`,boA:wwCv7Ǝϱ=A}nG>O5 >GrPx{A}~.\'t~9 m}Yf>o btIB#<<|}KA]$w?7`$AGy42o!YFG_{\q E:ps0PFV>Vjl~ K^ޛ{6=P+vS} EBO 3;ւ> fBO2)NA8 ߢ6CP"c]ә^i;A|.(NKN\ ^KC%KٿOɗ9-#G?a&>ww~*kL =F }wJutsX<`ԺOǯ9ݵ}:? ѮT.!>?x%;|Sei/O8~=+\3](i _M(>1L%:D89OrAiLN Avy,=\vLzdm[*JR(/-|i37:zvu`)n!ZI$9tpӋȗLW3>|!Jߥzn0~B-w?ʉ)d~L >52Xr*xgdhnbl]!Į[CYF~yyR0l[-<ۢu|!ח~JAw.H`ԣҳ~/P'1$l/ts`Rl(E |N:,X~?_LVdgd(a4ߢ负ͷ0<:?߲)M-\m!~ͷ0>[~3%P~S!T!ow 4 #wEϭ>OtC{H!i3Y&鲝* :}3t.n5ߞuȃQ;C%㡒VƲ52 EsL 夑ԏ9} "<:FG]}#$1x` -щW$G'- wq.W 8 z'}o?|Ϲh5纠\|~<>as.kF'?zowV"6>wKn{BIsbYYEy%ͷVy^>W9H&H_PTz\˄n`D}nߗے>'ݯkN͝??GwR3 b bRDgKE, G>ꟁοAy߳߳h,>z _ HHzh^E˯`A"}/-7|6:G;sN_;?`D}n<VQAoozoߠA;x?{5|A/ sG>4!0A,>#G">w FG}CXqis;?ЇF" CwKWhtASo; Q4: MyndHtR$z?z{.yk_`Al9!щBؖF/[`/+D|~k@ \eoұ|~qbF4A|~;te&;)14r#:Oٹϩѓdn/>'"bσCvssi|L!_%D`,wAw'L/.9)6* _ZP K 蚐>^ ,P>7ШjCI)xY?-e:'D=%Sw-G-U9ϳkN}ʾZ=ɾ|+>4{,x͵8 9s0:Bb*LVPvMP(/ͽNm2c<ʹAY\㡱s.˒d5n>7G Es)܉>Fz/N%(9>}PfV5yލk0w[F3A\ym|κA YNgHtڠ|-$=]]>ELu#F^G[On('}ސ?-.72fjEC^V 5P7TlnaՆ xy\8kŁ7f~~WG7<5$x釣 e  ||^P$yP8gH$ 4H4G'D^ !G1 ' FBM;K2xC40ڐ9N4漡SsõXɷtS!>%ͷHi%̧u,I&a$V^$dlS~d\0JF~U=OcڂއOjO :4n-nzΛ4.i{hs LWϝ=twd-;Cv\siZ shf9'/MQx>4Zhsu( #w>o8rΝj7T&A9hڰj`&82{ /=M>FʏMK{n9skN}5)X1[BHfjlKbs|x*yIduL>MFdBY8:G _.{Ε'”TތT+ڵ#b1 xoS 껧ƭ)jy.W$ZZ>o?M!1iN6q>G}>-lw@ >&>7%[o<"j '>!Ck7f1!aH1"ٓIe(]&x|H#--s&<݊˦_X+^/|~sGIς~?Zwi(~oOFl1r \9Hså{Ӛ9!>dsrkH Z1NaծzzgD\5CL+c"pl"7gss=ޢ>"mxvoc%[xWGΙUnC|^G2zbԁjE>"=s͟O|1W6Ǜ˷.W\I(Z&%ꨱPd^4^*σw,2si„;u}^ftrɂ U-p@+F,˵)u: ,=OB,v[|PC-m(.XoOw?PM<nۦ[jԫ-O ZRs[XkWU*p9 O>չW;$wGͭ⭊$hu0CA$wXkavhՙPsG7TN2U2Nj.vDsI-$IvU?׼T֖MnOK5#Bj^Avޜ<24Dڑ~psn>|4n"χÂh}y!&W{C[5|QygqIE=s]jq9?K s1>O"'wCr'?[ |4 s;yc~"Ud[4gi:7|iAs.?N\Qgtcx~s=4L<"ܽA?!sL s9œ4{FTh9<4~G0㛯>{wzW^W^{wϾ˯Ƿ7AoO5|T:}~4z?y_5fP3?D|K9@.o5|QdA_||ϟ|K1:7=oawm?|͗_o8~-ɣܸ1#V@7j/ք;>^>P?>gG7_YY}M[Oo@`w6|7?fGgR-HFz:4 (5.;A2 Xx slU[vP-_2koc×1ɟWނ[C?O'qpCw! ƽvxtHۍ:>wCjyR* ߥ#!93>04?:}- [_{E-_9oP?g>9UA f)o>{ss;__9܎0_ X S$P:A__w+?|>ܭ^9^B/^q9ҕJ?A!0 tyq:a_Es EE9CF_y&+t}>+}Y&g^y#N}S>w@^~}y/7Xx<#4888D"{TW4K>v&ն hcբnͪT[ZOjH?Ac@]?ltI@w| j @:R F/|[EyŔz$ &5yxgc"tO@ZOP8CxauZe#EԐguWt9x2OPk(g Ն|8m ۋ<iNҀE:w|(|[_yc7~q!lq>9ܽbFO}IʼAG/n޺.oGy[y\GM.8mE^g Bן8 g`t ,|͵nNsG|ō]} KD)x5J18{ʮ?MR@)`v4Q4qdtR.q|p>o_<>~(>nsq^Ĺ2r,LWGFg}mMR[tJD3Ýǖ.*El[D qEEP.;z,|"n5 >oG\AEV*5f^~>7> IDAT4Ze @> 5>| ;~"{JIHCLOiJi,総Wܶ>'(y3 7Hi 绚ʆɃ9:WCDiy:{Kۜவt'ϛ#-j5\orV#e`Ni&/.8SaѩfF HpXT \L:5֓jJ.*vPũğjV+ rx#R- R^@!Z5u{׋K)"vt 5E+|.xU҆nh(uAp>Mҧ"Y)!IIC2J֡hs&̘1 ؊]:JkLRX: wۮ2TNL2]gy`'w1d;t.zJ$\'W|FMd.˴TuzA`-8s |)yѥalQj6>qjAυJuzWaUc^*1b}ܮ2DmD8(v+['ZK %9I aD /ijM\FgN5wBBYK%t<_i"5U&s}8 pJDaLE Nq,ܵ^Wb>f7sMJIbp8u{%9krc{F>2oM9%/WKCf8 aCƷm59yeݍI=T<|}j)|Q>)5 JU\|k侕8ƒ,.6O\>5y\n7P㥢ٍ\CqmQ? /:]㣧QB~j]k ]ߌ\FW{lʻoh3=P6l}W sqf*lsz=ss7υ q89g *>wi4LH\RKJ[]T~eJf_G9~JTVjωӜ>ы~iB…K>?73כ>x}޶U*z+ٞmCNkorK=]2}n/+/_~o-SV^2klӅbKE7S^s|0bɈdKf ˊd3[WUʟM̦_ب|;=Q^D\+.CY5)u0#ʟypʄrSɟDV_HYFo2|Kzmba9z!{w$ѷE-sD5y9_ϗh۟ ( FDs 64*5zA N۟p{oσTF. Z\0_8d7jPApߟz>#8\|hgf\|U ey3ě>߉$D>gHMJ0>GV-V%8@lŽ7yQ|~`|shLey |Έkyat/s2Rs|ėTiQ폋 T긹ߐfkJр<|֤S+:PS47fOp;ەRLePW/TPu|}#TJ(=2z?SjH:N91yң9Ğ, Cd.)uJo[pĄl?J|N y|/rNGOsJ؀{Ms^wr5n>Ղڬ6M&EZaϫ5B㛅PtVc3 |,^{'nɵoL>I>Ͻ\^]XN$JEOW'-zT>=-=W#VkKY0^"׫v;260sZDǸ{ upzo\+ZBKn/fF PМ9eA"s-5n6+jE?%#װAiIK{fJuDNss%rR.r㒧SYN>7Rjcӻs3ߙ"np>Ya-esѺ| [[|{EF~0EC; %<_f|˷02b?i`mςmlҖf aOkyV[7]s| /e>髓ys>7 9lT%{ m ^>7P0.4 Kug'CPŰI,n4WD!:%5i?.(#/,?0k;-w#sͶ(FGmdvDrs@>?|]}BxaSb/?b D+ȷ42E-茅_|nS\j%טk֏͓yxυ}@O7W߰D~+u ?}p{ 0&iLe  qFÆ>+J$\F@GKw}u~eғBs8AG;tgQC.: SQp\>7٘>gliySA ĝ-ت.-/; #08C}x`8`MlJ[-M skAB#:'B;>|GԄC6O3uQC%sz\T6$>o8PbCs>tG%XpxaM$|.y4R­ }^|)+z:G>w )o_q>t܅Ois+#sƚ1>ǣ5󆃁|,*Hi "\2vMo k[*\s8.9{=T1COp|trR~>GA/ (5M([ȓp{.5!*\eρcI j6W[q/u| 9.f ->| )Q7?\/}҅,X3Ϲm;S r@iR( {z[l5o.w(o޽2/?#+I mߒ/h-\8=g?|`߾%0CоUX۾.hOi\|-4Tdsy ᳓>~ ?Ɖ/t(UϏtWDu}ީHU*M.ؚ W߰9D4dp{R7e\ .(̶?I~{A^Is-.R ' Wmmmsx~EJtC:{%"ǘtjZ=,xhp*P&؞`aC Rka'ڂ}nRzȵ rt<.DWSI0XNRD!8+_%(bO:A4BbS-F_}YtΤi'ԐjLJ]GMuadRfTK^n9ݍsyo@^HI%U?x9#& Ĕ')) \s#1i)6sZ:x{u5sلR+dG?n kgy] [k>RF 1de9*8TqyJZ"$eIjʇC9`]XH|~/|sy:%/:Xsyx _ T+h|>WMz5N/:sH\Ԃ9>lS#Nv.{Q > ѩy<-< pjH",(ΰ M,{ :-u gѝSǬ691U$sy,KIFK.ŘDޅRw.XmsŃY%=ɴJ.d pݕ"r#crW[ 0mA5-* gϞ}>cv(?]/1?,=?_t G([IKϫƏ-\zbt紺ńd7e wCQ{/>]f1rO w:[vIo |gվSfUm])n􍻗Λ Cfax.W $`jw#}x{ y}/|53 ~~E%[j!}gY!{@@R$)b?p)nIe%"y3}9׼k!>?cb ͣc([C|wtl >_PwnkZ6Ci@ [FEx:z@=jؘUo0Z¯2o^G"m$)q}S9?<=X-{MS +[5ѳmjLmk1ܷ'z0UX͈䍝ukDjH~* ]W,EoP_][-w6-[7l]]O糧ʭ#-y.ʠB9=e<=NHz0zI-v48Vn^'T.Zt$hEZ꓊gF! Ճ*ҨU/hR5jKj.q ޏ}9O <NS54W˿BrWnoO8u+_ `g< |~{3ښsk=]5ɛ?@/??inyY}TslaũYwgFQ9'>8A>!z"8"Tabtvzmpiw R"H&S(77;?9o6wp}];6R4?_VM}a~:}fopfUƙ D>[ȒoݹmLx'%MJc>o!l䲺6xϘ]'g=L߸{+uϛ^> VB>ѧiTepi0#,CEԻ%aе"lpT3R47y[jT&b>GsT*l`ܟ=j/A9}U喿dkuSg?e-dFOl9ðz#_Dן-Mw\~8aϹA>/Dt@6wew"<2 ̣WHL\? 92}0g^>ߒpͽ0nU̩򢟹|r;gHΟXxё~ހŽ|EHF*j>HtyGLu|.?7?f_ 圎'Z@sns[Omih E4. 凑+F- ڷU0K| #}h:69N˕|y|u ܌x;#D׾EsܾE5N6Nc]vxryɵ|n϶B-p'=7DKg˨mPP3c2@m0>7W*'ss3ߙ"np>Ypj>Jk͗| /e^a`-4k 9q '>'}RTi#C!>|F>G6mQUl9sv[/lL- '|>>'C+TP4+#Bsasۤpy 90zTCyXΟz(9|>sw5oߢxK}0E5G _U\ɵs'vc>?xŁ<z/~ro>آmm?w_t~2vn>hq@Ez>tk5<@D#>N9|~ya y26fV߮K,ś~/VK|Wm6@^>_?W߷|xuQtQ)֞b7Q ߥOok|΃sdq?DW}㮊. tWDkf=ɷ0s9|>s9|>O `&GVb_3.oW->ܷs |)yѥiښQ[֯}Aߤdo8 Cfax.s OW^2*|8r4=v|: ?z5)Wm/WSzYݢ=\WV s>b ?K|Ί+*לj3ǞlCqǦ+6sl0Ӈz >>sqf*lsz=ÜOG0Wt̵uh2hŽ3z(jzո?"o9q^@UM^LR >KGA2ۆ1=Dљ&zĔ{Z|0:+YDg/>/]!j#twS2fG8ՐctzxU䜼6IDAToR,aPD8{z#q|Y/ *t*S Μas-t}L3G{:};b |)K}v*xCŬ>_R%ޒk}N+/BK#0%3c2nNS24/^ǜr,L`_1.8r UfĜU!'>=YW"oEWrs7iŒYC=6R2; ~Ԟ>wՒ+*B݉љۑsA׾ywbLfը˝*j~(N; }l?V^/[<;k>[V3i/~<̭m!EU+a5oٞKF{KsT|d(Zj~sLANoc#Wmdto!yɾ7UY ;GuY>/~%Zܷ }Ά !|~s$sA|]| Ϲ{&_G>G {c|h(>_‡<3,Lr9:)Z+JNp9~7??&.V3猰#)O0>VRbOz>Y۷[8 ZկNR>__.ʟ |34ӽ_>|NNv:?>C|EC=4b88$Hg^Doik=öO,%>"BoYfKѓD@R}K9>g}>70۷4y9۾r-e \6n/ϫa">[H>۷T58o^" 2o^d."}ˉxt@Ü38:\o}ڟwz1;8Էf¼^Xy]ʐ;k?5N* 2fLQ9 }DYɵ8rW|K߂cvǃ~qs6rL| t@h{ץ׿OLWd8W۬f85<{2%o[P5}a{qB/{q8 soHO!>ȩ{Am_AKf|˷0|@;*lK-H<<|fܹ"pz <9I,n4WD!: 9092l btFfS΃7Wo|fsa>!<|nN1 flip?0Z!Uw\|fϭT݌ڟ># &] pj>WHW^>|^jʫ!<~ <||>sw. }~cF\c~8+| ?LIAwPkJ\\{>\p_.@F9tm'ZϽ>:@lc2XdoIIsg;fSb ku'ג\c~ 2R4}~ꔹu)CN|4sR|L^e`6tgQ$~w>O ,|8|Gw@}{bsoK2Bc9>x#-c}oy-ۤ%T|>\σշn |\oM|Hhݝ}Kso?V:-s9|>s9@[>IENDB`images/changelog-icon.png000064400000000756150212007360011400 0ustar00PNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxڤKBA٣Q $]y$:EAgC=$fKAEr4xA9۝B0Ygލ켍)qFG $JE`_?  Oj}'%2ןܪa5R܂on}HSimv&][\X罞XucF?,,эX.ǔOaTkk zQeeu74]Tc}Zo=[_tD;$4:dGS[3+-ޝtd_KƢd>}?6gfdos,ul۾Wciw7oRu6lį%ǬA=ը#s%yk޵\_ 1AVM/hOsnu4[l[2ޏ*'? Yt5dވsmn7-ٴ=^4v̦;+x_wz{-eYxY4,2cڍ`nde[Xke]wMi k(w_"M ?e4ʿ"JEͭ%NEtב[^gՏnbmuM9BNGU-ZiL?qsY@=m c-uogMF7Y%}Ϫ7?c+ҩYg?vFixAzQ5VۅzA3sl+2k#v_6e>E,~zگs*is[=[1n)sֵ}_-Lz3]Z{CfCC_c߰s7cFe_e5}.^eyFdgeӦ-VIx㨗qq$b5]l2XϹܪ_\UMe-nuxMFǻc*utё[~WQ_\,NpŮ]>f̏F]W諱vK~zm]Z8]y 9~XP=z731qن׿gm~7ݐ? ȑ+yg7G 땹OAuԟXmXK۹vcSmi۫wϥmw*>;lK^ނFpj.Q;xlZZMm,l}V}/f'ϦϬdݴ<5~ѱuޝ{ X.` 1oemGeդ~CӅgKǣnε*{˝*w.G;a.mZZZdloJ_o=_"NRp[#"*Xg^gM:U#c]uDM{wO!~^=.mx-sKgtIO { Ih[=o꾶(]{3e8]_n]Q|?]lƱ(zDI8tc_/H~vmو%}YL.y$Vc^|lH%#]cdI;U.鲾~vzG6{V\,<5u>GcN'zO>^}ۻFR&LK?cPhotoshop 3.08BIM%8BIM: printOutputClrSenumClrSRGBCInteenumInteClrmMpBlboolprintSixteenBitbool printerNameTEXT8BIM;printOutputOptionsCptnboolClbrboolRgsMboolCrnCboolCntCboolLblsboolNgtvboolEmlDboolIntrboolBckgObjcRGBCRd doub@oGrn doub@oBl doub@oBrdTUntF#RltBld UntF#RltRsltUntF#Pxl@R vectorDataboolPgPsenumPgPsPgPCLeftUntF#RltTop UntF#RltScl UntF#Prc@Y8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM 8BIM08BIM-8BIM@@8BIM8BIMIZ banner 728ZnullboundsObjcRct1Top longLeftlongBtomlongZRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongZRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM % p Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?p:=VJ _eϏmnKT+@=1Z4F[k;?.Ժx üF9y}/u>mv&][\X罞XucF?,,эX.ǔOaTkk zQeeu74]Tc}Zo=[_tD;$4:dGS[3+-ޝtd_KƢd>}?6gfdos,ul۾Wciw7oRu6lį%ǬA=ը#s%yk޵\_ 1AVM/hOsnu4[l[2ޏ*'? Yt5dވsmn7-ٴ=^4v̦;+x_wz{-eYxY4,2cڍ`nde[Xke]wMi k(w_"M ?e4ʿ"JEͭ%NEtב[^gՏnbmuM9BNGU-ZiL?qsY@=m c-uogMF7Y%}Ϫ7?c+ҩYg?vFixAzQ5VۅzA3sl+2k#v_6e>E,~zگs*is[=[1n)sֵ}_-Lz3]Z{CfCC_c߰s7cFe_e5}.^eyFdgeӦ-VIx㨗qq$b5]l2XϹܪ_\UMe-nuxMFǻc*utё[~WQ_\,NpŮ]>f̏F]W諱vK~zm]Z8]y 9~XP=z731qن׿gm~7ݐ? ȑ+yg7G 땹OAuԟXmXK۹vcSmi۫wϥmw*>;lK^ނFpj.Q;xlZZMm,l}V}/f'ϦϬdݴ<5~ѱuޝ{ X.` 1oemGeդ~CӅgKǣnε*{˝*w.G;a.mZZZdloJ_o=_"NRp[#"*Xg^gM:U#c]uDM{wO!~^=.mx-sKgtIO { Ih[=o꾶(]{3e8]_n]Q|?]lƱ(zDI8tc_/H~vmو%}YL.y$Vc^|lH%#]cdI;U.鲾~vzG6{V\,<5u>GcN'zO>^}ۻFR&LK?c8BIM!UAdobe PhotoshopAdobe Photoshop CS58BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong FrDllongFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong LCntlong8BIMRoll8BIMmfri8BIM\http://ns.adobe.com/xap/1.0/ xmp.did:4ADF299DA99BE211B7E5ECC01B0F73A0 XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@      Z[  s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT &6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?c<|+ma:Н;mNTK(ʰCju=FDPZJ9(NXzOEw9>l;Dsّ61l6$难'0*eQJؘvPѪݳHN}5wiצC@aӾ66CԚbAa(8֠u5kD`O$SWH :mxnP)QJ鷦x#.ӟG#M>lň?sk>=@y,mjI{cBH'ӑljf>gٍ{m`aoE6'þ&>/h~!OՑf` aN?N6=$J1u8FI$Fs3H}_I1cޥecĵU2ZZ(3N5,ֻP=m$GO Q)|IQ 9l ^_,P{u鑶ޛIci$)O 7@{ϼ̧HW|hOϽ}P3M!ih k5'}›AZ|3Mۡ юV#că`F6 7jN,oc+0Gfxe6p^"uĔw 4ko`>k{VW=p0;ohX:/g#X̷`+}_56Cװ0QR(m_rۮ6F)އwYFVI>sk;(ܥ,%S^B>_TDj`%by8]N̽:^܍a0&Ύٚ[P{mrX`D/1m٘n@xfF}%n;53[m6Gw1}CSNڮtm/(ͥP00O\]NE2  #f-nBî3Q3">[}ί&r6$sAqO&QЮK2lf̝.>qI!oϿ9Ry{Z1\hţDY}dR9!7QwY ̨c͎' ]ӌIh:&p#:(֣^c{\s5!nk^q|i8TFUbښn\w]4- 1[1=<#GH85(.MS1/o#S9GPY7Nӡpt^hA9ZWVRr⇹!ћ_Xց'I]ː >ŘOʝ6=ǟbbM@`Kk,M~") mTK`(OQ]n8 g{ ?ߨ-sqS7E$l;Loh$z3.{f޷F 1p#je_N7?(ɧ)+$\qj ;Qp@?Zw|m<4$ҌNMzF;x w % c >ghUxԐlhrO疼'v%8jzzLix]6{cĞA26FA⢕2$͑ʋJhlh;|IUm#k^&%rF|rqLy?ܵ(KF޹G.s{:+hk@6NóaXɯ(øf?A# Rӧ#h^=zO-h@k>߯;P*hrؗ [j9Ns!`.4؃}NQno p(hF- RE:n zÉdǔ&nnX1[|O#"AJݪ{%e]ryEڝm~ώHזXEkb¨m 't%)sV9%!.׫hnq|OE_ߘ4fɚMI]Tuܨ4.f9bO8en{"E,gՅG*B9=/`,~K=)E65NF-!urq.=Np^'f73<6?TdKzaEOS5}_I.ZKOǻOSʶvlkMhhKϗ^g;~] : K+OR4.6(ڕVѵCJA܁.AJ]ܣq}98ySϺ/5N}.KH./V_I3F+: v|/h#x͋W[-gH ZQgv:ecxK;!BtZ{m RƍmFz~8D2:Հm9ԕFǮ_>N I>'H"܏2&cuq=`@ Z)~k7Z/@۠>'}ug8m͏TOZ[ nbM$Yᷝy1N@m5Oh52ⷰRg@zޏ>çA'N#zl%u}Vo!)yt Z~_oAռuŧ[Kqu\[kB$ѴŨI =v<>sǧT '}O{ {g;yr$Uj0ztI (9%@#{?Oմ<蟧M4G KH M 73ǵ3tq pSHpݧ80<rXo(Eѯ-X݌Oggb#yw;R{ͫbϗyH=#!~w}q8 vز}yQKO˫On$%yO懮֊щ  cC 3-Qv]ec(Q>}A9hy|o=~Z>j$Rtvf!Qn(NgLs*2'gݺo3Qj_V7,vrlqox$F;9X[#'J)w-|8_Kͫ]k_~.H~#bï2x{{9g߱ѿg$ @~}iZ廭wB#X -26h%EZE{j!(#p]Wpqdxy`Z+NWa=115?N&& N~4@XAL,4Ԡs6S'pȎ0+/+Tu0)ךgD3OڝFj8[ChA%1 ̱: ̋34']/oCCD$|_e=^chZ(+•.\ri?k=:xfkOc״ C4v[gW,L78.Z2WmmxenTUfπzmTwžo_3k>V6'h%"Z9I U]Hawއ;m6qEKuwøimpJt|q;?<S"sчg??YyB+5:0n;{74[)kqw_^-8gw?嶍P떷iJm`[~߻lwU}i}5C~!w8jNaXն $u%MT J,B] #߰v#:7'^Fu}#MD1X\JbFDbEymWM0Y= eYaҊ^s,Wod#Z1/@n)x,;7ڙGĽup}9<(vid:V=(rsqV#3yc2pXqzH5/=C46e-޼xf39#e`_k:^<'[*yUhXiZ?U*ѐ?HԶvbxWVr6F2y{8)Oyz沲CPG !dXCHѰ49}C.@c}N׵n"2.&󎉢ǫ}Q^Qa1+-T&yd7=Z2 II =ǻgNw~G=ɤI+q'uOD1";Y1'η{Ê'0gqWϾgg`Ӽi>b1"Knөu`9i8u:)b1)Dkq @ z#%icy=iNVh@$rA%*;*sb@1MG^{K|x"sy6Z|>a# ++?OP$}g<]gw\8s2;6ʽ?qɦ5]F-6&ч'H^9^/#U;b`#>Z{G5-VYCj<CcŸA~IPh:e66w]zd- xTCPQZP;{qv^39 $c@K?!~X~@[iZUu ]kS\^IE-꽭eV1=91hvkOLh{+>3v\!yqWtpV4ZӦ~m)d$7?jay = wݧ1S8ދM'Q|X]L$h/Eu;LEHsiN΄lq[>o46?ڼ\+Pbh9RJmҽmT?ќî#,qq,~gi+O"E MRjigiV+qĩqF;+NGW_YzF{˽5"}9o?&~U^yKoyuaxgYu9Y2W~;cgDt5񯛪͛?1**<1?{,$Ҧ&f_##] y5c>v;/*VEWMtQ9/~ayqϺh I%UKbFQP yzdbqbDG1}w^cUʧTk0s+i~sw<%cw{*,/ `x}! }#>s/VM؍t*ߛ2SoA $*j|Yc?.m8u UKB$b zN Ӈvq#Ϋ~[|sn V~_u_=.$^bkDZʸO>B%~&{kCp&+#uH=G~F-Lo~ =1|3};|{2Q?/%c$෕n?-9ݧeMvM6$iIJ6%$:.c'W|<!v0y*fD=p[W8FW9I9/䷚uO/.yi4Ρr>+ZF墚2'2e:xag`=F]N<|=8/ȽKU/&O+KI kY斮-P57?MUOe7nbhCa};y)h}׬OpGȾrѿ^\aD&[nQ;ViP7.҉τKy=/h輯op15u#|A$12 >hi'*N˲͋(c.\DpH9mx n;qq?[z'5vXm˛rC j2<~ ]NA&2s]G_FFX[}Oo.izvs.Cgw{%0,r Ւ0QViۙLt[s<u?3j;@yK?,?8|M~c~Mq%X b%x1'>,Ei@(3+Iå+]m~3Cx>>xw矴5y+]l-jVGG 6*T  nXN?y~ۜ14xGN󗜼89jjl5j]\"= BnG!@E׾xz=>pGc[H;B9F9xu?8#?1:mm=B6~^{ ǚ[{DRjRFbFz/o{UJW*Fa4GUjz=֑Mi?n/̭u2),,I)+HԊydh^Tx.Fb;?2GM+9f$|9}]~`IyE=fIMo%hὶ;kQF`$6#:Œq2\I$qXu2wqpRӼǣkiv{_+ޠIO+x"0 \@Uk}1KI7Ŵ9 Dˏe` A#OmKO^UezpV׋B&'rh43˜TѣF7}Luv}8w.~X~O꟝^ci׺ceܢzw;pD/|#O?56yS]&#.-i/$+mO@7e`ŌfGӹ1_Ώ yJ{􇖿~$>x-{<=!\2;;/!oiy˟$YkԞk!tO2OEP" 9+1&8 R6$rA##-L򯗴=oFխ|hz\vԋԓzqARVN]lQ12ӧRbeA[:,^PN+7 c6xtUTRs+G3 1r&D}̻.<ޭ`R֋R?݋Ic[iu2{ؿ+m mvlA,;Pi{O)\c8"v^y|[)kwnqF ?_\[C3;RW9vV&$.[:>t5xcXxnhm2Fk:n|N]FN1hƚ71\+{o,3WCNeK|(JP$ H_=w3c$&x=Ǩ>:N԰hx~NQ i; (;i蟗eּgCW>bh+E94b#1I?r%7O .Լ{6'tzH{@ӰbcǝH+H~V0‡}9E˿7E.]+ >D׭<[V89P0}k("/Ezs7gdR&wlѩN3Ǒ/coleӣzƒK՘c>});ؘ|/?<:s=GpSQiƖیvk_ m"PVP ?ݹY\{['qԉz#ӛ8,ŏ[f;htJZQmČh\F5m3 r )^Wjb%qWN)cnĞMN}2  t/o.OV)/4yv9f=CGAsq?[^ % wWуS+˰DhV?7/QL9k;,4~QZfi2۩d%ߕӻ;ȫTSg؍fi > vQ'˸:x8}ϝˏV/L}i6cU-Fe,hΊA,aLcMcR#^DŃ.,gp_?h4Ay%^w_BYTH[ďC۷N>"%sۿcC:VG|ͭ-bUViV21Zm=军1CVΧ(j,w)ݦoh PF`)^Mǀ8k=ƒ]^mP HסݝBhuR_37yO\/|>\-N򮫯Bn$-[{rdgG(w;_Szm 7!\ϺⵇKQɞ'(9jFnim?-ğ{cC! =R{p/Κ]<曟͍&Wd>RRީŏdnW'͌ao4?ǖv+\}Y0y^Z1nw|~_ǥZ {$]ϏDm\,:âc{_k6[c_1HX-M+J,1,%#G|BN[ I2w"Xr31+4|{/JLiǢۆX+A 5i_;Z|cQWuЗF$˦ܟ`-c? w7ŷ[s4"V~a8oGg9 T=?.-ۭvv/>!}_WhZ?D>/.,< -u]H̄iPъW8n#v}bBZu?%0˟VeioHgHnV3/a'ښXj|a$L{s׌S0& cwjm{ZW-,5R{i.+m5UI#HyՌTPW:E#6c#b1{C3'E[&_$M&j\<Ϩ[[}k%^UVE2*b 6oIv~(;2Aq~w[ѿ.Ycb+ghR FA<vsGr{e{C<O9|>'m55;wm# EK-F,vΧz85ր=: Ѥiy3=s~sy#̦Nv~eBi2A[?~fR'qu +u}_Ϋ)/ I{yvbw0[v#3;cY2R)nSӑ_>I;4&(dѵI`^Uh`x+(KtPa كGHFny2jl"9l18FZ/`kyʺޣcjZm^k#c B*@ qwo |~?\e"m~(+_v\.̗C=ó437œRN{WhvFۦàvgf8szO㶿=V)$̚AsoiIФ` v':$>2qŧDn/Ϟ5]73Wd״x\4<4œX<sk^b5Kt7LA[IkΊj#kA{,X;JR3d}8KY'`>M`(\iNsؗf 9X Q"w hz<+ϐ4h` FMKIKcfy\+790yyRO%Sr~^h[IE*6ڵ痜A۞.qn#S+m)86;t;9tRm7Sl.Q)Pёр*Gi#\Q76#-0ǦyKgq-ƋQWm-- 䖜$| i̮[M?f%A=+_ }9'~RʜgrSY, ʀ ƁP]_S{Ҕ=g:whkӹH^=X e܈e5w'DE 7٨R )Zt%l+='` |^<{{NlRysJS7ߣ?}gz(䞃!=J%m`HmzFцeYh؏(G2:̐Bi\}γ\% ?.3qag!9xRzP܉N<[5n6oT`Mzm_l i ()tnrV”ڠԍ_$K P,wCe)#rb):!&Ar) L A5rɊ7뙸;E:YIq/w/pz}VI?I1.ڜ)>uXfxï2/i^i+-㜲:bP+\eSS 3Dbd W-Lc/;o7W"͚ΫɫFֶDaR|sSٲAS:.f]Ew,kȵm7:x<}]JGm0OF:~b>@N57.Gv_ӿ(.5~kH$Lzbiemї}Wǒp2l ;+OL@G?o˯>cZDQ{k}% NR)r5:ܙ2Wp-4#i~W_Zhn+aOG^[:`qw#MO} m?0_~Pޢ6[=N<*'lv8g!dt&LIᑎBb[Olwߘߤ#E4%ioc\g-JjjPh_oCcq8I6I&5mFeq ĺ|-_I޺:.|ק:/d6vVŏd;{Opl.t~v3dx=Zhשcgw=tXE)$ES@Ϲ~YcCr~n~aR7YumUƇp7$" 1FWKe GQz͐(>׈O{ y`Asym,wmsm"o<,RHO$de!t8$pQuygsDO/~q~\dZU^&njG HdqKφC~WyфGG}vyw>IOx_\j0zBT8ZH;OٹF|'F'tS14?e?"oʟ1~\XC楼cܽ@߼ Y@Y`)E^ux#r{Km>q(y寝$<4hImr9_QaQ*$hrNlSOzcqx ]g@%E~q=rzn^aZS^9l`[?[N2ߞ;|qo/yiMECNO/<=i\>m[0=OU!7s<ޒ5Bh3`! Do[R2;m5 'pE6lz?v 'k%Ck*̫P*+J>1R|5e<99;U$y_vL֢^8m_U2DL|ogu9r. 'F*d/,$s7$k騦ᖀ@G%E9v.'חY6ǿ6j:]k:^= e%K/Z}}>! F7#W?{?<;O;{L4Il,,mA0+ ʉW,PlrvOfI+$n|'o 6C>jN~Ts˚o|F΃^ms}B#Nh2OlK؜:.,l.$<vݥZT"Lz'h]Ad?[SV2D}0[te/6w~v7s_r|!c嫉C="/iPZI i(w벽xsà4Z5:^H'e-,4E6l->ӑ sȯt|qɫYCuoiYdAl Vߨwm?4 Dql\f#C~8<^f bi\BI| ֝@KU ?Ґ"up3cnI~?-6],ݽ[44#(@>?^l< "ɼFbJ"5wG޴;'$qȊsg'#M2MwsL|?c}cM]~ͮ/ _=FL~cM6Zc6{+ F A!ASJ߳zN5 :{!5xFXƥz~e{KY?'h*s{3waj_өb?331u1!NhV˜ZuPXdjl#]ByGyu!*/Sfٶ}Η6j:dvik"^HYbB3E@ '. _.b;.8y|siߞ?7t; IMҬd7l]ieYq >#ivWg 3rߠy{ef2j`2)5ڡ~p/k ?1|MhZtz# ~//#3wk`֯ϧkWԒ3TDbxb}:~ u/G`t6O1y774?<':.֦QR-Vѫ0OQ-Jԍ.ŋ4o $:u}'U50SQ˭w9ji>j-.t;+/W6 GYV2? #R¿f:^v@/"k.:Kr7__QypjRٮ.c4H阞0 jL/ٺ1\FB l|V#Zg_#RFÃޣpAAtɣ=@_DzƏsl}@.[;Vhv5*ȮQOT+1Yc< lj={ڬW3=9 ;n[k>__R򞨍5ES"tx*)VjЕe>Gwpj58$h2["X2 IgVҿI2_CNz̘O ^M毘4ۛ"yKN0J.Kj7y8KQG?kF]tCV^y̚έ^44>Hܓ$4Db6y8TS\eJ9}/ ;9lWX*lܖ?,,LG%@]1KSDw~k\.!Gý 7ۜAR +to #z OQ!䲕|acV9*(vEWL5!A  AiP>7?Ac(>]Ϯ<&Ed$PoDk ~-߷fbCGLm: #]eGHuqG2_o'/47kV&ey S&tnz>6 @gw+>z{?qiZMɾ`򥖉49?1dy-oE8`CS.9 FM!v1p6@~oG.-8؏hG*U+JyVߝ94mZȺ~*hVH` -߫nD#Qg`Z/ #.,V 1C9O9(%wbjDtoFU9\H;$Wp1c{ߤB6LO]ya]z+ iW3GXYJNI{ݶFy?Z~~gq~M&--/C0G(|A No;Q-.Xs2?`tLS/Ə)Ͷ&iw ZE|!n5 $#bNҟkBF1'xI/fqL?>O<ǔj:JhHR̹ƦC4E =^飋Enc/ P>1S>ٕL|" )ӯy ғ'RPБ{0@ڄmKܖ(&d+ ! NH@<dwZψr0aZݫPV~:Cm5rҜ@8F{nje# #' 'r՛aLSMbѫ) Ol3t,p9 2px ڠwtUHIHASA8EKhH4퉙c^T) \̊+R:jsAyx(8:l{6DD=N2#{/UӸ-O(Pq e 1#EMRR};~sѵ GRj\Jm~SIG1u=t4JiҼr(ty^2& c;W O~q./,$w?++yR}2SfԂ2 2C$QF).L@d;S1 x$ 1܌6F[%n5f,X:iLnߞlZN= q;2rd?[1n?E(E cJjWV2̹'MLGY%R/DxgSDt9bi,l:H4.I R;> #8:=,N"#oTqשn=޿%N5My_-BǞF.!A#qz1 b=>9%TC qN* :lFL(l6VUhh6n7cwtkA ]zIj׋3GZtrjhJP` Mxlr'a.34)~py;ڿͧn&R\-F#`==7-FxdLlkg_)eءwPb=I+x'it6M6C{Oȝkɟ^LӸ];M!!'֭1^%T5Aؐ;nCSɥx?8xyƥZhMM7ͅJK]E|O8Ac : `Ap]NCp9#K6Ёo[/ݗC~]MPj#?DAH9 \h4G m~KeWEMO,y^Ztwpef RsC %~b G]I J#G#j}2ȎEx?8 !vYD88> sj__kQFC<<8OT'HrqY߉}ug$slA,Fro` }W8(pе /N{-FI5 Ԓ8ʆ @@ @ ~h☑$Y#CCO>y#RtNݬuM.[MF_йI#jwVRoHH.@B@M{7q3>]2 KsozBðI!ٌizfKJ+[XRLmrD"dy&ry|ͭ}[MPZڙ,y^A!$4C4x{s]"&v:AP 3qzQi>aԴO_$~mNG֜q @[WW[VjH;q r^YKDJArq#K b>w_nO1~^y#Ⱦy5m2N)-fՄ\Fv=tW&ă;vZ,`J]1_)^S°+'-jde:ЩPimv-^l8kŬI?7Ҋ+Mzͣ|$Xuiu<1 U+@R||6̈I͌rJd-:GO#ÇTO"Sgt_Lk-GIK6>RM HQ3c!o^,]w,-|e.;Cm"+ &`FZ3SٞUܞv4"_6e(49k_ Git:),r6mf,0}+k;)HD $m!;2s{ '"xsĿ]!7|ͧTk^ ͮsd[~e&QP#HI+O7e]|y]>h([ye[}:IN;1DCZ?ʸt~CRZm`N3י?85[_1i'aOYTF"[2֙xٓ8Epj rNi~=I'O.4A9.boyd0KҚ+\ip&.UFyeqo*E=&P[h05dx kkX0@w4GtǦr'=^.3n:0ķ6uKyC8b 9;[Ɯ`#MG0{?Q籴o;)*PU&s+ o-Ө0~007=ORhwӏA``ZG;|ch@j` ?bBAi`&lJOC9ڇa?K: #K-=mO 恼GWfqq?7a[ه MGf>Md *qZ֕Sf 9" HwrMFí<0'&VڋIn+d݄#p5ԃ~[gG}ϝJ>{7sh}dyo!0 mr 5(6o|mxOPuqO_%u{wTr77څͿ K0I Lg"s{PGkͧ,@LTF G+y]~SPH4lW_g殙(Ⱦ[">B&{yr$":ly*6=v ' VfǾ|8C~{yP<ʷy*Q.p`m ZV[Ojc1*#ݷtrQw_䷟ը~X/学nyWHmFkrr15E%3whg)'F=}\kі Nv?19)c2~X~Gu;˖:=g}~Tdd9oW'YHݥy8$LϤ2Z:^ڥ?4/횒uy*J( #)iΠ#R}_>GDgBCݻ?;ȸt=. y//z@] Wjf}6AG$"Sݴ~]nZ#9lp̳qɡ^cis[/_EįHRL7jt/hޢ~ggl%)1˼Ƽ/ʏο!_hING C!n~ĄƇ24Zgihr!/kG9Z~Ҟ c+<78yW[7"2ȷ7}(K1H-*yZn fDanx׉8IΟ_?B:^)\RynhݮeHh*Z԰mB}Qr@8k=A<׹wgN?ϚI"\FJxvYY2$mtɒ#1y͞y<<|z-`K}#HɌ?:=۹rjga?|̏{̓N^^9<?u~<(%|9I}{.G׼iӗ.`FPH+$(fڡO*9=~ɫ U ;=|=#@Ow-%<6yqT-Im'捁:69 曳0)f..R!< oz{vTK_sV{P}[.\'0>TP1ZrCɌTz}ii58P⁾{^~*G.?98ߒ<-ԱKdO$Uk!*qvԧž;q!Cӫɋ-ss3rEsTzRnb ,$iץsYt[<88qk3ˆ9oS2/VivZj_-Ϙ4E\\vOP# Tjq;G_]OeIc^@pHouge7䎗/oK2GSeߔh&, ]*$nH'Al{9v3;;qGjٔ}JIo1Qke+]3EMuq*|0گV(:f}vsI!d2קȺOY ?t/O˝WnEZyO猰cG)rJfDv ے:1\lo<cys۷/FC'KeŸIgt[erNCUٚ~n甉ogi>6CK?Izן88iL~cyřYM1$T<9F]#M2<(!#u{m9J`\//lt-'"2d1HKVav٧WwbDw[wGkc2>?$5y7~b򸰖+, Iƌ!ֈ1Xߛ(ОMv;SG=D#aߙ̊p–Ypp]K4rkZ=z#y-m.Ye@@G,:N;u };蝟Vk +S<-:/ƿu%H}clFdUH#}nw?/ <+NgwlSPR(X)+!`"(9NG꽣͒c!}uK.IS}ߐet(3Vq$ZQoMt]!w@a{K( (F|ߛvҞNp8QOIּ9/6m\KP]y2Ӑi2 nHʓN/hsr\Uˡ7hR e:'-㯖4ͯ͟ʍ^ o1[)NOhRPB$F4,ƻV_ܳFօfs,0 !zϒqo+ƞsA[o1F;!F[%JdlŽ*{DO|U]*oOlg'^%S+??MzYijjmգ!eU(yj6;l .Uu;m_l1ӝ~>ߑ_~ZMl8mU(RM+ p˴;;]Kc/?//' 'D =y؈΍H~E T=~evL8}?Nsg91;|o%~[qs+\:5ųW/osgGn) W,~}f}nDdcۛ,@ONIc~Sy[^Wo,~`z\KkH,T1B/>\A򍟐;]:+ 5Uѭ-X +@;qjgSZj?i?I';}wwz̼ 9ģ{%˽hh28| /4XOlSaJl\mL 7κ6m/EӬ~{=GeΗcif<)GR(yM BPԮ|FJ!BrIo `BSяK{KSfpI<^cOέKZ֑,S~lhD;'.)p qP4b.o#d _ >NOe5<)U\ǓҮ-\ּ{ȿ1} ?_hݝgC\֭'[6ւy,RBXjUWٽ3ɴ%`<稄cOBM̌ZGB;9Ns駄msd:e;[Y+Y&)L~J]O4_(~4+Ļ1v%BH܀?f1&EܚNk0J5?oW|ҟGi|?sZ$~'Xwj]/,YEi[- 4kH5$Wv.n.> ,q vڻf\uxL28@$ 7<“Ɗ(H8]R>USNYTTrAO& ogZhxሾ{: ߭ҝ(?I?󄟞WY'- Arv y_Pi|]oB9AXd};G\Y̲7*=?{g켚D Z.s}[WՍ忛 [gvG9S r7& WU @!ex#&*>nqڝ.8~¥&>zy̛ ZqZM0)J)(7v]S_C@Y6E`,7#~=LGϙ2_,yCIene]VI֬CW(,Ahvfݛ K [P,C.AHk_O6Gߞ sh"Ϩ\ZBC?Tsv6} @ęU%}ŲǏQ) чQXy˿XuR4y׌R->34jߜkCזٓ]Ltd8\-Uo'vv%/8? AGko/y2Һm:,0c+͛`WOk$+"#))ѮB&\>a=9/-?//^S0[owo4B9*{2!Ngyevp16, ,~8f"zF$ݾ9{/(v:mjvZAy7ֱ*#SB;r`9b@&Q ظ}ǫ5Ók꿘婴om/PK6<IIr4ou=ͬ)*^1ĩe/O|z9j7eKHKz&-O8Q/23B?k/̀Fc"*x(qs8Lb u7b\a>.N!I~Zˬy;5O.i.!ƥ{gܛW-7&@V!ȧ#izu&CcV,Bn Yչ%[0;2ZUX':-ɮW0vsubu1V<{}w嗖DG>ik?8l~w'C=\Zi$xߞ7?/<81XY;7zͽ\-NQ(YJDs=:GeFJ f_#V<-T+o*PSX~kk5u}FZ$WѾ[O+J%EP>U իf#شJ}; $ǩ=qYs |q946Xj<ɩi ztqs2pσR\mga`ぎ|bB <b!$kp)q:t+QLjt]a󜸥/kIwbߕ|9#m△fYu;8m]=iTeH(B8S 9@mPdž<8Z%~Ty7#SWu>i:י&HĶfO !wʻ_]]p)DGbNJɡPu=0aJϨߗ>Uo_FU* ?DØ4q}-Ǘ??hmj_\wzF&q-!wb `qEq1'zK:iyP?m=qs~|T_jsMwwoo!9Gwuߔ9s[bO("4[k.cE8Deȍ>F}=8wٍPM<ΫzjGyO><1kWO\Q2yK YI4 fUY~i5˄H<[{ط_&Z@ߗ?󍿔Zߛ~?2-4g-+)I SIq"/ 0vohcM>x"l{""#Zm82DO>I8g9i滖]+Olms2/4c"#'9X)4f/.L89.T?l4;1z[ɿ8M˛_1QE כn'VDc$1/2U">*qu]n8፺آ~7;'E-L;^I/#~gX?ZMEי|Y"KI][2+`t tq1F\=6](=;ʓ5'5{_7[O{@|èn;uOU'B#u- 0QPYV:x?HxvtFy,@(|y.hU -ϜC"#U'eF#Jvf As" Un6$e 3mcq{Eֹ}WK,%sQQ)O.lztD5ds7"A6j/;\o/6/(0O|ML:N8H"BsNAQfG'(;"݆\{T>- u9q){?'_\zfT\a/n xIUZqUTX}vSz)qF^F5ӛwjd3@q@z9 'nW"E6\(.MU{)ʽOMٺшq9.U~}Rpj07N+~p>I__07= fw2QC, ޜPqN;˨ia<8e+ڈǼn=`%B}- ֧sg얂U VN{ێ !P [r,zX^Km {R y /](-6oz|K%7ܑ1G<F]PmϾy3HbMz)_qS"P*⛊dZ6P-S& Lj/D:i~>G2Tsqҡn'`HNf)tc,YaCNٮz MJ}In?r(~nzIH263,(OnBS`36qFjʀTx3d"&.[0)BE: )A>qwi_7.~iQXu}ia1T&PE jws+vr殱YjiP@; -BQ諬ELB 9xv;O"$Si{O*4aw5?3 ͋E|foZ5LD ~'U,;e8I)Giy%@2ڳ[X d6gnQ@ iV<;u> gc<\$py fpm!`IR\:)p~+kk)lC?"Nթ,o&Z}=0cJFpTP4^).:j Y8YEk^pOg7T$$D^/4ѶSCrDCbtPO7/LT-zn+2uYdxL~S]<`ǝè& "|ɡZ] Biۮfr;ojrF"ZC}24&U޻ߜ0wÏ6)@GmTm]X}3JqiΪG8:w#[CHX Kqk#>cҫO&i fi.d|R:22vI {vm6)qL6c,O ֆSGUY9|9 8,0*Ԧl?X)BYS<zG#Rì''(G\pğ{m%>KU!=zQH w]26Z~xa&e\,cU&-&Frv`8#fd:ظ`{r=P6SӢq$%ҷL}=&fd}4@wcrY4 |kZţi h@lì9vzũ#bTnn'F 3v8F9 I9U5 ̲G" N^-tCr5UfCy仆faK$8O@=Kʼn2ynV# GZb9rLR{o&B*{1a8VFjSV9V=\$W3SO>4Z^Cs%儩5MGGBYHAp8Ղ7 }P֐dH1mYiyb]3R<6#jQIQ rI("?%.XOn<胿E&\/ o7!2-|٫Y:KZLD6jrff%`غ3&#d'яjQ<ܒm4hmu DHZI @;jW'vT0%9j)ARה#cیFINQ}%Tv̜Aꥳ "Fm!d^\I8S{/QIH]б>UQgcIBƞ'g8 _qLi,`3 )4BFQvMNj{rR87gǾJUZ 0&)Tَc`#iF.}m"Ndy#`F TbJ0 &k̾їKzcJn).P{mN;j1J5"J?Vda>_nӗ4̰yD,JZ4׷` ,b@H'xeD;*p+- ƠAzI-oPD)҄t#qDɘm$ J7n7*'^;֐l,G\O^'BnXoA}9.:~] xm+!XS"Sd[;QPPӦ%s/]v]7lKqwo|JGJ)Rv;}GZnw|(Ņ(͎T ^h wgEPx(yw HۖT 9t7 ??|SnWjԍȡӒcTv{G5-PեzR0n- @|&-kr((hw+ ݱMC6~C;@HO;wRC T72؍qfwy Eޔ)l_G!~*xԊ˜,+P/p-X=ڑw$mp)Ǯ0'Qe :z䁦,18Pyxn1I0iaePiƴ#'uh2<&o71XbW@z]jaPMSnQO)2"GaTYL**w6 1Pd<*jHj3q}.R=aZBݺE7zhB zo0]!!ڼkQ[cF ^"we)F["*xzay3[i~{|ә[ t:BAaW#} jx}G 넋8oB }7k$'qHU7\7|X]^O@.u$~,M/RJ Ri !1mxT|>MĝjzZv˜VbIWaQZAJ`0 SL#b8Ư"w v6Ja޵;Wƾ8XXkrAOǍ6o'Ѫ]養9Pq<uqZӍv0@j׉;NEгCA)c3 2T31(@A5'fV8La)^vy}hu<rGfcm+:oRv߮^4  L4F}"  mק!eY 1=Wp˿󔿙"qh?zmd%X[$ "$(q#6s'a@Ǽ%Q<,7Zחo}C7:k)I=EO-KE9|Ct [JXCV 4*EzVOGE8D ^~jHHqqߔKM n6w;~.zoiZ9*=]~Nq2z'ӷO0hu_w6uEȲ1Xu}?um]f㳹>lCe~][^}/HMM1K_}!$>OtyN}\ַ'oW'dyÿtWE=z>qXx=>ywt!'ɖ>'\>jnls[Wy~3`)u?g05f/}r!*K{?9Uy:Oɲ\<꾮\߳̈9 ?_׾j7jto_o|%:~^ G>[_׾WK/>| 2Ϛk1=9lt__/#_/?7kт<2˯')d':AQxL1?^{f/j d:r}=ۧӘ]Qgr/m?>l'ꎉn'ue_v#16?D/C:fF_c'?c=~si9CڿT9(!^z95}fc^_QnzXs'_tE_nr_&?CC{ɵto$̸}zbϪ`W/C YCOeL3wOs?u]t>du?Cy;u͔9@eaF !@~AL*\8ee7ƘV䳩6-G<ubI2}ryC zap1#]"`̺U $Ain]sgMk׿ +|g/w9={B$ ;8N2`$pÏ|#ͣc:yX||L~0T&?8If הbۓҫ8{EZ~.C_|+D'7[jIENDB`images/faq-icon.png000064400000001517150212007360010214 0ustar00PNG  IHDRh6tEXtSoftwareAdobe ImageReadyqe<IDATx$[HTQgqtƜ-# J bROEDC -( "M*z,ʼ889}>e=}׿idr mBbƂMMʠD"pxx8w鏎?S ˋ IJ>x9ܶ)jF\K]@1ó[U#[Nإhc%,W!w1e35/̷iI p ۃ;kX/t#9[qϻxZz=:'-fd]Ümҗ_²̼{~ͺRJ0t3II66jS2hШ+s]бDIf5;?XjUp6' yP}"5aVPA@pqۡO駁[מLh< 3/ˀu ^6J Pô04]Cq}lhMcˆhhc UЪ%UkE0umWˢ(k])s7Q߷w__f*V]u@r%%%'.>-f1G( )1Y4rxҋ%)3(O퍔{~9=,X K޳V?ZQdr*Jb1aG'?images/donate-icon.png000064400000006166150212007360010724 0ustar00PNG  IHDRh6 pHYs   MiCCPPhotoshop ICC profilexڝSwX>eVBl"#Ya@Ņ VHUĂ H(gAZU\8ܧ}zy&j9R<:OHɽH gyx~t?op.$P&W " R.TSd ly|B" I>ةآ(G$@`UR,@".Y2GvX@`B, 8C L0ҿ_pH˕͗K3w!lBa)f "#HL 8?flŢko">!N_puk[Vh]3 Z zy8@P< %b0>3o~@zq@qanvRB1n#Dž)4\,XP"MyRD!ɕ2 w ONl~Xv@~- g42y@+͗\LD*A aD@ $<B AT:18 \p` Aa!:b""aH4 Q"rBj]H#-r9\@ 2G1Qu@Ơst4]k=Kut}c1fa\E`X&cX5V5cX7va$^lGXLXC%#W 1'"O%zxb:XF&!!%^'_H$ɒN !%2I IkHH-S>iL&m O:ňL $RJ5e?2BQͩ:ZImvP/S4u%͛Cˤ-Кigih/t ݃EЗkw Hb(k{/LӗT02goUX**|:V~TUsU?y TU^V}FUP թU6RwRPQ__c FHTc!2eXBrV,kMb[Lvv/{LSCsfffqƱ9ٜJ! {--?-jf~7zھbrup@,:m:u 6Qu>cy Gm7046l18c̐ckihhI'&g5x>fob4ekVyVV׬I\,mWlPW :˶vm))Sn1 9a%m;t;|rtuvlp4éĩWggs5KvSmnz˕ҵܭm=}M.]=AXq㝧/^v^Y^O&0m[{`:>=e>>z"=#~~~;yN`k5/ >B Yroc3g,Z0&L~oL̶Gli})*2.QStqt,֬Yg񏩌;jrvgjlRlc웸xEt$ =sl3Ttcܢ˞w|/%ҟ3 cHRMz%u0`:o_FIDATxڔMk@'$FO6*-ҭRKRWA_S-  9q`jK$q{X(003 ]6u{rzvR4Lv=qDX~_Uf Bl6+B*d2du)  y8^SB!EQa8|>T* blz-IY pV=Rݶ 0 MEb{~_N#^ JMƛ[?W\fFPpeoTL&t:|pc&P IENDB`images/user-role-editor-icon.png000064400000001543150212007360012645 0ustar00PNG  IHDRS pHYs  tIME &B IDAT([lSun=֭MAL D`H xI1G_I1`H %!X7{Y/]/=χ6,;c}'-p:!hp!oPJ~O5 ɞ`ūzZg,`>!\.3X{LԎcmI[7kc}RuA{dtikS;>\׎)5'ȹ-#$4h|:>3{L®|j2_t:Ck1kB/[ #JM]DCբbOȷ,2 0'6L* DN.?Fw`ڞP&:2b`:A`k;݁cwLxW` 8%W.$)B h]MIENDB`images/ajax-loader.gif000064400000001241150212007360010661 0ustar00GIF89a̻! NETSCAPE2.0!Created with ajaxload.info! ,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;images/remove-16.png000064400000000743150212007360010240 0ustar00PNG  IHDRH-bKGD pHYsD$D$@gTtIME &%gpIDAT(mMjA'!1ZPTD^k(D7.. H{Cu&̸k)zW K89!kb j#a5"6zqnYɾjziZ?Oлr=m<S[Iol0GaS FRa\M3O9Eڽwk[ [yj\Jix>Ytw#Ľm IENDB`images/admin-menu-editor-pro.jpg000064400000257534150212007360012643 0ustar00#ExifMM*bj(1r2i ' 'Adobe Photoshop CS5 Windows2012:08:16 17:58:36&(."HH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?XKGaT2Ȧz4~ѧE[3 =cSeyixhcK:ͻ~Ǧ mtc5]Zޖk6nuu`~.SZU7&+nEn?{{vkK=\7^ 5c,k,4'!Z\5#/L!/T h^~)H~\e_,L3UpKҫ~ߪ szCi{,wߜlͭqi XGb9||9Rz1f)~~DY5~~ѫ[/;7[8YH.xcin9DB@ʫVW7 z5~~VEl~UCsAV\4Oiwn(ebDHc8¥wqb4PG+oҫ~O7fEֺ ;?KlFeX]ս7cϊb13_´'o4~Խ4ZA>tDO`P4taT*y h!FPTDPHQ*kGG dِcٕ[SQ;3 Qش=do4Ae9xtI%elkR˃Ask['@WOf}Ys]C^0Y~3ivC\B`?3^8p|| >lVկ6mUn'Wcdf lfaFC= ϱqVּ̊f4Yl5 ?# ^SX̉?6\MsȄQ8.G%/?s}NR-jHCxm;4DAB4N]>z^7Ե ceb D: kdd(\Gȃ&6\F1s8H Gyհ(X7SkV,{FjWޓ~"mwޙ 1ꟷI&%8F?xw~/MctΗ~mmZWUT*7d  k b,#a)z˔0TxI7.~o@gJgT8$fȬ0z W` 0ӪpfuݮK 9Ԥc #_f%R B=1k[VYs'o^;s[,߿ڇBۗFmm7n{Z܏b#"c(UGܦeQb3@qQqa%:YWzGߪ}an=M{Z T~&Q׎<E!9Imu:OpdU[d7m~nY.]Vm$:Hݵ}?h KdIb '\:<|_m%ѫ=['v}ݏ\i8V-8x}%Y``,au[SWM~ut{,nQ߯\Hwi3y?Cc/qU I qU H-yPXu?Wd빖z?n,Ki&ֈs4kCSbfe^nøWcX xGծ[~bzm.Ƽ㶧x~׵*Lsǽ|̙0)J1۠8>ꌲӬƷ{iSocU_n,԰jŲS$nipi&]>7w;zfnoPs~kHlt  }Hs{9ɑÐgquis8Lg1dW?oޥհG?+ŭcXgW'I\_[txo׺l phVcMֳMTud\쌋}{.h5% sx@kon\oYec<>u.%??+NGGa)64 HfafWl5c oI#ᑉohIsyMרĽrH`3c#?\VUNc˚[q^F`[eutI ccn5Q5>qa}YhbSe{C^8̱KI@!A."|8DQ"+(JzaթRf FgEM[Y'~:4PA kw9 6%c37779N3KO}o3]s~)z1le qdNְ㓄\4r\]7NRT5]3mV:}VKF,뺧Q&o)n{?G؈יִmlޤы(8!r"yπ>#F\?,8c2_ s:sK =Mr#^;-1xYUk^*UNNmu?i[mo^o}ScvZq{we:XrZGYψr(?Ѿ8Kst.%H'瑣Լ?ӻ-j`V<eߪv+opC 1}/v3αӫ׵m<JUwNn6͞2 Үa^wYwlkƞ"u(Xσ<`MqfDŽ(:>:UMmv=}h3vLY^yicߵާn{+sfKK۟Z!~fyȥv6Ouhhk]~~4 _VLd긫 #:lԵ׼V ֻۙcڬNfj;эu/k7އvUyY+myzn c:aq˜_U\~ZxYF"&2(GumyoHmUٳ~kܧKq5Ř;[3ժf%ұ쳥,V469wU{?E2e.-ocT'w,a2x%>_yuTt; }oqh nֺݖm_}xaau [eZAp}J]>0^1YSlU2rnEY^{~H +%( 8-LdžNCzN)h;ZiO6+Wd>Vׁ#T@>7~*Hv'[-;R~sQđ jE|䆀c<'_;Sf1%ͯ$Ahc]FVe:f% 1s:C>WڭU꘽m[۱i{e`4%̫nʘ~;]3u 1<>vmw=yn':e)T9 'c/x$u}T֋)X$zORmv&GJkCֺ_lo-Gÿ?f[,YY6HEo2?3Wջ[]SAfd]}/{ӌ o|Cc?))eᏵ^ki&/ٯz}CގQؿոgCϊ'HoKR'g%fccj&~U!ځsn{{_cO܅\ ;l[;7]˯m"ksW^gqeZZv~7eTၒP>i'Ùw&mU,`{$eE}7v%xceYu` uv3Y4@&xlޛuź.ݺ;,cv~sΜ{ss]cC%~ 7\Ovu-M5eh{cU2͟Dg#nv;۱@ຫMחkokߔZ}9z6OLN}jkߒ7g;O fPnuy5Z:==V[_wE4v #JOon&u-ŵPbuk~Vӝza} 8dlݳ?_׷sY}Y3s(xVWoo[齬r7*Wӱ-* cuylmU_A]+ce>./{[갗l+U ;CMVeߪյ~~W௩u컩􏲜.ssۼSuO.V^.&+l*,-ջpcckgժln 6eَ'B{7{13/*tҲAW[o}ht^a)j mյA̼wfscAkc#fسU,%E)t.XJ\HF[]Q w7pkg_?6xѱ5K_ͯՕP خ_c3nY7;7Pm{~+;2/prq1ߺlsٶ6 7ZYM<>,D;^ϭk0ƒqH>498,v^#jyW ]7[gvKY!][v儣FUS۴F܌gVmm+Z?v!j qC,,nml7}$K(umo*` aw7osJ9@JBt#8>o1vhScAXCKP3c̟*2gc;7[8YH.xcin9DB@ʫVW7 z5~~VEl~UCsAV\4Oiwn(ebDHc8¥wqb4PG+oҫ~O7fEֺ ;?KlFeX]ս7cϊb13_´'o4~Խ4ZA>tDO`P4taT*y h!FPTDPHQ*kGG dِcٕ[SQ;3 Qش=do4Ae9xtI%elkR˃Ask['@WOf}Ys]C^0Y~3ivC\B`?3^8p|| >lVկ6mUn'Wcdf lfaFC= ϱqVּ̊f4Yl5 ?# ^SX̉?6\MsȄQ8.G%/?s}NR-jHCxm;4DAB4N]>z^7Ե ceb D: kdd(\Gȃ&6\F1s8H Gyհ(X7SkV,{FjWޓ~"mwޙ 1ꟷI&%8F?xw~/MctΗ~mmZWUT*7d  k b,#a)z˔0TxI7.~o@gJgT8$fȬ0z W` 0ӪpfuݮK 9Ԥc #_f%R B=1k[VYs'o^;s[,߿ڇBۗFmm7n{Z܏b#"c(UGܦeQb3@qQqa%:YWzGߪ}an=M{Z T~&Q׎<E!9Imu:OpdU[d7m~nY.]Vm$:Hݵ}?h KdIb '\:<|_m%ѫ=['v}ݏ\i8V-8x}%Y``,au[SWM~ut{,nQ߯\Hwi3y?Cc/qU I qU H-yPXu?Wd빖z?n,Ki&ֈs4kCSbfe^nøWcX xGծ[~bzm.Ƽ㶧x~׵*Lsǽ|̙0)J1۠8>ꌲӬƷ{iSocU_n,԰jŲS$nipi&]>7w;zfnoPs~kHlt  }Hs{9ɑÐgquis8Lg1dW?oޥհG?+ŭcXgW'I\_[txo׺l phVcMֳMTud\쌋}{.h5% sx@kon\oYec<>u.%??+NGGa)64 HfafWl5c oI#ᑉohIsyMרĽrH`3c#?\VUNc˚[q^F`[eutI ccn5Q5>qa}YhbSe{C^8̱KI@!A."|8DQ"+(JzaթRf FgEM[Y'~:4PA kw9 6%c37779N3KO}o3]s~)z1le qdNְ㓄\4r\]7NRT5]3mV:}VKF,뺧Q&o)n{?G؈יִmlޤы(8!r"yπ>#F\?,8c2_ s:sK =Mr#^;-1xYUk^*UNNmu?i[mo^o}ScvZq{we:XrZGYψr(?Ѿ8Kst.%H'瑣Լ?ӻ-j`V<eߪv+opC 1}/v3αӫ׵m<JUwNn6͞2 Үa^wYwlkƞ"u(Xσ<`MqfDŽ(:>:UMmv=}h3vLY^yicߵާn{+sfKK۟Z!~fyȥv6Ouhhk]~~4 _VLd긫 #:lԵ׼V ֻۙcڬNfj;эu/k7އvUyY+myzn c:aq˜_U\~ZxYF"&2(GumyoHmUٳ~kܧKq5Ř;[3ժf%ұ쳥,V469wU{?E2e.-ocT'w,a2x%>_yuTt; }oqh nֺݖm_}xaau [eZAp}J]>0^1YSlU2rnEY^{~H +%( 8-LdžNCzN)h;ZiO6+Wd>Vׁ#T@>7~*Hv'[-;R~sQđ jE|䆀c<'_;Sf1%ͯ$Ahc]FVe:f% 1s:C>WڭU꘽m[۱i{e`4%̫nʘ~;]3u 1<>vmw=yn':e)T9 'c/x$u}T֋)X$zORmv&GJkCֺ_lo-Gÿ?f[,YY6HEo2?3Wջ[]SAfd]}/{ӌ o|Cc?))eᏵ^ki&/ٯz}CގQؿոgCϊ'HoKR'g%fccj&~U!ځsn{{_cO܅\ ;l[;7]˯m"ksW^gqeZZv~7eTၒP>i'Ùw&mU,`{$eE}7v%xceYu` uv3Y4@&xlޛuź.ݺ;,cv~sΜ{ss]cC%~ 7\Ovu-M5eh{cU2͟Dg#nv;۱@ຫMחkokߔZ}9z6OLN}jkߒ7g;O fPnuy5Z:==V[_wE4v #JOon&u-ŵPbuk~Vӝza} 8dlݳ?_׷sY}Y3s(xVWoo[齬r7*Wӱ-* cuylmU_A]+ce>./{[갗l+U ;CMVeߪյ~~W௩u컩􏲜.ssۼSuO.V^.&+l*,-ջpcckgժln 6eَ'B{7{13/*tҲAW[o}ht^a)j mյA̼wfscAkc#fسU,%E)t.XJ\HF[]Q w7pkg_?6xѱ5K_ͯՕP خ_c3nY7;7Pm{~+;2/prq1ߺlsٶ6 7ZYM<>,D;^ϭk0ƒqH>498,v^#jyW ]7[gvKY!][v儣FUS۴F܌gVmm+Z?v!j qC,,nml7}$K(umo*` aw7osJ9@JBt#8>o1vhScAXCKP3c̟*2gc XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km&Adobed@ O   !1"23056@#4$D&PABCEFG !1AQ"a234 qBRb#56Gr$uSdt0@Ccs%vDT7EFf !1AQaq"23 B4DRbr#Cs560@҃tSP$cdE!1AQaq 0@ L PS EL 6 *\P"I`c©y"a/Y,J*l:ıNXR]l%]]0 ^ 5^pc~~47%^H35:M|)5~&v[nG\HHla_H\gs+w%voU<ӻԏz ~)ϝպ"RqkiܟiD6?DGj7f>r޽">%:#cKmbQݤSH_y\)8.O#uZf\8ndXQUf0~bNHֳ ۟w   @d#ᬗǯ[ AQv o&22 @ANJURtD  §ukXR7i6o` e Ed2.: e^0`Dϡk2&싅Ll@d2E6*ۚ €L aL"j&MjГϿ[.MEc :#k!o `e !š`MU4EMU4ra@=![O; z9;}Jݖ79{&еg o}n5`tb+w/Q<#t4#뻓†bppi]HQ*'ifC[nI5mvR_PUo5M|nqշu֖VZ XGv+?q9o{#Zg:hb7zSby<ߞEzߞ".ƶG'XQLyW%;M侇{r'|Bbu¬e9g6}(뛛w!G,RN#csv<~i4'o?{OY{:ٮ.`0YX_ގRGl]W˰g GAtGAt0GEt0GCt0GEtpGEt0GCt0GCtPGGtPGEt0GEtPGEtPGAtGAtGAr? eYG_l\$.v?}n6$T\EӁ{%J$2ʷk]xnEiC)ōIlGN%5m".A02 j4wo9VVs*xg6SS6R<b2(ݨd2zUr58'KaY̱y4"cǙq/:obNj US0y? YÕiPu`Pפ>hhZT]5|fuT3bBc>KznQ70aN!MoW[ƱzV7u2bx9~[YE$T^9xf'k1_RA ͍͍͍͍͍͍ ͋|~ MUQ"RA~gG_4% ̂W~,gc5LV[܌LS"ծWTO[FME/e+61y-6TKaȔ3'C{yJ\Vhoj7FRԲH¾%l]s|9طR<[5齷Ӷ8TEHv3iT(.݇32HOM]^Kq Y;U77X-ߗm\|F5 x~1{%_TWjCMyk3e(b?qC%[b0Ja-6< 0Nr0;W1'>ǔʲ!ю;RK?пo[eq&Պ|޿]XȨ[X%[nFOWm+Y`ϐ#_P#]91 L$b)1wY ",x~WDT8EM=Nj%;g qf\k[ue:kŇVdxi:|ev ;h2j/[mnhؑ@cQ+^$L$~B D}: C1 Q0Yq!aF _#R%&b?~1!$*# \cb,vְu.t|Y IQ>Ii& ڷ1ᚬ *0 0|&Γ 0 %B#ř)Qcw/ձes4$1sU%u.U"nG9S*'}O.\sʧE:IS'uf|q hR֖9 %B,]ֿ MIT|H+<:,; jn/%xJK89H%qS[T3,AFW=#"^z ;j4RM%Dmn9x伆,!)0M-&3ssIf=tށf720IPJ<+~LJxzLJxzLJxzLJxzf71()AJ Pk޹NKO Ж#(!@SP 7UH;%ФF>`(Gfvz@t)ӃWR5$mͮIG1>_>-#[XvW٫nǙ%Y< iͰ*e~ֿL4X#JCi'KS%o';ϫqi;]D?~Eʤ 0J/<]\d&c> ?Mi0pfjA#]^Ztz^LkLȣOVYeYiI@xu],ygX?[~HmS+*Q&$FRT^jxhf҆-̨fdĐCSGq]<ݬXx'liBMJSj%%Ej3?CE6#͊n͕jV;7(jcS FUt+: à: à: à: à: à: à: à: á::::::: ã $cbFč6$lHؑ#bFčR6m HHQCi hCBІ6Ci 6\ԞS89NS89NS89NS5|j|0CU|ZA1ҵ R}Uwc24~Y̴AL|1U`I"|YˌՊ\KSoS2jdr--x!\VC Z~_HP^1FoS~c~Dj,SpE۱r%퉎2VF:zL"3 ҔҤ֛:Ce9e:BRzI5:F.-}<2fJ 61+%OYlvRgvE*bJ+ ۱rq1M[JjLJvDyrnM̖XNnKrrrdf*c> 8>r>GNDUA8oZ :@)LJ8TUdrTr\*+$Ðzp^jNK$OHyfț):-S)# QD՜9k3c ~CQЛۈu/Xe}ڼs[6_ig:O)[G [+n?X&}u?Xd %$1lNqZP ;(%)x U%DSLUDX:"3pn e\cdeu]r2Mm&//dL>Zl{̔z)r~t5.UxΤ'VN(Mx-$OQ}NFְڭ+:2߾i15?S-Injx5ӿEn912M%M!mgdUR'G\}|7>:{G\d+D5mY|)ߥ ?y Rz/AY!-j  x']{yI5z`4l~qk`h4lmj5jRD kQcK aZEK.ZnRҔhZhAIR˖̒Ѥ-Tj[|풒a7O}1 O?@GidSRɇ#˃`ZLLLE]۴2i9t)cSgRX;\UnNg%6kyt 撣Do1r-m0e1jj/3ګzLU65 ڈIMX^ɞK9# SյٖfaS96[u;e3Y:VE5H˂>%= YEf[T)ݨIJcZՖԒn]:Mo!Yer_M! m2 vPP_®͌vr+VptP:uAܾ=ڑl,g~U5&ϞNwXǮ$"T pUl^9r)h-6dܚk(DyX\jk9M=r9ޙ4ɋ"#(fmMoy4~a{(D\䝶QtXr1z:ʫZ=%,´c4 oUerX[& 䲾*L@$0\.*ºjl8N7t*Y&qITVA>4)vqoN*L}䙄oYT9*^~뚪]ȪbL4ifۋP)bv_=#o"Y^Aa&l̉/U =>1gbr[]}eLXbNGc9o;V.+H3 hd=6(hzh`@^m=io&K) D׋hӸ7 hM2V!y ~4Hgnc6ֆ-DJi| 䤴u_y獕tSCE4hKrRZ="W s且mTܝA|Tz  HLypJX\&ŎmbWkSe)G&QSf)q;*Wf2t8onQF\0E5ЏǻB""I">I>Dc\I$A[FMP/.?yiƹmmoomƹkƙiWKf/@j1??g-ىxቧ0iБr"Ѹ-MK&zSܠ2ChL^2՝o#\YhR8eIh njCo{D"2"{"/41BcS~q3h$} JٙlQ%t%\\%mDd6 +d&6${mF EĈs#Ap?w//Qǫ1Lzǫ1Lzǫ1Lzǫ1 LgVmr`*>B!JQ 7s0 7oPޱcz(;[+@L0` #?>g +;6duXց*GHi)ct ($oMֈ[TǷCtj:Y ]*㋘y蟂Z|ex-ʅOm|[!N:cm!3>9mu9ozUlxpnEV׽lN|3ڛX)Zb `,1x+;$SRML !x"zu;\ 7Q/wgUA0wU RG.v+ " ;LN8FlhYUgJ <[Lw6cC44^Law$vhtqS2{\#aaʪii 8qbv2r^[R$9ɵrIˀmqS˙6_(50 / ZK&dIMh>3-Ln&tarf TqU@0`6PR'GgvSo9LړbH|, Dj5>X34~3x9o+_eQ=Qa'.9'np l!*"iL`f Zu]T̝Ͷ.b{@܍Hw9#ǵ~XfVU<ZE6u'Iւϝom3/:_7OȈʤK Ӥs#i8 cb0}ruO4MG8,irL2F.DɅkf*Έ2stِlR;F|'4nAZ&:4 -I`-*W;S6e3tlu91'VHL8Am ދl1RzCe}LNtp6:}%cn=f0ٲl XIcmkY"-Y+&NBΰlALgR7j_޹JڹdG+нNo нNo нNo нNo нNo нNo нNo нNo нNo нNo нNo нNo нNo нNo нNo f]I>‰M9o%,rW%rW%rW%rW%rW%rW%rU'[;*z^WR+z^?};=?zwwu]>o$/vnԙn3 ˑ8rg*Dٮ8UKPC.К3v].dFA1^YRUTWL%+]u}$gqB]ɎuA-hBh[K;]F Xce ?aQ O|yGVxDYLb"}֩mtև21]Ls.|6cgkqgS'{[7$ Z@Tp3Sf&cf<]?mJuΔ6cG1?LS>2]8w&`qw]-RYQf`2C剟+>WJ"f-l V<\T6Sg8R*`⋊m8N19>l8afNM3fֳt,6tpᅛZ8a caeH5qt U9YI;BZ6WΗnwc09ڐwɨ;wwui0EQm|oJ1Cv%@ݷS0ҹnEc; (WYt$/S%<.zTL1-cS%;nKKN꣚Ǽp{Iذ6;ZU(wv<{0JJt^V D7NBIe};;:(ܵL{TOKfd1Ʉ)oDQQ6d_y5Q੧'7J9 V ftu4s^7|6؃Tk63[  qq#xSq6AΜWŹU3L; MN:i$B%ҥXrfAN6Y@DgE+mh:WvKLo*H%6CDH|F ҦHxcaSKRAưc^c5Xq\q*Djl;{N.tTO&DKJ Nv&Nse<[waʚ6OqT(wa>9 Au5O{sw;绝Sj%!ָ.v<'n3.v<'n3.v<'n3.v<'n3.v<'n3.v<'n3.v<'n3.v<'n3*z7⦘؃;f)߸[(7NRe7J2%8a$W=pM |L"۷bmynX=unbv#_Y-x 8Uc^yɗUDL"klʪ&{`6r'VOFLRн$DFŜˠa)^Rfw?-;;'[77}L*2LFKIm=fřaeOOG4,eU1c+OegR6݈Q+f⨟M½\OLwΊi+:(>❳v@bvsn6 ! :>n23}/ENPS7J 5ź5snFht卨vʛ-%)O-v*aXts,S*iCC9wEM?cOO6{11/ӵ}[ھ_Vvr;Wչ~ܿNn_j/ӵ}[ھ_Vvr;Wչ~ܿNn_j.xj1;xN;˒W+r\W+\E;_P{:uWd^ƽ{5KWa^½{%kײ/e^ʽ{: ꗃm/?I5M2&0׵vę1imź\ڞǤ Km+9%a86X,ʇ䵭zu[ UG1ҫf qϻn }93ef#9]U.U4bKL ~m@AFn1v#u;Od2y-`YI3dxŖU5-gfSՉ|0q6r'|~ܜ>dCYh`b*\tǗx?{2aىXʍwvߵl] v1\A *~WTctĩ_Sҿ~%O7JJn?X+*~WTctĩ_H~%O3JJf?X+:~WTc4Ĥuҿ7JJGX+)ctĩi_Sҿ~%O3JJfWTc4ĩ_ҿ:߮z^ս^Հzw^E.t\.t]"Hk~(1_~SiO}r;\\\.O}rW%rU!ǹhj˥8 K_6n\;*|2&,v\tP-Ut$ٴ@tI;iSKпX soutF<큈ß*6Gd\j PQT1~S9ِΰnFPap)sG! L.5Þrߥ5Reϣbm9rjZblΤ .u+K,lxlCeU 8 h}n{Q4 ˴6XpamoV ~+G|&ȝzbH]MU0|B]F gG%ճ`;r$0|y/S:KlGJqL\x8UE)wѹp,|C|o)ZP\ٿѤwM1E vSC?q}>Yl^Mf*|nF7G8NǾ,33nʧ6ӒOLLYs}tҝ 1 AGe95TЫ}+\v e=0~<`:?2l5<~q׶:˝J&ZpϮH"p2n7t8I1x.ϯtS`Devpt8J4e<C]sT}=ԔmpȚMiLB:7!SݖI#F+0-;=S7EsU2\əie0n""ѹ7DB K!YJMܳQxЫxu{,UPtGq',!|71+V[M,ZwdHJ7I R'qH.(Rϒ4EYJ ;g>]&{9Lܗ8͔`aq)%feRQs@ʘn^3Sj ~ynD0?ʻNbQ%momی)cavgN!%$G&Hxe>bգ9po5[)"+%Zſ6>Dx^wʭqW,k式^wQ{LA7?=.#ΦU˘"-D04Q&Q,smF}KO2YCZ||B{LkN%7;9:J*_9萆!wljMtcL-0QkKNN,3x͌~ d3Isk%6`apu}7YR9U.AC1F]"5)I*tҍ˖ј$m>w9^!elݭgq5w5`ܬ#;GWd\`;.Ɓߺo|kaЃCkkpl!GPšL|t\Jڦ|AW}Z;YyN0Yisҧ1׵r6hN:6g ߭tN96T;̚6G}C\G{aB9؛#ފ]f92 S>QCjدX*QYmU2e9-sݱ}ry #n+80pnquX'Oc,$ ˝PކtHkb !$'TzC=V!5_f{S,b!neTL|/u5m؈k۔)ple} ԕ8App{)P\CbI0N5V!5_fʉxtRnͶe(2TL|3f߄@;_d)sMal-\鬓)c%Bu{^;=RGlv5-" X ѩ7+5l+Fp:Mti^"1Fk]%>)_IO6J}Sͮ]>ͮ\ˑ6J}Sͮumtk]%>)_*a`{(},$~?)gwE?ėJe(dEW!-P"BNf%[2 B\}9/v]rܣKv;F\WX-++[jsPf* !Pp#Qf)@akp7SGggq#$TvĉU5 1h~~~~~~~~~~~~~~~~v}Txυnrger+U딯\Er+W,Yz+o_:-kײg_Rx:W}jW֯^2/}R/`Cԗ>?E1FaHUUUUU׉vx_'kWvx_'kWv}x_'g׉Ev}x_'gWvx_'g׉Ev}x_&g׉vx_'g׉v}x_'g׉Ev}x_'g׉Ev}x_'g׉v}x_'g׉Ev}x_'g׉v}x_'kWvx_'kWvx_'kWyk.㽇xG{ ?IXf иtj8sĩX꣙(Li(á"8[%NQEQKX0X''y EGF"p_DݐI,F]2s$Mp 8sdڵ&қSi' 'geG2ȍIqg'tlHv:Œ P÷翵u,AGzϜo Syv{.)8\89Rti:tЀd%i$#B CeQ.#WD,2ʗѱRVԲۍk֢DuXv%uxr38pIܬ3-؂^ʠO#[9/'?=/8g=-Ņ(ji BgW͎7,R'C\ 8I$헏.}]}w[%ՙKX9G#JW;5׉9\4|.ze7g5)y7;v窢](UJg_z5omX>^VTď2ˏK<ӆ&| ̈pe8U @/` .]t)Q;")+"ɳwg^JTk Q"mT!Vh.jʻxi ::wۀf־Z y]Cyܴ26s_ڊ鳳+9NqGVذ\C6 iMe uC&lDUQEmdì2beȌ]_lȢMz\uU+ݑ]cYI ZIb+^Hl>/Ud#I3f.C{5&lO#mU~S%doK!DG/Ws ɲ"WP6 CCz+2͓@1\bRhd" u#YNKU,s Rx=J",1&6崗qLqT[jBޞ: 7.q (Mkzzʻ-_: HL*-^=O;9*_!5ڝ5?dqTb̴ޣdo'mجk.8N .$AhEW^DDKmnIH&RHKtMNjUEi`ɖ8"Uql 翵u?ruDBHHQQv**qez.@G-Ⓤ ܐwgn~;4v ]aW4ةNI1c:}#5AD&6;㧍î~vQ,b;WFn(֌zAKqcf$W䳕#Y2*蓈W]U:lqGZE|,K*96K|$"%ܪk r[Y +ؒƒ&%v.8}bd89Il5j8:4,q[)Y_G՘'./'$ĂPLz.p$%Kmc!ћC!g%oQ ꚓ´CJ7ύ$Rڕlt*!'WWi:sMaɽbZ|QJ]1t4ЇDź`ξ-ji JLnZ^p aNE[mڽb #rI0=&Cym7*xU;m6u}+BpE;th %ۧ_l5+t6ϮG!cpjGGt7!u_n޽X`yoqmұITxlDl|Xoyh.E)V#XaI1$EEU~Irmk5DKuc2U3}# ՆPz$mޱ_G%zKfZ#Iw2G U~,73tlxbmb+JKMc;-IuM6Vգm*so =#M3"YؗMZvlIpi ЗYW-+DCiGb0˭ @iᵪ+rZw<5> [z<)l X׫th--ܕrا]JgND6L ށun'EڮMs02xk`ۖ#ӕa0H/t ۪ی:E^ԕ#07'9&2fLix.|XŢc:ҩqL2>5+6"D&G%< \z,NgÍޓc HqBԎ [jC)IF'&J!_'oQUʭ@oV'`nZ 8$Vmt6<0ۇ(BB҃:34So|-͛GfbYmY'pg&%He(y8@^1d[Ĭ`࿺{m -.5 !/ ڻJ~,6<YG \ 6YQQD1UBZŅ̔@*n_}17ލKwD8ud2PF2=LaRiwI_hm-eZ'9-jZ%b7f~O0s:BJ1[Q``v.Ee[WuIEtێc(6A@K))|jZ,hSD0J<:RjꈼJ-"TY=toF ͋TKvFl19txOXS!eAFqlB$ ٝ) lR4tQ6"]]yQ -K">^i6W5"ҧpwo$e4D$->Nkp$!R=uif62fjR%a6m]^!eb1)Nt'4Z]J64%FjTI9'9X|]/kD$_Ek+OEt|RwEjj|rSX'ə!q8mﳎfFOϙe1)(1Eaѽfâ9-ȃ!aԄܖSٽ qޚK󍷧QdW,ZԭJ`$DTmpi՞q/ d[BH:՘k!zX؊?9ۭV]c!p\~#%1pcM*bBd^ݩ3xi3bGuQ]6Ö$N$XT!uc\fjLw$"CF|,PݨEYY(mْTMɇ"#;ߕ*@j_HqޗJ^N {7} 6 v)_L`^!;@Л'ʉ̉8x$3%.;'U'v>sXFDe̔&䣪h6Q_r, @H4ܤMp5lSfZ UG`uUmlȖ63gNps\ZvRa" /VC%S"tYƸ YrTh3n4jGj7Y l4UM,*n(=Qq^j*%IRK HA Aӯ6nAmWۖ+FI aQn2]6**V3|//)WfضCE^4Kg.3Rd8\*I~11 RњHdȹqGN/i5y*0FCRqM*@<@U9k~]7N:((16~ʋ՟ѧLJC*WsDtO\z;oƨ+oCZ}Jo5xBc>lTrC. Ji[W)> ډ},Jq*>-;GYȓVj$[mO_z9u{͊8=N:V&6B2\W(E}j_ARԮdeIJf^{$/*A:FyZLs{ YDmW"O ~*-b板8ewB{J~Y[<D\U1LQo־E?\d0ʒɈ]nI_R*q6/qG6cBPվWWp49Mb3Z\'DE֦8VUWĨ'Mƒ&sWEh(^-c,tNۗL H]Օ\{~;X4bm^Mh]JfRa7$}58/V_Ũ__RL-FZR@RDIR\ßRd2kZujCrIKzËD-agd@c`#4Q_=1$]ѭh҉RƚN!G;[ZN΄Meeڊ eꉥ8+!}Guub"bH7v'bYiRaEtU/q6k ӏlWMK;]WKWJw; u#:7IJkͻ[NJ</a Et%V2v4FӤurH C.ԧ Tl;uD-ؕyFՎB1Ą6*-B;iqHDRv%uURǶTy81Q]KMZP<:V|gnh_>^9})j/Fwkdѽ$JWsO&Z VZC@OiuS\/4an"& :#T[-k2Ɏ3dGuqD(!*"~n&D eјue\UwbZUyFՎ=>b&biv튥C1MG]nop7ww bj^;;461T't8[^j""y" ~|԰5^;^=x?=x;5lMNGy,kb6*/̺VߜO/`yyj[jBNFS(چ3gA)y~'԰<-ry؏Rϼ"]ʓM-U('Im]'^ fݑ-֦7 PClk ]hJ Qiޟ)HB'zIYolkC;t#BkЪ<>NWq Z#n\UyGKBmJg!ͳ9mkK.͗eq.2ȱ52kޟ9ܔx{ F*{6/AZ/k|XL%d<8`a@e[IrĻy)>ɼ;GKK- "JAJ 02l˂$9]D$>Bs܀㍺.yK-ޛ'B#'X96"z{8o&B*m=;M6[+Iگj6,N gа({r-tm~-$?NOrܝFƽ'De6Aj'Ai7ҴxeOw'z-ޫoa\5`D\b⌔Yo5 "8udAT%o[{Bzl괙{K' Si! *SHġZ%]Z,iSmHJ> ƾ]*4?wf䐂bˋ 36Ɔ5m CG~:Lˤ9*bMau;XLT8e/Ph%XJkaW[&yeQ@=WVM >;uo ?'X[?*t8!H6,rrsLL BEZ⻔b6#kp*R[^eҳoCm!UN)Kc \ 0(PaY':ꢅHs,t?( ˼ A>nJ\8 @W(8 9XU9@lLKG MDK*by) Ԯ`sPŖ62 e9ktՉUvcv.VWlcrP @=ksyO) 0HZDc.eWw;Qvx%a]&:e;EAhA~k1^*i5cmHK"#afjp]hp0zg/jg H ͗M, Jf!Uw5[^)poV~ҖR_m 0SyO)+_g\[yyx9C& Qm3 K )2ge=Z}*3s=lR~A bFi;t\%hQ4Q^b0A`F V9ģB"WFlP"$ Q>PrL'`%Ei+G챧ơݘxT)EWSNK{F͕ bi{ RFY(eϢ5JZ֌f08i`ӱm0~yE:;m7|K<7 aZ- `iV͔ry[p["\0[%4[(7(fP0U5<8$d"/. u-3;n!p /;ON66J6b G$%MSQd,qp3X<%LC߉Ui8_Er1NA:i/)L ]LsYAȁ/[Oqx 0ԫ6AԩdžVH)عy XQ6Jx sx ~8nZ5@c:*E^I֣C28DP4xjxЂԝnnNA&3hXfS҄톆$Dz9r!L3#QeTKUdFIE,4:n!#<{Ll~~Bf* 8*ZF 6TE"x g;qu.yh0 OYr%HqEoW,|4vN}xuĩ ]1JM:`]مbcL0\c"xg@ b^؎9c4|pdj$XORNlqZl8Cn̥/T@nW-ДkFzB\2'8eAR,mQiM[yN`9b1Z޳UJ*"`]<LNYð6m VTe! N( ;F3H͈\]9{wwmso &b X;QKhMUA%w&lS0A4bMe-w-QV*:㔨6w/\mIeϊ4ȱW۫ށQBC8*>!fM?C( g!rǧ eWX8+ndm4 SGtya`NFk/ed_TCE"K,ˎp±VONP4koyYO԰8wITVQ%o-k*ťk>GМ.K=ҋN,QHGa/!+,EzjGP+~ BlUx%N2]Yc?A> ~Դ |TG0v!w;R@l7 Q1gk p| CrU40m z@pRXnE$P.\7LWI6RA ^$Uc5F(,[bV{esIk5C[ 1;R!w$ f+B*&G)&@a3`$SfAɁ9$}<9Nl1Q+Y'X<? Y{Vla]C46< $F4#teW]Fy"fxY KƷDQ(U:cE&hפrW('JɼinfleQP&Ef1)K:%WmIƷD W 9ú!+җZo;ؔ)nwf†QEc5mHR0I/uuC@qtU|@*-ۊE@BZ6VdN46D S)bɭIO^Ϧ; :F,ˣj:0";LVpO` :f*&MQ{*jrĨw00J3c&ɛZ+{3_ef-c42J FR? ]΀Gf)WdԔ_?,_Ř"}-c;O;|5 {. R][7{){W6[U>In2szT"e,l2,g |[{,I|WQSڵkwg0ЅEVmZ:=QrZѭRPBb(ְ[U V` Y:AۉI)=*+D6ưaCP-Yn hVPHb*"TL1F(zG $";V$oe9h/OZ|Gܚ:μ.2xd᫞R0\]ݴHy:ouʲ1-ZϲK'樲m]^('zZtjY;GՃ~\UUbWHQ0`f y01+'G'^TywֈU2B:gc ~mb<2v=:Ơ!+^=Sqͺc>d:.;tgC`T~p C}/MU_Syȷ[vzNV:b>?-oB:C?=2״Mο+ 03K^@&QF62~i;/abвw-6InpY7:q ZdHեɌ,sNu00[Px_T{WZ"`Q 2qrYFg6 PAm0(6ANHM}=Z,W]ߎ Hm (lm:L< Bˈ_R ͧ&[?>3"r?"KecT]\kT/ˮ/<>[F:3Rg;(,-ȹRt۶uhvceJPMbS[JsVWQ%p'HCtcd 5)2&0 S<ޯXN iYAC!SE6KOGSq]{+啌^MF[ؿ}5,"@M`tZ,n>U+veUV2 @Q-TL~1g{-Y# :e@V`,-AUt-8(J\-n[8PuY#Pʸr7v̚>}??!W¥ J@E]U-C,F (fnн"+["YR@+)X3X nGBS\uoyŏt H*eLe .S0V<2N,l(X0Qh@Rhb(iCJ<E203Wzjt ('\;tgew μKr̥.!&ߗĹnR tGkG_'|uUeNnX8H2Шv@,7B|v$@梅8ghx9م9S!WL?A Թ#Y4C>ODƹ24-'`X%N -@ߍl]dʩ48^ff]I+De4؍“#m 74+`iXo?fl- XxV1mw kLCSvU>ءk_GÊ^A5l޸?qB-s?Ɏz0l.%ӶMS(9y=0bǺUn2Ag:.YP(e)B_o}:>wT>]b%@[)_Q8WKzz-9>erbee"CD;8pÇ8pÇ&L2dɓ&LjS԰ov'bv'bv'bv'bv'bvjvng?~E2vjvjvc&wX /봻[rzj_ʿYg/g3%3>7._ "1-s.3%.\r_Z4sJ |Qhyx3S4lx nqqb"Eu:!IB7F"[LZS:@@j`uݔg }ԵGhb yF-39<7jXpFB8ŧ[4F(&p UаLK|]df Z%6B@:Lr^b4; S䊂Byce3I9<Ŀ](cmqx>h?5o7K>dxy+Ŷ@+/q0{a?2=oS{4 e=]?]l^/4)o)G G.ߙFy~IB&6/QxoQO\־o܃E'jtW%_Iˆ,j_;<Rs F^cqoMlߤIF6s\ʲZsT@89 'zFΜ)'Zopv>9I{zdΝti00jpe˪\!@:\C"[IvAV!t`;]#J-T-NEs$Y[\b[J8g+Sϸ,] CM-6Rd9&~BZ X2[;]&!0VQ=A^RXll!hz[@CLa[IJ㋀X`a0t " _vlxK+ ,!T lob>'^zv{FF5i Fգ(#*~_36ǧʲ=]t^y:a^ 5o+>|gGUVǞƶѶϮc*>ɚD|g\w|"uWfxD#eol\z^-6r2݅;O=).]TwB>a>ۓq55Y5v 2V]+sFJ_L[79,؟>7_57c7{`{sPo}M=ypGaj[C ]}w>_NmpfC޲ 1y%==7/y$^8v>1h{?3v38 zFкFuQYkj)2@%ԾUBnΧZ99ō^Z dž0 .0:0l8be#EhxnU7T Xc,1W2o+pl+DD $8 J`,9Y=C`WO:p0U Sr)1d%KXs1d*wR.jh?BzHl䟁#-?Ll>rWܘwa?OOݳ~v?%5z1 }OM~B5oC&8*COȹLw&?{sg>y`&_yh8״bm~M7.g=.l{W7E#)0 EW^oE9XдXbx d |Fc4*az+/gYٔ OL}x/޺AGPXO=?M&O_eyFdɓs1{vi52mgrZ)!_?,˞92iwa"`B BVj 3Z%f`fbe>?^#**|)y.mGEjlVKuĥ,t_h:)Nc5']s=*,b.Vr2:bVmQY%G~+st^4ҲSMiYxp#PEj+s%ke~01Hgqy~~ EedaZ7eysM016dG܍5MGBbQ{I+!;Mگ*糎M~=Zv*cUZLё GKS8?xlN㤈Ԏľ`Dx-bԺ`7X|G.v%N]o Gim8kS tLjIn+<; $Wl`e/usj@j >}E TLiɱzzz<%F㦡REJv?!*qxUv'g;/|Czw~c'Am~?!+PARXA۬d!ݐqA3k,Zޫ쎂a=F_oc"=.Tl:5E@5)ZqNfecP"sKob(-i^hn =`ꖅ* -UcW(w*Iפ!%/u ʣz9)tYx-[`X/UԺ7ܶn2Bׂnբ/~z]<YK")Jl7Kx>ÐP9T<8|67KjDǽ46{{NUk*(y 6  FU+``]Hi}LmѭYt`fW/n5f* aiOBfV[O^F7d8}>fC^TUDTUK1Ume)UV`S|."Ø&Q^+ugcgn ",$NMW-T@.jA\(BQ)ɼkԵZ=!b /ڣBFIX>ľ'0OVU5n2hFp(i;bEOeA CA n@]rgݜtNQ鈠B' 's6lٳf͛6lܱB 6ۣF6C@)$ws:kWD]Y__,[ܝN'zKnvy}mvymv_y}evSgBt8?}T;>RJ*T}k**N`KP =vw3j]=vJ7*TRJ*Wҿ"c -J/*TRJ*T_J7Ev,#C*`0f#URpP6 jڻ^fj \~>L&kh5Xܻ>aCL0*r,HKV^(#}w-(֡ Dln>Tp;\m9cV 68drU(2j*bݐ$B.KvZnSbX"X56}.5-?z [_]!YvEugeRt澯$*p, > /=f+j]#[^+/ J{ ʦ/`:`ɘmv= URWC#_1(T7fi]ny}}_0i`2Zs `:n6ﱶ Ę*mv:Di+zf2%Z4Ew?ÿhҐz#<( [nSX#x,p&)yX0c(Ӣ?fx etaؓ#qjk.%cut:L918r;nq;N~Bi.!KlQ>ɋOɜ{Fb|)4l yl8a;5ziK8ي b8]Q:Ri s [G#Vo[ r m0]SXH Pq-x0&Dʮ (jK]ɍL9j$ Z]o4\hMK߂p6xbQUA :Ѯw%ƌs BZ؟bzR)2#*+-xupBt=2`i2 (4NWۻJ+d\SV/Jl>pM0bUC2*W@ e6y!x@ux9xoʠR1x/- vqʬ]Y}..z#Ȗ6ϱ00E4 "AmFp\.,UKY7QUV^X-Ca:/S1dZ!,o;$b+GG^O>qJCSYL9OߟJ`i@\e+B' jhӉ}.B#̥K)tF U[vAbۛ1_v+a/2,e n HWatRn[??+PX_h4.柉}Nfϥ%uNd۞,]KarbZ|Y!) /t`lWc/# g,1c1#(/5J "8?6ϷGx-)\s}_/jQ9ԯ{]mF]Oa^x:**eˊıය2 BТ]^m;õWI.&x_SMSCE!UWWgYe}prN fˌ%2gJoFt4]Av+ܷv4+9fS,Q0Q4Q1A{.f-6t`b-leBXbY$;ɞ2i!CE 75N` *P EZE+'0Zl]PȦBI@ G#ᗲ*-5a/ɚW!D>B ; Ҏ |˅1B(V.q;G1K19 S C%\5ˣFLyIf r#P ,G"vc/:~~BqLGV(0D.1"K2t #7:1w pf%\0&-a5qdSq S-H'?KLӻ\xSC[452O2?}G+/Rɫ'c#s?7z& i0`(p4! p*WwILJr8wJۭuP"ጣ/~5~״T\Bҏn/*Hy_a. WpBޠgc/ZV>$Yf'ׯ^zׯ^yg2NS1~.obq!g i3KdܷTx_R?gy3ŸA;I >_##GX}GS=o~ I/g}ԮI$k`CRO9}pD 9

/eNYO/y~_aKkd^ϟ>| @r`PھOHÏ>~z=vCWV̂Ba"[gs?iiii#_<?O~YGgyrOh'sןx?Aq'7) Gr8u)TVIB)#HSJIzgrScFgkjif + dSRML{=s"VoYqM+ syP`\SEUhJu3sse:Tk]oY=IBw&;~QT0+aTe!v5WF(5uu5A㲉Bz&aY]-Cwi@ƭyA683EOG_<_ǰ7FY)ҘSFG5_3;2MQ`d-.QϩlB3>$2iw !&uM#ZX(c@Ij|@GG 2˰N% N^`pJ-*`3 |ǩz{(K-U|h\AUVKW'&"쒂L`Jj(EGUּ [+!IX - TjvWxZAR>hS/ %{7U%e"HC H^ `*K.;<A>L*/V>R9Z!f=f)Ijp!qwuUY孋0 X ɰ5\i;Jʠ.Y8(oxsx~@_d A7)5͉*8sP`ΔfSĪN)7Vl ̚15CsIb Xoc%4dK!۳B_~V"z8jLl(<[fz f$d,g-oQv_ =ФdaaF|t2Ww:W.06 0 r^ hpfE._ŧ%f[D%pP4iAYZX]ڐB`9/߫:N\BJ&B5Xpi,e1)X-%ΠH a0jpUyX( EG*5= 12\y8䴷UfU!B,L@`ž b̌Ac@l^6\Ng<5;:~Ș76&BZU<&u @UK!zT+o~%h^Ն'My>%]d`V/Km 0ay㗠j6Fc˾Z$v]) k u e8:agcX *S!ubt%`Ტa\ dध䴬c㫎*t} cXeخbbFC LZZR*e(1zPSGE9 Z$4g|Td>FDDE(p(r(.euX裙oǟZ۫D5 P*l1" :*fa*f8ҍv܋` D@)sg&Bi)b\Io<nh05k<ùve<ŜnzLn.I0LfQ’=OU^}Dː;E3@ziXouXi]?& +u}.71(FhuWйB;F`$.,QLeYl?u9d%=DxE%,0脢): 44BRѹ⎝_~@̇JPz"p)L#IZn(`M`BXET )5ʲalhWB6ZzXLa#ꁙRCm.o_AS4p?` R WUep4ba(U36JY +Z1WD`a3>m=v Z,\1j] ui*,QZWf.(JUA[U"j4V)]J-DI HRh.Dzղm-YXbZ%)/B! .z%y˶.[R5#j;ßIӹ 4O7<J^Ktc`π"U4@o\Tzle!Uheԑ`j1]^U/) AvnV9&4–si%FQ"賕LyBU+錖(>UY+Q`@p?C` \4,swv+QAR <,EzD*}JT'&,Ip׉0"`+ 8Tj' j $V7$Nj upoY~hhLԤr୨Rո9(=z_R99`=gUXj @ :c f%*!؊562mEUv _;f=́F* UJԐ| UYeay eDQcr%^P@V"҈4QLӶ#EY Y\aK> ^jVo~'UhiH*7qb{hYv•a9b,DB 8*@fPyAۜj۳wPcdceęUq:t~'e@<%=RhH::ʏgxÞuuPI,i.kZ L4)@ T2Ph(U dZ@:@ѽ ix)dJn5n^ѐD"Vv)@ ULiǮB uupFo$A(Lڬ93: G6,6&DMUnR ('#~nRU3>ѓ~ݵ-}(:.(p`Y)Lh̫ dε-.DUQsr5KMis;> 4R_O I m;g8vL(#+^{sšw|>;4D:z%j:ܵpBx.3٘۞9pvbc?nF~ƹexGGM6,XLY2 qlAq\ܡ_Ahʬ;:-oxб^v/PXnlٛMk7}z74g}f$D(Κ%4h8jo~eξk{J5ay,ilՇBTP[(5c7_;yP \F*-!g1wC#,uQmmQaR 6GڒBB90LoH>UB,0<-܈ b=@n LiVw `H`@R7tbEtS@[2ms//]ߍ UÕI4jiLơ do!ڷ,q5]r|s=>ysO9}ퟋ]{~m.윑l eV?eRj)w`+/}$VeW?1nTZn.yCfj4(` 6 K6l^Z'VkA-HA^12^vIξ"#= flٖ j-x/ĨC fY1W"$So\R{Ymf uE\`2h!A,VvJή#NDW5g3V?2:n2 0` 0`  } B-A)҆g?8eOߟnn$J,3o!<[aZk%i% +"dX@؀gʍc8ՇUFa]j0nտuZkjJ-Ok=x7' rrf~xVaJxԪh轳!g`hJDK:a 1~7p3&MCW.BDW׭w}C8z}[v|=O~O^S9z־=>S5'>~=H?<\.eJ^,VK%s,u*]blʔ$̽SӔrC.iAH`C %μK":IEҁaҦY,cd4+taP (vDPs7緞X - ζzEo'Y6FWo3G_ǒ+{9՛|mTLty"`(Š4JhRX2+Z3JCNpbSP# 3 @Q)6KD{K6]RgDfIVW@{/tb(`Ltt*.#^+WkhA#p_e&Jg`Py֮.qURYM M4 dUro cMR(`-Eұwu@q%TSl K 5[[THhWNJF TBv`'TUvt rX [ 9Wfcv\ ՙȊ]Q=zt&t1EA  ]I*a  UPH4&;²:^mEOCr#dkaZi05,n EJ/Zpє!knjuШ%pWeV0BU°BPm/ A |%\v/=tDF@v)2dT)J,oeZ$HfnP oh q 1%h<FN!h qjSU!kC\:&6[s8تZbUj0VDRԌ8u0PAiܳ#2]rZ20-x{B|͎Vp+|@@;p%CE/aʕv2!hѣF4hѧN:'8?ÏTqŝ0^]6)opAY .AԽ>,ح \F`dӸXi VVWM䰢*¨#?yK I~kZЕAH"fVOQ{PRa8 I؏;) ֑;q,7S\Y[wAޔChuyJiSC0 Ye{%k9 [hq:m4utkt^8-L噙.kEc?JjkCPFͺmYi:^NH0 M*Q]eb>-uW:gẖ]A.\Gj BZ6WMh3 `T%EfV:b>%ע$aغ,0 Q\ά>(`n,tQ[2SP4{em>0 I2-3La!hKoRҿY'0ܻˋ6U@ې@wwKT<l~^ e&>KIe]ǞamL=V|K""r";J2 #9>֞=@' Q-bJ  uAN|Ű|Lx"FRj9NXeld9dheҝ? ѱ-"AX~1SVYKd2tU,, M*EٮSauDZQ/cN ^1qu?[@]-!@%F iQK8*0W@W.L`K&-QAH(RXE|B9|@ ,A0.j8Tn2Y!=q|fν%By-=UE斓T(Ę뭝.^1[st&% eZŐ-Up& Hx2o l$*| PbȰ lSu0 @[o"1eX<0fK@*P-keS[ZUN( ؗB" O $0%HN !mUDzڹ_Ls2Ļ)2?Ѐ/4Wv D]PTg33\@˱A*Y5/Ma*ijx B)[a)V.]I?T- %-(&FUt֘ ANsgpȮh kVhpxY V{)g>a,Վ%9ø]AċP PQ 2KKJ$Wg^C Y9yTApkKcM˽^*5FUr8ơ\ '@P$ 0Ru,z|*ֱWXd8OA3pSkk/a1MLJnIgIC+#h InqQzu@ÎUecP$%`ѳ&& ZO'˰o\?j׾QPӭCy ~=Awޠ3>CnR\Or_5z >S zCƗ]F*l(>a{Ձ_~_y~c/|>QkV !4,GGv}(?P3]2Z)!|!@_7[EWn8pf ,T&_S[x_x؅h0}#4eä_2~;Zʬp6 iZ茪k+UCr뚀 t4`%\ŮwetYfn>Zi..jMj?:,FvhEPմbڶؑ8k:tF7-PVAshtUB"t԰`5k7vZTmV(U<DEZ(ӬܱxR K.dhէFg-TFxRɆ▋Wa2؏6n+C(],ɼ.}:&RUKCLѰĆճĊ%^g-]bmmyaVR ¡K ,!o\.ť -T~:4F8@}(НjhzBBp2%)&7CqJ1<e2)glkoM̤; E>Tk(eO,b|D]`e\<(BىEcX3{9 L=N}/ZYT>V+AD&`XFZ"_Uؙ;#l؁l+%E=AAX bݒ Ő,2rUթyq/ .! (ݐ`ʔJܑSkc<(?@&;?4tZUՙtr[\]" lɀ(G̀2n˖" ͛^)ܧxerӁOWzMZv@dq`y*c(˜ݰB5d :--#Vgڊ s%عueT񂇡 B00bk 1/^3(+X1>bL?_AlDȉbi?f(Dp00` FA h0 %%`W lt"Z4Ғ(CD lŒ*P҆`7qŏs|Z Z;3<GO,Qز0b*ֿM ][+a8Lٱaļy{JUcS%$pS^,^zׯ^z=fzAj`D YڴKfJS%P?_~^~ #A6oد?S ~ B\(e<_S 2 ,?H OI=$$?>ҵM$\oĕ|dTh M@8:zԼzK3 ̴M׮"A8QY\!Tp\l*X͘7 U0pPw5 ]Q.͒zj`d`(hO8q.%K Kwl@Mzs, ~[;ϯ:߮n/zjn,*׾胳HVƔDGkfF r/񑉫r}n2ة{U(!i}fh9aXwQSx4V(sΒv'mg8 4[NCe8@7AF kf$zW)Ԕ+KJ%Yg 05Xhޒ/W twB\LVe3]R6{ALYe@S1F&(V-˰bR4wVPZ.!cACzEwḇ*,6_!c+MnZli6( 5t `E /֩9VZ X[-/xaIMn2dͥDt=P(0V#("]dZ[ ZU}~`Fv GHĻz: qX(F*AEoś߭,(te> NE&L2dɓ&XA׊4&۷$H"Ew+Ӿw'q;/;ͦ @’ŀךro? V*J&獈dyo?'OIIIo?'SO_b,A:'qCwxbsEFf޵A&;e>3_'kR9*81u#]vIV  dMMKk2] Ӆr"pktUCpT"]+({l,9.xIw&YOGZi_77D{}  Ç$H(i0\k! GF9R]AfGKwR-o7XuGef,`ϼھnZRi v *\RP7- AX\jT(o ^YӇ2]7B;MخK@1v RUK8--X()E5ዣ(iБڳa&KhbT[ kY ( viUUu"(‚"9&"%kYFI(C$B^S)*p8{1 4A_Dʬ&yQkEdykm1gT(P(DE55ïQe4#S5ZE}]B4C*jdih1%l&skZk3P DJhalb49[3(5wFD,@wt0k <1S<*Х(Qpv\|X, KB R,0b. :46-"ֶ@QYbu ؔ0D)ۃJ.Lod$ j[ p&w ٙHaX,(3D\Ӕ ;m..#2"k I)0FdpDt}w("YudԾ[T<-Sd7QACA1t7 ʪ@A1w}|Fft [!)ǰ i2:LAo+81e2q^ufݥ<*Z:QreYPZ)n7)2;A. m^cJP&s̳t&뙖HC+o͐8YA0+%(*fTI#_ |WraaVi`A0#d #ZHE &kH(K(aE &jJ %9=("5M:ˆ]p99E1Ft Ww8dd)TUjzZȔK4Kb|(f^ \ @}֕r, 05(! PhHATpZ q[PWw%^okYm,&\%1axy#͈), zX~v~&Ѝ+ImZZEp,+I WuE{5u엹ݵk-rҠ[IԊbS5ًǜƢjVՠ Dr:J@*PqA@+1 sOQ☙+.C {oA?P9Y,@Rxi3쀄dOd#q]ջ&&8L0)Wkn9~'%!\?/{aTQ4t[B 0zP b3$3VJЙPMY1HU T +N Uu4̊^6gbP-[d^"n1xÓ,@e1j*8K\@1[`0]VH8jte&6(5dFp)" rYRvLQkL^"UwYgSL='~2@8繀$e*JbdW|T}iG L T| R =lZ_Ļ`qq ~ f 0m54iSb1^l hdȳ?At.&e⒔!@Jrs<_| T>nXGFQ5.C=Z1{Ke:M2/mxڱ}l[52kUG_lG43:vʫ5eqNE)BVyB׍z;"^Xh5@}4}4`Ws1KKλd# 6zwшi *Zל"^;WQ)C  w9PqmP3yw`mEoedWP{NH)bqǁ],ߟEIg4_uũ6z-.x. _`{#Gv ."QAjө9/@\Ub&_9vQP0 ^! s9cmd`DTUq d 4̞\= Pаz3(IT(W Z;1~uW [HQ{Lr^id3NHú RA_ Cp= ()D+X ppLBUGSZs!ZWf2 řUeٗwFc /@e +0Bj)d f&ZT`2j$v雫ֺZP4sQ:U 4IB31 2"S6L԰bcaȰ^#TŞ fVn*PS`IzN | UZU-2K}]/9*BX4Kuu &Oy#pT2Fh( &;j] e/›>-|h` ME .0=CeJT@eBt(j Ez#*Ʃ*o^xPPqlF ܥi=qryq"Jm<9tl/Bީy+Yj#xJ8gFrvG_Ԣ:ѧavQb&h | N8f, nx!үz<@U K4]Z͕]&>0vK`ch#NyڼW1 4"(<-&r%&364 Qeo=<46F4X]C`o7wr3Ȼp] ˠÒiuhT[ܱgmQsا4E&^4ADk'jK].k.UI RJPhW9!qUuuR;U W|3PJDxvm۵`rYex́n.\r˗.\rˊϱ1B@]ibyG16yrTN/o j X]o2 0џLT(w_WTy`.g?szO}?12UU(x(&='gϴ}I=$I8~3Sq'-6Cz)×9}%Mn;}7images/user-role-editor-page-icon.png000064400000004707150212007360013564 0ustar00PNG  IHDR-- PLTE4ԧM .Zүkz#籅3 Z} xEm0 eTp oǚIh,Ku ٕ,ii-KŇ'y M:`؇'r%S8f4 " 3*sfKbtKDܭθU՝6x U*G$ʗ;Xm#Œ6arP'G ͔,jt8 ř#6ݠ1yFix6c[ z#T[2 Z!f`ۗ9! |!ǃVׄ7S s"pv K՝AUAz*i)c)x% obNBY7̗4h< ʃ˭e~)❥hr![F)u)v>YlЍcŞ_Pq Ha ݌.jS{ L m bqM;$5-"I( i J2!  U  S+e *  g>*4 po1>, ånJ 9!}_9! `  fvO. *y0 $ ţ^b?~%Vߌ_ืs??]W!FDee&]?4&@Ύ_q4 0Bg6NvJ;;?:b1P:A'(L6Կ;k+++?\arvYtA 6ky9}饁Z\ %b]&'{6A ]9>GJ~˸ݏ!s2a'D#qԺ[OR$`c\p1t%ʱg N(c*֋;`n0)yŷOJEym`2OC8]2Myz"RуADc,QLCBr~u22 A:>? ,KdMmg'bL #zON}2EbIʀxd3>>:i]'-})@}XX(b)7q)jDw|kV5264/{F)<ǂlwp>)wweZz `4ZZ3λG17/y-׊; ӕR$lpQ"wII*1ٚ%YI~ '4Lwgѧg`s&:I2 [' ]Ӵs<.,meB!|gy 0iS6N1k$港VGQzȔ|q3)r9vӓE]8\<jO L=A4oiTW8n)ON޾jʍfir7l׺ }oHn)i%6'3iY-Vfhwj;ؘ@wO=E!|s'2_! ~419)EwP ZY\jْTN+&AJ'M 4YV4>'cshzm<61 *D8}7ҫZզc:aWeΠiD;*W gCN7`dUEle3kd1.hkP../!/fN hN~VӏxflF8ltic{h Pg7hq7Ϸ[rȿqt:qCDuY2kuHFoƼe¸όK?Ƙ &2Gʭw,nв1muFkC? "ZeIENDB`images/help.png000064400000001422150212007360007442 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥Oa[Ohjj8'r t,)53 j꜊o"&ʗ b"_DxU5Z{ۮg c#Z@'U4Ş6$S=:!O;4A*g; G hhh!9U@8rk2ه.s~ƜYG# W'?ElqNdkr5XpP˄: 1XcHP`%:I]`t)*\C8h3G ?~sA jMG]Njf}s!t&6QcBU 4P۶A3-nSXxm$vJ,hHVb v(y; 6*P(GtFOw>B1#C6K#G#O4P$ꃄsfV36 h7eo %cGY')O4˹@tmA,Yi;/AKB=<-CFZ80W7E>@=V7RK?&;AFJ?.H?4! $%G@:6DI@C9**AC@GC/HCXFFAImZFESHIJKILKDNK?cEFKLJnCAHMOAN]NMERLK^IFXKELNKANxF3NPM~HAPURnSAN:UJ^^sIch\AcVfuRe4jzbOdgf@@\D^eKkY6pj`a8P~̻pBqN~zjgQsXĦibH`Xtv[ٕVŝ¦~ڤxӨkf񴬾vsȷʔäѼ׌߼'bKGDH pHYs  tIME p5_ IDATx \S0p@T2@ m$0:|}+(G"XPwL@bgB)JĀPBo۷nu[w==mק|uV{z?r!(I7[a00<S t:e@@#bStNt81{U9ׂN1):ESt*3iJ*&LU+T jӾl,-^`J՚f#:E~sZHLQ*DE:_T$$촫0޹SS-A945 "K鋋Q.$ 8qڡs垖)[@4A[`S*Rs t~Z2]%Tk):u}2ۨ7'Ձ}`QԴwpJpt ѾRҤnds DMzfx7k):u?Q#,V.$}l~Lp|-NHHU(s(U03EдOHR+HF;,Niо'=V* k,\c^$,R%S4ʍFc %~imZ[DTN-ߩLn5VrELV :%:Őӭ4uLYyg*LKP۟JHCwJ޷QoUμ#QS_cB18 B)?BW5%TNZdFV̼kePO4[+)Fkr}qP'R1qR f)FޑAObaPB7b©bܔSIuJEL 퐚j4b#N訖A;TPqS ;'biyZ/bة"faps Y;1):@bS tN):@bS tN1):@bS uڗ8B\`}Nwh{y\뽺:|˷esSmǫ}=9'v:XھDM{i8mhM4drBrZ~dmGrḼn7G ySNduMӶsR ]wౡems5N~zNﶽn k%)l޷H?m[Wo1ZkMOy:!ĩ ۖ`ӀiSptZ0jOtNb@&\U0l%yYڍyYzru@+4 MVVy榬,M]thi\-{]v5SQ{%lnl0$+]lbnӤp`jEuS(Lv,Ћ⎟&۹Zf3/~=}]UbvS>==Xم.^l/ ɥ^g\&r5V$c,|_ RN0Z, aj9-T+ |ێp-zIu :%NvMt[̰LEȆ=?/7# gĝPh=İ;]KY8lT/\Rr5)O&Kx?JN[d!յ=EpjH^zːs  [igpeݒfWSv[oX)9%ؤv̐ydju]@Y^Xjщ6JC6w9;os;=r*߫fՐzoT4:0"i-}1Ӽc)ƀӮ[QPR&{-UԈO[5#2810dJ4EZȃ0mw[6?/u3kd=&Ӹ3:l"OwN!щ6ڭ3坲;il\=Έ-GhKQgU:5dZb:Пw=n?~֐ةKi-i[5I[;UZwAFM Sn&MVQp41΅mL3jwB.S_c(S*fQ%^CLӉ2%t2zISpZ 5Qu]PYZ3U~:ZiC4ZVrvDGv^o鴘tCz"" O|2[1m5j~'OyxkThfoEV:4AUj-K+n4MuHK:ö9:ES tN):@StN1):ES tN):@StN1):@S tN):ŐSÓ@F`%e{0Kp:TY9 rg翥K9E2܂b10rL)+sB|LdnP}93BB1d` ]Erwcfcݍlai?8 0>hڜ&3dNU{k^J^y ]E|:PinZV f w`vY4~J4wB6J[%.!*&7)d_qw㍿VoKOi0Q8$~3{"{ZxwW5k&3WθFKStrX)$N']Kg޵RIsP XJ{b徧NLJJ;/AJ^>]_8#ЅPa8U ؄'}wޑ Nů$,TKhv:V=[u\@dʷ^\jRqSNΩ/jOP]KgսSrоt֝:m^yrtde9mZa{Sl̜ oZSZmNO`ҟM9ӝD¬r?\i;UǪtk־:)i;n}) z֕MN̩Oz)c5)+։sS8]-~Ef5dﱮe:=ӥM[ۜ{ukr050yE x\cnN]t&97ߑ$џQCy  Zua|ij|w@1Du}KccUҒא߰1%)AˮW&ph${otnmZ e ;E.yvZSKbcAU=jOCUK̠K߰qXHn8M!?EL6Om23j,4ˤfATNr ֕p.@5<2bsj3: :LK d^۬^>W1GKsyl!2Vjj˂&wZOﴵ%B*tb]pR!Y[[x\ld#'rY2<&r[Z:]:A7`@#KRϜ"CuE֓ڶs(g-}I-7LَZ_ XpzY$}τ\Y"xC9Ne=Q4H:8]1%`/ \E }=~Sxj1Lĩci"3d"e0 "L)\AbiεSg?LUz0N5yCbgP+KRt]C"mm|~y6,fS)-Z 9R|~ .%N4?[DN*?%ӾZxb\)rDl+DSt]_KAB\|tqߢ9M9c  m&ZZT<#SmHr"jL`[j3ӑ6ڛZvGr6*(dQ~#ꗪgem) j|FR#[n񰟿'_V-;%U=ܘb3s?Ht=$6Mܣ" ܙ~|u혒kC=&!qSfX } QNNs3j'NC}hiw^mS8΁ l~'~O͢Sɵ4~e+4ZZ گO;rw:][d2gFNC1o=rgڶdap4Ir&<.-$bฒ#b2B9526 Y۷i1̘(tGwS;&B蔎/ձBiLRtq|W2*SU^:z;z(o;l S2N4zC  d0n*qyiݷo{&[%Nc: 3LVai4tMq*rz}K%NgޑzNqz5V4: 8xf-N(l;JT;Ə,265;EV޶m8:\?a,1%٥8vJ>HQ-Y;-QthX΂^I?06.c[w('zT6; s"- MN%c9 6vzNGRSox]D1rs~/7,6[8mSh2}d,gS8!vwFqx3= ({- CFs/;8,XS[8=R|:_rHQRn; {>wJ99$v5*{@;S7>}T09! ^_ 㕹S0SNWDX3:8S*8S+=8NHpUNQ):E y8/L )y3ʩ ßS_ dlk jVZ1܏?!r):_ZmQukTl Ġ1E~UPd$Ft0$]S۝֭4feqK)q^$).xXeА',ѩӡIܷ @ιM@5L&Sz$$8AVZon@VJ1NXR#Dai7H S:Q_JGZf@9ߔUdNזiKtЎ*hXD ~y e6QIٌk #FN2&K){O49~n*:<ߛSq0rҩ:GNt"R':GON5/Kuky^;m:ne8u%0Npv8OJZYYE=t}ٹņO;ZV400qic*,ꅿZ m2tx22Jw 8j[\8mKO/ۑl.ԤtV8!ԔZyY%Zs7Qzݐwֲd=<ե֊,큎bPƼ,F=?.`(J'Dں=73ryxqղe -˨!JxIܔ00|m23jLt?7saΈra) ?`;ؼ鴝TS䧗V׳NuYNkZiS^o;CK "ڜSSaj1*VYy$п:SnZ NsZFV.贶-2ZMe[XPwBtHXk}NEVa\CRk;3S.[S:mPރ%֣{ /e}h^.6W{rI/Gq+n:l{:U]d,ܧѲ5.N%Kmf e N5_m}?#kq"|aϣBG[HUNmQ 'a}ib`0vc8>Nѩ1E8X:.|zS`N 1tN===COX):(n}ŠNѩrX%d{*\i~GH[qDžOXá*vVtH݄,OXѩN"r&cykZգ'FIDݲ:CwM8:ԩjsrCwv=]7۴:0:̩U|@9ך9hOY.e['1/MyYYY=tjs[D]+IZi&ݟN7evnIƴI[BVFKrJ0moL؝fx9m118w:kخ6Z(km"n[Ezg+233 ܌w.6:m[a96Efgkxc֚!YmByLOqZ]jX569/K1//ލyY1{~]I/Y饓V1Ns3[l#+-q`M4q:6fOG;eTXivy<_ܢ)ץLGߝe[l cË #9 :mNT) }PظZ*hO>j:5:]EL V jj-;ʆriBsM'Ni,~kx56QXJC{OO' [zlb@u\'O{.IIC[I.%)|~_C^ǔ@>l #_''N{sgW*[swpZm#-Auѹӭesm+[8]-P$;KZLPɄNmּ)秣]O9F?S)7맫p N}Բu~rm(ƮvNm )I 󡁔O򤤅&A0ږ-\VOJM۝I'i^V%tcB{?]k8Ϊ2N' am|tyNmm{ufmN$iOZ|2N_|U)7O8;S5Pi-2"):uɻ5VNoaL۩OW8Oɀ>wێSW#)߇~)?l_JNq0LDH~~9Ůn>7QLl?veOU~t^/JJtGh@w*>)W$‹JVV; 4dNn않N-mC.1!않R^ i^t|VLΨTnNg+ESY&y:{Yt;Sׇ^)*?:}<߂ɕjt:^)*49wJg6y SЩO {ti*>lӥTP z+{EFS==zxjאƪ4aYnt>|rjGEaG 9%bJH~*, Nѩ0lO&$Ci%;J}T,=>:|_My~P=\~J%۝EQ`bNc6(O(iHaSȏ#nylTU>Ohc حo0TSU 4}at^Mcl邊ٱe^ آ k ~WG.+@B Oi:ב4Pש1.㟯\ԈN';-3B;e&tNNtӮp+z|?rs.t NNonRԙS&ܜ^ N#ŠpzFr:ߏ^~tӫa~yOΟ:)zU9_Wjy6ЩN7P;='_u%N?{~]ԟ}ܫܜ~G6x@Fӳ082Na/PO}grArz?<ѩN?ݷ~?C B1ϜOWĉ.SsJ21 OC]]_~ ~7pyϝ̾ȯx;o>ƼJ*x,]_y!]b ,jErD꣟<"y*ݼpE;ᖻy wz./my9>a¹G_^̽8 wI#l$qJ:oRO(dXhQK1{>o\l0+~pc&UH)L;Qn9R0)~rzC cgDWj{o0u\7:Yԫ#]o9.{G~C{ȃ7Ho~Q,gxߗklEأh'rIt?~S??H)1?= <6)i;KIC/Ip\ބw=#z[͢q뤿Oy(lN{[7)PЩ'N=(48#@vzOЩ'~$s ~$TN+ܝ4DSslUN1d466LC循d1%GT7`dC6NUm)*]l8۟JHCq֗Yǐӹx+H"cCStNr|zb*TŖ#ާne"xS 8t!?#Ux$Ng t!>@StN1):@S tN1):EStN1):@S tN1):EStN):EV7.Ղ2-\k@bStN4h>Tvӹ4j0&tMI o6QO^Zd9 @:y7iLؐ*7:ZL.:tr+ :tfFt}~o)U*KPTՓN i}C%@9T1dWdsIS;;r Es9CJe`gNDp509-ֺY摜  ù0yZS뛞SBfR~W ow &6p+g茳_>m,c~'~q*K6Ϝ"C};9l4@S}z֕C9Vt:Eeء~*r ?ӓGGwQVA;)eyW)?+(ioG ڒ233MN^spޗ_'܇iQĩxGN~;Z4S"G]檔vo@=ωBVWѺԩ܏~ NS#{뉷},4N(ܫ}Kkq߿t_;rmw&%-Gwj:vdCUw?X^~?*5^9_)|0ǪH `;߻xMw|q6׮ -|ZNپSt*]}]St*I|Cc_CϏN):ES8hStN):@ShtDN14~MUU04:ŐӪ4"A)ȒI(UN!yl3֭YP-LСOs֬[ল1y|S:F=-Q_B_ V(V+gn,WIY7:Eʫ# tJtN' }^g/3P i6 s >$n*DG4Ng&Yk֭(s3ɨ UD)7NB4Si~J^ iU".;妢S:$Xit>U~)VUE;U*Nѩ}4}xQe>b] +*rSyu7F4x'StN)lStN):EbStN):EStN1):@S tN1):EStN):EStN):EbStN):E4NŐUSN`*):EStN1):@S tN1):EStN):EStNiĻo{q=7Nѩ;zÐwm=7Nѩxi=7Nѩ;z<:EStN):@StN:EqzO?x;\3Z3%t `8}_'_D;)b:77Oi0{p[S))^~e's?>M`y Ο):ӳz<|w>{?Oto{% NOcR8qģϢStk\HQo~딇N=b>O9|~ЩoKO}M{{㩏iO=ū# ~N%Nmnbttjb''\EUԷݬyGOxRpzGSΩv1&+\[@Q~StN):EbStN):E4]oy1tNyoyhvx|\ÍES$Щ#o8):S`S :G~9) zOSbTΑ3`Nt/M>n@4ʝS0p:N1-Tt*S StNԩͩ1:^:E=i)Ӳ}{:!옫S1۷a{Щ7a.u4F!Z(:upjP[Dv EN$ %R%HjFp!SPFa$b2F&(L)J~{4:lnVX4lO*qP +Fbt4L):ʕ+G16t*.gsZ,FdtsIENDB`screenshot-4.png000064400000110063150212007360007565 0ustar00PNG  IHDR]j$PLTE!(/%(A!*T2-?8.0"0iO*/[,-08Bl8/FEDTEFKFW$KFHbEHpJLThGNbJDpFDdH^IP_eL=?SlhGkFOkHd^KnXLw\QRh\SFXTMaM}UUTG.MDxPjbUoUnM\SF`]V|T`Y\xSYU_jrUxpZP_Z^__Tas\Gu_\V`l_aWVTd~darRa|xJeDi\OZMY-\@_FaP3sTlpj]blwSlgRjln^JrphRqgg]vmfLytvrhMstSyĽhIkYn{d~sO0o}pKyavzo]aqGsT[sBxaa[U"mY|N}E`\纉fLjVΆeRmvɦb۷zڋWnĥ؏RR笛kȕpdۗXݛbg^\ȯmu٫n䀻|jʰʴ`ҝdҰ۳v׳ȹwh~̾¾nf|ǔɑ͇ϼˋyѯпҩՇ֎٦ߖࡸ#ZbKGDH pHYs  tIME r IDATx \Te]w 4#t!^PP7E-sk _V6 +`,Zm[D[mA!56(u%Iq.y 0S2gm;g9y* B>( tEP(+ B!]Q( tEP(+ B!]Q( t5tr**P(TW?:~U^/!hQ(']I>?-j=]=Vr+eu"}g[AP(@t](ezAHW tI+ӕ_!]Q(TaP~}ܷ];%-tXZݷOAW6A ]/ŸI?W~]_2? ]S. r}^Yg3r6Ϡ*^O_IȋGʑ>!;ODv'{㱂W>??z9 /. tUea}ye-ߕ_^9Ou⅟٫~^jUD~ZikysMX֐zU?6+> B>]-yS9B-@Vt;WyJËKyjO^7U83ҟ5 0+Bz ]'([d'_+3%y[o/~Uަ .Zw>/1|5d vc}oB BJϏVV_syBW9΄{H)9/e%jɻtXA. ( "tCōiwSϮ6MWv]׉5A׿ ]Q(T_=¾ 5Mk!صݒ5][xB\?5?7j t5*T͹y[&jYm B\WaNס)'_J󗛣Er'>!a+ߜ=]>tK,y6CP(ץK3p֜yݬڽ}l}~|wM_X~{}"V_aS'gQ Jjz"/tizel5K* n/ѥ~r&BWC2oUHW tEP(B( tEP(B( tEP(B( tEP(B_P( B:.#]Q( BPHW B"]Q( BPHW B"]Q( BPHW BP(k*~2q{--_?sB'_9rw%tՔ*+sڵ7}8nܸ%ŶgQ Q/=^@P[UڧP s"LWx2Y_5?PzjxnOwn5/P7IVUzUwxVP[5 &<]A&7I݋۹ҌiO) uKjVWuaޡHÁ [xK^Fwx"^ًAh7EHq݊[D坘e:t#)vqy *?5E[ w-5t&eh"(!)7] ] -PěnMlNLث'sS<8g>㉗}4]1+W{Dsp_Il.=ʪq3^7-9' tm}jdzIfV7B}-LGAftwvLQy+^rlEI]^^ݰTr{5]g?g+ow+ ZbkVnr!){uц;g@(pSj93!vaj%8hxo4{~ᅅoXҌ ظt Bޚ~ l*3ΛKz={;La)[C3͒VkըlMz7MWiϜ~(p,r)1R-Lai5KQYk!?To,Ÿ[:Nl sMXI (EN^ҵ=J F/S+_ӱ>Q廷P[{,6+ oWntU/JהA+{ի'Į3xE1טf9SaCƱNYt/:|I>/>Tg tmn$trsyUKVtoL) bRnzrݞM С5e_z]+Z' tpBf|JZa5 BRRUGƵFU6q tm?]5OxH Ǯo<P(ѵ6Z;k'#:<P(3fP( tEP(+ B!]Q( tEP(+ B!]Q( tEP(+ B!]Q( tEP(+ B!]{޲66 tuL.a B!]?XL o\l6ֺpPߎڧrŷum;<v|z?(+09=V^yԌ<H}^䍮M- 8n֩J+-2>gjw7)Fmӕnojl+sEڲbѦ )&hK؂vQ(kѵ6ICt%ട4CؤO]GW՝h@nEҕHVt(QB[-|oSmGpŘa#|[yG&jEH9Fl>dnU9p>/LGR|jBkvY/ʯO7p uHgD}XQnӛ"%\ĔM!vn.$|>2gj\(k 35B-NJ$ =?Tjr\Ԏ63§]5WdiXRDsvLq tC:G+k=\S?.&O[(]$B:=]Et4JM_Bh'6lz屲pud1f\@)y):Ftmg"uþZ[ k/}:YGC:}%aY4n4>rc晁5LɁ[tea3@ }35ȥˋHɽY`tז唏gadBꉔHEҏR Yl%_X/V4Y)m Ț,B%tYkDW [QHW+x M_P@dXYwԤf&{9^1,),߈Q  VkəGM"jEWy-, u[̹;HDç`ƥsҽEY[IWce ~ĺ\Vc'Z p O3ӏx_h2'(c)^zT c#*RB]OF<ʰ,Tc +s R\(*uޞc,tͳ5U[HPJZ#l4S lbWJu3]EW#*bW]aDLG?Cvv!Ej">J/tMrص]'|˚]'昳9؁tu~VbLUw%i[F)%\߶?S?JJ,yWxtN."ҷkz ]RL6t[*!_4Cz>հ:s*za@~*}-tvZ\CjfZlm+bVHո(QOUt%FdϏx_h۴J=&4T]My J@*ILRtu~*p/_KI XϸX2 W15 5"@3:d~=84jþ!A#It5FZ&3 Æ=hBକKgy~O5D#>'sgnAM,3@"Q>G'YB,UЃ"ZDlQ1qo}ܦ7g=2d4tOIb* JzC-ߟ6F9|E5(kdZ/F>lH0L+tE!](ҵ `AP(+ B!]Q( BP(+ B!]Q( BPv BZY`P( ]Q(BHW B"]Q(ǏB!].x( tGH<~ tGPHWP(+ҵSzF]@]-D"]{*]`]AW=v^ljtET:-?Pdm?teC';Z뭠 9ʧTޱ[oQs-zWo&kҵaGvr8QKװO{T)t| :+ҵ2YG7.Yb ^;KcZGz"=~ [d,^+5z*NU7NTQtX[؆}Eߤn+ޛ )qK35[F`#d/ExLջ8]=>3pbċ703r8]!~HzZ":ƹ+ کU\룖v 6=ډr]=3Ƭ78]Z G]D"{u#]Ow`C!];g"NFW"3 ejBL}z37E[tN(sح"M1p˭e-=ɣ$76dmFRJ|k/բ oso$E:Wf}OI{1`ՐH1J:.}8r:aOOTtӳj(iǣ& 5_Εd9v%.:Z<>*_aOэ۾Ņn %o Qz؛Q,7k'[rgʚsntu%W /U!r8Tpcc{cuH5K]~0xPy?w+LWźaQL׺H-L1N\gDL-1%_2b\N_;n?kx ѵt0;:â4+U4v.cbQl<,3M$:L jrN33ël@ilvjl]KӁ0KpzXӕfvz@/j2eySHW'kd|8RsBB/"ċYr"m&գkpn5 MOlꆖ1ψ2u3G/2į ?/)io_=rt->z)9_ǯvtGl8]+ߒڑ5ziS"p1-.\LrsIո,5D/}!|ݵCXQ~GJ)6=˪>V#HWפk[&t-pK#_u,qSv X OZ+ ;:R~WfL> i:Ǯq\dʏiʾNRwg%As25c(@)Yȃb׉U|pcΤ~ % Xg2mW#yW.MΙC.Lמ-A\w{ݹc>e,>}A9瞧A |ԤH(Hpҟ1BWџ\G3Ėf+\7. @׆jr]ڰK!3v9c޵ܷBWzX&]+%ř8qjdEW)i>h& Y6E@C}?S+ʺp\^Jxra4v_7YDR;X3p ƘQqRGVicFʊI"vsy!p5UJ2"Z~0g &.EWX Eq6pΜeOE)aBW41SH?j"8]!W[J#|m*]MJY6zX֭īS]w$]?NՙڂR<,% IDATOJM497Gęt WFʮg+x?DЁ[D+\H8PttߴSv ];K2& ]w.Gί@9HE<~ףkWϾt tEwcf_P]A.*+ҵ#tuUBKѵ ̎]>ګB]lHW+tuŃB,d2 銺]]4C>tE@PHW+9t{۠m4tG\Ƈg|wlD~ / koC"]Q(T+ZwW1]BnF"]Q(T)}+ 9;6-:BrUgDraAӹ[Wc}o +{۠?#|؛wLv`NtBZR**p-YX1j{?ޔ=&c0 _squm{Lڹi9~tv˦e8j++ ~9d߮N'Xy>5`|&}+ }lIoe6O`%_`)4b5[>&i+tEPDWB.mdy<@ŔV&=Ѱ!d8D(]Mƨt5,E*oוO*,k'[vPSVjFWmt%p8?'2]Ʌ}Y_Pܶ*t]kP G#-ݶtl#FtVBv@muϛBv&]m*"7+ҵjؐtLڜ? 7+ҵ+*mZrO%jwbQ֭$]A[n#HW녃mzVuA!]:]fuizƹf䍮t5,̈́&ʍkoQ4iXGi*/!][MW'ҵZZO GeL`+4с&Q44C=*ZщtEh=#!yrf/-,𣷠7ʁdQ+az9T}:k]@1RbMƍCF={WYxu'ҙ>299s"\>-6ѱV[#^6uBNkf9Te|z1_}6pΜ>ʠg﷢6F9|EuO+<Z4ʊ]/LuH_tR8Y+iðbqԢπ:d~}E2(LW;x$%+Lgy 0nr]w|Ϡyzbut=1O?y?ƻ)]y]@~w?yO^36G=jMnh˟0iGM=t-BF9]ʉWWGt6~H t}~:^ fZc\mi5,n%]Mxx[ ]AǷ-]I|up;at4vuk=pgՁj?wd"]0 PE4AWBq'@O7Ȼ*,^}"]/tEbTM޵xH5m'xѕrw?laqtE"]X cY=꓍_t}5BFo#5E(l"ڍn몴Smt45["NWC"hc)GtMtUoSC!B] iu6(MNq~A]"KfXb~'<^;o[^6=?'yT2{n;1-LUHDWS}ja61xK5LG2"kSEI4T~S']S(a<ʲ<}NWr,P9"@)Ӂʐ? _s)S'1;lN,t&ϙMElHHtR+-^8aKK:@r~2Y6(^9|Yl.DNrQ={t-t㙁$AGn@SkS {ua2^6]riXFkrAZ(]kG"c%K"(h|-`͉ ]l&"6d.G_Kbֆ^=_W;&KKONs~J/XٲI&[ywQ͛Zs=Ioa +̶uśYŮS'[1Eަ:܌ZES[ +N+ _{ZlNlj`0ӕ YUGq3L6DF*.q/i?];E+]X@=;]p_GVοor~+W_.M4,)qsWW>3yUڷsʝ_ڭZ(;Ո\}TǛ3 Mʫ Yu5x,Z39]^~vLWA;ҵ+vKga]q݊mJq&g+\+ T(WI >5HמKWBR* 5ir&ѕ[Lteؐ "&2ѕt{IbNq~ ַ,;LtuN/u$;&sk !*;B|-` 0 bC2$wtkҐg2t^9b+ߑr+t/(n-gX`+T ;+L=Wf`61Vޅ|C2]D:4j]U]^~v x!*G"].I u#][Vl.tufaMx53oV. tu*^HקX.5O2)+յ/E;ې cW%GyKz)N/ëtE_ziADwuLW6j%Ik<69yK9HCW鍋Z~S<~ҵko_V,Ze.9c_'-)q}smҒ+#mqksE3)B) mxzܣH$1(BnT`#))IHצ/BkMzF5rn4i/ 34GWw\f%E6jTwm<'uT:?]T!]+:t/]y7/=qXҤy_IK%<궼k8@(+'p~b'L{巓ƽ]D;I{ORV~qRjn>t-pHI L6g/ rZ9)'ѵ`R 7Q3NlX+XWeL`W$]K"~! @=afӵo@׶:fھaevittv*5]djÉNzڑ*=wY_99iOLZrW'RҺiiMӵIiѕѧ'Ʈx*-ǔlj\,2P#<ޔVAxęvU|PR޵/jevRZڹ/ktH%gז^OiWw]|tܗ 6<=|ę=qÆmAJҤQxο6]1W\V(B>7l8R({d6g]icW'/b*yg+3]s.Cmw͊[M;!]>bp=cʶE+* "$ ^[ 2E0}~xuߖq' {t:eN3y ইԟuU|Xԅ[|9 C.3%O~<#b[Oj5K2\zkA9R:}o1i|p z pNbyU>zifH@hb3z]k‹]E<й97&Ěo|'S ݱXYH t4 ZɊw~H=Bt0օ!_m-T;Q`EEi(UHjÚ ^ڔț̸,an]|CT޸ѕk3V}):]]e3=*%4iDZg87^LFW* tMa-dtM\@W5]y<ғ!뫘!yQ%Gͯ'4ևFj'>l3s~aMR:;5 EЕ{1 l`xn*tuG5;Jd@#7gy_Ա~)[C.5FW}pv(AY޵PL& @i@W[-JۃUZ YtՀb6еeaUny Y][žש% EЕ{ӵp 'd@Sؠ\]t~l-zTԎ9oJg=@W9ϛ*`[|9b]oI7ORQ麣%hb ]/ʱkoʾx^B;@HbW6Ǯ .C% Cc]{{tա/DU4mbH°U&Wak]\Îa:H[#RRX=i,=te̙0-A]Mg>"6tm~0. +Ť-{X@P'te{t:%5tMFJ(U#PS&o!Rڲ;:PzsDs_cd]2rZvbvj]#uJ)"T_6UL7!]]'[{«YxD> WN0&+Sc(pT_k7q:%Y炮&dpۋCfò*"z֜]&aGW]O-l%ǼO1ƌ3~i葅tuy6/{ƃr~Lmc9Qߊ(]'9pVKk+6r~iOe]N%$-+ unAytY=]zMص=rDz^2VFva Mtuy!]x(k73HG9HW&@sM9HW&@"];A:›$z9.HWYb_F# $ԙtUt'78 ]]H^G98:98 U* &~s4S8[1s湢F96RtmNmq_KWsqUxt%YN( a:UV- vGH>dCE \Bp(_/*@Һʄ/&3ųip~|Q{-:a8kM`K]PpBUt5 9zd9(nxg6jk7*EB65YϬs~sK뗛D9M&7dWz&YW++g7g_5$śoɕoIqf-H׮M`KWȻUj#] QE\wkʌQoҦuډ̖6)] 2u~%Vډ"QLMڕ2]/ ʳY/p|d{8Z]KWٛU$]R!]?iR3_ohW~=fRI-AWa?l63'⻛s~saC~JsF\7ĬbE^v@W+loBW;3=vڰAs2Z_] pUjMgm2u9HWp݈?Bbi_|C˧ֆАk=\#Zwg̒g`ӻ-֑/t5R]'ǮB#|Q+4g3 ݛ3Ůu~!~Q bWnBf5tJtxd}L6ӕ?Պb Q*k؍ZDpS굂&ڎ-xF yuzkG_$6WUX\\F޳ETfWGEW+=Ҹ(ն&k*yWن4Fvvb9F0,P (udU(W32=IN~ד.s~1ęhe~ oπlC4]3߰WOɐA0]Ű(*tSV.t*s J7']R:LoQ7HU]e,e`ϥcZ Rc3U_6UL7!]]]Bc3 ]dR(׊]OŸ앉̶7Vt(ڼ;o+)mdc^t}쯳(Pw3Y# t\Q:G,0C*kEw=2ڨz +(07btNmMq]TY w)#_Y`bU(׊ze/qyÂؐbM7H+8'84yڼZVg( Q*ʁY Zv6ų4vK'k79XvtEU٭+ [+]/mZ ·wt~3H5kw&h|Joz:X;V1gE}ҥ#t#Lˈj֏F*gGJ[ Օ_ o\dqvdr*s9zsM @X| [ǔNɔjLQ˳Gss B륥 9 _4$(2?׍ cM%]-vm 2ѝ#;E3on֣c _{ ~ Yi;l{Cv]2]S"oc>SC37ZEVk Q=PY;nq+]-PY;e{8]T:I8lcN54MW;l{k:MTU5}n$}cfGٖ57:1';LGO8xEJ`@3%kTPp?Sе_TϷqG[h&q2<(0"ОW?O~d!¬Ps~j\\rj)Y(CaQΙl{MsYoR n&Cet9b&J/=c⛡e {v:F'f>J)[[&ǸHnkg;HIđP7/JJԉAź7+GA |5)q 1S3+#_ ո>RҸ(@t-\Iﭴ2Ё ] X`dIB]]elf22A ,m+%oc>4]ͳgV0t( @K@Xf`d&i/$)Q](MP~g<(#ǛźYa"iZ%@zm {@NW󸔛|!iU@:^,:Vt._/*3G ]oIW7T;1|ʳ৊7tyG/OW4 Iȥhԛtk';Р|Ǿ\v\؛+nK%,gy!t^ E?BV:ҷT6y~rL$+XX5_l#vֹyٛ@\\ok> ]kTB3BgԖ5GJROd`5ҵ/?%&(6v C6XˎDXts {  ][ŮDuѻ++ Udt5]T)9ND+tCTStȣzaobλnÐw0 _(!oiy-;2+_8[Ir}8`3Lt++I!BZyޕ:Lj9GE齕HWkI:]7 }s+hag7Z>GDeGWfҽG:ѕT<둕V)YIzK |j)u|@xl(3|^{LHWgkBt~A:%]~Sѥӵ۝_Ùf8 ]H<~t~i0vet*H׎?:MtG!]&@lQkt:okDT{PLǏ٢V[ eHfU8zM؋u+]1[b+!]ƛ W2+Ol*!Kl;cCaR!>F CQBuNti*b+!]ě@6뷮Ů0QJIJ\@*jH;X-h͘2r3vM A4v ՕFoX ϣUCt55A4lF,F1GD;י,8q=g8 ]{h6oX Oԁ̀sE(ldťY9s5UNW VԸb0 ҵA׎9 ]{&]MP*z] (5rJDrҌj<*Ǯ㠶(̅$AWf"꫔o_]"pfDnmt%]M z1]BϼEj`gOW ]U;TZ,̠'kJH94oM|XlOW:;kƸ,|?c ˎ cgmS뭳Gm&rgV\ZogV!Aw,ډ<-voEH“X4|2D7)xb|:Ew1&f'=jӶ)tm(]"Ѭ4lF| VO 3hNȺcAAAq&)%ޙs"ǮE :Q&s+%0wĮr~t&? #breoK8k"]- ][ڀoU97iC'K0xs0Ձ/w!ukH2M8m"]Q]IW;[ >| G8m"]QH6Zf-Uaa`tҵtm9a){%5htkϤ+[CWl%kj\N}=J~>2Ts4k+n ]yQS[ ,tݥstunTt.: ];YU++-%-NtAҦ~AX _+uw!]5炦ݞNOWt~A6OWVS>3tte/̵{HJCRר{FC`p?!!mz/ 7q^gCHֺ#}30X2"s?_/ðjc<|Oet~Y3C>7]eo掉tui1xREiJk%quNW\K ZOrsA#G IClZ Ol" Ec:k!KL?_ vi_>կ2zX7g2NDWG;V@DQc"]]lV"QE+G=;UC"tm ׷8߸,+;k{4ꆖ]ޑoCiz5dEsЕm@;1ĸFL#pҁO:Cr8]xΥU~W%o;&%ګۦtRO\?";cVV/ѣkso@m:Er93=]w0gM(OjXSb6}QΈ9o@Yl pVZ 6;CByTf/Dtu ;if~ox;&:J4IX:p'8OFד&KuC˜J^ŮIW xS h?w{6 w ݱMc ϐR]Q(k;F|0B1U^F&&|㯺itFJHWG5 e37yn)7eGl R"f+c]YQɱ Ex5lEȟ1;p?Q~s3s ]]y :JHe"oZѵ!!Ua>&E%|+)9D;o6Kߙ 2ezU˦_쁱>A痶[ ڡZՒ]50֛eX`X$?*Lԗ SCseI6/%>Q=UqVtD._JWl%k*ZU.0)_Jyt+5+/)!)Τ:{k=h'f\RHW_ڸr+TUct1r;#Qo!ـ|iCawPR,#&ont]ͷPtAq~QoQw cnr~iM) AaifUf@+ŝ [x1,3]t ֧2@HCV8H:]ÑZMW;h)ҵtԷk\mHv+=yJٰ5DCDkE*t'UZ{.G׶:0SiR^ hχތzv J11/^}aJk/Pwm ]c69ktm]Ʌ@SaePD)6t=pgF%}<ƺ42]Izd ːF׶:40S+5&Л`g(Rs`0_W6%rb|%k'8 ."gנ۾ ]vcw?3C&뜟.H&ω6;0S#zNj v&% )k|]Vo0} WrI: p\jsqIa6Ż]Mr/”"z*5k <)e~0%P$$/?|]͘S +VrI:oK҉ dp^k{Txv=)mZ{vp $7b6e1IY el_׆l%]a3] +꼶/Hn|U@kh 3eIJHcc2F5Aכ|]3]a [% /w0 \c69ktHf7$7LY1+πj'hDW_W1fT_% //lrjs`- k+zJu+j9GEtӹ&v]bw v յظK1p9M*A.sglPQJoV:['+֤n ҵհi%d/ŪcsVBuoN>6ФAh"s"/+&IEb*s>ո&ZGo8Q_cß\2"I͘|"%7|GPq}'/L$ǏHZvA69R/bM?V' MSyY1i\N}ܣ :TzQQLW!YI &((7RCVUнV8tEЯDkR  IDATYQ k8qmfPR[,+&P!)-s>6ҵ`R\#ǮKUgt'|>D\ЕO0 krEDt~$HWkgҕKF +.QnMHg*?(l/! I$;UQf'E Q2h2Uڴ~SL(۷iWڦ!LMߤKtX$eke']=9^"?]3m{{<ΜQ5n: VsK< _"#J@O((kOfFM!]?tEFV#d:jTl/hDbTVWѕ%r/:ܤ w;JijŌw$}'~2h(t U uWEWiRF4'(.]WJjz]qzJ=~BId[V? 8`@aB+=z8{ Eט_L<ґHWMn~.Xx~!`/QU [*ݾ]7Ҝ`tW6mz/Vԫ*_Sl!mu{2ږ[r10ppNֻޢ5Pt 8wҥlÒӔK)tB 6"7@WImeYM9AA='XQ:D%͇Zi_ĞQ_8teO9?\aRK J*EΗ]owu(} A{ɡWW#IHW} զ`=2n6]>;2RǮRJ] /=8_tE}ϯk /Ѓz#+ꫨq/?::ݚ˴WGV~ڒR#*M0Z߮K}=>.k/E 89,+:M!IHWu:m* ;_եmLqE}4/bO(t^y=(ԁ%@WAF=`}'򼒮}s ]IHTl_kFWu ]?ޮXߌ3 KePuLCj&]c޼]鰩3 7NP9߻?HW}5I0[aU D ub7ADA8.'ye<"]w(:Fu2*n.^1goQ@]ՆrW~O:^+o+ kiI8tdžt]7Ap zڊoy?*oO]a=5Uٝ93!e*׏Yz44 ]&5d 7q6 U$TU,-q0kH8t]1K/stM+TmOdR(+k8]ś}?`^ S+f!]+Tt:8])Rj]b&LCeBWי3n ^?_"+_S=>2@y nPUٶ}Zӹhmmo'7P~K_x_\gI7A>wG{{=g>tIU=f]y Jer.U!^0WEn]l/Ut.>X x]ck~Y#u;IqʌT}(m^/3uӡ*]Rit߄L)H9WXCi(vˊQ:kxщ)]a~A&jӧ<^Ap{L˸$'s^&,]ڻ(_ `6]cbWAkNUӣ+OO.d/ܴWqCtm˭Ծ-jg i;-脮_`zzo,by+OŪqWSda`Wj15oTܑ6GwނqW{hJoeó`{ݏtct8 /Hu`9 K"F[j ,좶'pVKtpzM+u2gʌ!6 5 ]mΒ.,#u ,z:+@#]XX82JB|ݳ*Ik%=ߩt]15B:Yk@ՖK(tuUxȹL i%OeG<[YHCW_H׸Е6,9MfXJC ҡXJ}g8헂\5s%y!W- ]F34i~Aj}t S3asy|l/0虮0>')O_JH#]!]#/ ];6r_55]o~}O(?R^JL#]!]#/=Q^]U 7$>R^JL#]qd@kt~&4 w̯?v!2)rc^\~<t15x'ẜN{ͷ=mK/U[$y~a~}*?RBHrIјa?. aR-TWCGfBԟܱ_|ԾH/.}DtME1?Hy RB:ٝ|MPʔrOWvSxϦ_wq7-0h_uŐs}+9Kn#2{ɩQeuz5oӦ]meCny0蛮!6k~9pB`B:]@qJ%߻tࠍ=Tu sCnx|=pZɍy0}0ኑjEjqt6]Sܴd6Ʈ 3&&LNzsnѯ9+mF?Яˏiby^IZOXfK,7iwGڻn 7v0r Ɇ 6tÝd!FȩH$8/DZ!cW_GaCƅM0%':j]w*NҶJH]ݟ0D0 ]n]#+_U`X^/ Vꔴ][։1A$:]ܯb/2t OK댮1xK/ tPvk<ɇ2NaߵVge$\U2G~G~- tbp ,s,s_m,Zz(&zj2KHW=ӕ\yWz(5iEV\0,8֤Zy6ots9ZoIߞ}ΎUegT}W)'} ~Ubp PYnHscEXz:i(w,xz)]!EV\pzui\tsςU՞Q0iD NU!2YVX|LmZ$8Ђ,oT3rzXT̻Xk(>AK߉iԃt I9t _dŅseq_]#Е[·{>H߰uV>2*2*?-BSFV+lB]m~# ?[1vT9#,ͼM9ci)PIi*{b85kZO^ $bK7#]g]#2 8ڰ'^Qra0|wC՛~e/ [3ӵ;0ĝ!6j~>bٺo녤+:>gڸHѕ4b,ҐHיIi6SHb>; /Hשa&2Ci*9b<6dgt@9t]cb~!Braj%T*WZ\snsYfpݚW ]r/7@j"],dm!qX[vfЖ{QʁdLX'cUCNJWڗe /ʋc_ /} ti^-J#]!]MWgɟ'`h:2OṳH!n[5AI-pڮ')h03&)P\ʧ};`l8w;mE2##4DK /HשW l -2\ҕOveܮHWߞ|1ō|dhYyyˤqIN=ڑsCف|avV<4t{HW79BW_ A螉t+a RvN;Zte7_^X5+ԂTpe }UL}#^?]e~1e]WJ׍BWnH$+6FL4MM;*|돖 } K:t/J׍+Pks5@W+:b`~r\_BŮbNNB Ut ׍߹,t }'*-G:2\G2dS~wB[ȜJ>gJzi\5b ryUL8{އi~aa]ӵ5&?]Sn[ZȞ?^>B5O'=2'!uHW\/b^KbNM0^麹۴}hTqLsuH:ٝSG[:tK]p^vVFꜮ_З(;R2 {Նg 3#E&+]/ܞcKչ.Ni;e忽yHϺx~eq酕CmڹH斲 kS4Jή4F9Zk4ZS?I:,1k2е0i<Ce-܃ىDawv_ KIciKg%] r5; ~c'Mۜvg}DsbX"~7/Mtu.hn;J2sluI7i/=tm,vSK,δTz8юbw'<4Og2P 3?'5YO܆tEB#ua&% $vր+ ) IDAT$]kJ~IW# btuM?w!/Mo 5.t+=]qWSՖր@$Fsջ㧹detu]杺ZIWqZ~N ^?6kupaVr魤0ꫨpm]y9(*4ˮ];U򃖢;$)5t44 ]LWY!1<϶ϟMl7ɕk޿$ɳ@L[/q=^Uٴ՚O+D"]AW3;R9|GEن]78Sm+Xkt=a-g{yz^W)tU6!3Kdd2+F"]cI׸u twBOtE UɁz-th~Ajz69Bk3a>z߼uFf~qȚU/ ]5Ԯʙ[ݢӆkû=L@soI*Nyuؓqd`4C+5 \Jaw;_V:td6?h|xyz5B#fr!Xz3O>Nٰ)czac~Qsy я`[Ҭt0]1ft⡤ỾtABf6Pz J$:BoE{?JGGeɩ;/,v̳P$@w?O9[f7QoO-,x^/sok?ͭm˧ЕWi{ܤ^#t2j}sQ]K8_T\% fZAk6Hn;{3fIبGҌi恅G;==eoBW!8\["\]#6'y+?]a~QsEޅ@V0 ]uGױnx_B;wz, kHva%vX('HBW/|}tʻevln5C/_WzH/Ntm$k/OW*:HWu@y;]%c U0bWIWWAXַJ(NJ72 5(ܯ ] ۪]#6N6k|+EB>k/OWaAꎮc"g7" òGͮjCZ9lf:!]%ǟ_`&6a{wӻ+]JFHIҞQ_]t&92 UHW+6LMZ| zkj Vo69ۓ0-S)*ո +֞7:]ܯ}~fϺ|̐Kx]yY(8'@WImeYJUtHWoHil k֞@"]Aש<:Lo"[Y)t&]15Bٮw|tY,tM]k,4 ]NWr_}8;^9t!$yKXaF+==!Kr/R˺+~@i15 ]g]g];nYEa5=Pwv@iq0 ]H@p/ o;̓{/=dm(&qt8AU1Ĩ&#-gfmvW]Dj_I!$Ȁk ѫ )]7@[bWQhVWU򩟶T]4Ĩ&@un(=zm{`W$B&s71X_tAbCFJ/?YX?WUɴjTUbz ]_+%wL&1X_tAbCFJ/'5l_[W*B's֛*ˌlPBW/1ʒ1W=5Ro~GA^V]=tdL 'lqUЕ&Ā>8HWle:ϸw6Ⰷ~Qѕt^rnQMT㮼] vwu=ުc@Ez+6m՞y=~?m87TtuUoxz[қ*J_۰Z?HTཫ"g@51X_\z ]Ev^ԩ3< YyDGw,R9Եš#ቒ6bKWl^ g#]4,UHxw@;9_ 9P㶯`8qGmo>>?%tE@?:"]I {!=^c>Iب$;Wp(s],huqy0`a6+! tiߐHWk$ 8IE» /97]7:ȹG[H|/>`my\3d ]!]3lPTm .K_ $S//3]k)j Q\MWaS- ;p:bWj[he ʔ̗t$qoE;LL()b󢦒]\lN}q@K8 { 骢|IENDB`screenshot-1.png000064400000150164150212007360007570 0ustar00PNG  IHDRXJPLTE#) 0N1G&$*I;7.Q@C1XJ8!`W$(gea#*{Z0(,3-!,KU!&F&#.W@*,/,).A7/S(3.Gj"C,-:/+'-7@n%+4s;-[<"1*+Fu@DP/EEFC%HC?n=)PF62MVN8NYIIdDaBNmMJ{YHo:uF?LSbtIPC STRF iP* _6cwWqMO& kXgPga`c^ZcQcKf|\DUHXH[UFgY&s`ixUjh( t~eU]7hN@stqm V.ۺoVn"Ev)itHxJͲ{^skp_~kPnfIDUܔ\[܍*ڌVH韣wÞzۛ`aNН|wŞA37R׏@ W#XA  @VXA  @VXA  @VXA (xjZ^noB mKHoӣ1'VL:3- 4I'V|k1?}{ `$RvOu@&nwbLgKfi=0X9Mi.g`ޡF@8Wm{ X%aW V+ UrGI66b`)` M*ڙk`=Mg XO6, V3v]/81e (#2'46KOʰڃҲ'36 VSdx+Χ8X=uww=ծ\w@ PPUئ'$p3݅6tk)ӣGߛ;N|)}x(iFX^+֓)8:(U&DX=`Xp `Ub=/>uRϩ}4me/9X+ĵ^3r񔔷wt[c+ zڞK<@V>! ~N}yo,-DXxs`}`;n$9ڃս1i@ (vjD;r`e2zAonD3^VVRkг=X`@orlj:{?t[`띁u. X]Q 9IJGJy+.́o=U*؞ wH7j;nᛞGTX#>W~7ΰ:+NuثW.XA PPՔ ~a=E'&_^HcjAڇSTLaߚ \k=X2IѡJZ[cV`<#,,*A5*,l9HE8Lxa:+öb$1J2,"3s(~CXV|z;g:S6lvo ߚrF K`??-KI(?i Xi懇_V1t6X%#H߃eNҟ7`@A VXA  @VXA  @VXA  @VXA ȗ`=@+ X9@ t@  `@  `@  `@ tqX{o=+ `X~u6+ `Xt kOz^6mzG{Ats@{ `@>}y,0W0}Ć\<Ҟ.KcXk7RE ic[h˶g6Ў8jγl-$5mhUɊ;+,ED|zq>cfRX>#%6F|:|9!CV0ĿT xsL9,"Mֱl3m>K7ôQ:>h1Wqg-ئEkj BR$w<ݺij3 PH^,S,n" YF^?@݂s&yG=lZfOk1w5V!cs Y\ZN'rdbqN:3*YQ"tzkDjKjNz5*tƑ%^2xqxv ]4(.g} S;O)0X _ĉ4Epz=e`+]jv\x:yĆF[,aDH-ݪgӼEzEd2 R.zW@R И^d jxrߵ&H *ex%Sdvi;l{Tw q>ڏՔ6#Nn$Ѭ֏G3VV>X2%Ӑ+yZ XKl$/t N>q"mdHV+i) ]E[}mF ҏYV'Xl4^.`eX?ޚsjxv,jm Xiڕ$+KM"DN̿ҖUjbi3e(Boo,iK d Q\Ј3p~ $ku1u.ƪ0q)ҙj#Xr PK74|uk #"zݳG)~+ԓk JL}7LG %utl༻hJl`-żOPȖڱY is-մcFBX=4>c]6bJӑAiZ퇛"Ĵ9>CV(7ǔVgFL7i[ս]xap,vqͻe}^%ɢͱ}1sKU-j@ۣp|EFLˡdN2RՔ!E躜;/YٚpfH h["@@vZA(k*|UBԪsRjT c/#*ꭸ6$J@&[4SR,S*vc櫢*ECL[RmM*VdKhd4j1dx>Ag8Ls!Mv/Tcj4}k%5O<dJu$8u[I8x>Pz_2* ͛lV$ K_t8e&08*9k Ai4_`ӢT*UΐD\i),9`譯V]M%+UI6JÆ4܄mF1O&nT T{VF2n½.N]mMf āg ckẍ́\q4|f"t'`feIrYnicXXT%NLAiʒJ  x8lF)-OPe\ p )F-l$e˳eЮ (J=A y'Ŵ@W2`c w*` pXA +XA `@ +XA `@ +XA `@ +XA `@ (zXP @ @ V@  C@ + V`G:K/@~vy&on@~97l9s^? Xis7+7ec A~mw $X\?h=Xk[lVkoC`X}k X~`X`4XF[ `)Xk'ڍ9RCW*KsGEV] EeYiRt}VOne_/=XF+s#v`-)GI!lj[Q}lLk#6.2"Q8`\5Fk-m8/YM`-Kɢv;NGd^LˑU&%6.Mn#p r*U\Q2|;gsˌVj:' % /\ek rZ=2:4 XqH;u#L9+`bh>@QIb/>C"ByR Fle3"^PW7;Gao&>K`05s#Ų$|Ji;1HW?܌zIôfB#s3(|S5_xt*FL{YJ؇3Q+QQXmXA>kecJlřTx6 h&/.WJHkY>`+ ET-Rr$~NR(n/OȲ2V 1V dd劸V VmJIQx4f 5bUrX8:|E,Mj3R/bf zHXO05{#c<0ﵓ΍ #YztF\sZͶEV{:M`"*4|fO!;XM2 K `y%2EZyL^=elXeRw8~72)+0jc+sbz6]rF6J9Yɛ%xSqfK)ĶfH;ϱzsuaR `yuX9dyctUl3f/(jk]LTE2 -X.XYrjTtZyJ,(le5+|#VW O`n{ <":Zdc$s|r٦U1DRL%,l/kJ*O`%lGS.5VqsVu?mz]-k M,mEUOXq6E. `εЌ%c-6DkOe/5Vsl 3c[B1cmt"Rz-NRX **h h!CƊ1]C|Jήxd"Tz&-l$X+k؆.JcZp:lKV|JR{'k"'5V!gV+ȋ`E /1jYULۨJjY YE [ S U?WF6ŵVȏ`Ei [dJwu| sV|S" IDAT @}Vtl\+%ZcmB?i9b!5+) VFSd zZܼRcjG֠sLX^a޼7n`UitՖR SK ^WJK%5WkXI ŞZDn 8/+`~+`e]*3)XV4Ԋ P^Ȕ*.OPe62v #?~qbT)Vyi b^bJj٨vĠ݇)ItFVrt':*%xMvNZVb^v{~Ƨ^)Aj~y Vڏ5<*R\+=1%)YR2x?CX9$KP`e"ôPt1{  MA V>6$ꋽ`XA>Kv}cI `XkoVeRV `XAVk_6XA oA X{VL֦j s5 XI A :K+XA `@V+o@ P+d JV`XA + V``T0+97 TBt o6}3P Qa 6[qçm(X:mV+z`k.9D9<nQЮwe+kGҋ-a'`v+==۱2` (]$)|ޫe>}:1*QϛQ3I-34c潦t0f1ml]uգbνV+5$.jҫettJӫްK&*X~ruc``y_?aq~;7D_o]sM[N[m|oѦ͛7J-m޲IƓdm-ϱn{^_l]ۃdk }Gly?[Y(65 QO];/[ļ;=@jKfЄּ_8U>|ռw͠]7sĵxAtc/G -u\^1hh{ż_^}y1;Xvda`L^nxCKjXDCOhϏw76w<ЈV|j A7̕%`qY?uVPpV_߹Wod^N݊zqV V #oָ]x]51EwXmkEV<Ƃ%c/XtƝ'ﰚ>b`'6~! >GN2N<>jx|pKueOS.=CߪoAc]HP߲,Lіա[dn5Һ0@%WMqa̚ VYNPhh-Gkmo&=ZXCF7/q1J}KRߝ絾s/ne.%_"L}-$'`D}a7H+N0ox?Cj@yݶ++p]B -1Fz|7|8]/^m& ?'8٪fBu5GV&Vǟo RqruoR{};v9Z ZMjXuRZuY6o;.GVQX]jbm:gN ;=+KI=X16/l LұU͛H`epeKb9pu=>L&uş~˓dHWeS;4c9nr.!dl!u7 ~@MX% |/ߍIyv`~qZХ}.ސ!M5zqHRj3?lފwnflܼ:w<t;`]W!V})-"_[LMqiƺgx:׌_ԓi$c=X`7pF '+Av|7XI* 9`hV39[5 +->7ݰ<*;XINO.+mvݘA˦ܨ +;$ﰌ7R;)j;Y{ֽ}?w̍`2mxdyVϵַ-v6Mt> 8:tK6k{%XXY\OlS_C&Q+:{K1B8 D 0G LVC77[V&(X[;Xdaplh ZFkxYzo(EuW=j o#VRc-k}^ku5o^m=X F cQa8 M"* ) u;_.K؀_ lqm_xI:Z p p/lڒMphܹn:$~y>XyWpav554J?D~8<Ϸa__6:l5ڰ GmƠA#9` :q_7BzߟU Kq.X{8g5X^XMY6Q<3z@`S"ڋ0vX;5UIWqu PT{75El>p+};c1$2V(2v`%$ g'`ݟ+WWq݀,[BƲ֞ٶYPX  &fgݽީ+kw ؍*LLWtVOӟ_ݟ˫_k.X5 Ue> cާT81;5kRԱjD:Ձ V0%( 0Xݕ/Nzr ֏5IFk ֥uc0z@+@|jD{#B?Vfakf`>JYzD5KYٚ `͚~Ȯ.^=B[?_D5K=I,V+o,~ko[(f Lɚ `Ě Hj7.TCq&]7zIB9Fp%O s* ܚQ.%>g GԈ5wٟA{nQb7X{kBBÌeO ![345~)A}`/zfВ{/QfE)ouH{IFtJސzuR)u$ڃ3Vq`lȲ,sОyU}%X{mʌelLT@pX_=/H5>7̚e/]`%F"KD\u+'Jԑ$'MI V@q$A|q,;a͂=^EKf`GJONb>N3^OX Yy-.d`1b^rzsYoH`/ IV@ UzX rbIΒ9({,R))~. ϡO y~k=]fbxbkFn9wKk-3%yZr;w0w|akd{/-UnW,J ^Z\R >R;AG^;X ֎,[.4څ|Om20Xڽ7nH~7ނ~u ),T 䝋k X}dkdBL5(?X{ib{$o$#s蜕5fCNk' aWS;+_f3Vr+ 3D,ŵ Vo,;b͂\6cܢ`YPp|L0cz% h`\Kw~t*.Ňavw `53ҏno] o`DkކU0uَΑov `?5.c5 3pr1F[B/|9{1{ ֲř!| k XgcҟE&LyLl:8GV+zvD;$*f/[s^]z25^~޼} ~.sv6g?4F7q,Qa?XI+N\8=e/㡽S^>93+|) VSn,]&0XONys)%;y815`䔀ǒd:`&XC|)Bu[C`JQa/Xq¥)gc٤ƺţ,XKƲdU,S*p>j0)U(KR$jm 2sW,#?/Of]c4jR(yΊ.ф8X5K05:oϟ`Yjaqlʓo83V/޽2XŴES]d#1Oӡ0qjU\* -u<ٚ%=]:f^X8)oкwFkMy0XmSpf1/P`-+1$ŴH%e,4WHI4֞R[ V[zb5[IU]Ccx~:ӲdI,HZC8$ bzEK:c$ V?X։nxe5xhٟu,|$8A{~4W8t kaʚ=(Bi5u΋/\ۋo&h}O`7 R0_Ռ岈jV(22d+!pgf)cp1^q=P&N}] tkVi$8d97࿆%V{3 [hߔjǪ{jb/Oc j{xO<`5 yL{=P& XŲoȶmB*-,L`/Ski+yvi>/ c~f!+b"fX l2]฀*U0tj͂7BuvXA~fuբ:=\W$ }f!|`=$yLy) Z ,Gw誹j=$h(JZ@ʆtLTE6tU (lK1oQ!XUu#sgO=@y V ,Y:Y JYB(Y.b~ZXۿ[4 n,[X{cm{k7, 3Z* ]Yp!yza[ #'B^r=G>0[LО5kTy9W(,ck'[!Y0Є-AY`5A_o2K`5}~CGk ܵh n`kF65ɚ؎ []+W3{5n(pJYY@ 3LQن4`hbܙ栀oXw\غf$Ǯyzzu;|>Yŭt޵w~ufCOlr]|$&[m/yZ g;3/?< ="c-~-KR&,Hۗ+2`%Iv>N\)X22`h͢y 뮚ef$ULb"G9BdN\&i͞[ѩX=Z|ոqA >VΌ▃Lj:pq|"$mkqvd[5X/n=(V$!޽ IDATɚEs׺hY3ꚠ:FWUm6mR0Y̋pՔQVT=ketXsɚ<Ӛ"gopf\:ZQS) zf9񌔛G:f|z VD+egQ)XlCIƊJ^+"޵[:ZH`u۵ gZⷈwMy2>6Ι5[Z7BY'`>"?k@%?qJz\| 1$V,"ϑ޼rgc?`S^֡.el#_9I|d ["j"Ktٚչkނ~u 젠` =/4mbI0VC|-c%VƴbVBeX+kw !V\zVSO)#bOHRb"WF\ S OR?I|X6 0K VAAL{_`[*3TiJ!+0{2v)jeܼ1ѝ }`:-@n] ɟ2"Ѣd2=}ޞR Q+gKO)D5X{.4h0 +ü!X)& *c cZC<R`bX}` @eI˪(k*|UB /+,bܯ1|&%8@V5hj#kTk~cuQ\="9RwV[BE:uo%? `-+1WN 4b +ɗE~yصz:5kILX/ x ) hXa^aؐR0Xc|yC] 9*VbXpz15K{@t+{<;tb{m{"`-'=:J!V0%( 07ZSӈS.`>/l Щt`O!ӳ,xڒd! ,Y:Y\z4Hz_*) +'X- eB-CH?$y))HZ1 jVǑ?YvD̚K;;z4xj'g:\] oGX{as@Q:fY=ɘ !vf3Xv.֠?њ<*s1b$?m _sDC>!?ڶs.mG#GkSnP%O׻0JJ]7sy:P#>%3/Y57 AC qQ48t$yyc/G -dP/ -Y%k1XCYU!".JOp2'v[xfydU=B}W)4R-H}wsKje8ڈIShՏQխ=WנKMKFJ MJ`[%3'αݷ Gk5nn:݄{סrSy]$<Ʒ+~H[L ǃp'kfBOOm32ab^%xZtvHUӍ?Eo4ҒM~/u!c/V=j{&59o@HvcIBٛj$ʦ4/rcL`=XY^ܺf-;lټn 4َ|ǁm;mqу5ˡds޹Jk`5{(Xo%ӳR#&UBj|Ji#Io _>P0xfPNꙿ]l.zV8o|;)ͷ =&V X=XQ}U/RV 5qbeIs{ ҈3V62+{nubB:H@2VKn3VzwK#$x YUxm2鈝WO>Qc#"k ێtV,O̵sVbd!;BOOʌLؤ̫X+n䨱>2jIIm"5XX#a V߅5 X/ߵ *7^W޵IVטX!VéU}f&b!VbH`e#l;vAzUEBbLBog[W +ƒfW XHo׌tU8{&dmė}҂8Xť s?V(LVɮFid~bj7"݋\c`DX!~$1vcJ4aX2=?mIqAf;5QzIӓv0WY}>lϬҶ 2XX`;:kAз@:@ *[9G`+ʄ޸X*A[J) X]kkVz2[5 $/j(h'k}b*K/.Ii}|U†\rwXT&6:n+K"sPs,KЂU\9=Q : XklYzmlu|m!|B*kmetH*e:m6m|kab=cmЂ6m)!s5K{@t|WcU)v mzY1|bnFjیmQxT~j/%o "BAT凁"12Μ񪝯%Ee#u,< O>9dRVfiOfifRJ+* meUȆza;BLuz~S1A6ϼȖk=0xf1}i˖e˶źuZ޸0u!w!qdg7>ۺCs٨5}Gm:ogwٗ?1&'"̟{5?i`O15ܤF Vl&qP {F ٞ RGksQOQ$!*k+kX2.lGc |)+-%[Tl-J"S2[SzY׊ 71'kz`ы?l `[.#鶸,go 6'~p9C|Pԫ&, vn^1yzˏ*J`d3мOAlVkp+\`J ` P"+@,T*k:)T^(Պ •|,"+TA[BYVtql™3w؎TH."h;ͫf+Gzv`"fG'% Y\Ud ܮǑqiHI;;fg[Gʞ^\>!5~yJ_`h͢%zB:sR"cn#Hڎtf+^zJj{f!ORr>d?Ej? 'Y\JЋ[%rGu^w9:$+]S󏶵dTc5 9W =Xm:ZCX  7f״ׄ +l8Jac$ڎ8\Dv`Y^b:-@" VیAF6S\K_$Jv=^l8z>7D?ۦ3WWIyv X/$?VkЃtqHk 㮕4n0ulk'HD Dkl|H;׬YdoM~GX ȀX{g{XZXAٶߺ7AK֣X P@5`;Xa V0%( 0tZ 8`/) Da^VfA`1 `V ͚_lGzJ@f+{rO?DeqdͲ|_p|!W ,t%PYX0xǚŻ;;Yco`5wٱ`$X}n#Y3_UkamT]ʈk'4;kȓp'ղe__ʚnj‡#5(ne=tL٨ vLЕO,Kk7=G̲b#IRPr8W]=~螩߬M `X⊮ dXo Aޚ% lG%JZ ~7-ۨj`xb8Q:q#Cy^ 'kq`lMxw*>_L+硛/=C?!]v$H3H{qoC=?+kڸOYv;5ڇa8mT6޹{=y滋/rf,"adU[M*v@ws'*'dEg&ӂ }0GXYP\g` z55؁V&"n-۲A S(-wIˬzNh+ 0޽50U( SD=%U:&I|i&׺ U! $)( n`u9ڃ5؁Vi ż6 A)☾ ^͖QZ7!XZi`-+1)c.OmZ:K j#هZ<&bZ@) ,W%ӻPW_2"f`f`j01R Xͱ\4-O!R4(O:@@*RsOT*eX63jR¦e+5KY`=#*j=.zkz▱jTr f841[6zXUnƒA;Fj[zˌ1wc`0X)b=12Vml5INij+ƤU\jzF6{>D01cmL(h XVF68jԄ֔XljIV)@N-[S\MVPԦpeŤj/pb5V=)3-#Ufl\ȚZIVmBN{T+*T WZJyr%kET$KlĬ]+SXYlZRm)Sefe~(ʕz<&sU)m!2BSդjiI֠=E+}Xaϟ(X! $/X VoL+fiO€C xxlkDkvak``r cω5lWjwKO,!fXA>kGk#;xZooܑ;i¶V>▓.D5zAڎI{8j,7S=gCkW5KKb=xHg!6 wJG9ч _1OV.k\|H1cͪ(`Ϧ6R {k,B4gݘPP43l@d]]wX?wf;VÂU r ]Llz^ =5>lKE Nb?zHuX/gkwd} 8L:?-g؋MN P,fQE#B< ƔKfa.vP>x 1 ա!X VD?os X{SтOԋU+C9cB }.Vp:8чU ~YVEx-ByWv;Xk" ObЊiE쌵N1Hm$ͫM% o)O0(%, 4u^k7qk8X&S+w;P34CXp(,,]Ӏjj_fY_}V]U%>:yz^`ҊqUNY)a],+~/¥^|T L,N 58.}9-%! ŕ7n4{5kEÃKk4ٶľ :4/5,0m'a ֮jmJwi6iO7M wHm`vf:$Wpsۿ4 jWyHC0,bz%tRױJ`ѼkgLVe1w| Ҹ\J*XjW-kܼ*zqk*S+TZUo7þtu%D`6ڝX]M`% yvf61}U{fzn^!`i`ۀw*7^߻kҖכfK+֊7 *V 95K!SW7CCTx2XõyCڪL$F 4Cɥ%)_,uQ<5<|?z>Mafn,\1zj]F@晱|{HL(+9F[$g6t$gS(]=[j0ՌWI/Y9xxLӺHSҟ3O,!)NXæ[Th `-CѱcMm*I"3X6ѢFFyA eW><K1ָn+Xdt``fteXCE+VT]+6C{ \!VҒF:vSI)f^ S*Xpfn,\1yj:Iᙱk*%&MfB}h5J˙ jگ VXWFk,Sq. ,Q&-1֖9(rjG白Cv`?:@kPiu4stf+t t N`R)EaZ67] `+\+Hk Xf+Nv& |3 T1na!-F_ޢhK7e.jTX.t[ס VjOWU1x~!A(6n`uwi,6/`:&ZUX;kJ+V@UG3Gwj.+h`EV6_ 6X;+V/*N ]Sjlm.^u|VVӊOI0;XVXTܴdzi,Z*Jnl7cVӇO] ]tۊkW5+~T?{ncSTX]\YWV:v%muJ'ckdžEut%c@UG3Gj<5˝ όUh2:<r5[(rf7+UXlh05 95dB2+m P[yZh$\=U ]$a8b];J"J\\Y]*F ] ]gDFZj0p XfAh3:<3Xo-ʳΦS]V+.Z ] ` tM,-wl淧yeVY(oD[+:e=3V`^^`E -J+Sqn.6vX?S\ZU ]O5 }B=3gڙ !VY|FG j$= Q'°bga4b|`@"X V`0 (%, 4 _(Y,0p ~C6>X>rGGf& YҀj73d?֌!,ͻ%Jwj- U'5K5_`U6JROӯ `J0ci{4`SR<5DV͒'8qԎcO߀`G͂`EXۗ 'N%iXԅ7Xf 0XWd4ҝ}-*CzY ա L%mKtn6vgLQjS4;;IW%NSt np,BJV%遈)j~7zEjaHW˜ VRBҬD;}K/K]]%vTk=BE(Qp'4f,$WZGͶdzW(r⟗>s='VzoBR|99ŕQ;;e<ي(eW ʦp,BSI/q8y*I#/5 -ΊUFc)()XAP}{L:QI|Jv$̴(itM Vw/ Y֑}%UWD+_4f)z|n8v:w3=:_%x X/n5жsՊqq1v\.yXzI; ȊдR‘ 0ʨr |CcГ~7z7C"C$\4-TSfKJzt¿ppP<]%,!."цXv5NA'5'$&S7}wwfp?w/vƞ@`}M0O.ū_g`X8Ršφ VY>WcDb:/F//^uU+t`2qjUW>VzJRS `*VA4?A'543'~P uwÖtf/sV{oVP=\V*V"1V򍓁/ ǨyN#PI3?]pmXKHj.Hl#ZVB\U·C$6U^" eøVW C,9crEjvb~A5 IF8~ t;,俵 GOߞH\^B1MiE=+&T]povM5Q11Kڕ$E,B8i~9.+O?Fo5 bE2(DF4e.}{JTvUR; x r/Qp6 RSXl'6&wnVQwoКݪ´yA k] mu͎, iK8m`j@/Y[U`W2(ăzC%iuqEC̝y%߽͋+\ލk͐XU R$c犋>w;m[|~'*_^V0TtAkˎJiL̊zVΘU>}͘%fo*E%w;niz3f_P`?X-o;^V e:*Vn`ݻk$Zt6/Fm,=W6Rvr8MټҍX[=b'XYXǍRAVĶo~5mYE-e,ec i-:]lEk۲J7J] yesXQJYiCź=~y\\ }<`v\JXQTJuKoR|XoH"XC(%, 4?ƺy ^Z*b-u)XkPe [Uo۽*VFwv ,kP2*bOPiy7م%7n8J[V]PڶlGUo9> P]"+ jL5)Jv|Ii@j]^iAb=3nu7IZ EQ4.&nUOK;cVUq%7JᲿ>VK~wo:cw(bvtPpy Z`5$Q,:HjNszP\{ꐬTsXsWu&P{uQ*&` "Xf 0X f Xofq+6vO־O7"X V#Y`FcIT!6997Ͽ,'MT'#mIy$,|#5?P؎dg6YD:򧫙's0[rSOXs3skg9YѼ< ONi}kɩ''gf5^ukPj+#'' D'!NY8$V%-7d@|5QUz^#~/5 k+PUk!~ Va琎S{Tp4rJG8ZmGSU䞐'Vaa<ՠXfϯ~"iV$p_<+1h{szǼjQ+epO*VjQJ̎3ZJ/컩5I Qt[j_ײU^'V#X7X?ՠWۇP,Thѕύl}1Vl9K Eh۴0@tpjبug_>kW5   V\k`}y @&24"-9-8XEUd=upUM_UP)HBN=Rk֯g;E'i*VVbmiqW6Rt;WVh;vqFUւ3_S(R^npX b=F:+?UQY_k(5#d~Vm(M pJiLdnnnyAߊ)]eZQYVYh5<|M}=m"%c:q|5QgH?vlV5Jϯaigr X9lG8ґCtjMm}\=A X{݁uvk}}9us|(OK? -j({_mWj|5kGoW~WvW뵙-ہkf6+5OvIh^nrfQΦfgjq+\l,} ֜FJK}"i}ɩgC_(Y"`%d|)=M2&)RxeZ^c2mu~sy &v\[j߹Dy JeDiQ5`jDw`=]u`l|Y_H3g+uqymV*{7:X'͋&%% !V 2}[plXb4ւT: Y~O,dmuNW:)k)0M-_-S 'GXfRJFzgAVVnC AT=b Śl̆Nׂ[M~fL\+[|Tw P1r׊UI:(1q_Ϡ?X `embd#+[.²Ty+ Z[ hcr%:j94/.!伜l 1/2JH弒"o|)ӦRX]T ;ōU  X 10 N`XŸ2lud,y+&zƘ%qW@oEbm5B:&&Ҵ^4-&&HW^DMMq*rqv2`E) faЧSd_elݒ }ś(Akp.jo+ fA"Xk55/bl_ c@j1aWjU_'5<:ȣjo2ȭtr[SkXfӳ2cހ^YTE2d(` ?vf֞u,Ws309SO(Lj,;87)%; 3这)ga*ctCr!ϢMfGYk,uDz1|b It2@ݘiK,D@iVtV(*ҬTY~xlhDvYj=H m `Ab>,Z!*U:r ~ kA-U|>yL-P; 322 IDATiDKl5|\Mf7S K> #30` xGY{IcpSn8f:o$wQfW[͢,\:*XD:iQ;QyE7UV%7hiX}YkCuWwUbžk'e(8̟'ؼg*X9iB#tx1lPZsfb[CY(>Zayd#H'Sl+5M!57.\ [Y3: [|YؔIZe9bu.qD|﷗ <7E'b3DlQ Ve::BIl 1Vj&:Ԓshz99;;;<KU2UǾ@Iլ&0vN`-R)EA&: ċ ~ka+Vk,T}%xީ΄1䮟n`+>}~2lCgao5nC`VR=Jo44NzY!m+mO`1F+_C7VgԋW̱Ph24 ͬ7di<1Z^swyRjeJ1 Ț!+(cx'k6Oډr8 oE di!+ )*pHX\'58`vW@j&84ZYL!CT^e<]V+ bւlqW@`!: YZG'Oߞ2wn|7ᮀ#gHWa4( 5c7!2,>|9GGDL4𨝨_Y]t3"#6qW4` ~d߾A:`Q#X ^t_+%kWkg"tvf1j{Zg_gړǐ` @pXTnePW Gۇ׻Y0ޛE5׭0"X10VUӶzazT6MÀD.5QHS-rռͯ{f`Ű`E) fӀ`5WA'Ӫ_f&:DƟyVԚxm%ir-בZ_W$AkosXϵuNmɴ}{7i{>(񿋋ǸU6/ˇ*3zSk2hW DVB姉QQ|>H1l:u*!pJ?5 ,D, 4 X{ʦ;XO2I۝konZb^VgA) ZhSk͒v kJelHZ^P/' Ѧu+YY,(2bWBzi'a`5i]P5(f踸Xk*~ ZfU*XX{(5K(ә==t[E.F(ݪYUxKzo1Pf۸`5XIy|{T**Vms7X ]T6bݡ}13\gcFe7Ⱦ/`lvfVqo%kj VkSo1`i"`6ӓtsV[gHiX^Ci+]7 V"Ҷ4M9/+YqVeӴ"s,R[O0e4ֳ{ÀS"l$0YvV&qmгu|XSEW~5cQZx=*Jİ>%$ƃ~ߍz:Krjg;DTTPX >=$5R8xrjVN9 &^N2` ~%}|QhOگVc]aqmYUۖ荲+'X m1V\$Qʪ`eVV4ƴ|\AgeJWG>[bxX |%m'O5f#g^I dQn*X_DYx[%0K|=+JHlOED0`ȩ$h^SC}J!wD_j.<5 PXҪ<T-'dy-*րY Uj>4~EV?DeVzGE7izէEH:@Q<*D#V;_N"+evO?plj%lq_T)a Q 5#Rhz~wV_j!or% ꦏYe`eKIH5`ja*ov:T}GF` nRqk50 U,U"+'4mX)(m(an0hCtڑ b)^}0N>,B*#1`J'e.g} [>Lh5j˔yG~EXm8>,F1V! q`f'(B|*JRQNk+_9@t"5uL)iX/ X+VJTk,P}*Vz>~_0>qk5(gZ4+QTb VQT ?hDSQmk9y"ؙ\1rV >,\*㦎9GPXyzRMmV6\=A55 ;Q4aw[꣡tۯVk0]F"m6"t~]Dž/ ڻJQ",%s0"bu6^rn`! VhvZa`eOPiY p7Af !vI,pW +W>(bگVȄh};V (7X>*iB AU XցG8T0MXV AV +jli@b V`}z$A+`E5 A5K4X fq(fa_V_q :F}Zc9X4,{(U\8!EL`-` /} {=3ZkBL@YRu` *`eslsa$ŧ)Ih&w=9X$?KqDFv7My5LKZ]I坠f2}ǿJu'J ,gi3FRx_sh8ǓQԎ;)Zg~ధBxEK,Vm~־r5({"bJ/kl\Hn~pUÛfy9$ y`5Ey=߇},T@Y`RWr9A9{YJp^h%k,_D:i! 3oBxYkk3 CǎG1YZsl[L\ۻp^..nbV0Bm6mTv`U3.fCm1וX3v|kWF6V:u0p0eQme &-sVỸv>:&큉C5 :"ײZalkAyl?x̿:I 5 YsO&ǒlDžj੾6._/qe#Xʦ;XO d~j)~ӵyMK,3 ]A i)Y1:*kɶNʀN+Xrn+YU3ش?_HYԳ0\k_PiRu'ԝ(PXmGRiSB؏I2&t k@,T}'?U(,5M #i#X{eQ&+]sO; Ns6%Rƚ 9*Xm.xYJi -4>L`@P@U+ꫣPQXkXX}ISZD׈c`+(c`P WC |^ b5PJI0 >`}pNj.5:yT5VvUŭb-+y[契eS R OUS.+s+rx-o`@m.."mK`xTIZrq26ƪlJ1K% 6R@I {awߕ4,D, 4 XuUK7ƴ4i2֠fvW^eY~"]ۖqJ*%.&7tu%*fVTTtMY ~ DV͢Hl_/J,_?o{[Vg5˗:)Y7A VG/,U_oJ08Uvf{2D鯚E9z!\9&f9.{9 iv雚\:psK+Ո`N 'X{2`5fY|nW M7`}K+Հ`f6xr>+Ӕ(Ǔ3Rgh^A{E Ҹ`s O/=)J YΩ`=ƆXz"{ ni8Bӕk:iDsCYr/:ĄX2zV4PN)̥@Jb?3V J7~OU6,p\aeF[G+5C"l$vkP,*7(q'E_5 wʉ(ʯk)bQ+PX+VIN/bU/CoDM6kM`YVB bVp 0*Vq\U @"XC],dɝД@X#S_O[ 0O'+@/Y.&_ .3jN\m1lIG1V0eՇ,Sʳ 45Њ6b VgZyϢ"j.Xy-y֐nwpt<95 9*4%gٵT*PzPk,BOfjw؎©lK<'MOM=!+giR:˼14zxc2() m/b`mUz)_|'=j!NzpS42ψs;mİD<,JKm$a({?7ꙧh_|ѫ#Ph:]KʯfLo婰1kSR~4r}n<5u[IER)~ڼuvQ]0JqXI\zz/'-D(|@}YXfa`ۚ{vz +X}Yo;Yb}GM;e֕2阒/zj\_pLiZOtRibxWSq1%_t)BΠkF4NifM`أEǦ;[bDPJ ~1~-/P@>Xpå LJ;?:5 Kqj# PP]vdXzjL#-]:dE4Pp%=:_ƵznJ =OJRfKj29Ah[>Uio}WF.!ŷ-)tRHu|3(`gTwk, | $0._YjF|G:WE+V8u_$+1 ic8Xw)@rCP#^:yrDX/m' >,bj*իV:V*X4HX'wEL,`ᮀ Mz F+` >ŭx+nݥu|@|ݮu~H7?Tb-&FKHP Io2mHy/`K^kz X!ց`Uar+V+c`E(%,`z$A+`E) faЧ7XQBP5 M͂`XQ¸j\5˭ނi0E7Rb\Y͒0OTfRVx5ajh5K@jD5 5,{~ T|mՠj'"|(-ۙEJcYxu:kȃzI7/HVBT@+Ð`54b&$8J"d%LA,\<:/%^f'O5j۹*rnV6ӚcWLdn6wHF׮(p 5*Y# yEˠjvzoc m^X?NjUqFti[9𫴌+e=#P5f 4e?Mӊu:K>vqǬ\WQp tfM>+K]#`U6mߔ j]Pi_BV*{7:Բg?azXKX5pjo6"XfI#0ƺ#eL a:YIj.R`5*XˢLX=D62Zlg-J)&kXZ]r6b8vB,ODГ}>(]qCa:YIn Yxu}T: U{+imr8:..qS P6Q/H}Ed~J D~ _bW 튤yNm˾)$~VF\ Ű` 5@fAX+Ns'TXIYl=QmOibSZ3%iZT vr+p+uPBXr>FF')]M;XdY^/0;` F4/\I#V +NGi@b V`}z$A+`E5 A5K4XQ|.fv[U˟A!,;VhT5}| 7f S4k9gԎs:r'(OaCC"g==oT5S>qa/`SVWmzX f XfA"XCYl΅yəgX) ǓWe`SЧYUV'dkg0[ LNh'gzAe2fQ֯Р?$eRj"<&{ H[b5d!ryz2L<Ý5j(X;XVQEkf(u%UZ[h_g~@&k`MK`^+L3ڏh`YORZaŋPٮWzZMǤfĻ#*-1~|??DDrO]Y?=Jt-j1V},*TVN0 XshX V XXu .g ~Wky,T}%x)Zr CyVOǤfȰjK f!Ąu.5u<0IDQao"X.jRr"`e TrXF+ւc'X[7X f! ?2TZzXMǤސyH,_t|BQĪ`bne+8`EBy)XBh-* Yr5J.Ӷlem^;Q.ێ FSWt6PU MccV1<)q`YHB6эNMp0[ɻu"XPk= O=DR kڕtΊ56Xə'( 3?˳] 6=_YDB>sI'߹] iKf!nI:5YvWȺšDU 0"Yr0DV oMr6l0XQҟ,V `xCj,X"XV +jli@b V`}z$A+`E5 A5K4XY4IK%~%J,]7-,5:V1U͒0OyseӞ?nP(}UL7jcuV;5/`ďD鳚%{5:VS"l$0vVpmгu|XSD`r .E0t(E kW:ݨg^|4,⩺jO Қ3HDzGEV_jy0#+&]``fl$,+Vfъ/U}"XWCGTMT]T4/ɩ!>^D髚cPߖh|.D"Z~~``KA<O5QRaݔaubE՗EH:P 7ΗqM*Jʹ%MB3(aS+)0E]緵|﷗[]a_CFy{ BU/ 3Ѝ.f~:hX}Y|U9b V %Q޽IhF<%l^xxJ ('vd֠Ӗ.2žY<+}w!iRCt<)2X}Yc;̥ X>,F1Qbuw ڽ:zP4 ͈$;E<%L(I5`%m$J_,۾B߇x[b+hkZi*"5 `Ty.dk:V kW5(gZ"G R'lX$K )8WCGTЬ:Z.L(ֱ3/6cOd~jMC}[C|yJѕ$ҥVÁՇ!>Rg]`<`n#6PxtEhJ?zX**|"%0҃DhF%sxJPDUz="./Xf'5}m+`S_ Ԁ`V<ւ,_``}eg$q;v`X?S\0%zjޖuHH~ 9`0]`5XQ^b+Bbg X#`@"X V`0 V R OCo0Ӏ`f!fT X1kȨYCT 5:V1:j}(U *f1`5XCMGY͒(``W0ʯfLox_>Rb/1`A͒"%遈ֱ=G^ g[ٛ4RT_]` _-& LHc["eD1MU{rD<ֱ3W0/c+{jx+"2I]` j6=WǤ="e`5LW4Zgx|[ٛ4R[`ƸVuְc 5 |dy/%\4z!i9]:걕J5  Wңe\:VkjmJ"e@2U4UU|Y୨WV~ XaVY>`5%a{U]YୈTeøVuU0 /<+ =5 V><];zle?Sa}yڴ_i]` k>2u@jB#U`fћ(AV `p]Æ!Xa VCXf;X10B=V +`E) fӀ`(%, 4 X1+JI0 > V jji@5 CEt'_IiKɀjf߮`Efs{X5{}R@\5ao5+h` 55d55 `5EY~)KOAʸ![æ[`z%-"m_\5K$`G`EX f)}:iV:vf6i`ϻQf(l VYz`Ŋ` ÊjGk61lWS2J퍢}ラ( Xf^Ec Kң]` 1VYhJ~S"y]? ?R(c#hĻbP,o=T!Xfޮ`E#X f! ?2"b+oka%mc_d5`~Sڮ`EXf0zmh! MccҬ7diDSXS[/j~u,D_EIЈEHc"WIц_, X YtU~Ppi Ezeq-z:o`E/`բ?j=%k, P"1p3RDLndvIjud+5: f1tXf0!( `E5 C'$+V+V+cP`E(%,`z$A+`E) faЧ7XQBP5 fAbVT0JMBnogK/)+5 j$5Kqg cqQc{A IDATYX~&b۪ޱ쵝s XaVY AP2̜׽R֤%=k;0,I.rM~co5Nj~ J,%QwXъENg/ΓՇEc)Oݵ;}\To# *XmgGD"XTjSbb;y宙"j J,-3j;bre=5a6w,Xo+'5#@`E8Xa!kb3mUʝ-n;` xj*n0xv<45 <#21iq?}3I`+Vj SlD/$Q䪛n Vl0vH+5X fMbst<Gj\ #2}gpmgΓvUh`o o$ݨnV1V `E;Xfak_D W,v/p4],.ǺHUlV, MbyIB{+s>,by&I7.b[= D+5Q,O&1q`E5 *YHjj[!~,#J,LCj+#z6)X|_{+j<5KЈ5pK5- r``5e A͒4,:#P|i2+k$;8=U,{:ԸV֊'\1`EFRH!!J,@odcVj"xb\ =U,lj.V=챦@+fVTRH/bJYZK EY*\bq+ HOZ1`EFR4SA!J,K̷ =YW/f1~=*w& |(Њ+`5EIe`Y^2_P]+kJbPU Xq,;GA!J,OdBÁ5|R;ʨJ"}R!1ߵSŢ.r9/Z1`EZ[͢3,bbI# ~UHGDtkvMf vȮˌ xXT_zhݻ'b`5*Xf 9 }2PJ4Cb@[5T?Xf \b` XV +C/i@b V`}z$A+`E5 A5K4Xf1$PjNiKqЃ`Xf1LR0^{ä6hrwG#j\b\W `^B7hш`EWBQbAH:xG'Gfİr 쎢 ʨr]8ƒ0lB~_G: )-b^X)3eŏ"'y3?]ǿJb#CX3kѨ;XfYQbj gI:!om/S 3-{v|~S:pxPY CbGYb[=^<(Δʕ4] eKb7QV#C!aѨ5KcjO-QSF߄I}5b>%_Lj IA^sOGk61lrF˰H~w>w1i׻,#âQ4y|:+XfAQb1V,Thѕύl1Vl䫱낟jbxj{ O}'?UU;Ep-_="R9%s.~dKTA۠U6R!":DvP/QBD DH%! %\ .(BNo潷oLo6BzýR G |+X4%.|E/. :*VNAؗ>"cBX )5qG̍tV#l>uk2l|xVk#~T1IyWOEr>lzeD+b5fGbd8QkN{|֕:'; /C]@ho[ p.|B ID t\81lW|Y gCnS*XvyXEWb>7*e XX+XJ(qFdxrI/-N&lbտP}+GTe9? /㮜]'w+^=}+X)&śdǼ3JXýRGh X9ZϤY,nC|4:bb)QHfe)h[BĊX[Hv%oN+@+X VX XX a%a+bb%"H V JEyuY+bb;b*ќX]Il__c"Vbu#b*єXIS+SĊX[XnYU#}fϓfN:l.siKFe'z絘 VjYYUv#KGܽ]*[ciYZFecLLH"V'VG,*>&V;W3o p,") Vj[Y3ZyGvXE5'HbEFEyFKϣG[[i)`TX H"Vbu"͢\+}Si7Qb5"ĊX틵BihZ:;J>%I?- zFfzߔnn+-Ylɘ1Fy{fý<\Uuˑܪtt^/O7Q:aS=e]EO%AXvl^˾=Y zcȘdP=*f2rA 2^juI?5SӥL,[bpv>o;mXū [2>&fxlb[R8%9ꊸ=\]ZJ~ 3o'[ ٸTgQRժtviWa[ i#)m$h PXJ6U۟vZ?cl_ĜXX..Te4+\]SƏNU,lg9Rqq;}#SDH0< tpoϦw~'=(@kst$\z$ N(> [_)<2˅4UXtL䨝pu2i+ۥBxFiB4@m\ ]֩ͬdR8nFYⳤP6xKO+T+%ihI:<D0Y["-`CW:M+dWsN琐@ժSGBb@!7W HP8 Pbv *5k\D$'ei4 .AhX3$MfŘ\uYZ)Yi k&ӧP<:n# \ Nl5E% kٯmuٚdvL ֐qűeR#~ۑ.0Ȏ W8~RWoRL4p`715]Т.LI'BpEJMmpMe4rKST #X'#86# &WXK/+*Kq0L8CE<%^ XetxҔB8` v{)DV!n` BY@Wlokʀ#%J~dSK)-BX%qZ%k 8 R=8_>9ln ;^~?z wNF[ta0T*.U4%l9 dM;*BExt+S %*xUg;vKT[9e<_^ ǍS-²eozp&`h)NBتcP0* GdÜփea `{w&yB`x~d SXsA K [S{iE^7HDV%V t3x=\AhभfO14Y.xF .brDh7R:Ya ɚ,`1+lI1-`M. پz~UIhFt.K *c(X`\tpm]~)J֮q#*j*8B ->֠F,/i*bn'Y8_Z,;:Yᶏ-TbFJ7ٹ^c~e z]HȇC[_uQȾdds)dhpCo"T.bN׫KzʎUȆF*$DԒ~&rUPO F `鲳!^!B` FPH0 BQ($B!( FPH0 P($B;^6BO.=e GP!8',I!K6E:U:A:5'{+GPnz]m,3S B24x |:vbvJnN$(Tm6jU_; |n*ˬKSGǕTDdFь $2 T%d&|)UŜ=_LB9M}yj&x\:aK)ǀ`Y_$XRn,/|4_9ևM$W X!0帪!ﯘ fV|icriNÀ&8Q?>ј.d.s"CF 65_ 8E/H݊I.9d`TM/W2q ʼn\\@D)9Gѥ4`:崪MTLMs) m4uLl/:>^_RdKWz&QOϗl0崪H ᭊBɅnvfdjq*OYUf!- X^)JݯZ4N0帪H0N`E$TP 0+k.tZ-fe^|hnRŒ`6帪H0W3|xBQpSģ"X&V>fӳdn6p v/PXP9+7mZaj\@c6XW &O?L"ѧT0's~PдN &ZiFMXXlr a0]b}d,QS#GhA F Hՙ>ujD2hRGQt)%tX!ɗR( FE $wPZ9c= }5`ۧK wZ`*U/ŞiJ9:F#Zn$ءc:B:'#3H0 jj^qIMjhXn G,HϑYzӦK2"(T(vjilSӛLtH0 FulΏZJ$5Pe2r QL36}K?lY3H0 r>$|\)9}v(Y9&,=G,پns|#3-1&\fs 58L*CC2eE3fl4Fv,g^ 9(**ٜ4VaA$Z`JVAL>"cX0V%̝2ҁqd.&+$Ő"cmz!+);-dk1ɒ=/@җMV 1J6uRXg`g uթy#`P|!y{8|U7BQ L.l!#p\MRa%EZ`+ NH4ܤ7Wo&K+,Lcu^u Sx fj솆uHp@غ#5 @ꑣCBpApZH\u{>yN-b'(#aţMVF ױF+[=2NXX[ΦdOԤ1^e<2h[C#nG%L0'  F~dtL1tue\5dr'ug5&`0Iɤ`m4OD&C\Fl1#yR >bbV$e@p"L9hXr@ħk.r"Z/8^4V sB}#}E Jwy>QDg\dCB}u-c%<\o ?IHooxGw f5i ]&rU32@քAhSs|!} |[gGշU%zp``XXB.ʟHVԭef'3ĒL 0nv;ѯg޹"VƒR EP(sc7>|HIGx@7fSX>>zrк *s$?Q '< rEԵLc'#yry &;l{B׉\ق#7 `ijmzCQbdG1M 1Me$ Pq訛I6?̄y*%*j,&e%5xe٩bOXXΈI l+ޚ)LB+*nA8j>)V5XwV083P}<4Ʒkwa%2>]so~JX`TX8:w - aJDQK_/>jP"V`8> Fq|0#H0#Fpg|"!|@Rm?4RLOp4P8ߺRB]*P^>YR,ԨH0 BQ($ġP`3 7!(B` PH0 BQ(B` FPAp:PaE0';9\G.$6 iU oBxQR"X]~8 Wg#Opt %p%QU$8\ &`2 SUD"Y$\ZUb%U|2Lpd̗Y%xEI IDATx$!π7J1/:: oIfC8d.Nը2u5!XRicLD}S">""B$BO ubB4Xϗ!YC U;rC\x۝7k F=n66zAo^HO4qt6U,pZW|jJ#eNME#ܧI ̋&w 2;J45SL2~JѨ %Z+Vϧi2$|',F7o <'4^ M_yNf &@pSdW6ؒqBHˁ2x`br Ft͍Bi)``>jOsiF<Gͩ)6& ̰w.+'Ջ&u,.XY]Bn O$@`=YTh[ַ  &O3HqHL!-{s]"QTdRo$;#e7UY֤L}M0116W5RhDTzpEF3q lQ{n` "BQ($B8 cQ(B` PH0 BQ(B` FP!A0 ;Q(T F` P($BQ(B` PH]y^'T7' C1g#($wU715o?gMS"`(0&ӜpUaI`6:(0WdB3nhn&ח+LXPaT9q ]W`-BpJv81-? V9&T, @0_̡H| L9m  0&Sd:OSj3G^QeiT|8bzS|F_2 űzJp:oL?Lyyy҂a .,*O4f*>MGVs ϼ$ց?}wi/\B$Olpl0Wĕ64!: jʽ$X nX@p:ucK(޴Xv fӳ kۏVci=A&|#ԖUOm0!x|b1|S=sr *U, 8߁~~Pk'tD0LnS4aqL ey/`JNYl4#x|d2dM&)@ԃry7sɱ]j LRwFj<>KhH-7G3Zi)Edr26@,:Ql!d-GLvdFBKӧn >1A)6?HGziFrd)@{+"(O(2j&YϺ%xӜX?3>%$ZN/Zjk0> ΦM،H : F`< `0XtuSgLsy'Sс)y])9x$_HG q9&ӌeTk>3#9*h`k*`2xy6M3B3M+.))bB4.փ`xĺpLL>Vɉ G>:ix$OyW@;UGYsi+98 @0D0H;;hкӛL":ĎH'㒜'wvPCsv;?j=+M G#T@L|ȳ1vL36}KtSifU0G0gV"আiwĺ,TSS͙qvHmw3هLΚ ux<2;,̋LUot]<Hp94c@8*._gj4t; O%4C6q3(C$8+$8X&dOǙ&$8=kf 5ЯmVz-Hp G.W.7[]OӚMsJ,:3сݙEzzHp@@Bx60HpQ}gс6):!6!z|g&7Cs4>CoH_EP_ϖ{ilŭy(=MdP> uLwcfMOio޴b;{;t;[72íEL}晽it@Cw9 H [ًM3Bq=UHp(l *Pf< B7hj>p 3%NBXF9Pbirkz!:Nf5Qgg&b$8Y\S?K-QnK,48AiW 49u}[;4 X js'XJ1Ɂ&bi6oZh`q" -h-X!.p`(~^ssL LH'XJ1C`y47M07`(~O ԛf a}4F0!:ӚPYtMhl:E?Yʗ|g!޶Xq϶ppH0Ehٜ#Ɂwҷ E@@a3p_WiR2t7SI;tnw_Y~4 ߭mi?T~W)=%vnyo:&lk+>:L7tv~Sˋk%m۞6|':I֎#d$naAH+ G`R_a2):ќ|ԇ7Cgyfsgv`N>nh&ά39 i8t 쿊WU5z鏞55ogd&~'i|BwO|yx>W}OڳğǸI"ʗ|e;#.!¶ж vFV|l|׾f+kv(lgۛ >쐖nm5OwH]ݟm`"5f͜l$ju`Gu%>9Ls׺HbOTucLttLv#1̾&TKH< fӳ67L/?i'zj˯?=+^X;n /[Yn&cǸ//*5tÿߟiV^<5[B6Bpz2~b%ʟ .@bQ>7ߘ:`a9+}t5Ip~gߒr35 ԆyM kd,$l}N&ӄ-ĨI^:n{;|}Vsu[%yqa\9qO50_Y\BZE!ҎSu0ĵQﳮ"ml ܽg;;>lxt>Z-W\`:B s2]' zs񨘡E=! |ޯ#ۄbf?}Ͻ>C`f-?*? [եK;-r7yl3%U}Rۏzk?zҥCWʼn&}VZdZՉcZB0_8:`%(GXF*KҔuj*"n"ٱ.YJiSSrU,3M?V@\w-[=!M%:}Mf%:ݤK~RGmU\ J+T[Α*9jߚ-a_nȩ&.-|ER%a懰W|{/KGl0d /NآRuJ2MS FUL!ٛ`މ`G-3I;G6X ?'Bp-?T[7긕aKH0?߼#= pW΋k{W‘,:! s[7ztz'F /ŠX=N)sqlOէu<BJ^4?ʌ#FhQNux=E!ծO ^;meKH0/Z.[ڭJ^t`8giҒÅ!ܚ$hK/8 -@lncsVW1ɯTSlhpl[zp-Ew ,#9B<=GߡKWFfy|n24[^`,露C:xXY]\G0.[ןcZ1xr}^ѡУ н nME'-Li )SԔ` 7@I_!uSԃ<ĴgC W>ED/_/olX7uښB%u_ykz^-/pu+&IK[ I/r:hewkC#Ҫ3T]~L2 XS{Y"h"K2۫<>c=X<lfǖ>GěNk)t+؏d=[02 ~zp1*&fl]#cᧇwm|x^dm-_E[rB*#u8x܂/|YÏq^֣H\¶}D8#bУCZj寝c}Pӂ}ɓ:d燬(T&=G3?ZыR l:y`߿rO0&ygxy"Ȭ/ޫ(~ #XF^F_G6xH0*K YklX* 6% lIΏ"B&iT];;J{g@p~$'ޤeViqpq8? TG >V`iq8? "ԋ[3ݵ a6#h-E q/8W`_F˛q8? &yyt# w4H0*k6'^mԺ#اQf H0bӱr{o%M~FWR jyMp&xv8 W/ZqՋ*Qq8? 24:n:A+on##> R܉H\'AHL8 FMhzjOq >"X7'ijshlFQ}晕 6K:H0`_*B`G>"Q5GQ~}`(~lFQ>%#>dyqMS{jMq8? fd6#P G%p~$ l=8`7`W(~I8 F=/ #'Oc?$2=$<-OJԀ 7G%&2}@ 烐jp~$Np8O:д6#HpgQvӍH0@y?Dh/p~E93`:ϒ%tmB'NMZ^ ˗/k +t8?W۸^x-HOiF#̭l=Q#%?/z?8߽~iE[=zx毶M:[~~=źmsW };Y7i3!͜I?#ۊW?u׮z,w]w{n\Qɻu_Ӄ-ck6Xg#؋]L.3aJpt.0{7W ,!x];x'kV{mrI_,c ^YO]^9.K?}Hxlh%z16lݺk'tXyM^T]xSm9o?'M3(~:c@ԃNco';mmk2h;Y xWmvX^%v@NgOz3j 0 ^7`ɧ>C?qou}3'K:c BewhÏ੦iqy4|`w~ǶK]mIX׵5zѽz/>Z>E?=Y3oRm|x!J ޺_Ol&Cl 0^nFIptLe(7a?N-_ >W7E"jҎ@=W ۉl۵T9'EУ?@pyu6a`aN`{Eg3U;nhӫ~fH-HU!,ĢߙE9nYڕ=:?8qO,|l'mPpf<{eT.Ki~n qin]/`UF0żh[&8IR%d1kZ xt8?B1UvWPw7DYz8`m]΃S&8DNmQ'SEW1cK$G^tȩ./8V`nt٬=:Z#YaE7OL.Dcj A`Nh4%֗Rf@pG]hb3UC3pqJJ#bqD#HǖyM!D0?Eӛf깄}ZNp:9 A`7x" >Yb#`iiZ > D+ԃPH0*4d 0f}PH0*c &q QH0* V6#0&#uܒ{,L]qܤZ鋿<(. QY.綴jh"o'o::YQ U˽#= |̶[}Ow !O04#DZ58l9쬭m[ͤ]'%/,hV-9*|qnn[ۛ\ ۑ͐ Gkn Ov[3@Gד[vMگo܍l53p8 ݺacu;,nl۹@d齻&x q8z'jXa`놧]sf#xW붴_Nܰ>^ 촼Y3v3$#ˋf~krhK;z0tv} G&=߾m鲽7FdzrZ["P&6/W~'^ փz l@iУc܋~n-?EE[^{okۛ5ܲ'&nXt<qD(@0fuGQaL0@QaL0fuGQaLpl,H0*T6LusQ]b$8z!ɆC30%NB3jxG00KwDL$˳#H#F`xZ@ykO0mƲ+ՇZP̗eY÷9Gi:oNdiy@D\[YݧbF <EڎH 3;j]uynoG2S ;l$ ǟOؽy?{7rmܷ 7zrsս֏_%?z76V:m!/;j;įyV>x4Pܿ# m YQH2ַvZ~L]+[;&@F @[>&qϤ6V:y֓uj/]K;OF0SM:9O&2p[H%=k,/y{-'nglY_Mh$١tg,ɚ0mynNstO=@یhk fj/_̓\(?_ 0ȔuNBƦZ|e)mW>F|{O>BdOV-~ѿhǟ/:I2lUdv1`$زkw[^"]}v֕6mN %pJb` 6wHV.g˕Lz3#CFjl}u@۹GBwb=DH0_~lКktHpڱXv$X]"/w'Fdޚ.mU?{-m7?ymm_i7nvj˫k&H Xz(/,ɥheWWK6<.V ֤-U {-W\F`T NNNN,MhʼN)so`X< reȪ*>M UFJ0 ;qta7Ɩh̗{ ~qSجJK BkU)@8A 7QKh8.4%MLnFOk^f N7N'Ƨ4tӁX0ɱzB]l6zHpZ $'8X_p ̓QZiԃNJ5%FP`_n nMED0?-`B`mHZ`}([RNJҪqJ0f u/ڑF@{'f~V%Mij:iX6WīlT,;>9ԯ|hʖ'<`%3S9~$}<׃"`8 e!u xX$8K YklX* Ƃ˲@Hb>>a_ v3P4*X.G,B:"X'O>WփO_[jxFOI) 0ӊ G*,#YpYۮ<ϡ>vc—"x)̏|h4 \Yo6u>皜`ak[`凑,Kh5 0 ~̲8 ?n8LFῷFXh-E q/8 T,; mJG ޺EX#Hp+m0O6 Leu2([ݧ!Ln/||Y۩޳t`ċ]Z$8 \~u}A>}Nū^E-?އ'Fcۃ#5w>$8k_ H0*h8#`]Z6.v Zl¿OV؈pͥ' F~pB,H0*d >YXFC,ڬLcA0f kQHpxwWz F`ۃ}Hkw5R !9b.:lmQo'FB9u^#Nx_IXy`T_lyqZ__ʒc!N,_\WO_vVCXڶgKklփ{QۉW=kЮ5t< N@ȩy`T_|%బ5@ڿCȟ^_uFLM~vc6k;sf -&.DYۡG _ Ά5'i.LjZF0[~!lJ& yN,y)t!dlȩy`T_,&: Ѿ"@3  fKKEiN*I:w B`X^995 zd׭ fZAL_GoP V[>V=UOn"s=xٿ FQ X̲Q^)_n'i=qQo|w@Zgǣ_Yk[[B6nnv^_Bʎ9'*9D+Cd/gEaP,;O}xf9k;ۅJH uB6]ˎlB05t;RX~|LH O!"NIG~qck@<_!xU^a5vךvDp'ǟ_@}&uǟF/ڙ\'yZHe2$ Cmkiry 6xbZayJna#6X"U}wH Q&.׳ f FYvHu:_ڭo qdr䬍TtE{+:,sZElm/n'c;N E$wXv$X]n!wYY11 LUx'_;O30!'% u,Żm/'Ţ%!J',{(oZv42+THR\~) >Ys`$ Fju"Vo{G0 gQ`UZ)cT%*UOSR wg%@8_ * ы΃`)[TNVTRD>'6K~W|l9 ;QK3`ˬ"fD2~\wSq)wœ/PH0QZiԃ@ZEx1AQ~๽$z֭ EWbM-> -)U'dˌr\YX)e_ NX4hzI0̏VԪD"Y@0F|$8\ P,zGWyU>g튝;|J撽G.l+lđ Nx%uvٗ'j͟?oseNq{-O`gnymt !xB֚3JCG,;B#0@ygGa(y"ސL7ڑ.Fk9eÜ4H%_X'u9kl"컴l\0 s<8 ~[뺀+[m/kno[KRaY}M#XCgr³N= :'6wH =Q*{ /nE{H0тf!Lp-ϑ*-BFD'Zc]ng}u'%zx"!ut fnŢQG2|;50!}!g\&v3"Y/ *`m"``{BϝN#WJ7"`m@#`&_zBlY] lѧ;h  >Njw̑EjS[!X+9bh Fm'Xt -D}KZ>o^[$)E!>| ߷G{H0b1G4m՗uݫ]SZwݎ`W $ v]>w8YH0*{tTR`GQ'o8z0*bfe1NXBeGH0j=g+dWG]^bO}6'@Gt FE n򼼓uѭ+zAG;ݵz~xHys `}ş̛A7wXZt`ٓ bש̟yWMXZfJґB'붺%?+韯7.ێu v;ea8$aC`TlY _Y־u`(@6bҝ{ՙnt ݽZ (?Y;\bC&ܜ6nK- 5]ǂT+^`Dfͪle)P- aV: g8ÜyӧMnOWI}[Ô 7''N9//ܬG\E6+i`qqvI2cn;{W&KCc>k7;hI0!LwFj>ޕ=߿{yGuM=lr͠rq% ĕێp8scXyhel@,`EG[z^m]s>tBn0ч~H~+=c&uu S8uE3q%O +-䶣_;\|mǰ0=O>b[13]y+Q?Lp0a#PNZͰ k.zwX [Y,D+yu۹ Mn;%Od8JM1ɖ; AЧc>NJNtԝڇ+kצMwe1fq+Ld"X\i!o;wzcn;ڑu(}5gI5ղKOů`RTF_=^77v .#8amd?#Bb:_Wm(S<6=n/ox&_6X[0z n 8֚ xs]$?$t50ږٰ.CDm4>>)lf+XR5 &{-!rbvZ%ZV`ڔDlŌiI$e(\ndKOKDˡ71)ΗjV$eH[H*Vrbl v%13Ų "jI9ΞCi׭Zd1*kH.M0.8gNp 5 &{-5I['EңtaFpq5?/_/L\[Q3&UbFZ@^ l%e%i=M&XJY'ɮ(en> oJWB99qvJp?CR|Ǵ74;+! t'x`}zg*J^6:Xa(~,0IK#a8ItŖHKc-,vUIZ&HtF'pr ˄WN<^|vrXZ%ʢ71kc)4a2]K"A0=ZK|ngK5N ^;G0II뭉V[,l̶S ,>' S d ApDE!2hN0'/ 2M99|1p21xaړ`Pl+%4ǜ`Y dяmPK95dG6¿-g`hVPB̢Yv8ċޖO NFy4 ˢ,K<$-hL&`y ؿ`W=)b0IUY/3y/J&:̆?QV*|EYpىSH".!AJiӜAC\ZXhR1K7*ٷI-e}&둺hgr>VxpIZY˾TM@?w pB`٦Oq64n%XLފaVQqsl.Ў@w%\nzv5}bp.=2r.lrfל;Oxi\f9ͺw_zh L̉e!*hCM 8v`Cl |z*5&v߳{^}Fx':ftnsSP2g9D2l˲hc4aA1n=Ѻ&_bW 'w>Uo}tF/[.7;w{g,yQdUiy/̹-:AHec+Ѥ+oL¯Nꡱ K_꟭7\n|O܈r X@zcpk &XxDr[Hv`mLpٙ3==3 -UŚp9ԗi/:Z9gN8,1F+2iˎA0%5醙2 AX3\nwA0uf9๾hg!gN8, ><4c}Ф@0>ˎ1~c|@f.= ='XD`G E9jD_Nh#Xc:j͢; kU7O~_w }͹ql"/KS 8v^׶5[kPUWSڇ& ߹N5O GDpbK 8{ک/> Wak)OG~oBk7b4L)tOƍc"t{$xꜗ]UAg8{p: ^dv{VlSٻLmAi 8&`N"FwX똦13Y|2dE-h[A0Opnn!;U6`%Ƙj< h v;c`˲f;@0E{=,'8yo7 c<`mvQŝ1v; L^~==|nIj7>^G 8Nd7d P9q~l) v/C> @0! !`C @0@0@0, $=  @00lK Ed&A E IB A^D ix &H "HnA0PIzA0` AQ,O^lH5IENDB`license.txt000064400000046436150212007360006740 0ustar00User Role Editor WordPress plugin Copyright 2009-2020 by Vladimir Garagulia - support@role-editor.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA This program is based on the work covered by the following copyright and permission notices: WordPress - Web publishing software Copyright 2003-2020 by the contributors WordPress is released under the GPL =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. WRITTEN OFFER The source code for any program binaries or compressed scripts that are included with WordPress can be freely obtained at the following URL: http://wordpress.org/download/source/ index.php000064400000000034150212007360006355 0ustar00\n" "Language-Team: https://www.role-editor.com \n" "Language: en_EN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;esc_html__;esc_html_e\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 2.3\n" "X-Poedit-SearchPath-0: ..\n" #: ../includes/classes/capabilities-groups-manager.php:45 msgid "Custom Post Types" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:84 #: ../includes/classes/editor.php:1483 #: ../includes/classes/user-role-editor.php:586 #: ../includes/classes/user-role-editor.php:587 #: ../includes/classes/user-role-editor.php:599 #: ../includes/classes/user-role-editor.php:600 #: ../includes/classes/user-role-editor.php:615 #: ../includes/classes/user-role-editor.php:616 msgid "User Role Editor" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:103 msgid "WooCommerce" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:108 #: ../includes/classes/capabilities-groups-manager.php:135 msgid "Core" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:130 msgid "All" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:140 #: ../includes/classes/user-role-editor.php:555 #: ../includes/settings-template.php:20 msgid "General" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:145 msgid "Themes" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:150 msgid "Posts" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:155 msgid "Pages" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:160 msgid "Plugins" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:165 msgid "Users" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:187 #: ../includes/classes/user-role-editor.php:573 #: ../includes/settings-template.php:36 msgid "Multisite" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:194 msgid "Deprecated" msgstr "" #: ../includes/classes/capabilities-groups-manager.php:201 msgid "Custom capabilities" msgstr "" #: ../includes/classes/capability.php:38 msgid "Error: Capability name must contain latin characters and digits only!" msgstr "" #: ../includes/classes/capability.php:48 msgid "Error: this capability is used internally by WordPress" msgstr "" #: ../includes/classes/capability.php:56 msgid "Error: this word is used by WordPress as a role ID" msgstr "" #: ../includes/classes/capability.php:89 ../includes/classes/capability.php:209 #: ../includes/classes/editor.php:950 ../includes/classes/editor.php:1019 #: ../includes/classes/editor.php:1070 ../includes/classes/editor.php:1131 #: ../includes/classes/editor.php:1277 ../includes/classes/editor.php:1319 #: ../includes/classes/user-role-editor.php:665 msgid "Insufficient permissions to work with User Role Editor" msgstr "" #: ../includes/classes/capability.php:95 msgid "Wrong Request" msgstr "" #: ../includes/classes/capability.php:115 #, php-format msgid "Capability %s was added successfully" msgstr "" #: ../includes/classes/capability.php:117 #, php-format msgid "Capability %s exists already" msgstr "" #: ../includes/classes/capability.php:216 #: ../includes/classes/capability.php:221 msgid "There are no capabilities available for deletion!" msgstr "" #: ../includes/classes/capability.php:227 #, php-format msgid "Capability %s was removed successfully" msgstr "" #: ../includes/classes/capability.php:231 msgid "capabilities were removed successfully" msgstr "" #: ../includes/classes/editor.php:234 ../includes/classes/editor.php:236 msgid "Error: " msgstr "" #: ../includes/classes/editor.php:234 msgid "Wrong request!" msgstr "" #: ../includes/classes/editor.php:236 msgid "Role" msgstr "" #: ../includes/classes/editor.php:237 msgid "does not exist" msgstr "" #: ../includes/classes/editor.php:902 msgid "Role is updated successfully" msgstr "" #: ../includes/classes/editor.php:904 msgid "Roles are updated for all network" msgstr "" #: ../includes/classes/editor.php:907 msgid "Error occurred during role(s) update" msgstr "" #: ../includes/classes/editor.php:911 msgid "User capabilities are updated successfully" msgstr "" #: ../includes/classes/editor.php:913 msgid "Error occurred during user update" msgstr "" #: ../includes/classes/editor.php:983 msgid "Error: Role ID is empty!" msgstr "" #: ../includes/classes/editor.php:992 msgid "" "Error: Role ID must contain latin characters, digits, hyphens or underscore " "only!" msgstr "" #: ../includes/classes/editor.php:998 msgid "" "Error: WordPress does not support numeric Role name (ID). Add latin " "characters to it." msgstr "" #: ../includes/classes/editor.php:1032 #, php-format msgid "Role %s exists already" msgstr "" #: ../includes/classes/editor.php:1051 msgid "Error is encountered during new role create operation" msgstr "" #: ../includes/classes/editor.php:1058 #, php-format msgid "Role %s is created successfully" msgstr "" #: ../includes/classes/editor.php:1143 msgid "Error: Empty role display name is not allowed." msgstr "" #: ../includes/classes/editor.php:1150 #, php-format msgid "Role %s does not exists" msgstr "" #: ../includes/classes/editor.php:1163 #, php-format msgid "Role %s is renamed to %s successfully" msgstr "" #: ../includes/classes/editor.php:1228 msgid "Role does not exist" msgstr "" #: ../includes/classes/editor.php:1232 msgid "You can not delete role" msgstr "" #: ../includes/classes/editor.php:1258 msgid "There are no roles for deletion" msgstr "" #: ../includes/classes/editor.php:1286 msgid "Wrong role ID" msgstr "" #: ../includes/classes/editor.php:1295 msgid "Unused roles are deleted successfully" msgstr "" #: ../includes/classes/editor.php:1297 #, php-format msgid "Role %s is deleted successfully" msgstr "" #: ../includes/classes/editor.php:1325 msgid "" "This method is only for a single site of WordPress multisite installation." msgstr "" #: ../includes/classes/editor.php:1329 msgid "Wrong request. Default role can not be empty" msgstr "" #: ../includes/classes/editor.php:1341 #, php-format msgid "Default role for new users is set to %s successfully" msgstr "" #: ../includes/classes/editor.php:1343 msgid "Error encountered during default role change operation" msgstr "" #: ../includes/classes/editor.php:1346 msgid "Can not set Administrator role as a default one" msgstr "" #: ../includes/classes/editor.php:1348 msgid "This role does not exist - " msgstr "" #: ../includes/classes/editor.php:1393 msgid "User Roles are restored to WordPress default values. " msgstr "" #: ../includes/classes/editor.php:1522 msgid "Error: wrong request" msgstr "" #: ../includes/classes/editor.php:1551 msgid "Editor" msgstr "" #: ../includes/classes/editor.php:1552 msgid "Author" msgstr "" #: ../includes/classes/editor.php:1553 msgid "Contributor" msgstr "" #: ../includes/classes/editor.php:1554 msgid "Subscriber" msgstr "" #: ../includes/classes/editor.php:1556 msgid "Switch themes" msgstr "" #: ../includes/classes/editor.php:1557 msgid "Edit themes" msgstr "" #: ../includes/classes/editor.php:1558 msgid "Activate plugins" msgstr "" #: ../includes/classes/editor.php:1559 msgid "Edit plugins" msgstr "" #: ../includes/classes/editor.php:1560 msgid "Edit users" msgstr "" #: ../includes/classes/editor.php:1561 msgid "Edit files" msgstr "" #: ../includes/classes/editor.php:1562 msgid "Manage options" msgstr "" #: ../includes/classes/editor.php:1563 msgid "Moderate comments" msgstr "" #: ../includes/classes/editor.php:1564 msgid "Manage categories" msgstr "" #: ../includes/classes/editor.php:1565 msgid "Manage links" msgstr "" #: ../includes/classes/editor.php:1566 msgid "Upload files" msgstr "" #: ../includes/classes/editor.php:1567 msgid "Import" msgstr "" #: ../includes/classes/editor.php:1568 msgid "Unfiltered html" msgstr "" #: ../includes/classes/editor.php:1569 msgid "Edit posts" msgstr "" #: ../includes/classes/editor.php:1570 msgid "Edit others posts" msgstr "" #: ../includes/classes/editor.php:1571 msgid "Edit published posts" msgstr "" #: ../includes/classes/editor.php:1572 msgid "Publish posts" msgstr "" #: ../includes/classes/editor.php:1573 msgid "Edit pages" msgstr "" #: ../includes/classes/editor.php:1574 msgid "Read" msgstr "" #: ../includes/classes/editor.php:1575 msgid "Level 10" msgstr "" #: ../includes/classes/editor.php:1576 msgid "Level 9" msgstr "" #: ../includes/classes/editor.php:1577 msgid "Level 8" msgstr "" #: ../includes/classes/editor.php:1578 msgid "Level 7" msgstr "" #: ../includes/classes/editor.php:1579 msgid "Level 6" msgstr "" #: ../includes/classes/editor.php:1580 msgid "Level 5" msgstr "" #: ../includes/classes/editor.php:1581 msgid "Level 4" msgstr "" #: ../includes/classes/editor.php:1582 msgid "Level 3" msgstr "" #: ../includes/classes/editor.php:1583 msgid "Level 2" msgstr "" #: ../includes/classes/editor.php:1584 msgid "Level 1" msgstr "" #: ../includes/classes/editor.php:1585 msgid "Level 0" msgstr "" #: ../includes/classes/editor.php:1586 msgid "Edit others pages" msgstr "" #: ../includes/classes/editor.php:1587 msgid "Edit published pages" msgstr "" #: ../includes/classes/editor.php:1588 msgid "Publish pages" msgstr "" #: ../includes/classes/editor.php:1589 msgid "Delete pages" msgstr "" #: ../includes/classes/editor.php:1590 msgid "Delete others pages" msgstr "" #: ../includes/classes/editor.php:1591 msgid "Delete published pages" msgstr "" #: ../includes/classes/editor.php:1592 msgid "Delete posts" msgstr "" #: ../includes/classes/editor.php:1593 msgid "Delete others posts" msgstr "" #: ../includes/classes/editor.php:1594 msgid "Delete published posts" msgstr "" #: ../includes/classes/editor.php:1595 msgid "Delete private posts" msgstr "" #: ../includes/classes/editor.php:1596 msgid "Edit private posts" msgstr "" #: ../includes/classes/editor.php:1597 msgid "Read private posts" msgstr "" #: ../includes/classes/editor.php:1598 msgid "Delete private pages" msgstr "" #: ../includes/classes/editor.php:1599 msgid "Edit private pages" msgstr "" #: ../includes/classes/editor.php:1600 msgid "Read private pages" msgstr "" #: ../includes/classes/editor.php:1601 msgid "Delete users" msgstr "" #: ../includes/classes/editor.php:1602 msgid "Create users" msgstr "" #: ../includes/classes/editor.php:1603 msgid "Unfiltered upload" msgstr "" #: ../includes/classes/editor.php:1604 msgid "Edit dashboard" msgstr "" #: ../includes/classes/editor.php:1605 msgid "Update plugins" msgstr "" #: ../includes/classes/editor.php:1606 msgid "Delete plugins" msgstr "" #: ../includes/classes/editor.php:1607 msgid "Install plugins" msgstr "" #: ../includes/classes/editor.php:1608 msgid "Update themes" msgstr "" #: ../includes/classes/editor.php:1609 msgid "Install themes" msgstr "" #: ../includes/classes/editor.php:1610 msgid "Update core" msgstr "" #: ../includes/classes/editor.php:1611 msgid "List users" msgstr "" #: ../includes/classes/editor.php:1612 msgid "Remove users" msgstr "" #: ../includes/classes/editor.php:1613 msgid "Add users" msgstr "" #: ../includes/classes/editor.php:1614 msgid "Promote users" msgstr "" #: ../includes/classes/editor.php:1615 msgid "Edit theme options" msgstr "" #: ../includes/classes/editor.php:1616 msgid "Delete themes" msgstr "" #: ../includes/classes/editor.php:1617 msgid "Export" msgstr "" #: ../includes/classes/grant-roles.php:296 #: ../includes/classes/grant-roles.php:342 msgid "Not enough permissions" msgstr "" #: ../includes/classes/grant-roles.php:302 msgid "Can not edit user or invalid data at the users list" msgstr "" #: ../includes/classes/grant-roles.php:310 msgid "Invalid primary role" msgstr "" #: ../includes/classes/grant-roles.php:323 msgid "Invalid data at the other roles list" msgstr "" #: ../includes/classes/grant-roles.php:332 msgid "Roles were granted to users successfully" msgstr "" #: ../includes/classes/grant-roles.php:349 msgid "Wrong request, valid user ID was missed" msgstr "" #: ../includes/classes/grant-roles.php:355 msgid "Requested user does not exist" msgstr "" #: ../includes/classes/grant-roles.php:378 msgid "Primary Role: " msgstr "" #: ../includes/classes/grant-roles.php:384 ../includes/classes/user-view.php:96 msgid "— No role for this site —" msgstr "" #: ../includes/classes/grant-roles.php:398 msgid "Other Roles: " msgstr "" #: ../includes/classes/grant-roles.php:441 msgid "Grant Roles" msgstr "" #: ../includes/classes/grant-roles.php:443 #: ../includes/classes/grant-roles.php:445 msgid "Add role…" msgstr "" #: ../includes/classes/grant-roles.php:448 msgid "Add" msgstr "" #: ../includes/classes/grant-roles.php:450 #: ../includes/classes/grant-roles.php:452 msgid "Revoke role…" msgstr "" #: ../includes/classes/grant-roles.php:455 msgid "Revoke" msgstr "" #: ../includes/classes/grant-roles.php:487 msgid "Grant roles to selected users" msgstr "" #: ../includes/classes/grant-roles.php:488 msgid "Select users to which you wish to grant roles!" msgstr "" #: ../includes/classes/grant-roles.php:489 msgid "Select role(s) which you wish to grant!" msgstr "" #: ../includes/classes/lib.php:383 msgid "Version:" msgstr "" #: ../includes/classes/lib.php:384 msgid "Author's website" msgstr "" #: ../includes/classes/lib.php:385 msgid "Plugin webpage" msgstr "" #: ../includes/classes/lib.php:386 msgid "Plugin download" msgstr "" #: ../includes/classes/lib.php:387 ../includes/classes/user-role-editor.php:532 msgid "Changelog" msgstr "" #: ../includes/classes/lib.php:388 msgid "FAQ" msgstr "" #: ../includes/classes/role-additional-options.php:53 msgid "Hide admin bar" msgstr "" #: ../includes/classes/role-additional-options.php:113 msgid "Additional Options" msgstr "" #: ../includes/classes/role-view.php:64 msgid "None" msgstr "" #: ../includes/classes/role-view.php:97 msgid "Delete All Unused Roles" msgstr "" #: ../includes/classes/role-view.php:197 ../includes/classes/role-view.php:208 msgid "Role name (ID): " msgstr "" #: ../includes/classes/role-view.php:199 ../includes/classes/role-view.php:210 msgid "Display Role Name: " msgstr "" #: ../includes/classes/role-view.php:201 msgid "Make copy of: " msgstr "" #: ../includes/classes/role-view.php:217 msgid "Select Role:" msgstr "" #: ../includes/classes/role-view.php:242 msgid "Capability name (ID): " msgstr "" #: ../includes/classes/role-view.php:354 ../includes/classes/user-view.php:154 msgid "Show capabilities in human readable form" msgstr "" #: ../includes/classes/role-view.php:364 ../includes/classes/screen-help.php:21 #: ../includes/classes/user-view.php:164 ../includes/settings-template.php:78 msgid "Show deprecated capabilities" msgstr "" #: ../includes/classes/role-view.php:368 msgid "If checked, then apply action to ALL sites of this Network" msgstr "" #: ../includes/classes/role-view.php:381 ../includes/classes/tools.php:31 msgid "Apply to All Sites" msgstr "" #: ../includes/classes/role-view.php:398 msgid "Select Role and change its capabilities:" msgstr "" #: ../includes/classes/screen-help.php:12 #: ../includes/classes/screen-help.php:43 #: ../includes/classes/screen-help.php:62 #: ../includes/classes/screen-help.php:81 msgid "User Role Editor Options page help" msgstr "" #: ../includes/classes/screen-help.php:15 ../includes/settings-template.php:61 msgid "Show Administrator role at User Role Editor" msgstr "" #: ../includes/classes/screen-help.php:16 msgid "" "turn this option on in order to make the \"Administrator\" role available at " "the User Role Editor roles selection drop-down list. It is hidden by default " "for security reasons." msgstr "" #: ../includes/classes/screen-help.php:18 ../includes/settings-template.php:70 msgid "Show capabilities in the human readable form" msgstr "" #: ../includes/classes/screen-help.php:19 msgid "" "automatically converts capability names from the technical form for internal " "use like \"edit_others_posts\" to more user friendly form, e.g. \"Edit " "others posts\"." msgstr "" #: ../includes/classes/screen-help.php:22 msgid "" "Capabilities like \"level_0\", \"level_1\" are deprecated and are not used " "by WordPress. They are left at the user roles for the compatibility purpose " "with old themes and plugins code. Turning on this option will show those " "deprecated capabilities." msgstr "" #: ../includes/classes/screen-help.php:25 ../includes/settings-template.php:86 msgid "Confirm role update" msgstr "" #: ../includes/classes/screen-help.php:26 msgid "Show confirmation dialog before save changes made to a current role." msgstr "" #: ../includes/classes/screen-help.php:27 ../includes/settings-template.php:94 msgid "Edit user capabilities" msgstr "" #: ../includes/classes/screen-help.php:28 msgid "" "If turned off - capabilities section of selected user is shown in readonly " "mode. Administrator can not assign capabilities to the user directly. He " "should do it using roles only." msgstr "" #: ../includes/classes/screen-help.php:47 ../includes/settings-template.php:141 msgid "Count users without role" msgstr "" #: ../includes/classes/screen-help.php:48 msgid "" "Show at the \"Users\" page a quant of users without role. Module allows to " "assign all of them an empty role \"No rights\", in order to look on the " "users list with role \"No rights\" at the separate tab then." msgstr "" #: ../includes/classes/screen-help.php:65 msgid "Other default roles for new registered user" msgstr "" #: ../includes/classes/screen-help.php:66 msgid "" "select roles below to assign them to the new user automatically as an " "addition to the primary role. Note for multisite environment: take into " "account that other default roles should exist at the site, in order to be " "assigned to the new registered users." msgstr "" #: ../includes/classes/screen-help.php:84 msgid "Allow non super-administrators to create, edit and delete users" msgstr "" #: ../includes/classes/screen-help.php:85 msgid "" "Super administrator only may create, edit and delete users under WordPress " "multi-site by default. Turn this option on in order to remove this " "limitation." msgstr "" #: ../includes/classes/settings.php:70 ../includes/classes/settings.php:90 #: ../includes/classes/settings.php:140 msgid "User Role Editor options are updated" msgstr "" #: ../includes/classes/settings.php:120 msgid "Default Roles are updated" msgstr "" #: ../includes/classes/tools.php:20 msgid "WARNING!" msgstr "" #: ../includes/classes/tools.php:22 msgid "" "Resetting will setup default user roles and capabilities from WordPress core." msgstr "" #: ../includes/classes/tools.php:23 msgid "" "If any plugins (such as WooCommerce, S2Member and many others) have changed " "user roles and capabilities during installation, those changes will be LOST!" msgstr "" #: ../includes/classes/tools.php:24 msgid "" "For more information on how to undo undesired changes and restore plugins " "capabilities in case you lost them by mistake go to: " msgstr "" #: ../includes/classes/tools.php:32 msgid "" "If checked, then apply action to ALL sites. Main site only is affected in " "other case." msgstr "" #: ../includes/classes/tools.php:40 msgid "Reset Roles to its original state" msgstr "" #: ../includes/classes/tools.php:40 #: ../includes/classes/user-role-editor.php:804 msgid "Reset" msgstr "" #: ../includes/classes/tools.php:64 msgid "Tools: Reset: User Roles were initialized" msgstr "" #: ../includes/classes/user-other-roles.php:124 #: ../includes/classes/user-other-roles.php:259 msgid "Other Roles" msgstr "" #: ../includes/classes/user-other-roles.php:125 msgid "Select additional roles for this user" msgstr "" #: ../includes/classes/user-other-roles.php:222 #, php-format msgid "Denied: %s" msgstr "" #: ../includes/classes/user-other-roles.php:238 #: ../includes/classes/user-role-editor.php:398 msgid "Capabilities" msgstr "" #: ../includes/classes/user-other-roles.php:245 msgid "Edit" msgstr "" #: ../includes/classes/user-other-roles.php:309 msgid "Additional Capabilities" msgstr "" #: ../includes/classes/user-role-editor.php:295 msgid "Change role for users without role" msgstr "" #: ../includes/classes/user-role-editor.php:296 msgid "To:" msgstr "" #: ../includes/classes/user-role-editor.php:297 msgid "No rights" msgstr "" #: ../includes/classes/user-role-editor.php:298 msgid "Provide new role" msgstr "" #: ../includes/classes/user-role-editor.php:370 #: ../includes/classes/user-role-editor.php:372 msgid "You do not have permission to edit this user." msgstr "" #: ../includes/classes/user-role-editor.php:506 #: ../includes/classes/user-role-editor.php:519 msgid "Settings" msgstr "" #: ../includes/classes/user-role-editor.php:561 #: ../includes/settings-template.php:26 msgid "Additional Modules" msgstr "" #: ../includes/classes/user-role-editor.php:567 #: ../includes/settings-template.php:31 msgid "Default Roles" msgstr "" #: ../includes/classes/user-role-editor.php:632 msgid "" "You do not have sufficient permissions to manage options for User Role " "Editor." msgstr "" #: ../includes/classes/user-role-editor.php:755 #: ../includes/classes/user-role-editor.php:801 msgid "Confirm" msgstr "" #: ../includes/classes/user-role-editor.php:756 #: ../includes/classes/user-role-editor.php:802 msgid "Yes" msgstr "" #: ../includes/classes/user-role-editor.php:757 #: ../includes/classes/user-role-editor.php:803 msgid "No" msgstr "" #: ../includes/classes/user-role-editor.php:758 msgid "Update" msgstr "" #: ../includes/classes/user-role-editor.php:759 msgid "Please confirm permissions update" msgstr "" #: ../includes/classes/user-role-editor.php:760 msgid "Add New Role" msgstr "" #: ../includes/classes/user-role-editor.php:761 #: ../includes/classes/user-role-editor.php:766 msgid "Rename Role" msgstr "" #: ../includes/classes/user-role-editor.php:762 msgid " Role name (ID) can not be empty!" msgstr "" #: ../includes/classes/user-role-editor.php:763 msgid "" " Role name (ID) must contain latin characters, digits, hyphens or underscore " "only!" msgstr "" #: ../includes/classes/user-role-editor.php:764 msgid "" " WordPress does not support numeric Role name (ID). Add latin characters to " "it." msgstr "" #: ../includes/classes/user-role-editor.php:765 msgid "Add Role" msgstr "" #: ../includes/classes/user-role-editor.php:767 msgid "Delete Role" msgstr "" #: ../includes/classes/user-role-editor.php:768 msgid "Cancel" msgstr "" #: ../includes/classes/user-role-editor.php:769 msgid "Add Capability" msgstr "" #: ../includes/classes/user-role-editor.php:770 #: ../includes/classes/user-role-editor.php:773 msgid "Delete Capability" msgstr "" #: ../includes/classes/user-role-editor.php:771 msgid "Default Role" msgstr "" #: ../includes/classes/user-role-editor.php:772 msgid "Set New Default Role" msgstr "" #: ../includes/classes/user-role-editor.php:774 msgid "" "Warning! Be careful - removing critical capability could crash some plugin " "or other custom code" msgstr "" #: ../includes/classes/user-role-editor.php:775 msgid " Capability name (ID) can not be empty!" msgstr "" #: ../includes/classes/user-role-editor.php:776 msgid "" " Capability name (ID) must contain latin characters, digits, hyphens or " "underscore only!" msgstr "" #: ../includes/classes/user-role-editor.php:805 msgid "DANGER!" msgstr "" #: ../includes/classes/user-role-editor.php:806 msgid "" " Resetting will restore default user roles and capabilities from WordPress " "core." msgstr "" #: ../includes/classes/user-role-editor.php:807 msgid "" "If any plugins (such as WooCommerce, S2Member and many others) have changed " "user roles and capabilities during installation, all those changes will be " "LOST!" msgstr "" #: ../includes/classes/user-role-editor.php:808 msgid "" "For more information on how to undo undesired changes and restore plugin " "capabilities go to" msgstr "" #: ../includes/classes/user-role-editor.php:810 msgid "Continue?" msgstr "" #: ../includes/classes/user-view.php:59 msgid "Switch To" msgstr "" #: ../includes/classes/user-view.php:71 msgid "Network Super Admin" msgstr "" #: ../includes/classes/user-view.php:137 msgid "Change capabilities for user" msgstr "" #: ../includes/classes/user-view.php:175 msgid "Primary Role:" msgstr "" #: ../includes/classes/user-view.php:181 msgid "bbPress Role:" msgstr "" #: ../includes/classes/user-view.php:190 msgid "Other Roles:" msgstr "" #: ../includes/classes/view.php:289 msgid "Working..." msgstr "" #: ../includes/classes/view.php:320 msgid "Group" msgstr "" #: ../includes/classes/view.php:320 msgid "Total" msgstr "" #: ../includes/classes/view.php:320 msgid "Granted" msgstr "" #: ../includes/classes/view.php:333 msgid "Quick filter:" msgstr "" #: ../includes/classes/view.php:336 msgid "Granted Only" msgstr "" #: ../includes/classes/view.php:339 msgid "Columns:" msgstr "" #: ../includes/settings-template.php:16 msgid "User Role Editor - Options" msgstr "" #: ../includes/settings-template.php:42 msgid "Tools" msgstr "" #: ../includes/settings-template.php:46 msgid "About" msgstr "" #: ../includes/settings-template.php:101 msgid "Show capabilities in" msgstr "" #: ../includes/settings-template.php:107 msgid "columns" msgstr "" #: ../includes/settings-template.php:121 ../includes/settings-template.php:156 #: ../includes/settings-template.php:188 ../includes/settings-template.php:220 msgid "Save" msgstr "" #: ../includes/settings-template.php:168 msgid "Primary default role: " msgstr "" #: ../includes/settings-template.php:175 msgid "Other default roles for new registered user: " msgstr "" #: ../includes/settings-template.php:181 msgid "" "Note for multisite environment: take into account that other default roles " "should exist at the site, in order to be assigned to the new registered " "users." msgstr "" #: ../includes/settings-template.php:207 msgid "Allow non super administrators to create, edit, and delete users" msgstr "" lang/index.php000064400000000034150212007360007276 0ustar00is_pro() ) { return false; } $result = $GLOBALS['user_role_editor']->get_post_view_access_users( $post_id ); return $result; } // end of ure_get_post_view_users() } if ( ! function_exists( 'ure_hide_admin_bar' ) ) { function ure_hide_admin_bar() { show_admin_bar(false); } // end of hide_admin_bar() } if ( ! function_exists( 'wp_roles' ) ) { /** * Included for back compatibility with WP 4.0+ * Retrieves the global WP_Roles instance and instantiates it if necessary. * * @since 4.3.0 * * @global WP_Roles $wp_roles WP_Roles global instance. * * @return WP_Roles WP_Roles global instance if not already instantiated. */ function wp_roles() { global $wp_roles; if (!isset($wp_roles)) { $wp_roles = new WP_Roles(); } return $wp_roles; } } if ( ! function_exists( 'ure_array_merge' ) ) { /** * Wrapper for PHP array_merge() function - for 2 input parameters only * Excludes PHP Fatal error: Uncaught TypeError: array_merge(): Argument #2 must be of type array * Checks that parameters are not null and not empty before a real call of array_merge() */ function ure_array_merge( ...$args ) { $result = array(); foreach( $args as $value ) { if ( $value===null ) { continue; } if ( !is_array( $value ) ) { continue; } if ( empty( $value ) ) { continue; } $result = array_merge( $result, $value ); } return $result; } }includes/classes/user-role-editor.php000064400000112331150212007360013716 0ustar00lib)) { $this->lib = URE_Lib::get_instance('user_role_editor'); } $this->user_other_roles = new URE_User_Other_Roles(); if ($this->lib->is_pro()) { $this->main_page_hook_suffix = 'users_page_users-user-role-editor-pro'; $this->settings_hook_suffix = 'settings_page_settings-user-role-editor-pro'; } else { $this->main_page_hook_suffix = 'users_page_users-user-role-editor'; $this->settings_hook_suffix = 'settings_page_settings-user-role-editor'; } $this->ure_hook_suffixes = array($this->settings_hook_suffix, $this->main_page_hook_suffix); // Activation action register_activation_hook( URE_PLUGIN_FULL_PATH, array($this, 'setup') ); // Deactivation action register_deactivation_hook( URE_PLUGIN_FULL_PATH, array($this, 'cleanup') ); // Who can use this plugin $this->key_capability = URE_Own_Capabilities::get_key_capability(); // Process URE's internal tasks queue $task_queue = URE_Task_Queue::get_instance(); $task_queue->process(); $this->set_hooks(); } // end of __construct() private function set_hooks() { $multisite = $this->lib->get('multisite'); if ($multisite) { // new blog may be registered not at admin back-end only but automatically after new user registration, e.g. // Gravity Forms User Registration Addon does add_action( 'wp_initialize_site', array($this, 'duplicate_roles_for_new_blog'), 99, 1); } // setup additional options hooks for the roles add_action('init', array($this, 'set_role_additional_options_hooks'), 9); if (!is_admin()) { return; } add_action( 'admin_init', array($this, 'plugin_init'), 1 ); add_action('init', array($this, 'load_translation')); // add own submenu add_action('admin_menu', array($this, 'plugin_menu')); if ( $multisite ) { // add own submenu add_action( 'network_admin_menu', array($this, 'network_plugin_menu') ); } // add a Settings link in the installed plugins page add_filter('plugin_action_links_'. URE_PLUGIN_BASE_NAME, array($this, 'plugin_action_links'), 10, 1); add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2); } // end of set_hooks() /** * True - if it's an instance of Pro version, false - for free version * @return boolean */ public function is_pro() { return $this->lib->is_pro(); } // end of is_pro() public function load_users_page() { add_action('restrict_manage_users', array($this, 'show_move_users_from_no_role_button')); add_action('admin_head', array($this, 'add_css_to_users_page')); add_action('admin_footer', array($this, 'add_js_to_users_page')); } // end of load_users_page() /** * Plugin initialization * */ public function plugin_init() { global $pagenow; $user_id = get_current_user_id(); $supress_protection = apply_filters('ure_supress_administrators_protection', false); // these filters and actions should prevent editing users with administrator role // by other users with 'edit_users' capability if (!$supress_protection && !$this->lib->user_is_admin($user_id)) { new URE_Protect_Admin(); } add_action('admin_enqueue_scripts', array($this, 'admin_load_js')); add_action('user_row_actions', array($this, 'user_row'), 10, 2); add_filter('all_plugins', array($this, 'exclude_from_plugins_list')); $multisite = $this->lib->get('multisite'); if ($multisite) { $allow_edit_users_to_not_super_admin = $this->lib->get_option('allow_edit_users_to_not_super_admin', 0); if ($allow_edit_users_to_not_super_admin) { // Make this as late as possible, to overwrite settings made by other plugins, like WooCommerce add_filter('map_meta_cap', array($this, 'restore_users_edit_caps'), 99, 4); remove_all_filters('enable_edit_any_user_configuration'); add_filter('enable_edit_any_user_configuration', '__return_true'); // make this as early as you can, to not provide superadmin privilege when it's not needed add_action('admin_head', array($this, 'edit_user_permission_check'), 1); if ($pagenow == 'user-new.php') { add_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); } } if ( $pagenow=='site-users.php' ) { // Try to execute before any other function linked to this filter add_filter('editable_roles', array($this, 'fix_network_admin_roles_dropdown'), 9 ); } } else { $count_users_without_role = $this->lib->get_option('count_users_without_role', 0); if ($count_users_without_role) { add_action( 'load-users.php', array($this, 'load_users_page') ); } } $bulk_grant_roles = apply_filters('ure_bulk_grant_roles', true); if ($bulk_grant_roles) { new URE_Grant_Roles(); } add_action('wp_ajax_ure_ajax', array($this, 'ure_ajax')); add_action('editable_roles', array( $this, 'translate_custom_roles' ), 10, 1 ); // Input parameter $roles_sorting_order = false by default // Acceptable values: // true - sort by role ID (for backward compatibility), // 'id' - sort roles by role ID, // 'name' - sort roles by role name. $roles_sorting_order = apply_filters( 'ure_sort_wp_roles_list', false); if ( !empty( $roles_sorting_order ) ) { $this->lib->set('roles_sorting_order', $roles_sorting_order ); add_filter('editable_roles', array( $this, 'sort_wp_roles_list' ), 11, 1 ); } } // end of plugin_init() /** * Allow non-superadmin user to add/create users to the site as superadmin does. * Include current user to the list of superadmins - for the user-new.php page only, and * if user really can create_users and promote_users * @global string $pagenow * @param array $site_admins * @return array */ public function allow_add_user_as_superadmin($site_admins) { global $pagenow; $this->lib->set_raised_permissions(false); if ($pagenow!=='user-new.php') { return $site_admins; } // Check if current user really can create and promote users remove_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); $can_add_user = current_user_can('create_users') && current_user_can('promote_users'); add_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); if (!$can_add_user) { return $site_admins; // no help in this case } $current_user = wp_get_current_user(); if (!in_array($current_user->user_login, $site_admins)) { $this->lib->set_raised_permissions(true); $site_admins[] = $current_user->user_login; } return $site_admins; } // end of allow_add_user_as_superadmin() public function show_move_users_from_no_role_button() { if ( !current_user_can( 'promote_users' ) ) { return; } $assign_role = $this->lib->get_assign_role(); $assign_role->show_html(); } // end of move_users_from_no_role() public function add_css_to_users_page() { wp_enqueue_style( 'wp-jquery-ui-dialog' ); wp_enqueue_style( 'ure-admin', URE_PLUGIN_URL . 'css/ure-admin.css', array(), URE_VERSION, 'screen' ); } // end of add_css_to_users_page() public function add_js_to_users_page() { global $wp_version; wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core','jquery-ui-button', 'jquery'), $wp_version, true ); wp_register_script( 'ure-users', plugins_url( '/js/users.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); wp_enqueue_script ( 'ure-users' ); wp_localize_script( 'ure-users', 'ure_users_data', array( 'wp_nonce' => wp_create_nonce('user-role-editor'), 'move_from_no_role_title' => esc_html__('Change role for users without role', 'user-role-editor'), 'to' => esc_html__('To:', 'user-role-editor'), 'no_rights_caption' => esc_html__('No rights', 'user-role-editor'), 'provide_new_role_caption' => esc_html__('Provide new role', 'user-role-editor') )); } // end of add_js_to_users_page() /** * restore edit_users, delete_users, create_users capabilities for non-superadmin users under multisite * (code is provided by http://wordpress.org/support/profile/sjobidoo) * * @param type $caps * @param type $cap * @param type $user_id * @param type $args * @return type */ public function restore_users_edit_caps($caps, $cap, $user_id, $args) { foreach ($caps as $key => $capability) { if ($capability != 'do_not_allow') continue; switch ($cap) { case 'edit_user': case 'edit_users': $caps[$key] = 'edit_users'; break; case 'delete_user': case 'delete_users': $caps[$key] = 'delete_users'; break; case 'create_users': $caps[$key] = $cap; break; } } return $caps; } // end of restore_user_edit_caps() /** * Checks that both the editing user and the user being edited are * members of the blog and prevents the super admin being edited. * (code is provided by http://wordpress.org/support/profile/sjobidoo) * */ public function edit_user_permission_check() { global $profileuser; $current_user_id = get_current_user_id(); if ($current_user_id===0) { return; } if ($this->lib->is_super_admin()) { // Superadmin may do all return; } $screen = get_current_screen(); if (empty($screen)) { return; } if ($screen->base !== 'user-edit' && $screen->base !== 'user-edit-network') { return; } if ( !isset( $profileuser->ID ) ) { return; } $current_blog_id = get_current_blog_id(); // editing a user profile: it's correct to call is_super_admin() directly here, as permissions are raised for the $current_user only if ( !$this->lib->is_super_admin( $current_user_id ) && is_super_admin( $profileuser->ID ) ) { // trying to edit a superadmin while himself is less than a superadmin wp_die( esc_html__('You do not have permission to edit this user.', 'user-role-editor') ); } elseif ( !( is_user_member_of_blog( $profileuser->ID, $current_blog_id ) && is_user_member_of_blog( $current_user_id, $current_blog_id ) ) ) { // editing user and edited user aren't members of the same blog wp_die( esc_html__('You do not have permission to edit this user.', 'user-role-editor') ); } } // end of edit_user_permission_check() /** * Add/hide edit actions for every user row at the users list * * @global type $pagenow * @param string $actions * @param type $user * @return string */ public function user_row($actions, $user) { global $pagenow; if ($pagenow!=='users.php') { return $actions; } $current_user = wp_get_current_user(); if ($current_user->has_cap($this->key_capability)) { $actions['capabilities'] = 'ID}", "ure_user_{$user->ID}") . '">' . esc_html__('Capabilities', 'user-role-editor') . ''; } return $actions; } // end of user_row() /** * Every time when new blog is created - duplicate for it the roles from the main blog * @global wpdb $wpdb * @global WP_Roles $wp_roles * @param WP_Site $site * @param int $user_id * */ public function duplicate_roles_for_new_blog( $site ) { global $wpdb, $wp_roles; // get Id of 1st (main) blog $main_blog_id = $this->lib->get_main_blog_id(); if ( empty( $main_blog_id ) ) { return; } $current_blog = $wpdb->blogid; if ( $current_blog!=$main_blog_id ) { switch_to_blog( $main_blog_id ); } $main_roles = new WP_Roles(); // Get roles from primary blog $default_role = get_option( 'default_role' ); // get default role from primary blog $addons_data = apply_filters( 'ure_get_addons_data_for_new_blog', array() ); // Load addons data to replicate later for the new site - for internal use in a Pro version $blog_id = $site->blog_id; switch_to_blog( $blog_id ); // switch to the new created blog $main_roles->use_db = false; // do not touch DB $main_roles->add_cap( 'administrator', 'dummy_123456' ); // just to save current roles into new blog $main_roles->role_key = $wp_roles->role_key; $main_roles->use_db = true; // save roles into new blog DB $main_roles->remove_cap( 'administrator', 'dummy_123456' ); // remove unneeded dummy capability update_option( 'default_role', $default_role ); // set default role for new blog as it set for primary one if ( !empty($addons_data) ) { do_action('ure_set_addons_data_for_new_blog', $blog_id, $addons_data); // save addons data from the main site/blog to the new site/blog - for internal use in a Pro version } switch_to_blog( $current_blog ); // return to blog where we were at the begin } // end of duplicate_roles_for_new_blog() /** * Filter out URE plugin from not admin users to prevent its not authorized deactivation * @param type array $plugins plugins list * @return type array $plugins updated plugins list */ public function exclude_from_plugins_list($plugins) { $multisite = $this->lib->get('multisite'); // if multi-site, then allow plugin activation for network superadmins and, if that's specially defined, - for single site administrators too if ($multisite) { if ($this->lib->is_super_admin() || $this->lib->user_is_admin()) { return $plugins; } } else { // is_super_admin() defines superadmin for not multisite as user who can 'delete_users' which I don't like. // So let's check if user has 'administrator' role better. if (current_user_can('administrator') || $this->lib->user_is_admin()) { return $plugins; } } // exclude URE from plugins list $key = basename(URE_PLUGIN_DIR) . '/' . URE_PLUGIN_FILE; unset($plugins[$key]); return $plugins; } // end of exclude_from_plugins_list() /** * Load plugin translation files - linked to the 'init' action * */ public function load_translation() { load_plugin_textdomain('user-role-editor', false, dirname( plugin_basename( URE_PLUGIN_FULL_PATH ) ) .'/lang'); if ( function_exists('pll_register_string') ) { // Integration with PolyLang plugin (https://wordpress.org/plugins/polylang/) $all_roles = wp_roles()->roles; foreach( $all_roles as $role_id=>$role ) { if ( !$this->lib->is_wp_built_in_role( $role_id ) ) { pll_register_string( $role_id, $role['name'], 'user-role-editor' ); } } } } // end of load_translation() /** * Modify plugin action links * * @param array $links * @return array */ public function plugin_action_links($links) { $single_site_settings_link = '' . esc_html__('Settings', 'user-role-editor') .''; $multisite = $this->lib->get('multisite'); if (!$multisite ) { $settings_link = $single_site_settings_link; } else { $ure = basename(URE_PLUGIN_DIR) . '/' . URE_PLUGIN_FILE; $active_for_network = is_plugin_active_for_network($ure); if (!$active_for_network) { $settings_link = $single_site_settings_link; } else { if (!current_user_can('manage_network_plugins')) { return $links; } $settings_link = ''. esc_html__('Settings', 'user-role-editor') .''; } } array_unshift($links, $settings_link); return $links; } // end of plugin_action_links() public function plugin_row_meta($links, $file) { if ($file == plugin_basename(dirname(URE_PLUGIN_FULL_PATH) .'/'.URE_PLUGIN_FILE)) { $links[] = '' . esc_html__('Changelog', 'user-role-editor') . ''; } return $links; } // end of plugin_row_meta public function settings_screen_configure() { $multisite = $this->lib->get('multisite'); $settings_page_hook = $this->settings_page_hook; if ($multisite) { $settings_page_hook .= '-network'; } $screen = get_current_screen(); // Check if current screen is URE's settings page if ($screen->id != $settings_page_hook) { return; } $screen_help = new Ure_Screen_Help(); $screen->add_help_tab( array( 'id' => 'general', 'title' => esc_html__('General', 'user-role-editor'), 'content' => $screen_help->get_settings_help('general') )); if ($this->lib->is_pro() || !$multisite) { $screen->add_help_tab( array( 'id' => 'additional_modules', 'title' => esc_html__('Additional Modules', 'user-role-editor'), 'content' => $screen_help->get_settings_help('additional_modules') )); } $screen->add_help_tab( array( 'id' => 'default_roles', 'title' => esc_html__('Default Roles', 'user-role-editor'), 'content' => $screen_help->get_settings_help('default_roles') )); if ($multisite) { $screen->add_help_tab( array( 'id' => 'multisite', 'title' => esc_html__('Multisite', 'user-role-editor'), 'content' => $screen_help->get_settings_help('multisite') )); } } // end of settings_screen_configure() public function plugin_menu() { if (function_exists('add_submenu_page')) { $ure_page = add_submenu_page( 'users.php', esc_html__('User Role Editor', 'user-role-editor'), esc_html__('User Role Editor', 'user-role-editor'), 'ure_edit_roles', 'users-' . URE_PLUGIN_FILE, array($this, 'edit_roles')); add_action("admin_print_styles-$ure_page", array($this, 'admin_css_action')); } $multisite = $this->lib->get('multisite'); $active_for_network = $this->lib->get('active_for_network'); if ( !$multisite || ($multisite && !$active_for_network) ) { $settings_capability = URE_Own_Capabilities::get_settings_capability(); $this->settings_page_hook = add_options_page( esc_html__('User Role Editor', 'user-role-editor'), esc_html__('User Role Editor', 'user-role-editor'), $settings_capability, 'settings-' . URE_PLUGIN_FILE, array($this, 'settings')); add_action( 'load-'.$this->settings_page_hook, array($this,'settings_screen_configure') ); add_action("admin_print_styles-{$this->settings_page_hook}", array($this, 'settings_css_action')); } } // end of plugin_menu() public function network_plugin_menu() { if (is_multisite()) { $this->settings_page_hook = add_submenu_page( 'settings.php', esc_html__('User Role Editor', 'user-role-editor'), esc_html__('User Role Editor', 'user-role-editor'), $this->key_capability, 'settings-' . URE_PLUGIN_FILE, array(&$this, 'settings')); add_action( 'load-'.$this->settings_page_hook, array($this,'settings_screen_configure') ); add_action("admin_print_styles-{$this->settings_page_hook}", array($this, 'settings_css_action')); } } // end of network_plugin_menu() public function settings() { $settings_capability = URE_Own_Capabilities::get_settings_capability(); if (!current_user_can($settings_capability)) { wp_die(esc_html__( 'You do not have sufficient permissions to manage options for User Role Editor.', 'user-role-editor' )); } URE_Settings::show(); } // end of settings() public function admin_css_action() { wp_enqueue_style('wp-jquery-ui-selectable'); wp_enqueue_style('ure-jquery-ui-general', URE_PLUGIN_URL . 'css/jquery-ui.min.css', array(), URE_VERSION, 'screen'); wp_enqueue_style('ure-admin', URE_PLUGIN_URL . 'css/ure-admin.css', array(), URE_VERSION, 'screen'); } // end of admin_css_action() public function settings_css_action() { wp_enqueue_style('ure-jquery-ui-tabs', URE_PLUGIN_URL . 'css/jquery-ui.min.css', array(), URE_VERSION, 'screen'); wp_enqueue_style('ure-admin', URE_PLUGIN_URL . 'css/ure-admin.css', array(), URE_VERSION, 'screen'); } // end of admin_css_action() // call roles editor page public function edit_roles() { if (!current_user_can('ure_edit_roles')) { wp_die(esc_html__('Insufficient permissions to work with User Role Editor', 'user-role-editor')); } $editor = URE_Editor::get_instance(); $editor->show(); } // end of edit_roles() /** * Create backup record for the WordPress user roles * Run once on URE activation * * @global wpdb $wpdb * @global WP_Roles $wp_roles * @return type */ protected function backup_wp_roles() { global $wpdb; $site_id = get_current_blog_id(); $backup_roles_key = $wpdb->get_blog_prefix($site_id) .'backup_user_roles'; // check if backup user roles record exists already $result = get_option($backup_roles_key, false); if (!empty($result)) { return; } $wp_roles = wp_roles(); update_option($backup_roles_key, $wp_roles->roles, false); } // end of backup_wp_roles() /** * execute on plugin activation */ function setup() { $this->backup_wp_roles(); URE_Own_Capabilities::init_caps(); $task_queue = URE_Task_Queue::get_instance(); $task_queue->add('on_activation'); } // end of setup() protected function get_ure_page_url() { $page_url = admin_url() . URE_PARENT . '?page=users-' . URE_PLUGIN_FILE; $object = $this->lib->get_request_var('object', 'get'); $user_id = (int) $this->lib->get_request_var('user_id', 'get', 'int'); if ($object=='user' && $user_id>0) { $page_url .= '&object=user&user_id='. $user_id; } return $page_url; } // end of get_ure_page_url() protected function load_main_page_js() { global $wp_version; $confirm_role_update = $this->lib->get_option('ure_confirm_role_update', 1); $page_url = $this->get_ure_page_url(); $multisite = $this->lib->get('multisite'); if ( !( $multisite && $this->lib->is_super_admin() ) ) { $do_not_revoke_from_admin = true; } else { // do not limit SuperAdmin for multi-site $do_not_revoke_from_admin = false; } wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery-ui-button', 'jquery'), $wp_version, true ); wp_enqueue_script('jquery-ui-selectable', '', array('jquery-ui-core', 'jquery'), $wp_version, true ); wp_enqueue_script('notifyjs', plugins_url('/js/notify.min.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); wp_register_script('ure', plugins_url('/js/ure.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); wp_enqueue_script('ure'); wp_localize_script('ure', 'ure_data', array( 'wp_nonce' => wp_create_nonce('user-role-editor'), 'network_admin' => is_network_admin() ? 1 : 0, 'page_url' => $page_url, 'is_multisite' => is_multisite() ? 1 : 0, 'do_not_revoke_from_admin' => $do_not_revoke_from_admin ? 1 : 0, 'confirm_role_update' => $confirm_role_update ? 1 : 0, 'confirm_title' => esc_html__('Confirm', 'user-role-editor'), 'yes_label' => esc_html__('Yes', 'user-role-editor'), 'no_label' => esc_html__('No', 'user-role-editor'), 'update' => esc_html__('Update', 'user-role-editor'), 'confirm_submit' => esc_html__('Please confirm permissions update', 'user-role-editor'), 'add_new_role_title' => esc_html__('Add New Role', 'user-role-editor'), 'rename_role_title' => esc_html__('Rename Role', 'user-role-editor'), 'role_name_required' => esc_html__(' Role name (ID) can not be empty!', 'user-role-editor'), 'role_name_valid_chars' => esc_html__(' Role name (ID) must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'), 'numeric_role_name_prohibited' => esc_html__(' WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor'), 'add_role' => esc_html__('Add Role', 'user-role-editor'), 'rename_role' => esc_html__('Rename Role', 'user-role-editor'), 'delete_role' => esc_html__('Delete Role', 'user-role-editor'), 'cancel' => esc_html__('Cancel', 'user-role-editor'), 'add_capability' => esc_html__('Add Capability', 'user-role-editor'), 'delete_capability' => esc_html__('Delete Capability', 'user-role-editor'), 'default_role' => esc_html__('Default Role', 'user-role-editor'), 'set_new_default_role' => esc_html__('Set New Default Role', 'user-role-editor'), 'delete_capability' => esc_html__('Delete Capability', 'user-role-editor'), 'delete_capability_warning' => esc_html__('Warning! Be careful - removing critical capability could crash some plugin or other custom code', 'user-role-editor'), 'capability_name_required' => esc_html__(' Capability name (ID) can not be empty!', 'user-role-editor'), 'capability_name_valid_chars' => esc_html__(' Capability name (ID) must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'), )); // load additional JS stuff for Pro version, if exists do_action('ure_load_js'); } // end of load_main_page_js() protected function load_settings_js() { global $wp_version; $page_url = $this->get_ure_page_url(); wp_enqueue_script('jquery-ui-tabs', '', array('jquery-ui-core', 'jquery'), $wp_version, true ); wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery'), $wp_version, true ); wp_enqueue_script('jquery-ui-button', '', array('jquery-ui-core', 'jquery'), $wp_version, true ); wp_register_script('ure-settings', plugins_url('/js/settings.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); wp_enqueue_script('ure-settings'); wp_localize_script('ure-settings', 'ure_data', array( 'wp_nonce' => wp_create_nonce('user-role-editor'), 'network_admin' => is_network_admin() ? 1 : 0, 'page_url' => $page_url, 'is_multisite' => is_multisite() ? 1 : 0, 'confirm_title' => esc_html__('Confirm', 'user-role-editor'), 'yes_label' => esc_html__('Yes', 'user-role-editor'), 'no_label' => esc_html__('No', 'user-role-editor'), 'reset' => esc_html__('Reset', 'user-role-editor'), 'reset_warning' => ''. esc_html__('DANGER!', 'user-role-editor') .''. esc_html__(' Resetting will restore default user roles and capabilities from WordPress core.', 'user-role-editor') .'

'. esc_html__('If any plugins (such as WooCommerce, S2Member and many others) have changed user roles and capabilities during installation, all those changes will be LOST!', 'user-role-editor') .'
'. esc_html__('For more information on how to undo undesired changes and restore plugin capabilities go to', 'user-role-editor') .'
'. 'http://role-editor.com/how-to-restore-deleted-wordpress-user-roles/' .'

'. esc_html__('Continue?', 'user-role-editor'), 'reset_roles_secure_text' => URE_Tools::RESET_ROLES_SECURE_TEXT )); do_action('ure_load_js_settings'); } // end of load_settings_js() /** * Load plugin javascript stuff * * @param string $hook_suffix */ public function admin_load_js($hook_suffix) { URE_Known_JS_CSS_Compatibility_Issues::fix($hook_suffix, $this->ure_hook_suffixes); if ($hook_suffix==$this->main_page_hook_suffix) { $this->load_main_page_js(); } elseif($hook_suffix==$this->settings_hook_suffix) { $this->load_settings_js(); } } // end of admin_load_js() public function ure_ajax() { $ajax_processor = new URE_Ajax_Processor(); $ajax_processor->dispatch(); } // end of ure_ajax() public function set_role_additional_options_hooks() { $role_additional_options = URE_Role_Additional_Options::get_instance($this->lib); $role_additional_options->set_active_items_hooks(); } // end of set_role_additional_options_hooks() private function sort_roles_by_name( $roles ) { $role_names = array(); foreach( $roles as $role_id=>$role ) { $role_names[$role_id] = $role['name']; } asort( $role_names ); $roles1 = array(); foreach( $role_names as $role_id=>$role_name ) { $roles1[$role_id] = $roles[$role_id]; } return $roles1; } // end of sort_roles_by_name() /** * Sort roles array alphabetically * @param array $roles * @return array */ public function sort_wp_roles_list( $roles ) { $roles_sorting_order = $this->lib->get('roles_sorting_order'); if ( $roles_sorting_order==='id' || $roles_sorting_order===true ) { // sort by role ID ksort( $roles ); return $roles; } else if ( $roles_sorting_order==='name') { // sort by role name $roles1 = $this->sort_roles_by_name( $roles ); return $roles1; } else { // change nothing return $roles; } // wp-admin/includes/template.php: wp_dropdown_roles() showed roles returned by get_editable_roles() in reversed order, #932: // $editable_roles = array_reverse( get_editable_roles() ); // so we may need to reverse them 1st, in order they will be reversed back to the ascending order //$roles = array_reverse( $roles ); return $roles; } // end of sort_wp_roles_list() /** Currently WordPress (tested up to version 5.9.3) shows "Change role to..." drop-down list at Network admin->Sites->selected site->Users with roles filled from the main site, /* but should use roles list from the selected site. This function replaces roles list with roles from the selected site and * excludes error messsage "Sorry, you are not allowed to give users that role.", when you try to grant to a user a role which does not exist at the selected site. * * @param array $roles * @return array */ public function fix_network_admin_roles_dropdown( $roles ) { // get selected site ID $selected_blog_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0; if ( !$selected_blog_id ) { return $roles; } $current_blog_id = get_current_blog_id(); if ( $current_blog_id!==$selected_blog_id ) { switch_to_blog( $selected_blog_id ); } remove_filter( 'editable_roles', array($this, 'fix_network_admin_roles_dropdown'), 9 ); $roles1 = get_editable_roles(); add_filter( 'editable_roles', array($this, 'fix_network_admin_roles_dropdown'), 9 ); if ( $current_blog_id!==$selected_blog_id ) { restore_current_blog(); } return $roles1; } // end of fix_network_admin_roles_dropdown() /* * Translate user role names, inluding custom roles added by user * */ function translate_custom_roles( $roles ) { $use_pll = function_exists('pll__'); foreach ($roles as $key => $value) { $role_name = $value['name']; if ($this->lib->is_wp_built_in_role($key)) { // get WordPress internal translation $translated_name = translate_user_role( $role_name ); } elseif ($use_pll) { // Integration with PolyLang plugin (https://wordpress.org/plugins/polylang/) $translated_name = pll__($role_name); } else { // translation is not available $translated_name = $role_name; } $roles[$key]['name'] = esc_html( $translated_name ); } $roles = apply_filters('ure_editable_roles', $roles ); return $roles; } // end of translate_custom_roles() // execute on plugin deactivation public function cleanup() { } // end of cleanup() // excute on plugin uninstall via WordPress->Plugins->Delete public static function uninstall() { $uninstall = new URE_Uninstall; $uninstall->act(); } // end of uninstall() } // end of User_Role_Editor includes/classes/bbpress.php000064400000005500150212007360012154 0ustar00bbpress_detected = false; if ( function_exists('bbp_filter_blog_editable_roles') ) { $this->bbpress_detected = true; // bbPress plugin is installed and active } } // end of detect_bbpress() public function is_active() { return $this->bbpress_detected; } // end of is_active() /** * Exclude roles created by bbPress * * @global array $wp_roles * @return array */ public function get_roles() { $wp_roles = wp_roles(); if ($this->bbpress_detected) { $roles = bbp_filter_blog_editable_roles( $wp_roles->roles ); // exclude bbPress roles } else { $roles = $wp_roles->roles; } return $roles; } // end of get_roles() /** * Get full list user capabilities created by bbPress * * @return array */ public function get_caps() { if ( $this->bbpress_detected ) { $caps = array_keys( bbp_get_caps_for_role( bbp_get_keymaster_role() ) ); } else { $caps = array(); } return $caps; } // end of get_caps() /** * Return empty array in order do not include bbPress roles into selectable lists: supported by Pro version only * @return array */ public function get_bbp_editable_roles() { $all_bbp_roles = array(); return $all_bbp_roles; } // end of get_bbp_editable_roles() /** * Return bbPress roles found at $roles array. Used to exclude bbPress roles from processing as free version should not support them * * @param array $roles * @return array */ public function extract_bbp_roles($roles) { $user_bbp_roles = array(); if ( $this->bbpress_detected ) { $all_bbp_roles = array_keys( bbp_get_dynamic_roles() ); foreach( $roles as $role ) { if ( in_array( $role, $all_bbp_roles ) ) { $user_bbp_roles[] = $role; } } } return $user_bbp_roles; } // end of extract_bbp_roles() } // end of URE_bbPress classincludes/classes/own-capabilities.php000064400000012341150212007360013747 0ustar00 * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya **/ class URE_Own_Capabilities { const URE_SETTINGS_CAP_TR = 'ure_settings_cap'; public static function get_caps() { $lib = URE_Lib::get_instance(); $ure_caps = array( 'ure_edit_roles' => 1, 'ure_create_roles' => 1, 'ure_delete_roles' => 1, 'ure_create_capabilities' => 1, 'ure_delete_capabilities' => 1, 'ure_manage_options' => 1, 'ure_reset_roles' => 1 ); if ($lib->is_pro()) { $ure_caps['ure_export_roles'] = 1; $ure_caps['ure_import_roles'] = 1; $ure_caps['ure_admin_menu_access'] = 1; $ure_caps['ure_widgets_access'] = 1; $ure_caps['ure_widgets_show_access'] = 1; $ure_caps['ure_meta_boxes_access'] = 1; $ure_caps['ure_other_roles_access'] = 1; $ure_caps['ure_edit_posts_access'] = 1; $ure_caps['ure_edit_gravityforms_access'] = 1; $ure_caps['ure_plugins_activation_access'] = 1; $ure_caps['ure_view_posts_access'] = 1; $ure_caps['ure_front_end_menu_access'] = 1; $ure_caps['ure_nav_menus_access'] = 1; $multisite = $lib->get('multisite'); if ($multisite) { $ure_caps['ure_themes_access'] = 1; } } return $ure_caps; } // end of get_caps() /** * return key capability to have access to User Role Editor Plugin */ public static function get_key_capability() { $lib = URE_Lib::get_instance(); $key_cap = $lib->get('key_capability'); if (!empty($key_cap)) { return $key_cap; } $multisite = $lib->get('multisite'); if ( !$multisite ) { $key_cap = URE_KEY_CAPABILITY; } else { $enable_simple_admin_for_multisite = $lib->get_option('enable_simple_admin_for_multisite', 0); if ( ( defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE') && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1 ) || $enable_simple_admin_for_multisite ) { $key_cap = URE_KEY_CAPABILITY; } else { $key_cap = 'manage_network_plugins'; } } $lib->set('key_capability', $key_cap); return $key_cap; } // end of get_key_capability() /** * Return user capability for the User Role Editor Settings page * * @return string */ public static function get_settings_capability() { $lib = URE_Lib::get_instance(); $settings_cap = $lib->get('settings_capability'); if ( !empty( $settings_cap ) ) { return $settings_cap; } $multisite = $lib->get('multisite'); if (!$multisite) { $settings_cap = 'ure_manage_options'; } else { $enable_simple_admin_for_multisite = $lib->get_option('enable_simple_admin_for_multisite', 0); if ( ( defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE' ) && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1 ) || $enable_simple_admin_for_multisite ) { $settings_cap = 'ure_manage_options'; } else { $settings_cap = self::get_key_capability(); } } $lib->set('settings_capability', $settings_cap ); return $settings_cap; } // end of get_settings_capability() public static function init_caps() { $wp_roles = wp_roles(); if ( !isset( $wp_roles->roles['administrator'] ) ) { return; } $lib = URE_Lib::get_instance(); $multisite = $lib->get('multisite'); // Do not turn on URE caps for local administrator by default under multisite, as there is a superadmin. $turn_on = !$multisite; $old_use_db = $wp_roles->use_db; $wp_roles->use_db = true; $administrator = $wp_roles->role_objects['administrator']; $ure_caps = self::get_caps(); foreach( array_keys( $ure_caps ) as $cap ) { if ( !$administrator->has_cap( $cap ) ) { $administrator->add_cap( $cap, $turn_on ); } } $wp_roles->use_db = $old_use_db; } // end of init_caps() /** * Return list of URE capabilities with data about groups they were included * * @return array */ public static function get_caps_groups() { $ure_caps = self::get_caps(); $caps = array(); foreach( array_keys( $ure_caps ) as $ure_cap ) { $caps[$ure_cap] = array('custom', 'user_role_editor'); } return $caps; } // end of get_caps_groups() } // end of URE_Capabilities classincludes/classes/screen-help.php000064400000013422150212007360012723 0ustar00'. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

  • ' . esc_html__('Show Administrator role at User Role Editor', 'user-role-editor') .' - ' . esc_html__('turn this option on in order to make the "Administrator" role available at the User Role Editor roles selection drop-down list.', 'user-role-editor') .' '. esc_html__('It is hidden by default for security reasons.','user-role-editor') . '
  • ' . esc_html__('Show capabilities in the human readable form','user-role-editor').' - ' . esc_html__('automatically converts capability names from the technical form for internal use like "edit_others_posts" to more user friendly form, e.g. "Edit others posts".','user-role-editor') . '
  • ' . esc_html__('Show deprecated capabilities','user-role-editor') .' - '. esc_html__('Capabilities like "level_0", "level_1" are deprecated and are not used by WordPress.','user-role-editor') .' '. esc_html__('They are left at the user roles for the compatibility purpose with old themes and plugins code.','user-role-editor') .' '. esc_html__('Turning on this option will show those deprecated capabilities.', 'user-role-editor') . '
  • ' . esc_html__('Confirm role update','user-role-editor').' - ' . esc_html__('Show confirmation dialog before save changes made to a current role.', 'user-role-editor') . '
  • ' . esc_html__('Edit user capabilities','user-role-editor') .' - '. esc_html__('If turned off - capabilities section of selected user is shown in readonly mode.','user-role-editor'). ' '. esc_html__('Administrator can not assign capabilities to the user directly.','user-role-editor'). ' '. esc_html__('He should do it using roles only.', 'user-role-editor') . '
  • '; $text = apply_filters('ure_get_settings_general_tab_help', $text); $text .='

'; return $text; } // end of get_general_tab() protected function get_additional_modules_tab() { $text = '

'. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

    '; if (!is_multisite()) { $text .= '
  • ' . esc_html__('Count users without role', 'user-role-editor') .' - ' . esc_html__('Show at the "Users" page a quant of users without role. Module allows to assign all of them ', 'user-role-editor') .' '. esc_html__('an empty role "No rights", in order to look on the users list with role "No rights" at the separate tab then.','user-role-editor') . '
  • '; } $text = apply_filters('ure_get_settings_additional_modules_tab_help', $text); $text .='

'; return $text; } // end of get_additional_modules_tab() protected function get_default_roles_tab() { $text = '

'. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

  • ' . esc_html__('Other default roles for new registered user', 'user-role-editor') .' - ' . esc_html__('select roles below to assign them to the new user automatically as an addition to the primary role.', 'user-role-editor') .' '. esc_html__('Note for multisite environment: take into account that other default roles should exist at the site,', 'user-role-editor') .' '. esc_html__('in order to be assigned to the new registered users.','user-role-editor') . '
  • '; $text = apply_filters('ure_get_settings_default_roles_tab_help', $text); $text .='

'; return $text; } // end of get_default_roles_tab() protected function get_multisite_tab() { $text = '

'. esc_html__( 'User Role Editor Options page help', 'user-role-editor' ) .'

  • ' . esc_html__( 'Allow non super-administrators to create, edit and delete users', 'user-role-editor' ) .' - '. esc_html__( 'Super administrator only may create, edit and delete users under WordPress multi-site by default.', 'user-role-editor' ) .' '. esc_html__('Turn this option on in order to remove this limitation.','user-role-editor' ) .'
  • '; $text = apply_filters('ure_get_settings_multisite_tab_help', $text); $text .='

'; return $text; } // end of get_multisite_tab() public function get_settings_help($tab_name) { switch ($tab_name) { case 'general':{ $text = $this->get_general_tab(); break; } case 'additional_modules':{ $text = $this->get_additional_modules_tab(); break; } case 'default_roles':{ $text = $this->get_default_roles_tab(); break; } case 'multisite':{ $text = $this->get_multisite_tab(); break; } default: } return $text; } // end of get_settings_help() } // end of URE_Screen_Help includes/classes/task-queue.php000064400000007676150212007360012620 0ustar00init(); } // end of __construct() private function init() { $this->queue = get_option(self::OPTION_NAME, array()); } // end of init() public function reinit() { $this->init(); } // end of reinit() /** * * @param string $task_id * @param array $args=array('action'=>'action_name', 'routine'=>'routine_name', 'priority'=>99) */ public function add($task_id, $args=array()) { $this->queue[$task_id] = $args; update_option(self::OPTION_NAME, $this->queue); } // end of add_task() public function remove($task_id) { if (isset($this->queue[$task_id])) { unset($this->queue[$task_id]); update_option(self::OPTION_NAME, $this->queue); } } // end of remove_task() /** * Returns true in case a queue is empty * * @return boolean */ public function is_empty() { return count($this->queue)==0; } // end of is_empty() /** * Consumers should add there tasks with add_method and add 'ure_fulfil_task' action routine to work on it. * Do not forget remove task after it was fulfilled. * * @return void */ public function process() { if ($this->is_empty()) { return; } foreach($this->queue as $task_id=>$task) { if ($task_id=='on_activation') { do_action('ure_on_activation'); $this->remove('on_activation'); // remove this task after execution if it was defined } elseif (!empty($task['action'])) { $priority = empty($task['priority']) ? 10: $task['priority']; add_action($task['action'], $task['routine'], $priority); } else { add_action('init', $task['routine']); } } } // end of process(); /** * Prevent cloning of the instance of the *Singleton* instance. * * @return void */ public function __clone() { throw new \Exception('Do not clone a singleton instance.'); } // end of __clone() /** * Prevent unserializing of the *Singleton* instance. * * @return void */ public function __wakeup() { throw new \Exception('Do not unserialize a singleton instance.'); } // end of __wakeup() } // end of class URE_On_Activationincludes/classes/protect-admin.php000064400000020007150212007360013261 0ustar00lib = URE_Lib::get_instance(); $this->user_to_check = array(); // Exclude administrator role from edit list. add_filter('editable_roles', array($this, 'exclude_admin_role')); if (in_array($pagenow, array('users.php', 'user-edit.php'))) { // prohibit any actions with user who has Administrator role add_filter('user_has_cap', array($this, 'not_edit_admin'), 10, 3); } // exclude users with 'Administrator' role from users list add_action('pre_user_query', array($this, 'exclude_administrators')); // do not show 'Administrator (s)' view above users list add_filter('views_users', array($this, 'exclude_admins_view')); } // end of __construct() // apply protection to the user edit pages only protected function is_protection_applicable() { global $pagenow; $result = false; $pages_to_block = array('profile.php', 'users.php', 'user-new.php', 'user-edit.php'); if (in_array($pagenow, $pages_to_block)) { $result = true; } return $result; } // end of is_protection_applicable() /** * exclude administrator role from the roles list * * @param string $roles * @return array */ public function exclude_admin_role( $roles ) { if ( $this->is_protection_applicable() && isset( $roles['administrator'] ) ) { unset( $roles['administrator'] ); } return $roles; } // end of exclude_admin_role() /** * Check if user has "Administrator" role assigned * * @global wpdb $wpdb * @param int $user_id * @return boolean returns true is user has Role "Administrator" */ private function has_administrator_role($user_id) { global $wpdb; if (empty($user_id) || !is_numeric($user_id)) { return false; } $meta_key = $wpdb->prefix .'capabilities'; $query = $wpdb->prepare( "SELECT count(*) FROM {$wpdb->usermeta} WHERE user_id=%d AND meta_key=%s AND meta_value LIKE %s", array($user_id, $meta_key, '%"administrator"%') ); $has_admin_role = $wpdb->get_var( $query ); if ($has_admin_role > 0) { $result = true; } else { $result = false; } // cache checking result for the future use $this->user_to_check[$user_id] = $result; return $result; } // end of has_administrator_role() /** * We have two vulnerable queries with user id at admin interface, which should be processed * 1st: http://blogdomain.com/wp-admin/user-edit.php?user_id=ID&wp_http_referer=%2Fwp-admin%2Fusers.php * 2nd: http://blogdomain.com/wp-admin/users.php?action=delete&user=ID&_wpnonce=ab34225a78 * If put Administrator user ID into such request, user with lower capabilities (if he has 'edit_users') * can edit, delete admin record * This function removes 'edit_users' or 'delete_users' or 'remove_users' capability from current user capabilities, * if request sent against a user with 'administrator' role * * @param array $allcaps * @param type $caps * @param string $name * @return array */ public function not_edit_admin($allcaps, $caps, $name) { if (is_array($caps) & count($caps)>0) { // 1st element of this array not always has index 0. Use workaround to extract it. $caps_v = array_values($caps); $cap = $caps_v[0]; } else { $cap = $caps; } $checked_caps = array('edit_users', 'delete_users', 'remove_users'); if (!in_array($cap, $checked_caps)) { return $allcaps; } $user_keys = array('user_id', 'user'); foreach ($user_keys as $user_key) { $access_deny = false; $user_id = (int) $this->lib->get_request_var($user_key, 'get', 'int'); if (empty($user_id)) { // check the next key continue; } if ($user_id == 1) { // built-in WordPress Admin $access_deny = true; } else { if (!isset($this->user_to_check[$user_id])) { // check if user_id has Administrator role $access_deny = $this->has_administrator_role($user_id); } else { // user_id was checked already, get result from cash $access_deny = $this->user_to_check[$user_id]; } } if ($access_deny && isset($allcaps[$cap])) { unset($allcaps[$cap]); } break; } return $allcaps; } // end of not_edit_admin() /** * add where criteria to exclude users with 'Administrator' role from users list * * @global wpdb $wpdb * @param type $user_query */ public function exclude_administrators($user_query) { global $wpdb; if (!$this->is_protection_applicable()) { // block the user edit stuff only return; } // get user_id of users with 'Administrator' role $current_user_id = get_current_user_id(); $meta_key = $wpdb->prefix . 'capabilities'; $query = $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE user_id!=%d AND meta_key=%s AND meta_value like %s", array($current_user_id, $meta_key, '%"administrator"%')); $ids_arr = $wpdb->get_col( $query ); if (is_array($ids_arr) && count($ids_arr) > 0) { $ids = implode(',', $ids_arr); $user_query->query_where .= " AND ( $wpdb->users.ID NOT IN ( $ids ) )"; } } // end of exclude_administrators() private function extract_view_quantity($text) { $match = array(); $result = preg_match('#\((.*?)\)#', $text, $match); if ($result) { $quantity = $match[1]; } else { $quantity = 0; } return $quantity; } // end of extract_view_quantity() private function extract_int($str_val) { $str_val1 = str_replace(',', '', $str_val); // remove ',' from numbers like '2,015' $int_val = (int) preg_replace('/[^\-\d]*(\-?\d*).*/','$1', $str_val1); // extract numeric value strings like from '2015 bla-bla' return $int_val; } // end of extract_int() /* * Exclude view of users with Administrator role * */ public function exclude_admins_view($views) { if (!isset($views['administrator'])) { return $views; } if (isset($views['all'])) { // Decrease quant of all users for a quant of hidden admins $admins_orig_s = $this->extract_view_quantity($views['administrator']); $admins_int = $this->extract_int($admins_orig_s); $all_orig_s = $this->extract_view_quantity($views['all']); $all_orig_int = $this->extract_int($all_orig_s); $all_new_int = $all_orig_int - $admins_int; $all_new_s = number_format_i18n($all_new_int); $views['all'] = str_replace($all_orig_s, $all_new_s, $views['all']); } unset($views['administrator']); return $views; } // end of exclude_admins_view() } // end of URE_Protect_Admin class includes/classes/ajax-processor.php000064400000025657150212007360013473 0ustar00lib = URE_Lib::get_instance(); $this->debug = ( defined('WP_PHP_UNIT_TEST') && WP_PHP_UNIT_TEST==true ); } // end of __construct() protected function get_action() { $action = $this->lib->get_request_var( 'sub_action', 'post' ); if ( empty( $action ) ) { $action = $this->lib->get_request_var( 'sub_action', 'get' ); } return $action; } // end of get_action() protected function get_required_cap() { $promote_users_actions = array( 'grant_roles', 'get_user_roles', 'add_role_to_user', 'revoke_role_from_user' ); if ( in_array( $this->action, $promote_users_actions ) ) { $cap = 'promote_users'; } else { $cap = URE_Own_Capabilities::get_key_capability(); } return $cap; } // end of get_required_cap() protected function valid_nonce() { if ( !isset( $_REQUEST['wp_nonce'] ) || !wp_verify_nonce( $_REQUEST['wp_nonce'], 'user-role-editor' ) ) { echo wp_json_encode( array('result'=>'error', 'message'=>'URE: Wrong or expired request') ); return false; } else { return true; } } // end of check_nonce() protected function user_can() { $capability = $this->get_required_cap(); if ( !current_user_can( $capability ) ) { echo wp_json_encode( array('result'=>'error', 'message'=>'URE: Insufficient permissions') ); return false; } else { return true; } } // end of check_user_cap() protected function add_role() { $editor = URE_Editor::get_instance(); $response = $editor->add_new_role(); $answer = array( 'result'=>$response['result'], 'role_id'=>$response['role_id'], 'role_name'=>$response['role_name'], 'message'=>$response['message'] ); return $answer; } // end of add_role() protected function update_role() { $editor = URE_Editor::get_instance(); $response = $editor->update_role(); $answer = array( 'result'=>$response['result'], 'role_id'=>$response['role_id'], 'role_name'=>$response['role_name'], 'message'=>$response['message'] ); return $answer; } // end of add_role() protected function add_capability() { $response = URE_Capability::add( 'role' ); $editor = URE_Editor::get_instance(); $editor->init1(); $message = $editor->init_current_role_name(); if ( empty( $message ) ) { $view = new URE_View(); $html = $view->_show_capabilities( true, true ); } else { $html = ''; $response['result'] = 'error'; $response['message'] = $message; } $answer = array('result'=>$response['result'], 'html'=>$html, 'message'=>$response['message']); return $answer; } // end of add_capability() protected function delete_capability() { $result = URE_Capability::delete(); if ( is_array( $result ) ) { $notification = $result['message']; $deleted_caps = $result['deleted_caps']; } else { $notification = $result; $deleted_caps = array(); } $answer = array('result'=>'success', 'deleted_caps'=>$deleted_caps, 'message'=>$notification); return $answer; } // end of delete_cap() protected function delete_role() { $editor = URE_Editor::get_instance(); $response = $editor->delete_role(); $answer = array( 'result'=>$response['result'], 'message'=>$response['message'], 'deleted_roles'=> $response['deleted_roles'] ); return $answer; } // end of delete_role() protected function rename_role() { $editor = URE_Editor::get_instance(); $response = $editor->rename_role(); $answer = array( 'result'=>$response['result'], 'message'=>$response['message'], 'role_id'=> $response['role_id'], 'role_name'=>$response['role_name'] ); return $answer; } // end of rename_role() protected function get_caps_to_remove() { $html = URE_Role_View::caps_to_remove_html(); $answer = array('result'=>'success', 'html'=>$html, 'message'=>'success'); return $answer; } // end of get_caps_to_remove() protected function get_users_without_role() { $new_role = $this->lib->get_request_var( 'new_role', 'post' ); if ( empty( $new_role ) ) { $answer = array('result'=>'error', 'message'=>'Provide new role'); return $answer; } $assign_role = $this->lib->get_assign_role(); if ( $new_role==='no_rights') { $assign_role->create_no_rights_role(); } $wp_roles = wp_roles(); if ( !isset( $wp_roles->roles[$new_role] ) ) { $answer = array('result'=>'error', 'message'=>'Selected new role does not exist'); return $answer; } $users = $assign_role->get_users_without_role(); $answer = array( 'result'=>'success', 'users'=>$users, 'new_role'=>$new_role, 'message'=>'success' ); return $answer; } // end of get_users_without_role() protected function grant_roles() { $answer = URE_Grant_Roles::grant_roles(); return $answer; } // end of grant_roles() protected function add_role_to_user() { $answer = URE_Grant_Roles::add_role(); return $answer; } // end of add_role_to_user() protected function revoke_role_from_user() { $answer = URE_Grant_Roles::revoke_role(); return $answer; } // end of add_role_to_user() protected function get_user_roles() { $answer = URE_Grant_Roles::get_user_roles(); return $answer; } // end of get_user_roles() protected function get_role_caps() { $role = $this->lib->get_request_var('role', 'post' ); if ( empty( $role ) ) { $answer = array('result'=>'error', 'message'=>'Provide role ID'); return $answer; } $wp_roles = wp_roles(); if ( !isset( $wp_roles->roles[$role] ) ) { $answer = array('result'=>'error', 'message'=>'Requested role does not exist'); return $answer; } $active_items = URE_Role_Additional_Options::get_active_items(); if ( isset( $active_items[$role] ) ) { $role_options = $active_items[$role]; } else { $role_options = array(); } $caps = array(); foreach( $wp_roles->roles[$role]['capabilities'] as $cap_id=>$allowed ) { $cap = URE_Capability::escape( $cap_id ); $caps[$cap] = $allowed; } $answer = array( 'result'=>'success', 'message'=>'Role capabilities retrieved successfully', 'role_id'=>$role, 'role_name'=>$wp_roles->roles[$role]['name'], 'caps'=>$caps, 'options'=>$role_options ); return $answer; } // end of get_role_caps() protected function hide_pro_banner() { $this->lib->put_option('ure_hide_pro_banner', 1); $this->lib->flush_options(); $answer = array( 'result'=>'success', 'message'=>'Pro banner was hidden' ); return $answer; } // end of hide_pro_banner() protected function _dispatch() { switch ( $this->action ) { case 'update_role': $answer = $this->update_role(); break; case 'add_role': $answer = $this->add_role(); break; case 'add_capability': $answer = $this->add_capability(); break; case 'delete_capability': $answer = $this->delete_capability(); break; case 'delete_role': $answer = $this->delete_role(); break; case 'get_caps_to_remove': $answer = $this->get_caps_to_remove(); break; case 'get_users_without_role': $answer = $this->get_users_without_role(); break; case 'grant_roles': $answer = $this->grant_roles(); break; case 'add_role_to_user': $answer = $this->add_role_to_user(); break; case 'revoke_role_from_user': $answer = $this->revoke_role_from_user(); break; case 'get_user_roles': $answer = $this->get_user_roles(); break; case 'get_role_caps': $answer = $this->get_role_caps(); break; case 'rename_role': $answer = $this->rename_role(); break; case 'hide_pro_banner': $answer = $this->hide_pro_banner(); break; default: $answer = array('result' => 'error', 'message' => 'Unknown action "' . $this->action . '"'); } return $answer; } // end of _dispatch() /** * AJAX requests dispatcher */ public function dispatch() { $this->action = $this->get_action(); if ( !$this->valid_nonce() || !$this->user_can() ) { die; } $answer = $this->_dispatch(); $json_answer = wp_json_encode($answer); echo $json_answer; die; } // end of dispatch() } // end of URE_Ajax_Processor includes/classes/capabilities.php000064400000036132150212007360013152 0ustar00 * @copyright Copyright (c) 2010 - 2021, Vladimir Garagulia **/ class URE_Capabilities { private static $instance = null; private $lib = null; private $built_in_wp_caps = null; public static function get_instance() { if ( self::$instance === null ) { // new static() will work too self::$instance = new URE_Capabilities(); } return self::$instance; } // end of get_instance() private function __construct() { $this->lib = URE_Lib::get_instance(); $this->built_in_wp_caps = $this->lib->get_built_in_wp_caps(); } // end of __construct() protected function convert_cap_to_readable( $cap_name ) { $cap_name = str_replace('_', ' ', $cap_name); $cap_name = ucfirst($cap_name); return $cap_name; } // convert_cap_to_readable protected function add_capability_to_full_caps_list( $cap_id, &$full_list ) { if ( isset( $full_list[$cap_id] ) ) { // if capability was added already return; } $cap = array(); $cap['inner'] = $cap_id; $cap['human'] = $this->convert_cap_to_readable( $cap_id ); if ( isset( $this->built_in_wp_caps[$cap_id] ) ) { $cap['wp_core'] = true; } else { $cap['wp_core'] = false; } $full_list[$cap_id] = $cap; } // end of add_capability_to_full_caps_list() /** * Add capabilities from user roles save at WordPress database * */ protected function add_roles_caps( &$full_list ) { $roles = $this->lib->get_user_roles(); foreach ( $roles as $role ) { // validate if capabilities is an array if ( !isset( $role['capabilities'] ) || !is_array( $role['capabilities'] ) ) { continue; } foreach ( array_keys( $role['capabilities'] ) as $cap ) { $this->add_capability_to_full_caps_list( $cap, $full_list ); } } } // end of add_roles_caps() /** * Add Gravity Forms plugin capabilities, if available * */ protected function add_gravity_forms_caps( &$full_list ) { if ( !class_exists( 'GFCommon' ) ) { return; } $gf_caps = GFCommon::all_caps(); foreach ( $gf_caps as $gf_cap ) { $this->add_capability_to_full_caps_list( $gf_cap, $full_list ); } } // end of add_gravity_forms_caps() /** * Add bbPress plugin user capabilities (if available) */ protected function add_bbpress_caps( &$full_list ) { $bbpress = $this->lib->get_bbpress(); if ( !$bbpress->is_active() ) { return; } $caps = $bbpress->get_caps(); foreach ( $caps as $cap ) { $this->add_capability_to_full_caps_list( $cap, $full_list ); } } // end of add_bbpress_caps() /** * Provide compatibility with plugins and themes which define their custom user capabilities using * 'members_get_capabilities' filter from Justin Tadlock Members plugin * https://wordpress.org/plugins/members/ * */ protected function add_members_caps( &$full_list ) { $custom_caps = array(); $custom_caps = apply_filters( 'members_get_capabilities', $custom_caps ); foreach ( $custom_caps as $cap ) { $this->add_capability_to_full_caps_list( $cap, $full_list ); } } // end of add_members_caps() /** * Add capabilities assigned directly to user, and not included into any role * */ protected function add_user_caps( &$full_list ) { $editor = URE_Editor::get_instance(); $user = $editor->get('user_to_edit'); $roles = $editor->get('roles'); foreach( array_keys( $user->caps ) as $cap ) { if ( !isset( $roles[$cap] ) ) { // it is the user capability, not role $this->add_capability_to_full_caps_list( $cap, $full_list ); } } } // end of add_user_caps() /** * Add built-in WordPress caps in case some of them were not included to the roles for some reason * */ protected function add_wordpress_caps( &$full_list ) { foreach ( array_keys( $this->built_in_wp_caps ) as $cap ) { $this->add_capability_to_full_caps_list( $cap, $full_list ); } } // end of add_wordpress_caps() protected function add_create_cap_to_admin( $post_type_name ) { global $wp_roles; $post_type = get_post_type_object( $post_type_name ); if ( $post_type->cap->create_posts!=='edit_'. $post_type->name .'s' ) { // 'create' capability is active if ( !isset( $wp_roles->role_objects['administrator']->capabilities[$post_type->cap->create_posts] ) ) { $wp_roles->role_objects['administrator']->add_cap( $post_type->cap->create_posts, true ); } } } // end of add_create_caps_to_admin() public static function add_cap_to_roles( $roles, $cap ) { if ( !is_array( $roles ) || count( $roles )==0 ) { return; } $wp_roles = wp_roles(); foreach( $roles as $role ) { if ( isset( $wp_roles->role_objects[$role] ) && !isset( $wp_roles->role_objects[$role]->capabilities[$cap] ) ) { $wp_roles->role_objects[$role]->add_cap( $cap, true ); } } } // end of add_cap_to_roles() protected function add_custom_post_type_caps( &$full_list ) { $multisite = $this->lib->get( 'multisite' ); // admin should be capable to edit any posts $cpt_editor_roles0 = !$multisite ? array('administrator') : array(); $capabilities = $this->lib->get_edit_post_capabilities(); $post_types = get_post_types( array(), 'objects' ); $_post_types = $this->lib->_get_post_types(); // do not forget attachment post type as it may use the own capabilities set $attachment_post_type = get_post_type_object( 'attachment' ); if ( $attachment_post_type->cap->edit_posts!=='edit_posts' ) { $post_types['attachment'] = $attachment_post_type; } foreach( $post_types as $post_type ) { if ( !isset( $_post_types[$post_type->name] ) ) { continue; } if ( !isset($post_type->cap) ) { continue; } $cpt_editor_roles = apply_filters( 'ure_cpt_editor_roles', $cpt_editor_roles0, $post_type->name ); foreach( $capabilities as $capability ) { if ( !isset( $post_type->cap->$capability ) ) { continue; } $cap_to_check = $post_type->cap->$capability; $this->add_capability_to_full_caps_list( $cap_to_check, $full_list ); self::add_cap_to_roles( $cpt_editor_roles, $cap_to_check ); } } $wp_roles = wp_roles(); if ( !$multisite && isset( $wp_roles->role_objects['administrator'] ) ) { // admin should be capable to create posts and pages foreach( array( 'post', 'page' ) as $post_type_name ) { $this->add_create_cap_to_admin( $post_type_name ); } } } // end of add_custom_post_type_caps() protected function add_custom_taxonomies_caps( &$full_list ) { $taxonomies = $this->lib->get_custom_taxonomies( 'objects' ); if ( empty( $taxonomies ) ) { return; } $multisite = $this->lib->get( 'multisite' ); // admin should be capable to edit any taxonomy $cpt_editor_roles0 = !$multisite ? array('administrator') : array(); $caps_to_check = array('manage_terms', 'edit_terms', 'delete_terms', 'assign_terms'); foreach( $taxonomies as $taxonomy ) { $cpt_editor_roles = apply_filters( 'ure_cpt_editor_roles', $cpt_editor_roles0, $taxonomy->name ); foreach( $caps_to_check as $capability ) { $cap_to_check = $taxonomy->cap->$capability; $this->add_capability_to_full_caps_list( $cap_to_check, $full_list ); self::add_cap_to_roles( $cpt_editor_roles, $cap_to_check ); } } } // end of add_custom_taxonomies_caps() /** * Add capabilities for URE permissions system in case some were excluded from Administrator role * */ protected function add_ure_caps( &$full_list ) { $key_cap = URE_Own_Capabilities::get_key_capability(); if ( !current_user_can( $key_cap ) ) { return; } $ure_caps = URE_Own_Capabilities::get_caps(); foreach(array_keys($ure_caps) as $cap) { $this->add_capability_to_full_caps_list( $cap, $full_list ); } } // end of add_ure_caps() // Under the single site WordPress installation administrator role should have all existing capabilities included protected function grant_all_caps_to_admin( $full_list ) { $multisite = $this->lib->get( 'multisite' ); if ( $multisite ) { // There is a superadmin user under WP multisite, so single site administrator role may do not have full list of capabilities. return; } $wp_roles = wp_roles(); if ( !isset( $wp_roles->role_objects['administrator'] ) ) { return; } // Use this filter as the last chance to stop this $grant = apply_filters('ure_grant_all_caps_to_admin', true ); if ( empty( $grant) ) { return; } $admin_role = $wp_roles->role_objects['administrator']; $updated = false; foreach( $full_list as $capability ) { $cap = $capability['inner']; if ( !$admin_role->has_cap( $cap ) ) { $admin_role->add_cap( $cap ); $updated = true; } } if ( $updated ) { // Flush the changes to the database $use_db = $wp_roles->use_db; $wp_roles->use_db = true; $admin_role->add_cap('read'); // administrator always should can 'read' $wp_roles->use_db = $use_db; } } // end of grant_all_caps_to_admin() public function init_full_list( $ure_object ) { $full_list = array(); $this->add_roles_caps( $full_list ); $this->add_gravity_forms_caps( $full_list ); $this->add_bbpress_caps( $full_list ); $this->add_members_caps( $full_list ); if ($ure_object=='user') { $this->add_user_caps( $full_list ); } $this->add_wordpress_caps( $full_list ); $this->add_custom_post_type_caps( $full_list ); $this->add_custom_taxonomies_caps( $full_list ); $this->add_ure_caps( $full_list ); asort( $full_list ); $full_list = apply_filters('ure_full_capabilites', $full_list ); $this->grant_all_caps_to_admin( $full_list ); return $full_list; } // end of init_full_list(); /** * Build full capabilities list from all roles */ private function get_full_caps_list_from_roles() { $wp_roles = wp_roles(); // build full capabilities list from all roles $full_caps_list = array(); foreach ( $wp_roles->roles as $role ) { // validate if capabilities is an array if ( isset( $role['capabilities'] ) && is_array( $role['capabilities'] ) ) { foreach ( $role['capabilities'] as $capability => $value ) { if ( !isset( $full_caps_list[$capability] ) ) { $full_caps_list[$capability] = true; } } } } return $full_caps_list; } // end of get_full_caps_list_from_roles() /** * Returns array of WPBakery Visual Composer plugin capabilities * extracted by 'vc_access_rules_' prefix */ protected function get_visual_composer_caps($full_caps_list) { $caps = array(); foreach( array_keys( $full_caps_list ) as $cap ) { if ( strpos( $cap, 'vc_access_rules_')!==false ) { $caps[$cap] = 1; } } return $caps; } // end of get_visual_composer_caps() /** * return the array of unused user capabilities * * @global WP_Roles $wp_roles * @return array */ public function get_caps_to_remove() { $wp_roles = wp_roles(); $full_caps_list = $this->get_full_caps_list_from_roles(); $caps_to_exclude = $this->built_in_wp_caps; $ure_caps = URE_Own_Capabilities::get_caps(); $visual_composer_caps = $this->get_visual_composer_caps($full_caps_list); $caps_to_exclude = ure_array_merge($caps_to_exclude, $ure_caps, $visual_composer_caps); $caps_to_remove = array(); $caps = array_keys( $full_caps_list ); foreach ( $caps as $cap ) { if ( isset( $caps_to_exclude[$cap] ) ) { // do not touch built-in WP caps, URE own caps and Visual Composer caps continue; } // check roles $cap_in_use = false; foreach ( $wp_roles->role_objects as $wp_role ) { if ( $wp_role->name === 'administrator' ) { continue; } if ( $wp_role->has_cap( $cap ) ) { $cap_in_use = true; break; } } if ( !$cap_in_use ) { $caps_to_remove[$cap] = 1; } } // foreach(...) return $caps_to_remove; } // end of get_caps_to_remove() /** * Prevent cloning of the instance of the *Singleton* instance. * * @return void */ public function __clone() { throw new \Exception('Do not clone a singleton instance.'); } // end of __clone() /** * Prevent unserializing of the *Singleton* instance. * * @return void */ public function __wakeup() { throw new \Exception('Do not unserialize a singleton instance.'); } // end of __wakeup() } // end of URE_Capabilities class includes/classes/capability.php000064400000020215150212007360012635 0ustar00 * @copyright Copyright (c) 2010 - 2021, Vladimir Garagulya **/ class URE_Capability { public static function escape( $cap_id ) { $search = array(' ', '/', '|', '{', '}', '$'); $replace = array('_', '_', '_', '_', '_', '_'); $cap_id_esc = str_replace( $search, $replace, $cap_id ); return $cap_id_esc; } // end escape() // Sanitize user input for security // do not allow to use internally used capabilities public static function validate( $cap_id_raw ) { $match = array(); $found = preg_match('/[A-Za-z0-9_\-]*/', $cap_id_raw, $match ); if ( !$found || ($found && ( $match[0]!=$cap_id_raw ) ) ) { // some non-alphanumeric charactes found! $data = array( 'result'=>false, 'message'=>esc_html__('Error: Capability name must contain latin characters and digits only!', 'user-role-editor'), 'cap_id'=>'' ); return $data; } $cap_id = strtolower( $match[0] ); if ( $cap_id=='do_not_allow' ) { $data = array( 'result'=>false, 'message'=>esc_html__('Error: this capability is used internally by WordPress', 'user-role-editor'), 'cap_id'=>'do_not_allow' ); return $data; } if ( $cap_id=='administrator' ) { $data = array( 'result'=>false, 'message'=>esc_html__('Error: this word is used by WordPress as a role ID', 'user-role-editor'), 'cap_id'=>'administrator' ); return $data; } $data = array( 'result'=>true, 'message'=>'Success', 'cap_id'=>$cap_id ); return $data; } // end of validate() /** * Add new user capability * * @global WP_Roles $wp_roles * @return string */ public static function add( $ure_object ) { global $wp_roles; $response = array( 'result'=>'error', 'capability_id'=>'', 'html'=>'', 'message'=>'' ); if ( !current_user_can( 'ure_create_capabilities' ) ) { $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor', 'user-role-editor' ); return $response; } $mess = ''; if ( !isset( $_POST['capability_id'] ) || empty( $_POST['capability_id'] ) ) { $response['message'] = esc_html__( 'Wrong Request', 'user-role-editor' ); return $response; } $data = self::validate( $_POST['capability_id'] ); if ( !$data['result'] ) { $response['message'] = $data['message']; return $response; } $cap_id = $data['cap_id']; $lib = URE_Lib::get_instance(); $full_capabilities = $lib->init_full_capabilities( $ure_object ); if ( !isset( $full_capabilities[$cap_id] ) ) { $admin_role = $lib->get_admin_role(); $use_db = $wp_roles->use_db; $wp_roles->use_db = true; $wp_roles->add_cap( $admin_role, $cap_id ); $wp_roles->use_db = $use_db; $response['result'] = 'success'; // translators: placeholder %s is replaced by added user capability id string value $response['message'] = sprintf( esc_html__( 'Capability %s was added successfully', 'user-role-editor' ), $cap_id ); } else { // translators: placeholder %s is replaced by existed user capability id string value $response['message'] = sprintf( esc_html__( 'Capability %s exists already', 'user-role-editor' ), $cap_id ); } return $response; } // end of add() /** * Extract capabilities selected for deletion from the $_POST global * * @return array */ private static function get_caps_for_deletion_from_post( $caps_allowed_to_remove ) { if ( isset( $_POST['values'] ) ) { $input_buff = $_POST['values']; } else { $input_buff = $_POST; } $caps = array(); foreach( $input_buff as $key=>$value ) { if ( substr( $key, 0, 3 )!=='rm_' ) { continue; } if ( !isset( $caps_allowed_to_remove[$value]) ) { continue; } $caps[] = $value; } return $caps; } // end of get_caps_for_deletion_from_post() private static function revoke_caps_from_user( $user_id, $caps ) { $user = get_user_to_edit( $user_id ); foreach( $caps as $cap_id ) { if ( !isset( $user->caps[$cap_id] ) ) { continue; } // Prevent sudden revoke role 'administrator' from a user during 'administrator' capability deletion. if ( $cap_id=='administrator') { continue; } $user->remove_cap( $cap_id ); } } // end of revoke_caps_from_user() private static function revoke_caps_from_role( $wp_role, $caps ) { foreach( $caps as $cap_id ) { if ( $wp_role->has_cap( $cap_id ) ) { $wp_role->remove_cap( $cap_id ); } } } // end of revoke_caps_from_role() private static function revoke_caps( $caps ) { global $wpdb, $wp_roles; // remove caps from users $users_ids = $wpdb->get_col("SELECT $wpdb->users.ID FROM $wpdb->users"); foreach ( $users_ids as $user_id ) { self::revoke_caps_from_user( $user_id, $caps ); } // remove caps from roles foreach ( $wp_roles->role_objects as $wp_role ) { self::revoke_caps_from_role( $wp_role, $caps ); } } // end of revoke_caps() /** * Delete capability * * @global WP_Roles $wp_roles * @return string - information message */ public static function delete() { if ( !current_user_can( 'ure_delete_capabilities' ) ) { return esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); } $capabilities = URE_Capabilities::get_instance(); $mess = ''; $caps_allowed_to_remove = $capabilities->get_caps_to_remove(); if ( !is_array( $caps_allowed_to_remove ) || count( $caps_allowed_to_remove )==0 ) { return esc_html__( 'There are no capabilities available for deletion!', 'user-role-editor' ); } $caps = self::get_caps_for_deletion_from_post( $caps_allowed_to_remove ); if ( empty( $caps ) ) { return esc_html__( 'There are no capabilities available for deletion!', 'user-role-editor' ); } self::revoke_caps( $caps ); if ( count( $caps )==1 ) { // translators: placeholder %s is replaced by removed user capability id string value $mess = sprintf( esc_html__( 'Capability %s was removed successfully', 'user-role-editor' ), $caps[0] ); } else { $lib = URE_Lib::get_instance(); $short_list_str = $lib->get_short_list_str( $caps ); $mess = count( $caps ) .' '. esc_html__( 'capabilities were removed successfully', 'user-role-editor' ) .': '. $short_list_str; } // Escape every capability ID to remove from the HTML markup related div by ID $esc_caps = array(); foreach( $caps as $key=>$cap ) { $esc_caps[$key] = self::escape( $cap ); } return array('message'=>$mess, 'deleted_caps'=>$esc_caps); } // end of delete() } // end of class URE_Capability includes/classes/user-other-roles.php000064400000033204150212007360013735 0ustar00lib = URE_Lib::get_instance(); $this->set_hooks(); } // end of $lib public function set_hooks() { add_filter( 'additional_capabilities_display', array($this, 'additional_capabilities_display'), 10, 1); add_action( 'admin_print_styles-user-edit.php', array($this, 'load_css') ); add_action( 'admin_print_styles-user-new.php', array($this, 'load_css') ); add_action( 'admin_enqueue_scripts', array($this, 'load_js' ) ); add_action( 'edit_user_profile', array($this, 'edit_user_profile_html'), 10, 1 ); add_action( 'user_new_form', array($this, 'user_new_form'), 10, 1 ); add_action( 'profile_update', array($this, 'update'), 10 ); $multisite = $this->lib->get('multisite'); if ($multisite) { add_action( 'wpmu_activate_user', array($this, 'add_other_roles'), 10, 1 ); add_action( 'added_existing_user', array($this, 'add_other_roles'), 10, 1); } add_action( 'user_register', array($this, 'add_other_roles'), 10, 1 ); } // end of set_hooks() public function additional_capabilities_display( $display ) { $show = apply_filters('ure_show_additional_capabilities_section', true); if ( empty( $show ) ) { return $display; } if ( !current_user_can('promote_users') ) { return $display; // No permissions to promote users } $display = false; return $display; } // end of additional_capabilities_display() /* * Load CSS for the user profile edit page */ public function load_css() { $show = apply_filters('ure_show_additional_capabilities_section', true ); if ( empty( $show ) ) { return; } if ( !current_user_can('promote_users') ) { return; // No permissions to promote users } if ( defined('WP_DEBUG') && !empty( WP_DEBUG ) ) { $file_name = 'multiple-select.css'; } else { $file_name = 'multiple-select.min.css'; } wp_enqueue_style('wp-jquery-ui-dialog'); wp_enqueue_style('ure-jquery-multiple-select', plugins_url('/css/'. $file_name, URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, 'screen'); } // end of load_css() public function load_js($hook_suffix) { global $wp_version; if ( !in_array( $hook_suffix, array('user-edit.php', 'user-new.php') ) ) { return; } $show = apply_filters('ure_show_additional_capabilities_section', true ); if ( empty( $show ) ) { return; } if ( !current_user_can('promote_users') ) { return; // No permissions to promote users } if ( defined('WP_DEBUG') && !empty( WP_DEBUG ) ) { $ms_file_name = 'multiple-select.js'; } else { $ms_file_name = 'multiple-select.min.js'; } $select_primary_role = apply_filters('ure_users_select_primary_role', true); wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery-ui-button', 'jquery'), $wp_version, true ); wp_register_script('ure-jquery-multiple-select', plugins_url('/js/'. $ms_file_name, URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); wp_enqueue_script('ure-jquery-multiple-select'); wp_register_script('ure-user-profile-other-roles', plugins_url('/js/user-profile-other-roles.js', URE_PLUGIN_FULL_PATH ), array(), URE_VERSION, true ); wp_enqueue_script('ure-user-profile-other-roles'); wp_localize_script('ure-user-profile-other-roles', 'ure_data_user_profile_other_roles', array( 'wp_nonce' => wp_create_nonce('user-role-editor'), 'other_roles' => esc_html__('Other Roles', 'user-role-editor'), 'select_roles' => esc_html__('Select additional roles for this user', 'user-role-editor'), 'select_primary_role' => ($select_primary_role || $this->lib->is_super_admin()) ? 1: 0 )); } // end of load_js() /** * Returns list of user roles, except 1st one, and bbPress assigned as they are shown by WordPress and bbPress themselves. * * @param type $user WP_User from wp-includes/capabilities.php * @return array */ public function get_roles_array( $user ) { if ( !is_array( $user->roles ) || count( $user->roles )<=1 ) { return array(); } // get bbPress assigned user role if ( function_exists( 'bbp_filter_blog_editable_roles' ) ) { $bb_press_role = bbp_get_user_role( $user->ID ); } else { $bb_press_role = ''; } $roles = array(); foreach ( $user->roles as $role) { if (!empty($bb_press_role) && $bb_press_role === $role) { // exclude bbPress assigned role continue; } $roles[] = $role; } array_shift( $roles ); // exclude primary role which is shown by WordPress itself return $roles; } // end of get_roles_array() private function roles_select_html($user, $context) { global $wp_roles; $user_roles = $user->roles; $primary_role = array_shift($user_roles); $roles = apply_filters('editable_roles', $wp_roles->roles); // exclude restricted roles if any $roles = array_reverse( $roles ); if (isset($roles[$primary_role])) { // exclude role assigned to the user as a primary role unset($roles[$primary_role]); } $button_number = (self::$counter>0) ? '_2': ''; echo '
'."\n"; if ($context=='add-new-user' || $context=='add-existing-user') { // Get other default roles $other_roles = $this->lib->get_option('other_default_roles', array()); } else { $other_roles = $this->get_roles_array($user); } if (is_array($other_roles) && count($other_roles) > 0) { $other_roles_str = implode(',', $other_roles); } else { $other_roles_str = ''; } echo ''; $output = $this->lib->roles_text($other_roles); echo ''. $output .''; self::$counter++; } // end of roles_select() /** * Returns comma separated string of capabilities directly (not through the roles) assigned to the user * * @global WP_Roles $wp_roles * @param object $user * @return string */ private function get_user_caps_str( $user ) { global $wp_roles; $output = ''; foreach ($user->caps as $cap => $value) { if ( $wp_roles->is_role( $cap ) ) { continue; } if ('' !== $output) { $output .= ', '; } // translators: placeholder %s is replaced by denied user capability id string value $output .= $value ? $cap : sprintf(__('Denied: %s', 'user-role-editor'), $cap); } return $output; } // end of get_user_caps_str() private function user_profile_capabilities($user) { $current_user_id = get_current_user_id(); $user_caps = $this->get_user_caps_str( $user ); ?> '; if ($this->lib->user_is_admin( $current_user_id ) ) { echo 'ID}", "ure_user_{$user->ID}") . '">' . esc_html__('Edit', 'user-role-editor') . ''; } ?> user_profile_capabilities($user); } ?>
roles_select_html($user, $context); ?>
is_user_profile_extention_allowed()) { return; } $show = apply_filters('ure_show_additional_capabilities_section', true); if (empty($show)) { return; } if ( !current_user_can('promote_users') ) { return; // No permissions to promote users } ?>

display($user, 'user-edit'); } // end of edit_user_profile_html() public function user_new_form( $context ) { $show = apply_filters('ure_show_additional_capabilities_section', true); if (empty($show)) { return; } if ( !current_user_can('promote_users') ) { return; // No permissions to promote users } $user = new WP_User(); $this->display( $user, $context ); } // end of user_new_form() /* * Save additional user roles when user profile is updated, as WordPress itself doesn't know about them * Returns different numbers for automatic testing purpose */ public function update( $user_id ) { if ( !current_user_can('promote_users') ) { return -1; // No permissions to promote users } if ( !current_user_can('edit_user', $user_id) ) { return -1; // No permissions to edit this user } if ( !isset( $_POST['ure_other_roles'] ) ) { return 3; // Add default other roles, there is no related data at the POST } if ( empty( $_POST['ure_other_roles'] ) ) { return 1; // There is no need in processing of other roles. User did not select them } $user = get_userdata( $user_id ); $data = explode(',', str_replace(' ', '', $_POST['ure_other_roles'] ) ); $editable_roles = get_editable_roles(); $ure_other_roles = array(); foreach( $data as $role_id ) { if ( empty( $role_id ) ) { continue; } if ( !isset( $editable_roles[ $role_id ] ) ) { return -2; // If the role isn't editable by the current user, stop processing - no permission to assign this role. } if ( is_array( $user->roles ) && !in_array( $role_id, $user->roles ) ) { $ure_other_roles[] = $role_id; } } foreach( $ure_other_roles as $role ) { $user->add_role( $role ); } return 2; } // end of update() public function add_default_other_roles( $user_id ) { if ( empty( $user_id ) ) { return false; } $user = get_user_by('id', $user_id ); if ( empty( $user->ID ) ) { return true; } // Get default roles if any $other_default_roles = $this->lib->get_option('other_default_roles', array() ); if ( count( $other_default_roles ) == 0 ) { return true; } foreach ( $other_default_roles as $role ) { if ( !isset( $user->caps[$role] ) ) { $user->add_role( $role ); } } } // end of add_default_other_roles() public function add_other_roles( $user_id ) { if ( empty( $user_id ) ) { return false; } $result = $this->update( $user_id ); if ( $result==3 ) { // Other roles were not selected manually $this->add_default_other_roles( $user_id ); } } // end of add_other_roles() } // end of URE_User_Other_Roles class includes/classes/tools.php000064400000007427150212007360011666 0ustar00get('multisite'); $link = URE_Settings::get_settings_link(); if (!$multisite || (is_main_site( get_current_blog_id() ) || ( is_network_admin() && $lib->is_super_admin() ) ) ) { if ( current_user_can( 'ure_reset_roles' ) ) { ?>

Reset User Roles

  '; esc_html_e('If any plugins (such as WooCommerce, S2Member and many others) have changed user roles and capabilities during installation, those changes will be LOST!', 'user-role-editor'); echo '
'; esc_html_e('For more information on how to undo undesired changes and restore plugins capabilities in case you lost them by mistake go to: ', 'user-role-editor'); echo 'http://role-editor.com/how-to-restore-deleted-wordpress-user-roles/'; if ( $multisite ) { ?>

()

<-

reset_user_roles() ) { return; } $lib = URE_Lib::get_instance(); $lib->put_option( 'other_default_roles', array(), true ); $lib->show_message( esc_html__('Tools: Reset: User Roles were initialized', 'user-role-editor') ); } // end of reset_roles() public static function show( $tab_idx ) { do_action( 'ure_settings_tools_show', $tab_idx ); // Placed here, after all tools which may be added above, as a very rare needed functionality self::show_reset_roles( $tab_idx ); } // end of show() } // end of URE_Toolsincludes/classes/editor.php000064400000160446150212007360012015 0ustar00 * @copyright Copyright (c) 2010 - 2021, Vladimir Garagulia **/ class URE_Editor { private static $instance = null; protected $lib = null; protected $role_additional_options = null; protected $apply_to_all = 0; protected $capabilities_to_save = null; protected $caps_columns_quant = 1; protected $caps_readable = false; protected $current_role = ''; protected $current_role_name = ''; protected $full_capabilities = false; protected $notification = ''; // notification message to show on page protected $roles = null; protected $show_deprecated_caps = false; protected $ure_object = 'role'; // what to process, 'role' or 'user' protected $user_to_edit = null; protected $wp_default_role = ''; public static function get_instance() { if (self::$instance === null) { // new static() will work too self::$instance = new URE_Editor(); } return self::$instance; } // end of get_instance() private function __construct() { $this->lib = URE_Lib::get_instance(); } // end of __construct() public function get($property_name) { if (!property_exists($this, $property_name)) { syslog(LOG_ERR, 'URE_Editor class does not have such property '. $property_name); return null; } return $this->$property_name; } // end of get_property() public function get_edit_user_caps_mode() { $multisite = $this->lib->get('multisite'); if ($multisite && $this->lib->is_super_admin()) { return 1; } $edit_user_caps = $this->lib->get_option('edit_user_caps', 1); return $edit_user_caps; } // end of get_edit_user_caps_mode() // Validate information about user we intend to edit protected function check_user_to_edit() { if ( $this->ure_object !=='user' ) { return true; } if ( isset( $_REQUEST['user_id'] ) ) { $user_id = filter_var( $_REQUEST['user_id'], FILTER_VALIDATE_INT ); } elseif ( isset( $_POST['values']['user_id'] ) ) { $user_id = filter_var( $_POST['values']['user_id'], FILTER_VALIDATE_INT ); } else { return false; // user_id value is missed } if ( empty( $user_id ) ) { return false; } $this->user_to_edit = get_user_to_edit( $user_id ); if ( empty( $this->user_to_edit ) ) { return false; } return true; } // end of check_user_to_edit() protected function get_caps_columns_quant() { if ( isset( $_POST['caps_columns_quant'] ) && in_array( $_POST['caps_columns_quant'], array(1,2,3) ) ) { $value = (int) filter_var( $_POST['caps_columns_quant'], FILTER_VALIDATE_INT ); set_site_transient( 'ure_caps_columns_quant', $value, URE_Lib::TRANSIENT_EXPIRATION ); } else { $value = get_site_transient( 'ure_caps_columns_quant' ); if ( $value===false ) { $value = $this->lib->get_option( 'caps_columns_quant', 1 ); } } return $value; } // end of get_caps_columns_quant() protected function _init0() { // could be sent as via POST, as via GET if ( isset( $_REQUEST['object'] ) ) { $this->ure_object = $_REQUEST['object']; } elseif ( isset( $_POST['values']['object'] ) ) { // AJAX POST $this->ure_object = $_POST['values']['object']; } else { $this->ure_object = 'role'; } if ( $this->ure_object=='user') { if ( !$this->check_user_to_edit() ) { return false; } } $this->apply_to_all = isset( $_POST['values']['ure_apply_to_all']) ? true : false; if ( empty( $this->apply_to_all ) && isset( $_POST['ure_apply_to_all'] ) ) { $this->apply_to_all = true; } return true; } // end of _init0() protected function init0() { if ( !$this->_init0() ) { return false; } $this->caps_readable = get_site_transient( 'ure_caps_readable' ); if ( false === $this->caps_readable ) { $this->caps_readable = $this->lib->get_option( 'ure_caps_readable' ); set_site_transient( 'ure_caps_readable', $this->caps_readable, URE_Lib::TRANSIENT_EXPIRATION ); } $this->show_deprecated_caps = get_site_transient( 'ure_show_deprecated_caps' ); if ( false === $this->show_deprecated_caps ) { $this->show_deprecated_caps = $this->lib->get_option( 'ure_show_deprecated_caps' ); set_site_transient( 'ure_show_deprecated_caps', $this->show_deprecated_caps, URE_Lib::TRANSIENT_EXPIRATION ); } $this->wp_default_role = get_option( 'default_role' ); $this->caps_columns_quant = $this->get_caps_columns_quant(); return true; } // end of init0() protected function valid_nonce() { if ( empty( $_POST['ure_nonce'] ) || !wp_verify_nonce( $_POST['ure_nonce'], 'user-role-editor' ) ) { echo '

Wrong or older request (invalid nonce value). Action prohibited.

'; return false; } return true; } // end of check_nonce() protected function set_caps_readable() { if ($this->caps_readable) { $this->caps_readable = 0; } else { $this->caps_readable = 1; } set_site_transient( 'ure_caps_readable', $this->caps_readable, URE_Lib::TRANSIENT_EXPIRATION ); } // end of caps_readable() protected function set_show_deprecated_caps() { if ($this->show_deprecated_caps) { $this->show_deprecated_caps = 0; } else { $this->show_deprecated_caps = 1; } set_site_transient( 'ure_show_deprecated_caps', $this->show_deprecated_caps, URE_Lib::TRANSIENT_EXPIRATION ); } // end of set_show_deprecated_caps() private function get_role_id() { if ( isset( $_POST['values']['user_role'] ) ) { $role_id = $_POST['values']['user_role']; } elseif ( isset( $_POST['user_role'] ) ) { $role_id = $_POST['user_role']; } else { $role_id = false; } return $role_id; } // end of get_role_id() public function init_current_role_name() { $role_id = $this->get_role_id(); $this->current_role = ''; $this->current_role_name = ''; if ( empty( $role_id ) ) { $mess = esc_html__('Error: ', 'user-role-editor') . esc_html__('Wrong request!', 'user-role-editor'); } else if ( !isset( $this->roles[$role_id] ) ) { $mess = esc_html__('Error: ', 'user-role-editor') . esc_html__('Role', 'user-role-editor') . ' ' . esc_html( $role_id ) . ' ' . esc_html__('does not exist', 'user-role-editor'); } else { $this->current_role = $role_id; $roles = $this->lib->get_user_roles(); $this->current_role_name = $roles[$this->current_role]['name']; $mess = ''; } return $mess; } // end of init_current_role_name() // Add existing WPBakery Visial Composer () plugin capabilities from this role to the list of capabilities for save with this role update - // Visual Composer capabilities are excluded from a role update as they may store not boolean values. protected function restore_visual_composer_caps() { if ( !isset( $this->roles[$this->current_role] ) || !is_array( $this->roles[$this->current_role]['capabilities'] ) ) { return false; } foreach($this->roles[$this->current_role]['capabilities'] as $cap=>$value) { if (strpos($cap, 'vc_access_rules_')!==false) { $this->capabilities_to_save[$cap] = $value; } } return true; } // end of restore_visual_composer_caps() /** * prepare capabilities from user input to save at the database */ protected function prepare_capabilities_to_save() { $this->capabilities_to_save = array(); if (empty($this->full_capabilities)) { return; // There is no valid initialization } foreach ( $this->full_capabilities as $cap ) { $cap_id_esc = URE_Capability::escape( $cap['inner'] ); if ( isset( $_POST['values'][$cap_id_esc] ) || isset( $_POST[$cap_id_esc] ) ) { $this->capabilities_to_save[ $cap['inner'] ] = true; } } $this->restore_visual_composer_caps(); } // end of prepare_capabilities_to_save() /** * Make full synchronization of roles for all sites with roles from the main site directly updating database records * * @return boolean */ protected function is_full_network_synch() { /* is_network_admin() returns wrong result for the AJAX calls from the network admin * so have to use this way */ $network_admin = $this->lib->get_request_var('network_admin', 'post', 'int'); if ( $network_admin==1 ) { // for Pro version only $result = true; } else { $result = defined('URE_MULTISITE_DIRECT_UPDATE') && URE_MULTISITE_DIRECT_UPDATE == 1; } return $result; } // end of is_full_network_synch() protected function last_check_before_update() { if ( empty($this->roles ) || !is_array( $this->roles ) || count( $this->roles )===0 ) { // Nothing to save - something goes wrong - stop execution... return false; } $key_capability = URE_Own_Capabilities::get_key_capability(); if ( current_user_can( $key_capability ) ) { // current user is an URE admin return true; } if ( !current_user_can( 'ure_edit_roles' ) ) { // Not enough permissions return false; } $current_user = wp_get_current_user(); if ( in_array( $this->current_role, $current_user->roles ) ) { // Do not allow to non-admin user without full access to URE update his own role return false; } return true; } // end of last_check_before_update() /** * Return true if $capability is included to the list of capabilities allowed for the single site administrator * @param string $capability - capability ID * @param boolean $ignore_super_admin - if * @return boolean */ public function block_cap_for_single_admin($capability, $ignore_super_admin=false) { if (!$this->lib->is_pro()) { // this functionality is for the Pro version only. return false; } $multisite = $this->lib->get('multisite'); if ( !$multisite ) { // work for multisite only return false; } if ( !$ignore_super_admin && $this->lib->is_super_admin() ) { // Do not block superadmin return false; } $caps_access_restrict_for_simple_admin = $this->lib->get_option( 'caps_access_restrict_for_simple_admin', 0 ); if ( !$caps_access_restrict_for_simple_admin ) { return false; } $allowed_caps = $this->lib->get_option( 'caps_allowed_for_single_admin', array() ); if (in_array( $capability, $allowed_caps ) ) { $block_this_cap = false; } else { $block_this_cap = true; } return $block_this_cap; } // end of block_cap_for_single_admin() /** * Returns array without capabilities blocked for single site administrators * @param array $capabilities * @return array */ protected function remove_caps_not_allowed_for_single_admin( $capabilities ) { if (!$this->lib->is_pro()) { // this functionality is for the Pro version only. return $capabilities; } foreach( array_keys( $capabilities ) as $cap ) { if ( $this->block_cap_for_single_admin( $cap ) ) { unset( $capabilities[$cap] ); } } return $capabilities; } // end of remove_caps_not_allowed_for_single_admin() protected function role_contains_caps_not_allowed_for_simple_admin( $role_id ) { $result = false; if (!$this->lib->is_pro()) { // this functionality is for the Pro version only. return $result; } if ( !isset( $this->roles[$role_id]) ) { return false; } $role = $this->roles[$role_id]; if ( !is_array( $role['capabilities'] ) ) { return false; } foreach ( array_keys( $role['capabilities'] ) as $cap ) { if ( $this->block_cap_for_single_admin( $cap ) ) { $result = true; break; } } return $result; } // end of role_contains_caps_not_allowed_for_simple_admin() // Save Roles to database protected function save_roles() { global $wpdb; if ( !$this->last_check_before_update() ) { return false; } if ( !isset($this->roles[$this->current_role]) ) { return false; } $this->capabilities_to_save = $this->remove_caps_not_allowed_for_single_admin( $this->capabilities_to_save ); $this->roles[$this->current_role]['name'] = $this->current_role_name; $this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save; $option_name = $wpdb->prefix . 'user_roles'; update_option($option_name, $this->roles); // save additional options for the current role if (empty($this->role_additional_options)) { $this->role_additional_options = URE_Role_Additional_Options::get_instance($this->lib); } $this->role_additional_options->save($this->current_role); return true; } // end of save_roles() protected function leave_roles_for_blog( $blog_id, $leave_roles ) { global $wpdb; $prefix = $wpdb->get_blog_prefix( $blog_id ); $options_table_name = $prefix . 'options'; $option_name = $prefix . 'user_roles'; $query = "SELECT option_value FROM {$options_table_name} WHERE option_name='$option_name' LIMIT 1"; $value = $wpdb->get_var( $query ); if ( empty( $value ) ) { return $this->roles; } $blog_roles = unserialize( $value ); $roles = $this->roles; foreach( $leave_roles as $role_id ) { $roles[$role_id] = $blog_roles[$role_id]; } $serialized_roles = serialize( $roles ); return $serialized_roles; } // end of leave_roles_for_blog() /** * Update roles for all network using direct database access - quicker in several times * Execution speed is critical for large multi-site networks. * @global wpdb $wpdb * @return boolean */ protected function direct_network_roles_update() { global $wpdb; $multisite = $this->lib->get( 'multisite' ); if (!$multisite) { return false; } if ( !$this->last_check_before_update() ) { return false; } if ( !empty( $this->current_role ) ) { $this->roles[$this->current_role]['name'] = $this->current_role_name; $this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save; } $serialized_roles = serialize( $this->roles ); $blog_ids = $this->lib->get_blog_ids(); /* * Roles to leave unchanged during network update which overwrites all roles by default * $leave_roles = array( blog_id => array('role_id1', 'role_id2', ... ); */ $leave_roles = apply_filters('ure_network_update_leave_roles', array(), 10, 1 ); if ( empty( $leave_roles ) || !is_array( $leave_roles ) ) { $leave_roles = array(); } foreach ( $blog_ids as $blog_id ) { $prefix = $wpdb->get_blog_prefix( $blog_id ); $options_table_name = $prefix . 'options'; $option_name = $prefix . 'user_roles'; if ( !isset( $leave_roles[$blog_id] ) ) { // overwrites all roles $roles = $serialized_roles; } else { // overwrite except roles you have to leave untouched for this blog $roles = $this->leave_roles_for_blog( $blog_id, $leave_roles[$blog_id] ); } $query = "UPDATE {$options_table_name} SET option_value='$roles' WHERE option_name='$option_name' LIMIT 1"; $wpdb->query( $query ); if ( $wpdb->last_error ) { return false; } // @TODO: save role additional options } do_action( 'ure_direct_network_roles_update' ); return true; } // end of direct_network_roles_update() protected function wp_api_network_roles_update() { global $wpdb; $old_blog = $wpdb->blogid; $blog_ids = $this->lib->get_blog_ids(); if (empty( $blog_ids ) ) { return false; } $result = true; foreach ( $blog_ids as $blog_id ) { switch_to_blog( $blog_id ); $this->roles = $this->lib->get_user_roles(); if ( !isset( $this->roles[$this->current_role] ) ) { // add new role to this blog $this->roles[$this->current_role] = array('name' => $this->current_role_name, 'capabilities' => array('read' => true)); } if ( !$this->save_roles() ) { $result = false; break; } } $this->lib->restore_after_blog_switching( $old_blog ); $this->roles = $this->lib->get_user_roles(); return $result; } // end of wp_api_network_roles_update() /** * Update role for all network using WordPress API * * @return boolean */ protected function multisite_update_roles() { $multisite = $this->lib->get('multisite'); if (!$multisite) { return false; } $debug = $this->lib->get('debug'); if ( $debug ) { $time_shot = microtime(); } if ( $this->is_full_network_synch() ) { $result = $this->direct_network_roles_update(); } else { $result = $this->wp_api_network_roles_update(); } // Use this action to hook a code to execute after roles were updated at all subsites of the multisite network do_action('ure_after_network_roles_update'); if ($debug) { echo '
Roles updated for ' . ( microtime() - $time_shot ) . ' milliseconds
'; } return $result; } // end of multisite_update_roles() /** * Process user request on update roles * * @global WP_Roles $wp_roles * @return boolean */ protected function update_roles() { global $wp_roles; $multisite = $this->lib->get( 'multisite' ); if ( $multisite && $this->lib->is_super_admin() && $this->apply_to_all ) { // update Role for all blogs/sites in the network (permitted to superadmin only) if (!$this->multisite_update_roles()) { return false; } } else { if (!$this->save_roles()) { return false; } } // refresh global $wp_roles $wp_roles = new WP_Roles(); return true; } // end of update_roles() /** * if existing user was not added to the current blog - add him * @global type $blog_id * @param type $user * @return bool */ protected function check_blog_user( $user ) { global $blog_id; $result = true; if ( is_network_admin() ) { if (!array_key_exists( $blog_id, get_blogs_of_user( $user->ID ) ) ) { $result = add_existing_user_to_blog( array( 'user_id' => $user->ID, 'role' => 'subscriber' ) ); } } return $result; } // end of check_blog_user() private function get_user_primary_role( $user ) { $role = ( is_array( $user->roles ) && count( $user->roles )>0 ) ? $user->roles[0] : ''; return $role; } private function get_new_primary_role( $user ) { $wp_roles = wp_roles(); $select_primary_role = apply_filters( 'ure_users_select_primary_role', true ); if ( $select_primary_role || $this->lib->is_super_admin()) { $role = isset( $_POST['values']['primary_role'] ) ? URE_Base_Lib::filter_string_var( $_POST['values']['primary_role'] ) : false; if ( empty( $role ) || !isset( $wp_roles->roles[$role] ) ) { $role = ''; } } else { $role = $this->get_user_primary_role( $user ); } return $role; } // end of get_new_primary_role() private function get_bbpress_role( $user ) { $bbpress = $this->lib->get_bbpress(); if ( $bbpress->is_active() ) { $role = bbp_get_user_role( $user->ID ); } else { $role = ''; } return $role; } // end of get_bbpress_role() /** * Add other roles to roles array for this user, extracting selected values from the POST * * @param array $roles */ private function add_other_roles( $roles ) { $wp_roles = wp_roles(); $post_values = isset( $_POST['values'] ) && is_array( $_POST['values'] ) ? $_POST['values'] : array(); foreach ( $post_values as $key => $value ) { $result = preg_match( '/^wp_role_(.+)/', $key, $match ); if ( $result !== 1 ) { continue; } $role = $match[1]; if ( !isset( $wp_roles->roles[$role] ) ) { // Skip role if it does not exist continue; } if ( !in_array( $role, $roles ) ) { $roles[] = $role; } } return $roles; } // end of add_other_roles() /** * Provide a valid placement of a primary role - 1st element of roles array * * @param WP_User $user * @param array $new_roles */ private function set_primary_role( $user, $new_primary_role ) { if ( count( $user->roles )<=1 ) { // User does not have roles at all or has only single one return; } $current_primary_role = reset( $user->roles ); if ( $current_primary_role === $new_primary_role ) { // Current primary role is equal to a new one - nothing was changed return; } // remove primary role from user capabilities array unset( $user->caps[$new_primary_role] ); // insert new primary role as the 1st elemnt of user capabilities array $user->caps = array($new_primary_role=>true) + $user->caps; // update user permissions ar WordPress internal data structures - exactly the same way as WordPress itself does at WP_User::add_role() update_user_meta( $user->ID, $user->cap_key, $user->caps ); $user->get_role_caps(); $user->update_user_level_from_caps(); } // end of set_primary_role() private function update_user_roles( $user, $new_roles ) { foreach( $user->roles as $role ) { if ( !in_array( $role, $new_roles ) ) { $user->remove_role( $role ); } } foreach( $new_roles as $role ) { if ( !in_array( $role, $user->roles ) ) { $user->add_role( $role ); } } if ( !empty( $new_roles ) ) { $this->set_primary_role( $user, $new_roles[0] ); } } // end of update_user_roles() /** * Remove from user directly granted capabilities * * @param WP_User $user */ private function remove_user_capabilities( $user, $caps_to_save ) { if ( empty( $user->caps ) ) { return; } $roles = wp_roles()->roles; $roles_id = array_keys( $roles ); $caps = array_keys( $user->caps ); foreach( $caps as $cap ) { if ( in_array( $cap, $roles_id ) ) { // It's a role ID, skip it continue; } if ( !in_array( $cap, $caps_to_save ) ) { $user->remove_cap( $cap ); } } } // end of remove_user_capabilities() /** * Update individual capabilities of the user * * @param WP_User $user */ private function update_user_capabilities( $user ) { // $edit_user_caps = $this->get_edit_user_caps_mode(); $caps_to_save = array_keys( $this->capabilities_to_save ); $this->remove_user_capabilities( $user, $caps_to_save ); $user_caps = array_keys( $user->caps ); // process new added capabilities foreach ($caps_to_save as $cap ) { if ( !in_array( $cap, $user_caps ) ) { $user->add_cap( $cap ); } } } // end of update_user_capabilities() /** * Update user roles and capabilities * * @global WP_Roles $wp_roles * @param WP_User $user * @return boolean */ protected function update_user( $user ) { if ( !is_a( $user, 'WP_User') ) { return false; } do_action( 'ure_before_user_permissions_update', $user->ID ); $multisite = $this->lib->get('multisite'); if ($multisite) { if ( !$this->check_blog_user( $user ) ) { return false; } } $new_primary_role = $this->get_new_primary_role( $user ); $bbp_role = $this->get_bbpress_role( $user ); // Build new roles array for the user $new_roles = array(); // restore primary role if ( !empty( $new_primary_role ) ) { $new_roles[] = $new_primary_role; } // restore bbPress user role if user had one if ( !empty( $bbp_role ) ) { $new_roles[] = $bbp_role; } $new_roles = $this->add_other_roles( $new_roles ); $this->update_user_roles( $user, $new_roles ); $this->update_user_capabilities( $user ); do_action('ure_user_permissions_update', $user->ID, $user); // In order other plugins may hook to the user permissions update return true; } // end of update_user() /** * Save changes to the roles or user * @param string $mess - notification message to the user * @return string - notification message to the user */ protected function permissions_object_update( $mess ) { if ( !empty( $mess ) ) { $mess .= '
'; } if ( $this->ure_object === 'role' ) { // save role changes to database if ($this->update_roles()) { if (!$this->apply_to_all) { $mess = esc_html__('Role is updated successfully', 'user-role-editor'); } else { $mess = esc_html__('Roles are updated for all network', 'user-role-editor'); } } else { $mess = esc_html__('Error occurred during role(s) update', 'user-role-editor'); } } else { if ($this->update_user($this->user_to_edit)) { $mess = esc_html__('User capabilities are updated successfully', 'user-role-editor'); } else { $mess = esc_html__('Error occurred during user update', 'user-role-editor'); } } return $mess; } // end of permissions_object_update() /** * Return WordPress user roles to its initial state, just like after installation * @global WP_Roles $wp_roles */ protected function wp_roles_reinit() { global $wp_roles, $wp_user_roles; $wp_user_roles = null; $wp_roles->roles = array(); $wp_roles->role_objects = array(); $wp_roles->role_names = array(); $wp_roles->use_db = true; require_once(ABSPATH . '/wp-admin/includes/schema.php'); populate_roles(); $wp_roles = new WP_Roles(); $this->roles = $this->lib->get_user_roles(); } // end of wp_roles_reinit() /** * Reset user roles to WordPress default roles */ public function reset_user_roles() { if (!current_user_can('ure_reset_roles')) { esc_html_e('Insufficient permissions to work with User Role Editor','user-role-editor'); $debug = ( defined('WP_PHP_UNIT_TEST') && WP_PHP_UNIT_TEST==true ); if ( !$debug ) { die; } else { return false; } } $this->wp_roles_reinit(); URE_Own_Capabilities::init_caps(); $multisite = $this->lib->get('multisite'); if ( !$multisite ) { return true; } $this->apply_to_all = $this->lib->get_request_var('ure_apply_to_all', 'post', 'checkbox'); if ($this->apply_to_all) { $this->current_role = ''; $this->direct_network_roles_update(); } return true; } // end of reset_user_roles() protected function get_role_id_from_post() { $result = array('role_id'=>'', 'message'=>''); $role_id = $this->lib->get_request_var('user_role_id', 'post' ); if ( empty( $role_id ) ) { $result['message'] = esc_html__('Error: Role ID is empty!', 'user-role-editor' ); return $result; } // $role_id = utf8_decode( $role_id ); // DEPRECATED as of PHP 8.2.0. $role_id = mb_convert_encoding( $role_id, 'ISO-8859-1', 'UTF-8'); // sanitize user input for security $match = array(); $valid_name = preg_match( '/[A-Za-z0-9_\-]*/', $role_id, $match ); if ( !$valid_name || ( $valid_name && ( $match[0] !== $role_id ) ) ) { // Some non-alphanumeric charactes found! $result['message'] = esc_html__( 'Error: Role ID must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor' ); return $result; } $numeric_name = preg_match( '/[0-9]*/', $role_id, $match ); if ( $numeric_name && ( $match[0] === $role_id ) ) { // Numeric name discovered $result['message'] = esc_html__( 'Error: WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor' ); return $result; } $result['role_id'] = strtolower( $role_id ); return $result; } // end of get_role_id_from_post() /** * Process new role creation request * * @return array - operation result data * */ public function add_new_role() { $response = array('result'=>'error', 'role_id'=>'', 'role_name'=>'', 'message'=>''); if ( !current_user_can( 'ure_create_roles' ) ) { $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); return $response; } $result = $this->get_role_id_from_post(); if ( !empty( $result['message'] ) ) { $response['message'] = $result['message']; return $response; } $role_id = $result['role_id']; $wp_roles = wp_roles(); if ( isset( $wp_roles->roles[$role_id] ) ) { // translators: placeholder %s is replaced by existed user role id string value $response['message'] = 'Error! ' . sprintf( esc_html__( 'Role %s exists already', 'user-role-editor' ), $role_id ); return $response; } $role_name = $this->lib->get_request_var( 'user_role_name', 'post' ); if ( empty( $role_name ) ) { // as user role name is empty, use user role ID instead as a default value $role_name = $role_id; } $this->current_role = $role_id; $role_copy_from = $this->lib->get_request_var( 'user_role_copy_from', 'post' ); if ( !empty( $role_copy_from ) && $role_copy_from!=='none' && $wp_roles->is_role( $role_copy_from ) ) { $role = $wp_roles->get_role($role_copy_from); $capabilities = $this->remove_caps_not_allowed_for_single_admin( $role->capabilities ); } else { // Use subscriber role permissions as a default value $capabilities = array('read' => true, 'level_0' => true); } // add new role to the roles array $result = add_role( $role_id, $role_name, $capabilities ); if ( !isset( $result ) || empty( $result ) ) { $response['message'] = 'Error! ' . esc_html__('Error is encountered during new role create operation', 'user-role-editor' ); return $response; } $response['result'] = 'success'; $response['role_id'] = $role_id; $response['role_name'] = $role_name; // translators: placeholder %s is replaced by created user role id string value $response['message'] = sprintf( esc_html__('Role %s is created successfully', 'user-role-editor'), $role_name ); return $response; } // end of add_new_role() public function update_role() { $response = array('result'=>'error', 'role_id'=>'', 'role_name'=>'', 'message'=>''); if ( !current_user_can( 'ure_edit_roles' ) ) { $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); return $response; } $this->_init0(); if ( $this->ure_object==='role') { $result = $this->get_role_id_from_post(); if ( !empty( $result['message'] ) ) { $response['message'] = $result['message']; return $response; } } $this->roles = $this->lib->get_user_roles(); $this->full_capabilities = $this->lib->init_full_capabilities( $this->ure_object ); if ( isset( $_POST['values']['user_role'] ) ) { $this->notification = $this->init_current_role_name(); } $this->prepare_capabilities_to_save(); $this->notification = $this->permissions_object_update( $this->notification ); $response['result'] = 'success'; if ( $this->ure_object==='role') { $response['role_id'] = $result['role_id']; $response['role_name'] = $this->current_role_name; } $response['message'] = $this->notification; return $response; } // end of update_role() public function update_network() { $this->init0(); $this->roles = $this->lib->get_user_roles(); $this->full_capabilities = $this->lib->init_full_capabilities( $this->ure_object ); if ( isset( $_POST['user_role'] ) ) { $this->notification = $this->init_current_role_name(); } $this->prepare_capabilities_to_save(); $this->notification = $this->permissions_object_update( $this->notification ); } // end of update_network() /** * process rename role request * * @global WP_Roles $wp_roles * * @return string - message about operation result * */ public function rename_role() { global $wp_roles; $response = array('result'=>'error', 'message'=>'', 'role_id'=>'', 'role_name'=>''); if ( !current_user_can( 'ure_edit_roles' ) ) { $response['message'] = esc_html__( 'Insufficient permissions to work with User Role Editor','user-role-editor' ); return $response; } $result = $this->get_role_id_from_post(); if ( !empty( $result['message'] ) ) { $response['message'] = $result['message']; return $response; } $new_role_name = $this->lib->get_request_var('user_role_name', 'post' ); if ( empty( $new_role_name ) ) { $response['message'] = esc_html__( 'Error: Empty role display name is not allowed.', 'user-role-editor' ); return $response; } $role_id = $result['role_id']; $wp_roles = wp_roles(); if ( !isset( $wp_roles->roles[$role_id] ) ) { // translators: placeholder %s is replaced by not existed user role id string value $response['message'] = 'Error! '. sprintf( esc_html__('Role %s does not exists', 'user-role-editor'), $role_id ); return $response; } $new_role_name = sanitize_text_field( $new_role_name ); $this->current_role = $role_id; $this->current_role_name = $new_role_name; $old_role_name = $wp_roles->roles[$role_id]['name']; $wp_roles->roles[$role_id]['name'] = $new_role_name; update_option( $wp_roles->role_key, $wp_roles->roles ); $response['result'] = 'success'; // translators: 1st placeholder %s is replaced by original user role name, 2nd placehoder is replaced by new user role name $response['message'] = sprintf( esc_html__('Role %1$s is renamed to %2$s successfully', 'user-role-editor'), $old_role_name, $new_role_name ); $response['role_id'] = $role_id; $response['role_name'] = $new_role_name; return $response; } // end of rename_role() protected function get_wp_built_in_roles() { $result = array('subscriber', 'contributor', 'author', 'editor', 'administrator'); return $result; } // end of get_wp_built_in_roles() /** * return array with roles which we could delete, e.g self-created and not used with any blog user * * @return array */ public function get_roles_can_delete() { $default_role = get_option( 'default_role' ); $wp_built_in_roles = $this->get_wp_built_in_roles(); $roles_can_delete = array(); $users = count_users(); $roles = $this->lib->get_user_roles(); foreach ($roles as $key => $role) { $can_delete = true; // check if it is default role for new users if ( $key === $default_role ) { $can_delete = false; continue; } // Do not allow to delete WordPress built-in role if ( in_array( $key, $wp_built_in_roles ) ) { continue; } // check if role has capabilities prohibited for the single site administrator if ( $this->role_contains_caps_not_allowed_for_simple_admin( $key ) ) { continue; } if ( !isset( $users['avail_roles'][$key] ) ) { $roles_can_delete[$key] = $role['name'] . ' (' . $key . ')'; } } return $roles_can_delete; } // end of get_roles_can_delete() /** * Deletes user role from the WP database */ protected function delete_wp_roles( $roles_to_del ) { global $wp_roles; $result = array('result'=>false, 'deleted_roles'=>array(), 'message'=>''); $roles_can_delete = $this->get_roles_can_delete(); $wp_roles = wp_roles(); foreach($roles_to_del as $role_id) { if ( !isset( $wp_roles->roles[$role_id] ) ) { $result['message'] = esc_html__('Role does not exist','user-role-editor') .' - '. $role_id; return $result; } if ( !isset( $roles_can_delete[$role_id]) ) { $result['message'] = esc_html__( 'You can not delete role', 'user-role-editor' ) .' - '.$role_id; return $result; } unset( $wp_roles->role_objects[$role_id] ); unset( $wp_roles->role_names[$role_id] ); unset( $wp_roles->roles[$role_id] ); $result['deleted_roles'][] = $role_id; $result['result'] = true; } // foreach() if ( $result['result'] ) { update_option( $wp_roles->role_key, $wp_roles->roles ); } return $result; } // end of delete_wp_roles() protected function delete_all_unused_roles() { $roles_to_del = array_keys( $this->get_roles_can_delete() ); if ( empty( $roles_to_del ) || !is_array( $roles_to_del ) ) { $result = array( 'result'=>false, 'deleted_roles'=>array(), 'message'=>esc_html__( 'There are no roles for deletion','user-role-editor' )); return $result; } $result = $this->delete_wp_roles( $roles_to_del ); return $result; } // end of delete_all_unused_roles() /** * Process user request for user role deletion * @return string */ public function delete_role() { $response = array('result'=>'error', 'message'=>'', 'deleted_roles'=>array()); if ( !current_user_can('ure_delete_roles') ) { $response['message'] = esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); return $response; } $role_id = $this->lib->get_request_var( 'user_role_id', 'post'); if ( $role_id==-1 ) { // delete all unused roles $result = $this->delete_all_unused_roles(); } else { if ( empty( $role_id ) ) { $response['message'] = esc_html__( 'Wrong role ID','user-role-editor'); return $response; } $result = $this->delete_wp_roles( array( $role_id ) ); } if ( $result['result']===true ) { $response['result'] = 'success'; $response['deleted_roles'] = $result['deleted_roles']; if ( $role_id==-1 ) { $response['message'] = esc_html__( 'Unused roles are deleted successfully', 'user-role-editor' ); } else { // translators: placeholder %s is replaced by not deleted user role id string value $response['message'] = sprintf( esc_html__( 'Role %s is deleted successfully', 'user-role-editor' ), $role_id ); } } else { $response['message'] = $result['message']; } if ( isset( $_POST['user_role_id'] ) ) { unset( $_POST['user_role_id'] ); } return $response; } // end of delete_role() /** * Change default WordPress role * This method is only for a single site of WordPress multisite installation. * @return string */ protected function change_default_role() { if ( !current_user_can('ure_delete_roles') ) { $mess = esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); return $mess; } $multisite = $this->lib->get('multisite'); if ( !$multisite || is_network_admin() ) { $mess = esc_html__('This method is only for a single site of WordPress multisite installation.', 'user-role-editor'); return $mess; } if ( empty( $_POST['user_role_id'] ) ) { $mess = esc_html__('Wrong request. Default role can not be empty', 'user-role-editor'); return $mess; } $mess = ''; $wp_roles = wp_roles(); $role_id = $this->lib->get_request_var('user_role_id', 'post'); unset( $_POST['user_role_id'] ); if ( isset( $wp_roles->role_objects[$role_id] ) && $role_id !== 'administrator' ) { update_option( 'default_role', $role_id ); $this->wp_default_role = get_option( 'default_role' ); if ($this->wp_default_role===$role_id) { // translators: placeholder %s is replaced by default user role name $mess = sprintf( esc_html__('Default role for new users is set to %s successfully', 'user-role-editor'), $wp_roles->role_names[$role_id] ); } else { $mess = 'Error! ' . esc_html__('Error encountered during default role change operation', 'user-role-editor'); } } elseif ($role_id === 'administrator') { $mess = 'Error! ' . esc_html__('Can not set Administrator role as a default one', 'user-role-editor'); } else { $mess = 'Error! ' . esc_html__('This role does not exist - ', 'user-role-editor') . esc_html( $role_id ); } return $mess; } // end of change_default_role() /** * Process user request */ protected function process_user_request() { $this->notification = ''; if ( !isset( $_POST['action'] ) ) { return false; } if ( !$this->valid_nonce() ) { if ( defined('WP_DEBUG') && WP_DEBUG ) { return false; } else { exit; } } $action = $this->lib->get_request_var('action', 'post'); switch ( $action ) { case 'reset': { $this->reset_user_roles(); exit; } case 'change-default-role': { $this->notification = $this->change_default_role(); break; } case 'caps-readable': { $this->set_caps_readable(); break; } case 'show-deprecated-caps': { $this->set_show_deprecated_caps(); break; } case 'roles_restore_note': { $this->notification = esc_html__( 'User Roles are restored to WordPress default values. ', 'user-role-editor' ); break; } default: { do_action( 'ure_process_user_request' ); } } // switch ( $action ) .... return true; } // end of process_user_request() public function init1() { $this->roles = $this->lib->get_user_roles(); $this->full_capabilities = $this->lib->init_full_capabilities( $this->ure_object ); if ( empty( $this->role_additional_options ) ) { $this->role_additional_options = URE_Role_Additional_Options::get_instance( $this->lib ); } } // end of editor_init1() /** * Return id of role last in the list of sorted roles * */ protected function get_last_role_id() { // get the key of the last element in roles array $keys = array_keys( $this->roles ); asort( $keys ); $last_role_id = array_pop( $keys ); return $last_role_id; } // end of get_last_role_id() protected function set_current_role() { if (!isset($this->current_role) || !$this->current_role) { if (isset($_REQUEST['user_role']) && $_REQUEST['user_role'] && isset($this->roles[$_REQUEST['user_role']])) { $this->current_role = $_REQUEST['user_role']; } else { $this->current_role = $this->get_last_role_id(); } $roles = $this->lib->get_user_roles(); $this->current_role_name = $roles[$this->current_role]['name']; } } // end of set_current_role() // returns true if editing user has $capability assigned through the roles or directly // returns true if editing user has role with name equal $capability public function user_can($capability) { if (isset($this->user_to_edit->caps[$capability])) { return true; } foreach ($this->user_to_edit->roles as $role) { if ($role===$capability) { return true; } if (!empty($this->roles[$role]['capabilities'][$capability])) { return true; } } return false; } // end of user_can() protected function show_editor() { $this->lib->show_message( $this->notification ); if ( $this->ure_object == 'user' ) { $view = new URE_User_View(); } else { $this->set_current_role(); $view = new URE_Role_View(); $view->role_edit_prepare_html(); } ?>

display(); wp_nonce_field( 'user-role-editor', 'ure_nonce' ); ?>
lib->is_pro() ) { $view->advertise_pro(); } ?>
lib->is_pro()) { $view->advertise_commercials(); } */ $view->display_edit_dialogs(); do_action( 'ure_dialogs_html' ); URE_Role_View::output_confirmation_dialog(); ?>
init0()) { $message = esc_html__( 'Error: wrong request', 'user-role-editor' ); $this->lib->show_message( $message ); return false; } $this->process_user_request(); $this->init1(); $this->show_editor(); return true; } // end of show() public function set_notification($value) { $this->notification = $value; } // end of set_notification() /** * Not really used in the plugin - just storage for the translation strings */ protected function translation_data() { // for the translation purpose if (false) { // Standard WordPress roles __('Editor', 'user-role-editor'); __('Author', 'user-role-editor'); __('Contributor', 'user-role-editor'); __('Subscriber', 'user-role-editor'); // Standard WordPress capabilities __('Switch themes', 'user-role-editor'); __('Edit themes', 'user-role-editor'); __('Activate plugins', 'user-role-editor'); __('Edit plugins', 'user-role-editor'); __('Edit users', 'user-role-editor'); __('Edit files', 'user-role-editor'); __('Manage options', 'user-role-editor'); __('Moderate comments', 'user-role-editor'); __('Manage categories', 'user-role-editor'); __('Manage links', 'user-role-editor'); __('Upload files', 'user-role-editor'); __('Import', 'user-role-editor'); __('Unfiltered html', 'user-role-editor'); __('Edit posts', 'user-role-editor'); __('Edit others posts', 'user-role-editor'); __('Edit published posts', 'user-role-editor'); __('Publish posts', 'user-role-editor'); __('Edit pages', 'user-role-editor'); __('Read', 'user-role-editor'); __('Level 10', 'user-role-editor'); __('Level 9', 'user-role-editor'); __('Level 8', 'user-role-editor'); __('Level 7', 'user-role-editor'); __('Level 6', 'user-role-editor'); __('Level 5', 'user-role-editor'); __('Level 4', 'user-role-editor'); __('Level 3', 'user-role-editor'); __('Level 2', 'user-role-editor'); __('Level 1', 'user-role-editor'); __('Level 0', 'user-role-editor'); __('Edit others pages', 'user-role-editor'); __('Edit published pages', 'user-role-editor'); __('Publish pages', 'user-role-editor'); __('Delete pages', 'user-role-editor'); __('Delete others pages', 'user-role-editor'); __('Delete published pages', 'user-role-editor'); __('Delete posts', 'user-role-editor'); __('Delete others posts', 'user-role-editor'); __('Delete published posts', 'user-role-editor'); __('Delete private posts', 'user-role-editor'); __('Edit private posts', 'user-role-editor'); __('Read private posts', 'user-role-editor'); __('Delete private pages', 'user-role-editor'); __('Edit private pages', 'user-role-editor'); __('Read private pages', 'user-role-editor'); __('Delete users', 'user-role-editor'); __('Create users', 'user-role-editor'); __('Unfiltered upload', 'user-role-editor'); __('Edit dashboard', 'user-role-editor'); __('Update plugins', 'user-role-editor'); __('Delete plugins', 'user-role-editor'); __('Install plugins', 'user-role-editor'); __('Update themes', 'user-role-editor'); __('Install themes', 'user-role-editor'); __('Update core', 'user-role-editor'); __('List users', 'user-role-editor'); __('Remove users', 'user-role-editor'); __('Add users', 'user-role-editor'); __('Promote users', 'user-role-editor'); __('Edit theme options', 'user-role-editor'); __('Delete themes', 'user-role-editor'); __('Export', 'user-role-editor'); } } // end of translation_data() /** * Prevent cloning of the instance of the *Singleton* instance. * * @return void */ public function __clone() { throw new \Exception('Do not clone a singleton instance.'); } // end of __clone() /** * Prevent unserializing of the *Singleton* instance. * * @return void */ public function __wakeup() { throw new \Exception('Do not unserialize a singleton instance.'); } // end of __wakeup() } // end of URE_Editor class includes/classes/role-view.php000064400000042075150212007360012435 0ustar00 * @copyright Copyright (c) 2010 - 2024, Vladimir Garagulya **/ class URE_Role_View extends URE_View { public $role_default_html = ''; private $role_to_copy_html = ''; private $role_select_html = ''; private $role_delete_html = ''; private $caps_to_remove = null; public function __construct() { parent::__construct(); $capabilities = URE_Capabilities::get_instance(); $this->caps_to_remove = $capabilities->get_caps_to_remove(); } // end of __construct() public function role_default_prepare_html($select_width=200) { $roles = $this->lib->get_editable_user_roles(); $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); $show_admin_role = $this->lib->show_admin_role_allowed(); if ($select_width>0) { $select_style = 'style="width: '. $select_width .'px"'; } else { $select_style = ''; } $wp_default_role = get_option( 'default_role' ); $this->role_default_html = ''; } // end of role_default_prepare_html() private function role_select_copy_prepare_html( $select_width=200 ) { $current_user = wp_get_current_user(); $key_capability = URE_Own_Capabilities::get_key_capability(); $user_is_ure_admin = current_user_can( $key_capability ); $role_to_skip = ( $user_is_ure_admin ) ? '' : $current_user->roles[0]; $caps_access_restrict_for_simple_admin = $this->lib->get_option( 'caps_access_restrict_for_simple_admin', 0 ); $show_admin_role = $this->lib->show_admin_role_allowed(); $this->role_to_copy_html = ''; $current_role = $this->editor->get( 'current_role' ); $all_roles = $this->editor->get( 'roles' ); $roles = $this->lib->get_editable_user_roles( $all_roles ); foreach ($roles as $key => $value) { if ( $key===$role_to_skip ) { // skip role of current user if he does not have full access to URE continue; } $selected1 = selected( $key, $current_role, false ); $disabled = ( $key==='administrator' && $caps_access_restrict_for_simple_admin && !$this->lib->is_super_admin()) ? 'disabled' : ''; if ( $show_admin_role || $key != 'administrator' ) { $role_name = esc_html( $value['name'] ) .' (' . $key . ')'; $this->role_select_html .= ''; $this->role_to_copy_html .= ''; } } $this->role_select_html .= ''; $this->role_to_copy_html .= ''; } // end of role_select_copy_prepare_html() private function role_delete_prepare_html() { $roles_can_delete = $this->editor->get_roles_can_delete(); if ( is_array( $roles_can_delete ) && count( $roles_can_delete ) > 0) { ksort( $roles_can_delete ); $this->role_delete_html = ''; } else { $this->role_delete_html = ''; } } // end of role_delete_prepare_html() /** * Build HTML for select drop-down list from capabilities we can remove * * @return string **/ public static function caps_to_remove_html() { global $wp_roles; $capabilities = URE_Capabilities::get_instance(); $caps_to_remove = $capabilities->get_caps_to_remove(); if ( empty( $caps_to_remove ) || !is_array( $caps_to_remove ) && count( $caps_to_remove )===0 ) { return ''; } $caps = array_keys($caps_to_remove); asort($caps); $network_admin = filter_input(INPUT_POST, 'network_admin', FILTER_SANITIZE_NUMBER_INT); $current_role = isset( $_POST['current_role'] ) ? URE_Base_Lib::filter_string_var( $_POST['current_role'] ) : ''; if (!isset($wp_roles->roles[$current_role])) { $current_role = ''; } ob_start(); ?>
role_select_copy_prepare_html( $select_width ); $multisite = $this->lib->get( 'multisite' ); if ( $multisite && !is_network_admin() ) { $this->role_default_prepare_html( $select_width ); } $this->role_delete_prepare_html(); } // end of role_edit_prepare_html() public function display_edit_dialogs() { $multisite = $this->lib->get('multisite'); $current_role = $this->editor->get('current_role'); $current_role_name = $this->editor->get('current_role_name'); ?>
role_to_copy_html; ?>
role_delete_html; ?>
role_default_html; ?>
current_role * @param boolean $role_delete * @param boolean $capability_remove */ public function toolbar() { $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); if ($caps_access_restrict_for_simple_admin) { $add_del_role_for_simple_admin = $this->lib->get_option('add_del_role_for_simple_admin', 1); } else { $add_del_role_for_simple_admin = 1; } $super_admin = $this->lib->is_super_admin(); $multisite = $this->lib->get('multisite'); ?>

role_delete_html) && current_user_can('ure_delete_roles')) { ?> caps_to_remove) && is_array($this->caps_to_remove) && count($this->caps_to_remove)>0 && current_user_can('ure_delete_capabilities')) { ?>

lib->get('multisite'); $active_for_network = $this->lib->get('active_for_network'); ?>
editor->get('caps_readable'); if ($caps_readable) { $checked = 'checked="checked"'; } else { $checked = ''; } $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); if ($this->lib->is_super_admin() || !$multisite || !$this->lib->is_pro() || !$caps_access_restrict_for_simple_admin) { ?> onclick="ure_main.turn_caps_readable();"/>    editor->get('show_deprecated_caps'); if ($show_deprecated_caps) { $checked = 'checked="checked"'; } else { $checked = ''; } ?> onclick="ure_turn_deprecated_caps(0);"/> lib->is_super_admin()) { $hint = esc_html__( 'If checked, then apply action to ALL sites of this Network', 'user-role-editor' ); $apply_to_all = $this->editor->get('apply_to_all'); if ($apply_to_all) { $checked = 'checked="checked"'; $fontColor = 'color:#FF0000;'; } else { $checked = ''; $fontColor = ''; } ?>
title="" onclick="ure_main.apply_to_all_on_click(this)"/>

role_select_html; ?>
display_options(); $this->display_caps(); $ao = $this->editor->get('role_additional_options'); $current_role = $this->editor->get('current_role'); $ao->show($current_role); ?>
init(); } // end of __construct /** * Returns random number not included into input array * * @param array $used - array of numbers used already * * @return int */ private function rand_unique( $max_ind, $used = array(-1) ) { if ( $max_ind<0 ) { $max_ind = 0; } $index = wp_rand( 0, $max_ind ); $iterations = 0; while ( in_array( $index, $used ) && $iterations<=$max_ind * 3 ) { $index = wp_rand( 0, $max_ind ); $iterations++; } return $index; } // return rand_unique() private function init() { $this->slots = array(); $used = array(-1); $max_ind = $this->slots_quantity - 1; $index = $this->rand_unique( $max_ind, $used ); $this->slots[$index] = $this->admin_menu_editor(); /* $used[] = $index; $index = $this->rand_unique( $used, $max_ind ); $this->slots[$index] = $this->some_other_slot(); ksort( $this->slots ); * */ } // end of init() /* private function some_other_slot() { $output = '
bla-bla-bla;
'; return $output; } */ // content of Admin Menu Editor advertisement slot private function admin_menu_editor() { $output = ' '; return $output; } // end of admin_menu_editor() /** * Output all existed ads slots */ public function display() { if ( empty( $this->slots ) ) { return; } ?>
slots as $slot) { echo $slot . "\n"; } ?>
lib = URE_Lib::get_instance(); $this->quick_count = $this->count_quick_or_thoroughly(); } // end of __construct() public function create_no_rights_role() { $role_id = 'no_rights'; $role_name = 'No rights'; $wp_roles = wp_roles(); if ( isset( $wp_roles->roles[$role_id] ) ) { return; } add_role( $role_id, $role_name, array() ); } // end of create_no_rights_role() private function count_quick_or_thoroughly() { $quick_count = true; if ( defined('URE_COUNT_USERS_WITHOUT_ROLE_THOROUGHLY') && URE_COUNT_USERS_WITHOUT_ROLE_THOROUGHLY ) { $quick_count = false; } elseif ( $this->lib->is_pro() ) { $count_thoroughly = $this->lib->get_option( 'count_users_without_role_thoroughly', false ); if ( $count_thoroughly ) { $quick_count = false; } } $quick_count = apply_filters('ure_count_users_without_role_quick', $quick_count ); return $quick_count; } // end of count_quick_or_thoroughly() private function get_thorougly_where_condition() { global $wpdb; $usermeta = $wpdb->usermeta; $id = get_current_blog_id(); $blog_prefix = $wpdb->get_blog_prefix( $id ); $where = "WHERE NOT EXISTS (SELECT user_id from {$usermeta} ". "WHERE user_id=users.ID AND meta_key='{$blog_prefix}capabilities') OR ". "EXISTS (SELECT user_id FROM {$usermeta} ". "WHERE user_id=users.ID AND meta_key='{$blog_prefix}capabilities' AND ". "(meta_value='a:0:{}' OR meta_value IS NULL))"; return $where; } // end of get_thoroughly_where_condition() private function get_quick_query_part2() { global $wpdb; $usermeta = $wpdb->usermeta; $id = get_current_blog_id(); $blog_prefix = $wpdb->get_blog_prefix($id); $query = "FROM {$usermeta} usermeta ". "INNER JOIN {$wpdb->users} users ON usermeta.user_id=users.ID ". "WHERE usermeta.meta_key='{$blog_prefix}capabilities' AND ". "(usermeta.meta_value = 'a:0:{}' OR usermeta.meta_value is NULL)"; return $query; } // end of get_quick_query_part2() private function get_users_count_query() { global $wpdb; if ( $this->quick_count ) { $part2 = $this->get_quick_query_part2(); $query = "SELECT COUNT(DISTINCT usermeta.user_id) {$part2}"; } else { $where = $this->get_thorougly_where_condition(); $query = "SELECT count(ID) FROM {$wpdb->users} users {$where}"; } return $query; } // end of get_users_count_query() public function count_users_without_role() { global $wpdb; $users_quant = get_transient('ure_users_without_role'); if (empty($users_quant)) { $query = $this->get_users_count_query(); $users_quant = $wpdb->get_var( $query ); set_transient('ure_users_without_role', $users_quant, 15 ); } return $users_quant; } // end of count_users_without_role() public function get_users_without_role() { global $wpdb; $top_limit = self::MAX_USERS_TO_PROCESS; if ( $this->quick_count ) { $part2 = $this->get_quick_query_part2(); $query = "SELECT DISTINCT usermeta.user_id {$part2} LIMIT 0, {$top_limit}"; } else { $where = $this->get_thorougly_where_condition(); $query = "SELECT users.ID FROM {$wpdb->users} users {$where} LIMIT 0, {$top_limit}"; } $users0 = $wpdb->get_col( $query ); return $users0; } // end of get_users_without_role() public function show_html() { $users_quant = $this->count_users_without_role(); if ($users_quant==0) { return; } $button_number = (self::$counter>0) ? '_2': ''; ?>   
debug = defined('URE_DEBUG') && (URE_DEBUG==1 || URE_DEBUG==true); $this->get_bbpress(); $this->upgrade(); } // end of __construct() public function get_bbpress() { if ($this->bbpress===null) { $this->bbpress = new URE_bbPress(); } return $this->bbpress; } // end of get_bbpress() public static function get_instance($options_id = '') { if (self::$instance === null) { if (empty($options_id)) { throw new Exception('URE_Lib::get_instance() - Error: plugin options ID string is required'); } // new static() will work too self::$instance = new URE_Lib($options_id); } return self::$instance; } // end of get_instance() protected function upgrade() { if (!is_admin()) { return; } $ure_version = $this->get_option('ure_version', '0'); if (version_compare( $ure_version, URE_VERSION, '<' ) ) { // put version upgrade stuff here $this->put_option('ure_version', URE_VERSION, true); } } // end of upgrade() /** * Is this the Pro version? * @return boolean */ public function is_pro() { return false; } // end of is_pro() public function set_raised_permissions($value) { $this->raised_permissions = !empty($value) ? true : false; } // end of set_raised_permissions() /** * get options for User Role Editor plugin * User Role Editor stores its options at the main blog/site only and applies them to the all network * */ protected function init_options($options_id) { global $wpdb; if ($this->multisite) { if ( ! function_exists( 'is_plugin_active_for_network' ) ) { // Be sure the function is defined before trying to use it require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); } $this->active_for_network = is_plugin_active_for_network(URE_PLUGIN_BASE_NAME); } $current_blog = $wpdb->blogid; if ($this->multisite && $current_blog!=$this->main_blog_id) { if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog switch_to_blog($this->main_blog_id); } } $this->options_id = $options_id; $this->options = get_option($options_id); if ($this->multisite && $current_blog!=$this->main_blog_id) { if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog restore_current_blog(); } } } // end of init_options() /** * saves options array into WordPress database wp_options table */ public function flush_options() { global $wpdb; $current_blog = $wpdb->blogid; if ($this->multisite && $current_blog!==$this->main_blog_id) { if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog switch_to_blog($this->main_blog_id); // in order to save URE options to the main blog } } update_option($this->options_id, $this->options); if ($this->multisite && $current_blog!==$this->main_blog_id) { if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog restore_current_blog(); } } } // end of flush_options() public function get_main_blog_id() { return $this->main_blog_id; } /** * Checks if user is allowed to use User Role Editor * * @param int $user_id * @return boolean true */ public function user_is_admin($user_id = false) { if (empty($user_id)) { $user_id = get_current_user_id(); } if ( $this->is_super_admin( $user_id ) ) { return true; } $ure_key_capability = URE_Own_Capabilities::get_key_capability(); $user = get_userdata( $user_id ); $result = !empty( $user->allcaps[ $ure_key_capability ] ); return $result; } // end of user_is_admin() /** * return array with WordPress user roles * * @global WP_Roles $wp_roles * @global type $wp_user_roles * @return array */ public function get_user_roles() { $bbpress = $this->get_bbpress(); if ($bbpress->is_active()) { // bbPress plugin is active $roles = $bbpress->get_roles(); } else { $wp_roles = wp_roles(); $roles = $wp_roles->roles; } return $roles; } // end of get_user_roles() /** * Respect 'editable_roles' filter, when needed * @return array */ public function get_editable_user_roles( $roles = array() ) { if ( empty( $roles ) ) { $roles = $this->get_user_roles(); } $bbpress = $this->get_bbpress(); if ($bbpress->is_active()) { remove_filter('editable_roles', 'bbp_filter_blog_editable_roles'); } $roles = apply_filters('editable_roles', $roles ); if ( $bbpress->is_active() ) { add_filter('editable_roles', 'bbp_filter_blog_editable_roles'); } return $roles; } // end of get_editable_user_roles() /** * return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php) * * @return array */ public function get_built_in_wp_caps() { $caps_groups = URE_Capabilities_Groups_Manager::get_instance(); $caps = $caps_groups->get_built_in_wp_caps(); return $caps; } // end of get_built_in_wp_caps() /** * Return all available post types except non-public WordPress built-in post types * * @return array */ public function _get_post_types() { $all_post_types = get_post_types(); $internal_post_types = get_post_types(array('public'=>false, '_builtin'=>true)); $post_types = array_diff($all_post_types, $internal_post_types); return $post_types; } // end of _get_post_types() public function get_edit_post_capabilities() { $capabilities = array( 'create_posts', 'edit_posts', 'edit_published_posts', 'edit_others_posts', 'edit_private_posts', 'publish_posts', 'read_private_posts', 'delete_posts', 'delete_private_posts', 'delete_published_posts', 'delete_others_posts' ); return $capabilities; } // end of get_edit_post_capabilities(); public function init_full_capabilities( $ure_object ) { $capabilities = URE_Capabilities::get_instance(); $full_list = $capabilities->init_full_list( $ure_object ); return $full_list; } // end of init_full_capabilities() public function restore_after_blog_switching($blog_id = 0) { if (!empty($blog_id)) { switch_to_blog($blog_id); } // cleanup blog switching data $GLOBALS['_wp_switched_stack'] = array(); $GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] ); } // end of restore_after_blog_switching() /** * Returns administrator role ID * * @return string */ public function get_admin_role() { $roles = $this->get_user_roles(); if (isset($roles['administrator'])) { $admin_role_id = 'administrator'; } else { // go through all roles and select one with max quant of capabilities included $max_caps = -1; $admin_role_id = ''; foreach(array_keys($roles) as $role_id) { $caps = count($roles[$role_id]['capabilities']); if ($caps>$max_caps) { $max_caps = $caps; $admin_role_id = $role_id; } } } return $admin_role_id; } // end get_admin_role() /** * Returns text presentation of user roles * * @param type $roles user roles list * @return string */ public function roles_text($roles) { global $wp_roles; if (is_array($roles) && count($roles) > 0) { $role_names = array(); foreach ($roles as $role) { if (isset($wp_roles->roles[$role])) { $role_names[] = $wp_roles->roles[$role]['name']; } else { $role_names[] = $role; } } $output = implode(', ', $role_names); } else { $output = ''; } return $output; } // end of roles_text() public function about() { if ($this->is_pro()) { return; } ?>

User Role Editor








get_option('show_admin_role', 0); $show_admin_role = ((defined('URE_SHOW_ADMIN_ROLE') && URE_SHOW_ADMIN_ROLE==1) || $show_admin_role==1) && $this->user_is_admin(); return $show_admin_role; } // end of show_admin_role() /** * Returns true if user has a real super administrator permissions * It takes into account $this->raised_permissions value, in order do not count a user with temporally raised permissions * of a real superadmin under WP Multisite * For WP Singlesite superadmin is a user with 'administrator' role only in opposite the WordPress's is_super_admin(), * which counts as superadmin any user with 'delete_users' capability * * @param int $user_id * @return boolean */ public function is_super_admin( $user_id = false ) { if (empty($user_id)) { $user = wp_get_current_user(); $user_id = $user->ID; } else { $user = get_userdata($user_id); } if (!$user || !$user->exists()) { return false; } if ( $this->multisite && !$this->raised_permissions && is_super_admin( $user_id ) ) { return true; } if (!$this->multisite && $this->user_has_role( $user, 'administrator' ) ) { return true; } return false; } // end of is_super_admin() public function user_has_role( $user, $role) { if (empty($user)) { return false; } if (!is_a($user, 'WP_User')) { return false; } if (empty($user->roles)) { return false; } if (!in_array( $role, $user->roles ) ) { return false; } return true; } // end of user_has_role() // Returns true for any capability if user is a real superadmin under WordPress Multisite // Returns true if user has $capability assigned through the roles or directly // Returns true if user has role with name equal $cap public function user_has_capability($user, $cap) { global $wp_roles; if (!is_object($user) || !is_a( $user, 'WP_User') || empty($user->ID)) { return false; } // Do not replace with $this->is_super_admin() to exclude recursion if ($this->multisite && !$this->raised_permissions && is_super_admin($user->ID)) { return true; } if (isset($user->caps[$cap])) { return true; } foreach ($user->roles as $role) { if ($role === $cap) { return true; } if (!empty($wp_roles->roles[$role]['capabilities'][$cap])) { return true; } } return false; } // end of user_has_capability() // create assign_role object public function get_assign_role() { $assign_role = new URE_Assign_Role(); return $assign_role; } // end of get_assign_role() /** * Compare if current URL path is equal to the required one * if $path is empty, then just check if URL leads to wp-admin * @param string $path * @return boolean */ public function is_right_admin_path( $path='' ) { $result = true; $admin_url = admin_url( $path ); $parsed = wp_parse_url( $admin_url ); $full_path = $parsed['path']; if ( stripos( $_SERVER['REQUEST_URI'], $full_path )===false ) { $result = false; } return $result; } // end of is_right_admin_path() public function is_wp_built_in_role( $role ) { $wp_built_in_roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber'); $result = in_array( $role, $wp_built_in_roles ); return $result; } // end of is_wp_built_in_role() /* * It's overriden in Pro version to add bbPress roles */ public function get_all_editable_roles() { $roles = get_editable_roles(); // WordPress roles if ( has_filter( 'editable_roles', array( User_Role_Editor::get_instance(), 'sort_wp_roles_list') ) ) { // to show roles in the accending order $roles = array_reverse( $roles ); } return $roles; } // end of get_all_roles() /* * Wrapper to get_taxonomies() to get the custom taxonomies list */ public function get_custom_taxonomies( $output='names' ) { $args = array( 'show_ui'=>true, 'public'=>true, '_builtin'=>false ); $taxonomies = get_taxonomies( $args, $output ); return $taxonomies; } // end of get_custom_taxonomies() } // end of URE_Lib class includes/classes/role-additional-options.php000064400000010030150212007360015246 0ustar00lib = $lib; $this->init(); } // end of __construct() public static function get_instance($lib) { if (self::$instance===null) { self::$instance = new URE_Role_Additional_Options($lib); } return self::$instance; } // end of get_instance() public static function create_item($id, $label, $hook, $routine) { $item = new stdClass(); $item->id = $id; $item->label = $label; $item->hook = $hook; $item->routine = $routine; return $item; } // end of create_item() public static function get_active_items() { $data = get_option(self::STORAGE_ID, array()); return $data; } private function init() { $this->items = array(); $item = self::create_item('hide_admin_bar', esc_html__('Hide admin bar', 'user-role-editor'), 'init', 'ure_hide_admin_bar'); $this->items[$item->id] = $item; // Allow other developers to modify the list of role's additonal options $this->items = apply_filters('ure_role_additional_options', $this->items); $this->active_items = self::get_active_items(); } // end of init() public function set_active_items_hooks() { $current_user = wp_get_current_user(); foreach($current_user->roles as $role) { if (!isset($this->active_items[$role])) { continue; } foreach(array_keys($this->active_items[$role]) as $item_id) { if (isset($this->items[$item_id])) { add_action($this->items[$item_id]->hook, $this->items[$item_id]->routine, 99); } } } } // end of set_active_items_hooks() public function save($current_role) { $wp_roles = wp_roles(); $this->active_items = self::get_active_items(); // remove non-existing roles foreach(array_keys($this->active_items) as $role_id) { if (!isset($wp_roles->roles[$role_id])) { unset($this->active_items[$role_id]); } } // Save additonal options section for the current role $this->active_items[$current_role] = array(); foreach( $this->items as $item ) { if ( isset( $_POST['values'][$item->id] ) ) { $this->active_items[$current_role][$item->id] = 1; } } update_option( self::STORAGE_ID, $this->active_items ); } // end of save() public function show($current_role) { ?>
:
items as $item) { $checked = (isset($this->active_items[$current_role]) && isset($this->active_items[$current_role][$item->id])) ? 'checked="checked"' : ''; if (!$first_time) { ?>
>
lib = URE_Lib::get_instance(); add_action( 'load-users.php', array( $this, 'load' ) ); } // end of __construct() public function load() { add_action('restrict_manage_users', array($this, 'show_roles_manage_html') ); add_action('admin_head', array(User_Role_Editor::get_instance(), 'add_css_to_users_page') ); add_action('admin_enqueue_scripts', array($this, 'load_js') ); } // end of load() private static function validate_users($users) { if (!is_array($users)) { return false; } foreach ($users as $user_id) { if (!is_numeric($user_id)) { return false; } if ( !current_user_can( 'promote_user', $user_id ) ) { return false; } if ( is_multisite() && !is_user_member_of_blog( $user_id ) ) { return false; } } return true; } // end of validate_users() public static function add_role() { if ( !current_user_can('promote_users') ) { $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor') ); return $answer; } if ( empty( $_REQUEST['users'] ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Empty users list', 'user-role-editor') ); return $answer; } $users = (array) $_REQUEST['users']; if ( !self::validate_users( $users ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') ); return $answer; } $lib = URE_Lib::get_instance(); $role = $lib->get_request_var('role', 'post', 'string'); if ( !self::validate_roles( array($role=>$role) ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Invalid role', 'user-role-editor') ); return $answer; } $quantity = 0; foreach( $users as $user_id ) { $user = get_user_by( 'id', $user_id ); if (empty( $user ) ) { continue; } if ( empty( $user->roles ) || !in_array( $role, $user->roles ) ) { $user->add_role( $role ); $quantity++; } } if ( $quantity>0 ) { // translators: template %d is a quantity of users to whom role was added $message = sprintf( esc_html__('Role added to %d user(s).', 'user-role-editor'), $quantity ); $answer = array('result'=>'success', 'message'=>$message ); } else { $answer = array('result'=>'error', 'message'=>esc_html__('Error: Role not added', 'user-role-editor') ); } return $answer; } // end of add_role() private static function is_try_remove_admin_from_himself( $user_id, $role) { $result = false; $current_user = wp_get_current_user(); $wp_roles = wp_roles(); $role_caps = array_keys( $wp_roles->roles[$role]['capabilities'] ); $is_current_user = ( $user_id == $current_user->ID ); $role_can_promote = in_array('promote_users', $role_caps); $can_manage_network = is_multisite() && current_user_can( 'manage_network_users' ); // If the removed role has the `promote_users` cap and user is removing it from himself if ( $is_current_user && $role_can_promote && !$can_manage_network ) { $result = true; // Loop through the current user's roles. foreach ($current_user->roles as $_role) { $_role_caps = array_keys( $wp_roles->roles[$_role]['capabilities'] ); // If the current user has another role that can promote users, it's safe to remove the role. Else, the current user should to keep this role. if ( ($role!==$_role) && in_array( 'promote_users', $_role_caps ) ) { $result = false; break; } } } return $result; } // end of is_try_remove_admin_from_himself() public static function revoke_role() { if ( !current_user_can('promote_users') ) { $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor') ); return $answer; } if ( empty( $_REQUEST['users'] ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Empty users list', 'user-role-editor') ); return $answer; } $users = (array) $_REQUEST['users']; if ( !self::validate_users( $users ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') ); return $answer; } $lib = URE_Lib::get_instance(); $role = $lib->get_request_var('role', 'post', 'string'); if ( !self::validate_roles( array($role=>$role) ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Invalid role', 'user-role-editor') ); return $answer; } $quantity = 0; foreach( $users as $user_id ) { $user = get_user_by( 'id', $user_id ); if ( empty( $user ) ) { continue; } if ( self::is_try_remove_admin_from_himself( $user_id, $role ) ) { continue; } if ( is_array($user->roles) && in_array( $role, $user->roles ) ) { $user->remove_role( $role ); $quantity++; } } if ( $quantity>0 ) { // translators: template %d is a quantity of users to whom role was added $message = sprintf( esc_html__('Role revoked from %d user(s).', 'user-role-editor'), $quantity ); $answer = array('result'=>'success', 'message'=>$message ); } else { $answer = array('result'=>'error', 'message'=>esc_html__('Error: Role not revoked', 'user-role-editor') ); } return $answer; } // end of revoke_role() private function update_roles() { if ( empty( $_REQUEST['users'] ) ) { return; } if ( !current_user_can('promote_users') ) { return; } $users = (array) $_REQUEST['users']; if ( !self::validate_users( $users ) ) { return; } if ( ( !empty( $_REQUEST['ure_add_role'] ) && !empty( $_REQUEST['ure_add_role_submit']) ) || ( !empty( $_REQUEST['ure_add_role_2'] ) && !empty( $_REQUEST['ure_add_role_submit_2'] ) ) ) { $this->add_role( $users ); } else if ( ( !empty( $_REQUEST['ure_revoke_role'] ) && !empty( $_REQUEST['ure_revoke_role_submit'] ) ) || ( !empty( $_REQUEST['ure_revoke_role_2'] ) && !empty( $_REQUEST['ure_revoke_role_submit_2'] ) ) ) { $this->revoke_role( $users ); } } // end of update_roles() private static function validate_roles( $roles ) { if ( !is_array( $roles ) ) { return false; } $lib = URE_Lib::get_instance(); $editable_roles = $lib->get_all_editable_roles(); $valid_roles = array_keys( $editable_roles ); foreach( $roles as $role ) { if ( !in_array( $role, $valid_roles ) ) { return false; } } return true; } // end of validate_roles() private static function grant_primary_role_to_user($user_id, $role) { $user = get_user_by('id', $user_id); if (empty($user)) { return; } if ($role===self::NO_ROLE_FOR_THIS_SITE) { $role = ''; } $old_roles = $user->roles; // Save currently granted roles to restore from them the bbPress roles later if there are any... $user->set_role($role); $lib = URE_Lib::get_instance(); $bbpress = $lib->get('bbpress'); if (empty($bbpress)) { return; } $bbp_roles = $bbpress->extract_bbp_roles($old_roles); if (count($bbp_roles)>0) { // restore bbPress roles foreach($bbp_roles as $role) { $user->add_role($role); } } } // end of grant_primary_role_to_user() private static function grant_other_roles_to_user($user_id, $roles) { $user = get_user_by('id', $user_id); if (empty($user)) { return; } $roles_list = array_values( $user->roles ); $primary_role = array_shift( $roles_list ); // Get the 1st element from the roles array $lib = URE_Lib::get_instance(); $bbpress = $lib->get( 'bbpress' ); if ( empty( $bbpress ) ) { $bbp_roles = array(); } else { $bbp_roles = $bbpress->extract_bbp_roles( $user->roles ); } $user->remove_all_caps(); $roles2 = ure_array_merge( array( $primary_role ), $bbp_roles, $roles ); foreach( $roles2 as $role ) { $user->add_role( $role ); } } // end of grant_other_roles_to_user() /** * Decide if primary role should be granted or left as it is * * @param string $primary_role * @return boolean */ private static function is_select_primary_role($primary_role) { if (empty($primary_role)) { return false; // Primary role was not selected by user, leave an older one } $lib = URE_Lib::get_instance(); if ($lib->is_super_admin()) { $select_primary_role = true; } else { $select_primary_role = apply_filters('ure_users_select_primary_role', true); } return $select_primary_role; } // end of is_select_primary_role() public static function grant_roles() { if ( !current_user_can('promote_users') ) { $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor')); return $answer; } $users = $_POST['users']; if ( !self::validate_users( $users ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Can not edit user or invalid data at the users list', 'user-role-editor') ); return $answer; } // Primary role $primary_role = $_POST['primary_role']; if (!empty($primary_role) && ($primary_role!==self::NO_ROLE_FOR_THIS_SITE) && !self::validate_roles(array($primary_role=>$primary_role))) { $answer = array('result'=>'error', 'message'=>esc_html__('Invalid primary role', 'user-role-editor')); return $answer; } if (self::is_select_primary_role($primary_role)) { foreach ($users as $user_id) { self::grant_primary_role_to_user($user_id, $primary_role); } } // Other roles $other_roles = isset($_POST['other_roles']) ? $_POST['other_roles'] : null; if (!empty($other_roles) && !self::validate_roles($other_roles)) { $answer = array('result'=>'error', 'message'=>esc_html__('Invalid data at the other roles list', 'user-role-editor')); return $answer; } if (!empty($other_roles)) { foreach($users as $user_id) { self::grant_other_roles_to_user($user_id, $other_roles); } } $answer = array('result'=>'success', 'message'=>esc_html__('Roles were granted to users successfully', 'user-role-editor')); return $answer; } // end of grant_roles() public static function get_user_roles() { if ( !current_user_can( 'promote_users' ) ) { $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor')); return $answer; } $lib = URE_Lib::get_instance(); $user_id = (int) $lib->get_request_var('user_id', 'post', 'int'); if (empty($user_id)) { $answer = array('result'=>'error', 'message'=>esc_html__('Wrong request, valid user ID was missed', 'user-role-editor')); return $answer; } $user = get_user_by('id', $user_id); if (empty($user)) { $answer = array('result'=>'error', 'message'=>esc_html__('Requested user does not exist', 'user-role-editor')); return $answer; } $other_roles = array_values($user->roles); $primary_role = array_shift($other_roles); $answer = array('result'=>'success', 'primary_role'=>$primary_role, 'other_roles'=>$other_roles, 'message'=>'User roles were sent'); return $answer; } // end of get_user_roles() private function select_primary_role_html() { $select_primary_role = apply_filters('ure_users_select_primary_role', true); if (!$select_primary_role && !$this->lib->is_super_admin()) { return; } ?>

lib->show_admin_role_allowed(); $roles = $this->lib->get_all_editable_roles(); foreach ($roles as $role_id => $role) { if (!$show_admin_role && $role_id=='administrator') { continue; } $role_name = $use_pll ? pll__( $role['name'] ) : $role['name']; echo '
'. PHP_EOL; } ?>
0) ? '_2': ''; $roles_options_list = self::get_roles_options_list(); ?>         
select_primary_role_html(); $this->select_other_roles_html(); ?>
wp_create_nonce('user-role-editor'), 'dialog_title'=> esc_html__('Grant roles to selected users', 'user-role-editor'), 'select_users_first' => esc_html__('Select users to which you wish to grant roles!', 'user-role-editor'), 'select_roles_first' => esc_html__('Select role(s) which you wish to grant!', 'user-role-editor'), 'select_role_first' => esc_html__('Select role first!', 'user-role-editor'), 'select_users_to_add_role' => esc_html__('Select users to which you wish to add role!', 'user-role-editor'), 'select_users_to_revoke_role' => esc_html__('Select users from which you wish revoke role!', 'user-role-editor'), 'show_wp_change_role' => $show_wp_change_role ? 1: 0 )); } // end of load_js() } // end of URE_Grant_Roles class includes/classes/base-lib.php000064400000026050150212007360012175 0ustar00multisite = function_exists( 'is_multisite' ) && is_multisite(); if ( $this->multisite ) { // get Id of the 1st (main) blog $this->main_blog_id = $this->get_main_site(); } $this->init_options( $options_id ); } // end of __construct() public function get( $property_name ) { if ( !property_exists( $this, $property_name ) ) { syslog( LOG_ERR, 'Lib class does not have such property '. $property_name ); return null; } return $this->$property_name; } // end of get_property() public function set( $property_name, $property_value ) { if ( !property_exists( $this, $property_name ) ) { syslog( LOG_ERR, 'Lib class does not have such property '. $property_name ); } $this->$property_name = $property_value; } // end of get_property() public function get_main_site() { global $current_site; $blog_id = is_object( $current_site ) ? $current_site->blog_id : null; return $blog_id; } // end of get_main_site() /** * get current options for this plugin */ protected function init_options( $options_id ) { $this->options_id = $options_id; $this->options = get_option( $options_id, array() ); } // end of init_options() /** * Return HTML formatted message * * @param string $message message text * @param string $error_style message div CSS style */ public function show_message( $message, $error_style = false ) { if ( $message ) { if ( $error_style ) { echo '
'; } else { echo '
'; } echo '

'. $message . '

'; } } // end of show_message() /* * Replacer for FILTER_SANITIZE_STRING deprecated with PHP 8.1 */ public static function filter_string_polyfill( $string ) { $str = preg_replace('/\x00|<[^>]*>?/', '', $string); return str_replace(["'", '"'], [''', '"'], $str); } // end of filter_string_polyfill() public static function filter_string_var( $raw_str ) { $value1 = filter_var( $raw_str, FILTER_UNSAFE_RAW ); $value2 = self::filter_string_polyfill( $value1 ); return $value2; } // end of filter_string_var() /** * Returns value by name from GET/POST/REQUEST. Minimal type checking is provided * * @param string $var_name Variable name to return * @param string $request_type type of request to process get/post/request (default) * @param string $var_type variable type to provide value checking * @return mix variable value from request */ public function get_request_var( $var_name, $request_type = 'request', $var_type = 'string') { $result = 0; $request_type = strtolower( $request_type ); switch ( $request_type ) { case 'get': { if ( isset( $_GET[$var_name] ) ) { $result = self::filter_string_var( $_GET[$var_name] ); } break; } case 'post': { if ( isset( $_POST[$var_name] ) ) { if ( $var_type!='checkbox') { $result = self::filter_string_var( $_POST[$var_name] ); } else { $result = 1; } } break; } case 'request': { if ( isset( $_REQUEST[$var_name] ) ) { $result = self::filter_string_var( $_REQUEST[$var_name] ); } break; } default: { $result = -1; // Wrong request type value, possible mistake in a function call } } if ( $result ) { if ( $var_type == 'int' && !is_numeric( $result ) ) { $result = 0; } if ( $var_type != 'int') { $result = esc_attr( $result ); } } return $result; } // end of get_request_var() /** * returns option value for option with name in $option_name */ public function get_option( $option_name, $default = false ) { if ( isset( $this->options[$option_name] ) ) { $value = $this->options[$option_name]; } else { $value = $default; } $value = apply_filters('ure_get_option_'. $option_name, $value ); return $value; } // end of get_option() /** * puts option value according to $option_name option name into options array property */ public function put_option( $option_name, $option_value, $flush_options = false ) { if ( !is_array( $this->options ) ) { $this->options = array(); } $this->options[$option_name] = $option_value; if ( $flush_options ) { $this->flush_options(); } } // end of put_option() /** * Delete URE option with name option_name * @param string $option_name * @param bool $flush_options */ public function delete_option( $option_name, $flush_options = false ) { if ( array_key_exists( $option_name, $this->options ) ) { unset( $this->options[$option_name] ); if ( $flush_options ) { $this->flush_options(); } } } // end of delete_option() /** * Saves options array into WordPress database wp_options table */ public function flush_options() { update_option( $this->options_id, $this->options ); } // end of flush_options() /** * Check product version and stop execution if product version is not compatible with required one * @param string $version1 * @param string $version2 * @param string $error_message * @return void */ public static function check_version( $version1, $version2, $error_message, $plugin_file_name ) { if ( version_compare($version1, $version2, '<') ) { if ( is_admin() && ( !defined('DOING_AJAX') || !DOING_AJAX ) ) { require_once ABSPATH . '/wp-admin/includes/plugin.php'; deactivate_plugins( $plugin_file_name ); new URE_Admin_Notice('warning', $error_message ); return false; } } return true; } // end of check_version() public function get_current_url() { global $wp; $current_url = esc_url_raw( add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) ); return $current_url; } // end of get_current_url() /** * Returns comma separated list from the first $items_count element of $full_list array * * @param array $full_list * @param int $items_count * @return string */ public function get_short_list_str( $full_list, $items_count=3 ) { if ( empty( $full_list ) || !is_array( $full_list ) ) { return '...'; } $short_list = array(); $i = 0; foreach($full_list as $item) { if ( $i>=$items_count ) { break; } $short_list[] = $item; $i++; } $str = implode(', ', $short_list ); if ( $items_countprepare( $str, $list_values ); return $result; } // end of esc_sql_in_list() /** * Returns the array of multi-site WP sites/blogs IDs for the current network * @global wpdb $wpdb * @return array */ public function get_blog_ids() { global $wpdb; if ( !$this->multisite ) { return null; } $network = get_current_site(); $query = $wpdb->prepare( "SELECT blog_id FROM {$wpdb->blogs} WHERE site_id=%d ORDER BY blog_id ASC", array( $network->id ) ); $blog_ids = $wpdb->get_col( $query ); return $blog_ids; } // end of get_blog_ids() /** * Prevent cloning of the instance of the *Singleton* instance. * * @return void */ public function __clone() { throw new \Exception('Do not clone a singleton instance.'); } // end of __clone() /** * Prevent unserializing of the *Singleton* instance. * * @return void */ public function __wakeup() { throw new \Exception('Do not unserialize a singleton instance.'); } // end of __wakeup() } // end of URE_Base_Lib class includes/classes/view.php000064400000033560150212007360011475 0ustar00 * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya **/ class URE_View { protected $lib = null; protected $editor = null; public function __construct() { $this->lib = URE_Lib::get_instance(); $this->editor = URE_Editor::get_instance(); } // end of __construct() public function display() {} public function toolbar() {} /** * display opening part of the HTML box with title and CSS style * * @param string $title * @param string $style */ public function display_box_start($title, $style = '') { ?>

get_groups_tree(); $output = '
    '. PHP_EOL; foreach($groups_list as $group_id=>$group) { if ($group_id=='all') { $spacer = ''; $subgroup = ''; } else { $spacer = 'style="padding-left: '. 15*$group['level'] .'px"'; $subgroup = '- '; } $output .= '
  • ' . $subgroup . $group['caption'] .'
  • '. PHP_EOL; } $output .= '
'. PHP_EOL; echo $output; } // end of show_caps_groups() private function deprecated_show_and_color($cap_id, $builtin_wp_caps, &$label_style, &$hidden_class) { if ( isset( $builtin_wp_caps[$cap_id] ) && is_array( $builtin_wp_caps[$cap_id] ) && in_array('deprecated', $builtin_wp_caps[$cap_id] ) ) { $show_deprecated_caps = $this->editor->get('show_deprecated_caps'); if (!$show_deprecated_caps) { $hidden_class = 'hidden'; } $label_style = 'style="color:#BBBBBB;"'; } } // end of deprecated_show_and_color() private function blocked_for_single_admin_style($cap_id, &$label_style) { $blocked = false; $multisite = $this->lib->get('multisite'); if ($multisite && $this->editor->block_cap_for_single_admin($cap_id, true)) { if ($this->lib->is_super_admin()) { if (!is_network_admin()) { $label_style = 'style="color: red;"'; } } else { $blocked = true; } } return $blocked; } // end of blocked_for_single_admin_style() // Get full capabilities list and exclude Visual Composer capabilities from it // Do not take VC capabilities into account as VC stores not boolean values with them protected function get_full_capabilities() { $full_caps = $this->editor->get('full_capabilities'); foreach($full_caps as $key=>$capability) { if (strpos($key, 'vc_access_rules_')!==false) { unset($full_caps[$key]); } } return $full_caps; } // end of get_full_capabilities() /* * Output HTML-code for capabilities list * Used build output for response to AJAX request * @param boolean $for_role - if true, it is role capabilities list, else - user specific capabilities list * @param boolean $edit_mode - if false, capabilities checkboxes are shown as disable - readonly mode */ public function _show_capabilities( $for_role = true, $edit_mode=true ) { $onclick_for_admin = ''; $multisite = $this->lib->get( 'multisite' ); $current_role = $this->editor->get( 'current_role' ); $user_to_edit = $this->editor->get( 'user_to_edit' ); $roles = $this->editor->get( 'roles' ); $full_capabilities = $this->get_full_capabilities(); $built_in_wp_caps = $this->lib->get_built_in_wp_caps(); $caps_readable = $this->editor->get( 'caps_readable' ); $caps_groups_manager = URE_Capabilities_Groups_Manager::get_instance(); $key_capability = URE_Own_Capabilities::get_key_capability(); $user_is_ure_admin = current_user_can( $key_capability ); $ure_caps = URE_Own_Capabilities::get_caps(); $output = ''; foreach ($full_capabilities as $capability) { $cap_id = $capability['inner']; if (!$user_is_ure_admin) { if (isset($ure_caps[$cap_id]) || ($multisite && $cap_id=='manage_network_plugins')) { // exclude URE caps if user does not have full access to URE continue; } } $label_style = ''; $hidden_class = ''; $this->deprecated_show_and_color($cap_id, $built_in_wp_caps, $label_style, $hidden_class); $blocked = $this->blocked_for_single_admin_style($cap_id, $label_style); $classes = array('ure-cap-div'); if ($blocked) { $classes[] = 'blocked'; $hidden_class = 'hidden'; } if ($hidden_class) { $classes[] = $hidden_class; } $cap_groups = $caps_groups_manager->get_cap_groups($cap_id, $built_in_wp_caps); $classes = ure_array_merge( $classes, $cap_groups ); $checked = ''; $disabled = ''; if ($for_role) { if (isset($roles[$current_role]['capabilities'][$cap_id]) && !empty($roles[$current_role]['capabilities'][$cap_id])) { $checked = 'checked="checked"'; } } else { if (empty($edit_mode)) { $disabled = 'disabled="disabled"'; } else { $disabled = ''; } if ($this->editor->user_can($cap_id)) { $checked = 'checked="checked"'; if (!isset($user_to_edit->caps[$cap_id])) { $disabled = 'disabled="disabled"'; } } } $class = 'class="' . implode(' ', $classes) .'"'; $cap_id_esc = URE_Capability::escape($cap_id); $cap_html = '
'; if ($caps_readable) { $cap_ind = 'human'; $cap_ind_alt = 'inner'; } else { $cap_ind = 'inner'; $cap_ind_alt = 'human'; } $cap_html .= '
'; $output .= $cap_html; } return $output; } // end of _show_capabilities() /** * Output HTML-code for capabilities list * Used to built full page output for usual HTTP request * @param boolean $for_role - if true, it is role capabilities list, else - user specific capabilities list * @param boolean $edit_mode - if false, capabilities checkboxes are shown as disable - readonly mode */ public function show_capabilities( $for_role = true, $edit_mode=true ) { $output = '
' . '
'; $output .= $this->_show_capabilities( $for_role, $edit_mode ); $output .= '
' ; echo $output; } // end of show_capabilities() // content of User Role Editor Pro advertisement slot - for direct call public function advertise_pro() { ?> advert = new URE_Advertisement(); $this->advert->display(); } // end of advertisement() public static function output_confirmation_dialog() { ?>
lib->get('multisite'); $current_role = $this->editor->get('current_role'); $show = true; if ($multisite) { if ($current_role=='administrator' && !$this->lib->is_super_admin()) { $show = false; } } elseif ($current_role=='administrator') { $show = false; } return $show; } // end of show_select_all() public function display_caps($for_role = true, $edit_mode=true) { $caps_columns_quant = $this->editor->get('caps_columns_quant'); ?>
(/)
show_select_all()) { ?>
       
 
show_caps_groups(); ?> show_capabilities($for_role, $edit_mode); ?> toolbar(); ?>
* @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya **/ class URE_Woocommerce_Capabilities { public static $post_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook', 'product_variation', 'shop_order_refund'); private static $capability_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook'); public static function add_group_to_caps(&$caps, $post_type, $group) { $post_types = $post_type .'s'; $caps['edit_'. $post_types][] = $group; $caps['edit_others_'. $post_types][] = $group; $caps['publish_'. $post_types][] = $group; $caps['read_private_'. $post_types][] = $group; $caps['delete_'. $post_types][] = $group; $caps['delete_private_'. $post_types][] = $group; $caps['delete_published_'. $post_types][] = $group; $caps['delete_others_'. $post_types][] = $group; $caps['edit_private_'. $post_types][] = $group; $caps['edit_published_'. $post_types][] = $group; } // end of add_group_to_caps() private static function add_base_caps(&$caps, $group, $subgroup, $cap_type) { $cap_types = $cap_type .'s'; $caps['edit_'. $cap_type] = array('custom', 'custom_post_types', $group, $subgroup, $cap_type); $caps['read_'. $cap_type] = array('custom', 'custom_post_types', $group, $subgroup, $cap_type); $caps['delete_'. $cap_type] = array('custom', $group, $subgroup, $cap_type); $caps['edit_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['edit_others_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['publish_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['read_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['delete_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['delete_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['delete_published_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['delete_others_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['edit_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); $caps['edit_published_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); } // end of add_base_caps() /** * Returns full list of WooCommerce plugin user capabilities */ public static function get_caps_groups() { $caps = array( 'manage_woocommerce'=>array('custom', 'woocommerce', 'woocommerce_core'), 'view_woocommerce_reports'=>array('custom', 'woocommerce', 'woocommerce_core'), 'view_admin_dashboard'=>array('custom', 'woocommerce', 'woocommerce_core') ); // code was built on the base of woocommerce/includes/class-wc-install.php method WC_Install::get_core_capabilities() $group = 'woocommerce'; foreach (self::$capability_types as $cap_type) { $subgroup = $group .'_'. $cap_type; self::add_base_caps($caps, $group, $subgroup, $cap_type); $caps['manage_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); $caps['edit_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); $caps['delete_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); $caps['assign_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); } $pto1 = get_post_type_object('product_variation'); if (empty($pto1) || $pto1->capability_type === 'product') { // default, not redefined by some plugin // add capabilities group for the product_variation custom post type self::add_group_to_caps($caps, 'product', 'woocommerce_product_variation'); self::add_group_to_caps($caps, 'product', 'product_variation'); } else { $cap_type = 'product_variation'; $subgroup = $group .'_'. $cap_type; self::add_base_caps($caps, $group, $subgroup, $cap_type); } $pto2 = get_post_type_object('shop_order_refund'); if (empty($pto2) || $pto2->capability_type === 'shop_order') { // default, not redefined by some plugin // add capabilities group for the shop_order_refund custom post type self::add_group_to_caps($caps, 'shop_order', 'woocommerce_shop_order_refund'); self::add_group_to_caps($caps, 'shop_order', 'shop_order_refund'); } else { $cap_type = 'shop_order_variant'; $subgroup = $group .'_'. $cap_type; self::add_base_caps($caps, $group, $subgroup, $cap_type); } return $caps; } // end of get() /** * This custom post types use capabilities from the other custom post types * So we should define capabilities set for them manually * @return array() */ public static function get_post_types_without_caps() { $pt_without_caps = array(); $pto1 = get_post_type_object('product_variation'); if (!empty($pto1) && $pto1->capability_type === 'product') { $pt_without_caps[] = $pto1->name; } $pto2 = get_post_type_object('shop_order_refund'); if (!empty($pto2) && $pto2->capability_type === 'shop_order') { $pt_without_caps[] = $pto2->name; } return $pt_without_caps; } // end of get_post_types_without_caps() } // end of URE_Woocommerce_Capabilities classincludes/classes/known-js-css-compatibility-issues.php000064400000005134150212007360017233 0ustar00registered['admin-page-css'])) { wp_deregister_style('admin-page-css'); } } // end of unload_conflict_plugins_css() } // end of URE_Fix_Known_JS_CSS_Compatibility_Issuesincludes/classes/uninstall.php000064400000005171150212007360012531 0ustar00lib = URE_Lib::get_instance(); $this->init_options_list(); $this->own_caps = array_keys( URE_Own_Capabilities::get_caps() ); } // end of __construct() protected function init_options_list() { $this->options = array(); $this->options[] = 'ure_caps_readable'; $this->options[] = 'ure_show_deprecated_caps'; $this->options[] = 'ure_hide_pro_banner'; $this->options[] = 'ure_role_additional_options_values'; $this->options[] = 'ure_task_queue'; $this->options[] = 'user_role_editor'; } // end fo init_options_list() private function delete_options() { global $wpdb; $backup_option_name = $wpdb->prefix . 'backup_user_roles'; delete_option( $backup_option_name ); foreach ( $this->options as $option_name ) { delete_option( $option_name ); } } // end of delete_options() private function delete_caps() { $wp_roles = wp_roles(); if ( $wp_roles->use_db ) { $wp_roles->use_db = false; // minimize database update requests $use_db = true; } else { $use_db = false; } foreach( $wp_roles->roles as $role_id=>$role ) { foreach( $this->own_caps as $cap ) { if ( isset( $role['capabilities'][ $cap ]) ) { $wp_roles->remove_cap( $role_id, $cap ); } } } if ( $use_db ) { // save changes to the database $wp_roles->add_cap( 'subscriber', 'dummy_cap' ); $wp_roles->use_db = true; // restore original value $wp_roles->remove_cap( 'subscriber', 'dummy_cap' ); } } // end of delete_caps() public function act() { global $wpdb; if ( !is_multisite() ) { $this->delete_options(); $this->delete_caps(); } else { $old_blog = $wpdb->blogid; $blog_ids = $this->lib->get_blog_ids(); foreach ( $blog_ids as $blog_id ) { switch_to_blog( $blog_id ); $this->delete_options(); $this->delete_caps(); } $this->lib->restore_after_blog_switching( $old_blog ); } } // end of act() } // end of class URE_Uninstall includes/classes/admin-notice.php000064400000001501150212007360013060 0ustar00message = $message; $this->message_class = $message_class; add_action('admin_notices', array($this, 'render') ); } // end of __construct() public function render() { printf('

%s

', $this->message_class, $this->message ); } // end of render() } // end of class URE_Admin_Notice includes/classes/capabilities-groups-manager.php000064400000043414150212007360016100 0ustar00 * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya **/ class URE_Capabilities_Groups_Manager { private static $instance = null; private $lib = null; private $groups = null; private $built_in_wp_caps = null; private $cpt_caps = null; public static function get_instance() { if (self::$instance === null) { // new static() will work too self::$instance = new URE_Capabilities_Groups_Manager(); } return self::$instance; } // end of get_instance() private function __construct() { $this->lib = URE_Lib::get_instance(); $this->_get_built_in_wp_caps(); $this->_get_all_custom_post_types_caps(); } // end of __construct() public function add_custom_post_types() { $this->groups['custom_post_types'] = array( 'caption'=>esc_html__('Custom Post Types', 'user-role-editor'), 'parent'=>'all', 'level'=>1 ); $post_types = get_post_types( array(), 'objects'); $_post_types = $this->lib->_get_post_types(); $built_in_pt = array('post', 'page'); if ( $post_types['attachment']->cap->edit_posts=='edit_posts') { $built_in_pt[] = 'attachment'; } $show_wc_post_types_under_wc_only = apply_filters('ure_show_wc_post_types_under_wc_only', false); foreach( $post_types as $post_type ) { if ( !isset( $_post_types[$post_type->name] ) || in_array( $post_type->name, $built_in_pt ) ) { continue; } if ( $show_wc_post_types_under_wc_only && in_array( $post_type->name, URE_Woocommerce_Capabilities::$post_types ) ) { continue; } /* if (!$post_type->public) { continue; } * */ $this->groups[$post_type->name] = array( 'caption'=>$post_type->labels->name, 'parent'=>'custom_post_types', 'level'=>2 ); } } // end of add_custom_post_types() private function add_ure_group() { $this->groups['user_role_editor'] = array( 'caption'=>esc_html__('User Role Editor', 'user-role-editor'), 'parent'=>'custom', 'level'=>2 ); } // end of get_ure_group() private function add_woocommerce_groups() { $full_caps = $this->lib->init_full_capabilities( 'role' ); if ( !isset( $full_caps['manage_woocommerce'] ) ) { return; } $post_types = get_post_types( array(), 'objects'); $this->groups['woocommerce'] = array( 'caption'=>esc_html__('WooCommerce', 'user-role-editor'), 'parent'=>'custom', 'level'=>2 ); $this->groups['woocommerce_core'] = array( 'caption'=>esc_html__('Core', 'user-role-editor'), 'parent'=>'woocommerce', 'level'=>3 ); foreach( URE_Woocommerce_Capabilities::$post_types as $post_type ) { if ( !isset( $post_types[$post_type] ) ) { continue; } $this->groups['woocommerce_'. $post_type] = array( 'caption'=>$post_types[$post_type]->labels->name, 'parent'=>'woocommerce', 'level'=>3 ); } } // end of add_woocommerce_group() private function get_base_wp_groups() { $groups = array( 'all'=>array( 'caption'=>esc_html__('All', 'user-role-editor'), 'parent'=>null, 'level'=>0 ), 'core'=>array( 'caption'=>esc_html__('Core', 'user-role-editor'), 'parent'=>'all', 'level'=>1 ), 'general'=>array( 'caption'=>esc_html__('General', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ), 'themes'=>array( 'caption'=>esc_html__('Themes', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ), 'posts'=>array( 'caption'=>esc_html__('Posts', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ), 'pages'=>array( 'caption'=>esc_html__('Pages', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ), 'plugins'=>array( 'caption'=>esc_html__('Plugins', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ), 'users'=>array( 'caption'=>esc_html__('Users', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ) ); return $groups; } // end of get_base_wp_groups public function get_groups_tree() { if ($this->groups!==null) { return $this->groups; } $this->groups = $this->get_base_wp_groups(); $multisite = $this->lib->get('multisite'); if ( $multisite ) { $this->groups['multisite'] = array( 'caption'=>esc_html__('Multisite', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ); } $this->groups['deprecated'] = array( 'caption'=>esc_html__('Deprecated', 'user-role-editor'), 'parent'=>'core', 'level'=>2 ); $this->add_custom_post_types(); $this->groups['custom'] = array( 'caption'=>esc_html__('Custom capabilities', 'user-role-editor'), 'parent'=>'all', 'level'=>1 ); $this->add_ure_group(); $this->add_woocommerce_groups(); $this->groups = apply_filters('ure_capabilities_groups_tree', $this->groups); return $this->groups; } // end of get_groups_tree() /** * return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php) * * @return array */ private function _get_built_in_wp_caps() { $wp_version = get_bloginfo('version'); $multisite = $this->lib->get('multisite'); $caps = array(); $caps['switch_themes'] = array('core', 'themes'); $caps['edit_themes'] = array('core', 'themes'); $caps['activate_plugins'] = array('core', 'plugins'); $caps['edit_plugins'] = array('core', 'plugins'); $caps['edit_users'] = array('core', 'users'); $caps['edit_files'] = array('core', 'deprecated'); $caps['manage_options'] = array('core', 'general'); $caps['moderate_comments'] = array('core', 'posts', 'general'); $caps['manage_categories'] = array('core', 'posts', 'general'); $caps['manage_links'] = array('core', 'general'); $caps['upload_files'] = array('core', 'general'); $caps['import'] = array('core', 'general'); $caps['unfiltered_html'] = array('core','general'); if ( $multisite ) { $caps['unfiltered_html'] = array('deprecated'); } $caps['edit_posts'] = array('core', 'posts'); $caps['edit_others_posts'] = array('core', 'posts'); $caps['edit_published_posts'] = array('core', 'posts'); $caps['publish_posts'] = array('core', 'posts'); $caps['edit_pages'] = array('core', 'pages'); $caps['read'] = array('core', 'general'); $caps['level_10'] = array('core', 'deprecated'); $caps['level_9'] = array('core', 'deprecated'); $caps['level_8'] = array('core', 'deprecated'); $caps['level_7'] = array('core', 'deprecated'); $caps['level_6'] = array('core', 'deprecated'); $caps['level_5'] = array('core', 'deprecated'); $caps['level_4'] = array('core', 'deprecated'); $caps['level_3'] = array('core', 'deprecated'); $caps['level_2'] = array('core', 'deprecated'); $caps['level_1'] = array('core', 'deprecated'); $caps['level_0'] = array('core', 'deprecated'); $caps['edit_others_pages'] = array('core', 'pages'); $caps['edit_published_pages'] = array('core', 'pages'); $caps['publish_pages'] = array('core', 'pages'); $caps['delete_pages'] = array('core', 'pages'); $caps['delete_others_pages'] = array('core', 'pages'); $caps['delete_published_pages'] = array('core', 'pages'); $caps['delete_posts'] = array('core', 'posts'); $caps['delete_others_posts'] = array('core', 'posts'); $caps['delete_published_posts'] = array('core', 'posts'); $caps['delete_private_posts'] = array('core', 'posts'); $caps['edit_private_posts'] = array('core', 'posts'); $caps['read_private_posts'] = array('core', 'posts'); $caps['delete_private_pages'] = array('core', 'pages'); $caps['edit_private_pages'] = array('core', 'pages'); $caps['read_private_pages'] = array('core', 'pages'); $caps['unfiltered_upload'] = array('core', 'general'); $caps['edit_dashboard'] = array('core', 'general'); $caps['update_plugins'] = array('core', 'plugins'); $caps['delete_plugins'] = array('core', 'plugins'); $caps['install_plugins'] = array('core', 'plugins'); $caps['update_themes'] = array('core', 'themes'); $caps['install_themes'] = array('core', 'themes'); $caps['update_core'] = array('core', 'general'); $caps['list_users'] = array('core', 'users'); $caps['remove_users'] = array('core', 'users'); if ( version_compare( $wp_version, '4.4', '<') ) { $caps['add_users'] = array('core', 'users'); // removed from WP v. 4.4. } $caps['promote_users'] = array('core', 'users'); $caps['edit_theme_options'] = array('core', 'themes'); $caps['delete_themes'] = array('core', 'themes'); $caps['export'] = array('core', 'general'); $caps['delete_users'] = array('core', 'users'); $caps['create_users'] = array('core', 'users'); if ( $multisite ) { $caps['create_sites'] = array('core', 'multisite', 'general'); $caps['delete_sites'] = array('core', 'multisite', 'general'); $caps['manage_network'] = array('core', 'multisite', 'general'); $caps['manage_sites'] = array('core', 'multisite', 'general'); $caps['manage_network_users'] = array('core', 'multisite', 'users'); $caps['manage_network_plugins'] = array('core', 'multisite', 'plugins'); $caps['manage_network_themes'] = array('core', 'multisite', 'themes'); $caps['manage_network_options'] = array('core', 'multisite', 'general'); $caps['upgrade_network'] = array('core', 'multisite', 'general'); } $caps['install_languages'] = array('core', 'general'); $caps['resume_plugins'] = array('core', 'plugins'); $caps['resume_themes'] = array('core', 'themes'); $caps['view_site_health_checks'] = array('core', 'general'); $caps = apply_filters('ure_built_in_wp_caps', $caps ); $this->built_in_wp_caps = $caps; return $this->built_in_wp_caps; } // end of _get_built_in_wp_caps() public function get_built_in_wp_caps() { return $this->built_in_wp_caps; } // end of get_built_in_wp_caps() private function get_post_types_without_caps() { $pt_without_caps = array(); $wc_pts = URE_Woocommerce_Capabilities::get_post_types_without_caps(); $pt_without_caps = ure_array_merge( $pt_without_caps, $wc_pts ); return $pt_without_caps; } // end of get_post_types_without_caps() /** * Get capabilities registered with custom post type * * @param object $post_type * @param array $post_edit_caps */ private function get_registered_cpt_caps( $post_type, $post_edit_caps ) { foreach ( $post_edit_caps as $capability ) { if ( isset( $post_type->cap->$capability ) ) { $cap = $post_type->cap->$capability; } else { continue; } if ( !isset( $this->cpt_caps[$cap] ) ) { $this->cpt_caps[$cap] = array(); } else if ( in_array( $post_type->name, $this->cpt_caps[$cap] ) ) { continue; } if ( !isset($this->built_in_wp_caps[$cap]) && !in_array( 'custom', $this->cpt_caps[$cap] ) ) { $this->cpt_caps[$cap][] = 'custom'; } if ( !in_array( 'custom_post_types', $this->cpt_caps[$cap] ) ) { $this->cpt_caps[$cap][] = 'custom_post_types'; } $this->cpt_caps[$cap][] = $post_type->name; } } // end of get_registered_cpt_caps() private function add_group_to_edit_post_cap( $post_type, $post_edit_caps ) { foreach( $post_edit_caps as $cap_id ) { $this->built_in_wp_caps[$cap_id][] = $post_type->name; if ( !in_array('custom_post_types', $this->built_in_wp_caps[$cap_id] ) ) { $this->built_in_wp_caps[$cap_id][] = 'custom_post_types'; } } } // end of add_group_to_edit_post_cap() private function get_custom_post_type_caps( $post_type, $post_edit_caps ) { $pt_without_caps = $this->get_post_types_without_caps(); if ( in_array($post_type->name, $pt_without_caps ) ) { return; } // take into account custom post types, which uses built-in post or page capabilities if ( in_array( $post_type->capability_type, array('post', 'page') ) ) { $this->add_group_to_edit_post_cap( $post_type, $post_edit_caps ); return; } $this->get_registered_cpt_caps( $post_type, $post_edit_caps ); } // end of get_custom_post_type_caps() private function _get_all_custom_post_types_caps() { $post_edit_caps = $this->lib->get_edit_post_capabilities(); $post_types = get_post_types( array(), 'objects' ); $_post_types = $this->lib->_get_post_types(); $built_in_pt = array('post', 'page'); if ( $post_types['attachment']->cap->edit_posts=='edit_posts') { $built_in_pt[] = 'attachment'; } $this->cpt_caps = array(); foreach( $post_types as $post_type ) { if ( !isset( $_post_types[$post_type->name] ) ) { continue; } if ( in_array( $post_type->name, $built_in_pt ) ) { continue; } if ( !isset( $post_type->cap ) ) { continue; } $this->get_custom_post_type_caps( $post_type, $post_edit_caps ); } return $this->cpt_caps; } // end of _get_all_custom_post_types_capabilities() private function get_groups_for_custom_cap( $cap_id ) { $ure_caps = URE_Own_Capabilities::get_caps_groups(); if ( isset( $ure_caps[$cap_id] ) ) { $groups1 = $ure_caps[$cap_id]; } if ( empty( $groups1 ) ) { $wc_caps = URE_Woocommerce_Capabilities::get_caps_groups(); if ( isset($wc_caps[$cap_id] ) ) { $groups1 = $wc_caps[$cap_id]; } } if ( isset( $this->cpt_caps[$cap_id] ) ) { $groups2 = $this->cpt_caps[$cap_id]; } $groups = array('custom'); if ( !empty( $groups1 ) ) { $groups = ure_array_merge( $groups, $groups1 ); } if ( !empty( $groups2 ) ) { $groups = ure_array_merge( $groups, $groups2 ); } return $groups; } // end of get_groups_for_custom_cap() public function get_cap_groups( $cap_id, $built_in_wp_caps=null ) { if ( isset( $this->built_in_wp_caps[$cap_id] ) ) { $groups = $built_in_wp_caps[$cap_id]; } else { $groups = $this->get_groups_for_custom_cap( $cap_id ); } $groups = apply_filters('ure_custom_capability_groups', $groups, $cap_id ); $groups[] = 'all'; // Every capability belongs to the 'all' group $groups = array_unique( $groups ); foreach( $groups as $key=>$value ) { $groups[$key] = 'ure-'. $value; } return $groups; } // end of get_cap_groups() /** * Prevent cloning of the instance of the *Singleton* instance. * * @return void */ public function __clone() { throw new \Exception('Do not clone a singleton instance.'); } // end of __clone() /** * Prevent unserializing of the *Singleton* instance. * * @return void */ public function __wakeup() { throw new \Exception('Do not unserialize a singleton instance.'); } // end of __wakeup() } // end of class URE_Capabilities_Groups_Managerincludes/classes/user-view.php000064400000020141150212007360012440 0ustar00 * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya **/ class URE_User_View extends URE_View { private $user_to_edit = null; public function __construct() { parent::__construct(); $this->user_to_edit = $this->editor->get('user_to_edit'); } // end of __construct() public function display_edit_dialogs() { } // end of display_edit_dialogs() /** * output HTML code to create URE toolbar * * @param boolean $role_delete * @param boolean $capability_remove */ public function toolbar() { ?>
user_to_edit->ID}", "ure_user_{$this->user_to_edit->ID}") . '" >'; $anchor_end = ''; if (class_exists('user_switching') && current_user_can('switch_to_user', $this->user_to_edit->ID)) { $switch_to_user_link = user_switching::switch_to_url($this->user_to_edit); $switch_to_user = '' . esc_html__('Switch To', 'user-role-editor') . ''; } } else { $anchor_start = ''; $anchor_end = ''; } $user_info = ' ' . $anchor_start . $this->user_to_edit->user_login; if ($this->user_to_edit->display_name !== $this->user_to_edit->user_login) { $user_info .= ' (' . $this->user_to_edit->display_name . ')'; } $user_info .= $anchor_end . ''; if (is_multisite() && $this->lib->is_super_admin($this->user_to_edit->ID)) { $user_info .= ' ' . esc_html__('Network Super Admin', 'user-role-editor') . ''; } if (!empty($switch_to_user)) { $user_info .= '    ' . $switch_to_user; } return $user_info; } // end of get_user_info() public function show_primary_role_dropdown_list($user_roles) { ?> lib->show_admin_role_allowed(); $values = array_values($this->user_to_edit->roles); $primary_role = array_shift($values); // get 1st element from roles array // Is PolyLang plugin active? $use_pll = function_exists('pll__'); $roles = $this->editor->get('roles'); foreach ($roles as $role_id => $role) { if (($show_admin_role || $role_id != 'administrator') && ($role_id !== $primary_role)) { if ( $this->editor->user_can( $role_id ) ) { $checked = 'checked="checked"'; } else { $checked = ''; } $role_name = $use_pll ? pll__( $role['name'] ) : $role['name']; echo '
'; } } } // end of show_secondary_roles() public function display() { $caps_readable = $this->editor->get('caps_readable'); $show_deprecated_caps = $this->editor->get('show_deprecated_caps'); $edit_user_caps_mode = $this->editor->get_edit_user_caps_mode(); $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); $user_info = $this->get_user_info(); $select_primary_role = apply_filters('ure_users_select_primary_role', true); ?>
  lib->is_super_admin() || !is_multisite() || !class_exists('User_Role_Editor_Pro') || !$caps_access_restrict_for_simple_admin) { if ($caps_readable) { $checked = 'checked="checked"'; } else { $checked = ''; } ?> onclick="ure_main.turn_caps_readable();" />     onclick="ure_turn_deprecated_caps(user_to_edit->ID; ?>);"/>
lib->is_super_admin()) { ?>
show_primary_role_dropdown_list($this->user_to_edit->roles); } if (function_exists('bbp_filter_blog_editable_roles') ) { // bbPress plugin is active ?>
user_to_edit->ID); if (!empty($bbp_user_role)) { echo $dynamic_roles[$bbp_user_role]['name']; } } ?>
show_secondary_roles(); ?>
display_caps(false, $edit_user_caps_mode ); ?>
get_request_var('show_admin_role', 'post', 'checkbox'); } $lib->put_option('show_admin_role', $show_admin_role); $caps_readable = $lib->get_request_var('caps_readable', 'post', 'checkbox'); $lib->put_option('ure_caps_readable', $caps_readable); $show_deprecated_caps = $lib->get_request_var('show_deprecated_caps', 'post', 'checkbox'); $lib->put_option('ure_show_deprecated_caps', $show_deprecated_caps); $confirm_role_update = $lib->get_request_var('confirm_role_update', 'post', 'checkbox'); $lib->put_option('ure_confirm_role_update', $confirm_role_update); $edit_user_caps = $lib->get_request_var('edit_user_caps', 'post', 'checkbox'); $lib->put_option('edit_user_caps', $edit_user_caps); $caps_columns_quant = (int) $lib->get_request_var('caps_columns_quant', 'post', 'int'); $lib->put_option('caps_columns_quant', $caps_columns_quant); do_action('ure_settings_update1'); $lib->flush_options(); $lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); } // end of update_general_options() /** * Update Additional Modules Options tab */ protected static function update_addons_options() { $lib = URE_Lib::get_instance(); $multisite = $lib->get('multisite'); if (!$multisite) { $count_users_without_role = $lib->get_request_var('count_users_without_role', 'post', 'checkbox'); $lib->put_option('count_users_without_role', $count_users_without_role); } do_action('ure_settings_update2'); $lib->flush_options(); $lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); } // end of update_addons_options() protected static function update_default_roles() { global $wp_roles; $lib = URE_Lib::get_instance(); // Primary default role $primary_default_role = $lib->get_request_var('default_user_role', 'post'); if (!empty($primary_default_role) && isset($wp_roles->role_objects[$primary_default_role]) && $primary_default_role !== 'administrator') { update_option('default_role', $primary_default_role); } // Other default roles $other_default_roles = array(); foreach($_POST as $key=>$value) { $prefix = substr($key, 0, 8); if ($prefix!=='wp_role_') { continue; } $role_id = substr($key, 8); if ($role_id!=='administrator' && isset($wp_roles->role_objects[$role_id])) { $other_default_roles[] = $role_id; } } // foreach() $lib->put_option('other_default_roles', $other_default_roles, true); $lib->show_message(esc_html__('Default Roles are updated', 'user-role-editor')); } // end of update_default_roles() protected static function update_multisite_options() { $lib = URE_Lib::get_instance(); $multisite = $lib->get('multisite'); if (!$multisite) { return; } $allow_edit_users_to_not_super_admin = $lib->get_request_var('allow_edit_users_to_not_super_admin', 'post', 'checkbox'); $lib->put_option('allow_edit_users_to_not_super_admin', $allow_edit_users_to_not_super_admin); do_action('ure_settings_ms_update'); $lib->flush_options(); $lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); } // end of update_multisite_options() protected static function tools_exec() { $lib = URE_Lib::get_instance(); $roles_reset = $lib->get_request_var( 'ure_reset_roles_exec', 'post', 'int'); if ( $roles_reset==1 ) { URE_Tools::reset_roles(); } else { do_action( 'ure_settings_tools_exec' ); } } //end of tools_exec() private static function controller() { $action = self::get_action(); switch ($action) { case 'ure_settings_update': self::update_general_options(); break; case 'ure_addons_settings_update': self::update_addons_options(); break; case 'ure_settings_ms_update': self::update_multisite_options(); break; case 'ure_default_roles_update': self::update_default_roles(); break; case 'ure_settings_tools_exec': self::tools_exec(); break; case 'show': default: ; } // switch() } // end of controller() public static function show_other_default_roles() { $lib = URE_Lib::get_instance(); $other_default_roles = $lib->get_option('other_default_roles', array()); $roles = $lib->get_editable_user_roles(); $wp_default_role = get_option('default_role'); foreach ($roles as $role_id => $role) { if ( $role_id=='administrator' || $role_id==$wp_default_role ) { continue; } if ( in_array( $role_id, $other_default_roles ) ) { $checked = 'checked="checked"'; } else { $checked = ''; } echo '
'; } } // end of show_other_default_roles() public static function get_settings_link() { $lib = URE_Lib::get_instance(); $multisite = $lib->get('multisite'); if ($multisite && is_network_admin()) { $link = 'settings.php'; } else { $link = 'options-general.php'; } return $link; } // end of get_settings_link(); public static function show() { $lib = URE_Lib::get_instance(); self::controller(); if (defined('URE_SHOW_ADMIN_ROLE') && (URE_SHOW_ADMIN_ROLE == 1)) { $show_admin_role = 1; } else { $show_admin_role = $lib->get_option('show_admin_role', 0); } $caps_readable = $lib->get_option('ure_caps_readable', 0); $show_deprecated_caps = $lib->get_option('ure_show_deprecated_caps', 0); $confirm_role_update = $lib->get_option('ure_confirm_role_update', 1); $edit_user_caps = $lib->get_option('edit_user_caps', 1); $caps_columns_quant = $lib->get_option('caps_columns_quant', 1); $multisite = $lib->get('multisite'); if ($multisite) { $allow_edit_users_to_not_super_admin = $lib->get_option('allow_edit_users_to_not_super_admin', 0); } else { $count_users_without_role = $lib->get_option('count_users_without_role', 0); } $view = new URE_Role_View(); $view->role_default_prepare_html(0); $ure_tab_idx = (int) $lib->get_request_var('ure_tab_idx', 'post', 'int'); do_action('ure_settings_load'); $link = self::get_settings_link(); $active_for_network = $lib->get('active_for_network'); $license_key_only = $multisite && is_network_admin() && !$active_for_network; require_once(URE_PLUGIN_DIR . 'includes/settings-template.php'); } // end of show() } // end of URE_Settings classincludes/index.php000064400000000034150212007360010163 0ustar00

changelog.txt000064400000233313150212007360007235 0ustar00CHANGES LOG (full version). =========================== = [4.64.5] 16.04.2025 = * Update: Marked as compatible with WordPress 6.8 * Update: Minor changes were applied to the CSS/JS loading code to minimize "Plugin Check" tool warnings. * Plugin headers were extended at role-editor.php and readme.txt files according to wordpress.org recommendations. = [4.64.4] 15.12.2024 = * Security Fix: Users - "Add Role", "Revoke Role" buttons: Cross-Site request forgery to privilege escalation was possible due to missed nonce validation. This issue was discovered and responsibly reported by vgo0. = [4.64.3] 03.12.2024 = * Update: Marked as compatible with WordPress 6.7.1 * Fix: PHP Notice: "Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the user-role-editor domain was triggered too early." was fixed (shown only for those who used own .mo translation file installed). * Fix: Miscellaneous translation functionality (l18n) usage enhancements were applied. = [4.64.2] 19.02.2024 = * Update: Marked as compatible with WordPress 6.4.3 * Update: URE_Advertisement: rand() is replaced with wp_rand(). * Update: URE_Ajax_Proccessor: json_encode() is replaced with wp_json_encode(). * Update: User_Role_Editor::load_translation(): load_plugin_textdomain() is called with the 2nd parameter value false, instead of deprecated ''. * Update: URE_Lib::is_right_admin_path(): parse_url() is replaced with wp_parse_url(). * Update: URE_Lib::user_is_admin() does not call WP_User::has_cap() to enhance performance. * Update: Plugin version was added to CSS loaded to the "Users", "Users->User Role Editor", "Settings->User Role Editor" pages. * Update: All JavaScript files are loaded in footer now. * Fix: "Users->Add New Users". Unneeded extra '
' HTML tags was removed (thanks to Alejandro A. for this bug report). = [4.64.1] 24.10.2023 = * Update: Marked as compatible with WordPress 6.4 * Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Creation of dynamic property URE_Editor::$hide_pro_banner is deprecated in /wp-content/plugins/user-role-editor/includes/classes/editor.php on line 166 * Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Creation of dynamic property URE_Role_View::$caps_to_remove is deprecated in /wp-content/plugins/user-role-editor/includes/classes/role-view.php on line 23 * Fix: Notice shown by PHP 8.3 is removed: PHP Deprecated: Function utf8_decode() is deprecated in /wp-content/plugins/user-role-editor-pro/includes/classes/editor.php on line 984 = [4.64] 08.08.2023 = * Update: "Show capabilities in human readable form" checkbox switches between capability 2 text forms without full page reloading using JavaScript. * Fix: Missed 'message' parameter was added to a response for AJAX request. It fixed the PHP Warning: Undefined array key "message" in expressions like "strpos( $data['message'], ... = [4.63.3] 12.03.2023 = * Fix: PHP version 8.2 showed warning: Creation of dynamic property User_Role_Editor::$settings_page_hook is deprecated : wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php:603 * Fix: PHP Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, int given in wp-content/plugins/user-role-editor/includes/classes/view.php:81 * Fix: PHP Parse error: syntax error, unexpected ‘:’, expecting ‘;’ or ‘{‘: wp-content/plugins/user-role-editor/includes/classes/base-lib.php on line 119, type declarations were removed for compatibility with older PHP versions. = [4.63.2] 16.12.2022 = * Update: symbols '{}$' are removed from capability name before use it for internal purpose, to exclude cases like when one of plugins broke URE work adding capability like 'edit_{$type}s'. * Update: array_merge() function is replaced with wrapper ure_array_merge(), to exclude fatal error: Argument #2 must be of type array. = [4.63.1] 20.09.2022 = * Marked as compatible with WordPress version 6.0.2 * Fix: PHP Warning: Attempt to read property “ID” on null in /wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php on line 369 * Fix: Deprecated: Automatic conversion of false to array is deprecated in ./includes/classes/base-lib.php on line 212 = [4.63] 11.07.2022 = * Update: Marked as compatible with WordPress 6.1 * Update: Few notices (e.g. "Constant FILTER_SANITIZE_STRING is deprecated") was fixed for better compatibility with PHP 8.1. * Update: URE does not try to deactivate itself in case another instance is active, just shows notice and stops execution. = [4.62] 05.05.2022 = * Update: Marked as compatible with WordPress 6.0 * New: It's possible to translate custom role names using [PolyLang](https://wordpress.org/plugins/polylang/) plugin. * Update: URE does not sort roles in WordPress dropdown lists. In order to sort roles by name return 'name' from 'ure_sort_wp_roles_list' filter. * Update: User capabilities view page minor CSS enhancements. * Update: Settings->About: "Donate" link was removed. = [4.61.2] 01.03.2022 = * Fix: "Users->Add New" page - other selected roles were not saved. * Update: URE uses WordPress notification styles for own operation result output. = [4.61.1] 25.01.2022 = * Update: Marked as compatible with WordPress 5.9. * Update: PHP 7.3 is marked as required. * Update: If installed PHP/WordPress version is lower than required one, script termination ( wp_die() ) was replaced with notice-warning admin notice output. = [4.61] 28.12.2021 = * Update: WordPress 4.4 is marked as required. * Update: PHP 7.4 is marked as required. * Update: "Settings->User Role Editor->Tools->Reset" button is additionally protected from the unintended/accidental usage by text input field. Manual input of "Permanently delete all custom user roles and capabilities" text is required to enable the "Reset" button. * Update: Partial code review and refactoring according with WordPress & PHP coding standards. * Fix: "Users->selected user->Capabilities" page: 'select all' checkbox did not work. = [4.60.2] 20.09.2021 = * Update: Marked as compatible with WordPress 5.8.1 * Fix: Multisite: URE_Editor::is_full_network_sync() returned FALSE, instead TRUE for the AJAX call, while call was made from the Network Admin (wp-admin/network/). = [4.60.1] 21.07.2021 = * Update: Marked as compatible with WordPress 5.8. * Fix: PHP Notice: Undefined property: URE_User_View::$multisite in /wp-content/plugins/user-role-editor/includes/classes/user-view.php on line 145 = [4.60] 24.06.2021 = * New: Notification box was replaced with one based on the [jpillora/nofifyjs](https://notifyjs.jpillora.com/) jQuery plugin. It does not move down page content. It disappears automatically after 5 seconds. Click on it to remove it manually. * Fix: "Add capability" shows warning styled notification when needed (invalid characters, etc.) instead of a successful one. * Fix: Capabilities group uncheck and revert selection is blocked for the administrator role to exclude accident deletion of permissions from it. = [4.59.1] 11.05.2021 = * New: Multisite: When update role at the main site with "Apply to all sites" option and PHP constant URE_MULTISITE_DIRECT_UPDATE === 1 (update roles directly in database, not via WordPress API), * URE overwrites all subsite roles with roles from the main site. It's possible now to leave selected role(s) for selected subsite(s) unchanged: add filter 'ure_network_update_leave_roles' and * return from it the array like this one - array( (int) blog_id => array('role_id1', 'role_id2', ... ); * Update: "Other roles" section at user profile is available now only for users with 'promote_users' capability. * Update: Notice at the top of URE page about action result is not removed automatically after 7 seconds as earlier. * Update: 'ure_sort_wp_roles_list' filter accepts these values for the single input parameter: false - leave roles list as it is; true, 'id' - sort roles list by role ID; 'name' - sort roles by role name. = [4.59] 02.04.2021 = * Update: PHP constant URE_WP_ADMIN_URL was replaced with direct 'admin_url()' call to respect the 'admin_url' filter applied by the get_admin_url() WordPress API function. * Update: Editing roles and capabilities granted to selected user ("Capabilities" link under user row at the "Users" list) executes 'add_user_role' or 'remove_user_role' actions only in case it really grants or revokes roles and/or capabilities. Previous versions fully revoked and granted again all roles during user permissions update even in case roles list was not changed. It was leaded to the false execution of the mentioned add/remove role actions. = [4.58.3] 26.02.2021 = * Update: URE automatically adds custom taxonomies user capabilities to administrator role before opening "Users->User Role Editor" page. * Fix: Role changes were not saved with option "Confirm role update" switched off. = [4.58.2] 15.01.2021 = * Fix: Additional options turned ON for a role was not saved during role update. * Update: All JavaScript files are loaded with URE plugin version number as a query string for cache busting purpose. = [4.58.1] 11.01.2021 = * Fix: User lost assigned role(s) after click "Update" at the user permissions page, opened via "Selected user->Capabilities" or "User Profile->Capabilities->Edit" link. = [4.58] 11.01.2021 = * Update: Users->User Role Editor: Update button saves changes via AJAX without full page reload. * Fix: New user registered via frontend (wp-login.php?action=register) automatically receives additional (other) default role(s) according to selection made at User Role Editor settings "Other default roles" tab. * Fix: "JQMIGRATE: jquery.fn.resize() event shorthand is deprecated" notice was fixed. * Fix: "JQMIGRATE: jQuery.fn.click() event shorthand is deprecated" notice was fixed. * Fix: "JQMIGRATE: Number-typed values are deprecated for jQuery.fn.css( (property name), value )" notice was fixed. = [4.57.1] 10.12.2020 = * Fix: Nextgen Gallery's user capabilities were not shown as granted after current role change via roles selection dropdown list. * Fix: PHP Warning: The magic method __wakeup() must have public visibility. __wakeup() method was defined as private as a part of the Singleton design partern. Method was redefined as public but with exception inside to prevent its usage. * Update: jQuery [MultiSelect](http://multiple-select.wenzhixin.net.cn/) plugin was updated to version 1.5.2 = [4.57] 09.11.2020 = * Update: Marked as compatible with WordPress 5.6. * Update: " jQuery( document ).ready( handler ) " was replaced globally with " jQuery( handler ) " for compatibility with [jQuery 3.0](https://api.jquery.com/ready/) and WordPress 5.6. * Update: jQuery UI CSS was updated to version 1.12.1 * Fix: "Grant Roles" button produced JavaScript error, if single user without any role granted (None) was selected. = [4.56.1] 05.09.2020 = * New: WordPress multisite: Main site: Users->User Role Editor->Apply to All->Update: 'ure_after_network_roles_update' action hook was added. It is executed after all roles were replicated from the main site to the all other subsites of the network. * Fix: "Granted Only" filter did not work. * Fix: Warning was fixed: wp-content/plugins/user-role-editor/js/ure.js: jQuery.fn.attr('checked') might use property instead of attribute. = [4.56] 09.08.2020 = * New: User capabilities 'install_languages', 'resume_plugins', 'resume_themes', 'view_site_health_checks' were added to the list of supported WordPress built-in user capabilities. * Update: Single site WordPress installation: URE automatically grants all existing user capabilities to WordPress built-in 'administrator' role before opening its page "Users->User Role Editor". * Fix: Extra slash was removed between URE_PLUGIN_URL and the image resource when outputting URE_PLUGIN_URL .'/images/ajax-loader.gif' at 'Users->User Role Editor' page. * Info: Marked as compatible with WordPress 5.5. = [4.55.1] 06.06.2020 = * Security fix: User with 'edit_users' capability could assign to another user a role not included into the editable roles list. This fix is required to install ASAP for all sites which have user(s) with 'edit_users' capability granted not via 'administrator' role. * Update: URE_Uninstall class properties were made 'protected' to be accessible in URE_Uninstall_Pro class included into the Pro version. = [4.55] 03.06.2020 = * Update: User Role Editor uninstallation was refactored. It fully removes the ('ure_%') user capabilities from the user roles data. = [4.54] 02.05.2020 = New: Quick filter hides capabilities, which do not contain search string Update: CSS enhancement: When site has many custom post types capabilities list section maximal height is limited by real height of the left side (capabilities groups) section, not by 720px as earlier. = [4.53.1] 22.03.2020 = * New: "Hide Pro banner" checkbox works via AJAX without full page refresh. * Fix: Undefined variable: $message at wp-content/plugins/user-role-editor/includes/classes/editor.php:898 * Update: Few English grammar enhancements. = [4.53] 01.02.2020 = * Update: "Add role", "Delete role", "Rename role", "Add capability", "Delete capability" do not reload full page on completion, but use AJAX for data exchange with server and refresh parts of the page via JavaScript. * Update: Multisite: "Allow non super administrators to create, edit, and delete users" option: priority for 'map_meta_cap' filter priority was raised from 1 to 99, in order make possible to overwrite changes made by other plugins, like WooCommerce. * Fix: Some English grammar mistakes. = [4.52.2] 26.12.2019 = * Fix: Custom capabilities for custom post types was not created by URE automatically since version 4.52.1. * Fix: 'administrator' role protection did not show to power users roles with 'administrator' word inside, like 'shop_administrator', etc. = [4.52.1] 11.11.2019 = * Update: URE requires PHP version 5.6. * ure_cpt_editor_roles filter was added. It takes 2 parameters: array $roles with 1 element 'administrator' by default and $post_type with post type name string. Add other role(s) to which you wish automatically add all user capabilities for custom post type $post_type. URE updates roles this way before opening "Users->User Role Editor" page. * New user capability 'ure_nav_menus_access' was added. It's used at the User Role Editor Pro only. = [4.52] 07.10.2019 = * New: Multisite: WordPress (tested up to version 5.2.3) shows "Change role to..." drop-down list at "Network Admin->Sites->selected site->Users tab" with roles filled from the main site, but should use roles list from the selected site. URE replaces this roles list with roles from the selected site and excludes error with message "Sorry, you are not allowed to give users that role.", when you try to grant to a user a role from the main site, which does not exist at the selected site. = [4.51.3] 02.09.2019 = * Fix: line #281 at /includes/classes/view.php contained a call to the not existing class property. * Fix: Roles have saved in alphabet order after any role update. Roles order in the database is not changed now. Sorting is made for a view purpose only. * Update: Roles sorting inside WordPress roles dropdown lists is switched OFF by default. In order to switch WP roles dropdown lists sorting ON, return TRUE from 'ure_sort_wp_roles_list' filter. = [4.51.2] 15.07.2019 = * Fix: Dialog button labels inside User Role Editor ('Cancel' buttons especially) were shown with not correct translation or not translated at all. Thanks to @lucaboccianti for [this bug report](https://wordpress.org/support/topic/buttons-delete-role-cancel-dont-delete-role-inverted-functions-italian/). * Update: Roles inside WordPress roles dropdown lists are sorted by alphabet. = [4.51.1] 15.06.2019 = * Fix: Superadmin could not revoke capabilities from 'administrator' role under WordPress multisite. = [4.51] 21.05.2019 = * New: Bulk actions were added to the Users page: "Add Role", "Revoke Role". Select role from the related drop-down menu and add/revoke it to/from the list of pre-selected users. * Update: Bulk grant roles feature ("Grant roles" button at the "Users" page) and Bulk grant role to users without role ("Without role" button at the "Users" page) are protected by 'promote_users' capability instead of 'edit_users', exactly the same way as WordPress itself does for its "Change role to". * Update: 'load-users.php' action is used instead of 'admin_init' to load support code for "Without role" and "Grant roles" button at the "Users" page. * Update: URE ignores now a capability without ID in case it was added to the database somehow (other plugin bug, etc.). Such incorrect empty capability is removed from the capabilities list as a result after any role update. = [4.50.2] 01.04.2019 = * Fix: WordPress multisite: PHP Notice "wpmu_new_blog is deprecated since version 5.1.0! Use wp_insert_site instead." was removed. URE uses 'wp_initialize_site' action now instead of deprecated 'wpmu_new_blog'. This fix provides correct roles replication from the main blog/site to a new created blog/site. = [4.50.1] 16.03.2019 = * Fix: WP Multisite: Users->Capabilities->Update: "Fatal error: Uncaught Error: Call to undefined method URE_Editor::check_blog_user() in /wp-content/plugins/user-role-editor/includes/classes/editor.php on line 576" was fixed. * Fix: WooCommerce group was not shown under "Custom capabilities" section. = [4.50] 20.02.2019 = * Update: General code restructure and optimization. * Update: URE_Base_Lib::get_blog_ids() returns null, if it's called under WordPress single site (not multisite). * Update: URE_Editor::prepare_capabilities_to_save() : "Invalid argument supplied for foreach()" warning was excluded in case there was no valid data structures initialization. * Update: 'administrator' role protection was enhanced. URE always does not allow to revoke capability from 'administrator' role. That was possible earlier after the 'administrator' role update. = [4.49] 15.01.2019 = * Update: Selected role ID was added to "Delete role" confirmation dialog. * Update: Method URE_Base_Lib::get_short_list_str() was enhanced. * Update: Method URE_Base_Lib::get_blog_ids() was made public. * Update: Method URE_Lib::get_usermeta_table_name() was excluded. * Fix: PHP warning "Undefined index:'unexisted role ID'" was fixed at URE_Lib::roles_text() (wp-content/plugins/user-role-editor/includes/classes/lib.php:360). * Fix: Bug was fixed with incorrect usage of transient for option "Show deprecated capabilities". = [4.48] 03.01.2019 = * Update: Multisite: Sites list is not requested from the database on every page opened in order to reduce server load. * Update: URE plugin version update routine is called now at the wp-admin backend only. * Update: Direct access to URE_Lib::bbpress property was excluded as a preparation to future code enhancements. = [4.47] 12.11.2018 = * Fix: "Users->User Role Editor": Capabilities view was not refreshed properly for new selected role in case "Granted Only" filter was turned ON before other role selection. * Update: Unused code was removed from user-role-editor/includes/classes/bbpress.php * Update: Prevent sudden revoke role 'administrator' from a user(s) during capability with the same ID ('administrator') deletion from roles. * Update: Adding custom capability with ID 'administrator' was prohibited. * Update: Marked as compatible with WordPress version 5.0 = [4.46] 20.09.2018 * Update: "Users" page, "Without role" button: underlying SQL queries were replaced with more robust versions (about 10 times faster). It is critical for sites with large quant of users.New query does not take into account though some cases with incorrect users data (usually imported from the external sources). It's possible to use older (comprehensive but slower) query version defining a PHP constant: "define('URE_COUNT_USERS_WITHOUT_ROLE_THOROUGHLY', true);" or return false from a custom 'ure_count_users_without_role_quick' filter. * Update: error checking was enhanced after default role change for the subsite under WordPress multisite. = [4.45] 18.08.2018 = * Fix: Capability checkbox was shown as turned ON incorrectly for not granted capability included into a role, JSON: "caps":{"sample_cap":"false"}. Bug took place after the changing a currently selected role. * Fix: Custom capabilities groups "User Role Editor" and "WooCommerce" were registered at the wrong 3rd tree level - changed to 2. = [4.44] 05.07.2018 = * Update: URE had executed 'profile_update' action after update of user permissions from the user permissions editor page: Users->selected user->Capabilities. It was replaced with 'ure_user_permissions_update' action now. It will allow to exclude conflicts with other plugins - "WP Members" [lost checkbox fields values](https://wordpress.org/support/topic/conflict-with-wp-members-2/), for example. * Update: Additional options for role (like "Hide admin bar" at the bottom of URE page) did not applied to the user with 'ure_edit_roles' capability. This conditon was removed. * Update: fix PHP notice 'Undefined offset: 0 in ...' at includes/classes/protect-admin.php, not_edit_admin(), where the 1st element of $caps array not always has index 0. * Update: PHP required version was increased up to 5.4. = [4.43] 05.06.2018 = * Update: references to non-existed roles are removed from the URE role additional options data storage after any role update. * Fix: Additional options section view for the current role was not refreshed properly after other current role selection. = [4.42] 16.05.2018 = * Fix: Type checking was added (URE_Lib::restore_visual_composer_caps()) to fix "Warning: Invalid argument supplied for foreach() in .../user-role-editor-pro/includes/classes/ure-lib.php on line 315". = [4.41] 07.05.2018 = * New: URE changes currently selected role via AJAX request, without full "Users->User Role Editor" page refresh. * Update: All [WPBakery Visual Composer](http://vc.wpbakery.com) plugin custom user capabilities (started from 'vc_access_rules_') were excluded from processing by User Role Editor. Visual Composer loses settings made via its own "Role Manager" after the role update by User Role Editor in other case. The reason - Visual Composer stores not boolean values with user capabilities granted to the roles via own "Role Manager". User Role Editor converted them to related boolean values during role(s) update. = [4.40.3] 05.04.2018 = * Update: bbPress detection and code for integration with it was updated to support multisite installations when URE is network activated but bbPress is activated on some sites of the network only. Free version does not support bbPress roles. It excludes them from processing as bbPress creates them dynamically. = [4.40.2] 04.04.2018 = * Update: Load required .php files from the active bbPress plugin directly, as in some cases URE code may be executed earlier than they are loaded by bbPress. = [4.40.1] 09.03.2018 = * Update: wp_roles() function (introduced with WP 4.3) was included conditionally to URE code for backward compatibility with WordPress 4.0+ * Fix: WordPress multisite: bbPress plugin detection code was changed from checking bbPress API function existence to checking WordPress active plugins list. bbPress plugin activated for the site was not available yet for the network activated User Role Editor at the point of URE instance creation. URE did not work with bbPress roles as it should by design for that reason. URE (free version) should ignore bbPress roles and capabilities as the special efforts are required for this. = [4.40] 31.01.2018 = * Update: use wp_roles() function from WordPress API instead of initializing $wp_roles global variable directly. * Fix: Bug was introduced by version 4.37 with users recalculation for "All" tab after excluding users with "administrator" role. Code worked incorrectly for Japanese locale. = [4.39] 19.12.2017 = * Update: Plugin settings management code moved to the separate URE_Settings class. * Update: 'create_posts', 'create_pages' user capabilities are not added by default to WordPress built-in capabilities groups as they are supported by the Pro version only. * Update: Type checking enhanced for values received from a user input and for variable arguments inside database queries. * Update: Own code to build usermeta db table name was excluded. A value from $wpdb->usermeta is used instead. = [4.38] 27.11.2017 = * Security: XSS vulnerability was fixed at URE's options page. Bug was discovered and fixed at tab index value numeric type checking. Tab index value is additionally escaped before output also. * Security: Deprecated code for debug output to the .log file in case of database query error was removed. * Security: Multiple select jQuery plugin (https://github.com/wenzhixin/multiple-select/) was updated to the latest available version 1.2.1, which fixed XSS vulnerability, existed in earlier versions. = [4.37] 01.11.2017 = * New: New option was added. It's possible to select permanent quant of capabilities columns at the "Settings->User Role Editor->General" tab. * Update: User capabilities are shown for custom post types which use the WordPress built-in 'post' or 'page' capability type. (0/0) was shown earlier instead of the quantity of user capabilities really used. * Update: Restriction was added for 'do_not_allow' user capability (used internally by WordPress). You can not add it manually. * Fix: URE hides users with 'administrator' role by default from any other user. Quantity of users of 'All' view (tab) at 'Users' page is decreased now for the quantity of hidden administrators. = [4.36.1] 02.10.2017 = * Update: Direct access to the global $current_user variable was excluded. Current user data is initialized via WordPress core functions wp_get_current_user() or get_current_user_id(). = [4.36] 19.09.2017 = * New: It's possible to set any URE's option value programmatically: use custom filter 'ure_get_option_'. It takes a single parameter with current/default value for required options. Full list of User Role Editor options is available here: https://www.role-editor.com/documentation/options-list * Update: Users page - Grant Roles. It's possible to change just "Other roles" for multiple users and leave their primary roles untouched. Just leave a "Primary role" field empty. If you select the "- No role for this site -" option from a "Primary role" drop-down list, plugin will revoke all roles from the selected users. * Update: Options page screen help text was updated. * Fix: Additional (other) default roles set at URE's settings page are not granted to a new user now, if they were deselected at a 'Add New User' page. = [4.35.3] 20.07.2017 = * Fix: Multiple roles assignment (including default roles) did not work at "Users->Add New" new-user.php (contexts: add-existing-user, add-new-user) page for WordPress multisite. = [4.35.2] 18.07.2017 = * Fix: Multiple default roles (if defined at URE's settings) are selected automatically at new-user.php (context: add-new-user) page. * Update: Code enhancement for protection of users with 'administrator' role from each other. Current user can see his own record and edit own profile. = [4.35.1] 10.07.2017 = * Fix: "Grant Roles" button at the bottom of "Users" page did not work as had the same ID as a similar button at the top of this page. * Update: when bbPress plugin is active, "Grant Roles" does not revoke bbPress role granted to user anymore. * Fix: The same ID "move_from_no_role" and "move_from_no_role_dialog" were included twice to the "Users" page. = [4.35] 11.06.2017 = * Update: Bulk capabilities selection checkbox is not shown for 'administrator' role for single site WP, and is shown if current user is superadmin for multisite WP. It was done to exclude sudden revoke of all capabilities from the 'administrator' role. * Update: Full copy of JQuery UI 1.11.4 custom theme CSS file (jquery-ui.css) was included. * Fix: User->User Role Editor page apparently loads own jQuery UI CSS (instead of use of WordPress default one) in order to exclude the conflicts with themes and plugins which can load own jQuery UI CSS globally not for own pages only. * Fix: "Change Log" link was replaced with secure https://www.role-editor.com/changelog = [4.34] 02.06.2017 = * New: Multisite 'upgrade_network' capability support was added for compatibility with WordPress 4.8. * New: Multisite 'delete_sites' capability support was added. * Update: Users->Grant Roles: if a single user was selected for "Grant Roles" bulk action, dialog will show the current roles of selected user with checkboxes turned ON (pre-selected). * Fix: Transients caching was removed from URE_Lib::_get_post_types() function. It cached post types list too early in some cases. * Fix: jQuery UI CSS was updated to fix minor view inconsistency at the URE's Settings page. * Fix: "Reset" presentation code remainders were removed from the main User Role Editor page. * Fix: 'manage_links' capability was included into a wrong subgroup instead of "Core->General". It was a mistake in the capabilities group counters for that reason. = [4.33] 19.05.2017 = * Fix: "Users->Without Roles", "Users->Grant Roles" are shown only to the users with 'edit_users' capability. * Fix: Roles were updated for all sites of all networks for WordPress multisite. "Apply to All Sites" option updates roles inside a current network only. * Update: "Reset" button moved from the "Users->User Role Editor" main page to the "Settings->User Role Editor->Tools" tab. * Update: "Users->Grant Roles" button worked only for superadmin or user with 'ure_manage_options' capability. User with 'edit_users' can use this feature now. * New: boolean filter 'ure_bulk_grant_roles' allows to not show "Users->Grant Roles" button if you don't need it. * New: boolean filter 'ure_users_select_primary_role' can hide 'Primary role' selection controls from the user profile edit page. * New: boolean filter 'ure_users_show_wp_change_role' can hide "Change Role" bulk action selection control from the Users page. So it's possible to configure permissions for user who can change just other roles of a user without changing his primary role. * Update: Settings tabs and dialog stylesheets was updated to jQuery UI 1.11.4 default theme. = [4.32.3] 03.04.2017 = * Fix: Boolean false was sent to WordPress core wp_enqueue_script() function as the 2nd parameter instead of an empty string. We should respect the type of parameter which code author supposed to use initially. * Fix: Bulk grant to users multiple roles JavaScript code is loaded now for users.php page only, not globally. = [4.32.2] 17.03.2017 = * Fix: "Users->Grant Roles" button did not work with switched off option "Count Users without role" at "Settings->User Role Editor->Additional Modules" tab. "JQuery UI" library was not loaded. * Update: minimal PHP version was raised to 5.3. = [4.32.1] 09.03.2017 = * Fix: URL to users.php page was built incorrectly after bulk roles assignment to the users selected at the 1st page of a users list. = [4.32] 09.03.2017 = * New: Button "Grant Roles" allows to "Assign multiple roles to the selected users" directly from the "Users" page. * Update: singleton template was applied to the main User_Role_Editor class. While GLOBALS['user-role-editor'] reference to the instance of User_Role_Editor class is still available for the compatibility purpose, call to User_Role_Editor::get_instance() is the best way now to get a reference to the instance of User_Role_Editor class. * Fix: Missed 'unfiltered_html' capability is shown now at the 'General' capabilities group too. = [4.31.1] 06.01.2017 = * Fix: WP transients get/set were removed from URE_Own_Capabilities class. It leaded to the MySQL deadlock in some cases. * Update: Base_Lib::get_request_var() sanitizes user input by PHP's filter_var() in addition to WordPress core's esc_attr(). = [4.31] 14.12.2016 = * New: It's possible to remove unused user capabilities by list. * Fix: There was no support for installations with the hidden/changed URL to wp-admin. URE uses 'admin_url()' now to get and check admin URL, instead of direct comparing URL with 'wp-admin' string. * Fix: Deprecated capabilities were shown in some cases at the 'Core' group even with "Show deprecated capabilities" mode switched off. * Update: Capability groups CSS classes are prefixed with 'ure-' in order to minimize possible CSS conflicts with other plugins/themes which may load styles with the same classes globally and break URE's markup. = [4.30] 01.12.2016 = * Update: compatible with WordPress 4.7 * New: "Granted Only" checkbox to the right from the "Quick Filter" input control allows to show only granted capabilities for the selected role or user. = [4.29] 10.11.2016 = * New: User Role Editor own user capabilities are grouped separately under Custom capabilities. * Update: URE_Lib::is_super_admin() uses WordPress core is_super_admin() for multisite setup only. Superadmin is a user with 'administrator' role in the case of single site WordPress installation. This is the difference with the WordPress core which counts as a superadmin (for single site WP installation) any user with a 'delete_users' capability. * Update: BaseLib::option_selected() calls were replaced with the calls of a similar selected() function from WordPress core. = [4.28] 20.10.2016 = * New: WooCommerce plugin user capabilities (if exist) are grouped separately under Custom capabilities. * Update: Temporally raised permissions flag is taken into account when checking, if user has a superadmin privileges. WordPress is_super_admin() function was replaced with custom wrapper to define if current user is a real superadmin or just a local admin with the temporally raised (add/edit users pages) permissions. = [4.27.2] 15.09.2016 = * Update: There was a conflict with plugins which use a '|' character at the custom user capabilities: e.g. 'Nginx Helper | Config' from "Nginx Helper' plugin. * Fix: PHP notice was removed: Undefined property: URE_Role_View::$multisite in wp-content/plugins/user-role-editor/includes/classes/view.php on line 143 * Fix: WordPress multisite: Settings link under the URE plugin at the plugins list leads to the network admin now, not to the the single site settings page, which does not exist. * Fix: WordPress multisite: conflict with "Visual Composer" plugin was resolved: single site administrators could now use Visual Composer editor. * Fix: WordPress multisite: changed role name was not replicated to other sites when user clicked "Update" with "Apply to All Sites" option turned ON. = [4.27.1] 22.08.2016 = * Update: There was a conflict with plugins which use a '/' character at the custom user capabilities: e.g. vc_access_rules_backend_editor/disabled_ce_editor from Visual Composer. * Update: add/delete, escape, validate user capability code extracted from URE_Lib to the separate URE_Capability class = [4.27] 18.08.2016 = * New: Total/Granted counters were added to the capabilities groups titles. * New: "Columns" drop-down menu allows to change capabilities section layout to 1, 2 or 3 columns. * New: Capabilities section is limited in height and has independent scrollbar. * Update: User Role Editor page markup was updated to use more available space on page. * Update: URE_Ajax_Processor class allows to differentiate required user permissions according to action submitted by user. * Fix: CSS updated to exclude text overlapping at capabilities groups section when custom post type name is not fitted into 1 line. * Fix: required JavaScript files were not loaded at "Network Admin->Settings->User Role Editor" page. = [4.26.3] 25.07.2016 = * Fix: Selecting a sub-group/list of caps does make the ure_select_all_caps checkbox select all within that group, but checking that box when at the "All" top-level group did not work. * Fix: Notice: Undefined property: URE_Role_View::$apply_to_all = [4.26.1] 14.07.2016 = * Fix: some bugs, like 'undefined property' notices, etc. = [4.26] 14.07.2016 = * New: User capabilities were groupd by functionality for more convenience. * Update: URE_KEY_CAPABILITY constant was changed from 'ure_edit_roles' to 'ure_manage_options'. To make possible for non-admin users access to the User Role Editor without access to the 'administrator' role and users with 'administrator' role. * Update: User receives full access to User Role Editor under WordPress multisite if he has 'manage_network_plugins' capability instead of 'manager_network_users' as earlier. This allows to give user ability to edit network users without giving him access to the User Role Editor. * Update: Multisite: use WordPress's global $current_site->blog_id to define main blog ID instead of selecting the 1st one from the sorted list of blogs. * Update: use WP transients at URE_Lib::_get_post_types() to reduce response time. * Update: various internal optimizations. = [4.25.2] 03.05.2016 = * Update: Enhanced inner processing of available custom post types list. * Update: Uses 15 seconds transient cache in order to not count users without role twice when 'restrict_manage_users' action fires. * Update: URE fires action 'profile_update' after direct update of user permissions in order other plugins may catch such change. * Update: All URE's PHP classes files renamed and moved to the includes/classes subdirectory = [4.25.1] 15.04.2016 = * Fix: Selected role's capabilities list was returned back to old after click "Update" button. It was showed correctly according to the recent updates just after additional page refresh. * Update: deprecated function get_current_user_info() call was replaced with wp_get_current_user(). = [4.25] 02.04.2016 = * Important security update: Any registered user could get an administrator access. Thanks to [John Muncaster](http://johnmuncaster.com/) for discovering and wisely reporting it. * URE pages title tag was replaced from h2 to h1, for compatibility with other WordPress pages. * Fix: "Assign role to the users without role" feature ignored role selected by user. * Fix: PHP fatal error (line 34) was raised at uninstall.php for WordPress multisite. * Update: action priority 99 was added for role additional options hook action setup. = [4.24] 17.03.2016 = * Fix: PHP notice was generated by class-role-additional-options.php in case when some option does not exist anymore * Enhance: 'Add Capability' button have added capability to the WordPress built-in administrator role by default. It did not work, if 'administrator' role did not exist. Now script selects automatically as an admin role a role with the largest quant of capabilities and adds new capability to the selected role. * New: User capabilities page was integrated with "[User Switching](https://wordpress.org/plugins/user-switching/)" plugin - "Switch To" the editing user link iss added if "User Switching" plugin is available. * Marked as compatible with WordPress 4.5. = [4.23.2] 03.02.2016 = * Fix: PHP warning "Strict Standards: Static function URE_Base_Lib::get_instance() should not be abstract" was generated = [4.23.1] 01.02.2016 = * Fix: 'get_called_class()' function call was excluded for the compatibility with PHP 5.2.* * Fix: ure-users.js was loaded not only to the 'Users' page. = [4.23] 31.01.2016 = * Fix: "Users - Without Role" button showed empty roles drop down list on the 1st call. * Update: Own task queue was added, so code which should executed once after plugin activation is executed by the next request to WP and may use a selected WordPress action to fire with a needed priority. * Update: Call of deprecated mysql_server_info() is replaced with $wpdb->db_version(). * Update: Singleton patern is applied to the URE_Lib class. * Minor code enhancements = [4.22] 15.01.2016 = * Unused 'add_users' capability was removed from the list of core capabilities as it was removed from WordPress starting from version 4.4 * bbPress user capabilities are supported for use in the non-bbPress roles. You can not edit roles created by bbPress, as bbPress re-creates them dynamically for every request to the server. Full support for bbPress roles editing will be included into User Role Editor Pro version 4.22. * Self-added "Other Roles" column removed from "Users" list, as WordPress started to show all roles assigned to the user in its own "Role" column. * 'ure_show_additional_capabilities_section' filter allows to hide 'Other Roles' section at the 'Add new user', 'Edit user' pages. = [4.21.1] 16.12.2015 = * Fix: 'Update' button did not work at User's Capabilities page due to confirmation dialog call error. = [4.21] 11.12.2015 = * It's possible to switch off the update role confirmation (Settings - User Role Editor - General tab). * Standard JavaScript confirm box before role update was replaced with custom one to exclude 'Prevent this page from creating additional dialogs' option in the Google Chrome browser. * Fix: Removed hard coded folder name (user-role-editor) from the used paths. = [4.20.1] 15.11.2015 = * Fix: "Primary default role" drop-down menu was not shown at "Settings - User Role Editor - Default Roles" tab for WordPress single site installation. = [4.20] 15.11.2015 = * "Additional options" section was added to the user role editor page. Currently it contains the only "Hide admin bar". The list of options may be customized/extended by developers via "ure_role_additonal_options" filter. * "Default Role" button is hidden to not duplicate functionality. Use "Settings - User Role Editor - Default Roles" tab instead. This button is available only for the single sites of WP multisite now. * Code restructure, optimization: administrator protection parts extracted to the separate class. = [4.19.3] 14.10.2015 = * Fix: minor CSS change. * Automatically add all available custom post types capabilities to the administrator role under the single site environment. Custom posts types selection query updated to include all custom post types except 'built-in' when adding custom capabilities for them * Special flag was set to indicate that single site administrator gets raised (superadmin) permissions temporary especially for the 'user-new.php' page, but current user is not the superadmin really. (This temporary permissions raising is done to allow single site administrator to add new users under multisite if related option is active.) = [4.19.2] 01.10.2015 = * Fix: multiple default roles assignment did not work under the multisite environment, when user was created from front-end by WooCommerce, etc. * Update: the translation text domain was changed to the plugin slug (user-role-editor) for the compatibility with translations.wordpress.org * Update: CSS enhanced to exclude column wrapping for the capabilities with the long names. = [4.19.1] 20.08.2015 = * Default role value has not been refreshed automatically after change at the "Default Role" dialog - fixed. * More detailed notice messages are shown after default role change - to reflect a possible error or problem. * Other default roles (in addition to the primary role) has been assigned to a new registered user for requests from the admin back-end only. Now this feature works for the requests from the front-end user registration forms too. = 4.19 = * 28.07.2015 * It is possible to assign to the user multiple roles directly through a user profile edit page. * Custom SQL-query (checked if the role is in use and slow on the huge data) was excluded and replaced with WordPress built-in function call. [Thanks to Aaron](https://wordpress.org/support/topic/poorly-scaling-queries). * Bulk role assignment to the users without role was rewritten for cases with a huge quant of users. It processes just 50 users without role for the one request to return the answer from the server in the short time. The related code was extracted to the separate class. * Code to fix JavaScript and CSS compatibility issues introduced by other plugins and themes, which load its stuff globally, was extracted into the separate class. * Custom filters were added: 'ure_full_capabilites' - takes 1 input parameter, array with a full list of user capabilities visible at URE, 'ure_built_in_wp_caps' - takes 1 input parameter, array with a list of WordPress core user capabilities. These filters may be useful if you give access to the URE for some not administrator user, and wish to change the list of capabilities which are available to him at URE. * Dutch translation was updated. Thanks to Gerhard Hoogterp. = 4.18.4 = * 30.04.2015 * Calls to the function add_query_arg() is properly escaped with esc_url_raw() to exclude potential XSS vulnerabilities. Nothing critical: both calls of add_query_arg() are placed at the unused sections of the code. * Italian translation was updated. Thanks to Leo. = 4.18.3 = * 24.02.2015 * Fixed PHP fatal error for roles reset operation. * Fixed current user capability checking before URE Options page open. * 3 missed phrases were added to the translations files. Thanks to [Morteza](https://wordpress.org/support/profile/mo0orteza) * Hebrew translation updated. Thanks to [atar4u](http://atar4u.com) * Persian translation updated. Thanks to [Morteza](https://wordpress.org/support/profile/mo0orteza) = 4.18.2 = * 06.02.2015 * New option "Edit user capabilities" was added. If it is unchecked - capabilities section of selected user will be shown in the readonly mode. Administrator (except superadmin for multisite) can not assign capabilities to the user directly. He should make it using roles only. * More universal checking applied to the custom post type capabilities creation to exclude not existing property notices. * Multisite: URE's options page is prohibited by 'manage_network_users' capability instead of 'ure_manage_options' in case single site administrators does not have permission to use URE. * URE protects administrator user from editing by other users by default. If you wish to turn off such protection, you may add filter 'ure_supress_administrators_protection' and return 'true' from it. * Plugin installation to the WordPress multisite with large (thousands) subsites had a problem with script execution time. Fixed. URE does not try to update all subsites at once now. It does it for every subsite separately, only when you visit that subsite. * Fixed JavaScript bug with 'Reset Roles' for FireFox v.34. = 4.18.1 = * 14.12.2014 * As activation hook does not fire during bulk plugins update, automatic plugin version check and upgrade execution were added. = 4.18 = * 14.12.2014 * Own custom user capabilities, e.g. 'ure_edit_roles' are used to restrict access to User Role Editor functionality ([read more](https://www.role-editor.com/user-role-editor-4-18-new-permissions/)). * If custom post type uses own custom user capabilities URE add them to the 'Custom Capabilities' section automatically. * Multisite: You may allow to the users without superadmin privileges to add/create site users without sending them email confirmation request. * Bug fix: when non-admin user updated other user profile, that user lost secondary roles. * Italian translation was added. Thanks to [Giuseppe Velardo](http://www.comprensivoleopardi.gov.it/). = 4.17.3 = * 23.11.2014 * French and Turkish translation were updated. Thanks to [Transifex](https://www.transifex.com) translation team. = 4.17.2 = * 21.10.2014 * Notice: "Undefined property: Ure_Lib::$pro in .../class-user-role-editor.php on line 550" was fixed. * Settings help screen text was updated. * Russian translation was updated. * Hungarian translation was updated. Thanks to Németh Balázs. * French and Turkish translation were updated. Thanks to [Transifex](https://www.transifex.com) translation team. = 4.17.1 = * 01.10.2014 * Bug fix for the PHP Fatal error: Call to undefined function is_plugin_active_for_network(). It may take place under multisite only, in case no one of the other active plugins load file with this function already before User Role Editor v. 4.17 tries to call it. = 4.17 = * 01.10.2014 * Multisite (update for cases when URE was not network activated): It is possible to use own settings for single site activated instances of User Role Editor. Earlier User Role Editor used the settings values from the main blog only located under "Network Admin - Settings". Some critical options were hidden from the "Multisite" tab for single site administrators and visible to the superadmin only. Single site admin should not have access to the options which purpose is to restrict him. Important! In case you decide to allow single site administrator activate/deactivate User Role Editor himself, setup this PHP constant at the wp-config.php file: define('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE', 1); Otherwise single site admin will not see User Role Editor in the plugins list after its activation. User Role Editor hides itself under multisite from all users except superadmin by default. * Help screen for the Settings page was updated. * Hungarian translation was added. Thanks to Németh Balázs. * Dutch translation was added. Thanks to Arjan Bosch. = 4.16 = * 11.09.2014 * "create_sites" user capability was added to the list of built-in WordPress user capabilities for WordPress multisite. It does not exist by default. But it is used to control "Add New" button at the "Sites" page under WordPress multisite network admin. * bug fix: WordPress database prefix value was not used in 2 SQL queries related to the "count users without role" module - updated. = 4.15 = * 08.09.2014 * Rename role button was added to the URE toolbar. It allows to change user role display name (role ID is always the same). Be careful and double think before rename some built-in WordPress role. = 4.14.4 = * 08.08.2014 * Missed "manage_sites" user capability was added to the list of built-in WordPress capabilities managed by User Role Editor. * Russian translation was updated. = 4.14.3 = * 25.07.2014 * Integer "1" as default capability value for new added empty role was excluded for the better compatibility with WordPress core. Boolean "true" is used instead as WordPress itself does. * Integration with Gravity Forms permissions system was enhanced for WordPress multisite. = 4.14.2 = * 18.07.2014 * The instance of main plugin class User_Role_Editor is available for other developers now via $GLOBALS['user_role_editor'] * Compatibility issue with the theme ["WD TechGoStore"](http://wpdance.com) is resolved. This theme loads its JS and CSS stuff for admin backend uncoditionally - for all pages. While the problem is caused just by CSS URE unloads all this theme JS and CSS for optimizaiton purpose for WP admin backend pages where conflict is possible. = 4.14.1 = * 13.06.2014 * MySQL query optimizing to reduce memory consumption. Thanks to [SebastiaanO](http://wordpress.org/support/topic/allowed-memory-size-exhausted-fixed). * Extra WordPress nonce field was removed from the post at main role editor page to exclude nonce duplication. * Minor code enhancements. * Fixes for some missed translations. = 4.14 = * 16.05.2014 * Persian translation was added. Thanks to Morteza. = 4.12 = * 22.04.2014 * Bug was fixed. It had prevented bulk move users without role (--No role for this site--) to the selected role in case such users were shown more than at one WordPress Users page. * Korean translation was added. Thanks to [Taek Yoon](http://www.ajinsys.com). = 4.11 = * 06.04.2014 * Single-site: It is possible to bulk move users without role (--No role for this site--) to the selected role or automatically created role "No rights" without any capabilities. Get more details at https://role-editor.com/no-role-for-this-site/ * Plugin uses for dialogs jQuery UI CSS included into WordPress package. = 4.10 = * 15.02.2014 * Security enhancement: WordPress text translation functions were replaced with more secure esc_html__() and esc_html_e() variants. = 4.9 = * 19.01.2014 * New tab "Default Roles" was added to the User Role Editor settings page. It is possible to select multiple default roles to assign them automatically to the new registered user. * CSS and dialog windows layout various enhancements. * 'members_get_capabilities' filter was applied to provide better compatibility with themes and plugins which may use it to add its own user capabilities. * jQuery UI CSS was updated to version 1.10.4. = 4.8 = * 10.12.2013 * Role ID validation rule was added to prohibit numeric role ID - WordPress does not support them. * Plugin "Options" page was divided into sections (tabs): General, Multisite, About. Section with information about plugin author, his site, etc. was moved from User Role Editor main page to its "Options" page - "About" tab. * HTML markup was updated to provide compatibility with upcoming WordPress 3.8 new administrator backend theme "MP6". * Restore previous blog 'switch_to_blog($old_blog_id)' call was replaced to 'restore_current_blog()' where it is possible to provide better compatibility with WordPress API. After use 'switch_to_blog()' in cycle, URE clears '_wp_switched_stack' global variable directly instead of call 'restore_current_blog()' inside the cycle to work faster. = 4.7 = * 04.11.2013 * "Delete Role" menu has "Delete All Unused Roles" menu item now. * More detailed warning was added before fulfill "Reset" roles command in order to reduce accident use of this critical operation. * Bug was fixed at Ure_Lib::reset_user_roles() method. Method did not work correctly for the rest sites of the network except the main blog. = 4.6 = * 21.10.2013 * Multi-site: 'unfiltered_html' capability marked as deprecated one. Read this post for more information (http://shinephp.com/is-unfiltered_html-capability-deprecated/). * Multi-site: 'manage_network%' capabilities were included into WordPress core capabilities list. * On screen help was added to the "User Role Editor Options" page - click "Help" at the top right corner to read it. * Bug fix: turning off capability at the Administrator role fully removed that capability from capabilities list. * Various internal code enhancements. * Information about GPLv2 license was added to show apparently - "User Role Editor" is licensed under GPLv2 or later. = 4.5.2 = * 23.09.2013 * User capabilities editor updated to support capabilities beyond the user roles - capabilities added by other plugins directly to the users, or deleted from the user roles. * Bug fixed - custom capabilities was not shown in User capabilities editor in some cases. * Spanish translation was added. Thanks to [Dario Ferrer](http://darioferrer.com/). = 4.5.1 = * 29.08.2013 * Bug with multi-site super-admin access to the User Role Editor is fixed. Version 4.5. showed message "Insufficient permissions to work with User Role Editor" until add "manage_network_users" capability to the "Administrator" role. It is enough now to be the "Superadmin" at multi-site network. = 4.5 = * 29.08.2013 * Direct checking of the "administrator" role is removed from the code to support ability to change User Role Editor access key capability. URE uses by default the "administrator" role for single site as the key capability to permit access to the User Role Editor. You may change this capability manually by replacing value of URE_KEY_CAPABILITY constant at includes/define_constants.php file. Pro version starting from 4.5 allows to change this key capability name (input your own, custom one) via User Role Editor settings page. * The Hebrew translation is added. Thanks to [atar4u](http://atar4u.com). = 4.4 = * 15.08.2013 * Bug fixed which prevented creation of current roles backup record during User Role Editor plugin installation and produced unexpected output (PHP notices). = 4.3 = * 12.08.2013 * Multisite update: roles from the main (1st) blog are copied to the new added blog automatically, even new site is added from front-end after new user registration, e.g. Gravity Forms "Register User" addon does. Earlier this feature worked for administrator back-end operations only. * Bug prevented to apply role changes to all sites of the network is fixed. In case when one of the sites have exactly the same roles as applied from the main site, MySQL returned 0 rows affected. URE recognized that as error and stopped further network updated. It is fixed now. * Bug prevented to save empty (without capabilities) role is fixed. * User interface bug with options 'Show capabilities in human readable form' and 'Show deprecated capabilities' fixed. Now this checkboxes work this way: It takes global values from the User Role Editor Settings 1st. If you change it at Roles/User editor form plugin, it remembers your change temporally for 10 minutes. After that this value will be returned to the URE global settings. If you wish to make permanent change make it at URE settings page. = 4.2 = * 02.08.2013 * Separate setting page is added for User Role Editor under Settings menu. It is available under Network Center "Settings" for the multi-site. * Option 'show Administrator role in the User Role Editor' was added. * User with super-admin privilege only may create, edit, delete users by default under multi-site configuration. Use new "Allow create, edit and delete user to not super-administrators" option to workaround this obstacle. Such user still should have correspondent user capabilities as "create_users", "edit_users", "delete_users". Thanks to [Sjobidoo](http://wordpress.org/support/profile/sjobidoo) for suggested [decision](http://wordpress.org/support/topic/plugin-user-role-editor-not-able-to-add-ability-to-edit-users). * PHP fatal error caused by typo in the 'uninstall.php' file is fixed. * Miscellaneous code enhancements. = 4.1.1 = * 15.07.2013 * Issue when "users with "Editor" credentials were no longer able to change the author name in the drop down on each post to someone with administrative credentials" is fixed. * Limitation when user with 'Administrator' role could not edit/delete other users with 'Administrator' role is removed. * "Apply to All sites" checkbox is excluded from "Select All" operation. * Quick filter is added to the user's capabilities edit form. Capabilities selection buttons work is fixed after that. = 4.1 = * 03.07.2013 * Quick Filter is added. Type part of any capability. All capabilities containing that word, e.g. 'edit' or 'users' will be highlighted by green color. While 'quick filter' is in action 'Select All', 'Unselect All', 'Inverse' buttons work with highlighted capabilities sub-set only. Read [this post](http://role-editor.com/user-role-editor-version-4-1-is-available/) for more information: * Class property and method access modifiers fatal errors were fixed (http://wordpress.org/support/topic/fatalerror-1). = 4.0 = * 30.06.2013 * Pro version only: added 'Export/Import' functionality to 'export' all user roles to the local file and 'import' them then to other WordPress blog or other sites of muliti-site WordPress network, or just restore roles to previous state after playing with them with test purpose. * Added integration with the Gravity Forms plugin. User Role Editor shows Gravity Forms user capabilities at the custom capabilities section. * Code is fully restructured and encapsulated to PHP classes. Internal global variables are not in use anymore. = 3.14.1 = * 24.05.2013 * Bug, which prevented the correct use of WordPress nonces on some installations (Windows), is fixed; * DIRECTORY_SEPARATOR constant used in path to User Role Editor CSS file was empty on some installations (Windows). Constant DIRECTORY_SEPARATOR is excluded from the plugin code; * User capabilities page: roles checkboxes are excluded from 'Select All', 'Unselect All', 'Inverse' operations. Only capabilities checkboxes are processed. * Turkish [Muhammed YILDIRIM](http://ben.muhammed.im) translation is updated. = 3.14 = * 17.05.2013 * Interface update: role/capability add/remove stuff was removed from the page. Plugin has toolbar at the right side now. Click on the button opens needed dialog window. * New role may have different attrubutes "ID" and "Name". While ID is still restricted by latin characters hyphen, underscore and digits only, Name could contain spaces and national languages characters. * General code cleanup and security enhancements: all data changes request are processed via POST instead of GET now. So its more difficult to send modified malicious request without special software. Presence of special nonce field is checked for all requests. * Setting up the 'administrator' role as default one for new registered users is prohibited at server side. * JavaScript code separated from PHP one whenever it's possible. * 14.05.2013 * Update for administrators of multi-site WordPress installations. Single-site WordPress installation administrator could skip this update. * "Apply to All Sites" feature did not work at version 3.12. It is fixed. * "Apply to All Sites" feature is available now from main site of the network only = 3.12 = * 01.05.2013 * Critical update: persistent cross-site scripting vulnerability is fixed. * WordPress built-in constants, like WP_PLUGIN_URL are not used in order to provide compatibility with sites which use SSL. plugin_dir_url(), plugin_dir_path() functions are used to define paths to the plugin's files instead. * "Greetings" section is removed from the plugin's main page. All that content is still available at [plugin page](http://shinephp.com/user-role-editor-wordpress-plugin) = 3.11 = * 24.03.2013 * Required WordPress version checking is moved to plugin activation hook. * Administrator can now exclude non-core (custom) capabilities from his role. It is useful if you need to fully remove some capability as capability deletion is prohibited while it is used at least one role. * bbPress compatibility issue is fixed: capabilities created by bbPress dinamically are excluded from the capabilities set in User Role Editor to not store them in the database as persistent WP roles data. * Additional roles are assigned to user without overriding her primary WordPress role and bbPress role. * Changing Wordpress user primary role at user profile doesn't clear additonal roles assigned with User Role Editor earlier. * Brasilian Portuguese translation is updated. = 3.10 = * 04.02.2013 * You can assign to user multiple roles simultaneously. Use user level roles and capabilities editor for that. You can click 'Capabilities' link under selected user row at users list or 'Assign Roles and Additional Capabilities' link at user profile. * Critical bug fix: hidden deprecated WordPress core capabilities had turned on after any update made to the role. Deprecated capabilities are not currently in use by WordPress itself. But old plugins or themes could still use them. If you use some outdated code I recommend you to check all roles, you modified with User Role Editor, and turn off unneeded deprecated capabilities there. * User with Administrator role is secured better from editing, deletion by user with lower capabilities. = 3.9 = * 07.01.2013 * Compatibility with bbPress 2.2 new user roles model is provided. More details about the reason of such update at http://shinephp.com/bbpress-user-role-editor-conflict-fix/ * "Reset" button works differently now. It restores WordPress roles data to its 1st, default state, exactly that, what WordPress has just after fresh install/latest version update. Be careful with it, make database backup copy before fulfill this operation. Some plugin could require reactivation to function properly after roles reset. * Arabic translation is added. Thanks to [Yaser](http://www.englize.com/) * Slovak translation is added. Thanks to Branco. = 3.8.3 = * 14.12.2012 * Compatibility issue with WordPress 3.5 was found (thanks to Sonja) and fixed: $wpdb->prepare() was called without 2nd $args parameter - removed. = 3.8.2 = * 02.12.2012 * load_plugin_textdomain() call moved to the 'plugins_loaded' hook for higher compatibility with translation plugins. * Traditional Chinese translation is added. Thanks to Jingxin Lai. = 3.8.1 = * 21.10.2012 * Fix: URE taked roles names from the database directly and ignored changes made to roles names on the fly by other plugins or themes, names, which were cached by WordPress internally, but were not written to the database. URE uses WordPress internal cache now. * Roles names translation update: if URE translation file doesn't exist for blog default language, URE uses WordPress internal translation now. * Serbian translation is added. Thanks to [Diana](http://wpcouponshop.com). = 3.8 = * 01.09.2012 * Bug fix: Some times URE didn't show real changes it made to the database. The reason was that direct update of database did not invalidate data stored at WordPress cache. Special thanks to [Knut Sparhell](http://sparhell.no/knut/) for the help to detect this critical issue. * WordPress core capabilities are shown separately from capabilities added by plugins and manually. * If you configured URE to show you 'Administrator' role, you will see its capabilities, but you can not exclude any capability from it. I may just add capabilities to the Administrator role now. The reason - Administrator role should have all existing capabilities included. * Brasilian Portuguese translation is updated. Thanks to [Onbiz](http://www.onbiz.com.br/). = 3.7.5 = * 11.08.2012 * Minor fix of German language translation file. One string translation was the reason of URE empty screen. Just replace your German language translation files in the ./lang directory with files from this package. = 3.7.5 = * 29.07.2012 * Polish translation is updated. Thanks to Bartosz. * "User Role Editor" menu item could be shown in translated form now. Do not lose it - it is on the same place at the "Users" submenu. = 3.7.4 = * 26.07.2012 * Persian translation is updated. Thanks to Amir Khalilnejad. = 3.7.3 = * 25.07.2012 * German translation is updated. Thanks to Piter. = 3.7.2 = * 20.07.2012 * SQL-injection vulnerability was found and fixed. Thanks to DDave for reporting it, look this [thread](http://shinephp.com/community/topic/little-bug-in-ure_has_administrator_role#post-819) for the details. = 3.7.1 = * 25.06.2012 * Bug fix for "Fatal error: Call to a member function get_role() on a non-object in .../wp-content/plugins/user-role-editor/user-role-editor.php on line 185" = 3.7 = * 23.06.2012 * 'Select All', 'Unselect All', 'Inverse' buttons were added to the from for more convenient capabilities management while role editing. * Role and capability name could be started from digit, and underscore '_' character. Hyphen '-' character could be included into such name too. * Old versions used 'edit_users' capability to check if show/hide 'User Role Editor' menu item under 'Users' menu. Starting from version 3.7 'administrator' role is checked. Existed inconsistency, when non-admin user with 'edit_users' capability saws 'User Role Editor' menu, but got 'Only Administrator is allowed to use User Role Editor' error message, was removed. * Bug fix: if you work with WordPress admin via https, URE will use https instead of http, as it made in older versions. = 3.6.2 = * 23.05.2012 * Hindi translation is added. Thanks to Love Chandel. = 3.6.1 = * 07.05.2012 * Italian translation is updated. Thanks to Tristano Ajmone. = 3.6 = * 30.04.2012 * CSS and page layout fix for compatibility with WordPress 3.4. * WordPress multi-site: when new blog created default role setting is copied for it from the main blog default role value now. * Minor translations files update, e.g Russian roles names in plugin are identical to those WordPress uses itself now, etc. = 3.5.4 = * 4.04.2012 * Lithuanian translation is added, thanks to Vincent G. * Spanish translation is updated, thanks to Victor Ricardo Díaz. = 3.5.3 = * 24.03.2012 * French translation is updated, thanks to Presse et Multimedia. * Hebrew translation is updated, thanks to Aryo Digital. * Persian translation is updated, thanks to Parsa. * Minor CSS fix to provide compatibility with RTL languages. = 3.5.2 = * 17.03.2012 * Turkish translation is updated, thanks to Muhammed YILDIRIM. * Dutch translation is updated, thanks to Frank Groeneveld. = 3.5.1 = * 24.02.2012 * Bugs for multi-site WordPress network installation were discovered and fixed: 1) blocked login to admin back-end; 2) empty users list for administrators of single sites; 3) empty authors drop down list at the post editor page. * If URE plugin is not enabled for single site administrator, then URE is automatically excluded from plugins list available to that administrator. = 3.5 = * 19.02.2012 * User Role Editor could be available now for single site administrators (Administrator role) under multi-site environment. You should define URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE constant in your blog wp-config.php file for that. Insert this line "define('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE', 1);" there, if you decide to give single site admin such opportunity. * One of "User Role Editor" users with 1100+ sites in the multi-site network reported that URE doesn't update roles for all sites, but stalls somewhere in the middle. Other network update method is realized as alternative. Due to my tests it works approximately 30 times faster. If you met the same problem, try it. It will be great if you share your experience with me. In order select alternative method of all sites update add this line to you blog wp-config.php file "define('URE_MULTISITE_DIRECT_UPDATE', 1);". But be careful. It's recommended to make 1st try on the backup copy, not on a live site. * Persian translation is updated. Thanks to [Parsa](http://parsa.ws). = 3.4 = * 21.01.2012 * You can see/edit "Administrator" role now. Insert this line of code "define('URE_SHOW_ADMIN_ROLE', 1);" into your wp-config.php file and login with administrator account for that. If for some reason your Administrator role missed some capabilities added by plugins or themes, you can fix that. But be careful with changing "Administrator" role, do not turn off accidentally some critical capabilities to not block your admin users. = 3.3.3 = * 11.01.2012 * Spanish (Dario) and Swedish (Andréas) translations update. = 3.3.2 = * 02.01.2012 * Enhance server side validation for user input of new role name, minor bug fixes. = 3.3.1 = * 12.12.2011 * Compatibility with Internet Explorer fix: It automatically replaced '©' in '©_from_user_role' URL parameter inside JavaScript code to copyright sign.So I should use other name for this parameter. Thanks to Michael Wiekenberg for the help with isolating this issue. = 3.3 = * 10.12.2011 * New role can be created as a copy of other existing one. * You can hide/show deprecated capabilties (level_1 - level_10). * Users with "Administrator" role are not shown to other users with "list_users" capability. * Plugin data cleanup is added - plugin options will be automatically deleted if you delete plugin via WordPress link. * Some code enhancements are applied, e.g. optimization and using of WordPress API instead of self-written routine. * New bugs are added :) - it's a joke of course, but if you find some, please report, I will fix it ASAP. = 3.2.1 = * 01.08.2011 * This is minor bug-fix update. If you didn't meet this bug you can skip this update. "usermeta" table doesn't exist bug appearing on some multi-site blogs is fixed. Read [this post](http://wordpress.org/support/topic/multisite-setup-gives-usermeta-table-error) for more information. Thanks to harpinder for discovering this bug and for the help with testing updated code. "usermeta" Db table name is define by more universal way now. = 3.2 = * 25.07.2011 * If you run multi-site WordPress network, User Role Editor will automatically duplicate all roles from the main blog (blog with mininal ID) to every new created blog. * Some fixes, refactoring and logic change were applied to code to enhance its productivity. There were some complaints for PHP timeout error after trying to open plugin Settings page. * Thanks to Grant Norwood for code fix to hide PHP warnings he met during plugin usage. * Hebrew translation is added. Thanks to Sagive. * French translation is updated. Thanks to Whiler. * Japan translation is updated. Thanks to Kaz. * Spanish translation is updated. Thanks to Dario. = 3.1.1 = * 07.07.2011 * CUSTOM_USER_META_TABLE constant is used now for more compatibility with core WordPress API. Thanks to [Lorenzo Nicoletti](http://www.extera.com) * Turkish translation is updated. Thanks to Muhammed YILDIRIM. Other language translators are welcome! = 3.1 = * 03.06.2011 * Add/Remove capability boxes are added to the User Role Editor * Capabilities could be assigned directly to the user, additionally to the assigned role * PHP4 is not supported by this plugin anymore. Update your site to PHP5 in order to use this plugin and [near to release WordPress 3.2 :)](http://wordpress.org/about/requirements/) * Minor compatibility issues with other plugins were fixed = 3.0.4 = * 18.04.2011 * minor update: PHP4 compatibility issue in code was discovered and fixed. PHP5 users could skip it. PHP4 users should think about update to PHP5, as WordPress 3.2 (planned to July 2011) will not provide PHP4 compatibility more. = 3.0.3 = * 17.04.2011 * Capabilities in human readable form are sorted by alphabet (usefull for translated form) now, not by inner capability name. * Finnish translation is added. = 3.0.2 = * 11.04.2011 * Swedish translation is added. * Alternative Italian translation is added. Rename ure-it_IT_1.* files to ure-it_IT.* if wish to try it. * ShinePHP.com RSS feed is excluded from plugin settings page. Use this link http://feeds.feedburner.com/shinephp with your favorite RSS reader if you wish to read it. = 3.0.1 = * 27.02.2011 * Spanish translation is updated. Thanks to [Dario Ferrer](http://www.darioferrer.com). Other language translation wait for update too. You are welcome :). = 3.0 = * 06.02.2011 * Compatibility with WordPress 3.1 Release Candidate 3 and real multi-site feature are provided. * Role capabilities list are sorted now in the alphabetical order. Easier to find - easier to manage. * Code fix: allows to not lose new custom capability if it is added to other than 'Administrator' role. Thanks to Marcin for the contribution to the code of this plugin. * Under multi-site environment: * 1) URE has additional option 'Apply to All Sites' which allows you to apply updates to the selected role at all sites of your network. If some site has not such role, it will be added. You should know, that this option works for the role update only. All other actions as 'Add' or 'Delete' role still works for the currently selected blog/site only. * 2) URE plugin settings page is available only to user with network superadministrator rights. = 2.2.3 = * 08.11.2010 * It is the security update. Old problem returned after 2.2.2 update and was discovered by saharusa. You can read this [thread](http://wordpress.org/support/topic/plugin-user-role-editor-editor-can-edit-admin). Only user with Administrator role and superadmin user under multi-site environment have access to the User Role Editor Settings page now. = 2.2.2 = * 07.11.2010 * URE plugin Settings page was unavailable for some installations in multi-site environment. It is fixed by changing 'add_users' capability for administrator access to the 'edit_users'. * Turkish translation is added. = 2.2.1 = * 09.10.2010 * Critical bug "Fatal error: Class 'SimplePie' not found in /" is fixed. This is a required update as URE plugin Settings page did not opened in previous version if you have not some of other my plugins installed :). = 2.2 = * 08.10.2010 * Technical update for WordPress 3.0 full compatibility. Staff deprecated since WordPress v.3.0 is excluded. If you use earlier WordPress versions, do not update URE plugin to v.2.2 or higher. * Italian translation update. Thanks to [Alessandro Mariani](http://technodin.org). = 2.1.10 = * 21.09.2010 * German translation is updated. Thanks to [Peter](http://www.red-socks-reinbek.de). = 2.1.9 = * 17.09.2010 * Persian translation is added. = 2.1.8 = * 16.08.2010 * Compatibility issue with other plugins (like Flash Album Gallery), which use capabilities names with spaces inside (non valid JavaScript identifier), is fixed. * Missed translation slots are added for some new WordPress 3.0 capabilities. Translators (former and new) are welcome to update correspondent language files. * Brasilian Portuguese translation is added. = 2.1.7 = * 07.07.2010 * Chinese translation is added. = 2.1.6 = * 06.07.2010 * Dutch translation is added. = 2.1.5 = * 18.06.2010 * Hungarian translation is added. = 2.1.4 = * 08.05.2010 * Italian translation is added. * Minor javascript bug (undefined parameter value was sent to the server) is fixed. = 2.1.3 = * 27.04.2010 * Japanese translation is updated. = 2.1.2 = * 26.04.2010 * Polish translation is added. = 2.1.1 = * 19.04.2010 * Form layout changed slightly to fit more long phrases in other languages * Belorussian translation is added. Thanks to [Marsis G.](http://pc.de/). * French, Japanese, Russian, Spanish translations are updated. = 2.1 = * 17.04.2010 * Two ways of capabilities names presentation are available for the user choice: standard WordPress name like 'edit_pages' and mouse pointer hint 'Edit pages', and vice versa - human readable form 'Edit pages' with mouse hint for WP standard name 'edit-pages'. Human readable form will be available in translated variant after correspondent translation file will be updated. * Form layout changed slightly to fit more long phrases in other languages * Russian, Spanish translations are updated. = 2.0.3 = * 14.04.2010 * Japanese translation is added. Thanks to [Technolog.jp](http://technolog.jp/). = 2.0.2 = * 11.04.2010 * German translation is verified and updated. Thanks to [Peter](http://www.red-socks-reinbek.de). = 2.0.1 = * 04.04.2010 * It is the critical update - security issue is fixed. Thanks to [Saharuza](http://wordpress.org/support/profile/2855662) for discover and telling me about it. User with 'edit_users' permission could still use URL request with special parameters to remove Administrator role from Admin user or delete Admin user record. Check [this thread](http://wordpress.org/support/topic/383935) for more details. = 2.0 = * 04.04.2010 * Create New Role feature was added * Delete self-made not used role feature was added. You can not delete any WordPress standard role. * Change default role for new user feature was added * Administator role and users with Administrator role permission were hidden from "Users" and "Edit User" page. This is done in case of delegation of add_user, edit_user or delete_user capabilities to some role. = 1.2 = * 28.03.2010 * User Role Editor plugin menu item is moved to the Users menu * Roles in the dropdown list are translated * French translation is added = 1.1 = * 24.03.2010 * Critical bug is fixed. If you click 'Reset' button before any changes to the role data saved (that is click Update button) at least one time, you met with all roles data lost problem. Backup data created automatically before the 1st role data update. If no update - no backup. Special checking for that was added. * German translation is added. * Spanish translation is added. = 1.0 = * 22.03.2010 * 1st release. js/settings.js000064400000003741150212007360007357 0ustar00/* * User Role Editor WordPress plugin JavaScript for Settings page */ function ure_ui_button_text(caption) { var wrapper = '' + caption + ''; return wrapper; } function ure_roles_reset_form_submit() { jQuery('#ure_reset_roles_form').submit(); } jQuery(function() { jQuery('#ure_reset_roles_button').button({ label: ure_data.reset }).click(function (event) { event.preventDefault(); ure_confirm(ure_data.reset_warning, ure_roles_reset_form_submit); }); function ure_confirm(message, routine) { jQuery('#ure_confirmation_dialog').dialog({ dialogClass: 'wp-dialog', modal: true, autoOpen: true, closeOnEscape: true, width: 600, height: 280, resizable: false, title: ure_data.confirm_title, 'buttons': { 'No': function () { jQuery(this).dialog('close'); return false; }, 'Yes': function () { jQuery(this).dialog('close'); routine(); return true; } } }); jQuery('#ure_cd_html').html(message); jQuery('.ui-dialog-buttonpane button:contains("No")').attr('id', 'dialog-no-button'); jQuery('#dialog-no-button').html(ure_ui_button_text(ure_data.no_label)); jQuery('.ui-dialog-buttonpane button:contains("Yes")').attr('id', 'dialog-yes-button'); jQuery('#dialog-yes-button').html(ure_ui_button_text(ure_data.yes_label)); } // end of ure_confirm() jQuery('#ure_reset_roles_secure').on('input', function() { if ( this.value===ure_data.reset_roles_secure_text ) { jQuery('#ure_reset_roles_button').button('enable'); } else { jQuery('#ure_reset_roles_button').button('disable'); } }); }); js/multiple-select.min.js000064400000165701150212007360011416 0ustar00/** * multiple-select - Multiple select is a jQuery plugin to select multiple elements with checkboxes :). * * @version v1.5.2 * @homepage http://multiple-select.wenzhixin.net.cn * @author wenzhixin (http://wenzhixin.net.cn/) * @license MIT */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],e):e((t=t||self).jQuery)}(this,(function(t){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){for(var n=0;n0?ct:at)(t)},ft=Math.min,pt=function(t){return t>0?ft(ht(t),9007199254740991):0},dt=Math.max,vt=Math.min,gt=function(t,e){var n=ht(t);return n<0?dt(n+e,0):vt(n,e)},yt=function(t){return function(e,n,i){var r,u=D(e),o=pt(u.length),s=gt(i,o);if(t&&n!=n){for(;o>s;)if((r=u[s++])!=r)return!0}else for(;o>s;s++)if((t||s in u)&&u[s]===n)return t||s||0;return!t&&-1}},Et={includes:yt(!0),indexOf:yt(!1)},bt=Et.indexOf,mt=function(t,e){var n,i=D(t),r=0,u=[];for(n in i)!$(Q,n)&&$(i,n)&&u.push(n);for(;e.length>r;)$(i,n=e[r++])&&(~bt(u,n)||u.push(n));return u},At=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Ft=At.concat("length","prototype"),St={f:Object.getOwnPropertyNames||function(t){return mt(t,Ft)}},Ct={f:Object.getOwnPropertySymbols},kt=lt("Reflect","ownKeys")||function(t){var e=St.f(R(t)),n=Ct.f;return n?e.concat(n(t)):e},Dt=function(t,e){for(var n=kt(e),i=P.f,r=I.f,u=0;uu;)P.f(t,n=i[u++],e[n]);return t},Gt=lt("document","documentElement"),Ut=J("IE_PROTO"),Wt=function(){},Vt=function(){var t,e=T("iframe"),n=At.length;for(e.style.display="none",Gt.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write("