Version Description
Fixed compatibility with the new version 3.x of MailChimp for WordPress plugin
Download this release
Release Info
Developer | mihche |
Plugin | WPBruiser {no- Captcha anti-Spam} |
Version | 2.0 |
Comparing to | |
See all releases |
Version 2.0
- assets/admin/images/flags/ad.gif +0 -0
- assets/admin/images/flags/ae.gif +0 -0
- assets/admin/images/flags/af.gif +0 -0
- assets/admin/images/flags/ag.gif +0 -0
- assets/admin/images/flags/ai.gif +0 -0
- assets/admin/images/flags/al.gif +0 -0
- assets/admin/images/flags/am.gif +0 -0
- assets/admin/images/flags/an.gif +0 -0
- assets/admin/images/flags/ao.gif +0 -0
- assets/admin/images/flags/aq.gif +0 -0
- assets/admin/images/flags/ar.gif +0 -0
- assets/admin/images/flags/as.gif +0 -0
- assets/admin/images/flags/at.gif +0 -0
- assets/admin/images/flags/au.gif +0 -0
- assets/admin/images/flags/aw.gif +0 -0
- assets/admin/images/flags/ax.gif +0 -0
- assets/admin/images/flags/az.gif +0 -0
- assets/admin/images/flags/ba.gif +0 -0
- assets/admin/images/flags/bb.gif +0 -0
- assets/admin/images/flags/bd.gif +0 -0
- assets/admin/images/flags/be.gif +0 -0
- assets/admin/images/flags/bf.gif +0 -0
- assets/admin/images/flags/bg.gif +0 -0
- assets/admin/images/flags/bh.gif +0 -0
- assets/admin/images/flags/bi.gif +0 -0
- assets/admin/images/flags/bj.gif +0 -0
- assets/admin/images/flags/bl.gif +0 -0
- assets/admin/images/flags/bm.gif +0 -0
- assets/admin/images/flags/bn.gif +0 -0
- assets/admin/images/flags/bo.gif +0 -0
- assets/admin/images/flags/br.gif +0 -0
- assets/admin/images/flags/bs.gif +0 -0
- assets/admin/images/flags/bt.gif +0 -0
- assets/admin/images/flags/bv.gif +0 -0
- assets/admin/images/flags/bw.gif +0 -0
- assets/admin/images/flags/by.gif +0 -0
- assets/admin/images/flags/bz.gif +0 -0
- assets/admin/images/flags/ca.gif +0 -0
- assets/admin/images/flags/catalonia.gif +0 -0
- assets/admin/images/flags/cc.gif +0 -0
- assets/admin/images/flags/cd.gif +0 -0
- assets/admin/images/flags/cf.gif +0 -0
- assets/admin/images/flags/cg.gif +0 -0
- assets/admin/images/flags/ch.gif +0 -0
- assets/admin/images/flags/ci.gif +0 -0
- assets/admin/images/flags/ck.gif +0 -0
- assets/admin/images/flags/cl.gif +0 -0
- assets/admin/images/flags/cm.gif +0 -0
- assets/admin/images/flags/cn.gif +0 -0
- assets/admin/images/flags/co.gif +0 -0
- assets/admin/images/flags/cr.gif +0 -0
- assets/admin/images/flags/cs.gif +0 -0
- assets/admin/images/flags/cu.gif +0 -0
- assets/admin/images/flags/cv.gif +0 -0
- assets/admin/images/flags/cx.gif +0 -0
- assets/admin/images/flags/cy.gif +0 -0
- assets/admin/images/flags/cz.gif +0 -0
- assets/admin/images/flags/de.gif +0 -0
- assets/admin/images/flags/dj.gif +0 -0
- assets/admin/images/flags/dk.gif +0 -0
- assets/admin/images/flags/dm.gif +0 -0
- assets/admin/images/flags/do.gif +0 -0
- assets/admin/images/flags/dz.gif +0 -0
- assets/admin/images/flags/ec.gif +0 -0
- assets/admin/images/flags/ee.gif +0 -0
- assets/admin/images/flags/eg.gif +0 -0
- assets/admin/images/flags/eh.gif +0 -0
- assets/admin/images/flags/england.gif +0 -0
- assets/admin/images/flags/er.gif +0 -0
- assets/admin/images/flags/es.gif +0 -0
- assets/admin/images/flags/et.gif +0 -0
- assets/admin/images/flags/eu.gif +0 -0
- assets/admin/images/flags/fam.gif +0 -0
- assets/admin/images/flags/fi.gif +0 -0
- assets/admin/images/flags/fj.gif +0 -0
- assets/admin/images/flags/fk.gif +0 -0
- assets/admin/images/flags/fm.gif +0 -0
- assets/admin/images/flags/fo.gif +0 -0
- assets/admin/images/flags/fr.gif +0 -0
- assets/admin/images/flags/ga.gif +0 -0
- assets/admin/images/flags/gb.gif +0 -0
- assets/admin/images/flags/gd.gif +0 -0
- assets/admin/images/flags/ge.gif +0 -0
- assets/admin/images/flags/gf.gif +0 -0
- assets/admin/images/flags/gg.gif +0 -0
- assets/admin/images/flags/gh.gif +0 -0
- assets/admin/images/flags/gi.gif +0 -0
- assets/admin/images/flags/gl.gif +0 -0
- assets/admin/images/flags/gm.gif +0 -0
- assets/admin/images/flags/gn.gif +0 -0
- assets/admin/images/flags/gp.gif +0 -0
- assets/admin/images/flags/gq.gif +0 -0
- assets/admin/images/flags/gr.gif +0 -0
- assets/admin/images/flags/gs.gif +0 -0
- assets/admin/images/flags/gt.gif +0 -0
- assets/admin/images/flags/gu.gif +0 -0
- assets/admin/images/flags/gw.gif +0 -0
- assets/admin/images/flags/gy.gif +0 -0
- assets/admin/images/flags/hk.gif +0 -0
- assets/admin/images/flags/hm.gif +0 -0
- assets/admin/images/flags/hn.gif +0 -0
- assets/admin/images/flags/hr.gif +0 -0
- assets/admin/images/flags/ht.gif +0 -0
- assets/admin/images/flags/hu.gif +0 -0
- assets/admin/images/flags/id.gif +0 -0
- assets/admin/images/flags/ie.gif +0 -0
- assets/admin/images/flags/il.gif +0 -0
- assets/admin/images/flags/im.gif +0 -0
- assets/admin/images/flags/in.gif +0 -0
- assets/admin/images/flags/io.gif +0 -0
- assets/admin/images/flags/iq.gif +0 -0
- assets/admin/images/flags/ir.gif +0 -0
- assets/admin/images/flags/is.gif +0 -0
- assets/admin/images/flags/it.gif +0 -0
- assets/admin/images/flags/je.gif +0 -0
- assets/admin/images/flags/jm.gif +0 -0
- assets/admin/images/flags/jo.gif +0 -0
- assets/admin/images/flags/jp.gif +0 -0
- assets/admin/images/flags/ke.gif +0 -0
- assets/admin/images/flags/kg.gif +0 -0
- assets/admin/images/flags/kh.gif +0 -0
- assets/admin/images/flags/ki.gif +0 -0
- assets/admin/images/flags/km.gif +0 -0
- assets/admin/images/flags/kn.gif +0 -0
- assets/admin/images/flags/kp.gif +0 -0
- assets/admin/images/flags/kr.gif +0 -0
- assets/admin/images/flags/kw.gif +0 -0
- assets/admin/images/flags/ky.gif +0 -0
- assets/admin/images/flags/kz.gif +0 -0
- assets/admin/images/flags/la.gif +0 -0
- assets/admin/images/flags/lb.gif +0 -0
- assets/admin/images/flags/lc.gif +0 -0
- assets/admin/images/flags/li.gif +0 -0
- assets/admin/images/flags/lk.gif +0 -0
- assets/admin/images/flags/lr.gif +0 -0
- assets/admin/images/flags/ls.gif +0 -0
- assets/admin/images/flags/lt.gif +0 -0
- assets/admin/images/flags/lu.gif +0 -0
- assets/admin/images/flags/lv.gif +0 -0
- assets/admin/images/flags/ly.gif +0 -0
- assets/admin/images/flags/ma.gif +0 -0
- assets/admin/images/flags/mc.gif +0 -0
- assets/admin/images/flags/md.gif +0 -0
- assets/admin/images/flags/me.gif +0 -0
- assets/admin/images/flags/mf.gif +0 -0
- assets/admin/images/flags/mg.gif +0 -0
- assets/admin/images/flags/mh.gif +0 -0
- assets/admin/images/flags/mk.gif +0 -0
- assets/admin/images/flags/ml.gif +0 -0
- assets/admin/images/flags/mm.gif +0 -0
- assets/admin/images/flags/mn.gif +0 -0
- assets/admin/images/flags/mo.gif +0 -0
- assets/admin/images/flags/mp.gif +0 -0
- assets/admin/images/flags/mq.gif +0 -0
- assets/admin/images/flags/mr.gif +0 -0
- assets/admin/images/flags/ms.gif +0 -0
- assets/admin/images/flags/mt.gif +0 -0
- assets/admin/images/flags/mu.gif +0 -0
- assets/admin/images/flags/mv.gif +0 -0
- assets/admin/images/flags/mw.gif +0 -0
- assets/admin/images/flags/mx.gif +0 -0
- assets/admin/images/flags/my.gif +0 -0
- assets/admin/images/flags/mz.gif +0 -0
- assets/admin/images/flags/na.gif +0 -0
- assets/admin/images/flags/nc.gif +0 -0
- assets/admin/images/flags/ne.gif +0 -0
- assets/admin/images/flags/nf.gif +0 -0
- assets/admin/images/flags/ng.gif +0 -0
- assets/admin/images/flags/ni.gif +0 -0
- assets/admin/images/flags/nl.gif +0 -0
- assets/admin/images/flags/no.gif +0 -0
- assets/admin/images/flags/np.gif +0 -0
- assets/admin/images/flags/nr.gif +0 -0
- assets/admin/images/flags/nu.gif +0 -0
- assets/admin/images/flags/nz.gif +0 -0
- assets/admin/images/flags/om.gif +0 -0
- assets/admin/images/flags/pa.gif +0 -0
- assets/admin/images/flags/pe.gif +0 -0
- assets/admin/images/flags/pf.gif +0 -0
- assets/admin/images/flags/pg.gif +0 -0
- assets/admin/images/flags/ph.gif +0 -0
- assets/admin/images/flags/pk.gif +0 -0
- assets/admin/images/flags/pl.gif +0 -0
- assets/admin/images/flags/pm.gif +0 -0
- assets/admin/images/flags/pn.gif +0 -0
- assets/admin/images/flags/pr.gif +0 -0
- assets/admin/images/flags/ps.gif +0 -0
- assets/admin/images/flags/pt.gif +0 -0
- assets/admin/images/flags/pw.gif +0 -0
- assets/admin/images/flags/py.gif +0 -0
- assets/admin/images/flags/qa.gif +0 -0
- assets/admin/images/flags/re.gif +0 -0
- assets/admin/images/flags/ro.gif +0 -0
- assets/admin/images/flags/rs.gif +0 -0
- assets/admin/images/flags/ru.gif +0 -0
- assets/admin/images/flags/rw.gif +0 -0
- assets/admin/images/flags/sa.gif +0 -0
- assets/admin/images/flags/sb.gif +0 -0
- assets/admin/images/flags/sc.gif +0 -0
- assets/admin/images/flags/scotland.gif +0 -0
- assets/admin/images/flags/sd.gif +0 -0
- assets/admin/images/flags/se.gif +0 -0
- assets/admin/images/flags/sg.gif +0 -0
- assets/admin/images/flags/sh.gif +0 -0
- assets/admin/images/flags/si.gif +0 -0
- assets/admin/images/flags/sj.gif +0 -0
- assets/admin/images/flags/sk.gif +0 -0
- assets/admin/images/flags/sl.gif +0 -0
- assets/admin/images/flags/sm.gif +0 -0
- assets/admin/images/flags/sn.gif +0 -0
- assets/admin/images/flags/so.gif +0 -0
- assets/admin/images/flags/sr.gif +0 -0
- assets/admin/images/flags/st.gif +0 -0
- assets/admin/images/flags/sv.gif +0 -0
- assets/admin/images/flags/sy.gif +0 -0
- assets/admin/images/flags/sz.gif +0 -0
- assets/admin/images/flags/tc.gif +0 -0
- assets/admin/images/flags/td.gif +0 -0
- assets/admin/images/flags/tf.gif +0 -0
- assets/admin/images/flags/tg.gif +0 -0
- assets/admin/images/flags/th.gif +0 -0
- assets/admin/images/flags/tj.gif +0 -0
- assets/admin/images/flags/tk.gif +0 -0
- assets/admin/images/flags/tl.gif +0 -0
- assets/admin/images/flags/tm.gif +0 -0
- assets/admin/images/flags/tn.gif +0 -0
- assets/admin/images/flags/to.gif +0 -0
- assets/admin/images/flags/tr.gif +0 -0
- assets/admin/images/flags/tt.gif +0 -0
- assets/admin/images/flags/tv.gif +0 -0
- assets/admin/images/flags/tw.gif +0 -0
- assets/admin/images/flags/tz.gif +0 -0
- assets/admin/images/flags/ua.gif +0 -0
- assets/admin/images/flags/ug.gif +0 -0
- assets/admin/images/flags/um.gif +0 -0
- assets/admin/images/flags/us.gif +0 -0
- assets/admin/images/flags/uy.gif +0 -0
- assets/admin/images/flags/uz.gif +0 -0
- assets/admin/images/flags/va.gif +0 -0
- assets/admin/images/flags/vc.gif +0 -0
- assets/admin/images/flags/ve.gif +0 -0
- assets/admin/images/flags/vg.gif +0 -0
- assets/admin/images/flags/vi.gif +0 -0
- assets/admin/images/flags/vn.gif +0 -0
- assets/admin/images/flags/vu.gif +0 -0
- assets/admin/images/flags/wales.gif +0 -0
- assets/admin/images/flags/wf.gif +0 -0
- assets/admin/images/flags/ws.gif +0 -0
- assets/admin/images/flags/ye.gif +0 -0
- assets/admin/images/flags/yt.gif +0 -0
- assets/admin/images/flags/za.gif +0 -0
- assets/admin/images/flags/zm.gif +0 -0
- assets/admin/images/flags/zw.gif +0 -0
- assets/admin/images/gdbc-favicon.png +0 -0
- assets/admin/images/gdbc-logo.png +0 -0
- assets/admin/scripts/bootstrap.min.js +1 -0
- assets/admin/scripts/easy-pie-chart.js +359 -0
- assets/admin/scripts/gdbc-admin.js +47 -0
- assets/admin/scripts/gdbc-reports.js +828 -0
- assets/admin/scripts/jquery-flot-tooltip.js +571 -0
- assets/admin/scripts/jquery-flot.js +3601 -0
- assets/admin/scripts/jquery-jvectormap-1.2.2.min.js +8 -0
- assets/admin/scripts/jquery-jvectormap-world-mill-en.js +1 -0
- assets/admin/scripts/morris.js +1892 -0
- assets/admin/scripts/raphael.js +11 -0
- assets/admin/styles/bootstrap.css +6174 -0
- assets/admin/styles/fonts/glyphicons-halflings-regular.eot +0 -0
- assets/admin/styles/fonts/glyphicons-halflings-regular.svg +229 -0
- assets/admin/styles/fonts/glyphicons-halflings-regular.ttf +0 -0
- assets/admin/styles/fonts/glyphicons-halflings-regular.woff +0 -0
- assets/admin/styles/gdbc-admin.css +832 -0
- assets/admin/styles/morris.css +2 -0
- assets/public/scripts/gdbc-client.js.php +84 -0
- assets/public/scripts/gdbc-public.js +33 -0
- assets/public/scripts/index.php +1 -0
- engine/GdbcAjaxController.php +166 -0
- engine/GdbcBruteGuardian.php +230 -0
- engine/GdbcIPUtils.php +404 -0
- engine/GdbcModulesController.php +566 -0
- engine/GdbcNotificationsController.php +152 -0
- engine/GdbcRequestController.php +288 -0
- engine/GdbcTaskScheduler.php +58 -0
- engine/GdbcUpdatesController.php +317 -0
- engine/GoodByeCaptchaAdmin.php +306 -0
- engine/GoodByeCaptchaPublic.php +91 -0
- engine/GoodByeCaptchaUtils.php +593 -0
- engine/admin/GdbcAdminNotice.php +34 -0
- engine/admin/pages/GdbcBaseAdminPage.php +98 -0
- engine/admin/pages/GdbcContactFormsAdminPage.php +55 -0
- engine/admin/pages/GdbcMembershipAdminPage.php +52 -0
- engine/admin/pages/GdbcNotificationsAdminPage.php +41 -0
- engine/admin/pages/GdbcOthersAdminPage.php +71 -0
- engine/admin/pages/GdbcReportsAdminPage.php +64 -0
- engine/admin/pages/GdbcSecurityAdminPage.php +161 -0
- engine/admin/pages/GdbcSettingsAdminPage.php +37 -0
- engine/admin/pages/GdbcWordpressAdminPage.php +107 -0
- engine/db-access/GdbcDbAccessController.php +356 -0
- engine/entities/GdbcAttemptEntity.php +64 -0
- engine/modules/GdbcBaseAdminModule.php +194 -0
- engine/modules/GdbcBasePublicModule.php +100 -0
- engine/modules/black-listed-ips/GdbcBlackListedIpsAdminModule.php +249 -0
- engine/modules/black-listed-ips/GdbcBlackListedIpsPublicModule.php +43 -0
- engine/modules/black-listed-ips/partials/admin-settings.php +214 -0
- engine/modules/brute-force/GdbcBruteForceAdminModule.php +156 -0
- engine/modules/brute-force/GdbcBruteForcePublicModule.php +66 -0
- engine/modules/email-notifications/GdbcEmailNotificationsAdminModule.php +101 -0
- engine/modules/email-notifications/GdbcEmailNotificationsPublicModule.php +27 -0
assets/admin/images/flags/ad.gif
ADDED
Binary file
|
assets/admin/images/flags/ae.gif
ADDED
Binary file
|
assets/admin/images/flags/af.gif
ADDED
Binary file
|
assets/admin/images/flags/ag.gif
ADDED
Binary file
|
assets/admin/images/flags/ai.gif
ADDED
Binary file
|
assets/admin/images/flags/al.gif
ADDED
Binary file
|
assets/admin/images/flags/am.gif
ADDED
Binary file
|
assets/admin/images/flags/an.gif
ADDED
Binary file
|
assets/admin/images/flags/ao.gif
ADDED
Binary file
|
assets/admin/images/flags/aq.gif
ADDED
Binary file
|
assets/admin/images/flags/ar.gif
ADDED
Binary file
|
assets/admin/images/flags/as.gif
ADDED
Binary file
|
assets/admin/images/flags/at.gif
ADDED
Binary file
|
assets/admin/images/flags/au.gif
ADDED
Binary file
|
assets/admin/images/flags/aw.gif
ADDED
Binary file
|
assets/admin/images/flags/ax.gif
ADDED
Binary file
|
assets/admin/images/flags/az.gif
ADDED
Binary file
|
assets/admin/images/flags/ba.gif
ADDED
Binary file
|
assets/admin/images/flags/bb.gif
ADDED
Binary file
|
assets/admin/images/flags/bd.gif
ADDED
Binary file
|
assets/admin/images/flags/be.gif
ADDED
Binary file
|
assets/admin/images/flags/bf.gif
ADDED
Binary file
|
assets/admin/images/flags/bg.gif
ADDED
Binary file
|
assets/admin/images/flags/bh.gif
ADDED
Binary file
|
assets/admin/images/flags/bi.gif
ADDED
Binary file
|
assets/admin/images/flags/bj.gif
ADDED
Binary file
|
assets/admin/images/flags/bl.gif
ADDED
Binary file
|
assets/admin/images/flags/bm.gif
ADDED
Binary file
|
assets/admin/images/flags/bn.gif
ADDED
Binary file
|
assets/admin/images/flags/bo.gif
ADDED
Binary file
|
assets/admin/images/flags/br.gif
ADDED
Binary file
|
assets/admin/images/flags/bs.gif
ADDED
Binary file
|
assets/admin/images/flags/bt.gif
ADDED
Binary file
|
assets/admin/images/flags/bv.gif
ADDED
Binary file
|
assets/admin/images/flags/bw.gif
ADDED
Binary file
|
assets/admin/images/flags/by.gif
ADDED
Binary file
|
assets/admin/images/flags/bz.gif
ADDED
Binary file
|
assets/admin/images/flags/ca.gif
ADDED
Binary file
|
assets/admin/images/flags/catalonia.gif
ADDED
Binary file
|
assets/admin/images/flags/cc.gif
ADDED
Binary file
|
assets/admin/images/flags/cd.gif
ADDED
Binary file
|
assets/admin/images/flags/cf.gif
ADDED
Binary file
|
assets/admin/images/flags/cg.gif
ADDED
Binary file
|
assets/admin/images/flags/ch.gif
ADDED
Binary file
|
assets/admin/images/flags/ci.gif
ADDED
Binary file
|
assets/admin/images/flags/ck.gif
ADDED
Binary file
|
assets/admin/images/flags/cl.gif
ADDED
Binary file
|
assets/admin/images/flags/cm.gif
ADDED
Binary file
|
assets/admin/images/flags/cn.gif
ADDED
Binary file
|
assets/admin/images/flags/co.gif
ADDED
Binary file
|
assets/admin/images/flags/cr.gif
ADDED
Binary file
|
assets/admin/images/flags/cs.gif
ADDED
Binary file
|
assets/admin/images/flags/cu.gif
ADDED
Binary file
|
assets/admin/images/flags/cv.gif
ADDED
Binary file
|
assets/admin/images/flags/cx.gif
ADDED
Binary file
|
assets/admin/images/flags/cy.gif
ADDED
Binary file
|
assets/admin/images/flags/cz.gif
ADDED
Binary file
|
assets/admin/images/flags/de.gif
ADDED
Binary file
|
assets/admin/images/flags/dj.gif
ADDED
Binary file
|
assets/admin/images/flags/dk.gif
ADDED
Binary file
|
assets/admin/images/flags/dm.gif
ADDED
Binary file
|
assets/admin/images/flags/do.gif
ADDED
Binary file
|
assets/admin/images/flags/dz.gif
ADDED
Binary file
|
assets/admin/images/flags/ec.gif
ADDED
Binary file
|
assets/admin/images/flags/ee.gif
ADDED
Binary file
|
assets/admin/images/flags/eg.gif
ADDED
Binary file
|
assets/admin/images/flags/eh.gif
ADDED
Binary file
|
assets/admin/images/flags/england.gif
ADDED
Binary file
|
assets/admin/images/flags/er.gif
ADDED
Binary file
|
assets/admin/images/flags/es.gif
ADDED
Binary file
|
assets/admin/images/flags/et.gif
ADDED
Binary file
|
assets/admin/images/flags/eu.gif
ADDED
Binary file
|
assets/admin/images/flags/fam.gif
ADDED
Binary file
|
assets/admin/images/flags/fi.gif
ADDED
Binary file
|
assets/admin/images/flags/fj.gif
ADDED
Binary file
|
assets/admin/images/flags/fk.gif
ADDED
Binary file
|
assets/admin/images/flags/fm.gif
ADDED
Binary file
|
assets/admin/images/flags/fo.gif
ADDED
Binary file
|
assets/admin/images/flags/fr.gif
ADDED
Binary file
|
assets/admin/images/flags/ga.gif
ADDED
Binary file
|
assets/admin/images/flags/gb.gif
ADDED
Binary file
|
assets/admin/images/flags/gd.gif
ADDED
Binary file
|
assets/admin/images/flags/ge.gif
ADDED
Binary file
|
assets/admin/images/flags/gf.gif
ADDED
Binary file
|
assets/admin/images/flags/gg.gif
ADDED
Binary file
|
assets/admin/images/flags/gh.gif
ADDED
Binary file
|
assets/admin/images/flags/gi.gif
ADDED
Binary file
|
assets/admin/images/flags/gl.gif
ADDED
Binary file
|
assets/admin/images/flags/gm.gif
ADDED
Binary file
|
assets/admin/images/flags/gn.gif
ADDED
Binary file
|
assets/admin/images/flags/gp.gif
ADDED
Binary file
|
assets/admin/images/flags/gq.gif
ADDED
Binary file
|
assets/admin/images/flags/gr.gif
ADDED
Binary file
|
assets/admin/images/flags/gs.gif
ADDED
Binary file
|
assets/admin/images/flags/gt.gif
ADDED
Binary file
|
assets/admin/images/flags/gu.gif
ADDED
Binary file
|
assets/admin/images/flags/gw.gif
ADDED
Binary file
|
assets/admin/images/flags/gy.gif
ADDED
Binary file
|
assets/admin/images/flags/hk.gif
ADDED
Binary file
|
assets/admin/images/flags/hm.gif
ADDED
Binary file
|
assets/admin/images/flags/hn.gif
ADDED
Binary file
|
assets/admin/images/flags/hr.gif
ADDED
Binary file
|
assets/admin/images/flags/ht.gif
ADDED
Binary file
|
assets/admin/images/flags/hu.gif
ADDED
Binary file
|
assets/admin/images/flags/id.gif
ADDED
Binary file
|
assets/admin/images/flags/ie.gif
ADDED
Binary file
|
assets/admin/images/flags/il.gif
ADDED
Binary file
|
assets/admin/images/flags/im.gif
ADDED
Binary file
|
assets/admin/images/flags/in.gif
ADDED
Binary file
|
assets/admin/images/flags/io.gif
ADDED
Binary file
|
assets/admin/images/flags/iq.gif
ADDED
Binary file
|
assets/admin/images/flags/ir.gif
ADDED
Binary file
|
assets/admin/images/flags/is.gif
ADDED
Binary file
|
assets/admin/images/flags/it.gif
ADDED
Binary file
|
assets/admin/images/flags/je.gif
ADDED
Binary file
|
assets/admin/images/flags/jm.gif
ADDED
Binary file
|
assets/admin/images/flags/jo.gif
ADDED
Binary file
|
assets/admin/images/flags/jp.gif
ADDED
Binary file
|
assets/admin/images/flags/ke.gif
ADDED
Binary file
|
assets/admin/images/flags/kg.gif
ADDED
Binary file
|
assets/admin/images/flags/kh.gif
ADDED
Binary file
|
assets/admin/images/flags/ki.gif
ADDED
Binary file
|
assets/admin/images/flags/km.gif
ADDED
Binary file
|
assets/admin/images/flags/kn.gif
ADDED
Binary file
|
assets/admin/images/flags/kp.gif
ADDED
Binary file
|
assets/admin/images/flags/kr.gif
ADDED
Binary file
|
assets/admin/images/flags/kw.gif
ADDED
Binary file
|
assets/admin/images/flags/ky.gif
ADDED
Binary file
|
assets/admin/images/flags/kz.gif
ADDED
Binary file
|
assets/admin/images/flags/la.gif
ADDED
Binary file
|
assets/admin/images/flags/lb.gif
ADDED
Binary file
|
assets/admin/images/flags/lc.gif
ADDED
Binary file
|
assets/admin/images/flags/li.gif
ADDED
Binary file
|
assets/admin/images/flags/lk.gif
ADDED
Binary file
|
assets/admin/images/flags/lr.gif
ADDED
Binary file
|
assets/admin/images/flags/ls.gif
ADDED
Binary file
|
assets/admin/images/flags/lt.gif
ADDED
Binary file
|
assets/admin/images/flags/lu.gif
ADDED
Binary file
|
assets/admin/images/flags/lv.gif
ADDED
Binary file
|
assets/admin/images/flags/ly.gif
ADDED
Binary file
|
assets/admin/images/flags/ma.gif
ADDED
Binary file
|
assets/admin/images/flags/mc.gif
ADDED
Binary file
|
assets/admin/images/flags/md.gif
ADDED
Binary file
|
assets/admin/images/flags/me.gif
ADDED
Binary file
|
assets/admin/images/flags/mf.gif
ADDED
Binary file
|
assets/admin/images/flags/mg.gif
ADDED
Binary file
|
assets/admin/images/flags/mh.gif
ADDED
Binary file
|
assets/admin/images/flags/mk.gif
ADDED
Binary file
|
assets/admin/images/flags/ml.gif
ADDED
Binary file
|
assets/admin/images/flags/mm.gif
ADDED
Binary file
|
assets/admin/images/flags/mn.gif
ADDED
Binary file
|
assets/admin/images/flags/mo.gif
ADDED
Binary file
|
assets/admin/images/flags/mp.gif
ADDED
Binary file
|
assets/admin/images/flags/mq.gif
ADDED
Binary file
|
assets/admin/images/flags/mr.gif
ADDED
Binary file
|
assets/admin/images/flags/ms.gif
ADDED
Binary file
|
assets/admin/images/flags/mt.gif
ADDED
Binary file
|
assets/admin/images/flags/mu.gif
ADDED
Binary file
|
assets/admin/images/flags/mv.gif
ADDED
Binary file
|
assets/admin/images/flags/mw.gif
ADDED
Binary file
|
assets/admin/images/flags/mx.gif
ADDED
Binary file
|
assets/admin/images/flags/my.gif
ADDED
Binary file
|
assets/admin/images/flags/mz.gif
ADDED
Binary file
|
assets/admin/images/flags/na.gif
ADDED
Binary file
|
assets/admin/images/flags/nc.gif
ADDED
Binary file
|
assets/admin/images/flags/ne.gif
ADDED
Binary file
|
assets/admin/images/flags/nf.gif
ADDED
Binary file
|
assets/admin/images/flags/ng.gif
ADDED
Binary file
|
assets/admin/images/flags/ni.gif
ADDED
Binary file
|
assets/admin/images/flags/nl.gif
ADDED
Binary file
|
assets/admin/images/flags/no.gif
ADDED
Binary file
|
assets/admin/images/flags/np.gif
ADDED
Binary file
|
assets/admin/images/flags/nr.gif
ADDED
Binary file
|
assets/admin/images/flags/nu.gif
ADDED
Binary file
|
assets/admin/images/flags/nz.gif
ADDED
Binary file
|
assets/admin/images/flags/om.gif
ADDED
Binary file
|
assets/admin/images/flags/pa.gif
ADDED
Binary file
|
assets/admin/images/flags/pe.gif
ADDED
Binary file
|
assets/admin/images/flags/pf.gif
ADDED
Binary file
|
assets/admin/images/flags/pg.gif
ADDED
Binary file
|
assets/admin/images/flags/ph.gif
ADDED
Binary file
|
assets/admin/images/flags/pk.gif
ADDED
Binary file
|
assets/admin/images/flags/pl.gif
ADDED
Binary file
|
assets/admin/images/flags/pm.gif
ADDED
Binary file
|
assets/admin/images/flags/pn.gif
ADDED
Binary file
|
assets/admin/images/flags/pr.gif
ADDED
Binary file
|
assets/admin/images/flags/ps.gif
ADDED
Binary file
|
assets/admin/images/flags/pt.gif
ADDED
Binary file
|
assets/admin/images/flags/pw.gif
ADDED
Binary file
|
assets/admin/images/flags/py.gif
ADDED
Binary file
|
assets/admin/images/flags/qa.gif
ADDED
Binary file
|
assets/admin/images/flags/re.gif
ADDED
Binary file
|
assets/admin/images/flags/ro.gif
ADDED
Binary file
|
assets/admin/images/flags/rs.gif
ADDED
Binary file
|
assets/admin/images/flags/ru.gif
ADDED
Binary file
|
assets/admin/images/flags/rw.gif
ADDED
Binary file
|
assets/admin/images/flags/sa.gif
ADDED
Binary file
|
assets/admin/images/flags/sb.gif
ADDED
Binary file
|
assets/admin/images/flags/sc.gif
ADDED
Binary file
|
assets/admin/images/flags/scotland.gif
ADDED
Binary file
|
assets/admin/images/flags/sd.gif
ADDED
Binary file
|
assets/admin/images/flags/se.gif
ADDED
Binary file
|
assets/admin/images/flags/sg.gif
ADDED
Binary file
|
assets/admin/images/flags/sh.gif
ADDED
Binary file
|
assets/admin/images/flags/si.gif
ADDED
Binary file
|
assets/admin/images/flags/sj.gif
ADDED
Binary file
|
assets/admin/images/flags/sk.gif
ADDED
Binary file
|
assets/admin/images/flags/sl.gif
ADDED
Binary file
|
assets/admin/images/flags/sm.gif
ADDED
Binary file
|
assets/admin/images/flags/sn.gif
ADDED
Binary file
|
assets/admin/images/flags/so.gif
ADDED
Binary file
|
assets/admin/images/flags/sr.gif
ADDED
Binary file
|
assets/admin/images/flags/st.gif
ADDED
Binary file
|
assets/admin/images/flags/sv.gif
ADDED
Binary file
|
assets/admin/images/flags/sy.gif
ADDED
Binary file
|
assets/admin/images/flags/sz.gif
ADDED
Binary file
|
assets/admin/images/flags/tc.gif
ADDED
Binary file
|
assets/admin/images/flags/td.gif
ADDED
Binary file
|
assets/admin/images/flags/tf.gif
ADDED
Binary file
|
assets/admin/images/flags/tg.gif
ADDED
Binary file
|
assets/admin/images/flags/th.gif
ADDED
Binary file
|
assets/admin/images/flags/tj.gif
ADDED
Binary file
|
assets/admin/images/flags/tk.gif
ADDED
Binary file
|
assets/admin/images/flags/tl.gif
ADDED
Binary file
|
assets/admin/images/flags/tm.gif
ADDED
Binary file
|
assets/admin/images/flags/tn.gif
ADDED
Binary file
|
assets/admin/images/flags/to.gif
ADDED
Binary file
|
assets/admin/images/flags/tr.gif
ADDED
Binary file
|
assets/admin/images/flags/tt.gif
ADDED
Binary file
|
assets/admin/images/flags/tv.gif
ADDED
Binary file
|
assets/admin/images/flags/tw.gif
ADDED
Binary file
|
assets/admin/images/flags/tz.gif
ADDED
Binary file
|
assets/admin/images/flags/ua.gif
ADDED
Binary file
|
assets/admin/images/flags/ug.gif
ADDED
Binary file
|
assets/admin/images/flags/um.gif
ADDED
Binary file
|
assets/admin/images/flags/us.gif
ADDED
Binary file
|
assets/admin/images/flags/uy.gif
ADDED
Binary file
|
assets/admin/images/flags/uz.gif
ADDED
Binary file
|
assets/admin/images/flags/va.gif
ADDED
Binary file
|
assets/admin/images/flags/vc.gif
ADDED
Binary file
|
assets/admin/images/flags/ve.gif
ADDED
Binary file
|
assets/admin/images/flags/vg.gif
ADDED
Binary file
|
assets/admin/images/flags/vi.gif
ADDED
Binary file
|
assets/admin/images/flags/vn.gif
ADDED
Binary file
|
assets/admin/images/flags/vu.gif
ADDED
Binary file
|
assets/admin/images/flags/wales.gif
ADDED
Binary file
|
assets/admin/images/flags/wf.gif
ADDED
Binary file
|
assets/admin/images/flags/ws.gif
ADDED
Binary file
|
assets/admin/images/flags/ye.gif
ADDED
Binary file
|
assets/admin/images/flags/yt.gif
ADDED
Binary file
|
assets/admin/images/flags/za.gif
ADDED
Binary file
|
assets/admin/images/flags/zm.gif
ADDED
Binary file
|
assets/admin/images/flags/zw.gif
ADDED
Binary file
|
assets/admin/images/gdbc-favicon.png
ADDED
Binary file
|
assets/admin/images/gdbc-logo.png
ADDED
Binary file
|
assets/admin/scripts/bootstrap.min.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
|
assets/admin/scripts/easy-pie-chart.js
ADDED
@@ -0,0 +1,359 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**!
|
2 |
+
* easyPieChart
|
3 |
+
* Lightweight plugin to render simple, animated and retina optimized pie charts
|
4 |
+
*
|
5 |
+
* @license
|
6 |
+
* @author Robert Fleischmann <rendro87@gmail.com> (http://robert-fleischmann.de)
|
7 |
+
* @version 2.1.5
|
8 |
+
**/
|
9 |
+
|
10 |
+
(function(root, factory) {
|
11 |
+
if(typeof exports === 'object') {
|
12 |
+
module.exports = factory(require('jquery'));
|
13 |
+
}
|
14 |
+
else if(typeof define === 'function' && define.amd) {
|
15 |
+
define(['jquery'], factory);
|
16 |
+
}
|
17 |
+
else {
|
18 |
+
factory(root.jQuery);
|
19 |
+
}
|
20 |
+
}(this, function($) {
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Renderer to render the chart on a canvas object
|
24 |
+
* @param {DOMElement} el DOM element to host the canvas (root of the plugin)
|
25 |
+
* @param {object} options options object of the plugin
|
26 |
+
*/
|
27 |
+
var CanvasRenderer = function(el, options) {
|
28 |
+
var cachedBackground;
|
29 |
+
var canvas = document.createElement('canvas');
|
30 |
+
|
31 |
+
el.appendChild(canvas);
|
32 |
+
|
33 |
+
if (typeof(G_vmlCanvasManager) !== 'undefined') {
|
34 |
+
G_vmlCanvasManager.initElement(canvas);
|
35 |
+
}
|
36 |
+
|
37 |
+
var ctx = canvas.getContext('2d');
|
38 |
+
|
39 |
+
canvas.width = canvas.height = options.size;
|
40 |
+
|
41 |
+
// canvas on retina devices
|
42 |
+
var scaleBy = 1;
|
43 |
+
if (window.devicePixelRatio > 1) {
|
44 |
+
scaleBy = window.devicePixelRatio;
|
45 |
+
canvas.style.width = canvas.style.height = [options.size, 'px'].join('');
|
46 |
+
canvas.width = canvas.height = options.size * scaleBy;
|
47 |
+
ctx.scale(scaleBy, scaleBy);
|
48 |
+
}
|
49 |
+
|
50 |
+
// move 0,0 coordinates to the center
|
51 |
+
ctx.translate(options.size / 2, options.size / 2);
|
52 |
+
|
53 |
+
// rotate canvas -90deg
|
54 |
+
ctx.rotate((-1 / 2 + options.rotate / 180) * Math.PI);
|
55 |
+
|
56 |
+
var radius = (options.size - options.lineWidth) / 2;
|
57 |
+
if (options.scaleColor && options.scaleLength) {
|
58 |
+
radius -= options.scaleLength + 2; // 2 is the distance between scale and bar
|
59 |
+
}
|
60 |
+
|
61 |
+
// IE polyfill for Date
|
62 |
+
Date.now = Date.now || function() {
|
63 |
+
return +(new Date());
|
64 |
+
};
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Draw a circle around the center of the canvas
|
68 |
+
* @param {strong} color Valid CSS color string
|
69 |
+
* @param {number} lineWidth Width of the line in px
|
70 |
+
* @param {number} percent Percentage to draw (float between -1 and 1)
|
71 |
+
*/
|
72 |
+
var drawCircle = function(color, lineWidth, percent) {
|
73 |
+
percent = Math.min(Math.max(-1, percent || 0), 1);
|
74 |
+
var isNegative = percent <= 0 ? true : false;
|
75 |
+
|
76 |
+
ctx.beginPath();
|
77 |
+
ctx.arc(0, 0, radius, 0, Math.PI * 2 * percent, isNegative);
|
78 |
+
|
79 |
+
ctx.strokeStyle = color;
|
80 |
+
ctx.lineWidth = lineWidth;
|
81 |
+
|
82 |
+
ctx.stroke();
|
83 |
+
};
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Draw the scale of the chart
|
87 |
+
*/
|
88 |
+
var drawScale = function() {
|
89 |
+
var offset;
|
90 |
+
var length;
|
91 |
+
|
92 |
+
ctx.lineWidth = 1;
|
93 |
+
ctx.fillStyle = options.scaleColor;
|
94 |
+
|
95 |
+
ctx.save();
|
96 |
+
for (var i = 24; i > 0; --i) {
|
97 |
+
if (i % 6 === 0) {
|
98 |
+
length = options.scaleLength;
|
99 |
+
offset = 0;
|
100 |
+
} else {
|
101 |
+
length = options.scaleLength * 0.6;
|
102 |
+
offset = options.scaleLength - length;
|
103 |
+
}
|
104 |
+
ctx.fillRect(-options.size/2 + offset, 0, length, 1);
|
105 |
+
ctx.rotate(Math.PI / 12);
|
106 |
+
}
|
107 |
+
ctx.restore();
|
108 |
+
};
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Request animation frame wrapper with polyfill
|
112 |
+
* @return {function} Request animation frame method or timeout fallback
|
113 |
+
*/
|
114 |
+
var reqAnimationFrame = (function() {
|
115 |
+
return window.requestAnimationFrame ||
|
116 |
+
window.webkitRequestAnimationFrame ||
|
117 |
+
window.mozRequestAnimationFrame ||
|
118 |
+
function(callback) {
|
119 |
+
window.setTimeout(callback, 1000 / 60);
|
120 |
+
};
|
121 |
+
}());
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Draw the background of the plugin including the scale and the track
|
125 |
+
*/
|
126 |
+
var drawBackground = function() {
|
127 |
+
if(options.scaleColor) drawScale();
|
128 |
+
if(options.trackColor) drawCircle(options.trackColor, options.lineWidth, 1);
|
129 |
+
};
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Canvas accessor
|
133 |
+
*/
|
134 |
+
this.getCanvas = function() {
|
135 |
+
return canvas;
|
136 |
+
};
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Canvas 2D context 'ctx' accessor
|
140 |
+
*/
|
141 |
+
this.getCtx = function() {
|
142 |
+
return ctx;
|
143 |
+
};
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Clear the complete canvas
|
147 |
+
*/
|
148 |
+
this.clear = function() {
|
149 |
+
ctx.clearRect(options.size / -2, options.size / -2, options.size, options.size);
|
150 |
+
};
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Draw the complete chart
|
154 |
+
* @param {number} percent Percent shown by the chart between -100 and 100
|
155 |
+
*/
|
156 |
+
this.draw = function(percent) {
|
157 |
+
// do we need to render a background
|
158 |
+
if (!!options.scaleColor || !!options.trackColor) {
|
159 |
+
// getImageData and putImageData are supported
|
160 |
+
if (ctx.getImageData && ctx.putImageData) {
|
161 |
+
if (!cachedBackground) {
|
162 |
+
drawBackground();
|
163 |
+
cachedBackground = ctx.getImageData(0, 0, options.size * scaleBy, options.size * scaleBy);
|
164 |
+
} else {
|
165 |
+
ctx.putImageData(cachedBackground, 0, 0);
|
166 |
+
}
|
167 |
+
} else {
|
168 |
+
this.clear();
|
169 |
+
drawBackground();
|
170 |
+
}
|
171 |
+
} else {
|
172 |
+
this.clear();
|
173 |
+
}
|
174 |
+
|
175 |
+
ctx.lineCap = options.lineCap;
|
176 |
+
|
177 |
+
// if barcolor is a function execute it and pass the percent as a value
|
178 |
+
var color;
|
179 |
+
if (typeof(options.barColor) === 'function') {
|
180 |
+
color = options.barColor(percent);
|
181 |
+
} else {
|
182 |
+
color = options.barColor;
|
183 |
+
}
|
184 |
+
|
185 |
+
// draw bar
|
186 |
+
drawCircle(color, options.lineWidth, percent / 100);
|
187 |
+
}.bind(this);
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Animate from some percent to some other percentage
|
191 |
+
* @param {number} from Starting percentage
|
192 |
+
* @param {number} to Final percentage
|
193 |
+
*/
|
194 |
+
this.animate = function(from, to) {
|
195 |
+
var startTime = Date.now();
|
196 |
+
options.onStart(from, to);
|
197 |
+
var animation = function() {
|
198 |
+
var process = Math.min(Date.now() - startTime, options.animate.duration);
|
199 |
+
var currentValue = options.easing(this, process, from, to - from, options.animate.duration);
|
200 |
+
this.draw(currentValue);
|
201 |
+
options.onStep(from, to, currentValue);
|
202 |
+
if (process >= options.animate.duration) {
|
203 |
+
options.onStop(from, to);
|
204 |
+
} else {
|
205 |
+
reqAnimationFrame(animation);
|
206 |
+
}
|
207 |
+
}.bind(this);
|
208 |
+
|
209 |
+
reqAnimationFrame(animation);
|
210 |
+
}.bind(this);
|
211 |
+
};
|
212 |
+
|
213 |
+
var EasyPieChart = function(el, opts) {
|
214 |
+
var defaultOptions = {
|
215 |
+
barColor: '#ef1e25',
|
216 |
+
trackColor: '#f9f9f9',
|
217 |
+
scaleColor: '#dfe0e0',
|
218 |
+
scaleLength: 5,
|
219 |
+
lineCap: 'round',
|
220 |
+
lineWidth: 3,
|
221 |
+
size: 110,
|
222 |
+
rotate: 0,
|
223 |
+
animate: {
|
224 |
+
duration: 1000,
|
225 |
+
enabled: true
|
226 |
+
},
|
227 |
+
easing: function (x, t, b, c, d) { // more can be found here: http://gsgd.co.uk/sandbox/jquery/easing/
|
228 |
+
t = t / (d/2);
|
229 |
+
if (t < 1) {
|
230 |
+
return c / 2 * t * t + b;
|
231 |
+
}
|
232 |
+
return -c/2 * ((--t)*(t-2) - 1) + b;
|
233 |
+
},
|
234 |
+
onStart: function(from, to) {
|
235 |
+
return;
|
236 |
+
},
|
237 |
+
onStep: function(from, to, currentValue) {
|
238 |
+
return;
|
239 |
+
},
|
240 |
+
onStop: function(from, to) {
|
241 |
+
return;
|
242 |
+
}
|
243 |
+
};
|
244 |
+
|
245 |
+
// detect present renderer
|
246 |
+
if (typeof(CanvasRenderer) !== 'undefined') {
|
247 |
+
defaultOptions.renderer = CanvasRenderer;
|
248 |
+
} else if (typeof(SVGRenderer) !== 'undefined') {
|
249 |
+
defaultOptions.renderer = SVGRenderer;
|
250 |
+
} else {
|
251 |
+
throw new Error('Please load either the SVG- or the CanvasRenderer');
|
252 |
+
}
|
253 |
+
|
254 |
+
var options = {};
|
255 |
+
var currentValue = 0;
|
256 |
+
|
257 |
+
/**
|
258 |
+
* Initialize the plugin by creating the options object and initialize rendering
|
259 |
+
*/
|
260 |
+
var init = function() {
|
261 |
+
this.el = el;
|
262 |
+
this.options = options;
|
263 |
+
|
264 |
+
// merge user options into default options
|
265 |
+
for (var i in defaultOptions) {
|
266 |
+
if (defaultOptions.hasOwnProperty(i)) {
|
267 |
+
options[i] = opts && typeof(opts[i]) !== 'undefined' ? opts[i] : defaultOptions[i];
|
268 |
+
if (typeof(options[i]) === 'function') {
|
269 |
+
options[i] = options[i].bind(this);
|
270 |
+
}
|
271 |
+
}
|
272 |
+
}
|
273 |
+
|
274 |
+
// check for jQuery easing
|
275 |
+
if (typeof(options.easing) === 'string' && typeof(jQuery) !== 'undefined' && jQuery.isFunction(jQuery.easing[options.easing])) {
|
276 |
+
options.easing = jQuery.easing[options.easing];
|
277 |
+
} else {
|
278 |
+
options.easing = defaultOptions.easing;
|
279 |
+
}
|
280 |
+
|
281 |
+
// process earlier animate option to avoid bc breaks
|
282 |
+
if (typeof(options.animate) === 'number') {
|
283 |
+
options.animate = {
|
284 |
+
duration: options.animate,
|
285 |
+
enabled: true
|
286 |
+
};
|
287 |
+
}
|
288 |
+
|
289 |
+
if (typeof(options.animate) === 'boolean' && !options.animate) {
|
290 |
+
options.animate = {
|
291 |
+
duration: 1000,
|
292 |
+
enabled: options.animate
|
293 |
+
};
|
294 |
+
}
|
295 |
+
|
296 |
+
// create renderer
|
297 |
+
this.renderer = new options.renderer(el, options);
|
298 |
+
|
299 |
+
// initial draw
|
300 |
+
this.renderer.draw(currentValue);
|
301 |
+
|
302 |
+
// initial update
|
303 |
+
if (el.dataset && el.dataset.percent) {
|
304 |
+
this.update(parseFloat(el.dataset.percent));
|
305 |
+
} else if (el.getAttribute && el.getAttribute('data-percent')) {
|
306 |
+
this.update(parseFloat(el.getAttribute('data-percent')));
|
307 |
+
}
|
308 |
+
}.bind(this);
|
309 |
+
|
310 |
+
/**
|
311 |
+
* Update the value of the chart
|
312 |
+
* @param {number} newValue Number between 0 and 100
|
313 |
+
* @return {object} Instance of the plugin for method chaining
|
314 |
+
*/
|
315 |
+
this.update = function(newValue) {
|
316 |
+
newValue = parseFloat(newValue);
|
317 |
+
if (options.animate.enabled) {
|
318 |
+
this.renderer.animate(currentValue, newValue);
|
319 |
+
} else {
|
320 |
+
this.renderer.draw(newValue);
|
321 |
+
}
|
322 |
+
currentValue = newValue;
|
323 |
+
return this;
|
324 |
+
}.bind(this);
|
325 |
+
|
326 |
+
/**
|
327 |
+
* Disable animation
|
328 |
+
* @return {object} Instance of the plugin for method chaining
|
329 |
+
*/
|
330 |
+
this.disableAnimation = function() {
|
331 |
+
options.animate.enabled = false;
|
332 |
+
return this;
|
333 |
+
};
|
334 |
+
|
335 |
+
/**
|
336 |
+
* Enable animation
|
337 |
+
* @return {object} Instance of the plugin for method chaining
|
338 |
+
*/
|
339 |
+
this.enableAnimation = function() {
|
340 |
+
options.animate.enabled = true;
|
341 |
+
return this;
|
342 |
+
};
|
343 |
+
|
344 |
+
init();
|
345 |
+
};
|
346 |
+
|
347 |
+
$.fn.easyPieChart = function(options) {
|
348 |
+
return this.each(function() {
|
349 |
+
var instanceOptions;
|
350 |
+
|
351 |
+
if (!$.data(this, 'easyPieChart')) {
|
352 |
+
instanceOptions = $.extend({}, options, $(this).data());
|
353 |
+
$.data(this, 'easyPieChart', new EasyPieChart(this, instanceOptions));
|
354 |
+
}
|
355 |
+
});
|
356 |
+
};
|
357 |
+
|
358 |
+
|
359 |
+
}));
|
assets/admin/scripts/gdbc-admin.js
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
jQuery( document ).ready(function($) {
|
2 |
+
var maxLogsDaysElm = $('#gdbcsettings-settings-MaxLogsDays');
|
3 |
+
|
4 |
+
if(maxLogsDaysElm.length !== 0) {
|
5 |
+
if(maxLogsDaysElm.val() == 0) {
|
6 |
+
maxLogsDaysElm.parent().children('p').first().toggle(false);
|
7 |
+
maxLogsDaysElm.parent().children('p').last().toggle(true);
|
8 |
+
}
|
9 |
+
|
10 |
+
maxLogsDaysElm.change(function () {
|
11 |
+
if ($(this).val() != 0) {
|
12 |
+
$(this).parent().children('p').first().toggle(true);
|
13 |
+
$(this).parent().children('p').last().toggle(false);
|
14 |
+
}
|
15 |
+
else {
|
16 |
+
$(this).parent().children('p').first().toggle(false);
|
17 |
+
$(this).parent().children('p').last().toggle(true);
|
18 |
+
}
|
19 |
+
|
20 |
+
});
|
21 |
+
}
|
22 |
+
|
23 |
+
$('div.mch-admin-notice.is-dismissible').each(function(){
|
24 |
+
var noticeElm = $(this);
|
25 |
+
noticeElm.on('click', '.notice-dismiss', function(event){
|
26 |
+
|
27 |
+
jQuery.ajax({
|
28 |
+
type : "post",
|
29 |
+
cache: false,
|
30 |
+
dataType : "json",
|
31 |
+
url : GdbcAdmin.ajaxUrl,
|
32 |
+
data : {
|
33 |
+
action: 'gdbc-dismiss-' + noticeElm.prop('id'),
|
34 |
+
ajaxRequestNonce: GdbcAdmin.ajaxRequestNonce
|
35 |
+
}
|
36 |
+
});
|
37 |
+
|
38 |
+
|
39 |
+
|
40 |
+
//alert(noticeElm.data('id'));
|
41 |
+
})
|
42 |
+
|
43 |
+
});
|
44 |
+
|
45 |
+
|
46 |
+
|
47 |
+
});
|
assets/admin/scripts/gdbc-reports.js
ADDED
@@ -0,0 +1,828 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
jQuery( document ).ready(function($) {
|
2 |
+
|
3 |
+
|
4 |
+
if ($("#flot-container").length > 0)
|
5 |
+
initializeModulesPage();
|
6 |
+
else
|
7 |
+
initializeDashboard();
|
8 |
+
|
9 |
+
function initializeDashboard()
|
10 |
+
{
|
11 |
+
|
12 |
+
|
13 |
+
displayDashBoardAttemptsChart();
|
14 |
+
displayAttemptsPerModuleAndSectionChart();
|
15 |
+
displayLatestAttemptsTable();
|
16 |
+
displayLocationsOnMap();
|
17 |
+
displayAttemptsPerClientIpTable();
|
18 |
+
|
19 |
+
//displayPercentagePieChart();
|
20 |
+
displayTotalAttemptsPerModule()
|
21 |
+
}
|
22 |
+
|
23 |
+
|
24 |
+
function initializeModulesPage()
|
25 |
+
{
|
26 |
+
displayModulesChart();
|
27 |
+
displayModulesTables();
|
28 |
+
}
|
29 |
+
|
30 |
+
function displayModulesTables()
|
31 |
+
{
|
32 |
+
$("[id^='wid-id-']").each(function() {
|
33 |
+
var moduleId = $(this).attr('id').substr(7);
|
34 |
+
displayModuleTable(moduleId, 1, 'CreatedDate');
|
35 |
+
});
|
36 |
+
}
|
37 |
+
|
38 |
+
function displayAttemptsPerModuleAndSectionChart()
|
39 |
+
{
|
40 |
+
var ajaxData = {};
|
41 |
+
ajaxData['action'] = 'retrieveAttemptsPerModuleAndSection';
|
42 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
43 |
+
|
44 |
+
$.ajax({
|
45 |
+
type: "post",
|
46 |
+
cache: false,
|
47 |
+
dataType: "json",
|
48 |
+
url: GdbcAdmin.ajaxUrl,
|
49 |
+
data: ajaxData,
|
50 |
+
success: function (response) {
|
51 |
+
|
52 |
+
Morris.Bar({
|
53 |
+
element: 'gdbc-barchart-holder',
|
54 |
+
data: response,
|
55 |
+
hoverCallback: function(index, options, content) {
|
56 |
+
|
57 |
+
var moduleInfo = response[index];
|
58 |
+
|
59 |
+
if(!moduleInfo.attempts)
|
60 |
+
return '';
|
61 |
+
|
62 |
+
var label = moduleInfo.module;
|
63 |
+
if(moduleInfo.section.length)
|
64 |
+
label += '/' + moduleInfo.section;
|
65 |
+
|
66 |
+
var hover = '<div>';
|
67 |
+
|
68 |
+
hover += '<p>' + label + '</p>';
|
69 |
+
hover += '<p><span>' + moduleInfo.attempts + ' attempts' + '</span></p>';
|
70 |
+
|
71 |
+
hover += '</div>';
|
72 |
+
return hover;
|
73 |
+
},
|
74 |
+
xkey: 'y',
|
75 |
+
ykeys: ['attempts'],
|
76 |
+
grid:true,
|
77 |
+
hideHover:'auto',
|
78 |
+
labels: ['Series A', 'Series B']
|
79 |
+
});
|
80 |
+
}
|
81 |
+
});
|
82 |
+
|
83 |
+
}
|
84 |
+
|
85 |
+
|
86 |
+
function displayAttemptsPerClientIpTable(pageNumber)
|
87 |
+
{
|
88 |
+
if(typeof pageNumber === 'undefined')
|
89 |
+
pageNumber = 1;
|
90 |
+
|
91 |
+
var tableBody = $('#ip-attempts-holder table tbody');
|
92 |
+
if (tableBody.length === 0)
|
93 |
+
return;
|
94 |
+
|
95 |
+
var ajaxData = {};
|
96 |
+
ajaxData['action'] = 'retrieveAttemptsPerClientIp';
|
97 |
+
ajaxData['pageNumber'] = pageNumber;
|
98 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
99 |
+
|
100 |
+
|
101 |
+
$.ajax({
|
102 |
+
type: "post",
|
103 |
+
cache: false,
|
104 |
+
dataType: "json",
|
105 |
+
url: GdbcAdmin.ajaxUrl,
|
106 |
+
data: ajaxData,
|
107 |
+
success: function (response) {
|
108 |
+
|
109 |
+
tableBody.empty();
|
110 |
+
|
111 |
+
var totalPages = 0;
|
112 |
+
|
113 |
+
$.each(response, function(index, attempt) {
|
114 |
+
|
115 |
+
var row = $('<tr></tr>');
|
116 |
+
|
117 |
+
row.append($('<td>' + attempt.Country + '</td>'));
|
118 |
+
|
119 |
+
var clientIpHtml = attempt.IsIpBlocked ? '<i class="glyphicon glyphicon-minus-sign icon-danger" style="margin-right: 5px"></i>' : '<i class="glyphicon glyphicon-eye-open" style="margin-right: 5px"></i>';
|
120 |
+
|
121 |
+
|
122 |
+
row.append($('<td>' + clientIpHtml + attempt.ClientIp + '</td>'));
|
123 |
+
|
124 |
+
row.append($('<td>' + attempt.Attempts + '</td>'));
|
125 |
+
|
126 |
+
var blockCell = $('<td></td>');
|
127 |
+
blockCell.append(createBlockIpButtonGroup(attempt.ClientIp, !attempt.IsIpBlocked));
|
128 |
+
row.append(blockCell);
|
129 |
+
|
130 |
+
tableBody.append(row);
|
131 |
+
|
132 |
+
totalPages = attempt.Pages;
|
133 |
+
})
|
134 |
+
|
135 |
+
$('#ip-attempts-holder div.module-pagination').empty();
|
136 |
+
$('#ip-attempts-holder div.module-pagination').append(showPagination(pageNumber, totalPages));
|
137 |
+
|
138 |
+
$('#ip-attempts-holder div.module-pagination li[class!="disabled"] a').on('click', function(){
|
139 |
+
var newPage = $(this).html();
|
140 |
+
if (newPage == '...' || newPage == pageNumber)
|
141 |
+
return;
|
142 |
+
else if (newPage == 'Next')
|
143 |
+
newPage = pageNumber + 1;
|
144 |
+
else if (newPage == 'Prev')
|
145 |
+
newPage = pageNumber - 1;
|
146 |
+
|
147 |
+
displayAttemptsPerClientIpTable(newPage);
|
148 |
+
|
149 |
+
return false;
|
150 |
+
});
|
151 |
+
|
152 |
+
}
|
153 |
+
});
|
154 |
+
}
|
155 |
+
|
156 |
+
|
157 |
+
|
158 |
+
function displayModuleTable(moduleId, pageNumber, $orderBy)
|
159 |
+
{
|
160 |
+
if (moduleId == null || moduleId < 1 || moduleId >= 100)
|
161 |
+
return;
|
162 |
+
|
163 |
+
var ajaxData = {};
|
164 |
+
ajaxData['action'] = 'retrieveDetailedAttemptsPerModule';
|
165 |
+
ajaxData['moduleId'] = moduleId;
|
166 |
+
ajaxData['pageNumber'] = pageNumber;
|
167 |
+
ajaxData['orderBy'] = $orderBy;
|
168 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
169 |
+
|
170 |
+
$.ajax({
|
171 |
+
type : "post",
|
172 |
+
cache: false,
|
173 |
+
dataType : "json",
|
174 |
+
url : GdbcAdmin.ajaxUrl,
|
175 |
+
data : ajaxData,
|
176 |
+
success: function(response) {
|
177 |
+
|
178 |
+
$.each(response, function(prop, moduleData) {
|
179 |
+
if ('PaginationInfo' == prop) {
|
180 |
+
|
181 |
+
if (moduleData == 0) {
|
182 |
+
$('#wid-id-' + moduleId + ' table tbody').html('<td style="text-align: center; padding-top: 15px">No records found</td>');
|
183 |
+
return;
|
184 |
+
}
|
185 |
+
|
186 |
+
$('#mp-' + moduleId).empty();
|
187 |
+
$('#mp-' + moduleId).append(showPagination(moduleData[0], moduleData[1]));
|
188 |
+
$('#wid-id-' + moduleId + ' .module-pagination li[class!="disabled"] a').on('click', function(){
|
189 |
+
var newPage = $(this).html();
|
190 |
+
if (newPage == '...' || newPage == pageNumber)
|
191 |
+
return;
|
192 |
+
else if (newPage == 'Next')
|
193 |
+
newPage = parseInt(pageNumber, 10) + 1;
|
194 |
+
else if (newPage == 'Prev')
|
195 |
+
newPage = parseInt(pageNumber, 10) - 1;
|
196 |
+
|
197 |
+
var modId = $(this).parent().parent().parent().attr('id').substr(3);
|
198 |
+
|
199 |
+
displayModuleTable(modId , newPage, '');
|
200 |
+
|
201 |
+
return false;
|
202 |
+
});
|
203 |
+
|
204 |
+
}
|
205 |
+
|
206 |
+
if ('ModuleDataHeader' == prop)
|
207 |
+
displayModuleTableHeader('wid-id-' + moduleId, moduleData);
|
208 |
+
|
209 |
+
if ('ModuleDataRows' == prop)
|
210 |
+
displayModuleTableBody('wid-id-' +moduleId, response);
|
211 |
+
|
212 |
+
});
|
213 |
+
|
214 |
+
}
|
215 |
+
});
|
216 |
+
}
|
217 |
+
|
218 |
+
function displayModuleTableHeader(containerId, dataValues)
|
219 |
+
{
|
220 |
+
var tableHeader = $('#' + containerId + ' table thead tr');
|
221 |
+
if (tableHeader.length == 0)
|
222 |
+
return;
|
223 |
+
tableHeader.empty();
|
224 |
+
$.each(dataValues, function(k,v){
|
225 |
+
var headerCell = $('<th>' + v + '</th>');
|
226 |
+
tableHeader.append(headerCell);
|
227 |
+
});
|
228 |
+
tableHeader.append('<th></th>');
|
229 |
+
}
|
230 |
+
|
231 |
+
function displayModuleTableBody(containerId, ajaxResponse)
|
232 |
+
{
|
233 |
+
|
234 |
+
var tableBody = $('#' + containerId + ' table tbody');
|
235 |
+
if (tableBody.length === 0)
|
236 |
+
return;
|
237 |
+
|
238 |
+
tableBody.empty();
|
239 |
+
|
240 |
+
$.each(ajaxResponse.ModuleDataRows, function (index, tableData) {
|
241 |
+
var row = $('<tr></tr>');
|
242 |
+
var clientIp = 'N/A';
|
243 |
+
$.each(ajaxResponse.ModuleDataHeader, function (key, header) {
|
244 |
+
|
245 |
+
if(typeof tableData[key] === 'undefined')
|
246 |
+
tableData[key] = 'N/A';
|
247 |
+
|
248 |
+
|
249 |
+
if(key === 'ClientIp') {
|
250 |
+
clientIp = tableData[key];
|
251 |
+
if(tableData.IsIpBlocked) {
|
252 |
+
tableData[key] = '<i class="glyphicon glyphicon-minus-sign icon-danger" style="margin-right: 5px"></i>' + tableData[key];
|
253 |
+
}
|
254 |
+
else{
|
255 |
+
tableData[key] = '<i class="glyphicon glyphicon-eye-open" style="margin-right: 5px"></i>' + tableData[key];
|
256 |
+
}
|
257 |
+
}
|
258 |
+
var cell = $('<td>' + tableData[key] + '</td>');
|
259 |
+
|
260 |
+
row.append(cell);
|
261 |
+
|
262 |
+
});
|
263 |
+
|
264 |
+
var blockCell = $('<td></td>');
|
265 |
+
blockCell.append(createBlockIpButtonGroup(clientIp, !tableData.IsIpBlocked));
|
266 |
+
row.append(blockCell);
|
267 |
+
|
268 |
+
tableBody.append(row);
|
269 |
+
|
270 |
+
|
271 |
+
});
|
272 |
+
|
273 |
+
}
|
274 |
+
|
275 |
+
function showPagination(pageNumber, totalPages)
|
276 |
+
{
|
277 |
+
var ulContainer = $('<ul class="pagination pagination-sm"></ul>');
|
278 |
+
var firstPageLi = $('<li><a>1</a></li>');
|
279 |
+
var lastPageLi = $('<li><a>' + totalPages + '</a>');
|
280 |
+
var previousLi = $('<li><a>Prev</a></li>');
|
281 |
+
var nextLi = $('<li><a>Next</a></li>');
|
282 |
+
var separatorLi1 = $('<li><a>...</a></li>');
|
283 |
+
var separatorLi2 = $('<li><a>...</a></li>');
|
284 |
+
|
285 |
+
var currentPageLi = $('<li class="active"><a>' + pageNumber + '</a></li>');
|
286 |
+
|
287 |
+
pageNumber = parseInt(pageNumber, 10);
|
288 |
+
totalPages = parseInt(totalPages, 10);
|
289 |
+
|
290 |
+
if (totalPages == 1) {
|
291 |
+
firstPageLi = null;
|
292 |
+
lastPageLi = null;
|
293 |
+
previousLi.addClass('disabled');
|
294 |
+
nextLi.addClass('disabled');
|
295 |
+
}
|
296 |
+
else if (pageNumber == 1) {
|
297 |
+
previousLi.addClass('disabled');
|
298 |
+
firstPageLi = null;
|
299 |
+
}
|
300 |
+
else if (pageNumber == totalPages) {
|
301 |
+
nextLi.addClass('disabled');
|
302 |
+
lastPageLi = null;
|
303 |
+
}
|
304 |
+
|
305 |
+
var numberOfAdditionalPages = 1; // = 2; two additional pages in the left, two additional pages in the right (if available)
|
306 |
+
var prevPagesArray = new Array();
|
307 |
+
var nextPagesArray = new Array();
|
308 |
+
|
309 |
+
for (var i = 0; i < numberOfAdditionalPages; i++ ){
|
310 |
+
if (pageNumber - i > 2)
|
311 |
+
prevPagesArray[i] = $('<li><a>' + (pageNumber - i - 1) + '</a></li>');
|
312 |
+
|
313 |
+
if ((pageNumber + i + 1) < totalPages)
|
314 |
+
nextPagesArray[i] = $('<li><a>' + (pageNumber + i + 1) + '</a></li>');
|
315 |
+
}
|
316 |
+
|
317 |
+
ulContainer.append(previousLi);
|
318 |
+
|
319 |
+
if (firstPageLi != null) {
|
320 |
+
ulContainer.append(firstPageLi);
|
321 |
+
if (prevPagesArray.length > 0)
|
322 |
+
{
|
323 |
+
var firstPageNumber = parseInt(firstPageLi.text(), 10);
|
324 |
+
var nextPageNumber = parseInt(prevPagesArray[0].text(), 10);
|
325 |
+
if ( (nextPageNumber - firstPageNumber) > 1)
|
326 |
+
ulContainer.append(separatorLi1);
|
327 |
+
}
|
328 |
+
}
|
329 |
+
for(var i = numberOfAdditionalPages-1; i >= 0; i--)
|
330 |
+
ulContainer.append(prevPagesArray[i]);
|
331 |
+
|
332 |
+
ulContainer.append(currentPageLi);
|
333 |
+
|
334 |
+
for(var i = 0; i < numberOfAdditionalPages; i++)
|
335 |
+
ulContainer.append(nextPagesArray[i]);
|
336 |
+
|
337 |
+
if (lastPageLi != null) {
|
338 |
+
if (nextPagesArray.length > 0)
|
339 |
+
{
|
340 |
+
var lastPageNumber = lastPageLi.text();
|
341 |
+
var prevPageNumber = nextPagesArray[nextPagesArray.length - 1].text();
|
342 |
+
if ((parseInt(lastPageNumber, 10) - parseInt(prevPageNumber, 10)) > 1)
|
343 |
+
ulContainer.append(separatorLi2);
|
344 |
+
}
|
345 |
+
ulContainer.append(lastPageLi);
|
346 |
+
}
|
347 |
+
|
348 |
+
ulContainer.append(nextLi);
|
349 |
+
|
350 |
+
return ulContainer;
|
351 |
+
}
|
352 |
+
|
353 |
+
function displayModulesChart()
|
354 |
+
{
|
355 |
+
var toggles = $("#modules-chart");
|
356 |
+
var target = $("#flot-container");
|
357 |
+
|
358 |
+
var data = [];
|
359 |
+
|
360 |
+
var options = {
|
361 |
+
grid : {
|
362 |
+
hoverable : true
|
363 |
+
},
|
364 |
+
tooltip : true,
|
365 |
+
tooltipOpts : {
|
366 |
+
content: '%s: %y',
|
367 |
+
//dateFormat: '%b %y',
|
368 |
+
defaultTheme : false
|
369 |
+
},
|
370 |
+
legend: {show: false},
|
371 |
+
xaxis : {
|
372 |
+
mode : "time"
|
373 |
+
},
|
374 |
+
yaxes : {
|
375 |
+
tickFormatter : function(val) {
|
376 |
+
return "$" + val;
|
377 |
+
},
|
378 |
+
max : 1200
|
379 |
+
}
|
380 |
+
|
381 |
+
};
|
382 |
+
|
383 |
+
|
384 |
+
var ajaxData = {};
|
385 |
+
ajaxData['action'] = 'retrieveDetailedAttemptsForChart';
|
386 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
387 |
+
$.ajax({
|
388 |
+
type : "post",
|
389 |
+
cache: false,
|
390 |
+
dataType : "json",
|
391 |
+
url : GdbcAdmin.ajaxUrl,
|
392 |
+
data : ajaxData,
|
393 |
+
success: function(response){
|
394 |
+
|
395 |
+
$.each(response, function(prop, modulesData){
|
396 |
+
if (prop === 'ModulesDescriptionArray' && $("#flot-container").length) {
|
397 |
+
var i = 0;
|
398 |
+
$.each(modulesData, function(key, value){
|
399 |
+
var label = $('<label class="checkbox" for="gra-' + i + '"></label>');
|
400 |
+
var input = $('<input type="checkbox" checked="checked" id="gra-' + i + '" name="gra-' + i + '">');
|
401 |
+
var italic = $('<i></i>');
|
402 |
+
label.append(input, italic, value);
|
403 |
+
$(".inline-group").append(label);
|
404 |
+
i++;
|
405 |
+
});
|
406 |
+
} else if (prop === 'ModulesAttemptsArray' && $("#flot-container").length) {
|
407 |
+
|
408 |
+
var colorArray = ['#931313', '#638167', '#65596B', '#60747C', '#B09B5B', '#3276B1', '#C0C0C0', '#FDDC9A', '#575FB5', '#57B599', '#46CC41', '#C93A24'];
|
409 |
+
var i = 0;
|
410 |
+
$.each(modulesData, function(key, value){
|
411 |
+
var $graphObj = {
|
412 |
+
label : '%x - ' + $('#gra-'+i).parent().text() + ' attempts',
|
413 |
+
data : value,
|
414 |
+
color : colorArray[i],
|
415 |
+
lines : {
|
416 |
+
show : true,
|
417 |
+
lineWidth : 3
|
418 |
+
},
|
419 |
+
points : {
|
420 |
+
show : true
|
421 |
+
}
|
422 |
+
};
|
423 |
+
data[i] = $graphObj;
|
424 |
+
i++;
|
425 |
+
});
|
426 |
+
}
|
427 |
+
|
428 |
+
});
|
429 |
+
toggles.find(':checkbox').on('change', function() {
|
430 |
+
plotNow();
|
431 |
+
});
|
432 |
+
plotNow()
|
433 |
+
}
|
434 |
+
});
|
435 |
+
|
436 |
+
|
437 |
+
|
438 |
+
var plot2 = null;
|
439 |
+
|
440 |
+
function plotNow() {
|
441 |
+
var d = [];
|
442 |
+
toggles.find(':checkbox').each(function() {
|
443 |
+
if ($(this).is(':checked')) {
|
444 |
+
d.push(data[$(this).attr("name").substr(4, 1)]);
|
445 |
+
}
|
446 |
+
});
|
447 |
+
if (d.length > 0) {
|
448 |
+
if (plot2) {
|
449 |
+
plot2.setData(d);
|
450 |
+
plot2.draw();
|
451 |
+
} else {
|
452 |
+
plot2 = $.plot(target, d, options);
|
453 |
+
}
|
454 |
+
}
|
455 |
+
|
456 |
+
}
|
457 |
+
}
|
458 |
+
|
459 |
+
function displayDashBoardAttemptsChart() {
|
460 |
+
var ajaxData = {};
|
461 |
+
ajaxData['action'] = 'retrieveInitialDashboardData';
|
462 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
463 |
+
$.ajax({
|
464 |
+
type : "post",
|
465 |
+
cache: false,
|
466 |
+
dataType : "json",
|
467 |
+
url : GdbcAdmin.ajaxUrl,
|
468 |
+
data : ajaxData,
|
469 |
+
success: function(response){
|
470 |
+
|
471 |
+
$.each(response, function(prop, chartData){
|
472 |
+
if (prop === 'ChartDataArray' && $("#chart-container").length) {
|
473 |
+
var chartArray = [];
|
474 |
+
var attemptsCounter = 0;
|
475 |
+
$.each(chartData, function(key, value){
|
476 |
+
chartArray.push([parseInt(key), value]);
|
477 |
+
attemptsCounter += parseInt(value);
|
478 |
+
});
|
479 |
+
displayAttemptsChart("#chart-container", chartArray);
|
480 |
+
if(attemptsCounter > 9) {
|
481 |
+
$("a.btn-rate-gdbc").css('display', 'inline-block');
|
482 |
+
}
|
483 |
+
}
|
484 |
+
});
|
485 |
+
}
|
486 |
+
});
|
487 |
+
}
|
488 |
+
|
489 |
+
function displayAttemptsChart(placeHolderId, data) {
|
490 |
+
|
491 |
+
console.log(data);
|
492 |
+
|
493 |
+
// var data = [[1304301600*1000, 20], [1304388000*1000, 30], [1304474400*1000, 40], [1304553600*1000, 10], [1304640000*1000, 23], [1304726400*1000, 16] ];
|
494 |
+
|
495 |
+
|
496 |
+
var options = {
|
497 |
+
xaxis : {
|
498 |
+
mode : "time",
|
499 |
+
tickLength : 5
|
500 |
+
},
|
501 |
+
yaxis : {
|
502 |
+
mode : "number",
|
503 |
+
tickFormatter: suffixFormatter
|
504 |
+
},
|
505 |
+
series : {
|
506 |
+
lines : {
|
507 |
+
show : true,
|
508 |
+
lineWidth : 1,
|
509 |
+
fill : true,
|
510 |
+
fillColor : {
|
511 |
+
colors : [{
|
512 |
+
opacity : 0.1
|
513 |
+
}, {
|
514 |
+
opacity : 0.15
|
515 |
+
}]
|
516 |
+
}
|
517 |
+
},
|
518 |
+
shadowSize : 0,
|
519 |
+
points : { show: false, fill: true }
|
520 |
+
},
|
521 |
+
selection : {
|
522 |
+
mode : "x"
|
523 |
+
},
|
524 |
+
grid : {
|
525 |
+
hoverable : true,
|
526 |
+
clickable : true,
|
527 |
+
tickColor : "#efefef",
|
528 |
+
borderWidth : 0,
|
529 |
+
borderColor : "#efefef"
|
530 |
+
},
|
531 |
+
tooltip:{
|
532 |
+
show:true,
|
533 |
+
content : '<div id = "flotTip"><p>%y attempts </p><p><b>%x</b></p>',
|
534 |
+
xDateFormat: "%b %d, %Y",
|
535 |
+
shifts: {
|
536 |
+
x: 10,
|
537 |
+
y: 10
|
538 |
+
},
|
539 |
+
defaultTheme: false
|
540 |
+
},
|
541 |
+
//tooltip : true,
|
542 |
+
//tooltipOpts : {
|
543 |
+
// content : "<span>%y</span> attempts on <b>%x</b>",
|
544 |
+
// dateFormat : "%b %0d, %y",
|
545 |
+
// defaultTheme : false
|
546 |
+
//},
|
547 |
+
colors : ["#6595b4"]
|
548 |
+
};
|
549 |
+
|
550 |
+
$.plot($(placeHolderId), [data], options);
|
551 |
+
}
|
552 |
+
|
553 |
+
function displayLatestAttemptsTable()
|
554 |
+
{
|
555 |
+
if ($('#latest-attempts-table').length == 0)
|
556 |
+
return;
|
557 |
+
|
558 |
+
var ajaxData = {};
|
559 |
+
ajaxData['action'] = 'retrieveLatestAttemptsTable';
|
560 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
561 |
+
var dataHeaderArr = null;
|
562 |
+
$.ajax({
|
563 |
+
type : "post",
|
564 |
+
cache: false,
|
565 |
+
dataType : "json",
|
566 |
+
url : GdbcAdmin.ajaxUrl,
|
567 |
+
data : ajaxData,
|
568 |
+
success: function(response){
|
569 |
+
|
570 |
+
if(response.success !== true)
|
571 |
+
return;
|
572 |
+
|
573 |
+
$('#latest-attempts-table thead tr').empty();
|
574 |
+
|
575 |
+
$.each(response.data.TableHeader, function (key, header) {
|
576 |
+
var cell = $('<th>' + header + '</th>');
|
577 |
+
$('#latest-attempts-table thead tr').append(cell);
|
578 |
+
});
|
579 |
+
|
580 |
+
$('#latest-attempts-table thead tr').append($('<th></th>'));
|
581 |
+
|
582 |
+
$('#latest-attempts-table tbody').empty();
|
583 |
+
$.each(response.data.TableData, function (index, tableData) {
|
584 |
+
var row = $('<tr></tr>');
|
585 |
+
var clientIp = 'N/A';
|
586 |
+
$.each(response.data.TableHeader, function (key, header) {
|
587 |
+
|
588 |
+
if(typeof tableData[key] === 'undefined')
|
589 |
+
tableData[key] = 'N/A';
|
590 |
+
|
591 |
+
if(key === 'ClientIp') {
|
592 |
+
clientIp = tableData[key];
|
593 |
+
|
594 |
+
if(tableData.IsIpBlocked) {
|
595 |
+
tableData[key] = '<i class="glyphicon glyphicon-minus-sign icon-danger" style="margin-right: 5px"></i>' + tableData[key];
|
596 |
+
}
|
597 |
+
else{
|
598 |
+
tableData[key] = '<i class="glyphicon glyphicon-eye-open" style="margin-right: 5px"></i>' + tableData[key];
|
599 |
+
}
|
600 |
+
}
|
601 |
+
var cell = $('<td>' + tableData[key] + '</td>');
|
602 |
+
row.append(cell);
|
603 |
+
});
|
604 |
+
|
605 |
+
var blockCell = $('<td></td>');
|
606 |
+
blockCell.append(createBlockIpButtonGroup(clientIp, !tableData.IsIpBlocked));
|
607 |
+
row.append(blockCell);
|
608 |
+
|
609 |
+
$('#latest-attempts-table tbody').append(row);
|
610 |
+
|
611 |
+
});
|
612 |
+
|
613 |
+
}
|
614 |
+
});
|
615 |
+
}
|
616 |
+
|
617 |
+
function displayLocationsOnMap()
|
618 |
+
{
|
619 |
+
if ($('#vector-map').length == 0)
|
620 |
+
return;
|
621 |
+
|
622 |
+
$('#vector-map').vectorMap({
|
623 |
+
map : 'world_mill_en',
|
624 |
+
backgroundColor : '#fff',
|
625 |
+
regionStyle : {
|
626 |
+
initial : {
|
627 |
+
fill : '#c4c4c4'
|
628 |
+
},
|
629 |
+
hover : {
|
630 |
+
"fill-opacity" : 1
|
631 |
+
}
|
632 |
+
},
|
633 |
+
series : {
|
634 |
+
regions : [{
|
635 |
+
values : attemptsCountryArray,
|
636 |
+
scale : ['#85a8b6', '#4d7686'],
|
637 |
+
normalizeFunction : 'polynomial'
|
638 |
+
}]
|
639 |
+
},
|
640 |
+
|
641 |
+
onRegionLabelShow : function(e, el, code) {
|
642 |
+
if ( typeof attemptsCountryArray[code] == 'undefined') {
|
643 |
+
e.preventDefault();
|
644 |
+
} else {
|
645 |
+
var countryLbl = attemptsCountryArray[code];
|
646 |
+
var attemptLbl = ' total attempts';
|
647 |
+
if (countryLbl == 1)
|
648 |
+
attemptLbl = ' attempt';
|
649 |
+
el.html(el.html() + ': ' + countryLbl + attemptLbl);
|
650 |
+
}
|
651 |
+
}
|
652 |
+
});
|
653 |
+
}
|
654 |
+
|
655 |
+
|
656 |
+
function displayTotalAttemptsPerModule()
|
657 |
+
{
|
658 |
+
if ($('#gdbc-pie-chart').length == 0)
|
659 |
+
return;
|
660 |
+
|
661 |
+
var ajaxData = {};
|
662 |
+
ajaxData['action'] = 'retrieveTotalAttemptsPerModule';
|
663 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
664 |
+
$.ajax({
|
665 |
+
type : "post",
|
666 |
+
cache: false,
|
667 |
+
dataType : "json",
|
668 |
+
url : GdbcAdmin.ajaxUrl,
|
669 |
+
data : ajaxData,
|
670 |
+
success: function(response) {
|
671 |
+
|
672 |
+
$.each(response, function(prop, moduleData) {
|
673 |
+
if ('TopAttemptsArrayPerModule' == prop) {
|
674 |
+
$('#gdbc-pie-chart table tbody').empty();
|
675 |
+
if (moduleData == 0)
|
676 |
+
$('#gdbc-pie-chart table tbody').append($('<tr><td colspan="4" class="text-center">No records found</tr>'));
|
677 |
+
else {
|
678 |
+
|
679 |
+
$.each(moduleData, function (k, v) {
|
680 |
+
var tableRow = $('<tr></tr>');
|
681 |
+
tableRow.append($('<td>' + v.label + '</td>'));
|
682 |
+
tableRow.append($('<td>' + v.value + '</td>'));
|
683 |
+
$('#gdbc-pie-chart table tbody').append(tableRow);
|
684 |
+
});
|
685 |
+
|
686 |
+
if ($('#gdbc-stats').length == 0)
|
687 |
+
return;
|
688 |
+
|
689 |
+
Morris.Donut({
|
690 |
+
element: 'gdbc-stats',
|
691 |
+
data: moduleData,
|
692 |
+
formatter: function (x, data) {
|
693 |
+
return data.percent + "%"
|
694 |
+
}
|
695 |
+
});
|
696 |
+
|
697 |
+
}
|
698 |
+
}
|
699 |
+
});
|
700 |
+
}
|
701 |
+
});
|
702 |
+
}
|
703 |
+
|
704 |
+
|
705 |
+
function createBlockIpButtonGroup(ip, shouldBlock)
|
706 |
+
{
|
707 |
+
var group = $('<div class="btn-group display-inline pull-right text-align-left hidden-tablet"></div>');
|
708 |
+
group.append(createBlockLinkButton());
|
709 |
+
group.append(createBlockLinkOptions(ip, shouldBlock));
|
710 |
+
return group;
|
711 |
+
}
|
712 |
+
|
713 |
+
function createBlockLinkButton()
|
714 |
+
{
|
715 |
+
return $('<button data-toggle="dropdown" class="btn btn-xs btn-default dropdown-toggle">' +
|
716 |
+
'<i class="glyphicon glyphicon-remove-circle icon-primary"></i>' +
|
717 |
+
'</button>');
|
718 |
+
}
|
719 |
+
|
720 |
+
|
721 |
+
function manageIp(ip, shouldBlock, clickedElement)
|
722 |
+
{
|
723 |
+
var ajaxData = {};
|
724 |
+
ajaxData['action'] = 'manageClientIpAddress';
|
725 |
+
ajaxData['clientIp'] = ip;
|
726 |
+
ajaxData['shouldBlock'] = shouldBlock;
|
727 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
728 |
+
jQuery.ajax({
|
729 |
+
type : "post",
|
730 |
+
cache: false,
|
731 |
+
dataType : "json",
|
732 |
+
url : GdbcAdmin.ajaxUrl,
|
733 |
+
data : ajaxData,
|
734 |
+
success: function(response) {
|
735 |
+
if(!response.success){
|
736 |
+
return;
|
737 |
+
}
|
738 |
+
|
739 |
+
updatePageIpIcons(ip, shouldBlock);
|
740 |
+
|
741 |
+
var cell = clickedElement.closest('td');
|
742 |
+
cell.empty();
|
743 |
+
cell.append(createBlockIpButtonGroup(ip, (shouldBlock == 0) ? 1 : 0));
|
744 |
+
}
|
745 |
+
});
|
746 |
+
|
747 |
+
}
|
748 |
+
|
749 |
+
function createBlockLinkOptions(ip, shouldBlock)
|
750 |
+
{
|
751 |
+
var blockIpLink = '<a href="javascript:void(0);" class="block-' +ip+ '"> <i class="glyphicon glyphicon-remove icon-danger" style = "margin-right: 5px"></i>Block Ip Address</a>';
|
752 |
+
var unblockIpLink = '<a href="javascript:void(0);" class="unblock-' +ip+ '"> <i class="glyphicon glyphicon-ok icon-success" style = "margin-right: 5px"></i>UnBlock Ip Address</a>';
|
753 |
+
|
754 |
+
var insertLink = '<li> ' + (shouldBlock ? blockIpLink : unblockIpLink) + ' <li>';
|
755 |
+
|
756 |
+
var blockMenu = $('<ul class="dropdown-menu dropdown-menu-xs pull-right manage-ip-action-holder">' + insertLink +
|
757 |
+
'<li class="divider"><li>' +
|
758 |
+
'<li> <a href="javascript:void(0);">Cancel</a> <li>' +
|
759 |
+
'</ul>');
|
760 |
+
|
761 |
+
blockMenu.on('click', 'a', function(){
|
762 |
+
var classAttr = $(this).attr('class');
|
763 |
+
if (!classAttr)
|
764 |
+
return void(0);
|
765 |
+
|
766 |
+
if (classAttr.lastIndexOf('block-') === 0) {
|
767 |
+
var ip = classAttr.substr(6);
|
768 |
+
manageIp(ip, 1, $(this));
|
769 |
+
|
770 |
+
} else if (classAttr.lastIndexOf('unblock-') === 0) {
|
771 |
+
var ip = classAttr.substr(8);
|
772 |
+
manageIp(ip, 0, $(this));
|
773 |
+
}
|
774 |
+
|
775 |
+
});
|
776 |
+
|
777 |
+
return blockMenu;
|
778 |
+
}
|
779 |
+
|
780 |
+
|
781 |
+
|
782 |
+
function updatePageIpIcons(ip, shouldBlock)
|
783 |
+
{
|
784 |
+
$.each($("table i.glyphicon:first-child"), function(){
|
785 |
+
var cellIp = $.trim($(this).parent().text());
|
786 |
+
if (cellIp == ip){
|
787 |
+
if (shouldBlock) {
|
788 |
+
$(this).attr("class", "glyphicon glyphicon-minus-sign icon-danger");
|
789 |
+
}
|
790 |
+
else {
|
791 |
+
$(this).attr("class", "glyphicon glyphicon-eye-open");
|
792 |
+
}
|
793 |
+
}
|
794 |
+
});
|
795 |
+
}
|
796 |
+
|
797 |
+
// Util Functions Section
|
798 |
+
function suffixFormatter(val)
|
799 |
+
{
|
800 |
+
return Math.round(val);
|
801 |
+
}
|
802 |
+
|
803 |
+
|
804 |
+
$('#gdbc-modal-holder').on('show.bs.modal', function (event) {
|
805 |
+
|
806 |
+
$(".modal-body").hide();
|
807 |
+
$(".modal-dialog").append("<div class = 'report-spinner'></div>");
|
808 |
+
|
809 |
+
var clickedButton = $(event.relatedTarget)
|
810 |
+
var attemptId = clickedButton.data('attempt');
|
811 |
+
var modalDialog = $(this);
|
812 |
+
|
813 |
+
var ajaxData = {};
|
814 |
+
ajaxData['action'] = 'retrieveFormattedBlockedContent';
|
815 |
+
ajaxData['attemptId'] = attemptId;
|
816 |
+
ajaxData['ajaxRequestNonce'] = GdbcAdmin.ajaxRequestNonce;
|
817 |
+
|
818 |
+
modalDialog.find('.modal-body').load( GdbcAdmin.ajaxUrl, ajaxData, function() {
|
819 |
+
$('div').removeClass('report-spinner');
|
820 |
+
$(".modal-body").show();
|
821 |
+
});
|
822 |
+
})
|
823 |
+
|
824 |
+
//$('#gdbc-modal-holder').on('hidden.bs.modal', function () {
|
825 |
+
// $(this).find('.modal-body').empty();
|
826 |
+
//});
|
827 |
+
|
828 |
+
});
|
assets/admin/scripts/jquery-flot-tooltip.js
ADDED
@@ -0,0 +1,571 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* jquery.flot.tooltip
|
3 |
+
*
|
4 |
+
* description: easy-to-use tooltips for Flot charts
|
5 |
+
* version: 0.8.5
|
6 |
+
* authors: Krzysztof Urbas @krzysu [myviews.pl],Evan Steinkerchner @Roundaround
|
7 |
+
* website: https://github.com/krzysu/flot.tooltip
|
8 |
+
*
|
9 |
+
* build on 2015-06-12
|
10 |
+
* released under MIT License, 2012
|
11 |
+
*/
|
12 |
+
(function ($) {
|
13 |
+
// plugin options, default values
|
14 |
+
var defaultOptions = {
|
15 |
+
tooltip: {
|
16 |
+
show: false,
|
17 |
+
cssClass: "flotTip",
|
18 |
+
content: "%s | X: %x | Y: %y",
|
19 |
+
// allowed templates are:
|
20 |
+
// %s -> series label,
|
21 |
+
// %c -> series color,
|
22 |
+
// %lx -> x axis label (requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels),
|
23 |
+
// %ly -> y axis label (requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels),
|
24 |
+
// %x -> X value,
|
25 |
+
// %y -> Y value,
|
26 |
+
// %x.2 -> precision of X value,
|
27 |
+
// %p -> percent
|
28 |
+
// %n -> value (not percent) of pie chart
|
29 |
+
xDateFormat: null,
|
30 |
+
yDateFormat: null,
|
31 |
+
monthNames: null,
|
32 |
+
dayNames: null,
|
33 |
+
shifts: {
|
34 |
+
x: 10,
|
35 |
+
y: 20
|
36 |
+
},
|
37 |
+
defaultTheme: true,
|
38 |
+
snap: true,
|
39 |
+
lines: false,
|
40 |
+
|
41 |
+
// callbacks
|
42 |
+
onHover: function (flotItem, $tooltipEl) {},
|
43 |
+
|
44 |
+
$compat: false
|
45 |
+
}
|
46 |
+
};
|
47 |
+
|
48 |
+
// dummy default options object for legacy code (<0.8.5) - is deleted later
|
49 |
+
defaultOptions.tooltipOpts = defaultOptions.tooltip;
|
50 |
+
|
51 |
+
// object
|
52 |
+
var FlotTooltip = function (plot) {
|
53 |
+
// variables
|
54 |
+
this.tipPosition = {x: 0, y: 0};
|
55 |
+
|
56 |
+
this.init(plot);
|
57 |
+
};
|
58 |
+
|
59 |
+
// main plugin function
|
60 |
+
FlotTooltip.prototype.init = function (plot) {
|
61 |
+
var that = this;
|
62 |
+
|
63 |
+
// detect other flot plugins
|
64 |
+
var plotPluginsLength = $.plot.plugins.length;
|
65 |
+
this.plotPlugins = [];
|
66 |
+
|
67 |
+
if (plotPluginsLength) {
|
68 |
+
for (var p = 0; p < plotPluginsLength; p++) {
|
69 |
+
this.plotPlugins.push($.plot.plugins[p].name);
|
70 |
+
}
|
71 |
+
}
|
72 |
+
|
73 |
+
plot.hooks.bindEvents.push(function (plot, eventHolder) {
|
74 |
+
|
75 |
+
// get plot options
|
76 |
+
that.plotOptions = plot.getOptions();
|
77 |
+
|
78 |
+
// for legacy (<0.8.5) implementations
|
79 |
+
if (typeof(that.plotOptions.tooltip) === 'boolean') {
|
80 |
+
that.plotOptions.tooltipOpts.show = that.plotOptions.tooltip;
|
81 |
+
that.plotOptions.tooltip = that.plotOptions.tooltipOpts;
|
82 |
+
delete that.plotOptions.tooltipOpts;
|
83 |
+
}
|
84 |
+
|
85 |
+
// if not enabled return
|
86 |
+
if (that.plotOptions.tooltip.show === false || typeof that.plotOptions.tooltip.show === 'undefined') return;
|
87 |
+
|
88 |
+
// shortcut to access tooltip options
|
89 |
+
that.tooltipOptions = that.plotOptions.tooltip;
|
90 |
+
|
91 |
+
if (that.tooltipOptions.$compat) {
|
92 |
+
that.wfunc = 'width';
|
93 |
+
that.hfunc = 'height';
|
94 |
+
} else {
|
95 |
+
that.wfunc = 'innerWidth';
|
96 |
+
that.hfunc = 'innerHeight';
|
97 |
+
}
|
98 |
+
|
99 |
+
// create tooltip DOM element
|
100 |
+
var $tip = that.getDomElement();
|
101 |
+
|
102 |
+
// bind event
|
103 |
+
$( plot.getPlaceholder() ).bind("plothover", plothover);
|
104 |
+
|
105 |
+
$(eventHolder).bind('mousemove', mouseMove);
|
106 |
+
});
|
107 |
+
|
108 |
+
plot.hooks.shutdown.push(function (plot, eventHolder){
|
109 |
+
$(plot.getPlaceholder()).unbind("plothover", plothover);
|
110 |
+
$(eventHolder).unbind("mousemove", mouseMove);
|
111 |
+
});
|
112 |
+
|
113 |
+
function mouseMove(e){
|
114 |
+
var pos = {};
|
115 |
+
pos.x = e.pageX;
|
116 |
+
pos.y = e.pageY;
|
117 |
+
plot.setTooltipPosition(pos);
|
118 |
+
}
|
119 |
+
|
120 |
+
function plothover(event, pos, item) {
|
121 |
+
// Simple distance formula.
|
122 |
+
var lineDistance = function (p1x, p1y, p2x, p2y) {
|
123 |
+
return Math.sqrt((p2x - p1x) * (p2x - p1x) + (p2y - p1y) * (p2y - p1y));
|
124 |
+
};
|
125 |
+
|
126 |
+
// Here is some voodoo magic for determining the distance to a line form a given point {x, y}.
|
127 |
+
var dotLineLength = function (x, y, x0, y0, x1, y1, o) {
|
128 |
+
if (o && !(o =
|
129 |
+
function (x, y, x0, y0, x1, y1) {
|
130 |
+
if (typeof x0 !== 'undefined') return { x: x0, y: y };
|
131 |
+
else if (typeof y0 !== 'undefined') return { x: x, y: y0 };
|
132 |
+
|
133 |
+
var left,
|
134 |
+
tg = -1 / ((y1 - y0) / (x1 - x0));
|
135 |
+
|
136 |
+
return {
|
137 |
+
x: left = (x1 * (x * tg - y + y0) + x0 * (x * -tg + y - y1)) / (tg * (x1 - x0) + y0 - y1),
|
138 |
+
y: tg * left - tg * x + y
|
139 |
+
};
|
140 |
+
} (x, y, x0, y0, x1, y1),
|
141 |
+
o.x >= Math.min(x0, x1) && o.x <= Math.max(x0, x1) && o.y >= Math.min(y0, y1) && o.y <= Math.max(y0, y1))
|
142 |
+
) {
|
143 |
+
var l1 = lineDistance(x, y, x0, y0), l2 = lineDistance(x, y, x1, y1);
|
144 |
+
return l1 > l2 ? l2 : l1;
|
145 |
+
} else {
|
146 |
+
var a = y0 - y1, b = x1 - x0, c = x0 * y1 - y0 * x1;
|
147 |
+
return Math.abs(a * x + b * y + c) / Math.sqrt(a * a + b * b);
|
148 |
+
}
|
149 |
+
};
|
150 |
+
|
151 |
+
if (item) {
|
152 |
+
plot.showTooltip(item, that.tooltipOptions.snap ? item : pos);
|
153 |
+
} else if (that.plotOptions.series.lines.show && that.tooltipOptions.lines === true) {
|
154 |
+
var maxDistance = that.plotOptions.grid.mouseActiveRadius;
|
155 |
+
|
156 |
+
var closestTrace = {
|
157 |
+
distance: maxDistance + 1
|
158 |
+
};
|
159 |
+
|
160 |
+
var ttPos = pos;
|
161 |
+
|
162 |
+
$.each(plot.getData(), function (i, series) {
|
163 |
+
var xBeforeIndex = 0,
|
164 |
+
xAfterIndex = -1;
|
165 |
+
|
166 |
+
// Our search here assumes our data is sorted via the x-axis.
|
167 |
+
// TODO: Improve efficiency somehow - search smaller sets of data.
|
168 |
+
for (var j = 1; j < series.data.length; j++) {
|
169 |
+
if (series.data[j - 1][0] <= pos.x && series.data[j][0] >= pos.x) {
|
170 |
+
xBeforeIndex = j - 1;
|
171 |
+
xAfterIndex = j;
|
172 |
+
}
|
173 |
+
}
|
174 |
+
|
175 |
+
if (xAfterIndex === -1) {
|
176 |
+
plot.hideTooltip();
|
177 |
+
return;
|
178 |
+
}
|
179 |
+
|
180 |
+
var pointPrev = { x: series.data[xBeforeIndex][0], y: series.data[xBeforeIndex][1] },
|
181 |
+
pointNext = { x: series.data[xAfterIndex][0], y: series.data[xAfterIndex][1] };
|
182 |
+
|
183 |
+
var distToLine = dotLineLength(series.xaxis.p2c(pos.x), series.yaxis.p2c(pos.y), series.xaxis.p2c(pointPrev.x),
|
184 |
+
series.yaxis.p2c(pointPrev.y), series.xaxis.p2c(pointNext.x), series.yaxis.p2c(pointNext.y), false);
|
185 |
+
|
186 |
+
if (distToLine < closestTrace.distance) {
|
187 |
+
|
188 |
+
var closestIndex = lineDistance(pointPrev.x, pointPrev.y, pos.x, pos.y) <
|
189 |
+
lineDistance(pos.x, pos.y, pointNext.x, pointNext.y) ? xBeforeIndex : xAfterIndex;
|
190 |
+
|
191 |
+
var pointSize = series.datapoints.pointsize;
|
192 |
+
|
193 |
+
// Calculate the point on the line vertically closest to our cursor.
|
194 |
+
var pointOnLine = [
|
195 |
+
pos.x,
|
196 |
+
pointPrev.y + ((pointNext.y - pointPrev.y) * ((pos.x - pointPrev.x) / (pointNext.x - pointPrev.x)))
|
197 |
+
];
|
198 |
+
|
199 |
+
var item = {
|
200 |
+
datapoint: pointOnLine,
|
201 |
+
dataIndex: closestIndex,
|
202 |
+
series: series,
|
203 |
+
seriesIndex: i
|
204 |
+
};
|
205 |
+
|
206 |
+
closestTrace = {
|
207 |
+
distance: distToLine,
|
208 |
+
item: item
|
209 |
+
};
|
210 |
+
|
211 |
+
if (that.tooltipOptions.snap) {
|
212 |
+
ttPos = {
|
213 |
+
pageX: series.xaxis.p2c(pointOnLine[0]),
|
214 |
+
pageY: series.yaxis.p2c(pointOnLine[1])
|
215 |
+
};
|
216 |
+
}
|
217 |
+
}
|
218 |
+
});
|
219 |
+
|
220 |
+
if (closestTrace.distance < maxDistance + 1)
|
221 |
+
plot.showTooltip(closestTrace.item, ttPos);
|
222 |
+
else
|
223 |
+
plot.hideTooltip();
|
224 |
+
} else {
|
225 |
+
plot.hideTooltip();
|
226 |
+
}
|
227 |
+
}
|
228 |
+
|
229 |
+
// Quick little function for setting the tooltip position.
|
230 |
+
plot.setTooltipPosition = function (pos) {
|
231 |
+
var $tip = that.getDomElement();
|
232 |
+
|
233 |
+
var totalTipWidth = $tip.outerWidth() + that.tooltipOptions.shifts.x;
|
234 |
+
var totalTipHeight = $tip.outerHeight() + that.tooltipOptions.shifts.y;
|
235 |
+
if ((pos.x - $(window).scrollLeft()) > ($(window)[that.wfunc]() - totalTipWidth)) {
|
236 |
+
pos.x -= totalTipWidth;
|
237 |
+
}
|
238 |
+
if ((pos.y - $(window).scrollTop()) > ($(window)[that.hfunc]() - totalTipHeight)) {
|
239 |
+
pos.y -= totalTipHeight;
|
240 |
+
}
|
241 |
+
|
242 |
+
/*
|
243 |
+
The section applies the new positioning ONLY if pos.x and pos.y
|
244 |
+
are numbers. If they are undefined or not a number, use the last
|
245 |
+
known numerical position. This hack fixes a bug that kept pie
|
246 |
+
charts from keeping their tooltip positioning.
|
247 |
+
*/
|
248 |
+
|
249 |
+
if (isNaN(pos.x)) {
|
250 |
+
that.tipPosition.x = that.tipPosition.xPrev;
|
251 |
+
}
|
252 |
+
else {
|
253 |
+
that.tipPosition.x = pos.x;
|
254 |
+
that.tipPosition.xPrev = pos.x;
|
255 |
+
}
|
256 |
+
if (isNaN(pos.y)) {
|
257 |
+
that.tipPosition.y = that.tipPosition.yPrev;
|
258 |
+
}
|
259 |
+
else {
|
260 |
+
that.tipPosition.y = pos.y;
|
261 |
+
that.tipPosition.yPrev = pos.y;
|
262 |
+
}
|
263 |
+
|
264 |
+
};
|
265 |
+
|
266 |
+
// Quick little function for showing the tooltip.
|
267 |
+
plot.showTooltip = function (target, position, targetPosition) {
|
268 |
+
var $tip = that.getDomElement();
|
269 |
+
|
270 |
+
// convert tooltip content template to real tipText
|
271 |
+
var tipText = that.stringFormat(that.tooltipOptions.content, target);
|
272 |
+
if (tipText === '')
|
273 |
+
return;
|
274 |
+
|
275 |
+
$tip.html(tipText);
|
276 |
+
plot.setTooltipPosition({ x: position.pageX, y: position.pageY });
|
277 |
+
$tip.css({
|
278 |
+
left: that.tipPosition.x + that.tooltipOptions.shifts.x,
|
279 |
+
top: that.tipPosition.y + that.tooltipOptions.shifts.y
|
280 |
+
}).show();
|
281 |
+
|
282 |
+
// run callback
|
283 |
+
if (typeof that.tooltipOptions.onHover === 'function') {
|
284 |
+
that.tooltipOptions.onHover(target, $tip);
|
285 |
+
}
|
286 |
+
};
|
287 |
+
|
288 |
+
// Quick little function for hiding the tooltip.
|
289 |
+
plot.hideTooltip = function () {
|
290 |
+
that.getDomElement().hide().html('');
|
291 |
+
};
|
292 |
+
};
|
293 |
+
|
294 |
+
/**
|
295 |
+
* get or create tooltip DOM element
|
296 |
+
* @return jQuery object
|
297 |
+
*/
|
298 |
+
FlotTooltip.prototype.getDomElement = function () {
|
299 |
+
var $tip = $('.' + this.tooltipOptions.cssClass);
|
300 |
+
|
301 |
+
if( $tip.length === 0 ){
|
302 |
+
$tip = $('<div />').addClass(this.tooltipOptions.cssClass);
|
303 |
+
$tip.appendTo('body').hide().css({position: 'absolute'});
|
304 |
+
|
305 |
+
if(this.tooltipOptions.defaultTheme) {
|
306 |
+
$tip.css({
|
307 |
+
'background': '#fff',
|
308 |
+
'z-index': '1040',
|
309 |
+
'padding': '0.4em 0.6em',
|
310 |
+
'border-radius': '0.5em',
|
311 |
+
'font-size': '0.8em',
|
312 |
+
'border': '1px solid #111',
|
313 |
+
'display': 'none',
|
314 |
+
'white-space': 'nowrap'
|
315 |
+
});
|
316 |
+
}
|
317 |
+
}
|
318 |
+
|
319 |
+
return $tip;
|
320 |
+
};
|
321 |
+
|
322 |
+
/**
|
323 |
+
* core function, create tooltip content
|
324 |
+
* @param {string} content - template with tooltip content
|
325 |
+
* @param {object} item - Flot item
|
326 |
+
* @return {string} real tooltip content for current item
|
327 |
+
*/
|
328 |
+
FlotTooltip.prototype.stringFormat = function (content, item) {
|
329 |
+
var percentPattern = /%p\.{0,1}(\d{0,})/;
|
330 |
+
var seriesPattern = /%s/;
|
331 |
+
var colorPattern = /%c/;
|
332 |
+
var xLabelPattern = /%lx/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded
|
333 |
+
var yLabelPattern = /%ly/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded
|
334 |
+
var xPattern = /%x\.{0,1}(\d{0,})/;
|
335 |
+
var yPattern = /%y\.{0,1}(\d{0,})/;
|
336 |
+
var xPatternWithoutPrecision = "%x";
|
337 |
+
var yPatternWithoutPrecision = "%y";
|
338 |
+
var customTextPattern = "%ct";
|
339 |
+
var nPiePattern = "%n";
|
340 |
+
|
341 |
+
var x, y, customText, p, n;
|
342 |
+
|
343 |
+
// for threshold plugin we need to read data from different place
|
344 |
+
if (typeof item.series.threshold !== "undefined") {
|
345 |
+
x = item.datapoint[0];
|
346 |
+
y = item.datapoint[1];
|
347 |
+
customText = item.datapoint[2];
|
348 |
+
}
|
349 |
+
|
350 |
+
// for CurvedLines plugin we need to read data from different place
|
351 |
+
else if (typeof item.series.curvedLines !== "undefined") {
|
352 |
+
x = item.datapoint[0];
|
353 |
+
y = item.datapoint[1];
|
354 |
+
}
|
355 |
+
|
356 |
+
else if (typeof item.series.lines !== "undefined" && item.series.lines.steps) {
|
357 |
+
x = item.series.datapoints.points[item.dataIndex * 2];
|
358 |
+
y = item.series.datapoints.points[item.dataIndex * 2 + 1];
|
359 |
+
// TODO: where to find custom text in this variant?
|
360 |
+
customText = "";
|
361 |
+
} else {
|
362 |
+
x = item.series.data[item.dataIndex][0];
|
363 |
+
y = item.series.data[item.dataIndex][1];
|
364 |
+
customText = item.series.data[item.dataIndex][2];
|
365 |
+
}
|
366 |
+
|
367 |
+
// I think this is only in case of threshold plugin
|
368 |
+
if (item.series.label === null && item.series.originSeries) {
|
369 |
+
item.series.label = item.series.originSeries.label;
|
370 |
+
}
|
371 |
+
|
372 |
+
// if it is a function callback get the content string
|
373 |
+
if (typeof(content) === 'function') {
|
374 |
+
content = content(item.series.label, x, y, item);
|
375 |
+
}
|
376 |
+
|
377 |
+
// the case where the passed content is equal to false
|
378 |
+
if (typeof(content) === 'boolean' && !content) {
|
379 |
+
return '';
|
380 |
+
}
|
381 |
+
|
382 |
+
/* replacement of %ct and other multi-character templates must
|
383 |
+
precede the replacement of single-character templates
|
384 |
+
to avoid conflict between '%c' and '%ct' and similar substrings
|
385 |
+
*/
|
386 |
+
if (customText)
|
387 |
+
content = content.replace(customTextPattern, customText);
|
388 |
+
|
389 |
+
// percent match for pie charts and stacked percent
|
390 |
+
if (typeof (item.series.percent) !== 'undefined') {
|
391 |
+
p = item.series.percent;
|
392 |
+
} else if (typeof (item.series.percents) !== 'undefined') {
|
393 |
+
p = item.series.percents[item.dataIndex];
|
394 |
+
}
|
395 |
+
if (typeof p === 'number') {
|
396 |
+
content = this.adjustValPrecision(percentPattern, content, p);
|
397 |
+
}
|
398 |
+
|
399 |
+
// replace %n with number of items represented by slice in pie charts
|
400 |
+
if (item.series.hasOwnProperty('pie')) {
|
401 |
+
if (typeof (item.series.data[0][1] !== 'undefined')) {
|
402 |
+
n = item.series.data[0][1];
|
403 |
+
}
|
404 |
+
}
|
405 |
+
if (typeof n === 'number') {
|
406 |
+
content = content.replace(nPiePattern, n);
|
407 |
+
}
|
408 |
+
|
409 |
+
// series match
|
410 |
+
if (typeof(item.series.label) !== 'undefined') {
|
411 |
+
content = content.replace(seriesPattern, item.series.label);
|
412 |
+
} else {
|
413 |
+
//remove %s if label is undefined
|
414 |
+
content = content.replace(seriesPattern, "");
|
415 |
+
}
|
416 |
+
|
417 |
+
// color match
|
418 |
+
if (typeof(item.series.color) !== 'undefined') {
|
419 |
+
content = content.replace(colorPattern, item.series.color);
|
420 |
+
} else {
|
421 |
+
//remove %s if color is undefined
|
422 |
+
content = content.replace(colorPattern, "");
|
423 |
+
}
|
424 |
+
|
425 |
+
// x axis label match
|
426 |
+
if (this.hasAxisLabel('xaxis', item)) {
|
427 |
+
content = content.replace(xLabelPattern, item.series.xaxis.options.axisLabel);
|
428 |
+
} else {
|
429 |
+
//remove %lx if axis label is undefined or axislabels plugin not present
|
430 |
+
content = content.replace(xLabelPattern, "");
|
431 |
+
}
|
432 |
+
|
433 |
+
// y axis label match
|
434 |
+
if (this.hasAxisLabel('yaxis', item)) {
|
435 |
+
content = content.replace(yLabelPattern, item.series.yaxis.options.axisLabel);
|
436 |
+
} else {
|
437 |
+
//remove %ly if axis label is undefined or axislabels plugin not present
|
438 |
+
content = content.replace(yLabelPattern, "");
|
439 |
+
}
|
440 |
+
|
441 |
+
// time mode axes with custom dateFormat
|
442 |
+
if (this.isTimeMode('xaxis', item) && this.isXDateFormat(item)) {
|
443 |
+
content = content.replace(xPattern, this.timestampToDate(x, this.tooltipOptions.xDateFormat, item.series.xaxis.options));
|
444 |
+
}
|
445 |
+
if (this.isTimeMode('yaxis', item) && this.isYDateFormat(item)) {
|
446 |
+
content = content.replace(yPattern, this.timestampToDate(y, this.tooltipOptions.yDateFormat, item.series.yaxis.options));
|
447 |
+
}
|
448 |
+
|
449 |
+
// set precision if defined
|
450 |
+
if (typeof x === 'number') {
|
451 |
+
content = this.adjustValPrecision(xPattern, content, x);
|
452 |
+
}
|
453 |
+
if (typeof y === 'number') {
|
454 |
+
content = this.adjustValPrecision(yPattern, content, y);
|
455 |
+
}
|
456 |
+
|
457 |
+
// change x from number to given label, if given
|
458 |
+
if (typeof item.series.xaxis.ticks !== 'undefined') {
|
459 |
+
|
460 |
+
var ticks;
|
461 |
+
if (this.hasRotatedXAxisTicks(item)) {
|
462 |
+
// xaxis.ticks will be an empty array if tickRotor is being used, but the values are available in rotatedTicks
|
463 |
+
ticks = 'rotatedTicks';
|
464 |
+
} else {
|
465 |
+
ticks = 'ticks';
|
466 |
+
}
|
467 |
+
|
468 |
+
// see https://github.com/krzysu/flot.tooltip/issues/65
|
469 |
+
var tickIndex = item.dataIndex + item.seriesIndex;
|
470 |
+
|
471 |
+
for (var xIndex in item.series.xaxis[ticks]) {
|
472 |
+
if (item.series.xaxis[ticks].hasOwnProperty(tickIndex) && !this.isTimeMode('xaxis', item)) {
|
473 |
+
var valueX = (this.isCategoriesMode('xaxis', item)) ? item.series.xaxis[ticks][tickIndex].label : item.series.xaxis[ticks][tickIndex].v;
|
474 |
+
if (valueX === x) {
|
475 |
+
content = content.replace(xPattern, item.series.xaxis[ticks][tickIndex].label);
|
476 |
+
}
|
477 |
+
}
|
478 |
+
}
|
479 |
+
}
|
480 |
+
|
481 |
+
// change y from number to given label, if given
|
482 |
+
if (typeof item.series.yaxis.ticks !== 'undefined') {
|
483 |
+
for (var yIndex in item.series.yaxis.ticks) {
|
484 |
+
if (item.series.yaxis.ticks.hasOwnProperty(yIndex)) {
|
485 |
+
var valueY = (this.isCategoriesMode('yaxis', item)) ? item.series.yaxis.ticks[yIndex].label : item.series.yaxis.ticks[yIndex].v;
|
486 |
+
if (valueY === y) {
|
487 |
+
content = content.replace(yPattern, item.series.yaxis.ticks[yIndex].label);
|
488 |
+
}
|
489 |
+
}
|
490 |
+
}
|
491 |
+
}
|
492 |
+
|
493 |
+
// if no value customization, use tickFormatter by default
|
494 |
+
if (typeof item.series.xaxis.tickFormatter !== 'undefined') {
|
495 |
+
//escape dollar
|
496 |
+
content = content.replace(xPatternWithoutPrecision, item.series.xaxis.tickFormatter(x, item.series.xaxis).replace(/\$/g, '$$'));
|
497 |
+
}
|
498 |
+
if (typeof item.series.yaxis.tickFormatter !== 'undefined') {
|
499 |
+
//escape dollar
|
500 |
+
content = content.replace(yPatternWithoutPrecision, item.series.yaxis.tickFormatter(y, item.series.yaxis).replace(/\$/g, '$$'));
|
501 |
+
}
|
502 |
+
|
503 |
+
return content;
|
504 |
+
};
|
505 |
+
|
506 |
+
// helpers just for readability
|
507 |
+
FlotTooltip.prototype.isTimeMode = function (axisName, item) {
|
508 |
+
return (typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'time');
|
509 |
+
};
|
510 |
+
|
511 |
+
FlotTooltip.prototype.isXDateFormat = function (item) {
|
512 |
+
return (typeof this.tooltipOptions.xDateFormat !== 'undefined' && this.tooltipOptions.xDateFormat !== null);
|
513 |
+
};
|
514 |
+
|
515 |
+
FlotTooltip.prototype.isYDateFormat = function (item) {
|
516 |
+
return (typeof this.tooltipOptions.yDateFormat !== 'undefined' && this.tooltipOptions.yDateFormat !== null);
|
517 |
+
};
|
518 |
+
|
519 |
+
FlotTooltip.prototype.isCategoriesMode = function (axisName, item) {
|
520 |
+
return (typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'categories');
|
521 |
+
};
|
522 |
+
|
523 |
+
//
|
524 |
+
FlotTooltip.prototype.timestampToDate = function (tmst, dateFormat, options) {
|
525 |
+
var theDate = $.plot.dateGenerator(tmst, options);
|
526 |
+
return $.plot.formatDate(theDate, dateFormat, this.tooltipOptions.monthNames, this.tooltipOptions.dayNames);
|
527 |
+
};
|
528 |
+
|
529 |
+
//
|
530 |
+
FlotTooltip.prototype.adjustValPrecision = function (pattern, content, value) {
|
531 |
+
|
532 |
+
var precision;
|
533 |
+
var matchResult = content.match(pattern);
|
534 |
+
if( matchResult !== null ) {
|
535 |
+
if(RegExp.$1 !== '') {
|
536 |
+
precision = RegExp.$1;
|
537 |
+
value = value.toFixed(precision);
|
538 |
+
|
539 |
+
// only replace content if precision exists, in other case use thickformater
|
540 |
+
content = content.replace(pattern, value);
|
541 |
+
}
|
542 |
+
}
|
543 |
+
return content;
|
544 |
+
};
|
545 |
+
|
546 |
+
// other plugins detection below
|
547 |
+
|
548 |
+
// check if flot-axislabels plugin (https://github.com/markrcote/flot-axislabels) is used and that an axis label is given
|
549 |
+
FlotTooltip.prototype.hasAxisLabel = function (axisName, item) {
|
550 |
+
return ($.inArray('axisLabels', this.plotPlugins) !== -1 && typeof item.series[axisName].options.axisLabel !== 'undefined' && item.series[axisName].options.axisLabel.length > 0);
|
551 |
+
};
|
552 |
+
|
553 |
+
// check whether flot-tickRotor, a plugin which allows rotation of X-axis ticks, is being used
|
554 |
+
FlotTooltip.prototype.hasRotatedXAxisTicks = function (item) {
|
555 |
+
return ($.inArray('tickRotor',this.plotPlugins) !== -1 && typeof item.series.xaxis.rotatedTicks !== 'undefined');
|
556 |
+
};
|
557 |
+
|
558 |
+
//
|
559 |
+
var init = function (plot) {
|
560 |
+
new FlotTooltip(plot);
|
561 |
+
};
|
562 |
+
|
563 |
+
// define Flot plugin
|
564 |
+
$.plot.plugins.push({
|
565 |
+
init: init,
|
566 |
+
options: defaultOptions,
|
567 |
+
name: 'tooltip',
|
568 |
+
version: '0.8.5'
|
569 |
+
});
|
570 |
+
|
571 |
+
})(jQuery);
|
assets/admin/scripts/jquery-flot.js
ADDED
@@ -0,0 +1,3601 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* Javascript plotting library for jQuery, version 0.8.3.
|
2 |
+
|
3 |
+
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
4 |
+
Licensed under the MIT license.
|
5 |
+
|
6 |
+
*/
|
7 |
+
|
8 |
+
// first an inline dependency, jquery.colorhelpers.js, we inline it here
|
9 |
+
// for convenience
|
10 |
+
|
11 |
+
/* Plugin for jQuery for working with colors.
|
12 |
+
*
|
13 |
+
* Version 1.1.
|
14 |
+
*
|
15 |
+
* Inspiration from jQuery color animation plugin by John Resig.
|
16 |
+
*
|
17 |
+
* Released under the MIT license by Ole Laursen, October 2009.
|
18 |
+
*
|
19 |
+
* Examples:
|
20 |
+
*
|
21 |
+
* $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
|
22 |
+
* var c = $.color.extract($("#mydiv"), 'background-color');
|
23 |
+
* console.log(c.r, c.g, c.b, c.a);
|
24 |
+
* $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
|
25 |
+
*
|
26 |
+
* Note that .scale() and .add() return the same modified object
|
27 |
+
* instead of making a new one.
|
28 |
+
*
|
29 |
+
* V. 1.1: Fix error handling so e.g. parsing an empty string does
|
30 |
+
* produce a color rather than just crashing.
|
31 |
+
*/
|
32 |
+
(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
|
33 |
+
|
34 |
+
// the actual Flot code
|
35 |
+
(function($) {
|
36 |
+
|
37 |
+
// Cache the prototype hasOwnProperty for faster access
|
38 |
+
|
39 |
+
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
40 |
+
|
41 |
+
// A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM
|
42 |
+
// operation produces the same effect as detach, i.e. removing the element
|
43 |
+
// without touching its jQuery data.
|
44 |
+
|
45 |
+
// Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.
|
46 |
+
|
47 |
+
if (!$.fn.detach) {
|
48 |
+
$.fn.detach = function() {
|
49 |
+
return this.each(function() {
|
50 |
+
if (this.parentNode) {
|
51 |
+
this.parentNode.removeChild( this );
|
52 |
+
}
|
53 |
+
});
|
54 |
+
};
|
55 |
+
}
|
56 |
+
|
57 |
+
///////////////////////////////////////////////////////////////////////////
|
58 |
+
// The Canvas object is a wrapper around an HTML5 <canvas> tag.
|
59 |
+
//
|
60 |
+
// @constructor
|
61 |
+
// @param {string} cls List of classes to apply to the canvas.
|
62 |
+
// @param {element} container Element onto which to append the canvas.
|
63 |
+
//
|
64 |
+
// Requiring a container is a little iffy, but unfortunately canvas
|
65 |
+
// operations don't work unless the canvas is attached to the DOM.
|
66 |
+
|
67 |
+
function Canvas(cls, container) {
|
68 |
+
|
69 |
+
var element = container.children("." + cls)[0];
|
70 |
+
|
71 |
+
if (element == null) {
|
72 |
+
|
73 |
+
element = document.createElement("canvas");
|
74 |
+
element.className = cls;
|
75 |
+
|
76 |
+
$(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
|
77 |
+
.appendTo(container);
|
78 |
+
|
79 |
+
// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
|
80 |
+
|
81 |
+
if (!element.getContext) {
|
82 |
+
if (window.G_vmlCanvasManager) {
|
83 |
+
element = window.G_vmlCanvasManager.initElement(element);
|
84 |
+
} else {
|
85 |
+
throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
|
86 |
+
}
|
87 |
+
}
|
88 |
+
}
|
89 |
+
|
90 |
+
this.element = element;
|
91 |
+
|
92 |
+
var context = this.context = element.getContext("2d");
|
93 |
+
|
94 |
+
// Determine the screen's ratio of physical to device-independent
|
95 |
+
// pixels. This is the ratio between the canvas width that the browser
|
96 |
+
// advertises and the number of pixels actually present in that space.
|
97 |
+
|
98 |
+
// The iPhone 4, for example, has a device-independent width of 320px,
|
99 |
+
// but its screen is actually 640px wide. It therefore has a pixel
|
100 |
+
// ratio of 2, while most normal devices have a ratio of 1.
|
101 |
+
|
102 |
+
var devicePixelRatio = window.devicePixelRatio || 1,
|
103 |
+
backingStoreRatio =
|
104 |
+
context.webkitBackingStorePixelRatio ||
|
105 |
+
context.mozBackingStorePixelRatio ||
|
106 |
+
context.msBackingStorePixelRatio ||
|
107 |
+
context.oBackingStorePixelRatio ||
|
108 |
+
context.backingStorePixelRatio || 1;
|
109 |
+
|
110 |
+
this.pixelRatio = devicePixelRatio / backingStoreRatio;
|
111 |
+
|
112 |
+
// Size the canvas to match the internal dimensions of its container
|
113 |
+
|
114 |
+
this.resize(container.width(), container.height());
|
115 |
+
|
116 |
+
// Collection of HTML div layers for text overlaid onto the canvas
|
117 |
+
|
118 |
+
this.textContainer = null;
|
119 |
+
this.text = {};
|
120 |
+
|
121 |
+
// Cache of text fragments and metrics, so we can avoid expensively
|
122 |
+
// re-calculating them when the plot is re-rendered in a loop.
|
123 |
+
|
124 |
+
this._textCache = {};
|
125 |
+
}
|
126 |
+
|
127 |
+
// Resizes the canvas to the given dimensions.
|
128 |
+
//
|
129 |
+
// @param {number} width New width of the canvas, in pixels.
|
130 |
+
// @param {number} width New height of the canvas, in pixels.
|
131 |
+
|
132 |
+
Canvas.prototype.resize = function(width, height) {
|
133 |
+
|
134 |
+
if (width <= 0 || height <= 0) {
|
135 |
+
throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
|
136 |
+
}
|
137 |
+
|
138 |
+
var element = this.element,
|
139 |
+
context = this.context,
|
140 |
+
pixelRatio = this.pixelRatio;
|
141 |
+
|
142 |
+
// Resize the canvas, increasing its density based on the display's
|
143 |
+
// pixel ratio; basically giving it more pixels without increasing the
|
144 |
+
// size of its element, to take advantage of the fact that retina
|
145 |
+
// displays have that many more pixels in the same advertised space.
|
146 |
+
|
147 |
+
// Resizing should reset the state (excanvas seems to be buggy though)
|
148 |
+
|
149 |
+
if (this.width != width) {
|
150 |
+
element.width = width * pixelRatio;
|
151 |
+
element.style.width = width + "px";
|
152 |
+
this.width = width;
|
153 |
+
}
|
154 |
+
|
155 |
+
if (this.height != height) {
|
156 |
+
element.height = height * pixelRatio;
|
157 |
+
element.style.height = height + "px";
|
158 |
+
this.height = height;
|
159 |
+
}
|
160 |
+
|
161 |
+
// Save the context, so we can reset in case we get replotted. The
|
162 |
+
// restore ensure that we're really back at the initial state, and
|
163 |
+
// should be safe even if we haven't saved the initial state yet.
|
164 |
+
|
165 |
+
context.restore();
|
166 |
+
context.save();
|
167 |
+
|
168 |
+
// Scale the coordinate space to match the display density; so even though we
|
169 |
+
// may have twice as many pixels, we still want lines and other drawing to
|
170 |
+
// appear at the same size; the extra pixels will just make them crisper.
|
171 |
+
|
172 |
+
context.scale(pixelRatio, pixelRatio);
|
173 |
+
};
|
174 |
+
|
175 |
+
// Clears the entire canvas area, not including any overlaid HTML text
|
176 |
+
|
177 |
+
Canvas.prototype.clear = function() {
|
178 |
+
this.context.clearRect(0, 0, this.width, this.height);
|
179 |
+
};
|
180 |
+
|
181 |
+
// Finishes rendering the canvas, including managing the text overlay.
|
182 |
+
|
183 |
+
Canvas.prototype.render = function() {
|
184 |
+
|
185 |
+
var cache = this._textCache;
|
186 |
+
|
187 |
+
// For each text layer, add elements marked as active that haven't
|
188 |
+
// already been rendered, and remove those that are no longer active.
|
189 |
+
|
190 |
+
for (var layerKey in cache) {
|
191 |
+
if (hasOwnProperty.call(cache, layerKey)) {
|
192 |
+
|
193 |
+
var layer = this.getTextLayer(layerKey),
|
194 |
+
layerCache = cache[layerKey];
|
195 |
+
|
196 |
+
layer.hide();
|
197 |
+
|
198 |
+
for (var styleKey in layerCache) {
|
199 |
+
if (hasOwnProperty.call(layerCache, styleKey)) {
|
200 |
+
var styleCache = layerCache[styleKey];
|
201 |
+
for (var key in styleCache) {
|
202 |
+
if (hasOwnProperty.call(styleCache, key)) {
|
203 |
+
|
204 |
+
var positions = styleCache[key].positions;
|
205 |
+
|
206 |
+
for (var i = 0, position; position = positions[i]; i++) {
|
207 |
+
if (position.active) {
|
208 |
+
if (!position.rendered) {
|
209 |
+
layer.append(position.element);
|
210 |
+
position.rendered = true;
|
211 |
+
}
|
212 |
+
} else {
|
213 |
+
positions.splice(i--, 1);
|
214 |
+
if (position.rendered) {
|
215 |
+
position.element.detach();
|
216 |
+
}
|
217 |
+
}
|
218 |
+
}
|
219 |
+
|
220 |
+
if (positions.length == 0) {
|
221 |
+
delete styleCache[key];
|
222 |
+
}
|
223 |
+
}
|
224 |
+
}
|
225 |
+
}
|
226 |
+
}
|
227 |
+
|
228 |
+
layer.show();
|
229 |
+
}
|
230 |
+
}
|
231 |
+
};
|
232 |
+
|
233 |
+
// Creates (if necessary) and returns the text overlay container.
|
234 |
+
//
|
235 |
+
// @param {string} classes String of space-separated CSS classes used to
|
236 |
+
// uniquely identify the text layer.
|
237 |
+
// @return {object} The jQuery-wrapped text-layer div.
|
238 |
+
|
239 |
+
Canvas.prototype.getTextLayer = function(classes) {
|
240 |
+
|
241 |
+
var layer = this.text[classes];
|
242 |
+
|
243 |
+
// Create the text layer if it doesn't exist
|
244 |
+
|
245 |
+
if (layer == null) {
|
246 |
+
|
247 |
+
// Create the text layer container, if it doesn't exist
|
248 |
+
|
249 |
+
if (this.textContainer == null) {
|
250 |
+
this.textContainer = $("<div class='flot-text'></div>")
|
251 |
+
.css({
|
252 |
+
position: "absolute",
|
253 |
+
top: 0,
|
254 |
+
left: 0,
|
255 |
+
bottom: 0,
|
256 |
+
right: 0,
|
257 |
+
'font-size': "smaller",
|
258 |
+
color: "#545454"
|
259 |
+
})
|
260 |
+
.insertAfter(this.element);
|
261 |
+
}
|
262 |
+
|
263 |
+
layer = this.text[classes] = $("<div></div>")
|
264 |
+
.addClass(classes)
|
265 |
+
.css({
|
266 |
+
position: "absolute",
|
267 |
+
top: 0,
|
268 |
+
left: 0,
|
269 |
+
bottom: 0,
|
270 |
+
right: 0
|
271 |
+
})
|
272 |
+
.appendTo(this.textContainer);
|
273 |
+
}
|
274 |
+
|
275 |
+
return layer;
|
276 |
+
};
|
277 |
+
|
278 |
+
// Creates (if necessary) and returns a text info object.
|
279 |
+
//
|
280 |
+
// The object looks like this:
|
281 |
+
//
|
282 |
+
// {
|
283 |
+
// width: Width of the text's wrapper div.
|
284 |
+
// height: Height of the text's wrapper div.
|
285 |
+
// element: The jQuery-wrapped HTML div containing the text.
|
286 |
+
// positions: Array of positions at which this text is drawn.
|
287 |
+
// }
|
288 |
+
//
|
289 |
+
// The positions array contains objects that look like this:
|
290 |
+
//
|
291 |
+
// {
|
292 |
+
// active: Flag indicating whether the text should be visible.
|
293 |
+
// rendered: Flag indicating whether the text is currently visible.
|
294 |
+
// element: The jQuery-wrapped HTML div containing the text.
|
295 |
+
// x: X coordinate at which to draw the text.
|
296 |
+
// y: Y coordinate at which to draw the text.
|
297 |
+
// }
|
298 |
+
//
|
299 |
+
// Each position after the first receives a clone of the original element.
|
300 |
+
//
|
301 |
+
// The idea is that that the width, height, and general 'identity' of the
|
302 |
+
// text is constant no matter where it is placed; the placements are a
|
303 |
+
// secondary property.
|
304 |
+
//
|
305 |
+
// Canvas maintains a cache of recently-used text info objects; getTextInfo
|
306 |
+
// either returns the cached element or creates a new entry.
|
307 |
+
//
|
308 |
+
// @param {string} layer A string of space-separated CSS classes uniquely
|
309 |
+
// identifying the layer containing this text.
|
310 |
+
// @param {string} text Text string to retrieve info for.
|
311 |
+
// @param {(string|object)=} font Either a string of space-separated CSS
|
312 |
+
// classes or a font-spec object, defining the text's font and style.
|
313 |
+
// @param {number=} angle Angle at which to rotate the text, in degrees.
|
314 |
+
// Angle is currently unused, it will be implemented in the future.
|
315 |
+
// @param {number=} width Maximum width of the text before it wraps.
|
316 |
+
// @return {object} a text info object.
|
317 |
+
|
318 |
+
Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
|
319 |
+
|
320 |
+
var textStyle, layerCache, styleCache, info;
|
321 |
+
|
322 |
+
// Cast the value to a string, in case we were given a number or such
|
323 |
+
|
324 |
+
text = "" + text;
|
325 |
+
|
326 |
+
// If the font is a font-spec object, generate a CSS font definition
|
327 |
+
|
328 |
+
if (typeof font === "object") {
|
329 |
+
textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
|
330 |
+
} else {
|
331 |
+
textStyle = font;
|
332 |
+
}
|
333 |
+
|
334 |
+
// Retrieve (or create) the cache for the text's layer and styles
|
335 |
+
|
336 |
+
layerCache = this._textCache[layer];
|
337 |
+
|
338 |
+
if (layerCache == null) {
|
339 |
+
layerCache = this._textCache[layer] = {};
|
340 |
+
}
|
341 |
+
|
342 |
+
styleCache = layerCache[textStyle];
|
343 |
+
|
344 |
+
if (styleCache == null) {
|
345 |
+
styleCache = layerCache[textStyle] = {};
|
346 |
+
}
|
347 |
+
|
348 |
+
info = styleCache[text];
|
349 |
+
|
350 |
+
// If we can't find a matching element in our cache, create a new one
|
351 |
+
|
352 |
+
if (info == null) {
|
353 |
+
|
354 |
+
var element = $("<div></div>").html(text)
|
355 |
+
.css({
|
356 |
+
position: "absolute",
|
357 |
+
'max-width': width,
|
358 |
+
top: -9999
|
359 |
+
})
|
360 |
+
.appendTo(this.getTextLayer(layer));
|
361 |
+
|
362 |
+
if (typeof font === "object") {
|
363 |
+
element.css({
|
364 |
+
font: textStyle,
|
365 |
+
color: font.color
|
366 |
+
});
|
367 |
+
} else if (typeof font === "string") {
|
368 |
+
element.addClass(font);
|
369 |
+
}
|
370 |
+
|
371 |
+
info = styleCache[text] = {
|
372 |
+
width: element.outerWidth(true),
|
373 |
+
height: element.outerHeight(true),
|
374 |
+
element: element,
|
375 |
+
positions: []
|
376 |
+
};
|
377 |
+
|
378 |
+
element.detach();
|
379 |
+
}
|
380 |
+
|
381 |
+
return info;
|
382 |
+
};
|
383 |
+
|
384 |
+
// Adds a text string to the canvas text overlay.
|
385 |
+
//
|
386 |
+
// The text isn't drawn immediately; it is marked as rendering, which will
|
387 |
+
// result in its addition to the canvas on the next render pass.
|
388 |
+
//
|
389 |
+
// @param {string} layer A string of space-separated CSS classes uniquely
|
390 |
+
// identifying the layer containing this text.
|
391 |
+
// @param {number} x X coordinate at which to draw the text.
|
392 |
+
// @param {number} y Y coordinate at which to draw the text.
|
393 |
+
// @param {string} text Text string to draw.
|
394 |
+
// @param {(string|object)=} font Either a string of space-separated CSS
|
395 |
+
// classes or a font-spec object, defining the text's font and style.
|
396 |
+
// @param {number=} angle Angle at which to rotate the text, in degrees.
|
397 |
+
// Angle is currently unused, it will be implemented in the future.
|
398 |
+
// @param {number=} width Maximum width of the text before it wraps.
|
399 |
+
// @param {string=} halign Horizontal alignment of the text; either "left",
|
400 |
+
// "center" or "right".
|
401 |
+
// @param {string=} valign Vertical alignment of the text; either "top",
|
402 |
+
// "middle" or "bottom".
|
403 |
+
|
404 |
+
Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
|
405 |
+
|
406 |
+
var info = this.getTextInfo(layer, text, font, angle, width),
|
407 |
+
positions = info.positions;
|
408 |
+
|
409 |
+
// Tweak the div's position to match the text's alignment
|
410 |
+
|
411 |
+
if (halign == "center") {
|
412 |
+
x -= info.width / 2;
|
413 |
+
} else if (halign == "right") {
|
414 |
+
x -= info.width;
|
415 |
+
}
|
416 |
+
|
417 |
+
if (valign == "middle") {
|
418 |
+
y -= info.height / 2;
|
419 |
+
} else if (valign == "bottom") {
|
420 |
+
y -= info.height;
|
421 |
+
}
|
422 |
+
|
423 |
+
// Determine whether this text already exists at this position.
|
424 |
+
// If so, mark it for inclusion in the next render pass.
|
425 |
+
|
426 |
+
for (var i = 0, position; position = positions[i]; i++) {
|
427 |
+
if (position.x == x && position.y == y) {
|
428 |
+
position.active = true;
|
429 |
+
return;
|
430 |
+
}
|
431 |
+
}
|
432 |
+
|
433 |
+
// If the text doesn't exist at this position, create a new entry
|
434 |
+
|
435 |
+
// For the very first position we'll re-use the original element,
|
436 |
+
// while for subsequent ones we'll clone it.
|
437 |
+
|
438 |
+
position = {
|
439 |
+
active: true,
|
440 |
+
rendered: false,
|
441 |
+
element: positions.length ? info.element.clone() : info.element,
|
442 |
+
x: x,
|
443 |
+
y: y
|
444 |
+
};
|
445 |
+
|
446 |
+
positions.push(position);
|
447 |
+
|
448 |
+
// Move the element to its final position within the container
|
449 |
+
|
450 |
+
position.element.css({
|
451 |
+
top: Math.round(y),
|
452 |
+
left: Math.round(x),
|
453 |
+
'text-align': halign // In case the text wraps
|
454 |
+
});
|
455 |
+
};
|
456 |
+
|
457 |
+
// Removes one or more text strings from the canvas text overlay.
|
458 |
+
//
|
459 |
+
// If no parameters are given, all text within the layer is removed.
|
460 |
+
//
|
461 |
+
// Note that the text is not immediately removed; it is simply marked as
|
462 |
+
// inactive, which will result in its removal on the next render pass.
|
463 |
+
// This avoids the performance penalty for 'clear and redraw' behavior,
|
464 |
+
// where we potentially get rid of all text on a layer, but will likely
|
465 |
+
// add back most or all of it later, as when redrawing axes, for example.
|
466 |
+
//
|
467 |
+
// @param {string} layer A string of space-separated CSS classes uniquely
|
468 |
+
// identifying the layer containing this text.
|
469 |
+
// @param {number=} x X coordinate of the text.
|
470 |
+
// @param {number=} y Y coordinate of the text.
|
471 |
+
// @param {string=} text Text string to remove.
|
472 |
+
// @param {(string|object)=} font Either a string of space-separated CSS
|
473 |
+
// classes or a font-spec object, defining the text's font and style.
|
474 |
+
// @param {number=} angle Angle at which the text is rotated, in degrees.
|
475 |
+
// Angle is currently unused, it will be implemented in the future.
|
476 |
+
|
477 |
+
Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
|
478 |
+
if (text == null) {
|
479 |
+
var layerCache = this._textCache[layer];
|
480 |
+
if (layerCache != null) {
|
481 |
+
for (var styleKey in layerCache) {
|
482 |
+
if (hasOwnProperty.call(layerCache, styleKey)) {
|
483 |
+
var styleCache = layerCache[styleKey];
|
484 |
+
for (var key in styleCache) {
|
485 |
+
if (hasOwnProperty.call(styleCache, key)) {
|
486 |
+
var positions = styleCache[key].positions;
|
487 |
+
for (var i = 0, position; position = positions[i]; i++) {
|
488 |
+
position.active = false;
|
489 |
+
}
|
490 |
+
}
|
491 |
+
}
|
492 |
+
}
|
493 |
+
}
|
494 |
+
}
|
495 |
+
} else {
|
496 |
+
var positions = this.getTextInfo(layer, text, font, angle).positions;
|
497 |
+
for (var i = 0, position; position = positions[i]; i++) {
|
498 |
+
if (position.x == x && position.y == y) {
|
499 |
+
position.active = false;
|
500 |
+
}
|
501 |
+
}
|
502 |
+
}
|
503 |
+
};
|
504 |
+
|
505 |
+
///////////////////////////////////////////////////////////////////////////
|
506 |
+
// The top-level container for the entire plot.
|
507 |
+
|
508 |
+
function Plot(placeholder, data_, options_, plugins) {
|
509 |
+
// data is on the form:
|
510 |
+
// [ series1, series2 ... ]
|
511 |
+
// where series is either just the data as [ [x1, y1], [x2, y2], ... ]
|
512 |
+
// or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
|
513 |
+
|
514 |
+
var series = [],
|
515 |
+
options = {
|
516 |
+
// the color theme used for graphs
|
517 |
+
colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
|
518 |
+
legend: {
|
519 |
+
show: true,
|
520 |
+
noColumns: 1, // number of colums in legend table
|
521 |
+
labelFormatter: null, // fn: string -> string
|
522 |
+
labelBoxBorderColor: "#ccc", // border color for the little label boxes
|
523 |
+
container: null, // container (as jQuery object) to put legend in, null means default on top of graph
|
524 |
+
position: "ne", // position of default legend container within plot
|
525 |
+
margin: 5, // distance from grid edge to default legend container within plot
|
526 |
+
backgroundColor: null, // null means auto-detect
|
527 |
+
backgroundOpacity: 0.85, // set to 0 to avoid background
|
528 |
+
sorted: null // default to no legend sorting
|
529 |
+
},
|
530 |
+
xaxis: {
|
531 |
+
show: null, // null = auto-detect, true = always, false = never
|
532 |
+
position: "bottom", // or "top"
|
533 |
+
mode: null, // null or "time"
|
534 |
+
font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
|
535 |
+
color: null, // base color, labels, ticks
|
536 |
+
tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
|
537 |
+
transform: null, // null or f: number -> number to transform axis
|
538 |
+
inverseTransform: null, // if transform is set, this should be the inverse function
|
539 |
+
min: null, // min. value to show, null means set automatically
|
540 |
+
max: null, // max. value to show, null means set automatically
|
541 |
+
autoscaleMargin: null, // margin in % to add if auto-setting min/max
|
542 |
+
ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
|
543 |
+
tickFormatter: null, // fn: number -> string
|
544 |
+
labelWidth: null, // size of tick labels in pixels
|
545 |
+
labelHeight: null,
|
546 |
+
reserveSpace: null, // whether to reserve space even if axis isn't shown
|
547 |
+
tickLength: null, // size in pixels of ticks, or "full" for whole line
|
548 |
+
alignTicksWithAxis: null, // axis number or null for no sync
|
549 |
+
tickDecimals: null, // no. of decimals, null means auto
|
550 |
+
tickSize: null, // number or [number, "unit"]
|
551 |
+
minTickSize: null // number or [number, "unit"]
|
552 |
+
},
|
553 |
+
yaxis: {
|
554 |
+
autoscaleMargin: 0.02,
|
555 |
+
position: "left" // or "right"
|
556 |
+
},
|
557 |
+
xaxes: [],
|
558 |
+
yaxes: [],
|
559 |
+
series: {
|
560 |
+
points: {
|
561 |
+
show: false,
|
562 |
+
radius: 3,
|
563 |
+
lineWidth: 2, // in pixels
|
564 |
+
fill: true,
|
565 |
+
fillColor: "#ffffff",
|
566 |
+
symbol: "circle" // or callback
|
567 |
+
},
|
568 |
+
lines: {
|
569 |
+
// we don't put in show: false so we can see
|
570 |
+
// whether lines were actively disabled
|
571 |
+
lineWidth: 2, // in pixels
|
572 |
+
fill: false,
|
573 |
+
fillColor: null,
|
574 |
+
steps: false
|
575 |
+
// Omit 'zero', so we can later default its value to
|
576 |
+
// match that of the 'fill' option.
|
577 |
+
},
|
578 |
+
bars: {
|
579 |
+
show: false,
|
580 |
+
lineWidth: 2, // in pixels
|
581 |
+
barWidth: 1, // in units of the x axis
|
582 |
+
fill: true,
|
583 |
+
fillColor: null,
|
584 |
+
align: "left", // "left", "right", or "center"
|
585 |
+
horizontal: false,
|
586 |
+
zero: true
|
587 |
+
},
|
588 |
+
shadowSize: 3,
|
589 |
+
highlightColor: null
|
590 |
+
},
|
591 |
+
grid: {
|
592 |
+
show: true,
|
593 |
+
aboveData: false,
|
594 |
+
color: "#545454", // primary color used for outline and labels
|
595 |
+
backgroundColor: null, // null for transparent, else color
|
596 |
+
borderColor: null, // set if different from the grid color
|
597 |
+
tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
|
598 |
+
margin: 0, // distance from the canvas edge to the grid
|
599 |
+
labelMargin: 5, // in pixels
|
600 |
+
axisMargin: 8, // in pixels
|
601 |
+
borderWidth: 2, // in pixels
|
602 |
+
minBorderMargin: null, // in pixels, null means taken from points radius
|
603 |
+
markings: null, // array of ranges or fn: axes -> array of ranges
|
604 |
+
markingsColor: "#f4f4f4",
|
605 |
+
markingsLineWidth: 2,
|
606 |
+
// interactive stuff
|
607 |
+
clickable: false,
|
608 |
+
hoverable: false,
|
609 |
+
autoHighlight: true, // highlight in case mouse is near
|
610 |
+
mouseActiveRadius: 10 // how far the mouse can be away to activate an item
|
611 |
+
},
|
612 |
+
interaction: {
|
613 |
+
redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
|
614 |
+
},
|
615 |
+
hooks: {}
|
616 |
+
},
|
617 |
+
surface = null, // the canvas for the plot itself
|
618 |
+
overlay = null, // canvas for interactive stuff on top of plot
|
619 |
+
eventHolder = null, // jQuery object that events should be bound to
|
620 |
+
ctx = null, octx = null,
|
621 |
+
xaxes = [], yaxes = [],
|
622 |
+
plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
|
623 |
+
plotWidth = 0, plotHeight = 0,
|
624 |
+
hooks = {
|
625 |
+
processOptions: [],
|
626 |
+
processRawData: [],
|
627 |
+
processDatapoints: [],
|
628 |
+
processOffset: [],
|
629 |
+
drawBackground: [],
|
630 |
+
drawSeries: [],
|
631 |
+
draw: [],
|
632 |
+
bindEvents: [],
|
633 |
+
drawOverlay: [],
|
634 |
+
shutdown: []
|
635 |
+
},
|
636 |
+
plot = this;
|
637 |
+
|
638 |
+
// public functions
|
639 |
+
plot.setData = setData;
|
640 |
+
plot.setupGrid = setupGrid;
|
641 |
+
plot.draw = draw;
|
642 |
+
plot.getPlaceholder = function() { return placeholder; };
|
643 |
+
plot.getCanvas = function() { return surface.element; };
|
644 |
+
plot.getPlotOffset = function() { return plotOffset; };
|
645 |
+
plot.width = function () { return plotWidth; };
|
646 |
+
plot.height = function () { return plotHeight; };
|
647 |
+
plot.offset = function () {
|
648 |
+
var o = eventHolder.offset();
|
649 |
+
o.left += plotOffset.left;
|
650 |
+
o.top += plotOffset.top;
|
651 |
+
return o;
|
652 |
+
};
|
653 |
+
plot.getData = function () { return series; };
|
654 |
+
plot.getAxes = function () {
|
655 |
+
var res = {}, i;
|
656 |
+
$.each(xaxes.concat(yaxes), function (_, axis) {
|
657 |
+
if (axis)
|
658 |
+
res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
|
659 |
+
});
|
660 |
+
return res;
|
661 |
+
};
|
662 |
+
plot.getXAxes = function () { return xaxes; };
|
663 |
+
plot.getYAxes = function () { return yaxes; };
|
664 |
+
plot.c2p = canvasToAxisCoords;
|
665 |
+
plot.p2c = axisToCanvasCoords;
|
666 |
+
plot.getOptions = function () { return options; };
|
667 |
+
plot.highlight = highlight;
|
668 |
+
plot.unhighlight = unhighlight;
|
669 |
+
plot.triggerRedrawOverlay = triggerRedrawOverlay;
|
670 |
+
plot.pointOffset = function(point) {
|
671 |
+
return {
|
672 |
+
left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
|
673 |
+
top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
|
674 |
+
};
|
675 |
+
};
|
676 |
+
plot.shutdown = shutdown;
|
677 |
+
plot.destroy = function () {
|
678 |
+
shutdown();
|
679 |
+
placeholder.removeData("plot").empty();
|
680 |
+
|
681 |
+
series = [];
|
682 |
+
options = null;
|
683 |
+
surface = null;
|
684 |
+
overlay = null;
|
685 |
+
eventHolder = null;
|
686 |
+
ctx = null;
|
687 |
+
octx = null;
|
688 |
+
xaxes = [];
|
689 |
+
yaxes = [];
|
690 |
+
hooks = null;
|
691 |
+
highlights = [];
|
692 |
+
plot = null;
|
693 |
+
};
|
694 |
+
plot.resize = function () {
|
695 |
+
var width = placeholder.width(),
|
696 |
+
height = placeholder.height();
|
697 |
+
surface.resize(width, height);
|
698 |
+
overlay.resize(width, height);
|
699 |
+
};
|
700 |
+
|
701 |
+
// public attributes
|
702 |
+
plot.hooks = hooks;
|
703 |
+
|
704 |
+
// initialize
|
705 |
+
initPlugins(plot);
|
706 |
+
parseOptions(options_);
|
707 |
+
setupCanvases();
|
708 |
+
setData(data_);
|
709 |
+
setupGrid();
|
710 |
+
draw();
|
711 |
+
bindEvents();
|
712 |
+
|
713 |
+
|
714 |
+
function executeHooks(hook, args) {
|
715 |
+
args = [plot].concat(args);
|
716 |
+
for (var i = 0; i < hook.length; ++i)
|
717 |
+
hook[i].apply(this, args);
|
718 |
+
}
|
719 |
+
|
720 |
+
function initPlugins() {
|
721 |
+
|
722 |
+
// References to key classes, allowing plugins to modify them
|
723 |
+
|
724 |
+
var classes = {
|
725 |
+
Canvas: Canvas
|
726 |
+
};
|
727 |
+
|
728 |
+
for (var i = 0; i < plugins.length; ++i) {
|
729 |
+
var p = plugins[i];
|
730 |
+
p.init(plot, classes);
|
731 |
+
if (p.options)
|
732 |
+
$.extend(true, options, p.options);
|
733 |
+
}
|
734 |
+
}
|
735 |
+
|
736 |
+
function parseOptions(opts) {
|
737 |
+
|
738 |
+
$.extend(true, options, opts);
|
739 |
+
|
740 |
+
// $.extend merges arrays, rather than replacing them. When less
|
741 |
+
// colors are provided than the size of the default palette, we
|
742 |
+
// end up with those colors plus the remaining defaults, which is
|
743 |
+
// not expected behavior; avoid it by replacing them here.
|
744 |
+
|
745 |
+
if (opts && opts.colors) {
|
746 |
+
options.colors = opts.colors;
|
747 |
+
}
|
748 |
+
|
749 |
+
if (options.xaxis.color == null)
|
750 |
+
options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
|
751 |
+
if (options.yaxis.color == null)
|
752 |
+
options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
|
753 |
+
|
754 |
+
if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
|
755 |
+
options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
|
756 |
+
if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
|
757 |
+
options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
|
758 |
+
|
759 |
+
if (options.grid.borderColor == null)
|
760 |
+
options.grid.borderColor = options.grid.color;
|
761 |
+
if (options.grid.tickColor == null)
|
762 |
+
options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
|
763 |
+
|
764 |
+
// Fill in defaults for axis options, including any unspecified
|
765 |
+
// font-spec fields, if a font-spec was provided.
|
766 |
+
|
767 |
+
// If no x/y axis options were provided, create one of each anyway,
|
768 |
+
// since the rest of the code assumes that they exist.
|
769 |
+
|
770 |
+
var i, axisOptions, axisCount,
|
771 |
+
fontSize = placeholder.css("font-size"),
|
772 |
+
fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13,
|
773 |
+
fontDefaults = {
|
774 |
+
style: placeholder.css("font-style"),
|
775 |
+
size: Math.round(0.8 * fontSizeDefault),
|
776 |
+
variant: placeholder.css("font-variant"),
|
777 |
+
weight: placeholder.css("font-weight"),
|
778 |
+
family: placeholder.css("font-family")
|
779 |
+
};
|
780 |
+
|
781 |
+
axisCount = options.xaxes.length || 1;
|
782 |
+
for (i = 0; i < axisCount; ++i) {
|
783 |
+
|
784 |
+
axisOptions = options.xaxes[i];
|
785 |
+
if (axisOptions && !axisOptions.tickColor) {
|
786 |
+
axisOptions.tickColor = axisOptions.color;
|
787 |
+
}
|
788 |
+
|
789 |
+
axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
|
790 |
+
options.xaxes[i] = axisOptions;
|
791 |
+
|
792 |
+
if (axisOptions.font) {
|
793 |
+
axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
|
794 |
+
if (!axisOptions.font.color) {
|
795 |
+
axisOptions.font.color = axisOptions.color;
|
796 |
+
}
|
797 |
+
if (!axisOptions.font.lineHeight) {
|
798 |
+
axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
|
799 |
+
}
|
800 |
+
}
|
801 |
+
}
|
802 |
+
|
803 |
+
axisCount = options.yaxes.length || 1;
|
804 |
+
for (i = 0; i < axisCount; ++i) {
|
805 |
+
|
806 |
+
axisOptions = options.yaxes[i];
|
807 |
+
if (axisOptions && !axisOptions.tickColor) {
|
808 |
+
axisOptions.tickColor = axisOptions.color;
|
809 |
+
}
|
810 |
+
|
811 |
+
axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
|
812 |
+
options.yaxes[i] = axisOptions;
|
813 |
+
|
814 |
+
if (axisOptions.font) {
|
815 |
+
axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
|
816 |
+
if (!axisOptions.font.color) {
|
817 |
+
axisOptions.font.color = axisOptions.color;
|
818 |
+
}
|
819 |
+
if (!axisOptions.font.lineHeight) {
|
820 |
+
axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
|
821 |
+
}
|
822 |
+
}
|
823 |
+
}
|
824 |
+
|
825 |
+
// backwards compatibility, to be removed in future
|
826 |
+
if (options.xaxis.noTicks && options.xaxis.ticks == null)
|
827 |
+
options.xaxis.ticks = options.xaxis.noTicks;
|
828 |
+
if (options.yaxis.noTicks && options.yaxis.ticks == null)
|
829 |
+
options.yaxis.ticks = options.yaxis.noTicks;
|
830 |
+
if (options.x2axis) {
|
831 |
+
options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
|
832 |
+
options.xaxes[1].position = "top";
|
833 |
+
// Override the inherit to allow the axis to auto-scale
|
834 |
+
if (options.x2axis.min == null) {
|
835 |
+
options.xaxes[1].min = null;
|
836 |
+
}
|
837 |
+
if (options.x2axis.max == null) {
|
838 |
+
options.xaxes[1].max = null;
|
839 |
+
}
|
840 |
+
}
|
841 |
+
if (options.y2axis) {
|
842 |
+
options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
|
843 |
+
options.yaxes[1].position = "right";
|
844 |
+
// Override the inherit to allow the axis to auto-scale
|
845 |
+
if (options.y2axis.min == null) {
|
846 |
+
options.yaxes[1].min = null;
|
847 |
+
}
|
848 |
+
if (options.y2axis.max == null) {
|
849 |
+
options.yaxes[1].max = null;
|
850 |
+
}
|
851 |
+
}
|
852 |
+
if (options.grid.coloredAreas)
|
853 |
+
options.grid.markings = options.grid.coloredAreas;
|
854 |
+
if (options.grid.coloredAreasColor)
|
855 |
+
options.grid.markingsColor = options.grid.coloredAreasColor;
|
856 |
+
if (options.lines)
|
857 |
+
$.extend(true, options.series.lines, options.lines);
|
858 |
+
if (options.points)
|
859 |
+
$.extend(true, options.series.points, options.points);
|
860 |
+
if (options.bars)
|
861 |
+
$.extend(true, options.series.bars, options.bars);
|
862 |
+
if (options.shadowSize != null)
|
863 |
+
options.series.shadowSize = options.shadowSize;
|
864 |
+
if (options.highlightColor != null)
|
865 |
+
options.series.highlightColor = options.highlightColor;
|
866 |
+
|
867 |
+
// save options on axes for future reference
|
868 |
+
for (i = 0; i < options.xaxes.length; ++i)
|
869 |
+
getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
|
870 |
+
for (i = 0; i < options.yaxes.length; ++i)
|
871 |
+
getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
|
872 |
+
|
873 |
+
// add hooks from options
|
874 |
+
for (var n in hooks)
|
875 |
+
if (options.hooks[n] && options.hooks[n].length)
|
876 |
+
hooks[n] = hooks[n].concat(options.hooks[n]);
|
877 |
+
|
878 |
+
executeHooks(hooks.processOptions, [options]);
|
879 |
+
}
|
880 |
+
|
881 |
+
function setData(d) {
|
882 |
+
series = parseData(d);
|
883 |
+
fillInSeriesOptions();
|
884 |
+
processData();
|
885 |
+
}
|
886 |
+
|
887 |
+
function parseData(d) {
|
888 |
+
var res = [];
|
889 |
+
for (var i = 0; i < d.length; ++i) {
|
890 |
+
var s = $.extend(true, {}, options.series);
|
891 |
+
|
892 |
+
if (d[i].data != null) {
|
893 |
+
s.data = d[i].data; // move the data instead of deep-copy
|
894 |
+
delete d[i].data;
|
895 |
+
|
896 |
+
$.extend(true, s, d[i]);
|
897 |
+
|
898 |
+
d[i].data = s.data;
|
899 |
+
}
|
900 |
+
else
|
901 |
+
s.data = d[i];
|
902 |
+
res.push(s);
|
903 |
+
}
|
904 |
+
|
905 |
+
return res;
|
906 |
+
}
|
907 |
+
|
908 |
+
function axisNumber(obj, coord) {
|
909 |
+
var a = obj[coord + "axis"];
|
910 |
+
if (typeof a == "object") // if we got a real axis, extract number
|
911 |
+
a = a.n;
|
912 |
+
if (typeof a != "number")
|
913 |
+
a = 1; // default to first axis
|
914 |
+
return a;
|
915 |
+
}
|
916 |
+
|
917 |
+
function allAxes() {
|
918 |
+
// return flat array without annoying null entries
|
919 |
+
return $.grep(xaxes.concat(yaxes), function (a) { return a; });
|
920 |
+
}
|
921 |
+
|
922 |
+
function canvasToAxisCoords(pos) {
|
923 |
+
// return an object with x/y corresponding to all used axes
|
924 |
+
var res = {}, i, axis;
|
925 |
+
for (i = 0; i < xaxes.length; ++i) {
|
926 |
+
axis = xaxes[i];
|
927 |
+
if (axis && axis.used)
|
928 |
+
res["x" + axis.n] = axis.c2p(pos.left);
|
929 |
+
}
|
930 |
+
|
931 |
+
for (i = 0; i < yaxes.length; ++i) {
|
932 |
+
axis = yaxes[i];
|
933 |
+
if (axis && axis.used)
|
934 |
+
res["y" + axis.n] = axis.c2p(pos.top);
|
935 |
+
}
|
936 |
+
|
937 |
+
if (res.x1 !== undefined)
|
938 |
+
res.x = res.x1;
|
939 |
+
if (res.y1 !== undefined)
|
940 |
+
res.y = res.y1;
|
941 |
+
|
942 |
+
return res;
|
943 |
+
}
|
944 |
+
|
945 |
+
function axisToCanvasCoords(pos) {
|
946 |
+
// get canvas coords from the first pair of x/y found in pos
|
947 |
+
var res = {}, i, axis, key;
|
948 |
+
|
949 |
+
for (i = 0; i < xaxes.length; ++i) {
|
950 |
+
axis = xaxes[i];
|
951 |
+
if (axis && axis.used) {
|
952 |
+
key = "x" + axis.n;
|
953 |
+
if (pos[key] == null && axis.n == 1)
|
954 |
+
key = "x";
|
955 |
+
|
956 |
+
if (pos[key] != null) {
|
957 |
+
res.left = axis.p2c(pos[key]);
|
958 |
+
break;
|
959 |
+
}
|
960 |
+
}
|
961 |
+
}
|
962 |
+
|
963 |
+
for (i = 0; i < yaxes.length; ++i) {
|
964 |
+
axis = yaxes[i];
|
965 |
+
if (axis && axis.used) {
|
966 |
+
key = "y" + axis.n;
|
967 |
+
if (pos[key] == null && axis.n == 1)
|
968 |
+
key = "y";
|
969 |
+
|
970 |
+
if (pos[key] != null) {
|
971 |
+
res.top = axis.p2c(pos[key]);
|
972 |
+
break;
|
973 |
+
}
|
974 |
+
}
|
975 |
+
}
|
976 |
+
|
977 |
+
return res;
|
978 |
+
}
|
979 |
+
|
980 |
+
function getOrCreateAxis(axes, number) {
|
981 |
+
if (!axes[number - 1])
|
982 |
+
axes[number - 1] = {
|
983 |
+
n: number, // save the number for future reference
|
984 |
+
direction: axes == xaxes ? "x" : "y",
|
985 |
+
options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
|
986 |
+
};
|
987 |
+
|
988 |
+
return axes[number - 1];
|
989 |
+
}
|
990 |
+
|
991 |
+
function fillInSeriesOptions() {
|
992 |
+
|
993 |
+
var neededColors = series.length, maxIndex = -1, i;
|
994 |
+
|
995 |
+
// Subtract the number of series that already have fixed colors or
|
996 |
+
// color indexes from the number that we still need to generate.
|
997 |
+
|
998 |
+
for (i = 0; i < series.length; ++i) {
|
999 |
+
var sc = series[i].color;
|
1000 |
+
if (sc != null) {
|
1001 |
+
neededColors--;
|
1002 |
+
if (typeof sc == "number" && sc > maxIndex) {
|
1003 |
+
maxIndex = sc;
|
1004 |
+
}
|
1005 |
+
}
|
1006 |
+
}
|
1007 |
+
|
1008 |
+
// If any of the series have fixed color indexes, then we need to
|
1009 |
+
// generate at least as many colors as the highest index.
|
1010 |
+
|
1011 |
+
if (neededColors <= maxIndex) {
|
1012 |
+
neededColors = maxIndex + 1;
|
1013 |
+
}
|
1014 |
+
|
1015 |
+
// Generate all the colors, using first the option colors and then
|
1016 |
+
// variations on those colors once they're exhausted.
|
1017 |
+
|
1018 |
+
var c, colors = [], colorPool = options.colors,
|
1019 |
+
colorPoolSize = colorPool.length, variation = 0;
|
1020 |
+
|
1021 |
+
for (i = 0; i < neededColors; i++) {
|
1022 |
+
|
1023 |
+
c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
|
1024 |
+
|
1025 |
+
// Each time we exhaust the colors in the pool we adjust
|
1026 |
+
// a scaling factor used to produce more variations on
|
1027 |
+
// those colors. The factor alternates negative/positive
|
1028 |
+
// to produce lighter/darker colors.
|
1029 |
+
|
1030 |
+
// Reset the variation after every few cycles, or else
|
1031 |
+
// it will end up producing only white or black colors.
|
1032 |
+
|
1033 |
+
if (i % colorPoolSize == 0 && i) {
|
1034 |
+
if (variation >= 0) {
|
1035 |
+
if (variation < 0.5) {
|
1036 |
+
variation = -variation - 0.2;
|
1037 |
+
} else variation = 0;
|
1038 |
+
} else variation = -variation;
|
1039 |
+
}
|
1040 |
+
|
1041 |
+
colors[i] = c.scale('rgb', 1 + variation);
|
1042 |
+
}
|
1043 |
+
|
1044 |
+
// Finalize the series options, filling in their colors
|
1045 |
+
|
1046 |
+
var colori = 0, s;
|
1047 |
+
for (i = 0; i < series.length; ++i) {
|
1048 |
+
s = series[i];
|
1049 |
+
|
1050 |
+
// assign colors
|
1051 |
+
if (s.color == null) {
|
1052 |
+
s.color = colors[colori].toString();
|
1053 |
+
++colori;
|
1054 |
+
}
|
1055 |
+
else if (typeof s.color == "number")
|
1056 |
+
s.color = colors[s.color].toString();
|
1057 |
+
|
1058 |
+
// turn on lines automatically in case nothing is set
|
1059 |
+
if (s.lines.show == null) {
|
1060 |
+
var v, show = true;
|
1061 |
+
for (v in s)
|
1062 |
+
if (s[v] && s[v].show) {
|
1063 |
+
show = false;
|
1064 |
+
break;
|
1065 |
+
}
|
1066 |
+
if (show)
|
1067 |
+
s.lines.show = true;
|
1068 |
+
}
|
1069 |
+
|
1070 |
+
// If nothing was provided for lines.zero, default it to match
|
1071 |
+
// lines.fill, since areas by default should extend to zero.
|
1072 |
+
|
1073 |
+
if (s.lines.zero == null) {
|
1074 |
+
s.lines.zero = !!s.lines.fill;
|
1075 |
+
}
|
1076 |
+
|
1077 |
+
// setup axes
|
1078 |
+
s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
|
1079 |
+
s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
|
1080 |
+
}
|
1081 |
+
}
|
1082 |
+
|
1083 |
+
function processData() {
|
1084 |
+
var topSentry = Number.POSITIVE_INFINITY,
|
1085 |
+
bottomSentry = Number.NEGATIVE_INFINITY,
|
1086 |
+
fakeInfinity = Number.MAX_VALUE,
|
1087 |
+
i, j, k, m, length,
|
1088 |
+
s, points, ps, x, y, axis, val, f, p,
|
1089 |
+
data, format;
|
1090 |
+
|
1091 |
+
function updateAxis(axis, min, max) {
|
1092 |
+
if (min < axis.datamin && min != -fakeInfinity)
|
1093 |
+
axis.datamin = min;
|
1094 |
+
if (max > axis.datamax && max != fakeInfinity)
|
1095 |
+
axis.datamax = max;
|
1096 |
+
}
|
1097 |
+
|
1098 |
+
$.each(allAxes(), function (_, axis) {
|
1099 |
+
// init axis
|
1100 |
+
axis.datamin = topSentry;
|
1101 |
+
axis.datamax = bottomSentry;
|
1102 |
+
axis.used = false;
|
1103 |
+
});
|
1104 |
+
|
1105 |
+
for (i = 0; i < series.length; ++i) {
|
1106 |
+
s = series[i];
|
1107 |
+
s.datapoints = { points: [] };
|
1108 |
+
|
1109 |
+
executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
|
1110 |
+
}
|
1111 |
+
|
1112 |
+
// first pass: clean and copy data
|
1113 |
+
for (i = 0; i < series.length; ++i) {
|
1114 |
+
s = series[i];
|
1115 |
+
|
1116 |
+
data = s.data;
|
1117 |
+
format = s.datapoints.format;
|
1118 |
+
|
1119 |
+
if (!format) {
|
1120 |
+
format = [];
|
1121 |
+
// find out how to copy
|
1122 |
+
format.push({ x: true, number: true, required: true });
|
1123 |
+
format.push({ y: true, number: true, required: true });
|
1124 |
+
|
1125 |
+
if (s.bars.show || (s.lines.show && s.lines.fill)) {
|
1126 |
+
var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
|
1127 |
+
format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
|
1128 |
+
if (s.bars.horizontal) {
|
1129 |
+
delete format[format.length - 1].y;
|
1130 |
+
format[format.length - 1].x = true;
|
1131 |
+
}
|
1132 |
+
}
|
1133 |
+
|
1134 |
+
s.datapoints.format = format;
|
1135 |
+
}
|
1136 |
+
|
1137 |
+
if (s.datapoints.pointsize != null)
|
1138 |
+
continue; // already filled in
|
1139 |
+
|
1140 |
+
s.datapoints.pointsize = format.length;
|
1141 |
+
|
1142 |
+
ps = s.datapoints.pointsize;
|
1143 |
+
points = s.datapoints.points;
|
1144 |
+
|
1145 |
+
var insertSteps = s.lines.show && s.lines.steps;
|
1146 |
+
s.xaxis.used = s.yaxis.used = true;
|
1147 |
+
|
1148 |
+
for (j = k = 0; j < data.length; ++j, k += ps) {
|
1149 |
+
p = data[j];
|
1150 |
+
|
1151 |
+
var nullify = p == null;
|
1152 |
+
if (!nullify) {
|
1153 |
+
for (m = 0; m < ps; ++m) {
|
1154 |
+
val = p[m];
|
1155 |
+
f = format[m];
|
1156 |
+
|
1157 |
+
if (f) {
|
1158 |
+
if (f.number && val != null) {
|
1159 |
+
val = +val; // convert to number
|
1160 |
+
if (isNaN(val))
|
1161 |
+
val = null;
|
1162 |
+
else if (val == Infinity)
|
1163 |
+
val = fakeInfinity;
|
1164 |
+
else if (val == -Infinity)
|
1165 |
+
val = -fakeInfinity;
|
1166 |
+
}
|
1167 |
+
|
1168 |
+
if (val == null) {
|
1169 |
+
if (f.required)
|
1170 |
+
nullify = true;
|
1171 |
+
|
1172 |
+
if (f.defaultValue != null)
|
1173 |
+
val = f.defaultValue;
|
1174 |
+
}
|
1175 |
+
}
|
1176 |
+
|
1177 |
+
points[k + m] = val;
|
1178 |
+
}
|
1179 |
+
}
|
1180 |
+
|
1181 |
+
if (nullify) {
|
1182 |
+
for (m = 0; m < ps; ++m) {
|
1183 |
+
val = points[k + m];
|
1184 |
+
if (val != null) {
|
1185 |
+
f = format[m];
|
1186 |
+
// extract min/max info
|
1187 |
+
if (f.autoscale !== false) {
|
1188 |
+
if (f.x) {
|
1189 |
+
updateAxis(s.xaxis, val, val);
|
1190 |
+
}
|
1191 |
+
if (f.y) {
|
1192 |
+
updateAxis(s.yaxis, val, val);
|
1193 |
+
}
|
1194 |
+
}
|
1195 |
+
}
|
1196 |
+
points[k + m] = null;
|
1197 |
+
}
|
1198 |
+
}
|
1199 |
+
else {
|
1200 |
+
// a little bit of line specific stuff that
|
1201 |
+
// perhaps shouldn't be here, but lacking
|
1202 |
+
// better means...
|
1203 |
+
if (insertSteps && k > 0
|
1204 |
+
&& points[k - ps] != null
|
1205 |
+
&& points[k - ps] != points[k]
|
1206 |
+
&& points[k - ps + 1] != points[k + 1]) {
|
1207 |
+
// copy the point to make room for a middle point
|
1208 |
+
for (m = 0; m < ps; ++m)
|
1209 |
+
points[k + ps + m] = points[k + m];
|
1210 |
+
|
1211 |
+
// middle point has same y
|
1212 |
+
points[k + 1] = points[k - ps + 1];
|
1213 |
+
|
1214 |
+
// we've added a point, better reflect that
|
1215 |
+
k += ps;
|
1216 |
+
}
|
1217 |
+
}
|
1218 |
+
}
|
1219 |
+
}
|
1220 |
+
|
1221 |
+
// give the hooks a chance to run
|
1222 |
+
for (i = 0; i < series.length; ++i) {
|
1223 |
+
s = series[i];
|
1224 |
+
|
1225 |
+
executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
|
1226 |
+
}
|
1227 |
+
|
1228 |
+
// second pass: find datamax/datamin for auto-scaling
|
1229 |
+
for (i = 0; i < series.length; ++i) {
|
1230 |
+
s = series[i];
|
1231 |
+
points = s.datapoints.points;
|
1232 |
+
ps = s.datapoints.pointsize;
|
1233 |
+
format = s.datapoints.format;
|
1234 |
+
|
1235 |
+
var xmin = topSentry, ymin = topSentry,
|
1236 |
+
xmax = bottomSentry, ymax = bottomSentry;
|
1237 |
+
|
1238 |
+
for (j = 0; j < points.length; j += ps) {
|
1239 |
+
if (points[j] == null)
|
1240 |
+
continue;
|
1241 |
+
|
1242 |
+
for (m = 0; m < ps; ++m) {
|
1243 |
+
val = points[j + m];
|
1244 |
+
f = format[m];
|
1245 |
+
if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
|
1246 |
+
continue;
|
1247 |
+
|
1248 |
+
if (f.x) {
|
1249 |
+
if (val < xmin)
|
1250 |
+
xmin = val;
|
1251 |
+
if (val > xmax)
|
1252 |
+
xmax = val;
|
1253 |
+
}
|
1254 |
+
if (f.y) {
|
1255 |
+
if (val < ymin)
|
1256 |
+
ymin = val;
|
1257 |
+
if (val > ymax)
|
1258 |
+
ymax = val;
|
1259 |
+
}
|
1260 |
+
}
|
1261 |
+
}
|
1262 |
+
|
1263 |
+
if (s.bars.show) {
|
1264 |
+
// make sure we got room for the bar on the dancing floor
|
1265 |
+
var delta;
|
1266 |
+
|
1267 |
+
switch (s.bars.align) {
|
1268 |
+
case "left":
|
1269 |
+
delta = 0;
|
1270 |
+
break;
|
1271 |
+
case "right":
|
1272 |
+
delta = -s.bars.barWidth;
|
1273 |
+
break;
|
1274 |
+
default:
|
1275 |
+
delta = -s.bars.barWidth / 2;
|
1276 |
+
}
|
1277 |
+
|
1278 |
+
if (s.bars.horizontal) {
|
1279 |
+
ymin += delta;
|
1280 |
+
ymax += delta + s.bars.barWidth;
|
1281 |
+
}
|
1282 |
+
else {
|
1283 |
+
xmin += delta;
|
1284 |
+
xmax += delta + s.bars.barWidth;
|
1285 |
+
}
|
1286 |
+
}
|
1287 |
+
|
1288 |
+
updateAxis(s.xaxis, xmin, xmax);
|
1289 |
+
updateAxis(s.yaxis, ymin, ymax);
|
1290 |
+
}
|
1291 |
+
|
1292 |
+
$.each(allAxes(), function (_, axis) {
|
1293 |
+
if (axis.datamin == topSentry)
|
1294 |
+
axis.datamin = null;
|
1295 |
+
if (axis.datamax == bottomSentry)
|
1296 |
+
axis.datamax = null;
|
1297 |
+
});
|
1298 |
+
}
|
1299 |
+
|
1300 |
+
function setupCanvases() {
|
1301 |
+
|
1302 |
+
// Make sure the placeholder is clear of everything except canvases
|
1303 |
+
// from a previous plot in this container that we'll try to re-use.
|
1304 |
+
|
1305 |
+
placeholder.css("padding", 0) // padding messes up the positioning
|
1306 |
+
.children().filter(function(){
|
1307 |
+
return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
|
1308 |
+
}).remove();
|
1309 |
+
|
1310 |
+
if (placeholder.css("position") == 'static')
|
1311 |
+
placeholder.css("position", "relative"); // for positioning labels and overlay
|
1312 |
+
|
1313 |
+
surface = new Canvas("flot-base", placeholder);
|
1314 |
+
overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
|
1315 |
+
|
1316 |
+
ctx = surface.context;
|
1317 |
+
octx = overlay.context;
|
1318 |
+
|
1319 |
+
// define which element we're listening for events on
|
1320 |
+
eventHolder = $(overlay.element).unbind();
|
1321 |
+
|
1322 |
+
// If we're re-using a plot object, shut down the old one
|
1323 |
+
|
1324 |
+
var existing = placeholder.data("plot");
|
1325 |
+
|
1326 |
+
if (existing) {
|
1327 |
+
existing.shutdown();
|
1328 |
+
overlay.clear();
|
1329 |
+
}
|
1330 |
+
|
1331 |
+
// save in case we get replotted
|
1332 |
+
placeholder.data("plot", plot);
|
1333 |
+
}
|
1334 |
+
|
1335 |
+
function bindEvents() {
|
1336 |
+
// bind events
|
1337 |
+
if (options.grid.hoverable) {
|
1338 |
+
eventHolder.mousemove(onMouseMove);
|
1339 |
+
|
1340 |
+
// Use bind, rather than .mouseleave, because we officially
|
1341 |
+
// still support jQuery 1.2.6, which doesn't define a shortcut
|
1342 |
+
// for mouseenter or mouseleave. This was a bug/oversight that
|
1343 |
+
// was fixed somewhere around 1.3.x. We can return to using
|
1344 |
+
// .mouseleave when we drop support for 1.2.6.
|
1345 |
+
|
1346 |
+
eventHolder.bind("mouseleave", onMouseLeave);
|
1347 |
+
}
|
1348 |
+
|
1349 |
+
if (options.grid.clickable)
|
1350 |
+
eventHolder.click(onClick);
|
1351 |
+
|
1352 |
+
executeHooks(hooks.bindEvents, [eventHolder]);
|
1353 |
+
}
|
1354 |
+
|
1355 |
+
function shutdown() {
|
1356 |
+
if (redrawTimeout)
|
1357 |
+
clearTimeout(redrawTimeout);
|
1358 |
+
|
1359 |
+
eventHolder.unbind("mousemove", onMouseMove);
|
1360 |
+
eventHolder.unbind("mouseleave", onMouseLeave);
|
1361 |
+
eventHolder.unbind("click", onClick);
|
1362 |
+
|
1363 |
+
executeHooks(hooks.shutdown, [eventHolder]);
|
1364 |
+
}
|
1365 |
+
|
1366 |
+
function setTransformationHelpers(axis) {
|
1367 |
+
// set helper functions on the axis, assumes plot area
|
1368 |
+
// has been computed already
|
1369 |
+
|
1370 |
+
function identity(x) { return x; }
|
1371 |
+
|
1372 |
+
var s, m, t = axis.options.transform || identity,
|
1373 |
+
it = axis.options.inverseTransform;
|
1374 |
+
|
1375 |
+
// precompute how much the axis is scaling a point
|
1376 |
+
// in canvas space
|
1377 |
+
if (axis.direction == "x") {
|
1378 |
+
s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
|
1379 |
+
m = Math.min(t(axis.max), t(axis.min));
|
1380 |
+
}
|
1381 |
+
else {
|
1382 |
+
s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
|
1383 |
+
s = -s;
|
1384 |
+
m = Math.max(t(axis.max), t(axis.min));
|
1385 |
+
}
|
1386 |
+
|
1387 |
+
// data point to canvas coordinate
|
1388 |
+
if (t == identity) // slight optimization
|
1389 |
+
axis.p2c = function (p) { return (p - m) * s; };
|
1390 |
+
else
|
1391 |
+
axis.p2c = function (p) { return (t(p) - m) * s; };
|
1392 |
+
// canvas coordinate to data point
|
1393 |
+
if (!it)
|
1394 |
+
axis.c2p = function (c) { return m + c / s; };
|
1395 |
+
else
|
1396 |
+
axis.c2p = function (c) { return it(m + c / s); };
|
1397 |
+
}
|
1398 |
+
|
1399 |
+
function measureTickLabels(axis) {
|
1400 |
+
|
1401 |
+
var opts = axis.options,
|
1402 |
+
ticks = axis.ticks || [],
|
1403 |
+
labelWidth = opts.labelWidth || 0,
|
1404 |
+
labelHeight = opts.labelHeight || 0,
|
1405 |
+
maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null),
|
1406 |
+
legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
|
1407 |
+
layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
|
1408 |
+
font = opts.font || "flot-tick-label tickLabel";
|
1409 |
+
|
1410 |
+
for (var i = 0; i < ticks.length; ++i) {
|
1411 |
+
|
1412 |
+
var t = ticks[i];
|
1413 |
+
|
1414 |
+
if (!t.label)
|
1415 |
+
continue;
|
1416 |
+
|
1417 |
+
var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
|
1418 |
+
|
1419 |
+
labelWidth = Math.max(labelWidth, info.width);
|
1420 |
+
labelHeight = Math.max(labelHeight, info.height);
|
1421 |
+
}
|
1422 |
+
|
1423 |
+
axis.labelWidth = opts.labelWidth || labelWidth;
|
1424 |
+
axis.labelHeight = opts.labelHeight || labelHeight;
|
1425 |
+
}
|
1426 |
+
|
1427 |
+
function allocateAxisBoxFirstPhase(axis) {
|
1428 |
+
// find the bounding box of the axis by looking at label
|
1429 |
+
// widths/heights and ticks, make room by diminishing the
|
1430 |
+
// plotOffset; this first phase only looks at one
|
1431 |
+
// dimension per axis, the other dimension depends on the
|
1432 |
+
// other axes so will have to wait
|
1433 |
+
|
1434 |
+
var lw = axis.labelWidth,
|
1435 |
+
lh = axis.labelHeight,
|
1436 |
+
pos = axis.options.position,
|
1437 |
+
isXAxis = axis.direction === "x",
|
1438 |
+
tickLength = axis.options.tickLength,
|
1439 |
+
axisMargin = options.grid.axisMargin,
|
1440 |
+
padding = options.grid.labelMargin,
|
1441 |
+
innermost = true,
|
1442 |
+
outermost = true,
|
1443 |
+
first = true,
|
1444 |
+
found = false;
|
1445 |
+
|
1446 |
+
// Determine the axis's position in its direction and on its side
|
1447 |
+
|
1448 |
+
$.each(isXAxis ? xaxes : yaxes, function(i, a) {
|
1449 |
+
if (a && (a.show || a.reserveSpace)) {
|
1450 |
+
if (a === axis) {
|
1451 |
+
found = true;
|
1452 |
+
} else if (a.options.position === pos) {
|
1453 |
+
if (found) {
|
1454 |
+
outermost = false;
|
1455 |
+
} else {
|
1456 |
+
innermost = false;
|
1457 |
+
}
|
1458 |
+
}
|
1459 |
+
if (!found) {
|
1460 |
+
first = false;
|
1461 |
+
}
|
1462 |
+
}
|
1463 |
+
});
|
1464 |
+
|
1465 |
+
// The outermost axis on each side has no margin
|
1466 |
+
|
1467 |
+
if (outermost) {
|
1468 |
+
axisMargin = 0;
|
1469 |
+
}
|
1470 |
+
|
1471 |
+
// The ticks for the first axis in each direction stretch across
|
1472 |
+
|
1473 |
+
if (tickLength == null) {
|
1474 |
+
tickLength = first ? "full" : 5;
|
1475 |
+
}
|
1476 |
+
|
1477 |
+
if (!isNaN(+tickLength))
|
1478 |
+
padding += +tickLength;
|
1479 |
+
|
1480 |
+
if (isXAxis) {
|
1481 |
+
lh += padding;
|
1482 |
+
|
1483 |
+
if (pos == "bottom") {
|
1484 |
+
plotOffset.bottom += lh + axisMargin;
|
1485 |
+
axis.box = { top: surface.height - plotOffset.bottom, height: lh };
|
1486 |
+
}
|
1487 |
+
else {
|
1488 |
+
axis.box = { top: plotOffset.top + axisMargin, height: lh };
|
1489 |
+
plotOffset.top += lh + axisMargin;
|
1490 |
+
}
|
1491 |
+
}
|
1492 |
+
else {
|
1493 |
+
lw += padding;
|
1494 |
+
|
1495 |
+
if (pos == "left") {
|
1496 |
+
axis.box = { left: plotOffset.left + axisMargin, width: lw };
|
1497 |
+
plotOffset.left += lw + axisMargin;
|
1498 |
+
}
|
1499 |
+
else {
|
1500 |
+
plotOffset.right += lw + axisMargin;
|
1501 |
+
axis.box = { left: surface.width - plotOffset.right, width: lw };
|
1502 |
+
}
|
1503 |
+
}
|
1504 |
+
|
1505 |
+
// save for future reference
|
1506 |
+
axis.position = pos;
|
1507 |
+
axis.tickLength = tickLength;
|
1508 |
+
axis.box.padding = padding;
|
1509 |
+
axis.innermost = innermost;
|
1510 |
+
}
|
1511 |
+
|
1512 |
+
function allocateAxisBoxSecondPhase(axis) {
|
1513 |
+
// now that all axis boxes have been placed in one
|
1514 |
+
// dimension, we can set the remaining dimension coordinates
|
1515 |
+
if (axis.direction == "x") {
|
1516 |
+
axis.box.left = plotOffset.left - axis.labelWidth / 2;
|
1517 |
+
axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
|
1518 |
+
}
|
1519 |
+
else {
|
1520 |
+
axis.box.top = plotOffset.top - axis.labelHeight / 2;
|
1521 |
+
axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
|
1522 |
+
}
|
1523 |
+
}
|
1524 |
+
|
1525 |
+
function adjustLayoutForThingsStickingOut() {
|
1526 |
+
// possibly adjust plot offset to ensure everything stays
|
1527 |
+
// inside the canvas and isn't clipped off
|
1528 |
+
|
1529 |
+
var minMargin = options.grid.minBorderMargin,
|
1530 |
+
axis, i;
|
1531 |
+
|
1532 |
+
// check stuff from the plot (FIXME: this should just read
|
1533 |
+
// a value from the series, otherwise it's impossible to
|
1534 |
+
// customize)
|
1535 |
+
if (minMargin == null) {
|
1536 |
+
minMargin = 0;
|
1537 |
+
for (i = 0; i < series.length; ++i)
|
1538 |
+
minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
|
1539 |
+
}
|
1540 |
+
|
1541 |
+
var margins = {
|
1542 |
+
left: minMargin,
|
1543 |
+
right: minMargin,
|
1544 |
+
top: minMargin,
|
1545 |
+
bottom: minMargin
|
1546 |
+
};
|
1547 |
+
|
1548 |
+
// check axis labels, note we don't check the actual
|
1549 |
+
// labels but instead use the overall width/height to not
|
1550 |
+
// jump as much around with replots
|
1551 |
+
$.each(allAxes(), function (_, axis) {
|
1552 |
+
if (axis.reserveSpace && axis.ticks && axis.ticks.length) {
|
1553 |
+
if (axis.direction === "x") {
|
1554 |
+
margins.left = Math.max(margins.left, axis.labelWidth / 2);
|
1555 |
+
margins.right = Math.max(margins.right, axis.labelWidth / 2);
|
1556 |
+
} else {
|
1557 |
+
margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);
|
1558 |
+
margins.top = Math.max(margins.top, axis.labelHeight / 2);
|
1559 |
+
}
|
1560 |
+
}
|
1561 |
+
});
|
1562 |
+
|
1563 |
+
plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));
|
1564 |
+
plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));
|
1565 |
+
plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));
|
1566 |
+
plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));
|
1567 |
+
}
|
1568 |
+
|
1569 |
+
function setupGrid() {
|
1570 |
+
var i, axes = allAxes(), showGrid = options.grid.show;
|
1571 |
+
|
1572 |
+
// Initialize the plot's offset from the edge of the canvas
|
1573 |
+
|
1574 |
+
for (var a in plotOffset) {
|
1575 |
+
var margin = options.grid.margin || 0;
|
1576 |
+
plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
|
1577 |
+
}
|
1578 |
+
|
1579 |
+
executeHooks(hooks.processOffset, [plotOffset]);
|
1580 |
+
|
1581 |
+
// If the grid is visible, add its border width to the offset
|
1582 |
+
|
1583 |
+
for (var a in plotOffset) {
|
1584 |
+
if(typeof(options.grid.borderWidth) == "object") {
|
1585 |
+
plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
|
1586 |
+
}
|
1587 |
+
else {
|
1588 |
+
plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
|
1589 |
+
}
|
1590 |
+
}
|
1591 |
+
|
1592 |
+
$.each(axes, function (_, axis) {
|
1593 |
+
var axisOpts = axis.options;
|
1594 |
+
axis.show = axisOpts.show == null ? axis.used : axisOpts.show;
|
1595 |
+
axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;
|
1596 |
+
setRange(axis);
|
1597 |
+
});
|
1598 |
+
|
1599 |
+
if (showGrid) {
|
1600 |
+
|
1601 |
+
var allocatedAxes = $.grep(axes, function (axis) {
|
1602 |
+
return axis.show || axis.reserveSpace;
|
1603 |
+
});
|
1604 |
+
|
1605 |
+
$.each(allocatedAxes, function (_, axis) {
|
1606 |
+
// make the ticks
|
1607 |
+
setupTickGeneration(axis);
|
1608 |
+
setTicks(axis);
|
1609 |
+
snapRangeToTicks(axis, axis.ticks);
|
1610 |
+
// find labelWidth/Height for axis
|
1611 |
+
measureTickLabels(axis);
|
1612 |
+
});
|
1613 |
+
|
1614 |
+
// with all dimensions calculated, we can compute the
|
1615 |
+
// axis bounding boxes, start from the outside
|
1616 |
+
// (reverse order)
|
1617 |
+
for (i = allocatedAxes.length - 1; i >= 0; --i)
|
1618 |
+
allocateAxisBoxFirstPhase(allocatedAxes[i]);
|
1619 |
+
|
1620 |
+
// make sure we've got enough space for things that
|
1621 |
+
// might stick out
|
1622 |
+
adjustLayoutForThingsStickingOut();
|
1623 |
+
|
1624 |
+
$.each(allocatedAxes, function (_, axis) {
|
1625 |
+
allocateAxisBoxSecondPhase(axis);
|
1626 |
+
});
|
1627 |
+
}
|
1628 |
+
|
1629 |
+
plotWidth = surface.width - plotOffset.left - plotOffset.right;
|
1630 |
+
plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
|
1631 |
+
|
1632 |
+
// now we got the proper plot dimensions, we can compute the scaling
|
1633 |
+
$.each(axes, function (_, axis) {
|
1634 |
+
setTransformationHelpers(axis);
|
1635 |
+
});
|
1636 |
+
|
1637 |
+
if (showGrid) {
|
1638 |
+
drawAxisLabels();
|
1639 |
+
}
|
1640 |
+
|
1641 |
+
insertLegend();
|
1642 |
+
}
|
1643 |
+
|
1644 |
+
function setRange(axis) {
|
1645 |
+
var opts = axis.options,
|
1646 |
+
min = +(opts.min != null ? opts.min : axis.datamin),
|
1647 |
+
max = +(opts.max != null ? opts.max : axis.datamax),
|
1648 |
+
delta = max - min;
|
1649 |
+
|
1650 |
+
if (delta == 0.0) {
|
1651 |
+
// degenerate case
|
1652 |
+
var widen = max == 0 ? 1 : 0.01;
|
1653 |
+
|
1654 |
+
if (opts.min == null)
|
1655 |
+
min -= widen;
|
1656 |
+
// always widen max if we couldn't widen min to ensure we
|
1657 |
+
// don't fall into min == max which doesn't work
|
1658 |
+
if (opts.max == null || opts.min != null)
|
1659 |
+
max += widen;
|
1660 |
+
}
|
1661 |
+
else {
|
1662 |
+
// consider autoscaling
|
1663 |
+
var margin = opts.autoscaleMargin;
|
1664 |
+
if (margin != null) {
|
1665 |
+
if (opts.min == null) {
|
1666 |
+
min -= delta * margin;
|
1667 |
+
// make sure we don't go below zero if all values
|
1668 |
+
// are positive
|
1669 |
+
if (min < 0 && axis.datamin != null && axis.datamin >= 0)
|
1670 |
+
min = 0;
|
1671 |
+
}
|
1672 |
+
if (opts.max == null) {
|
1673 |
+
max += delta * margin;
|
1674 |
+
if (max > 0 && axis.datamax != null && axis.datamax <= 0)
|
1675 |
+
max = 0;
|
1676 |
+
}
|
1677 |
+
}
|
1678 |
+
}
|
1679 |
+
axis.min = min;
|
1680 |
+
axis.max = max;
|
1681 |
+
}
|
1682 |
+
|
1683 |
+
function setupTickGeneration(axis) {
|
1684 |
+
var opts = axis.options;
|
1685 |
+
|
1686 |
+
// estimate number of ticks
|
1687 |
+
var noTicks;
|
1688 |
+
if (typeof opts.ticks == "number" && opts.ticks > 0)
|
1689 |
+
noTicks = opts.ticks;
|
1690 |
+
else
|
1691 |
+
// heuristic based on the model a*sqrt(x) fitted to
|
1692 |
+
// some data points that seemed reasonable
|
1693 |
+
noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
|
1694 |
+
|
1695 |
+
var delta = (axis.max - axis.min) / noTicks,
|
1696 |
+
dec = -Math.floor(Math.log(delta) / Math.LN10),
|
1697 |
+
maxDec = opts.tickDecimals;
|
1698 |
+
|
1699 |
+
if (maxDec != null && dec > maxDec) {
|
1700 |
+
dec = maxDec;
|
1701 |
+
}
|
1702 |
+
|
1703 |
+
var magn = Math.pow(10, -dec),
|
1704 |
+
norm = delta / magn, // norm is between 1.0 and 10.0
|
1705 |
+
size;
|
1706 |
+
|
1707 |
+
if (norm < 1.5) {
|
1708 |
+
size = 1;
|
1709 |
+
} else if (norm < 3) {
|
1710 |
+
size = 2;
|
1711 |
+
// special case for 2.5, requires an extra decimal
|
1712 |
+
if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
|
1713 |
+
size = 2.5;
|
1714 |
+
++dec;
|
1715 |
+
}
|
1716 |
+
} else if (norm < 7.5) {
|
1717 |
+
size = 5;
|
1718 |
+
} else {
|
1719 |
+
size = 10;
|
1720 |
+
}
|
1721 |
+
|
1722 |
+
size *= magn;
|
1723 |
+
|
1724 |
+
if (opts.minTickSize != null && size < opts.minTickSize) {
|
1725 |
+
size = opts.minTickSize;
|
1726 |
+
}
|
1727 |
+
|
1728 |
+
axis.delta = delta;
|
1729 |
+
axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
|
1730 |
+
axis.tickSize = opts.tickSize || size;
|
1731 |
+
|
1732 |
+
// Time mode was moved to a plug-in in 0.8, and since so many people use it
|
1733 |
+
// we'll add an especially friendly reminder to make sure they included it.
|
1734 |
+
|
1735 |
+
if (opts.mode == "time" && !axis.tickGenerator) {
|
1736 |
+
throw new Error("Time mode requires the flot.time plugin.");
|
1737 |
+
}
|
1738 |
+
|
1739 |
+
// Flot supports base-10 axes; any other mode else is handled by a plug-in,
|
1740 |
+
// like flot.time.js.
|
1741 |
+
|
1742 |
+
if (!axis.tickGenerator) {
|
1743 |
+
|
1744 |
+
axis.tickGenerator = function (axis) {
|
1745 |
+
|
1746 |
+
var ticks = [],
|
1747 |
+
start = floorInBase(axis.min, axis.tickSize),
|
1748 |
+
i = 0,
|
1749 |
+
v = Number.NaN,
|
1750 |
+
prev;
|
1751 |
+
|
1752 |
+
do {
|
1753 |
+
prev = v;
|
1754 |
+
v = start + i * axis.tickSize;
|
1755 |
+
ticks.push(v);
|
1756 |
+
++i;
|
1757 |
+
} while (v < axis.max && v != prev);
|
1758 |
+
return ticks;
|
1759 |
+
};
|
1760 |
+
|
1761 |
+
axis.tickFormatter = function (value, axis) {
|
1762 |
+
|
1763 |
+
var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
|
1764 |
+
var formatted = "" + Math.round(value * factor) / factor;
|
1765 |
+
|
1766 |
+
// If tickDecimals was specified, ensure that we have exactly that
|
1767 |
+
// much precision; otherwise default to the value's own precision.
|
1768 |
+
|
1769 |
+
if (axis.tickDecimals != null) {
|
1770 |
+
var decimal = formatted.indexOf(".");
|
1771 |
+
var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
|
1772 |
+
if (precision < axis.tickDecimals) {
|
1773 |
+
return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
|
1774 |
+
}
|
1775 |
+
}
|
1776 |
+
|
1777 |
+
return formatted;
|
1778 |
+
};
|
1779 |
+
}
|
1780 |
+
|
1781 |
+
if ($.isFunction(opts.tickFormatter))
|
1782 |
+
axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
|
1783 |
+
|
1784 |
+
if (opts.alignTicksWithAxis != null) {
|
1785 |
+
var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
|
1786 |
+
if (otherAxis && otherAxis.used && otherAxis != axis) {
|
1787 |
+
// consider snapping min/max to outermost nice ticks
|
1788 |
+
var niceTicks = axis.tickGenerator(axis);
|
1789 |
+
if (niceTicks.length > 0) {
|
1790 |
+
if (opts.min == null)
|
1791 |
+
axis.min = Math.min(axis.min, niceTicks[0]);
|
1792 |
+
if (opts.max == null && niceTicks.length > 1)
|
1793 |
+
axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
|
1794 |
+
}
|
1795 |
+
|
1796 |
+
axis.tickGenerator = function (axis) {
|
1797 |
+
// copy ticks, scaled to this axis
|
1798 |
+
var ticks = [], v, i;
|
1799 |
+
for (i = 0; i < otherAxis.ticks.length; ++i) {
|
1800 |
+
v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
|
1801 |
+
v = axis.min + v * (axis.max - axis.min);
|
1802 |
+
ticks.push(v);
|
1803 |
+
}
|
1804 |
+
return ticks;
|
1805 |
+
};
|
1806 |
+
|
1807 |
+
// we might need an extra decimal since forced
|
1808 |
+
// ticks don't necessarily fit naturally
|
1809 |
+
if (!axis.mode && opts.tickDecimals == null) {
|
1810 |
+
var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
|
1811 |
+
ts = axis.tickGenerator(axis);
|
1812 |
+
|
1813 |
+
// only proceed if the tick interval rounded
|
1814 |
+
// with an extra decimal doesn't give us a
|
1815 |
+
// zero at end
|
1816 |
+
if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
|
1817 |
+
axis.tickDecimals = extraDec;
|
1818 |
+
}
|
1819 |
+
}
|
1820 |
+
}
|
1821 |
+
}
|
1822 |
+
|
1823 |
+
function setTicks(axis) {
|
1824 |
+
var oticks = axis.options.ticks, ticks = [];
|
1825 |
+
if (oticks == null || (typeof oticks == "number" && oticks > 0))
|
1826 |
+
ticks = axis.tickGenerator(axis);
|
1827 |
+
else if (oticks) {
|
1828 |
+
if ($.isFunction(oticks))
|
1829 |
+
// generate the ticks
|
1830 |
+
ticks = oticks(axis);
|
1831 |
+
else
|
1832 |
+
ticks = oticks;
|
1833 |
+
}
|
1834 |
+
|
1835 |
+
// clean up/labelify the supplied ticks, copy them over
|
1836 |
+
var i, v;
|
1837 |
+
axis.ticks = [];
|
1838 |
+
for (i = 0; i < ticks.length; ++i) {
|
1839 |
+
var label = null;
|
1840 |
+
var t = ticks[i];
|
1841 |
+
if (typeof t == "object") {
|
1842 |
+
v = +t[0];
|
1843 |
+
if (t.length > 1)
|
1844 |
+
label = t[1];
|
1845 |
+
}
|
1846 |
+
else
|
1847 |
+
v = +t;
|
1848 |
+
if (label == null)
|
1849 |
+
label = axis.tickFormatter(v, axis);
|
1850 |
+
if (!isNaN(v))
|
1851 |
+
axis.ticks.push({ v: v, label: label });
|
1852 |
+
}
|
1853 |
+
}
|
1854 |
+
|
1855 |
+
function snapRangeToTicks(axis, ticks) {
|
1856 |
+
if (axis.options.autoscaleMargin && ticks.length > 0) {
|
1857 |
+
// snap to ticks
|
1858 |
+
if (axis.options.min == null)
|
1859 |
+
axis.min = Math.min(axis.min, ticks[0].v);
|
1860 |
+
if (axis.options.max == null && ticks.length > 1)
|
1861 |
+
axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
|
1862 |
+
}
|
1863 |
+
}
|
1864 |
+
|
1865 |
+
function draw() {
|
1866 |
+
|
1867 |
+
surface.clear();
|
1868 |
+
|
1869 |
+
executeHooks(hooks.drawBackground, [ctx]);
|
1870 |
+
|
1871 |
+
var grid = options.grid;
|
1872 |
+
|
1873 |
+
// draw background, if any
|
1874 |
+
if (grid.show && grid.backgroundColor)
|
1875 |
+
drawBackground();
|
1876 |
+
|
1877 |
+
if (grid.show && !grid.aboveData) {
|
1878 |
+
drawGrid();
|
1879 |
+
}
|
1880 |
+
|
1881 |
+
for (var i = 0; i < series.length; ++i) {
|
1882 |
+
executeHooks(hooks.drawSeries, [ctx, series[i]]);
|
1883 |
+
drawSeries(series[i]);
|
1884 |
+
}
|
1885 |
+
|
1886 |
+
executeHooks(hooks.draw, [ctx]);
|
1887 |
+
|
1888 |
+
if (grid.show && grid.aboveData) {
|
1889 |
+
drawGrid();
|
1890 |
+
}
|
1891 |
+
|
1892 |
+
surface.render();
|
1893 |
+
|
1894 |
+
// A draw implies that either the axes or data have changed, so we
|
1895 |
+
// should probably update the overlay highlights as well.
|
1896 |
+
|
1897 |
+
triggerRedrawOverlay();
|
1898 |
+
}
|
1899 |
+
|
1900 |
+
function extractRange(ranges, coord) {
|
1901 |
+
var axis, from, to, key, axes = allAxes();
|
1902 |
+
|
1903 |
+
for (var i = 0; i < axes.length; ++i) {
|
1904 |
+
axis = axes[i];
|
1905 |
+
if (axis.direction == coord) {
|
1906 |
+
key = coord + axis.n + "axis";
|
1907 |
+
if (!ranges[key] && axis.n == 1)
|
1908 |
+
key = coord + "axis"; // support x1axis as xaxis
|
1909 |
+
if (ranges[key]) {
|
1910 |
+
from = ranges[key].from;
|
1911 |
+
to = ranges[key].to;
|
1912 |
+
break;
|
1913 |
+
}
|
1914 |
+
}
|
1915 |
+
}
|
1916 |
+
|
1917 |
+
// backwards-compat stuff - to be removed in future
|
1918 |
+
if (!ranges[key]) {
|
1919 |
+
axis = coord == "x" ? xaxes[0] : yaxes[0];
|
1920 |
+
from = ranges[coord + "1"];
|
1921 |
+
to = ranges[coord + "2"];
|
1922 |
+
}
|
1923 |
+
|
1924 |
+
// auto-reverse as an added bonus
|
1925 |
+
if (from != null && to != null && from > to) {
|
1926 |
+
var tmp = from;
|
1927 |
+
from = to;
|
1928 |
+
to = tmp;
|
1929 |
+
}
|
1930 |
+
|
1931 |
+
return { from: from, to: to, axis: axis };
|
1932 |
+
}
|
1933 |
+
|
1934 |
+
function drawBackground() {
|
1935 |
+
ctx.save();
|
1936 |
+
ctx.translate(plotOffset.left, plotOffset.top);
|
1937 |
+
|
1938 |
+
ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
|
1939 |
+
ctx.fillRect(0, 0, plotWidth, plotHeight);
|
1940 |
+
ctx.restore();
|
1941 |
+
}
|
1942 |
+
|
1943 |
+
function drawGrid() {
|
1944 |
+
var i, axes, bw, bc;
|
1945 |
+
|
1946 |
+
ctx.save();
|
1947 |
+
ctx.translate(plotOffset.left, plotOffset.top);
|
1948 |
+
|
1949 |
+
// draw markings
|
1950 |
+
var markings = options.grid.markings;
|
1951 |
+
if (markings) {
|
1952 |
+
if ($.isFunction(markings)) {
|
1953 |
+
axes = plot.getAxes();
|
1954 |
+
// xmin etc. is backwards compatibility, to be
|
1955 |
+
// removed in the future
|
1956 |
+
axes.xmin = axes.xaxis.min;
|
1957 |
+
axes.xmax = axes.xaxis.max;
|
1958 |
+
axes.ymin = axes.yaxis.min;
|
1959 |
+
axes.ymax = axes.yaxis.max;
|
1960 |
+
|
1961 |
+
markings = markings(axes);
|
1962 |
+
}
|
1963 |
+
|
1964 |
+
for (i = 0; i < markings.length; ++i) {
|
1965 |
+
var m = markings[i],
|
1966 |
+
xrange = extractRange(m, "x"),
|
1967 |
+
yrange = extractRange(m, "y");
|
1968 |
+
|
1969 |
+
// fill in missing
|
1970 |
+
if (xrange.from == null)
|
1971 |
+
xrange.from = xrange.axis.min;
|
1972 |
+
if (xrange.to == null)
|
1973 |
+
xrange.to = xrange.axis.max;
|
1974 |
+
if (yrange.from == null)
|
1975 |
+
yrange.from = yrange.axis.min;
|
1976 |
+
if (yrange.to == null)
|
1977 |
+
yrange.to = yrange.axis.max;
|
1978 |
+
|
1979 |
+
// clip
|
1980 |
+
if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
|
1981 |
+
yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
|
1982 |
+
continue;
|
1983 |
+
|
1984 |
+
xrange.from = Math.max(xrange.from, xrange.axis.min);
|
1985 |
+
xrange.to = Math.min(xrange.to, xrange.axis.max);
|
1986 |
+
yrange.from = Math.max(yrange.from, yrange.axis.min);
|
1987 |
+
yrange.to = Math.min(yrange.to, yrange.axis.max);
|
1988 |
+
|
1989 |
+
var xequal = xrange.from === xrange.to,
|
1990 |
+
yequal = yrange.from === yrange.to;
|
1991 |
+
|
1992 |
+
if (xequal && yequal) {
|
1993 |
+
continue;
|
1994 |
+
}
|
1995 |
+
|
1996 |
+
// then draw
|
1997 |
+
xrange.from = Math.floor(xrange.axis.p2c(xrange.from));
|
1998 |
+
xrange.to = Math.floor(xrange.axis.p2c(xrange.to));
|
1999 |
+
yrange.from = Math.floor(yrange.axis.p2c(yrange.from));
|
2000 |
+
yrange.to = Math.floor(yrange.axis.p2c(yrange.to));
|
2001 |
+
|
2002 |
+
if (xequal || yequal) {
|
2003 |
+
var lineWidth = m.lineWidth || options.grid.markingsLineWidth,
|
2004 |
+
subPixel = lineWidth % 2 ? 0.5 : 0;
|
2005 |
+
ctx.beginPath();
|
2006 |
+
ctx.strokeStyle = m.color || options.grid.markingsColor;
|
2007 |
+
ctx.lineWidth = lineWidth;
|
2008 |
+
if (xequal) {
|
2009 |
+
ctx.moveTo(xrange.to + subPixel, yrange.from);
|
2010 |
+
ctx.lineTo(xrange.to + subPixel, yrange.to);
|
2011 |
+
} else {
|
2012 |
+
ctx.moveTo(xrange.from, yrange.to + subPixel);
|
2013 |
+
ctx.lineTo(xrange.to, yrange.to + subPixel);
|
2014 |
+
}
|
2015 |
+
ctx.stroke();
|
2016 |
+
} else {
|
2017 |
+
ctx.fillStyle = m.color || options.grid.markingsColor;
|
2018 |
+
ctx.fillRect(xrange.from, yrange.to,
|
2019 |
+
xrange.to - xrange.from,
|
2020 |
+
yrange.from - yrange.to);
|
2021 |
+
}
|
2022 |
+
}
|
2023 |
+
}
|
2024 |
+
|
2025 |
+
// draw the ticks
|
2026 |
+
axes = allAxes();
|
2027 |
+
bw = options.grid.borderWidth;
|
2028 |
+
|
2029 |
+
for (var j = 0; j < axes.length; ++j) {
|
2030 |
+
var axis = axes[j], box = axis.box,
|
2031 |
+
t = axis.tickLength, x, y, xoff, yoff;
|
2032 |
+
if (!axis.show || axis.ticks.length == 0)
|
2033 |
+
continue;
|
2034 |
+
|
2035 |
+
ctx.lineWidth = 1;
|
2036 |
+
|
2037 |
+
// find the edges
|
2038 |
+
if (axis.direction == "x") {
|
2039 |
+
x = 0;
|
2040 |
+
if (t == "full")
|
2041 |
+
y = (axis.position == "top" ? 0 : plotHeight);
|
2042 |
+
else
|
2043 |
+
y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
|
2044 |
+
}
|
2045 |
+
else {
|
2046 |
+
y = 0;
|
2047 |
+
if (t == "full")
|
2048 |
+
x = (axis.position == "left" ? 0 : plotWidth);
|
2049 |
+
else
|
2050 |
+
x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
|
2051 |
+
}
|
2052 |
+
|
2053 |
+
// draw tick bar
|
2054 |
+
if (!axis.innermost) {
|
2055 |
+
ctx.strokeStyle = axis.options.color;
|
2056 |
+
ctx.beginPath();
|
2057 |
+
xoff = yoff = 0;
|
2058 |
+
if (axis.direction == "x")
|
2059 |
+
xoff = plotWidth + 1;
|
2060 |
+
else
|
2061 |
+
yoff = plotHeight + 1;
|
2062 |
+
|
2063 |
+
if (ctx.lineWidth == 1) {
|
2064 |
+
if (axis.direction == "x") {
|
2065 |
+
y = Math.floor(y) + 0.5;
|
2066 |
+
} else {
|
2067 |
+
x = Math.floor(x) + 0.5;
|
2068 |
+
}
|
2069 |
+
}
|
2070 |
+
|
2071 |
+
ctx.moveTo(x, y);
|
2072 |
+
ctx.lineTo(x + xoff, y + yoff);
|
2073 |
+
ctx.stroke();
|
2074 |
+
}
|
2075 |
+
|
2076 |
+
// draw ticks
|
2077 |
+
|
2078 |
+
ctx.strokeStyle = axis.options.tickColor;
|
2079 |
+
|
2080 |
+
ctx.beginPath();
|
2081 |
+
for (i = 0; i < axis.ticks.length; ++i) {
|
2082 |
+
var v = axis.ticks[i].v;
|
2083 |
+
|
2084 |
+
xoff = yoff = 0;
|
2085 |
+
|
2086 |
+
if (isNaN(v) || v < axis.min || v > axis.max
|
2087 |
+
// skip those lying on the axes if we got a border
|
2088 |
+
|| (t == "full"
|
2089 |
+
&& ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
|
2090 |
+
&& (v == axis.min || v == axis.max)))
|
2091 |
+
continue;
|
2092 |
+
|
2093 |
+
if (axis.direction == "x") {
|
2094 |
+
x = axis.p2c(v);
|
2095 |
+
yoff = t == "full" ? -plotHeight : t;
|
2096 |
+
|
2097 |
+
if (axis.position == "top")
|
2098 |
+
yoff = -yoff;
|
2099 |
+
}
|
2100 |
+
else {
|
2101 |
+
y = axis.p2c(v);
|
2102 |
+
xoff = t == "full" ? -plotWidth : t;
|
2103 |
+
|
2104 |
+
if (axis.position == "left")
|
2105 |
+
xoff = -xoff;
|
2106 |
+
}
|
2107 |
+
|
2108 |
+
if (ctx.lineWidth == 1) {
|
2109 |
+
if (axis.direction == "x")
|
2110 |
+
x = Math.floor(x) + 0.5;
|
2111 |
+
else
|
2112 |
+
y = Math.floor(y) + 0.5;
|
2113 |
+
}
|
2114 |
+
|
2115 |
+
ctx.moveTo(x, y);
|
2116 |
+
ctx.lineTo(x + xoff, y + yoff);
|
2117 |
+
}
|
2118 |
+
|
2119 |
+
ctx.stroke();
|
2120 |
+
}
|
2121 |
+
|
2122 |
+
|
2123 |
+
// draw border
|
2124 |
+
if (bw) {
|
2125 |
+
// If either borderWidth or borderColor is an object, then draw the border
|
2126 |
+
// line by line instead of as one rectangle
|
2127 |
+
bc = options.grid.borderColor;
|
2128 |
+
if(typeof bw == "object" || typeof bc == "object") {
|
2129 |
+
if (typeof bw !== "object") {
|
2130 |
+
bw = {top: bw, right: bw, bottom: bw, left: bw};
|
2131 |
+
}
|
2132 |
+
if (typeof bc !== "object") {
|
2133 |
+
bc = {top: bc, right: bc, bottom: bc, left: bc};
|
2134 |
+
}
|
2135 |
+
|
2136 |
+
if (bw.top > 0) {
|
2137 |
+
ctx.strokeStyle = bc.top;
|
2138 |
+
ctx.lineWidth = bw.top;
|
2139 |
+
ctx.beginPath();
|
2140 |
+
ctx.moveTo(0 - bw.left, 0 - bw.top/2);
|
2141 |
+
ctx.lineTo(plotWidth, 0 - bw.top/2);
|
2142 |
+
ctx.stroke();
|
2143 |
+
}
|
2144 |
+
|
2145 |
+
if (bw.right > 0) {
|
2146 |
+
ctx.strokeStyle = bc.right;
|
2147 |
+
ctx.lineWidth = bw.right;
|
2148 |
+
ctx.beginPath();
|
2149 |
+
ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
|
2150 |
+
ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
|
2151 |
+
ctx.stroke();
|
2152 |
+
}
|
2153 |
+
|
2154 |
+
if (bw.bottom > 0) {
|
2155 |
+
ctx.strokeStyle = bc.bottom;
|
2156 |
+
ctx.lineWidth = bw.bottom;
|
2157 |
+
ctx.beginPath();
|
2158 |
+
ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
|
2159 |
+
ctx.lineTo(0, plotHeight + bw.bottom / 2);
|
2160 |
+
ctx.stroke();
|
2161 |
+
}
|
2162 |
+
|
2163 |
+
if (bw.left > 0) {
|
2164 |
+
ctx.strokeStyle = bc.left;
|
2165 |
+
ctx.lineWidth = bw.left;
|
2166 |
+
ctx.beginPath();
|
2167 |
+
ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
|
2168 |
+
ctx.lineTo(0- bw.left/2, 0);
|
2169 |
+
ctx.stroke();
|
2170 |
+
}
|
2171 |
+
}
|
2172 |
+
else {
|
2173 |
+
ctx.lineWidth = bw;
|
2174 |
+
ctx.strokeStyle = options.grid.borderColor;
|
2175 |
+
ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
|
2176 |
+
}
|
2177 |
+
}
|
2178 |
+
|
2179 |
+
ctx.restore();
|
2180 |
+
}
|
2181 |
+
|
2182 |
+
function drawAxisLabels() {
|
2183 |
+
|
2184 |
+
$.each(allAxes(), function (_, axis) {
|
2185 |
+
var box = axis.box,
|
2186 |
+
legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
|
2187 |
+
layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
|
2188 |
+
font = axis.options.font || "flot-tick-label tickLabel",
|
2189 |
+
tick, x, y, halign, valign;
|
2190 |
+
|
2191 |
+
// Remove text before checking for axis.show and ticks.length;
|
2192 |
+
// otherwise plugins, like flot-tickrotor, that draw their own
|
2193 |
+
// tick labels will end up with both theirs and the defaults.
|
2194 |
+
|
2195 |
+
surface.removeText(layer);
|
2196 |
+
|
2197 |
+
if (!axis.show || axis.ticks.length == 0)
|
2198 |
+
return;
|
2199 |
+
|
2200 |
+
for (var i = 0; i < axis.ticks.length; ++i) {
|
2201 |
+
|
2202 |
+
tick = axis.ticks[i];
|
2203 |
+
if (!tick.label || tick.v < axis.min || tick.v > axis.max)
|
2204 |
+
continue;
|
2205 |
+
|
2206 |
+
if (axis.direction == "x") {
|
2207 |
+
halign = "center";
|
2208 |
+
x = plotOffset.left + axis.p2c(tick.v);
|
2209 |
+
if (axis.position == "bottom") {
|
2210 |
+
y = box.top + box.padding;
|
2211 |
+
} else {
|
2212 |
+
y = box.top + box.height - box.padding;
|
2213 |
+
valign = "bottom";
|
2214 |
+
}
|
2215 |
+
} else {
|
2216 |
+
valign = "middle";
|
2217 |
+
y = plotOffset.top + axis.p2c(tick.v);
|
2218 |
+
if (axis.position == "left") {
|
2219 |
+
x = box.left + box.width - box.padding;
|
2220 |
+
halign = "right";
|
2221 |
+
} else {
|
2222 |
+
x = box.left + box.padding;
|
2223 |
+
}
|
2224 |
+
}
|
2225 |
+
|
2226 |
+
surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
|
2227 |
+
}
|
2228 |
+
});
|
2229 |
+
}
|
2230 |
+
|
2231 |
+
function drawSeries(series) {
|
2232 |
+
if (series.lines.show)
|
2233 |
+
drawSeriesLines(series);
|
2234 |
+
if (series.bars.show)
|
2235 |
+
drawSeriesBars(series);
|
2236 |
+
if (series.points.show)
|
2237 |
+
drawSeriesPoints(series);
|
2238 |
+
}
|
2239 |
+
|
2240 |
+
function drawSeriesLines(series) {
|
2241 |
+
function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
|
2242 |
+
var points = datapoints.points,
|
2243 |
+
ps = datapoints.pointsize,
|
2244 |
+
prevx = null, prevy = null;
|
2245 |
+
|
2246 |
+
ctx.beginPath();
|
2247 |
+
for (var i = ps; i < points.length; i += ps) {
|
2248 |
+
var x1 = points[i - ps], y1 = points[i - ps + 1],
|
2249 |
+
x2 = points[i], y2 = points[i + 1];
|
2250 |
+
|
2251 |
+
if (x1 == null || x2 == null)
|
2252 |
+
continue;
|
2253 |
+
|
2254 |
+
// clip with ymin
|
2255 |
+
if (y1 <= y2 && y1 < axisy.min) {
|
2256 |
+
if (y2 < axisy.min)
|
2257 |
+
continue; // line segment is outside
|
2258 |
+
// compute new intersection point
|
2259 |
+
x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2260 |
+
y1 = axisy.min;
|
2261 |
+
}
|
2262 |
+
else if (y2 <= y1 && y2 < axisy.min) {
|
2263 |
+
if (y1 < axisy.min)
|
2264 |
+
continue;
|
2265 |
+
x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2266 |
+
y2 = axisy.min;
|
2267 |
+
}
|
2268 |
+
|
2269 |
+
// clip with ymax
|
2270 |
+
if (y1 >= y2 && y1 > axisy.max) {
|
2271 |
+
if (y2 > axisy.max)
|
2272 |
+
continue;
|
2273 |
+
x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2274 |
+
y1 = axisy.max;
|
2275 |
+
}
|
2276 |
+
else if (y2 >= y1 && y2 > axisy.max) {
|
2277 |
+
if (y1 > axisy.max)
|
2278 |
+
continue;
|
2279 |
+
x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2280 |
+
y2 = axisy.max;
|
2281 |
+
}
|
2282 |
+
|
2283 |
+
// clip with xmin
|
2284 |
+
if (x1 <= x2 && x1 < axisx.min) {
|
2285 |
+
if (x2 < axisx.min)
|
2286 |
+
continue;
|
2287 |
+
y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2288 |
+
x1 = axisx.min;
|
2289 |
+
}
|
2290 |
+
else if (x2 <= x1 && x2 < axisx.min) {
|
2291 |
+
if (x1 < axisx.min)
|
2292 |
+
continue;
|
2293 |
+
y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2294 |
+
x2 = axisx.min;
|
2295 |
+
}
|
2296 |
+
|
2297 |
+
// clip with xmax
|
2298 |
+
if (x1 >= x2 && x1 > axisx.max) {
|
2299 |
+
if (x2 > axisx.max)
|
2300 |
+
continue;
|
2301 |
+
y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2302 |
+
x1 = axisx.max;
|
2303 |
+
}
|
2304 |
+
else if (x2 >= x1 && x2 > axisx.max) {
|
2305 |
+
if (x1 > axisx.max)
|
2306 |
+
continue;
|
2307 |
+
y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2308 |
+
x2 = axisx.max;
|
2309 |
+
}
|
2310 |
+
|
2311 |
+
if (x1 != prevx || y1 != prevy)
|
2312 |
+
ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
|
2313 |
+
|
2314 |
+
prevx = x2;
|
2315 |
+
prevy = y2;
|
2316 |
+
ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
|
2317 |
+
}
|
2318 |
+
ctx.stroke();
|
2319 |
+
}
|
2320 |
+
|
2321 |
+
function plotLineArea(datapoints, axisx, axisy) {
|
2322 |
+
var points = datapoints.points,
|
2323 |
+
ps = datapoints.pointsize,
|
2324 |
+
bottom = Math.min(Math.max(0, axisy.min), axisy.max),
|
2325 |
+
i = 0, top, areaOpen = false,
|
2326 |
+
ypos = 1, segmentStart = 0, segmentEnd = 0;
|
2327 |
+
|
2328 |
+
// we process each segment in two turns, first forward
|
2329 |
+
// direction to sketch out top, then once we hit the
|
2330 |
+
// end we go backwards to sketch the bottom
|
2331 |
+
while (true) {
|
2332 |
+
if (ps > 0 && i > points.length + ps)
|
2333 |
+
break;
|
2334 |
+
|
2335 |
+
i += ps; // ps is negative if going backwards
|
2336 |
+
|
2337 |
+
var x1 = points[i - ps],
|
2338 |
+
y1 = points[i - ps + ypos],
|
2339 |
+
x2 = points[i], y2 = points[i + ypos];
|
2340 |
+
|
2341 |
+
if (areaOpen) {
|
2342 |
+
if (ps > 0 && x1 != null && x2 == null) {
|
2343 |
+
// at turning point
|
2344 |
+
segmentEnd = i;
|
2345 |
+
ps = -ps;
|
2346 |
+
ypos = 2;
|
2347 |
+
continue;
|
2348 |
+
}
|
2349 |
+
|
2350 |
+
if (ps < 0 && i == segmentStart + ps) {
|
2351 |
+
// done with the reverse sweep
|
2352 |
+
ctx.fill();
|
2353 |
+
areaOpen = false;
|
2354 |
+
ps = -ps;
|
2355 |
+
ypos = 1;
|
2356 |
+
i = segmentStart = segmentEnd + ps;
|
2357 |
+
continue;
|
2358 |
+
}
|
2359 |
+
}
|
2360 |
+
|
2361 |
+
if (x1 == null || x2 == null)
|
2362 |
+
continue;
|
2363 |
+
|
2364 |
+
// clip x values
|
2365 |
+
|
2366 |
+
// clip with xmin
|
2367 |
+
if (x1 <= x2 && x1 < axisx.min) {
|
2368 |
+
if (x2 < axisx.min)
|
2369 |
+
continue;
|
2370 |
+
y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2371 |
+
x1 = axisx.min;
|
2372 |
+
}
|
2373 |
+
else if (x2 <= x1 && x2 < axisx.min) {
|
2374 |
+
if (x1 < axisx.min)
|
2375 |
+
continue;
|
2376 |
+
y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2377 |
+
x2 = axisx.min;
|
2378 |
+
}
|
2379 |
+
|
2380 |
+
// clip with xmax
|
2381 |
+
if (x1 >= x2 && x1 > axisx.max) {
|
2382 |
+
if (x2 > axisx.max)
|
2383 |
+
continue;
|
2384 |
+
y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2385 |
+
x1 = axisx.max;
|
2386 |
+
}
|
2387 |
+
else if (x2 >= x1 && x2 > axisx.max) {
|
2388 |
+
if (x1 > axisx.max)
|
2389 |
+
continue;
|
2390 |
+
y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
|
2391 |
+
x2 = axisx.max;
|
2392 |
+
}
|
2393 |
+
|
2394 |
+
if (!areaOpen) {
|
2395 |
+
// open area
|
2396 |
+
ctx.beginPath();
|
2397 |
+
ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
|
2398 |
+
areaOpen = true;
|
2399 |
+
}
|
2400 |
+
|
2401 |
+
// now first check the case where both is outside
|
2402 |
+
if (y1 >= axisy.max && y2 >= axisy.max) {
|
2403 |
+
ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
|
2404 |
+
ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
|
2405 |
+
continue;
|
2406 |
+
}
|
2407 |
+
else if (y1 <= axisy.min && y2 <= axisy.min) {
|
2408 |
+
ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
|
2409 |
+
ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
|
2410 |
+
continue;
|
2411 |
+
}
|
2412 |
+
|
2413 |
+
// else it's a bit more complicated, there might
|
2414 |
+
// be a flat maxed out rectangle first, then a
|
2415 |
+
// triangular cutout or reverse; to find these
|
2416 |
+
// keep track of the current x values
|
2417 |
+
var x1old = x1, x2old = x2;
|
2418 |
+
|
2419 |
+
// clip the y values, without shortcutting, we
|
2420 |
+
// go through all cases in turn
|
2421 |
+
|
2422 |
+
// clip with ymin
|
2423 |
+
if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
|
2424 |
+
x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2425 |
+
y1 = axisy.min;
|
2426 |
+
}
|
2427 |
+
else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
|
2428 |
+
x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2429 |
+
y2 = axisy.min;
|
2430 |
+
}
|
2431 |
+
|
2432 |
+
// clip with ymax
|
2433 |
+
if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
|
2434 |
+
x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2435 |
+
y1 = axisy.max;
|
2436 |
+
}
|
2437 |
+
else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
|
2438 |
+
x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
|
2439 |
+
y2 = axisy.max;
|
2440 |
+
}
|
2441 |
+
|
2442 |
+
// if the x value was changed we got a rectangle
|
2443 |
+
// to fill
|
2444 |
+
if (x1 != x1old) {
|
2445 |
+
ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
|
2446 |
+
// it goes to (x1, y1), but we fill that below
|
2447 |
+
}
|
2448 |
+
|
2449 |
+
// fill triangular section, this sometimes result
|
2450 |
+
// in redundant points if (x1, y1) hasn't changed
|
2451 |
+
// from previous line to, but we just ignore that
|
2452 |
+
ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
|
2453 |
+
ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
|
2454 |
+
|
2455 |
+
// fill the other rectangle if it's there
|
2456 |
+
if (x2 != x2old) {
|
2457 |
+
ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
|
2458 |
+
ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
|
2459 |
+
}
|
2460 |
+
}
|
2461 |
+
}
|
2462 |
+
|
2463 |
+
ctx.save();
|
2464 |
+
ctx.translate(plotOffset.left, plotOffset.top);
|
2465 |
+
ctx.lineJoin = "round";
|
2466 |
+
|
2467 |
+
var lw = series.lines.lineWidth,
|
2468 |
+
sw = series.shadowSize;
|
2469 |
+
// FIXME: consider another form of shadow when filling is turned on
|
2470 |
+
if (lw > 0 && sw > 0) {
|
2471 |
+
// draw shadow as a thick and thin line with transparency
|
2472 |
+
ctx.lineWidth = sw;
|
2473 |
+
ctx.strokeStyle = "rgba(0,0,0,0.1)";
|
2474 |
+
// position shadow at angle from the mid of line
|
2475 |
+
var angle = Math.PI/18;
|
2476 |
+
plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
|
2477 |
+
ctx.lineWidth = sw/2;
|
2478 |
+
plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
|
2479 |
+
}
|
2480 |
+
|
2481 |
+
ctx.lineWidth = lw;
|
2482 |
+
ctx.strokeStyle = series.color;
|
2483 |
+
var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
|
2484 |
+
if (fillStyle) {
|
2485 |
+
ctx.fillStyle = fillStyle;
|
2486 |
+
plotLineArea(series.datapoints, series.xaxis, series.yaxis);
|
2487 |
+
}
|
2488 |
+
|
2489 |
+
if (lw > 0)
|
2490 |
+
plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
|
2491 |
+
ctx.restore();
|
2492 |
+
}
|
2493 |
+
|
2494 |
+
function drawSeriesPoints(series) {
|
2495 |
+
function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
|
2496 |
+
var points = datapoints.points, ps = datapoints.pointsize;
|
2497 |
+
|
2498 |
+
for (var i = 0; i < points.length; i += ps) {
|
2499 |
+
var x = points[i], y = points[i + 1];
|
2500 |
+
if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
|
2501 |
+
continue;
|
2502 |
+
|
2503 |
+
ctx.beginPath();
|
2504 |
+
x = axisx.p2c(x);
|
2505 |
+
y = axisy.p2c(y) + offset;
|
2506 |
+
if (symbol == "circle")
|
2507 |
+
ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
|
2508 |
+
else
|
2509 |
+
symbol(ctx, x, y, radius, shadow);
|
2510 |
+
ctx.closePath();
|
2511 |
+
|
2512 |
+
if (fillStyle) {
|
2513 |
+
ctx.fillStyle = fillStyle;
|
2514 |
+
ctx.fill();
|
2515 |
+
}
|
2516 |
+
ctx.stroke();
|
2517 |
+
}
|
2518 |
+
}
|
2519 |
+
|
2520 |
+
ctx.save();
|
2521 |
+
ctx.translate(plotOffset.left, plotOffset.top);
|
2522 |
+
|
2523 |
+
var lw = series.points.lineWidth,
|
2524 |
+
sw = series.shadowSize,
|
2525 |
+
radius = series.points.radius,
|
2526 |
+
symbol = series.points.symbol;
|
2527 |
+
|
2528 |
+
// If the user sets the line width to 0, we change it to a very
|
2529 |
+
// small value. A line width of 0 seems to force the default of 1.
|
2530 |
+
// Doing the conditional here allows the shadow setting to still be
|
2531 |
+
// optional even with a lineWidth of 0.
|
2532 |
+
|
2533 |
+
if( lw == 0 )
|
2534 |
+
lw = 0.0001;
|
2535 |
+
|
2536 |
+
if (lw > 0 && sw > 0) {
|
2537 |
+
// draw shadow in two steps
|
2538 |
+
var w = sw / 2;
|
2539 |
+
ctx.lineWidth = w;
|
2540 |
+
ctx.strokeStyle = "rgba(0,0,0,0.1)";
|
2541 |
+
plotPoints(series.datapoints, radius, null, w + w/2, true,
|
2542 |
+
series.xaxis, series.yaxis, symbol);
|
2543 |
+
|
2544 |
+
ctx.strokeStyle = "rgba(0,0,0,0.2)";
|
2545 |
+
plotPoints(series.datapoints, radius, null, w/2, true,
|
2546 |
+
series.xaxis, series.yaxis, symbol);
|
2547 |
+
}
|
2548 |
+
|
2549 |
+
ctx.lineWidth = lw;
|
2550 |
+
ctx.strokeStyle = series.color;
|
2551 |
+
plotPoints(series.datapoints, radius,
|
2552 |
+
getFillStyle(series.points, series.color), 0, false,
|
2553 |
+
series.xaxis, series.yaxis, symbol);
|
2554 |
+
ctx.restore();
|
2555 |
+
}
|
2556 |
+
|
2557 |
+
function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
|
2558 |
+
var left, right, bottom, top,
|
2559 |
+
drawLeft, drawRight, drawTop, drawBottom,
|
2560 |
+
tmp;
|
2561 |
+
|
2562 |
+
// in horizontal mode, we start the bar from the left
|
2563 |
+
// instead of from the bottom so it appears to be
|
2564 |
+
// horizontal rather than vertical
|
2565 |
+
if (horizontal) {
|
2566 |
+
drawBottom = drawRight = drawTop = true;
|
2567 |
+
drawLeft = false;
|
2568 |
+
left = b;
|
2569 |
+
right = x;
|
2570 |
+
top = y + barLeft;
|
2571 |
+
bottom = y + barRight;
|
2572 |
+
|
2573 |
+
// account for negative bars
|
2574 |
+
if (right < left) {
|
2575 |
+
tmp = right;
|
2576 |
+
right = left;
|
2577 |
+
left = tmp;
|
2578 |
+
drawLeft = true;
|
2579 |
+
drawRight = false;
|
2580 |
+
}
|
2581 |
+
}
|
2582 |
+
else {
|
2583 |
+
drawLeft = drawRight = drawTop = true;
|
2584 |
+
drawBottom = false;
|
2585 |
+
left = x + barLeft;
|
2586 |
+
right = x + barRight;
|
2587 |
+
bottom = b;
|
2588 |
+
top = y;
|
2589 |
+
|
2590 |
+
// account for negative bars
|
2591 |
+
if (top < bottom) {
|
2592 |
+
tmp = top;
|
2593 |
+
top = bottom;
|
2594 |
+
bottom = tmp;
|
2595 |
+
drawBottom = true;
|
2596 |
+
drawTop = false;
|
2597 |
+
}
|
2598 |
+
}
|
2599 |
+
|
2600 |
+
// clip
|
2601 |
+
if (right < axisx.min || left > axisx.max ||
|
2602 |
+
top < axisy.min || bottom > axisy.max)
|
2603 |
+
return;
|
2604 |
+
|
2605 |
+
if (left < axisx.min) {
|
2606 |
+
left = axisx.min;
|
2607 |
+
drawLeft = false;
|
2608 |
+
}
|
2609 |
+
|
2610 |
+
if (right > axisx.max) {
|
2611 |
+
right = axisx.max;
|
2612 |
+
drawRight = false;
|
2613 |
+
}
|
2614 |
+
|
2615 |
+
if (bottom < axisy.min) {
|
2616 |
+
bottom = axisy.min;
|
2617 |
+
drawBottom = false;
|
2618 |
+
}
|
2619 |
+
|
2620 |
+
if (top > axisy.max) {
|
2621 |
+
top = axisy.max;
|
2622 |
+
drawTop = false;
|
2623 |
+
}
|
2624 |
+
|
2625 |
+
left = axisx.p2c(left);
|
2626 |
+
bottom = axisy.p2c(bottom);
|
2627 |
+
right = axisx.p2c(right);
|
2628 |
+
top = axisy.p2c(top);
|
2629 |
+
|
2630 |
+
// fill the bar
|
2631 |
+
if (fillStyleCallback) {
|
2632 |
+
c.fillStyle = fillStyleCallback(bottom, top);
|
2633 |
+
c.fillRect(left, top, right - left, bottom - top)
|
2634 |
+
}
|
2635 |
+
|
2636 |
+
// draw outline
|
2637 |
+
if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
|
2638 |
+
c.beginPath();
|
2639 |
+
|
2640 |
+
// FIXME: inline moveTo is buggy with excanvas
|
2641 |
+
c.moveTo(left, bottom);
|
2642 |
+
if (drawLeft)
|
2643 |
+
c.lineTo(left, top);
|
2644 |
+
else
|
2645 |
+
c.moveTo(left, top);
|
2646 |
+
if (drawTop)
|
2647 |
+
c.lineTo(right, top);
|
2648 |
+
else
|
2649 |
+
c.moveTo(right, top);
|
2650 |
+
if (drawRight)
|
2651 |
+
c.lineTo(right, bottom);
|
2652 |
+
else
|
2653 |
+
c.moveTo(right, bottom);
|
2654 |
+
if (drawBottom)
|
2655 |
+
c.lineTo(left, bottom);
|
2656 |
+
else
|
2657 |
+
c.moveTo(left, bottom);
|
2658 |
+
c.stroke();
|
2659 |
+
}
|
2660 |
+
}
|
2661 |
+
|
2662 |
+
function drawSeriesBars(series) {
|
2663 |
+
function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
|
2664 |
+
var points = datapoints.points, ps = datapoints.pointsize;
|
2665 |
+
|
2666 |
+
for (var i = 0; i < points.length; i += ps) {
|
2667 |
+
if (points[i] == null)
|
2668 |
+
continue;
|
2669 |
+
drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
|
2670 |
+
}
|
2671 |
+
}
|
2672 |
+
|
2673 |
+
ctx.save();
|
2674 |
+
ctx.translate(plotOffset.left, plotOffset.top);
|
2675 |
+
|
2676 |
+
// FIXME: figure out a way to add shadows (for instance along the right edge)
|
2677 |
+
ctx.lineWidth = series.bars.lineWidth;
|
2678 |
+
ctx.strokeStyle = series.color;
|
2679 |
+
|
2680 |
+
var barLeft;
|
2681 |
+
|
2682 |
+
switch (series.bars.align) {
|
2683 |
+
case "left":
|
2684 |
+
barLeft = 0;
|
2685 |
+
break;
|
2686 |
+
case "right":
|
2687 |
+
barLeft = -series.bars.barWidth;
|
2688 |
+
break;
|
2689 |
+
default:
|
2690 |
+
barLeft = -series.bars.barWidth / 2;
|
2691 |
+
}
|
2692 |
+
|
2693 |
+
var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
|
2694 |
+
plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
|
2695 |
+
ctx.restore();
|
2696 |
+
}
|
2697 |
+
|
2698 |
+
function getFillStyle(filloptions, seriesColor, bottom, top) {
|
2699 |
+
var fill = filloptions.fill;
|
2700 |
+
if (!fill)
|
2701 |
+
return null;
|
2702 |
+
|
2703 |
+
if (filloptions.fillColor)
|
2704 |
+
return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
|
2705 |
+
|
2706 |
+
var c = $.color.parse(seriesColor);
|
2707 |
+
c.a = typeof fill == "number" ? fill : 0.4;
|
2708 |
+
c.normalize();
|
2709 |
+
return c.toString();
|
2710 |
+
}
|
2711 |
+
|
2712 |
+
function insertLegend() {
|
2713 |
+
|
2714 |
+
if (options.legend.container != null) {
|
2715 |
+
$(options.legend.container).html("");
|
2716 |
+
} else {
|
2717 |
+
placeholder.find(".legend").remove();
|
2718 |
+
}
|
2719 |
+
|
2720 |
+
if (!options.legend.show) {
|
2721 |
+
return;
|
2722 |
+
}
|
2723 |
+
|
2724 |
+
var fragments = [], entries = [], rowStarted = false,
|
2725 |
+
lf = options.legend.labelFormatter, s, label;
|
2726 |
+
|
2727 |
+
// Build a list of legend entries, with each having a label and a color
|
2728 |
+
|
2729 |
+
for (var i = 0; i < series.length; ++i) {
|
2730 |
+
s = series[i];
|
2731 |
+
if (s.label) {
|
2732 |
+
label = lf ? lf(s.label, s) : s.label;
|
2733 |
+
if (label) {
|
2734 |
+
entries.push({
|
2735 |
+
label: label,
|
2736 |
+
color: s.color
|
2737 |
+
});
|
2738 |
+
}
|
2739 |
+
}
|
2740 |
+
}
|
2741 |
+
|
2742 |
+
// Sort the legend using either the default or a custom comparator
|
2743 |
+
|
2744 |
+
if (options.legend.sorted) {
|
2745 |
+
if ($.isFunction(options.legend.sorted)) {
|
2746 |
+
entries.sort(options.legend.sorted);
|
2747 |
+
} else if (options.legend.sorted == "reverse") {
|
2748 |
+
entries.reverse();
|
2749 |
+
} else {
|
2750 |
+
var ascending = options.legend.sorted != "descending";
|
2751 |
+
entries.sort(function(a, b) {
|
2752 |
+
return a.label == b.label ? 0 : (
|
2753 |
+
(a.label < b.label) != ascending ? 1 : -1 // Logical XOR
|
2754 |
+
);
|
2755 |
+
});
|
2756 |
+
}
|
2757 |
+
}
|
2758 |
+
|
2759 |
+
// Generate markup for the list of entries, in their final order
|
2760 |
+
|
2761 |
+
for (var i = 0; i < entries.length; ++i) {
|
2762 |
+
|
2763 |
+
var entry = entries[i];
|
2764 |
+
|
2765 |
+
if (i % options.legend.noColumns == 0) {
|
2766 |
+
if (rowStarted)
|
2767 |
+
fragments.push('</tr>');
|
2768 |
+
fragments.push('<tr>');
|
2769 |
+
rowStarted = true;
|
2770 |
+
}
|
2771 |
+
|
2772 |
+
fragments.push(
|
2773 |
+
'<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
|
2774 |
+
'<td class="legendLabel">' + entry.label + '</td>'
|
2775 |
+
);
|
2776 |
+
}
|
2777 |
+
|
2778 |
+
if (rowStarted)
|
2779 |
+
fragments.push('</tr>');
|
2780 |
+
|
2781 |
+
if (fragments.length == 0)
|
2782 |
+
return;
|
2783 |
+
|
2784 |
+
var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
|
2785 |
+
if (options.legend.container != null)
|
2786 |
+
$(options.legend.container).html(table);
|
2787 |
+
else {
|
2788 |
+
var pos = "",
|
2789 |
+
p = options.legend.position,
|
2790 |
+
m = options.legend.margin;
|
2791 |
+
if (m[0] == null)
|
2792 |
+
m = [m, m];
|
2793 |
+
if (p.charAt(0) == "n")
|
2794 |
+
pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
|
2795 |
+
else if (p.charAt(0) == "s")
|
2796 |
+
pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
|
2797 |
+
if (p.charAt(1) == "e")
|
2798 |
+
pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
|
2799 |
+
else if (p.charAt(1) == "w")
|
2800 |
+
pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
|
2801 |
+
var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
|
2802 |
+
if (options.legend.backgroundOpacity != 0.0) {
|
2803 |
+
// put in the transparent background
|
2804 |
+
// separately to avoid blended labels and
|
2805 |
+
// label boxes
|
2806 |
+
var c = options.legend.backgroundColor;
|
2807 |
+
if (c == null) {
|
2808 |
+
c = options.grid.backgroundColor;
|
2809 |
+
if (c && typeof c == "string")
|
2810 |
+
c = $.color.parse(c);
|
2811 |
+
else
|
2812 |
+
c = $.color.extract(legend, 'background-color');
|
2813 |
+
c.a = 1;
|
2814 |
+
c = c.toString();
|
2815 |
+
}
|
2816 |
+
var div = legend.children();
|
2817 |
+
$('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
|
2818 |
+
}
|
2819 |
+
}
|
2820 |
+
}
|
2821 |
+
|
2822 |
+
|
2823 |
+
// interactive features
|
2824 |
+
|
2825 |
+
var highlights = [],
|
2826 |
+
redrawTimeout = null;
|
2827 |
+
|
2828 |
+
// returns the data item the mouse is over, or null if none is found
|
2829 |
+
function findNearbyItem(mouseX, mouseY, seriesFilter) {
|
2830 |
+
var maxDistance = options.grid.mouseActiveRadius,
|
2831 |
+
smallestDistance = maxDistance * maxDistance + 1,
|
2832 |
+
item = null, foundPoint = false, i, j, ps;
|
2833 |
+
|
2834 |
+
for (i = series.length - 1; i >= 0; --i) {
|
2835 |
+
if (!seriesFilter(series[i]))
|
2836 |
+
continue;
|
2837 |
+
|
2838 |
+
var s = series[i],
|
2839 |
+
axisx = s.xaxis,
|
2840 |
+
axisy = s.yaxis,
|
2841 |
+
points = s.datapoints.points,
|
2842 |
+
mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
|
2843 |
+
my = axisy.c2p(mouseY),
|
2844 |
+
maxx = maxDistance / axisx.scale,
|
2845 |
+
maxy = maxDistance / axisy.scale;
|
2846 |
+
|
2847 |
+
ps = s.datapoints.pointsize;
|
2848 |
+
// with inverse transforms, we can't use the maxx/maxy
|
2849 |
+
// optimization, sadly
|
2850 |
+
if (axisx.options.inverseTransform)
|
2851 |
+
maxx = Number.MAX_VALUE;
|
2852 |
+
if (axisy.options.inverseTransform)
|
2853 |
+
maxy = Number.MAX_VALUE;
|
2854 |
+
|
2855 |
+
if (s.lines.show || s.points.show) {
|
2856 |
+
for (j = 0; j < points.length; j += ps) {
|
2857 |
+
var x = points[j], y = points[j + 1];
|
2858 |
+
if (x == null)
|
2859 |
+
continue;
|
2860 |
+
|
2861 |
+
// For points and lines, the cursor must be within a
|
2862 |
+
// certain distance to the data point
|
2863 |
+
if (x - mx > maxx || x - mx < -maxx ||
|
2864 |
+
y - my > maxy || y - my < -maxy)
|
2865 |
+
continue;
|
2866 |
+
|
2867 |
+
// We have to calculate distances in pixels, not in
|
2868 |
+
// data units, because the scales of the axes may be different
|
2869 |
+
var dx = Math.abs(axisx.p2c(x) - mouseX),
|
2870 |
+
dy = Math.abs(axisy.p2c(y) - mouseY),
|
2871 |
+
dist = dx * dx + dy * dy; // we save the sqrt
|
2872 |
+
|
2873 |
+
// use <= to ensure last point takes precedence
|
2874 |
+
// (last generally means on top of)
|
2875 |
+
if (dist < smallestDistance) {
|
2876 |
+
smallestDistance = dist;
|
2877 |
+
item = [i, j / ps];
|
2878 |
+
}
|
2879 |
+
}
|
2880 |
+
}
|
2881 |
+
|
2882 |
+
if (s.bars.show && !item) { // no other point can be nearby
|
2883 |
+
|
2884 |
+
var barLeft, barRight;
|
2885 |
+
|
2886 |
+
switch (s.bars.align) {
|
2887 |
+
case "left":
|
2888 |
+
barLeft = 0;
|
2889 |
+
break;
|
2890 |
+
case "right":
|
2891 |
+
barLeft = -s.bars.barWidth;
|
2892 |
+
break;
|
2893 |
+
default:
|
2894 |
+
barLeft = -s.bars.barWidth / 2;
|
2895 |
+
}
|
2896 |
+
|
2897 |
+
barRight = barLeft + s.bars.barWidth;
|
2898 |
+
|
2899 |
+
for (j = 0; j < points.length; j += ps) {
|
2900 |
+
var x = points[j], y = points[j + 1], b = points[j + 2];
|
2901 |
+
if (x == null)
|
2902 |
+
continue;
|
2903 |
+
|
2904 |
+
// for a bar graph, the cursor must be inside the bar
|
2905 |
+
if (series[i].bars.horizontal ?
|
2906 |
+
(mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
|
2907 |
+
my >= y + barLeft && my <= y + barRight) :
|
2908 |
+
(mx >= x + barLeft && mx <= x + barRight &&
|
2909 |
+
my >= Math.min(b, y) && my <= Math.max(b, y)))
|
2910 |
+
item = [i, j / ps];
|
2911 |
+
}
|
2912 |
+
}
|
2913 |
+
}
|
2914 |
+
|
2915 |
+
if (item) {
|
2916 |
+
i = item[0];
|
2917 |
+
j = item[1];
|
2918 |
+
ps = series[i].datapoints.pointsize;
|
2919 |
+
|
2920 |
+
return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
|
2921 |
+
dataIndex: j,
|
2922 |
+
series: series[i],
|
2923 |
+
seriesIndex: i };
|
2924 |
+
}
|
2925 |
+
|
2926 |
+
return null;
|
2927 |
+
}
|
2928 |
+
|
2929 |
+
function onMouseMove(e) {
|
2930 |
+
if (options.grid.hoverable)
|
2931 |
+
triggerClickHoverEvent("plothover", e,
|
2932 |
+
function (s) { return s["hoverable"] != false; });
|
2933 |
+
}
|
2934 |
+
|
2935 |
+
function onMouseLeave(e) {
|
2936 |
+
if (options.grid.hoverable)
|
2937 |
+
triggerClickHoverEvent("plothover", e,
|
2938 |
+
function (s) { return false; });
|
2939 |
+
}
|
2940 |
+
|
2941 |
+
function onClick(e) {
|
2942 |
+
triggerClickHoverEvent("plotclick", e,
|
2943 |
+
function (s) { return s["clickable"] != false; });
|
2944 |
+
}
|
2945 |
+
|
2946 |
+
// trigger click or hover event (they send the same parameters
|
2947 |
+
// so we share their code)
|
2948 |
+
function triggerClickHoverEvent(eventname, event, seriesFilter) {
|
2949 |
+
var offset = eventHolder.offset(),
|
2950 |
+
canvasX = event.pageX - offset.left - plotOffset.left,
|
2951 |
+
canvasY = event.pageY - offset.top - plotOffset.top,
|
2952 |
+
pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
|
2953 |
+
|
2954 |
+
pos.pageX = event.pageX;
|
2955 |
+
pos.pageY = event.pageY;
|
2956 |
+
|
2957 |
+
var item = findNearbyItem(canvasX, canvasY, seriesFilter);
|
2958 |
+
|
2959 |
+
if (item) {
|
2960 |
+
// fill in mouse pos for any listeners out there
|
2961 |
+
item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
|
2962 |
+
item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
|
2963 |
+
}
|
2964 |
+
|
2965 |
+
if (options.grid.autoHighlight) {
|
2966 |
+
// clear auto-highlights
|
2967 |
+
for (var i = 0; i < highlights.length; ++i) {
|
2968 |
+
var h = highlights[i];
|
2969 |
+
if (h.auto == eventname &&
|
2970 |
+
!(item && h.series == item.series &&
|
2971 |
+
h.point[0] == item.datapoint[0] &&
|
2972 |
+
h.point[1] == item.datapoint[1]))
|
2973 |
+
unhighlight(h.series, h.point);
|
2974 |
+
}
|
2975 |
+
|
2976 |
+
if (item)
|
2977 |
+
highlight(item.series, item.datapoint, eventname);
|
2978 |
+
}
|
2979 |
+
|
2980 |
+
placeholder.trigger(eventname, [ pos, item ]);
|
2981 |
+
}
|
2982 |
+
|
2983 |
+
function triggerRedrawOverlay() {
|
2984 |
+
var t = options.interaction.redrawOverlayInterval;
|
2985 |
+
if (t == -1) { // skip event queue
|
2986 |
+
drawOverlay();
|
2987 |
+
return;
|
2988 |
+
}
|
2989 |
+
|
2990 |
+
if (!redrawTimeout)
|
2991 |
+
redrawTimeout = setTimeout(drawOverlay, t);
|
2992 |
+
}
|
2993 |
+
|
2994 |
+
function drawOverlay() {
|
2995 |
+
redrawTimeout = null;
|
2996 |
+
|
2997 |
+
// draw highlights
|
2998 |
+
octx.save();
|
2999 |
+
overlay.clear();
|
3000 |
+
octx.translate(plotOffset.left, plotOffset.top);
|
3001 |
+
|
3002 |
+
var i, hi;
|
3003 |
+
for (i = 0; i < highlights.length; ++i) {
|
3004 |
+
hi = highlights[i];
|
3005 |
+
|
3006 |
+
if (hi.series.bars.show)
|
3007 |
+
drawBarHighlight(hi.series, hi.point);
|
3008 |
+
else
|
3009 |
+
drawPointHighlight(hi.series, hi.point);
|
3010 |
+
}
|
3011 |
+
octx.restore();
|
3012 |
+
|
3013 |
+
executeHooks(hooks.drawOverlay, [octx]);
|
3014 |
+
}
|
3015 |
+
|
3016 |
+
function highlight(s, point, auto) {
|
3017 |
+
if (typeof s == "number")
|
3018 |
+
s = series[s];
|
3019 |
+
|
3020 |
+
if (typeof point == "number") {
|
3021 |
+
var ps = s.datapoints.pointsize;
|
3022 |
+
point = s.datapoints.points.slice(ps * point, ps * (point + 1));
|
3023 |
+
}
|
3024 |
+
|
3025 |
+
var i = indexOfHighlight(s, point);
|
3026 |
+
if (i == -1) {
|
3027 |
+
highlights.push({ series: s, point: point, auto: auto });
|
3028 |
+
|
3029 |
+
triggerRedrawOverlay();
|
3030 |
+
}
|
3031 |
+
else if (!auto)
|
3032 |
+
highlights[i].auto = false;
|
3033 |
+
}
|
3034 |
+
|
3035 |
+
function unhighlight(s, point) {
|
3036 |
+
if (s == null && point == null) {
|
3037 |
+
highlights = [];
|
3038 |
+
triggerRedrawOverlay();
|
3039 |
+
return;
|
3040 |
+
}
|
3041 |
+
|
3042 |
+
if (typeof s == "number")
|
3043 |
+
s = series[s];
|
3044 |
+
|
3045 |
+
if (typeof point == "number") {
|
3046 |
+
var ps = s.datapoints.pointsize;
|
3047 |
+
point = s.datapoints.points.slice(ps * point, ps * (point + 1));
|
3048 |
+
}
|
3049 |
+
|
3050 |
+
var i = indexOfHighlight(s, point);
|
3051 |
+
if (i != -1) {
|
3052 |
+
highlights.splice(i, 1);
|
3053 |
+
|
3054 |
+
triggerRedrawOverlay();
|
3055 |
+
}
|
3056 |
+
}
|
3057 |
+
|
3058 |
+
function indexOfHighlight(s, p) {
|
3059 |
+
for (var i = 0; i < highlights.length; ++i) {
|
3060 |
+
var h = highlights[i];
|
3061 |
+
if (h.series == s && h.point[0] == p[0]
|
3062 |
+
&& h.point[1] == p[1])
|
3063 |
+
return i;
|
3064 |
+
}
|
3065 |
+
return -1;
|
3066 |
+
}
|
3067 |
+
|
3068 |
+
function drawPointHighlight(series, point) {
|
3069 |
+
var x = point[0], y = point[1],
|
3070 |
+
axisx = series.xaxis, axisy = series.yaxis,
|
3071 |
+
highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
|
3072 |
+
|
3073 |
+
if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
|
3074 |
+
return;
|
3075 |
+
|
3076 |
+
var pointRadius = series.points.radius + series.points.lineWidth / 2;
|
3077 |
+
octx.lineWidth = pointRadius;
|
3078 |
+
octx.strokeStyle = highlightColor;
|
3079 |
+
var radius = 1.5 * pointRadius;
|
3080 |
+
x = axisx.p2c(x);
|
3081 |
+
y = axisy.p2c(y);
|
3082 |
+
|
3083 |
+
octx.beginPath();
|
3084 |
+
if (series.points.symbol == "circle")
|
3085 |
+
octx.arc(x, y, radius, 0, 2 * Math.PI, false);
|
3086 |
+
else
|
3087 |
+
series.points.symbol(octx, x, y, radius, false);
|
3088 |
+
octx.closePath();
|
3089 |
+
octx.stroke();
|
3090 |
+
}
|
3091 |
+
|
3092 |
+
function drawBarHighlight(series, point) {
|
3093 |
+
var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
|
3094 |
+
fillStyle = highlightColor,
|
3095 |
+
barLeft;
|
3096 |
+
|
3097 |
+
switch (series.bars.align) {
|
3098 |
+
case "left":
|
3099 |
+
barLeft = 0;
|
3100 |
+
break;
|
3101 |
+
case "right":
|
3102 |
+
barLeft = -series.bars.barWidth;
|
3103 |
+
break;
|
3104 |
+
default:
|
3105 |
+
barLeft = -series.bars.barWidth / 2;
|
3106 |
+
}
|
3107 |
+
|
3108 |
+
octx.lineWidth = series.bars.lineWidth;
|
3109 |
+
octx.strokeStyle = highlightColor;
|
3110 |
+
|
3111 |
+
drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
|
3112 |
+
function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
|
3113 |
+
}
|
3114 |
+
|
3115 |
+
function getColorOrGradient(spec, bottom, top, defaultColor) {
|
3116 |
+
if (typeof spec == "string")
|
3117 |
+
return spec;
|
3118 |
+
else {
|
3119 |
+
// assume this is a gradient spec; IE currently only
|
3120 |
+
// supports a simple vertical gradient properly, so that's
|
3121 |
+
// what we support too
|
3122 |
+
var gradient = ctx.createLinearGradient(0, top, 0, bottom);
|
3123 |
+
|
3124 |
+
for (var i = 0, l = spec.colors.length; i < l; ++i) {
|
3125 |
+
var c = spec.colors[i];
|
3126 |
+
if (typeof c != "string") {
|
3127 |
+
var co = $.color.parse(defaultColor);
|
3128 |
+
if (c.brightness != null)
|
3129 |
+
co = co.scale('rgb', c.brightness);
|
3130 |
+
if (c.opacity != null)
|
3131 |
+
co.a *= c.opacity;
|
3132 |
+
c = co.toString();
|
3133 |
+
}
|
3134 |
+
gradient.addColorStop(i / (l - 1), c);
|
3135 |
+
}
|
3136 |
+
|
3137 |
+
return gradient;
|
3138 |
+
}
|
3139 |
+
}
|
3140 |
+
}
|
3141 |
+
|
3142 |
+
// Add the plot function to the top level of the jQuery object
|
3143 |
+
|
3144 |
+
$.plot = function(placeholder, data, options) {
|
3145 |
+
//var t0 = new Date();
|
3146 |
+
var plot = new Plot($(placeholder), data, options, $.plot.plugins);
|
3147 |
+
//(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
|
3148 |
+
return plot;
|
3149 |
+
};
|
3150 |
+
|
3151 |
+
$.plot.version = "0.8.3";
|
3152 |
+
|
3153 |
+
$.plot.plugins = [];
|
3154 |
+
|
3155 |
+
// Also add the plot function as a chainable property
|
3156 |
+
|
3157 |
+
$.fn.plot = function(data, options) {
|
3158 |
+
return this.each(function() {
|
3159 |
+
$.plot(this, data, options);
|
3160 |
+
});
|
3161 |
+
};
|
3162 |
+
|
3163 |
+
// round to nearby lower multiple of base
|
3164 |
+
function floorInBase(n, base) {
|
3165 |
+
return base * Math.floor(n / base);
|
3166 |
+
}
|
3167 |
+
|
3168 |
+
})(jQuery);
|
3169 |
+
|
3170 |
+
/* Pretty handling of time axes.
|
3171 |
+
|
3172 |
+
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
3173 |
+
Licensed under the MIT license.
|
3174 |
+
|
3175 |
+
Set axis.mode to "time" to enable. See the section "Time series data" in
|
3176 |
+
API.txt for details.
|
3177 |
+
|
3178 |
+
*/
|
3179 |
+
|
3180 |
+
(function($) {
|
3181 |
+
|
3182 |
+
var options = {
|
3183 |
+
xaxis: {
|
3184 |
+
timezone: null, // "browser" for local to the client or timezone for timezone-js
|
3185 |
+
timeformat: null, // format string to use
|
3186 |
+
twelveHourClock: false, // 12 or 24 time in time mode
|
3187 |
+
monthNames: null // list of names of months
|
3188 |
+
}
|
3189 |
+
};
|
3190 |
+
|
3191 |
+
// round to nearby lower multiple of base
|
3192 |
+
|
3193 |
+
function floorInBase(n, base) {
|
3194 |
+
return base * Math.floor(n / base);
|
3195 |
+
}
|
3196 |
+
|
3197 |
+
// Returns a string with the date d formatted according to fmt.
|
3198 |
+
// A subset of the Open Group's strftime format is supported.
|
3199 |
+
|
3200 |
+
function formatDate(d, fmt, monthNames, dayNames) {
|
3201 |
+
|
3202 |
+
if (typeof d.strftime == "function") {
|
3203 |
+
return d.strftime(fmt);
|
3204 |
+
}
|
3205 |
+
|
3206 |
+
var leftPad = function(n, pad) {
|
3207 |
+
n = "" + n;
|
3208 |
+
pad = "" + (pad == null ? "0" : pad);
|
3209 |
+
return n.length == 1 ? pad + n : n;
|
3210 |
+
};
|
3211 |
+
|
3212 |
+
var r = [];
|
3213 |
+
var escape = false;
|
3214 |
+
var hours = d.getHours();
|
3215 |
+
var isAM = hours < 12;
|
3216 |
+
|
3217 |
+
if (monthNames == null) {
|
3218 |
+
monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
3219 |
+
}
|
3220 |
+
|
3221 |
+
if (dayNames == null) {
|
3222 |
+
dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
3223 |
+
}
|
3224 |
+
|
3225 |
+
var hours12;
|
3226 |
+
|
3227 |
+
if (hours > 12) {
|
3228 |
+
hours12 = hours - 12;
|
3229 |
+
} else if (hours == 0) {
|
3230 |
+
hours12 = 12;
|
3231 |
+
} else {
|
3232 |
+
hours12 = hours;
|
3233 |
+
}
|
3234 |
+
|
3235 |
+
for (var i = 0; i < fmt.length; ++i) {
|
3236 |
+
|
3237 |
+
var c = fmt.charAt(i);
|
3238 |
+
|
3239 |
+
if (escape) {
|
3240 |
+
switch (c) {
|
3241 |
+
case 'a': c = "" + dayNames[d.getDay()]; break;
|
3242 |
+
case 'b': c = "" + monthNames[d.getMonth()]; break;
|
3243 |
+
case 'd': c = leftPad(d.getDate()); break;
|
3244 |
+
case 'e': c = leftPad(d.getDate(), " "); break;
|
3245 |
+
case 'h': // For back-compat with 0.7; remove in 1.0
|
3246 |
+
case 'H': c = leftPad(hours); break;
|
3247 |
+
case 'I': c = leftPad(hours12); break;
|
3248 |
+
case 'l': c = leftPad(hours12, " "); break;
|
3249 |
+
case 'm': c = leftPad(d.getMonth() + 1); break;
|
3250 |
+
case 'M': c = leftPad(d.getMinutes()); break;
|
3251 |
+
// quarters not in Open Group's strftime specification
|
3252 |
+
case 'q':
|
3253 |
+
c = "" + (Math.floor(d.getMonth() / 3) + 1); break;
|
3254 |
+
case 'S': c = leftPad(d.getSeconds()); break;
|
3255 |
+
case 'y': c = leftPad(d.getFullYear() % 100); break;
|
3256 |
+
case 'Y': c = "" + d.getFullYear(); break;
|
3257 |
+
case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break;
|
3258 |
+
case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break;
|
3259 |
+
case 'w': c = "" + d.getDay(); break;
|
3260 |
+
}
|
3261 |
+
r.push(c);
|
3262 |
+
escape = false;
|
3263 |
+
} else {
|
3264 |
+
if (c == "%") {
|
3265 |
+
escape = true;
|
3266 |
+
} else {
|
3267 |
+
r.push(c);
|
3268 |
+
}
|
3269 |
+
}
|
3270 |
+
}
|
3271 |
+
|
3272 |
+
return r.join("");
|
3273 |
+
}
|
3274 |
+
|
3275 |
+
// To have a consistent view of time-based data independent of which time
|
3276 |
+
// zone the client happens to be in we need a date-like object independent
|
3277 |
+
// of time zones. This is done through a wrapper that only calls the UTC
|
3278 |
+
// versions of the accessor methods.
|
3279 |
+
|
3280 |
+
function makeUtcWrapper(d) {
|
3281 |
+
|
3282 |
+
function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {
|
3283 |
+
sourceObj[sourceMethod] = function() {
|
3284 |
+
return targetObj[targetMethod].apply(targetObj, arguments);
|
3285 |
+
};
|
3286 |
+
};
|
3287 |
+
|
3288 |
+
var utc = {
|
3289 |
+
date: d
|
3290 |
+
};
|
3291 |
+
|
3292 |
+
// support strftime, if found
|
3293 |
+
|
3294 |
+
if (d.strftime != undefined) {
|
3295 |
+
addProxyMethod(utc, "strftime", d, "strftime");
|
3296 |
+
}
|
3297 |
+
|
3298 |
+
addProxyMethod(utc, "getTime", d, "getTime");
|
3299 |
+
addProxyMethod(utc, "setTime", d, "setTime");
|
3300 |
+
|
3301 |
+
var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"];
|
3302 |
+
|
3303 |
+
for (var p = 0; p < props.length; p++) {
|
3304 |
+
addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]);
|
3305 |
+
addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]);
|
3306 |
+
}
|
3307 |
+
|
3308 |
+
return utc;
|
3309 |
+
};
|
3310 |
+
|
3311 |
+
// select time zone strategy. This returns a date-like object tied to the
|
3312 |
+
// desired timezone
|
3313 |
+
|
3314 |
+
function dateGenerator(ts, opts) {
|
3315 |
+
if (opts.timezone == "browser") {
|
3316 |
+
return new Date(ts);
|
3317 |
+
} else if (!opts.timezone || opts.timezone == "utc") {
|
3318 |
+
return makeUtcWrapper(new Date(ts));
|
3319 |
+
} else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") {
|
3320 |
+
var d = new timezoneJS.Date();
|
3321 |
+
// timezone-js is fickle, so be sure to set the time zone before
|
3322 |
+
// setting the time.
|
3323 |
+
d.setTimezone(opts.timezone);
|
3324 |
+
d.setTime(ts);
|
3325 |
+
return d;
|
3326 |
+
} else {
|
3327 |
+
return makeUtcWrapper(new Date(ts));
|
3328 |
+
}
|
3329 |
+
}
|
3330 |
+
|
3331 |
+
// map of app. size of time units in milliseconds
|
3332 |
+
|
3333 |
+
var timeUnitSize = {
|
3334 |
+
"second": 1000,
|
3335 |
+
"minute": 60 * 1000,
|
3336 |
+
"hour": 60 * 60 * 1000,
|
3337 |
+
"day": 24 * 60 * 60 * 1000,
|
3338 |
+
"month": 30 * 24 * 60 * 60 * 1000,
|
3339 |
+
"quarter": 3 * 30 * 24 * 60 * 60 * 1000,
|
3340 |
+
"year": 365.2425 * 24 * 60 * 60 * 1000
|
3341 |
+
};
|
3342 |
+
|
3343 |
+
// the allowed tick sizes, after 1 year we use
|
3344 |
+
// an integer algorithm
|
3345 |
+
|
3346 |
+
var baseSpec = [
|
3347 |
+
[1, "second"], [2, "second"], [5, "second"], [10, "second"],
|
3348 |
+
[30, "second"],
|
3349 |
+
[1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"],
|
3350 |
+
[30, "minute"],
|
3351 |
+
[1, "hour"], [2, "hour"], [4, "hour"],
|
3352 |
+
[8, "hour"], [12, "hour"],
|
3353 |
+
[1, "day"], [2, "day"], [3, "day"],
|
3354 |
+
[0.25, "month"], [0.5, "month"], [1, "month"],
|
3355 |
+
[2, "month"]
|
3356 |
+
];
|
3357 |
+
|
3358 |
+
// we don't know which variant(s) we'll need yet, but generating both is
|
3359 |
+
// cheap
|
3360 |
+
|
3361 |
+
var specMonths = baseSpec.concat([[3, "month"], [6, "month"],
|
3362 |
+
[1, "year"]]);
|
3363 |
+
var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"],
|
3364 |
+
[1, "year"]]);
|
3365 |
+
|
3366 |
+
function init(plot) {
|
3367 |
+
plot.hooks.processOptions.push(function (plot, options) {
|
3368 |
+
$.each(plot.getAxes(), function(axisName, axis) {
|
3369 |
+
|
3370 |
+
var opts = axis.options;
|
3371 |
+
|
3372 |
+
if (opts.mode == "time") {
|
3373 |
+
axis.tickGenerator = function(axis) {
|
3374 |
+
|
3375 |
+
var ticks = [];
|
3376 |
+
var d = dateGenerator(axis.min, opts);
|
3377 |
+
var minSize = 0;
|
3378 |
+
|
3379 |
+
// make quarter use a possibility if quarters are
|
3380 |
+
// mentioned in either of these options
|
3381 |
+
|
3382 |
+
var spec = (opts.tickSize && opts.tickSize[1] ===
|
3383 |
+
"quarter") ||
|
3384 |
+
(opts.minTickSize && opts.minTickSize[1] ===
|
3385 |
+
"quarter") ? specQuarters : specMonths;
|
3386 |
+
|
3387 |
+
if (opts.minTickSize != null) {
|
3388 |
+
if (typeof opts.tickSize == "number") {
|
3389 |
+
minSize = opts.tickSize;
|
3390 |
+
} else {
|
3391 |
+
minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];
|
3392 |
+
}
|
3393 |
+
}
|
3394 |
+
|
3395 |
+
for (var i = 0; i < spec.length - 1; ++i) {
|
3396 |
+
if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]
|
3397 |
+
+ spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2
|
3398 |
+
&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {
|
3399 |
+
break;
|
3400 |
+
}
|
3401 |
+
}
|
3402 |
+
|
3403 |
+
var size = spec[i][0];
|
3404 |
+
var unit = spec[i][1];
|
3405 |
+
|
3406 |
+
// special-case the possibility of several years
|
3407 |
+
|
3408 |
+
if (unit == "year") {
|
3409 |
+
|
3410 |
+
// if given a minTickSize in years, just use it,
|
3411 |
+
// ensuring that it's an integer
|
3412 |
+
|
3413 |
+
if (opts.minTickSize != null && opts.minTickSize[1] == "year") {
|
3414 |
+
size = Math.floor(opts.minTickSize[0]);
|
3415 |
+
} else {
|
3416 |
+
|
3417 |
+
var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));
|
3418 |
+
var norm = (axis.delta / timeUnitSize.year) / magn;
|
3419 |
+
|
3420 |
+
if (norm < 1.5) {
|
3421 |
+
size = 1;
|
3422 |
+
} else if (norm < 3) {
|
3423 |
+
size = 2;
|
3424 |
+
} else if (norm < 7.5) {
|
3425 |
+
size = 5;
|
3426 |
+
} else {
|
3427 |
+
size = 10;
|
3428 |
+
}
|
3429 |
+
|
3430 |
+
size *= magn;
|
3431 |
+
}
|
3432 |
+
|
3433 |
+
// minimum size for years is 1
|
3434 |
+
|
3435 |
+
if (size < 1) {
|
3436 |
+
size = 1;
|
3437 |
+
}
|
3438 |
+
}
|
3439 |
+
|
3440 |
+
axis.tickSize = opts.tickSize || [size, unit];
|
3441 |
+
var tickSize = axis.tickSize[0];
|
3442 |
+
unit = axis.tickSize[1];
|
3443 |
+
|
3444 |
+
var step = tickSize * timeUnitSize[unit];
|
3445 |
+
|
3446 |
+
if (unit == "second") {
|
3447 |
+
d.setSeconds(floorInBase(d.getSeconds(), tickSize));
|
3448 |
+
} else if (unit == "minute") {
|
3449 |
+
d.setMinutes(floorInBase(d.getMinutes(), tickSize));
|
3450 |
+
} else if (unit == "hour") {
|
3451 |
+
d.setHours(floorInBase(d.getHours(), tickSize));
|
3452 |
+
} else if (unit == "month") {
|
3453 |
+
d.setMonth(floorInBase(d.getMonth(), tickSize));
|
3454 |
+
} else if (unit == "quarter") {
|
3455 |
+
d.setMonth(3 * floorInBase(d.getMonth() / 3,
|
3456 |
+
tickSize));
|
3457 |
+
} else if (unit == "year") {
|
3458 |
+
d.setFullYear(floorInBase(d.getFullYear(), tickSize));
|
3459 |
+
}
|
3460 |
+
|
3461 |
+
// reset smaller components
|
3462 |
+
|
3463 |
+
d.setMilliseconds(0);
|
3464 |
+
|
3465 |
+
if (step >= timeUnitSize.minute) {
|
3466 |
+
d.setSeconds(0);
|
3467 |
+
}
|
3468 |
+
if (step >= timeUnitSize.hour) {
|
3469 |
+
d.setMinutes(0);
|
3470 |
+
}
|
3471 |
+
if (step >= timeUnitSize.day) {
|
3472 |
+
d.setHours(0);
|
3473 |
+
}
|
3474 |
+
if (step >= timeUnitSize.day * 4) {
|
3475 |
+
d.setDate(1);
|
3476 |
+
}
|
3477 |
+
if (step >= timeUnitSize.month * 2) {
|
3478 |
+
d.setMonth(floorInBase(d.getMonth(), 3));
|
3479 |
+
}
|
3480 |
+
if (step >= timeUnitSize.quarter * 2) {
|
3481 |
+
d.setMonth(floorInBase(d.getMonth(), 6));
|
3482 |
+
}
|
3483 |
+
if (step >= timeUnitSize.year) {
|
3484 |
+
d.setMonth(0);
|
3485 |
+
}
|
3486 |
+
|
3487 |
+
var carry = 0;
|
3488 |
+
var v = Number.NaN;
|
3489 |
+
var prev;
|
3490 |
+
|
3491 |
+
do {
|
3492 |
+
|
3493 |
+
prev = v;
|
3494 |
+
v = d.getTime();
|
3495 |
+
ticks.push(v);
|
3496 |
+
|
3497 |
+
if (unit == "month" || unit == "quarter") {
|
3498 |
+
if (tickSize < 1) {
|
3499 |
+
|
3500 |
+
// a bit complicated - we'll divide the
|
3501 |
+
// month/quarter up but we need to take
|
3502 |
+
// care of fractions so we don't end up in
|
3503 |
+
// the middle of a day
|
3504 |
+
|
3505 |
+
d.setDate(1);
|
3506 |
+
var start = d.getTime();
|
3507 |
+
d.setMonth(d.getMonth() +
|
3508 |
+
(unit == "quarter" ? 3 : 1));
|
3509 |
+
var end = d.getTime();
|
3510 |
+
d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);
|
3511 |
+
carry = d.getHours();
|
3512 |
+
d.setHours(0);
|
3513 |
+
} else {
|
3514 |
+
d.setMonth(d.getMonth() +
|
3515 |
+
tickSize * (unit == "quarter" ? 3 : 1));
|
3516 |
+
}
|
3517 |
+
} else if (unit == "year") {
|
3518 |
+
d.setFullYear(d.getFullYear() + tickSize);
|
3519 |
+
} else {
|
3520 |
+
d.setTime(v + step);
|
3521 |
+
}
|
3522 |
+
} while (v < axis.max && v != prev);
|
3523 |
+
|
3524 |
+
return ticks;
|
3525 |
+
};
|
3526 |
+
|
3527 |
+
axis.tickFormatter = function (v, axis) {
|
3528 |
+
|
3529 |
+
var d = dateGenerator(v, axis.options);
|
3530 |
+
|
3531 |
+
// first check global format
|
3532 |
+
|
3533 |
+
if (opts.timeformat != null) {
|
3534 |
+
return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);
|
3535 |
+
}
|
3536 |
+
|
3537 |
+
// possibly use quarters if quarters are mentioned in
|
3538 |
+
// any of these places
|
3539 |
+
|
3540 |
+
var useQuarters = (axis.options.tickSize &&
|
3541 |
+
axis.options.tickSize[1] == "quarter") ||
|
3542 |
+
(axis.options.minTickSize &&
|
3543 |
+
axis.options.minTickSize[1] == "quarter");
|
3544 |
+
|
3545 |
+
var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];
|
3546 |
+
var span = axis.max - axis.min;
|
3547 |
+
var suffix = (opts.twelveHourClock) ? " %p" : "";
|
3548 |
+
var hourCode = (opts.twelveHourClock) ? "%I" : "%H";
|
3549 |
+
var fmt;
|
3550 |
+
|
3551 |
+
if (t < timeUnitSize.minute) {
|
3552 |
+
fmt = hourCode + ":%M:%S" + suffix;
|
3553 |
+
} else if (t < timeUnitSize.day) {
|
3554 |
+
if (span < 2 * timeUnitSize.day) {
|
3555 |
+
fmt = hourCode + ":%M" + suffix;
|
3556 |
+
} else {
|
3557 |
+
fmt = "%b %d " + hourCode + ":%M" + suffix;
|
3558 |
+
}
|
3559 |
+
} else if (t < timeUnitSize.month) {
|
3560 |
+
fmt = "%b %d";
|
3561 |
+
} else if ((useQuarters && t < timeUnitSize.quarter) ||
|
3562 |
+
(!useQuarters && t < timeUnitSize.year)) {
|
3563 |
+
if (span < timeUnitSize.year) {
|
3564 |
+
fmt = "%b";
|
3565 |
+
} else {
|
3566 |
+
fmt = "%b %Y";
|
3567 |
+
}
|
3568 |
+
} else if (useQuarters && t < timeUnitSize.year) {
|
3569 |
+
if (span < timeUnitSize.year) {
|
3570 |
+
fmt = "Q%q";
|
3571 |
+
} else {
|
3572 |
+
fmt = "Q%q %Y";
|
3573 |
+
}
|
3574 |
+
} else {
|
3575 |
+
fmt = "%Y";
|
3576 |
+
}
|
3577 |
+
|
3578 |
+
var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);
|
3579 |
+
|
3580 |
+
return rt;
|
3581 |
+
};
|
3582 |
+
}
|
3583 |
+
});
|
3584 |
+
});
|
3585 |
+
}
|
3586 |
+
|
3587 |
+
$.plot.plugins.push({
|
3588 |
+
init: init,
|
3589 |
+
options: options,
|
3590 |
+
name: 'time',
|
3591 |
+
version: '1.0'
|
3592 |
+
});
|
3593 |
+
|
3594 |
+
// Time-axis support used to be in Flot core, which exposed the
|
3595 |
+
// formatDate function on the plot object. Various plugins depend
|
3596 |
+
// on the function, so we need to re-expose it here.
|
3597 |
+
|
3598 |
+
$.plot.formatDate = formatDate;
|
3599 |
+
$.plot.dateGenerator = dateGenerator;
|
3600 |
+
|
3601 |
+
})(jQuery);
|
assets/admin/scripts/jquery-jvectormap-1.2.2.min.js
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* jVectorMap version 1.2.2
|
3 |
+
*
|
4 |
+
* Copyright 2011-2013, Kirill Lebedev
|
5 |
+
* Licensed under the MIT license.
|
6 |
+
*
|
7 |
+
*/(function(e){var t={set:{colors:1,values:1,backgroundColor:1,scaleColors:1,normalizeFunction:1,focus:1},get:{selectedRegions:1,selectedMarkers:1,mapObject:1,regionName:1}};e.fn.vectorMap=function(e){var n,r,i,n=this.children(".jvectormap-container").data("mapObject");if(e==="addMap")jvm.WorldMap.maps[arguments[1]]=arguments[2];else{if(!(e!=="set"&&e!=="get"||!t[e][arguments[1]]))return r=arguments[1].charAt(0).toUpperCase()+arguments[1].substr(1),n[e+r].apply(n,Array.prototype.slice.call(arguments,2));e=e||{},e.container=this,n=new jvm.WorldMap(e)}return this}})(jQuery),function(e){function r(t){var n=t||window.event,r=[].slice.call(arguments,1),i=0,s=!0,o=0,u=0;return t=e.event.fix(n),t.type="mousewheel",n.wheelDelta&&(i=n.wheelDelta/120),n.detail&&(i=-n.detail/3),u=i,n.axis!==undefined&&n.axis===n.HORIZONTAL_AXIS&&(u=0,o=-1*i),n.wheelDeltaY!==undefined&&(u=n.wheelDeltaY/120),n.wheelDeltaX!==undefined&&(o=-1*n.wheelDeltaX/120),r.unshift(t,i,o,u),(e.event.dispatch||e.event.handle).apply(this,r)}var t=["DOMMouseScroll","mousewheel"];if(e.event.fixHooks)for(var n=t.length;n;)e.event.fixHooks[t[--n]]=e.event.mouseHooks;e.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],r,!1);else this.onmousewheel=r},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],r,!1);else this.onmousewheel=null}},e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}(jQuery);var jvm={inherits:function(e,t){function n(){}n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e,e.parentClass=t},mixin:function(e,t){var n;for(n in t.prototype)t.prototype.hasOwnProperty(n)&&(e.prototype[n]=t.prototype[n])},min:function(e){var t=Number.MAX_VALUE,n;if(e instanceof Array)for(n=0;n<e.length;n++)e[n]<t&&(t=e[n]);else for(n in e)e[n]<t&&(t=e[n]);return t},max:function(e){var t=Number.MIN_VALUE,n;if(e instanceof Array)for(n=0;n<e.length;n++)e[n]>t&&(t=e[n]);else for(n in e)e[n]>t&&(t=e[n]);return t},keys:function(e){var t=[],n;for(n in e)t.push(n);return t},values:function(e){var t=[],n,r;for(r=0;r<arguments.length;r++){e=arguments[r];for(n in e)t.push(e[n])}return t}};jvm.$=jQuery,jvm.AbstractElement=function(e,t){this.node=this.createElement(e),this.name=e,this.properties={},t&&this.set(t)},jvm.AbstractElement.prototype.set=function(e,t){var n;if(typeof e=="object")for(n in e)this.properties[n]=e[n],this.applyAttr(n,e[n]);else this.properties[e]=t,this.applyAttr(e,t)},jvm.AbstractElement.prototype.get=function(e){return this.properties[e]},jvm.AbstractElement.prototype.applyAttr=function(e,t){this.node.setAttribute(e,t)},jvm.AbstractElement.prototype.remove=function(){jvm.$(this.node).remove()},jvm.AbstractCanvasElement=function(e,t,n){this.container=e,this.setSize(t,n),this.rootElement=new jvm[this.classPrefix+"GroupElement"],this.node.appendChild(this.rootElement.node),this.container.appendChild(this.node)},jvm.AbstractCanvasElement.prototype.add=function(e,t){t=t||this.rootElement,t.add(e),e.canvas=this},jvm.AbstractCanvasElement.prototype.addPath=function(e,t,n){var r=new jvm[this.classPrefix+"PathElement"](e,t);return this.add(r,n),r},jvm.AbstractCanvasElement.prototype.addCircle=function(e,t,n){var r=new jvm[this.classPrefix+"CircleElement"](e,t);return this.add(r,n),r},jvm.AbstractCanvasElement.prototype.addGroup=function(e){var t=new jvm[this.classPrefix+"GroupElement"];return e?e.node.appendChild(t.node):this.node.appendChild(t.node),t.canvas=this,t},jvm.AbstractShapeElement=function(e,t,n){this.style=n||{},this.style.current={},this.isHovered=!1,this.isSelected=!1,this.updateStyle()},jvm.AbstractShapeElement.prototype.setHovered=function(e){this.isHovered!==e&&(this.isHovered=e,this.updateStyle())},jvm.AbstractShapeElement.prototype.setSelected=function(e){this.isSelected!==e&&(this.isSelected=e,this.updateStyle(),jvm.$(this.node).trigger("selected",[e]))},jvm.AbstractShapeElement.prototype.setStyle=function(e,t){var n={};typeof e=="object"?n=e:n[e]=t,jvm.$.extend(this.style.current,n),this.updateStyle()},jvm.AbstractShapeElement.prototype.updateStyle=function(){var e={};jvm.AbstractShapeElement.mergeStyles(e,this.style.initial),jvm.AbstractShapeElement.mergeStyles(e,this.style.current),this.isHovered&&jvm.AbstractShapeElement.mergeStyles(e,this.style.hover),this.isSelected&&(jvm.AbstractShapeElement.mergeStyles(e,this.style.selected),this.isHovered&&jvm.AbstractShapeElement.mergeStyles(e,this.style.selectedHover)),this.set(e)},jvm.AbstractShapeElement.mergeStyles=function(e,t){var n;t=t||{};for(n in t)t[n]===null?delete e[n]:e[n]=t[n]},jvm.SVGElement=function(e,t){jvm.SVGElement.parentClass.apply(this,arguments)},jvm.inherits(jvm.SVGElement,jvm.AbstractElement),jvm.SVGElement.svgns="http://www.w3.org/2000/svg",jvm.SVGElement.prototype.createElement=function(e){return document.createElementNS(jvm.SVGElement.svgns,e)},jvm.SVGElement.prototype.addClass=function(e){this.node.setAttribute("class",e)},jvm.SVGElement.prototype.getElementCtr=function(e){return jvm["SVG"+e]},jvm.SVGElement.prototype.getBBox=function(){return this.node.getBBox()},jvm.SVGGroupElement=function(){jvm.SVGGroupElement.parentClass.call(this,"g")},jvm.inherits(jvm.SVGGroupElement,jvm.SVGElement),jvm.SVGGroupElement.prototype.add=function(e){this.node.appendChild(e.node)},jvm.SVGCanvasElement=function(e,t,n){this.classPrefix="SVG",jvm.SVGCanvasElement.parentClass.call(this,"svg"),jvm.AbstractCanvasElement.apply(this,arguments)},jvm.inherits(jvm.SVGCanvasElement,jvm.SVGElement),jvm.mixin(jvm.SVGCanvasElement,jvm.AbstractCanvasElement),jvm.SVGCanvasElement.prototype.setSize=function(e,t){this.width=e,this.height=t,this.node.setAttribute("width",e),this.node.setAttribute("height",t)},jvm.SVGCanvasElement.prototype.applyTransformParams=function(e,t,n){this.scale=e,this.transX=t,this.transY=n,this.rootElement.node.setAttribute("transform","scale("+e+") translate("+t+", "+n+")")},jvm.SVGShapeElement=function(e,t,n){jvm.SVGShapeElement.parentClass.call(this,e,t),jvm.AbstractShapeElement.apply(this,arguments)},jvm.inherits(jvm.SVGShapeElement,jvm.SVGElement),jvm.mixin(jvm.SVGShapeElement,jvm.AbstractShapeElement),jvm.SVGPathElement=function(e,t){jvm.SVGPathElement.parentClass.call(this,"path",e,t),this.node.setAttribute("fill-rule","evenodd")},jvm.inherits(jvm.SVGPathElement,jvm.SVGShapeElement),jvm.SVGCircleElement=function(e,t){jvm.SVGCircleElement.parentClass.call(this,"circle",e,t)},jvm.inherits(jvm.SVGCircleElement,jvm.SVGShapeElement),jvm.VMLElement=function(e,t){jvm.VMLElement.VMLInitialized||jvm.VMLElement.initializeVML(),jvm.VMLElement.parentClass.apply(this,arguments)},jvm.inherits(jvm.VMLElement,jvm.AbstractElement),jvm.VMLElement.VMLInitialized=!1,jvm.VMLElement.initializeVML=function(){try{document.namespaces.rvml||document.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),jvm.VMLElement.prototype.createElement=function(e){return document.createElement("<rvml:"+e+' class="rvml">')}}catch(e){jvm.VMLElement.prototype.createElement=function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}document.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"),jvm.VMLElement.VMLInitialized=!0},jvm.VMLElement.prototype.getElementCtr=function(e){return jvm["VML"+e]},jvm.VMLElement.prototype.addClass=function(e){jvm.$(this.node).addClass(e)},jvm.VMLElement.prototype.applyAttr=function(e,t){this.node[e]=t},jvm.VMLElement.prototype.getBBox=function(){var e=jvm.$(this.node);return{x:e.position().left/this.canvas.scale,y:e.position().top/this.canvas.scale,width:e.width()/this.canvas.scale,height:e.height()/this.canvas.scale}},jvm.VMLGroupElement=function(){jvm.VMLGroupElement.parentClass.call(this,"group"),this.node.style.left="0px",this.node.style.top="0px",this.node.coordorigin="0 0"},jvm.inherits(jvm.VMLGroupElement,jvm.VMLElement),jvm.VMLGroupElement.prototype.add=function(e){this.node.appendChild(e.node)},jvm.VMLCanvasElement=function(e,t,n){this.classPrefix="VML",jvm.VMLCanvasElement.parentClass.call(this,"group"),jvm.AbstractCanvasElement.apply(this,arguments),this.node.style.position="absolute"},jvm.inherits(jvm.VMLCanvasElement,jvm.VMLElement),jvm.mixin(jvm.VMLCanvasElement,jvm.AbstractCanvasElement),jvm.VMLCanvasElement.prototype.setSize=function(e,t){var n,r,i,s;this.width=e,this.height=t,this.node.style.width=e+"px",this.node.style.height=t+"px",this.node.coordsize=e+" "+t,this.node.coordorigin="0 0";if(this.rootElement){n=this.rootElement.node.getElementsByTagName("shape");for(i=0,s=n.length;i<s;i++)n[i].coordsize=e+" "+t,n[i].style.width=e+"px",n[i].style.height=t+"px";r=this.node.getElementsByTagName("group");for(i=0,s=r.length;i<s;i++)r[i].coordsize=e+" "+t,r[i].style.width=e+"px",r[i].style.height=t+"px"}},jvm.VMLCanvasElement.prototype.applyTransformParams=function(e,t,n){this.scale=e,this.transX=t,this.transY=n,this.rootElement.node.coordorigin=this.width-t-this.width/100+","+(this.height-n-this.height/100),this.rootElement.node.coordsize=this.width/e+","+this.height/e},jvm.VMLShapeElement=function(e,t){jvm.VMLShapeElement.parentClass.call(this,e,t),this.fillElement=new jvm.VMLElement("fill"),this.strokeElement=new jvm.VMLElement("stroke"),this.node.appendChild(this.fillElement.node),this.node.appendChild(this.strokeElement.node),this.node.stroked=!1,jvm.AbstractShapeElement.apply(this,arguments)},jvm.inherits(jvm.VMLShapeElement,jvm.VMLElement),jvm.mixin(jvm.VMLShapeElement,jvm.AbstractShapeElement),jvm.VMLShapeElement.prototype.applyAttr=function(e,t){switch(e){case"fill":this.node.fillcolor=t;break;case"fill-opacity":this.fillElement.node.opacity=Math.round(t*100)+"%";break;case"stroke":t==="none"?this.node.stroked=!1:this.node.stroked=!0,this.node.strokecolor=t;break;case"stroke-opacity":this.strokeElement.node.opacity=Math.round(t*100)+"%";break;case"stroke-width":parseInt(t,10)===0?this.node.stroked=!1:this.node.stroked=!0,this.node.strokeweight=t;break;case"d":this.node.path=jvm.VMLPathElement.pathSvgToVml(t);break;default:jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this,arguments)}},jvm.VMLPathElement=function(e,t){var n=new jvm.VMLElement("skew");jvm.VMLPathElement.parentClass.call(this,"shape",e,t),this.node.coordorigin="0 0",n.node.on=!0,n.node.matrix="0.01,0,0,0.01,0,0",n.node.offset="0,0",this.node.appendChild(n.node)},jvm.inherits(jvm.VMLPathElement,jvm.VMLShapeElement),jvm.VMLPathElement.prototype.applyAttr=function(e,t){e==="d"?this.node.path=jvm.VMLPathElement.pathSvgToVml(t):jvm.VMLShapeElement.prototype.applyAttr.call(this,e,t)},jvm.VMLPathElement.pathSvgToVml=function(e){var t="",n=0,r=0,i,s;return e=e.replace(/(-?\d+)e(-?\d+)/g,"0"),e.replace(/([MmLlHhVvCcSs])\s*((?:-?\d*(?:\.\d+)?\s*,?\s*)+)/g,function(e,t,o,u){o=o.replace(/(\d)-/g,"$1,-").replace(/^\s+/g,"").replace(/\s+$/g,"").replace(/\s+/g,",").split(","),o[0]||o.shift();for(var a=0,f=o.length;a<f;a++)o[a]=Math.round(100*o[a]);switch(t){case"m":return n+=o[0],r+=o[1],"t"+o.join(",");case"M":return n=o[0],r=o[1],"m"+o.join(",");case"l":return n+=o[0],r+=o[1],"r"+o.join(",");case"L":return n=o[0],r=o[1],"l"+o.join(",");case"h":return n+=o[0],"r"+o[0]+",0";case"H":return n=o[0],"l"+n+","+r;case"v":return r+=o[0],"r0,"+o[0];case"V":return r=o[0],"l"+n+","+r;case"c":return i=n+o[o.length-4],s=r+o[o.length-3],n+=o[o.length-2],r+=o[o.length-1],"v"+o.join(",");case"C":return i=o[o.length-4],s=o[o.length-3],n=o[o.length-2],r=o[o.length-1],"c"+o.join(",");case"s":return o.unshift(r-s),o.unshift(n-i),i=n+o[o.length-4],s=r+o[o.length-3],n+=o[o.length-2],r+=o[o.length-1],"v"+o.join(",");case"S":return o.unshift(r+r-s),o.unshift(n+n-i),i=o[o.length-4],s=o[o.length-3],n=o[o.length-2],r=o[o.length-1],"c"+o.join(",")}return""}).replace(/z/g,"e")},jvm.VMLCircleElement=function(e,t){jvm.VMLCircleElement.parentClass.call(this,"oval",e,t)},jvm.inherits(jvm.VMLCircleElement,jvm.VMLShapeElement),jvm.VMLCircleElement.prototype.applyAttr=function(e,t){switch(e){case"r":this.node.style.width=t*2+"px",this.node.style.height=t*2+"px",this.applyAttr("cx",this.get("cx")||0),this.applyAttr("cy",this.get("cy")||0);break;case"cx":if(!t)return;this.node.style.left=t-(this.get("r")||0)+"px";break;case"cy":if(!t)return;this.node.style.top=t-(this.get("r")||0)+"px";break;default:jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this,e,t)}},jvm.VectorCanvas=function(e,t,n){return this.mode=window.SVGAngle?"svg":"vml",this.mode=="svg"?this.impl=new jvm.SVGCanvasElement(e,t,n):this.impl=new jvm.VMLCanvasElement(e,t,n),this.impl},jvm.SimpleScale=function(e){this.scale=e},jvm.SimpleScale.prototype.getValue=function(e){return e},jvm.OrdinalScale=function(e){this.scale=e},jvm.OrdinalScale.prototype.getValue=function(e){return this.scale[e]},jvm.NumericScale=function(e,t,n,r){this.scale=[],t=t||"linear",e&&this.setScale(e),t&&this.setNormalizeFunction(t),n&&this.setMin(n),r&&this.setMax(r)},jvm.NumericScale.prototype={setMin:function(e){this.clearMinValue=e,typeof this.normalize=="function"?this.minValue=this.normalize(e):this.minValue=e},setMax:function(e){this.clearMaxValue=e,typeof this.normalize=="function"?this.maxValue=this.normalize(e):this.maxValue=e},setScale:function(e){var t;for(t=0;t<e.length;t++)this.scale[t]=[e[t]]},setNormalizeFunction:function(e){e==="polynomial"?this.normalize=function(e){return Math.pow(e,.2)}:e==="linear"?delete this.normalize:this.normalize=e,this.setMin(this.clearMinValue),this.setMax(this.clearMaxValue)},getValue:function(e){var t=[],n=0,r,i=0,s;typeof this.normalize=="function"&&(e=this.normalize(e));for(i=0;i<this.scale.length-1;i++)r=this.vectorLength(this.vectorSubtract(this.scale[i+1],this.scale[i])),t.push(r),n+=r;s=(this.maxValue-this.minValue)/n;for(i=0;i<t.length;i++)t[i]*=s;i=0,e-=this.minValue;while(e-t[i]>=0)e-=t[i],i++;return i==this.scale.length-1?e=this.vectorToNum(this.scale[i]):e=this.vectorToNum(this.vectorAdd(this.scale[i],this.vectorMult(this.vectorSubtract(this.scale[i+1],this.scale[i]),e/t[i]))),e},vectorToNum:function(e){var t=0,n;for(n=0;n<e.length;n++)t+=Math.round(e[n])*Math.pow(256,e.length-n-1);return t},vectorSubtract:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]-t[r];return n},vectorAdd:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]+t[r];return n},vectorMult:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]*t;return n},vectorLength:function(e){var t=0,n;for(n=0;n<e.length;n++)t+=e[n]*e[n];return Math.sqrt(t)}},jvm.ColorScale=function(e,t,n,r){jvm.ColorScale.parentClass.apply(this,arguments)},jvm.inherits(jvm.ColorScale,jvm.NumericScale),jvm.ColorScale.prototype.setScale=function(e){var t;for(t=0;t<e.length;t++)this.scale[t]=jvm.ColorScale.rgbToArray(e[t])},jvm.ColorScale.prototype.getValue=function(e){return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this,e))},jvm.ColorScale.arrayToRgb=function(e){var t="#",n,r;for(r=0;r<e.length;r++)n=e[r].toString(16),t+=n.length==1?"0"+n:n;return t},jvm.ColorScale.numToRgb=function(e){e=e.toString(16);while(e.length<6)e="0"+e;return"#"+e},jvm.ColorScale.rgbToArray=function(e){return e=e.substr(1),[parseInt(e.substr(0,2),16),parseInt(e.substr(2,2),16),parseInt(e.substr(4,2),16)]},jvm.DataSeries=function(e,t){var n;e=e||{},e.attribute=e.attribute||"fill",this.elements=t,this.params=e,e.attributes&&this.setAttributes(e.attributes),jvm.$.isArray(e.scale)?(n=e.attribute==="fill"||e.attribute==="stroke"?jvm.ColorScale:jvm.NumericScale,this.scale=new n(e.scale,e.normalizeFunction,e.min,e.max)):e.scale?this.scale=new jvm.OrdinalScale(e.scale):this.scale=new jvm.SimpleScale(e.scale),this.values=e.values||{},this.setValues(this.values)},jvm.DataSeries.prototype={setAttributes:function(e,t){var n=e,r;if(typeof e=="string")this.elements[e]&&this.elements[e].setStyle(this.params.attribute,t);else for(r in n)this.elements[r]&&this.elements[r].element.setStyle(this.params.attribute,n[r])},setValues:function(e){var t=Number.MIN_VALUE,n=Number.MAX_VALUE,r,i,s={};if(this.scale instanceof jvm.OrdinalScale||this.scale instanceof jvm.SimpleScale)for(i in e)e[i]?s[i]=this.scale.getValue(e[i]):s[i]=this.elements[i].element.style.initial[this.params.attribute];else{if(!this.params.min||!this.params.max){for(i in e)r=parseFloat(e[i]),r>t&&(t=e[i]),r<n&&(n=r);this.params.min||this.scale.setMin(n),this.params.max||this.scale.setMax(t),this.params.min=n,this.params.max=t}for(i in e)r=parseFloat(e[i]),isNaN(r)?s[i]=this.elements[i].element.style.initial[this.params.attribute]:s[i]=this.scale.getValue(r)}this.setAttributes(s),jvm.$.extend(this.values,e)},clear:function(){var e,t={};for(e in this.values)this.elements[e]&&(t[e]=this.elements[e].element.style.initial[this.params.attribute]);this.setAttributes(t),this.values={}},setScale:function(e){this.scale.setScale(e),this.values&&this.setValues(this.values)},setNormalizeFunction:function(e){this.scale.setNormalizeFunction(e),this.values&&this.setValues(this.values)}},jvm.Proj={degRad:180/Math.PI,radDeg:Math.PI/180,radius:6381372,sgn:function(e){return e>0?1:e<0?-1:e},mill:function(e,t,n){return{x:this.radius*(t-n)*this.radDeg,y:-this.radius*Math.log(Math.tan((45+.4*e)*this.radDeg))/.8}},mill_inv:function(e,t,n){return{lat:(2.5*Math.atan(Math.exp(.8*t/this.radius))-5*Math.PI/8)*this.degRad,lng:(n*this.radDeg+e/this.radius)*this.degRad}},merc:function(e,t,n){return{x:this.radius*(t-n)*this.radDeg,y:-this.radius*Math.log(Math.tan(Math.PI/4+e*Math.PI/360))}},merc_inv:function(e,t,n){return{lat:(2*Math.atan(Math.exp(t/this.radius))-Math.PI/2)*this.degRad,lng:(n*this.radDeg+e/this.radius)*this.degRad}},aea:function(e,t,n){var r=0,i=n*this.radDeg,s=29.5*this.radDeg,o=45.5*this.radDeg,u=e*this.radDeg,a=t*this.radDeg,f=(Math.sin(s)+Math.sin(o))/2,l=Math.cos(s)*Math.cos(s)+2*f*Math.sin(s),c=f*(a-i),h=Math.sqrt(l-2*f*Math.sin(u))/f,p=Math.sqrt(l-2*f*Math.sin(r))/f;return{x:h*Math.sin(c)*this.radius,y:-(p-h*Math.cos(c))*this.radius}},aea_inv:function(e,t,n){var r=e/this.radius,i=t/this.radius,s=0,o=n*this.radDeg,u=29.5*this.radDeg,a=45.5*this.radDeg,f=(Math.sin(u)+Math.sin(a))/2,l=Math.cos(u)*Math.cos(u)+2*f*Math.sin(u),c=Math.sqrt(l-2*f*Math.sin(s))/f,h=Math.sqrt(r*r+(c-i)*(c-i)),p=Math.atan(r/(c-i));return{lat:Math.asin((l-h*h*f*f)/(2*f))*this.degRad,lng:(o+p/f)*this.degRad}},lcc:function(e,t,n){var r=0,i=n*this.radDeg,s=t*this.radDeg,o=33*this.radDeg,u=45*this.radDeg,a=e*this.radDeg,f=Math.log(Math.cos(o)*(1/Math.cos(u)))/Math.log(Math.tan(Math.PI/4+u/2)*(1/Math.tan(Math.PI/4+o/2))),l=Math.cos(o)*Math.pow(Math.tan(Math.PI/4+o/2),f)/f,c=l*Math.pow(1/Math.tan(Math.PI/4+a/2),f),h=l*Math.pow(1/Math.tan(Math.PI/4+r/2),f);return{x:c*Math.sin(f*(s-i))*this.radius,y:-(h-c*Math.cos(f*(s-i)))*this.radius}},lcc_inv:function(e,t,n){var r=e/this.radius,i=t/this.radius,s=0,o=n*this.radDeg,u=33*this.radDeg,a=45*this.radDeg,f=Math.log(Math.cos(u)*(1/Math.cos(a)))/Math.log(Math.tan(Math.PI/4+a/2)*(1/Math.tan(Math.PI/4+u/2))),l=Math.cos(u)*Math.pow(Math.tan(Math.PI/4+u/2),f)/f,c=l*Math.pow(1/Math.tan(Math.PI/4+s/2),f),h=this.sgn(f)*Math.sqrt(r*r+(c-i)*(c-i)),p=Math.atan(r/(c-i));return{lat:(2*Math.atan(Math.pow(l/h,1/f))-Math.PI/2)*this.degRad,lng:(o+p/f)*this.degRad}}},jvm.WorldMap=function(e){var t=this,n;this.params=jvm.$.extend(!0,{},jvm.WorldMap.defaultParams,e);if(!jvm.WorldMap.maps[this.params.map])throw new Error("Attempt to use map which was not loaded: "+this.params.map);this.mapData=jvm.WorldMap.maps[this.params.map],this.markers={},this.regions={},this.regionsColors={},this.regionsData={},this.container=jvm.$("<div>").css({width:"100%",height:"100%"}).addClass("jvectormap-container"),this.params.container.append(this.container),this.container.data("mapObject",this),this.container.css({position:"relative",overflow:"hidden"}),this.defaultWidth=this.mapData.width,this.defaultHeight=this.mapData.height,this.setBackgroundColor(this.params.backgroundColor),this.onResize=function(){t.setSize()},jvm.$(window).resize(this.onResize);for(n in jvm.WorldMap.apiEvents)this.params[n]&&this.container.bind(jvm.WorldMap.apiEvents[n]+".jvectormap",this.params[n]);this.canvas=new jvm.VectorCanvas(this.container[0],this.width,this.height),"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch?this.params.bindTouchEvents&&this.bindContainerTouchEvents():this.bindContainerEvents(),this.bindElementEvents(),this.createLabel(),this.params.zoomButtons&&this.bindZoomButtons(),this.createRegions(),this.createMarkers(this.params.markers||{}),this.setSize(),this.params.focusOn&&(typeof this.params.focusOn=="object"?this.setFocus.call(this,this.params.focusOn.scale,this.params.focusOn.x,this.params.focusOn.y):this.setFocus.call(this,this.params.focusOn)),this.params.selectedRegions&&this.setSelectedRegions(this.params.selectedRegions),this.params.selectedMarkers&&this.setSelectedMarkers(this.params.selectedMarkers),this.params.series&&this.createSeries()},jvm.WorldMap.prototype={transX:0,transY:0,scale:1,baseTransX:0,baseTransY:0,baseScale:1,width:0,height:0,setBackgroundColor:function(e){this.container.css("background-color",e)},resize:function(){var e=this.baseScale;this.width/this.height>this.defaultWidth/this.defaultHeight?(this.baseScale=this.height/this.defaultHeight,this.baseTransX=Math.abs(this.width-this.defaultWidth*this.baseScale)/(2*this.baseScale)):(this.baseScale=this.width/this.defaultWidth,this.baseTransY=Math.abs(this.height-this.defaultHeight*this.baseScale)/(2*this.baseScale)),this.scale*=this.baseScale/e,this.transX*=this.baseScale/e,this.transY*=this.baseScale/e},setSize:function(){this.width=this.container.width(),this.height=this.container.height(),this.resize(),this.canvas.setSize(this.width,this.height),this.applyTransform()},reset:function(){var e,t;for(e in this.series)for(t=0;t<this.series[e].length;t++)this.series[e][t].clear();this.scale=this.baseScale,this.transX=this.baseTransX,this.transY=this.baseTransY,this.applyTransform()},applyTransform:function(){var e,t,n,r;this.defaultWidth*this.scale<=this.width?(e=(this.width-this.defaultWidth*this.scale)/(2*this.scale),n=(this.width-this.defaultWidth*this.scale)/(2*this.scale)):(e=0,n=(this.width-this.defaultWidth*this.scale)/this.scale),this.defaultHeight*this.scale<=this.height?(t=(this.height-this.defaultHeight*this.scale)/(2*this.scale),r=(this.height-this.defaultHeight*this.scale)/(2*this.scale)):(t=0,r=(this.height-this.defaultHeight*this.scale)/this.scale),this.transY>t?this.transY=t:this.transY<r&&(this.transY=r),this.transX>e?this.transX=e:this.transX<n&&(this.transX=n),this.canvas.applyTransformParams(this.scale,this.transX,this.transY),this.markers&&this.repositionMarkers(),this.container.trigger("viewportChange",[this.scale/this.baseScale,this.transX,this.transY])},bindContainerEvents:function(){var e=!1,t,n,r=this;this.container.mousemove(function(i){return e&&(r.transX-=(t-i.pageX)/r.scale,r.transY-=(n-i.pageY)/r.scale,r.applyTransform(),t=i.pageX,n=i.pageY),!1}).mousedown(function(r){return e=!0,t=r.pageX,n=r.pageY,!1}),jvm.$("body").mouseup(function(){e=!1}),this.params.zoomOnScroll&&this.container.mousewheel(function(e,t,n,i){var s=jvm.$(r.container).offset(),o=e.pageX-s.left,u=e.pageY-s.top,a=Math.pow(1.3,i);r.label.hide(),r.setScale(r.scale*a,o,u),e.preventDefault()})},bindContainerTouchEvents:function(){var e,t,n=this,r,i,s,o,u,a=function(a){var f=a.originalEvent.touches,l,c,h,p;a.type=="touchstart"&&(u=0),f.length==1?(u==1&&(h=n.transX,p=n.transY,n.transX-=(r-f[0].pageX)/n.scale,n.transY-=(i-f[0].pageY)/n.scale,n.applyTransform(),n.label.hide(),(h!=n.transX||p!=n.transY)&&a.preventDefault()),r=f[0].pageX,i=f[0].pageY):f.length==2&&(u==2?(c=Math.sqrt(Math.pow(f[0].pageX-f[1].pageX,2)+Math.pow(f[0].pageY-f[1].pageY,2))/t,n.setScale(e*c,s,o),n.label.hide(),a.preventDefault()):(l=jvm.$(n.container).offset(),f[0].pageX>f[1].pageX?s=f[1].pageX+(f[0].pageX-f[1].pageX)/2:s=f[0].pageX+(f[1].pageX-f[0].pageX)/2,f[0].pageY>f[1].pageY?o=f[1].pageY+(f[0].pageY-f[1].pageY)/2:o=f[0].pageY+(f[1].pageY-f[0].pageY)/2,s-=l.left,o-=l.top,e=n.scale,t=Math.sqrt(Math.pow(f[0].pageX-f[1].pageX,2)+Math.pow(f[0].pageY-f[1].pageY,2)))),u=f.length};jvm.$(this.container).bind("touchstart",a),jvm.$(this.container).bind("touchmove",a)},bindElementEvents:function(){var e=this,t;this.container.mousemove(function(){t=!0}),this.container.delegate("[class~='jvectormap-element']","mouseover mouseout",function(t){var n=this,r=jvm.$(this).attr("class").baseVal?jvm.$(this).attr("class").baseVal:jvm.$(this).attr("class"),i=r.indexOf("jvectormap-region")===-1?"marker":"region",s=i=="region"?jvm.$(this).attr("data-code"):jvm.$(this).attr("data-index"),o=i=="region"?e.regions[s].element:e.markers[s].element,u=i=="region"?e.mapData.paths[s].name:e.markers[s].config.name||"",a=jvm.$.Event(i+"LabelShow.jvectormap"),f=jvm.$.Event(i+"Over.jvectormap");t.type=="mouseover"?(e.container.trigger(f,[s]),f.isDefaultPrevented()||o.setHovered(!0),e.label.text(u),e.container.trigger(a,[e.label,s]),a.isDefaultPrevented()||(e.label.show(),e.labelWidth=e.label.width(),e.labelHeight=e.label.height())):(o.setHovered(!1),e.label.hide(),e.container.trigger(i+"Out.jvectormap",[s]))}),this.container.delegate("[class~='jvectormap-element']","mousedown",function(e){t=!1}),this.container.delegate("[class~='jvectormap-element']","mouseup",function(n){var r=this,i=jvm.$(this).attr("class").baseVal?jvm.$(this).attr("class").baseVal:jvm.$(this).attr("class"),s=i.indexOf("jvectormap-region")===-1?"marker":"region",o=s=="region"?jvm.$(this).attr("data-code"):jvm.$(this).attr("data-index"),u=jvm.$.Event(s+"Click.jvectormap"),a=s=="region"?e.regions[o].element:e.markers[o].element;if(!t){e.container.trigger(u,[o]);if(s==="region"&&e.params.regionsSelectable||s==="marker"&&e.params.markersSelectable)u.isDefaultPrevented()||(e.params[s+"sSelectableOne"]&&e.clearSelected(s+"s"),a.setSelected(!a.isSelected))}})},bindZoomButtons:function(){var e=this;jvm.$("<div/>").addClass("jvectormap-zoomin").text("+").appendTo(this.container),jvm.$("<div/>").addClass("jvectormap-zoomout").html("−").appendTo(this.container),this.container.find(".jvectormap-zoomin").click(function(){e.setScale(e.scale*e.params.zoomStep,e.width/2,e.height/2)}),this.container.find(".jvectormap-zoomout").click(function(){e.setScale(e.scale/e.params.zoomStep,e.width/2,e.height/2)})},createLabel:function(){var e=this;this.label=jvm.$("<div/>").addClass("jvectormap-label").appendTo(jvm.$("body")),this.container.mousemove(function(t){var n=t.pageX-15-e.labelWidth,r=t.pageY-15-e.labelHeight;n<5&&(n=t.pageX+15),r<5&&(r=t.pageY+15),e.label.is(":visible")&&e.label.css({left:n,top:r})})},setScale:function(e,t,n,r){var i,s=jvm.$.Event("zoom.jvectormap");e>this.params.zoomMax*this.baseScale?e=this.params.zoomMax*this.baseScale:e<this.params.zoomMin*this.baseScale&&(e=this.params.zoomMin*this.baseScale),typeof t!="undefined"&&typeof n!="undefined"&&(i=e/this.scale,r?(this.transX=t+this.defaultWidth*(this.width/(this.defaultWidth*e))/2,this.transY=n+this.defaultHeight*(this.height/(this.defaultHeight*e))/2):(this.transX-=(i-1)/e*t,this.transY-=(i-1)/e*n)),this.scale=e,this.applyTransform(),this.container.trigger(s,[e/this.baseScale])},setFocus:function(e,t,n){var r,i,s,o,u;if(jvm.$.isArray(e)||this.regions[e]){jvm.$.isArray(e)?o=e:o=[e];for(u=0;u<o.length;u++)this.regions[o[u]]&&(i=this.regions[o[u]].element.getBBox(),i&&(typeof r=="undefined"?r=i:(s={x:Math.min(r.x,i.x),y:Math.min(r.y,i.y),width:Math.max(r.x+r.width,i.x+i.width)-Math.min(r.x,i.x),height:Math.max(r.y+r.height,i.y+i.height)-Math.min(r.y,i.y)},r=s)));this.setScale(Math.min(this.width/r.width,this.height/r.height),-(r.x+r.width/2),-(r.y+r.height/2),!0)}else e*=this.baseScale,this.setScale(e,-t*this.defaultWidth,-n*this.defaultHeight,!0)},getSelected:function(e){var t,n=[];for(t in this[e])this[e][t].element.isSelected&&n.push(t);return n},getSelectedRegions:function(){return this.getSelected("regions")},getSelectedMarkers:function(){return this.getSelected("markers")},setSelected:function(e,t){var n;typeof t!="object"&&(t=[t]);if(jvm.$.isArray(t))for(n=0;n<t.length;n++)this[e][t[n]].element.setSelected(!0);else for(n in t)this[e][n].element.setSelected(!!t[n])},setSelectedRegions:function(e){this.setSelected("regions",e)},setSelectedMarkers:function(e){this.setSelected("markers",e)},clearSelected:function(e){var t={},n=this.getSelected(e),r;for(r=0;r<n.length;r++)t[n[r]]=!1;this.setSelected(e,t)},clearSelectedRegions:function(){this.clearSelected("regions")},clearSelectedMarkers:function(){this.clearSelected("markers")},getMapObject:function(){return this},getRegionName:function(e){return this.mapData.paths[e].name},createRegions:function(){var e,t,n=this;for(e in this.mapData.paths)t=this.canvas.addPath({d:this.mapData.paths[e].path,"data-code":e},jvm.$.extend(!0,{},this.params.regionStyle)),jvm.$(t.node).bind("selected",function(e,t){n.container.trigger("regionSelected.jvectormap",[jvm.$(this).attr("data-code"),t,n.getSelectedRegions()])}),t.addClass("jvectormap-region jvectormap-element"),this.regions[e]={element:t,config:this.mapData.paths[e]}},createMarkers:function(e){var t,n,r,i,s,o=this;this.markersGroup=this.markersGroup||this.canvas.addGroup();if(jvm.$.isArray(e)){s=e.slice(),e={};for(t=0;t<s.length;t++)e[t]=s[t]}for(t in e)i=e[t]instanceof Array?{latLng:e[t]}:e[t],r=this.getMarkerPosition(i),r!==!1&&(n=this.canvas.addCircle({"data-index":t,cx:r.x,cy:r.y},jvm.$.extend(!0,{},this.params.markerStyle,{initial:i.style||{}}),this.markersGroup),n.addClass("jvectormap-marker jvectormap-element"),jvm.$(n.node).bind("selected",function(e,t){o.container.trigger("markerSelected.jvectormap",[jvm.$(this).attr("data-index"),t,o.getSelectedMarkers()])}),this.markers[t]&&this.removeMarkers([t]),this.markers[t]={element:n,config:i})},repositionMarkers:function(){var e,t;for(e in this.markers)t=this.getMarkerPosition(this.markers[e].config),t!==!1&&this.markers[e].element.setStyle({cx:t.x,cy:t.y})},getMarkerPosition:function(e){return jvm.WorldMap.maps[this.params.map].projection?this.latLngToPoint.apply(this,e.latLng||[0,0]):{x:e.coords[0]*this.scale+this.transX*this.scale,y:e.coords[1]*this.scale+this.transY*this.scale}},addMarker:function(e,t,n){var r={},i=[],s,o,n=n||[];r[e]=t;for(o=0;o<n.length;o++)s={},s[e]=n[o],i.push(s);this.addMarkers(r,i)},addMarkers:function(e,t){var n;t=t||[],this.createMarkers(e);for(n=0;n<t.length;n++)this.series.markers[n].setValues(t[n]||{})},removeMarkers:function(e){var t;for(t=0;t<e.length;t++)this.markers[e[t]].element.remove(),delete this.markers[e[t]]},removeAllMarkers:function(){var e,t=[];for(e in this.markers)t.push(e);this.removeMarkers(t)},latLngToPoint:function(e,t){var n,r=jvm.WorldMap.maps[this.params.map].projection,i=r.centralMeridian,s=this.width-this.baseTransX*2*this.baseScale,o=this.height-this.baseTransY*2*this.baseScale,u,a,f=this.scale/this.baseScale;return t<-180+i&&(t+=360),n=jvm.Proj[r.type](e,t,i),u=this.getInsetForPoint(n.x,n.y),u?(a=u.bbox,n.x=(n.x-a[0].x)/(a[1].x-a[0].x)*u.width*this.scale,n.y=(n.y-a[0].y)/(a[1].y-a[0].y)*u.height*this.scale,{x:n.x+this.transX*this.scale+u.left*this.scale,y:n.y+this.transY*this.scale+u.top*this.scale}):!1},pointToLatLng:function(e,t){var n=jvm.WorldMap.maps[this.params.map].projection,r=n.centralMeridian,i=jvm.WorldMap.maps[this.params.map].insets,s,o,u,a,f;for(s=0;s<i.length;s++){o=i[s],u=o.bbox,a=e-(this.transX*this.scale+o.left*this.scale),f=t-(this.transY*this.scale+o.top*this.scale),a=a/(o.width*this.scale)*(u[1].x-u[0].x)+u[0].x,f=f/(o.height*this.scale)*(u[1].y-u[0].y)+u[0].y;if(a>u[0].x&&a<u[1].x&&f>u[0].y&&f<u[1].y)return jvm.Proj[n.type+"_inv"](a,-f,r)}return!1},getInsetForPoint:function(e,t){var n=jvm.WorldMap.maps[this.params.map].insets,r,i;for(r=0;r<n.length;r++){i=n[r].bbox;if(e>i[0].x&&e<i[1].x&&t>i[0].y&&t<i[1].y)return n[r]}},createSeries:function(){var e,t;this.series={markers:[],regions:[]};for(t in this.params.series)for(e=0;e<this.params.series[t].length;e++)this.series[t][e]=new jvm.DataSeries(this.params.series[t][e],this[t])},remove:function(){this.label.remove(),this.container.remove(),jvm.$(window).unbind("resize",this.onResize)}},jvm.WorldMap.maps={},jvm.WorldMap.defaultParams={map:"world_mill_en",backgroundColor:"#505050",zoomButtons:!0,zoomOnScroll:!0,zoomMax:8,zoomMin:1,zoomStep:1.6,regionsSelectable:!1,markersSelectable:!1,bindTouchEvents:!0,regionStyle:{initial:{fill:"white","fill-opacity":1,stroke:"none","stroke-width":0,"stroke-opacity":1},hover:{"fill-opacity":.8},selected:{fill:"yellow"},selectedHover
|
8 |
+
:{}},markerStyle:{initial:{fill:"grey",stroke:"#505050","fill-opacity":1,"stroke-width":1,"stroke-opacity":1,r:5},hover:{stroke:"black","stroke-width":2},selected:{fill:"blue"},selectedHover:{}}},jvm.WorldMap.apiEvents={onRegionLabelShow:"regionLabelShow",onRegionOver:"regionOver",onRegionOut:"regionOut",onRegionClick:"regionClick",onRegionSelected:"regionSelected",onMarkerLabelShow:"markerLabelShow",onMarkerOver:"markerOver",onMarkerOut:"markerOut",onMarkerClick:"markerClick",onMarkerSelected:"markerSelected",onViewportChange:"viewportChange"};
|
assets/admin/scripts/jquery-jvectormap-world-mill-en.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
jQuery.fn.vectorMap('addMap', 'world_mill_en',{"insets": [{"width": 900.0, "top": 0, "height": 440.7063107441331, "bbox": [{"y": -12671671.123330014, "x": -20004297.151525836}, {"y": 6930392.02513512, "x": 20026572.394749384}], "left": 0}], "paths": {"BD": {"path": "M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z", "name": "Bangladesh"}, "BE": {"path": "M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z", "name": "Belgium"}, "BF": {"path": "M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z", "name": "Burkina Faso"}, "BG": {"path": "M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z", "name": "Bulgaria"}, "BA": {"path": "M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z", "name": "Bosnia and Herzegovina"}, "BN": {"path": "M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z", "name": "Brunei"}, "BO": {"path": "M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z", "name": "Bolivia"}, "JP": {"path": "M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z", "name": "Japan"}, "BI": {"path": "M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z", "name": "Burundi"}, "BJ": {"path": "M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z", "name": "Benin"}, "BT": {"path": "M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z", "name": "Bhutan"}, "JM": {"path": "M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z", "name": "Jamaica"}, "BW": {"path": "M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z", "name": "Botswana"}, "BR": {"path": "M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z", "name": "Brazil"}, "BS": {"path": "M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z", "name": "The Bahamas"}, "BY": {"path": "M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z", "name": "Belarus"}, "BZ": {"path": "M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z", "name": "Belize"}, "RU": {"path": "M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z", "name": "Russia"}, "RW": {"path": "M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z", "name": "Rwanda"}, "RS": {"path": "M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z", "name": "Republic of Serbia"}, "LT": {"path": "M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z", "name": "Lithuania"}, "LU": {"path": "M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z", "name": "Luxembourg"}, "LR": {"path": "M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z", "name": "Liberia"}, "RO": {"path": "M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z", "name": "Romania"}, "GW": {"path": "M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z", "name": "Guinea Bissau"}, "GT": {"path": "M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z", "name": "Guatemala"}, "GR": {"path": "M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z", "name": "Greece"}, "GQ": {"path": "M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z", "name": "Equatorial Guinea"}, "GY": {"path": "M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z", "name": "Guyana"}, "GE": {"path": "M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z", "name": "Georgia"}, "GB": {"path": "M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z", "name": "United Kingdom"}, "GA": {"path": "M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z", "name": "Gabon"}, "GN": {"path": "M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z", "name": "Guinea"}, "GM": {"path": "M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z", "name": "Gambia"}, "GL": {"path": "M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z", "name": "Greenland"}, "KW": {"path": "M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z", "name": "Kuwait"}, "GH": {"path": "M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z", "name": "Ghana"}, "OM": {"path": "M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z", "name": "Oman"}, "_3": {"path": "M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z", "name": "Somaliland"}, "_2": {"path": "M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z", "name": "Western Sahara"}, "_1": {"path": "M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z", "name": "Kosovo"}, "_0": {"path": "M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z", "name": "Northern Cyprus"}, "JO": {"path": "M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z", "name": "Jordan"}, "HR": {"path": "M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z", "name": "Croatia"}, "HT": {"path": "M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z", "name": "Haiti"}, "HU": {"path": "M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z", "name": "Hungary"}, "HN": {"path": "M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z", "name": "Honduras"}, "PR": {"path": "M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z", "name": "Puerto Rico"}, "PS": {"path": "M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z", "name": "West Bank"}, "PT": {"path": "M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z", "name": "Portugal"}, "PY": {"path": "M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z", "name": "Paraguay"}, "PA": {"path": "M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z", "name": "Panama"}, "PG": {"path": "M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z", "name": "Papua New Guinea"}, "PE": {"path": "M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z", "name": "Peru"}, "PK": {"path": "M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z", "name": "Pakistan"}, "PH": {"path": "M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z", "name": "Philippines"}, "PL": {"path": "M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z", "name": "Poland"}, "ZM": {"path": "M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z", "name": "Zambia"}, "EE": {"path": "M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z", "name": "Estonia"}, "EG": {"path": "M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z", "name": "Egypt"}, "ZA": {"path": "M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z", "name": "South Africa"}, "EC": {"path": "M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z", "name": "Ecuador"}, "AL": {"path": "M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z", "name": "Albania"}, "AO": {"path": "M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z", "name": "Angola"}, "KZ": {"path": "M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z", "name": "Kazakhstan"}, "ET": {"path": "M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z", "name": "Ethiopia"}, "ZW": {"path": "M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z", "name": "Zimbabwe"}, "ES": {"path": "M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z", "name": "Spain"}, "ER": {"path": "M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z", "name": "Eritrea"}, "ME": {"path": "M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z", "name": "Montenegro"}, "MD": {"path": "M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z", "name": "Moldova"}, "MG": {"path": "M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z", "name": "Madagascar"}, "MA": {"path": "M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z", "name": "Morocco"}, "UZ": {"path": "M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z", "name": "Uzbekistan"}, "MM": {"path": "M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z", "name": "Myanmar"}, "ML": {"path": "M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z", "name": "Mali"}, "MN": {"path": "M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z", "name": "Mongolia"}, "MK": {"path": "M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z", "name": "Macedonia"}, "MW": {"path": "M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z", "name": "Malawi"}, "MR": {"path": "M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z", "name": "Mauritania"}, "UG": {"path": "M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z", "name": "Uganda"}, "MY": {"path": "M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z", "name": "Malaysia"}, "MX": {"path": "M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z", "name": "Mexico"}, "VU": {"path": "M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z", "name": "Vanuatu"}, "FR": {"path": "M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z", "name": "France"}, "FI": {"path": "M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z", "name": "Finland"}, "FJ": {"path": "M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z", "name": "Fiji"}, "FK": {"path": "M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z", "name": "Falkland Islands"}, "NI": {"path": "M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z", "name": "Nicaragua"}, "NL": {"path": "M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z", "name": "Netherlands"}, "NO": {"path": "M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z", "name": "Norway"}, "NA": {"path": "M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z", "name": "Namibia"}, "NC": {"path": "M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z", "name": "New Caledonia"}, "NE": {"path": "M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z", "name": "Niger"}, "NG": {"path": "M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z", "name": "Nigeria"}, "NZ": {"path": "M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z", "name": "New Zealand"}, "NP": {"path": "M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z", "name": "Nepal"}, "CI": {"path": "M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z", "name": "Ivory Coast"}, "CH": {"path": "M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z", "name": "Switzerland"}, "CO": {"path": "M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z", "name": "Colombia"}, "CN": {"path": "M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z", "name": "China"}, "CM": {"path": "M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z", "name": "Cameroon"}, "CL": {"path": "M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z", "name": "Chile"}, "CA": {"path": "M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z", "name": "Canada"}, "CG": {"path": "M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z", "name": "Republic of the Congo"}, "CF": {"path": "M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z", "name": "Central African Republic"}, "CD": {"path": "M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z", "name": "Democratic Republic of the Congo"}, "CZ": {"path": "M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z", "name": "Czech Republic"}, "CY": {"path": "M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z", "name": "Cyprus"}, "CR": {"path": "M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z", "name": "Costa Rica"}, "CU": {"path": "M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z", "name": "Cuba"}, "SZ": {"path": "M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z", "name": "Swaziland"}, "SY": {"path": "M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z", "name": "Syria"}, "KG": {"path": "M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z", "name": "Kyrgyzstan"}, "KE": {"path": "M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z", "name": "Kenya"}, "SS": {"path": "M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z", "name": "South Sudan"}, "SR": {"path": "M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z", "name": "Suriname"}, "KH": {"path": "M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z", "name": "Cambodia"}, "SV": {"path": "M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z", "name": "El Salvador"}, "SK": {"path": "M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z", "name": "Slovakia"}, "KR": {"path": "M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z", "name": "South Korea"}, "SI": {"path": "M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z", "name": "Slovenia"}, "KP": {"path": "M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z", "name": "North Korea"}, "SO": {"path": "M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z", "name": "Somalia"}, "SN": {"path": "M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z", "name": "Senegal"}, "SL": {"path": "M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z", "name": "Sierra Leone"}, "SB": {"path": "M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z", "name": "Solomon Islands"}, "SA": {"path": "M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z", "name": "Saudi Arabia"}, "SE": {"path": "M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z", "name": "Sweden"}, "SD": {"path": "M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z", "name": "Sudan"}, "DO": {"path": "M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z", "name": "Dominican Republic"}, "DJ": {"path": "M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z", "name": "Djibouti"}, "DK": {"path": "M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z", "name": "Denmark"}, "DE": {"path": "M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z", "name": "Germany"}, "YE": {"path": "M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z", "name": "Yemen"}, "AT": {"path": "M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z", "name": "Austria"}, "DZ": {"path": "M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z", "name": "Algeria"}, "US": {"path": "M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z", "name": "United States of America"}, "LV": {"path": "M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z", "name": "Latvia"}, "UY": {"path": "M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z", "name": "Uruguay"}, "LB": {"path": "M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z", "name": "Lebanon"}, "LA": {"path": "M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z", "name": "Laos"}, "TW": {"path": "M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z", "name": "Taiwan"}, "TT": {"path": "M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z", "name": "Trinidad and Tobago"}, "TR": {"path": "M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z", "name": "Turkey"}, "LK": {"path": "M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z", "name": "Sri Lanka"}, "TN": {"path": "M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z", "name": "Tunisia"}, "TL": {"path": "M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z", "name": "East Timor"}, "TM": {"path": "M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z", "name": "Turkmenistan"}, "TJ": {"path": "M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z", "name": "Tajikistan"}, "LS": {"path": "M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z", "name": "Lesotho"}, "TH": {"path": "M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z", "name": "Thailand"}, "TF": {"path": "M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z", "name": "French Southern and Antarctic Lands"}, "TG": {"path": "M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z", "name": "Togo"}, "TD": {"path": "M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z", "name": "Chad"}, "LY": {"path": "M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z", "name": "Libya"}, "AE": {"path": "M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z", "name": "United Arab Emirates"}, "VE": {"path": "M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z", "name": "Venezuela"}, "AF": {"path": "M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z", "name": "Afghanistan"}, "IQ": {"path": "M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z", "name": "Iraq"}, "IS": {"path": "M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z", "name": "Iceland"}, "IR": {"path": "M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z", "name": "Iran"}, "AM": {"path": "M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z", "name": "Armenia"}, "IT": {"path": "M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z", "name": "Italy"}, "VN": {"path": "M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z", "name": "Vietnam"}, "AR": {"path": "M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z", "name": "Argentina"}, "AU": {"path": "M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z", "name": "Australia"}, "IL": {"path": "M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z", "name": "Israel"}, "IN": {"path": "M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z", "name": "India"}, "TZ": {"path": "M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z", "name": "Tanzania"}, "AZ": {"path": "M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z", "name": "Azerbaijan"}, "IE": {"path": "M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z", "name": "Ireland"}, "ID": {"path": "M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z", "name": "Indonesia"}, "UA": {"path": "M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z", "name": "Ukraine"}, "QA": {"path": "M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z", "name": "Qatar"}, "MZ": {"path": "M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z", "name": "Mozambique"}}, "height": 440.7063107441331, "projection": {"type": "mill", "centralMeridian": 11.5}, "width": 900.0});
|
assets/admin/scripts/morris.js
ADDED
@@ -0,0 +1,1892 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* @license
|
2 |
+
morris.js v0.5.0
|
3 |
+
Copyright 2014 Olly Smith All rights reserved.
|
4 |
+
Licensed under the BSD-2-Clause License.
|
5 |
+
*/
|
6 |
+
|
7 |
+
|
8 |
+
(function() {
|
9 |
+
var $, Morris, minutesSpecHelper, secondsSpecHelper,
|
10 |
+
__slice = [].slice,
|
11 |
+
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
12 |
+
__hasProp = {}.hasOwnProperty,
|
13 |
+
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
14 |
+
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
|
15 |
+
|
16 |
+
Morris = window.Morris = {};
|
17 |
+
|
18 |
+
$ = jQuery;
|
19 |
+
|
20 |
+
Morris.EventEmitter = (function() {
|
21 |
+
function EventEmitter() {}
|
22 |
+
|
23 |
+
EventEmitter.prototype.on = function(name, handler) {
|
24 |
+
if (this.handlers == null) {
|
25 |
+
this.handlers = {};
|
26 |
+
}
|
27 |
+
if (this.handlers[name] == null) {
|
28 |
+
this.handlers[name] = [];
|
29 |
+
}
|
30 |
+
this.handlers[name].push(handler);
|
31 |
+
return this;
|
32 |
+
};
|
33 |
+
|
34 |
+
EventEmitter.prototype.fire = function() {
|
35 |
+
var args, handler, name, _i, _len, _ref, _results;
|
36 |
+
name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
37 |
+
if ((this.handlers != null) && (this.handlers[name] != null)) {
|
38 |
+
_ref = this.handlers[name];
|
39 |
+
_results = [];
|
40 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
41 |
+
handler = _ref[_i];
|
42 |
+
_results.push(handler.apply(null, args));
|
43 |
+
}
|
44 |
+
return _results;
|
45 |
+
}
|
46 |
+
};
|
47 |
+
|
48 |
+
return EventEmitter;
|
49 |
+
|
50 |
+
})();
|
51 |
+
|
52 |
+
Morris.commas = function(num) {
|
53 |
+
var absnum, intnum, ret, strabsnum;
|
54 |
+
if (num != null) {
|
55 |
+
ret = num < 0 ? "-" : "";
|
56 |
+
absnum = Math.abs(num);
|
57 |
+
intnum = Math.floor(absnum).toFixed(0);
|
58 |
+
ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ',');
|
59 |
+
strabsnum = absnum.toString();
|
60 |
+
if (strabsnum.length > intnum.length) {
|
61 |
+
ret += strabsnum.slice(intnum.length);
|
62 |
+
}
|
63 |
+
return ret;
|
64 |
+
} else {
|
65 |
+
return '-';
|
66 |
+
}
|
67 |
+
};
|
68 |
+
|
69 |
+
Morris.pad2 = function(number) {
|
70 |
+
return (number < 10 ? '0' : '') + number;
|
71 |
+
};
|
72 |
+
|
73 |
+
Morris.Grid = (function(_super) {
|
74 |
+
__extends(Grid, _super);
|
75 |
+
|
76 |
+
function Grid(options) {
|
77 |
+
this.resizeHandler = __bind(this.resizeHandler, this);
|
78 |
+
var _this = this;
|
79 |
+
if (typeof options.element === 'string') {
|
80 |
+
this.el = $(document.getElementById(options.element));
|
81 |
+
} else {
|
82 |
+
this.el = $(options.element);
|
83 |
+
}
|
84 |
+
if ((this.el == null) || this.el.length === 0) {
|
85 |
+
throw new Error("Graph container element not found");
|
86 |
+
}
|
87 |
+
if (this.el.css('position') === 'static') {
|
88 |
+
this.el.css('position', 'relative');
|
89 |
+
}
|
90 |
+
this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options);
|
91 |
+
if (typeof this.options.units === 'string') {
|
92 |
+
this.options.postUnits = options.units;
|
93 |
+
}
|
94 |
+
this.raphael = new Raphael(this.el[0]);
|
95 |
+
this.elementWidth = null;
|
96 |
+
this.elementHeight = null;
|
97 |
+
this.dirty = false;
|
98 |
+
this.selectFrom = null;
|
99 |
+
if (this.init) {
|
100 |
+
this.init();
|
101 |
+
}
|
102 |
+
this.setData(this.options.data);
|
103 |
+
this.el.bind('mousemove', function(evt) {
|
104 |
+
var left, offset, right, width, x;
|
105 |
+
offset = _this.el.offset();
|
106 |
+
x = evt.pageX - offset.left;
|
107 |
+
if (_this.selectFrom) {
|
108 |
+
left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x;
|
109 |
+
right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x;
|
110 |
+
width = right - left;
|
111 |
+
return _this.selectionRect.attr({
|
112 |
+
x: left,
|
113 |
+
width: width
|
114 |
+
});
|
115 |
+
} else {
|
116 |
+
return _this.fire('hovermove', x, evt.pageY - offset.top);
|
117 |
+
}
|
118 |
+
});
|
119 |
+
this.el.bind('mouseleave', function(evt) {
|
120 |
+
if (_this.selectFrom) {
|
121 |
+
_this.selectionRect.hide();
|
122 |
+
_this.selectFrom = null;
|
123 |
+
}
|
124 |
+
return _this.fire('hoverout');
|
125 |
+
});
|
126 |
+
this.el.bind('touchstart touchmove touchend', function(evt) {
|
127 |
+
var offset, touch;
|
128 |
+
touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0];
|
129 |
+
offset = _this.el.offset();
|
130 |
+
return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top);
|
131 |
+
});
|
132 |
+
this.el.bind('click', function(evt) {
|
133 |
+
var offset;
|
134 |
+
offset = _this.el.offset();
|
135 |
+
return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);
|
136 |
+
});
|
137 |
+
if (this.options.rangeSelect) {
|
138 |
+
this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({
|
139 |
+
fill: this.options.rangeSelectColor,
|
140 |
+
stroke: false
|
141 |
+
}).toBack().hide();
|
142 |
+
this.el.bind('mousedown', function(evt) {
|
143 |
+
var offset;
|
144 |
+
offset = _this.el.offset();
|
145 |
+
return _this.startRange(evt.pageX - offset.left);
|
146 |
+
});
|
147 |
+
this.el.bind('mouseup', function(evt) {
|
148 |
+
var offset;
|
149 |
+
offset = _this.el.offset();
|
150 |
+
_this.endRange(evt.pageX - offset.left);
|
151 |
+
return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top);
|
152 |
+
});
|
153 |
+
}
|
154 |
+
if (this.options.resize) {
|
155 |
+
$(window).bind('resize', function(evt) {
|
156 |
+
if (_this.timeoutId != null) {
|
157 |
+
window.clearTimeout(_this.timeoutId);
|
158 |
+
}
|
159 |
+
return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);
|
160 |
+
});
|
161 |
+
}
|
162 |
+
this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');
|
163 |
+
if (this.postInit) {
|
164 |
+
this.postInit();
|
165 |
+
}
|
166 |
+
}
|
167 |
+
|
168 |
+
Grid.prototype.gridDefaults = {
|
169 |
+
dateFormat: null,
|
170 |
+
axes: true,
|
171 |
+
grid: true,
|
172 |
+
gridLineColor: '#aaa',
|
173 |
+
gridStrokeWidth: 0.5,
|
174 |
+
gridTextColor: '#888',
|
175 |
+
gridTextSize: 12,
|
176 |
+
gridTextFamily: 'sans-serif',
|
177 |
+
gridTextWeight: 'normal',
|
178 |
+
hideHover: false,
|
179 |
+
yLabelFormat: null,
|
180 |
+
xLabelAngle: 0,
|
181 |
+
numLines: 5,
|
182 |
+
padding: 25,
|
183 |
+
parseTime: true,
|
184 |
+
postUnits: '',
|
185 |
+
preUnits: '',
|
186 |
+
ymax: 'auto',
|
187 |
+
ymin: 'auto 0',
|
188 |
+
goals: [],
|
189 |
+
goalStrokeWidth: 1.0,
|
190 |
+
goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'],
|
191 |
+
events: [],
|
192 |
+
eventStrokeWidth: 1.0,
|
193 |
+
eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'],
|
194 |
+
rangeSelect: null,
|
195 |
+
rangeSelectColor: '#eef',
|
196 |
+
resize: false
|
197 |
+
};
|
198 |
+
|
199 |
+
Grid.prototype.setData = function(data, redraw) {
|
200 |
+
var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref;
|
201 |
+
if (redraw == null) {
|
202 |
+
redraw = true;
|
203 |
+
}
|
204 |
+
this.options.data = data;
|
205 |
+
if ((data == null) || data.length === 0) {
|
206 |
+
this.data = [];
|
207 |
+
this.raphael.clear();
|
208 |
+
if (this.hover != null) {
|
209 |
+
this.hover.hide();
|
210 |
+
}
|
211 |
+
return;
|
212 |
+
}
|
213 |
+
ymax = this.cumulative ? 0 : null;
|
214 |
+
ymin = this.cumulative ? 0 : null;
|
215 |
+
if (this.options.goals.length > 0) {
|
216 |
+
minGoal = Math.min.apply(Math, this.options.goals);
|
217 |
+
maxGoal = Math.max.apply(Math, this.options.goals);
|
218 |
+
ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal;
|
219 |
+
ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal;
|
220 |
+
}
|
221 |
+
this.data = (function() {
|
222 |
+
var _i, _len, _results;
|
223 |
+
_results = [];
|
224 |
+
for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) {
|
225 |
+
row = data[index];
|
226 |
+
ret = {
|
227 |
+
src: row
|
228 |
+
};
|
229 |
+
ret.label = row[this.options.xkey];
|
230 |
+
if (this.options.parseTime) {
|
231 |
+
ret.x = Morris.parseDate(ret.label);
|
232 |
+
if (this.options.dateFormat) {
|
233 |
+
ret.label = this.options.dateFormat(ret.x);
|
234 |
+
} else if (typeof ret.label === 'number') {
|
235 |
+
ret.label = new Date(ret.label).toString();
|
236 |
+
}
|
237 |
+
} else {
|
238 |
+
ret.x = index;
|
239 |
+
if (this.options.xLabelFormat) {
|
240 |
+
ret.label = this.options.xLabelFormat(ret);
|
241 |
+
}
|
242 |
+
}
|
243 |
+
total = 0;
|
244 |
+
ret.y = (function() {
|
245 |
+
var _j, _len1, _ref, _results1;
|
246 |
+
_ref = this.options.ykeys;
|
247 |
+
_results1 = [];
|
248 |
+
for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) {
|
249 |
+
ykey = _ref[idx];
|
250 |
+
yval = row[ykey];
|
251 |
+
if (typeof yval === 'string') {
|
252 |
+
yval = parseFloat(yval);
|
253 |
+
}
|
254 |
+
if ((yval != null) && typeof yval !== 'number') {
|
255 |
+
yval = null;
|
256 |
+
}
|
257 |
+
if (yval != null) {
|
258 |
+
if (this.cumulative) {
|
259 |
+
total += yval;
|
260 |
+
} else {
|
261 |
+
if (ymax != null) {
|
262 |
+
ymax = Math.max(yval, ymax);
|
263 |
+
ymin = Math.min(yval, ymin);
|
264 |
+
} else {
|
265 |
+
ymax = ymin = yval;
|
266 |
+
}
|
267 |
+
}
|
268 |
+
}
|
269 |
+
if (this.cumulative && (total != null)) {
|
270 |
+
ymax = Math.max(total, ymax);
|
271 |
+
ymin = Math.min(total, ymin);
|
272 |
+
}
|
273 |
+
_results1.push(yval);
|
274 |
+
}
|
275 |
+
return _results1;
|
276 |
+
}).call(this);
|
277 |
+
_results.push(ret);
|
278 |
+
}
|
279 |
+
return _results;
|
280 |
+
}).call(this);
|
281 |
+
if (this.options.parseTime) {
|
282 |
+
this.data = this.data.sort(function(a, b) {
|
283 |
+
return (a.x > b.x) - (b.x > a.x);
|
284 |
+
});
|
285 |
+
}
|
286 |
+
this.xmin = this.data[0].x;
|
287 |
+
this.xmax = this.data[this.data.length - 1].x;
|
288 |
+
this.events = [];
|
289 |
+
if (this.options.events.length > 0) {
|
290 |
+
if (this.options.parseTime) {
|
291 |
+
this.events = (function() {
|
292 |
+
var _i, _len, _ref, _results;
|
293 |
+
_ref = this.options.events;
|
294 |
+
_results = [];
|
295 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
296 |
+
e = _ref[_i];
|
297 |
+
_results.push(Morris.parseDate(e));
|
298 |
+
}
|
299 |
+
return _results;
|
300 |
+
}).call(this);
|
301 |
+
} else {
|
302 |
+
this.events = this.options.events;
|
303 |
+
}
|
304 |
+
this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events));
|
305 |
+
this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events));
|
306 |
+
}
|
307 |
+
if (this.xmin === this.xmax) {
|
308 |
+
this.xmin -= 1;
|
309 |
+
this.xmax += 1;
|
310 |
+
}
|
311 |
+
this.ymin = this.yboundary('min', ymin);
|
312 |
+
this.ymax = this.yboundary('max', ymax);
|
313 |
+
if (this.ymin === this.ymax) {
|
314 |
+
if (ymin) {
|
315 |
+
this.ymin -= 1;
|
316 |
+
}
|
317 |
+
this.ymax += 1;
|
318 |
+
}
|
319 |
+
if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) {
|
320 |
+
if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {
|
321 |
+
this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);
|
322 |
+
this.ymin = Math.min(this.ymin, this.grid[0]);
|
323 |
+
this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);
|
324 |
+
} else {
|
325 |
+
step = (this.ymax - this.ymin) / (this.options.numLines - 1);
|
326 |
+
this.grid = (function() {
|
327 |
+
var _i, _ref1, _ref2, _results;
|
328 |
+
_results = [];
|
329 |
+
for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) {
|
330 |
+
_results.push(y);
|
331 |
+
}
|
332 |
+
return _results;
|
333 |
+
}).call(this);
|
334 |
+
}
|
335 |
+
}
|
336 |
+
this.dirty = true;
|
337 |
+
if (redraw) {
|
338 |
+
return this.redraw();
|
339 |
+
}
|
340 |
+
};
|
341 |
+
|
342 |
+
Grid.prototype.yboundary = function(boundaryType, currentValue) {
|
343 |
+
var boundaryOption, suggestedValue;
|
344 |
+
boundaryOption = this.options["y" + boundaryType];
|
345 |
+
if (typeof boundaryOption === 'string') {
|
346 |
+
if (boundaryOption.slice(0, 4) === 'auto') {
|
347 |
+
if (boundaryOption.length > 5) {
|
348 |
+
suggestedValue = parseInt(boundaryOption.slice(5), 10);
|
349 |
+
if (currentValue == null) {
|
350 |
+
return suggestedValue;
|
351 |
+
}
|
352 |
+
return Math[boundaryType](currentValue, suggestedValue);
|
353 |
+
} else {
|
354 |
+
if (currentValue != null) {
|
355 |
+
return currentValue;
|
356 |
+
} else {
|
357 |
+
return 0;
|
358 |
+
}
|
359 |
+
}
|
360 |
+
} else {
|
361 |
+
return parseInt(boundaryOption, 10);
|
362 |
+
}
|
363 |
+
} else {
|
364 |
+
return boundaryOption;
|
365 |
+
}
|
366 |
+
};
|
367 |
+
|
368 |
+
Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {
|
369 |
+
var gmax, gmin, grid, smag, span, step, unit, y, ymag;
|
370 |
+
span = ymax - ymin;
|
371 |
+
ymag = Math.floor(Math.log(span) / Math.log(10));
|
372 |
+
unit = Math.pow(10, ymag);
|
373 |
+
gmin = Math.floor(ymin / unit) * unit;
|
374 |
+
gmax = Math.ceil(ymax / unit) * unit;
|
375 |
+
step = (gmax - gmin) / (nlines - 1);
|
376 |
+
if (unit === 1 && step > 1 && Math.ceil(step) !== step) {
|
377 |
+
step = Math.ceil(step);
|
378 |
+
gmax = gmin + step * (nlines - 1);
|
379 |
+
}
|
380 |
+
if (gmin < 0 && gmax > 0) {
|
381 |
+
gmin = Math.floor(ymin / step) * step;
|
382 |
+
gmax = Math.ceil(ymax / step) * step;
|
383 |
+
}
|
384 |
+
if (step < 1) {
|
385 |
+
smag = Math.floor(Math.log(step) / Math.log(10));
|
386 |
+
grid = (function() {
|
387 |
+
var _i, _results;
|
388 |
+
_results = [];
|
389 |
+
for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {
|
390 |
+
_results.push(parseFloat(y.toFixed(1 - smag)));
|
391 |
+
}
|
392 |
+
return _results;
|
393 |
+
})();
|
394 |
+
} else {
|
395 |
+
grid = (function() {
|
396 |
+
var _i, _results;
|
397 |
+
_results = [];
|
398 |
+
for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) {
|
399 |
+
_results.push(y);
|
400 |
+
}
|
401 |
+
return _results;
|
402 |
+
})();
|
403 |
+
}
|
404 |
+
return grid;
|
405 |
+
};
|
406 |
+
|
407 |
+
Grid.prototype._calc = function() {
|
408 |
+
var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1;
|
409 |
+
w = this.el.width();
|
410 |
+
h = this.el.height();
|
411 |
+
if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {
|
412 |
+
this.elementWidth = w;
|
413 |
+
this.elementHeight = h;
|
414 |
+
this.dirty = false;
|
415 |
+
this.left = this.options.padding;
|
416 |
+
this.right = this.elementWidth - this.options.padding;
|
417 |
+
this.top = this.options.padding;
|
418 |
+
this.bottom = this.elementHeight - this.options.padding;
|
419 |
+
if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') {
|
420 |
+
yLabelWidths = (function() {
|
421 |
+
var _i, _len, _ref1, _results;
|
422 |
+
_ref1 = this.grid;
|
423 |
+
_results = [];
|
424 |
+
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
425 |
+
gridLine = _ref1[_i];
|
426 |
+
_results.push(this.measureText(this.yAxisFormat(gridLine)).width);
|
427 |
+
}
|
428 |
+
return _results;
|
429 |
+
}).call(this);
|
430 |
+
this.left += Math.max.apply(Math, yLabelWidths);
|
431 |
+
}
|
432 |
+
if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') {
|
433 |
+
bottomOffsets = (function() {
|
434 |
+
var _i, _ref2, _results;
|
435 |
+
_results = [];
|
436 |
+
for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) {
|
437 |
+
_results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height);
|
438 |
+
}
|
439 |
+
return _results;
|
440 |
+
}).call(this);
|
441 |
+
this.bottom -= Math.max.apply(Math, bottomOffsets);
|
442 |
+
}
|
443 |
+
this.width = Math.max(1, this.right - this.left);
|
444 |
+
this.height = Math.max(1, this.bottom - this.top);
|
445 |
+
this.dx = this.width / (this.xmax - this.xmin);
|
446 |
+
this.dy = this.height / (this.ymax - this.ymin);
|
447 |
+
if (this.calc) {
|
448 |
+
return this.calc();
|
449 |
+
}
|
450 |
+
}
|
451 |
+
};
|
452 |
+
|
453 |
+
Grid.prototype.transY = function(y) {
|
454 |
+
return this.bottom - (y - this.ymin) * this.dy;
|
455 |
+
};
|
456 |
+
|
457 |
+
Grid.prototype.transX = function(x) {
|
458 |
+
if (this.data.length === 1) {
|
459 |
+
return (this.left + this.right) / 2;
|
460 |
+
} else {
|
461 |
+
return this.left + (x - this.xmin) * this.dx;
|
462 |
+
}
|
463 |
+
};
|
464 |
+
|
465 |
+
Grid.prototype.redraw = function() {
|
466 |
+
this.raphael.clear();
|
467 |
+
this._calc();
|
468 |
+
this.drawGrid();
|
469 |
+
this.drawGoals();
|
470 |
+
this.drawEvents();
|
471 |
+
if (this.draw) {
|
472 |
+
return this.draw();
|
473 |
+
}
|
474 |
+
};
|
475 |
+
|
476 |
+
Grid.prototype.measureText = function(text, angle) {
|
477 |
+
var ret, tt;
|
478 |
+
if (angle == null) {
|
479 |
+
angle = 0;
|
480 |
+
}
|
481 |
+
tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle);
|
482 |
+
ret = tt.getBBox();
|
483 |
+
tt.remove();
|
484 |
+
return ret;
|
485 |
+
};
|
486 |
+
|
487 |
+
Grid.prototype.yAxisFormat = function(label) {
|
488 |
+
return this.yLabelFormat(label);
|
489 |
+
};
|
490 |
+
|
491 |
+
Grid.prototype.yLabelFormat = function(label) {
|
492 |
+
if (typeof this.options.yLabelFormat === 'function') {
|
493 |
+
return this.options.yLabelFormat(label);
|
494 |
+
} else {
|
495 |
+
return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits;
|
496 |
+
}
|
497 |
+
};
|
498 |
+
|
499 |
+
Grid.prototype.drawGrid = function() {
|
500 |
+
var lineY, y, _i, _len, _ref, _ref1, _ref2, _results;
|
501 |
+
if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) {
|
502 |
+
return;
|
503 |
+
}
|
504 |
+
_ref1 = this.grid;
|
505 |
+
_results = [];
|
506 |
+
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
507 |
+
lineY = _ref1[_i];
|
508 |
+
y = this.transY(lineY);
|
509 |
+
if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') {
|
510 |
+
this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));
|
511 |
+
}
|
512 |
+
if (this.options.grid) {
|
513 |
+
_results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width)));
|
514 |
+
} else {
|
515 |
+
_results.push(void 0);
|
516 |
+
}
|
517 |
+
}
|
518 |
+
return _results;
|
519 |
+
};
|
520 |
+
|
521 |
+
Grid.prototype.drawGoals = function() {
|
522 |
+
var color, goal, i, _i, _len, _ref, _results;
|
523 |
+
_ref = this.options.goals;
|
524 |
+
_results = [];
|
525 |
+
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
|
526 |
+
goal = _ref[i];
|
527 |
+
color = this.options.goalLineColors[i % this.options.goalLineColors.length];
|
528 |
+
_results.push(this.drawGoal(goal, color));
|
529 |
+
}
|
530 |
+
return _results;
|
531 |
+
};
|
532 |
+
|
533 |
+
Grid.prototype.drawEvents = function() {
|
534 |
+
var color, event, i, _i, _len, _ref, _results;
|
535 |
+
_ref = this.events;
|
536 |
+
_results = [];
|
537 |
+
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
|
538 |
+
event = _ref[i];
|
539 |
+
color = this.options.eventLineColors[i % this.options.eventLineColors.length];
|
540 |
+
_results.push(this.drawEvent(event, color));
|
541 |
+
}
|
542 |
+
return _results;
|
543 |
+
};
|
544 |
+
|
545 |
+
Grid.prototype.drawGoal = function(goal, color) {
|
546 |
+
return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth);
|
547 |
+
};
|
548 |
+
|
549 |
+
Grid.prototype.drawEvent = function(event, color) {
|
550 |
+
return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth);
|
551 |
+
};
|
552 |
+
|
553 |
+
Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) {
|
554 |
+
return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end');
|
555 |
+
};
|
556 |
+
|
557 |
+
Grid.prototype.drawGridLine = function(path) {
|
558 |
+
return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth);
|
559 |
+
};
|
560 |
+
|
561 |
+
Grid.prototype.startRange = function(x) {
|
562 |
+
this.hover.hide();
|
563 |
+
this.selectFrom = x;
|
564 |
+
return this.selectionRect.attr({
|
565 |
+
x: x,
|
566 |
+
width: 0
|
567 |
+
}).show();
|
568 |
+
};
|
569 |
+
|
570 |
+
Grid.prototype.endRange = function(x) {
|
571 |
+
var end, start;
|
572 |
+
if (this.selectFrom) {
|
573 |
+
start = Math.min(this.selectFrom, x);
|
574 |
+
end = Math.max(this.selectFrom, x);
|
575 |
+
this.options.rangeSelect.call(this.el, {
|
576 |
+
start: this.data[this.hitTest(start)].x,
|
577 |
+
end: this.data[this.hitTest(end)].x
|
578 |
+
});
|
579 |
+
return this.selectFrom = null;
|
580 |
+
}
|
581 |
+
};
|
582 |
+
|
583 |
+
Grid.prototype.resizeHandler = function() {
|
584 |
+
this.timeoutId = null;
|
585 |
+
this.raphael.setSize(this.el.width(), this.el.height());
|
586 |
+
return this.redraw();
|
587 |
+
};
|
588 |
+
|
589 |
+
return Grid;
|
590 |
+
|
591 |
+
})(Morris.EventEmitter);
|
592 |
+
|
593 |
+
Morris.parseDate = function(date) {
|
594 |
+
var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs;
|
595 |
+
if (typeof date === 'number') {
|
596 |
+
return date;
|
597 |
+
}
|
598 |
+
m = date.match(/^(\d+) Q(\d)$/);
|
599 |
+
n = date.match(/^(\d+)-(\d+)$/);
|
600 |
+
o = date.match(/^(\d+)-(\d+)-(\d+)$/);
|
601 |
+
p = date.match(/^(\d+) W(\d+)$/);
|
602 |
+
q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/);
|
603 |
+
r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/);
|
604 |
+
if (m) {
|
605 |
+
return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime();
|
606 |
+
} else if (n) {
|
607 |
+
return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime();
|
608 |
+
} else if (o) {
|
609 |
+
return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime();
|
610 |
+
} else if (p) {
|
611 |
+
ret = new Date(parseInt(p[1], 10), 0, 1);
|
612 |
+
if (ret.getDay() !== 4) {
|
613 |
+
ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7);
|
614 |
+
}
|
615 |
+
return ret.getTime() + parseInt(p[2], 10) * 604800000;
|
616 |
+
} else if (q) {
|
617 |
+
if (!q[6]) {
|
618 |
+
return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime();
|
619 |
+
} else {
|
620 |
+
offsetmins = 0;
|
621 |
+
if (q[6] !== 'Z') {
|
622 |
+
offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10);
|
623 |
+
if (q[7] === '+') {
|
624 |
+
offsetmins = 0 - offsetmins;
|
625 |
+
}
|
626 |
+
}
|
627 |
+
return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins);
|
628 |
+
}
|
629 |
+
} else if (r) {
|
630 |
+
secs = parseFloat(r[6]);
|
631 |
+
isecs = Math.floor(secs);
|
632 |
+
msecs = Math.round((secs - isecs) * 1000);
|
633 |
+
if (!r[8]) {
|
634 |
+
return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime();
|
635 |
+
} else {
|
636 |
+
offsetmins = 0;
|
637 |
+
if (r[8] !== 'Z') {
|
638 |
+
offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10);
|
639 |
+
if (r[9] === '+') {
|
640 |
+
offsetmins = 0 - offsetmins;
|
641 |
+
}
|
642 |
+
}
|
643 |
+
return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs);
|
644 |
+
}
|
645 |
+
} else {
|
646 |
+
return new Date(parseInt(date, 10), 0, 1).getTime();
|
647 |
+
}
|
648 |
+
};
|
649 |
+
|
650 |
+
Morris.Hover = (function() {
|
651 |
+
Hover.defaults = {
|
652 |
+
"class": 'morris-hover morris-default-style'
|
653 |
+
};
|
654 |
+
|
655 |
+
function Hover(options) {
|
656 |
+
if (options == null) {
|
657 |
+
options = {};
|
658 |
+
}
|
659 |
+
this.options = $.extend({}, Morris.Hover.defaults, options);
|
660 |
+
this.el = $("<div class='" + this.options["class"] + "'></div>");
|
661 |
+
this.el.hide();
|
662 |
+
this.options.parent.append(this.el);
|
663 |
+
}
|
664 |
+
|
665 |
+
Hover.prototype.update = function(html, x, y) {
|
666 |
+
if (!html) {
|
667 |
+
return this.hide();
|
668 |
+
} else {
|
669 |
+
this.html(html);
|
670 |
+
this.show();
|
671 |
+
return this.moveTo(x, y);
|
672 |
+
}
|
673 |
+
};
|
674 |
+
|
675 |
+
Hover.prototype.html = function(content) {
|
676 |
+
return this.el.html(content);
|
677 |
+
};
|
678 |
+
|
679 |
+
Hover.prototype.moveTo = function(x, y) {
|
680 |
+
var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top;
|
681 |
+
parentWidth = this.options.parent.innerWidth();
|
682 |
+
parentHeight = this.options.parent.innerHeight();
|
683 |
+
hoverWidth = this.el.outerWidth();
|
684 |
+
hoverHeight = this.el.outerHeight();
|
685 |
+
left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth);
|
686 |
+
if (y != null) {
|
687 |
+
top = y - hoverHeight - 10;
|
688 |
+
if (top < 0) {
|
689 |
+
top = y + 10;
|
690 |
+
if (top + hoverHeight > parentHeight) {
|
691 |
+
top = parentHeight / 2 - hoverHeight / 2;
|
692 |
+
}
|
693 |
+
}
|
694 |
+
} else {
|
695 |
+
top = parentHeight / 2 - hoverHeight / 2;
|
696 |
+
}
|
697 |
+
return this.el.css({
|
698 |
+
left: left + "px",
|
699 |
+
top: parseInt(top) + "px"
|
700 |
+
});
|
701 |
+
};
|
702 |
+
|
703 |
+
Hover.prototype.show = function() {
|
704 |
+
return this.el.show();
|
705 |
+
};
|
706 |
+
|
707 |
+
Hover.prototype.hide = function() {
|
708 |
+
return this.el.hide();
|
709 |
+
};
|
710 |
+
|
711 |
+
return Hover;
|
712 |
+
|
713 |
+
})();
|
714 |
+
|
715 |
+
Morris.Line = (function(_super) {
|
716 |
+
__extends(Line, _super);
|
717 |
+
|
718 |
+
function Line(options) {
|
719 |
+
this.hilight = __bind(this.hilight, this);
|
720 |
+
this.onHoverOut = __bind(this.onHoverOut, this);
|
721 |
+
this.onHoverMove = __bind(this.onHoverMove, this);
|
722 |
+
this.onGridClick = __bind(this.onGridClick, this);
|
723 |
+
if (!(this instanceof Morris.Line)) {
|
724 |
+
return new Morris.Line(options);
|
725 |
+
}
|
726 |
+
Line.__super__.constructor.call(this, options);
|
727 |
+
}
|
728 |
+
|
729 |
+
Line.prototype.init = function() {
|
730 |
+
if (this.options.hideHover !== 'always') {
|
731 |
+
this.hover = new Morris.Hover({
|
732 |
+
parent: this.el
|
733 |
+
});
|
734 |
+
this.on('hovermove', this.onHoverMove);
|
735 |
+
this.on('hoverout', this.onHoverOut);
|
736 |
+
return this.on('gridclick', this.onGridClick);
|
737 |
+
}
|
738 |
+
};
|
739 |
+
|
740 |
+
Line.prototype.defaults = {
|
741 |
+
lineWidth: 3,
|
742 |
+
pointSize: 4,
|
743 |
+
lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],
|
744 |
+
pointStrokeWidths: [1],
|
745 |
+
pointStrokeColors: ['#ffffff'],
|
746 |
+
pointFillColors: [],
|
747 |
+
smooth: true,
|
748 |
+
xLabels: 'auto',
|
749 |
+
xLabelFormat: null,
|
750 |
+
xLabelMargin: 24,
|
751 |
+
hideHover: false
|
752 |
+
};
|
753 |
+
|
754 |
+
Line.prototype.calc = function() {
|
755 |
+
this.calcPoints();
|
756 |
+
return this.generatePaths();
|
757 |
+
};
|
758 |
+
|
759 |
+
Line.prototype.calcPoints = function() {
|
760 |
+
var row, y, _i, _len, _ref, _results;
|
761 |
+
_ref = this.data;
|
762 |
+
_results = [];
|
763 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
764 |
+
row = _ref[_i];
|
765 |
+
row._x = this.transX(row.x);
|
766 |
+
row._y = (function() {
|
767 |
+
var _j, _len1, _ref1, _results1;
|
768 |
+
_ref1 = row.y;
|
769 |
+
_results1 = [];
|
770 |
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
771 |
+
y = _ref1[_j];
|
772 |
+
if (y != null) {
|
773 |
+
_results1.push(this.transY(y));
|
774 |
+
} else {
|
775 |
+
_results1.push(y);
|
776 |
+
}
|
777 |
+
}
|
778 |
+
return _results1;
|
779 |
+
}).call(this);
|
780 |
+
_results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() {
|
781 |
+
var _j, _len1, _ref1, _results1;
|
782 |
+
_ref1 = row._y;
|
783 |
+
_results1 = [];
|
784 |
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
785 |
+
y = _ref1[_j];
|
786 |
+
if (y != null) {
|
787 |
+
_results1.push(y);
|
788 |
+
}
|
789 |
+
}
|
790 |
+
return _results1;
|
791 |
+
})())));
|
792 |
+
}
|
793 |
+
return _results;
|
794 |
+
};
|
795 |
+
|
796 |
+
Line.prototype.hitTest = function(x) {
|
797 |
+
var index, r, _i, _len, _ref;
|
798 |
+
if (this.data.length === 0) {
|
799 |
+
return null;
|
800 |
+
}
|
801 |
+
_ref = this.data.slice(1);
|
802 |
+
for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) {
|
803 |
+
r = _ref[index];
|
804 |
+
if (x < (r._x + this.data[index]._x) / 2) {
|
805 |
+
break;
|
806 |
+
}
|
807 |
+
}
|
808 |
+
return index;
|
809 |
+
};
|
810 |
+
|
811 |
+
Line.prototype.onGridClick = function(x, y) {
|
812 |
+
var index;
|
813 |
+
index = this.hitTest(x);
|
814 |
+
return this.fire('click', index, this.data[index].src, x, y);
|
815 |
+
};
|
816 |
+
|
817 |
+
Line.prototype.onHoverMove = function(x, y) {
|
818 |
+
var index;
|
819 |
+
index = this.hitTest(x);
|
820 |
+
return this.displayHoverForRow(index);
|
821 |
+
};
|
822 |
+
|
823 |
+
Line.prototype.onHoverOut = function() {
|
824 |
+
if (this.options.hideHover !== false) {
|
825 |
+
return this.displayHoverForRow(null);
|
826 |
+
}
|
827 |
+
};
|
828 |
+
|
829 |
+
Line.prototype.displayHoverForRow = function(index) {
|
830 |
+
var _ref;
|
831 |
+
if (index != null) {
|
832 |
+
(_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));
|
833 |
+
return this.hilight(index);
|
834 |
+
} else {
|
835 |
+
this.hover.hide();
|
836 |
+
return this.hilight();
|
837 |
+
}
|
838 |
+
};
|
839 |
+
|
840 |
+
Line.prototype.hoverContentForRow = function(index) {
|
841 |
+
var content, j, row, y, _i, _len, _ref;
|
842 |
+
row = this.data[index];
|
843 |
+
content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
|
844 |
+
_ref = row.y;
|
845 |
+
for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
|
846 |
+
y = _ref[j];
|
847 |
+
content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
|
848 |
+
}
|
849 |
+
if (typeof this.options.hoverCallback === 'function') {
|
850 |
+
content = this.options.hoverCallback(index, this.options, content, row.src);
|
851 |
+
}
|
852 |
+
return [content, row._x, row._ymax];
|
853 |
+
};
|
854 |
+
|
855 |
+
Line.prototype.generatePaths = function() {
|
856 |
+
var coords, i, r, smooth;
|
857 |
+
return this.paths = (function() {
|
858 |
+
var _i, _ref, _ref1, _results;
|
859 |
+
_results = [];
|
860 |
+
for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
|
861 |
+
smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0);
|
862 |
+
coords = (function() {
|
863 |
+
var _j, _len, _ref2, _results1;
|
864 |
+
_ref2 = this.data;
|
865 |
+
_results1 = [];
|
866 |
+
for (_j = 0, _len = _ref2.length; _j < _len; _j++) {
|
867 |
+
r = _ref2[_j];
|
868 |
+
if (r._y[i] !== void 0) {
|
869 |
+
_results1.push({
|
870 |
+
x: r._x,
|
871 |
+
y: r._y[i]
|
872 |
+
});
|
873 |
+
}
|
874 |
+
}
|
875 |
+
return _results1;
|
876 |
+
}).call(this);
|
877 |
+
if (coords.length > 1) {
|
878 |
+
_results.push(Morris.Line.createPath(coords, smooth, this.bottom));
|
879 |
+
} else {
|
880 |
+
_results.push(null);
|
881 |
+
}
|
882 |
+
}
|
883 |
+
return _results;
|
884 |
+
}).call(this);
|
885 |
+
};
|
886 |
+
|
887 |
+
Line.prototype.draw = function() {
|
888 |
+
var _ref;
|
889 |
+
if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {
|
890 |
+
this.drawXAxis();
|
891 |
+
}
|
892 |
+
this.drawSeries();
|
893 |
+
if (this.options.hideHover === false) {
|
894 |
+
return this.displayHoverForRow(this.data.length - 1);
|
895 |
+
}
|
896 |
+
};
|
897 |
+
|
898 |
+
Line.prototype.drawXAxis = function() {
|
899 |
+
var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results,
|
900 |
+
_this = this;
|
901 |
+
ypos = this.bottom + this.options.padding / 2;
|
902 |
+
prevLabelMargin = null;
|
903 |
+
prevAngleMargin = null;
|
904 |
+
drawLabel = function(labelText, xpos) {
|
905 |
+
var label, labelBox, margin, offset, textBox;
|
906 |
+
label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText);
|
907 |
+
textBox = label.getBBox();
|
908 |
+
label.transform("r" + (-_this.options.xLabelAngle));
|
909 |
+
labelBox = label.getBBox();
|
910 |
+
label.transform("t0," + (labelBox.height / 2) + "...");
|
911 |
+
if (_this.options.xLabelAngle !== 0) {
|
912 |
+
offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0);
|
913 |
+
label.transform("t" + offset + ",0...");
|
914 |
+
}
|
915 |
+
labelBox = label.getBBox();
|
916 |
+
if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) {
|
917 |
+
if (_this.options.xLabelAngle !== 0) {
|
918 |
+
margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0);
|
919 |
+
prevAngleMargin = labelBox.x - margin;
|
920 |
+
}
|
921 |
+
return prevLabelMargin = labelBox.x - _this.options.xLabelMargin;
|
922 |
+
} else {
|
923 |
+
return label.remove();
|
924 |
+
}
|
925 |
+
};
|
926 |
+
if (this.options.parseTime) {
|
927 |
+
if (this.data.length === 1 && this.options.xLabels === 'auto') {
|
928 |
+
labels = [[this.data[0].label, this.data[0].x]];
|
929 |
+
} else {
|
930 |
+
labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat);
|
931 |
+
}
|
932 |
+
} else {
|
933 |
+
labels = (function() {
|
934 |
+
var _i, _len, _ref, _results;
|
935 |
+
_ref = this.data;
|
936 |
+
_results = [];
|
937 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
938 |
+
row = _ref[_i];
|
939 |
+
_results.push([row.label, row.x]);
|
940 |
+
}
|
941 |
+
return _results;
|
942 |
+
}).call(this);
|
943 |
+
}
|
944 |
+
labels.reverse();
|
945 |
+
_results = [];
|
946 |
+
for (_i = 0, _len = labels.length; _i < _len; _i++) {
|
947 |
+
l = labels[_i];
|
948 |
+
_results.push(drawLabel(l[0], l[1]));
|
949 |
+
}
|
950 |
+
return _results;
|
951 |
+
};
|
952 |
+
|
953 |
+
Line.prototype.drawSeries = function() {
|
954 |
+
var i, _i, _j, _ref, _ref1, _results;
|
955 |
+
this.seriesPoints = [];
|
956 |
+
for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {
|
957 |
+
this._drawLineFor(i);
|
958 |
+
}
|
959 |
+
_results = [];
|
960 |
+
for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {
|
961 |
+
_results.push(this._drawPointFor(i));
|
962 |
+
}
|
963 |
+
return _results;
|
964 |
+
};
|
965 |
+
|
966 |
+
Line.prototype._drawPointFor = function(index) {
|
967 |
+
var circle, row, _i, _len, _ref, _results;
|
968 |
+
this.seriesPoints[index] = [];
|
969 |
+
_ref = this.data;
|
970 |
+
_results = [];
|
971 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
972 |
+
row = _ref[_i];
|
973 |
+
circle = null;
|
974 |
+
if (row._y[index] != null) {
|
975 |
+
circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index);
|
976 |
+
}
|
977 |
+
_results.push(this.seriesPoints[index].push(circle));
|
978 |
+
}
|
979 |
+
return _results;
|
980 |
+
};
|
981 |
+
|
982 |
+
Line.prototype._drawLineFor = function(index) {
|
983 |
+
var path;
|
984 |
+
path = this.paths[index];
|
985 |
+
if (path !== null) {
|
986 |
+
return this.drawLinePath(path, this.colorFor(null, index, 'line'), index);
|
987 |
+
}
|
988 |
+
};
|
989 |
+
|
990 |
+
Line.createPath = function(coords, smooth, bottom) {
|
991 |
+
var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;
|
992 |
+
path = "";
|
993 |
+
if (smooth) {
|
994 |
+
grads = Morris.Line.gradients(coords);
|
995 |
+
}
|
996 |
+
prevCoord = {
|
997 |
+
y: null
|
998 |
+
};
|
999 |
+
for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {
|
1000 |
+
coord = coords[i];
|
1001 |
+
if (coord.y != null) {
|
1002 |
+
if (prevCoord.y != null) {
|
1003 |
+
if (smooth) {
|
1004 |
+
g = grads[i];
|
1005 |
+
lg = grads[i - 1];
|
1006 |
+
ix = (coord.x - prevCoord.x) / 4;
|
1007 |
+
x1 = prevCoord.x + ix;
|
1008 |
+
y1 = Math.min(bottom, prevCoord.y + ix * lg);
|
1009 |
+
x2 = coord.x - ix;
|
1010 |
+
y2 = Math.min(bottom, coord.y - ix * g);
|
1011 |
+
path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y;
|
1012 |
+
} else {
|
1013 |
+
path += "L" + coord.x + "," + coord.y;
|
1014 |
+
}
|
1015 |
+
} else {
|
1016 |
+
if (!smooth || (grads[i] != null)) {
|
1017 |
+
path += "M" + coord.x + "," + coord.y;
|
1018 |
+
}
|
1019 |
+
}
|
1020 |
+
}
|
1021 |
+
prevCoord = coord;
|
1022 |
+
}
|
1023 |
+
return path;
|
1024 |
+
};
|
1025 |
+
|
1026 |
+
Line.gradients = function(coords) {
|
1027 |
+
var coord, grad, i, nextCoord, prevCoord, _i, _len, _results;
|
1028 |
+
grad = function(a, b) {
|
1029 |
+
return (a.y - b.y) / (a.x - b.x);
|
1030 |
+
};
|
1031 |
+
_results = [];
|
1032 |
+
for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) {
|
1033 |
+
coord = coords[i];
|
1034 |
+
if (coord.y != null) {
|
1035 |
+
nextCoord = coords[i + 1] || {
|
1036 |
+
y: null
|
1037 |
+
};
|
1038 |
+
prevCoord = coords[i - 1] || {
|
1039 |
+
y: null
|
1040 |
+
};
|
1041 |
+
if ((prevCoord.y != null) && (nextCoord.y != null)) {
|
1042 |
+
_results.push(grad(prevCoord, nextCoord));
|
1043 |
+
} else if (prevCoord.y != null) {
|
1044 |
+
_results.push(grad(prevCoord, coord));
|
1045 |
+
} else if (nextCoord.y != null) {
|
1046 |
+
_results.push(grad(coord, nextCoord));
|
1047 |
+
} else {
|
1048 |
+
_results.push(null);
|
1049 |
+
}
|
1050 |
+
} else {
|
1051 |
+
_results.push(null);
|
1052 |
+
}
|
1053 |
+
}
|
1054 |
+
return _results;
|
1055 |
+
};
|
1056 |
+
|
1057 |
+
Line.prototype.hilight = function(index) {
|
1058 |
+
var i, _i, _j, _ref, _ref1;
|
1059 |
+
if (this.prevHilight !== null && this.prevHilight !== index) {
|
1060 |
+
for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
|
1061 |
+
if (this.seriesPoints[i][this.prevHilight]) {
|
1062 |
+
this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i));
|
1063 |
+
}
|
1064 |
+
}
|
1065 |
+
}
|
1066 |
+
if (index !== null && this.prevHilight !== index) {
|
1067 |
+
for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
|
1068 |
+
if (this.seriesPoints[i][index]) {
|
1069 |
+
this.seriesPoints[i][index].animate(this.pointGrowSeries(i));
|
1070 |
+
}
|
1071 |
+
}
|
1072 |
+
}
|
1073 |
+
return this.prevHilight = index;
|
1074 |
+
};
|
1075 |
+
|
1076 |
+
Line.prototype.colorFor = function(row, sidx, type) {
|
1077 |
+
if (typeof this.options.lineColors === 'function') {
|
1078 |
+
return this.options.lineColors.call(this, row, sidx, type);
|
1079 |
+
} else if (type === 'point') {
|
1080 |
+
return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length];
|
1081 |
+
} else {
|
1082 |
+
return this.options.lineColors[sidx % this.options.lineColors.length];
|
1083 |
+
}
|
1084 |
+
};
|
1085 |
+
|
1086 |
+
Line.prototype.drawXAxisLabel = function(xPos, yPos, text) {
|
1087 |
+
return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);
|
1088 |
+
};
|
1089 |
+
|
1090 |
+
Line.prototype.drawLinePath = function(path, lineColor, lineIndex) {
|
1091 |
+
return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex));
|
1092 |
+
};
|
1093 |
+
|
1094 |
+
Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) {
|
1095 |
+
return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex));
|
1096 |
+
};
|
1097 |
+
|
1098 |
+
Line.prototype.pointStrokeWidthForSeries = function(index) {
|
1099 |
+
return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length];
|
1100 |
+
};
|
1101 |
+
|
1102 |
+
Line.prototype.pointStrokeColorForSeries = function(index) {
|
1103 |
+
return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length];
|
1104 |
+
};
|
1105 |
+
|
1106 |
+
Line.prototype.lineWidthForSeries = function(index) {
|
1107 |
+
if (this.options.lineWidth instanceof Array) {
|
1108 |
+
return this.options.lineWidth[index % this.options.lineWidth.length];
|
1109 |
+
} else {
|
1110 |
+
return this.options.lineWidth;
|
1111 |
+
}
|
1112 |
+
};
|
1113 |
+
|
1114 |
+
Line.prototype.pointSizeForSeries = function(index) {
|
1115 |
+
if (this.options.pointSize instanceof Array) {
|
1116 |
+
return this.options.pointSize[index % this.options.pointSize.length];
|
1117 |
+
} else {
|
1118 |
+
return this.options.pointSize;
|
1119 |
+
}
|
1120 |
+
};
|
1121 |
+
|
1122 |
+
Line.prototype.pointGrowSeries = function(index) {
|
1123 |
+
return Raphael.animation({
|
1124 |
+
r: this.pointSizeForSeries(index) + 3
|
1125 |
+
}, 25, 'linear');
|
1126 |
+
};
|
1127 |
+
|
1128 |
+
Line.prototype.pointShrinkSeries = function(index) {
|
1129 |
+
return Raphael.animation({
|
1130 |
+
r: this.pointSizeForSeries(index)
|
1131 |
+
}, 25, 'linear');
|
1132 |
+
};
|
1133 |
+
|
1134 |
+
return Line;
|
1135 |
+
|
1136 |
+
})(Morris.Grid);
|
1137 |
+
|
1138 |
+
Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) {
|
1139 |
+
var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref;
|
1140 |
+
ddensity = 200 * (dmax - dmin) / pxwidth;
|
1141 |
+
d0 = new Date(dmin);
|
1142 |
+
spec = Morris.LABEL_SPECS[specName];
|
1143 |
+
if (spec === void 0) {
|
1144 |
+
_ref = Morris.AUTO_LABEL_ORDER;
|
1145 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1146 |
+
name = _ref[_i];
|
1147 |
+
s = Morris.LABEL_SPECS[name];
|
1148 |
+
if (ddensity >= s.span) {
|
1149 |
+
spec = s;
|
1150 |
+
break;
|
1151 |
+
}
|
1152 |
+
}
|
1153 |
+
}
|
1154 |
+
if (spec === void 0) {
|
1155 |
+
spec = Morris.LABEL_SPECS["second"];
|
1156 |
+
}
|
1157 |
+
if (xLabelFormat) {
|
1158 |
+
spec = $.extend({}, spec, {
|
1159 |
+
fmt: xLabelFormat
|
1160 |
+
});
|
1161 |
+
}
|
1162 |
+
d = spec.start(d0);
|
1163 |
+
ret = [];
|
1164 |
+
while ((t = d.getTime()) <= dmax) {
|
1165 |
+
if (t >= dmin) {
|
1166 |
+
ret.push([spec.fmt(d), t]);
|
1167 |
+
}
|
1168 |
+
spec.incr(d);
|
1169 |
+
}
|
1170 |
+
return ret;
|
1171 |
+
};
|
1172 |
+
|
1173 |
+
minutesSpecHelper = function(interval) {
|
1174 |
+
return {
|
1175 |
+
span: interval * 60 * 1000,
|
1176 |
+
start: function(d) {
|
1177 |
+
return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());
|
1178 |
+
},
|
1179 |
+
fmt: function(d) {
|
1180 |
+
return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes()));
|
1181 |
+
},
|
1182 |
+
incr: function(d) {
|
1183 |
+
return d.setUTCMinutes(d.getUTCMinutes() + interval);
|
1184 |
+
}
|
1185 |
+
};
|
1186 |
+
};
|
1187 |
+
|
1188 |
+
secondsSpecHelper = function(interval) {
|
1189 |
+
return {
|
1190 |
+
span: interval * 1000,
|
1191 |
+
start: function(d) {
|
1192 |
+
return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());
|
1193 |
+
},
|
1194 |
+
fmt: function(d) {
|
1195 |
+
return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds()));
|
1196 |
+
},
|
1197 |
+
incr: function(d) {
|
1198 |
+
return d.setUTCSeconds(d.getUTCSeconds() + interval);
|
1199 |
+
}
|
1200 |
+
};
|
1201 |
+
};
|
1202 |
+
|
1203 |
+
Morris.LABEL_SPECS = {
|
1204 |
+
"decade": {
|
1205 |
+
span: 172800000000,
|
1206 |
+
start: function(d) {
|
1207 |
+
return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1);
|
1208 |
+
},
|
1209 |
+
fmt: function(d) {
|
1210 |
+
return "" + (d.getFullYear());
|
1211 |
+
},
|
1212 |
+
incr: function(d) {
|
1213 |
+
return d.setFullYear(d.getFullYear() + 10);
|
1214 |
+
}
|
1215 |
+
},
|
1216 |
+
"year": {
|
1217 |
+
span: 17280000000,
|
1218 |
+
start: function(d) {
|
1219 |
+
return new Date(d.getFullYear(), 0, 1);
|
1220 |
+
},
|
1221 |
+
fmt: function(d) {
|
1222 |
+
return "" + (d.getFullYear());
|
1223 |
+
},
|
1224 |
+
incr: function(d) {
|
1225 |
+
return d.setFullYear(d.getFullYear() + 1);
|
1226 |
+
}
|
1227 |
+
},
|
1228 |
+
"month": {
|
1229 |
+
span: 2419200000,
|
1230 |
+
start: function(d) {
|
1231 |
+
return new Date(d.getFullYear(), d.getMonth(), 1);
|
1232 |
+
},
|
1233 |
+
fmt: function(d) {
|
1234 |
+
return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1));
|
1235 |
+
},
|
1236 |
+
incr: function(d) {
|
1237 |
+
return d.setMonth(d.getMonth() + 1);
|
1238 |
+
}
|
1239 |
+
},
|
1240 |
+
"week": {
|
1241 |
+
span: 604800000,
|
1242 |
+
start: function(d) {
|
1243 |
+
return new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
1244 |
+
},
|
1245 |
+
fmt: function(d) {
|
1246 |
+
return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate()));
|
1247 |
+
},
|
1248 |
+
incr: function(d) {
|
1249 |
+
return d.setDate(d.getDate() + 7);
|
1250 |
+
}
|
1251 |
+
},
|
1252 |
+
"day": {
|
1253 |
+
span: 86400000,
|
1254 |
+
start: function(d) {
|
1255 |
+
return new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
1256 |
+
},
|
1257 |
+
fmt: function(d) {
|
1258 |
+
return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate()));
|
1259 |
+
},
|
1260 |
+
incr: function(d) {
|
1261 |
+
return d.setDate(d.getDate() + 1);
|
1262 |
+
}
|
1263 |
+
},
|
1264 |
+
"hour": minutesSpecHelper(60),
|
1265 |
+
"30min": minutesSpecHelper(30),
|
1266 |
+
"15min": minutesSpecHelper(15),
|
1267 |
+
"10min": minutesSpecHelper(10),
|
1268 |
+
"5min": minutesSpecHelper(5),
|
1269 |
+
"minute": minutesSpecHelper(1),
|
1270 |
+
"30sec": secondsSpecHelper(30),
|
1271 |
+
"15sec": secondsSpecHelper(15),
|
1272 |
+
"10sec": secondsSpecHelper(10),
|
1273 |
+
"5sec": secondsSpecHelper(5),
|
1274 |
+
"second": secondsSpecHelper(1)
|
1275 |
+
};
|
1276 |
+
|
1277 |
+
Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"];
|
1278 |
+
|
1279 |
+
Morris.Area = (function(_super) {
|
1280 |
+
var areaDefaults;
|
1281 |
+
|
1282 |
+
__extends(Area, _super);
|
1283 |
+
|
1284 |
+
areaDefaults = {
|
1285 |
+
fillOpacity: 'auto',
|
1286 |
+
behaveLikeLine: false
|
1287 |
+
};
|
1288 |
+
|
1289 |
+
function Area(options) {
|
1290 |
+
var areaOptions;
|
1291 |
+
if (!(this instanceof Morris.Area)) {
|
1292 |
+
return new Morris.Area(options);
|
1293 |
+
}
|
1294 |
+
areaOptions = $.extend({}, areaDefaults, options);
|
1295 |
+
this.cumulative = !areaOptions.behaveLikeLine;
|
1296 |
+
if (areaOptions.fillOpacity === 'auto') {
|
1297 |
+
areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;
|
1298 |
+
}
|
1299 |
+
Area.__super__.constructor.call(this, areaOptions);
|
1300 |
+
}
|
1301 |
+
|
1302 |
+
Area.prototype.calcPoints = function() {
|
1303 |
+
var row, total, y, _i, _len, _ref, _results;
|
1304 |
+
_ref = this.data;
|
1305 |
+
_results = [];
|
1306 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1307 |
+
row = _ref[_i];
|
1308 |
+
row._x = this.transX(row.x);
|
1309 |
+
total = 0;
|
1310 |
+
row._y = (function() {
|
1311 |
+
var _j, _len1, _ref1, _results1;
|
1312 |
+
_ref1 = row.y;
|
1313 |
+
_results1 = [];
|
1314 |
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
1315 |
+
y = _ref1[_j];
|
1316 |
+
if (this.options.behaveLikeLine) {
|
1317 |
+
_results1.push(this.transY(y));
|
1318 |
+
} else {
|
1319 |
+
total += y || 0;
|
1320 |
+
_results1.push(this.transY(total));
|
1321 |
+
}
|
1322 |
+
}
|
1323 |
+
return _results1;
|
1324 |
+
}).call(this);
|
1325 |
+
_results.push(row._ymax = Math.max.apply(Math, row._y));
|
1326 |
+
}
|
1327 |
+
return _results;
|
1328 |
+
};
|
1329 |
+
|
1330 |
+
Area.prototype.drawSeries = function() {
|
1331 |
+
var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;
|
1332 |
+
this.seriesPoints = [];
|
1333 |
+
if (this.options.behaveLikeLine) {
|
1334 |
+
range = (function() {
|
1335 |
+
_results = [];
|
1336 |
+
for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
|
1337 |
+
return _results;
|
1338 |
+
}).apply(this);
|
1339 |
+
} else {
|
1340 |
+
range = (function() {
|
1341 |
+
_results1 = [];
|
1342 |
+
for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }
|
1343 |
+
return _results1;
|
1344 |
+
}).apply(this);
|
1345 |
+
}
|
1346 |
+
_results2 = [];
|
1347 |
+
for (_k = 0, _len = range.length; _k < _len; _k++) {
|
1348 |
+
i = range[_k];
|
1349 |
+
this._drawFillFor(i);
|
1350 |
+
this._drawLineFor(i);
|
1351 |
+
_results2.push(this._drawPointFor(i));
|
1352 |
+
}
|
1353 |
+
return _results2;
|
1354 |
+
};
|
1355 |
+
|
1356 |
+
Area.prototype._drawFillFor = function(index) {
|
1357 |
+
var path;
|
1358 |
+
path = this.paths[index];
|
1359 |
+
if (path !== null) {
|
1360 |
+
path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z");
|
1361 |
+
return this.drawFilledPath(path, this.fillForSeries(index));
|
1362 |
+
}
|
1363 |
+
};
|
1364 |
+
|
1365 |
+
Area.prototype.fillForSeries = function(i) {
|
1366 |
+
var color;
|
1367 |
+
color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));
|
1368 |
+
return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));
|
1369 |
+
};
|
1370 |
+
|
1371 |
+
Area.prototype.drawFilledPath = function(path, fill) {
|
1372 |
+
return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none');
|
1373 |
+
};
|
1374 |
+
|
1375 |
+
return Area;
|
1376 |
+
|
1377 |
+
})(Morris.Line);
|
1378 |
+
|
1379 |
+
Morris.Bar = (function(_super) {
|
1380 |
+
__extends(Bar, _super);
|
1381 |
+
|
1382 |
+
function Bar(options) {
|
1383 |
+
this.onHoverOut = __bind(this.onHoverOut, this);
|
1384 |
+
this.onHoverMove = __bind(this.onHoverMove, this);
|
1385 |
+
this.onGridClick = __bind(this.onGridClick, this);
|
1386 |
+
if (!(this instanceof Morris.Bar)) {
|
1387 |
+
return new Morris.Bar(options);
|
1388 |
+
}
|
1389 |
+
Bar.__super__.constructor.call(this, $.extend({}, options, {
|
1390 |
+
parseTime: false
|
1391 |
+
}));
|
1392 |
+
}
|
1393 |
+
|
1394 |
+
Bar.prototype.init = function() {
|
1395 |
+
this.cumulative = this.options.stacked;
|
1396 |
+
if (this.options.hideHover !== 'always') {
|
1397 |
+
this.hover = new Morris.Hover({
|
1398 |
+
parent: this.el
|
1399 |
+
});
|
1400 |
+
this.on('hovermove', this.onHoverMove);
|
1401 |
+
this.on('hoverout', this.onHoverOut);
|
1402 |
+
return this.on('gridclick', this.onGridClick);
|
1403 |
+
}
|
1404 |
+
};
|
1405 |
+
|
1406 |
+
Bar.prototype.defaults = {
|
1407 |
+
barSizeRatio: 0.75,
|
1408 |
+
barGap: 3,
|
1409 |
+
barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'],
|
1410 |
+
barOpacity: 1.0,
|
1411 |
+
barRadius: [0, 0, 0, 0],
|
1412 |
+
xLabelMargin: 50
|
1413 |
+
};
|
1414 |
+
|
1415 |
+
Bar.prototype.calc = function() {
|
1416 |
+
var _ref;
|
1417 |
+
this.calcBars();
|
1418 |
+
if (this.options.hideHover === false) {
|
1419 |
+
return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1));
|
1420 |
+
}
|
1421 |
+
};
|
1422 |
+
|
1423 |
+
Bar.prototype.calcBars = function() {
|
1424 |
+
var idx, row, y, _i, _len, _ref, _results;
|
1425 |
+
_ref = this.data;
|
1426 |
+
_results = [];
|
1427 |
+
for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {
|
1428 |
+
row = _ref[idx];
|
1429 |
+
row._x = this.left + this.width * (idx + 0.5) / this.data.length;
|
1430 |
+
_results.push(row._y = (function() {
|
1431 |
+
var _j, _len1, _ref1, _results1;
|
1432 |
+
_ref1 = row.y;
|
1433 |
+
_results1 = [];
|
1434 |
+
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
1435 |
+
y = _ref1[_j];
|
1436 |
+
if (y != null) {
|
1437 |
+
_results1.push(this.transY(y));
|
1438 |
+
} else {
|
1439 |
+
_results1.push(null);
|
1440 |
+
}
|
1441 |
+
}
|
1442 |
+
return _results1;
|
1443 |
+
}).call(this));
|
1444 |
+
}
|
1445 |
+
return _results;
|
1446 |
+
};
|
1447 |
+
|
1448 |
+
Bar.prototype.draw = function() {
|
1449 |
+
var _ref;
|
1450 |
+
if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') {
|
1451 |
+
this.drawXAxis();
|
1452 |
+
}
|
1453 |
+
return this.drawSeries();
|
1454 |
+
};
|
1455 |
+
|
1456 |
+
Bar.prototype.drawXAxis = function() {
|
1457 |
+
var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results;
|
1458 |
+
ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2);
|
1459 |
+
prevLabelMargin = null;
|
1460 |
+
prevAngleMargin = null;
|
1461 |
+
_results = [];
|
1462 |
+
for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
|
1463 |
+
row = this.data[this.data.length - 1 - i];
|
1464 |
+
label = this.drawXAxisLabel(row._x, ypos, row.label);
|
1465 |
+
textBox = label.getBBox();
|
1466 |
+
label.transform("r" + (-this.options.xLabelAngle));
|
1467 |
+
labelBox = label.getBBox();
|
1468 |
+
label.transform("t0," + (labelBox.height / 2) + "...");
|
1469 |
+
if (this.options.xLabelAngle !== 0) {
|
1470 |
+
offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0);
|
1471 |
+
label.transform("t" + offset + ",0...");
|
1472 |
+
}
|
1473 |
+
if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) {
|
1474 |
+
if (this.options.xLabelAngle !== 0) {
|
1475 |
+
margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0);
|
1476 |
+
prevAngleMargin = labelBox.x - margin;
|
1477 |
+
}
|
1478 |
+
_results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin);
|
1479 |
+
} else {
|
1480 |
+
_results.push(label.remove());
|
1481 |
+
}
|
1482 |
+
}
|
1483 |
+
return _results;
|
1484 |
+
};
|
1485 |
+
|
1486 |
+
Bar.prototype.drawSeries = function() {
|
1487 |
+
var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos;
|
1488 |
+
groupWidth = this.width / this.options.data.length;
|
1489 |
+
numBars = this.options.stacked ? 1 : this.options.ykeys.length;
|
1490 |
+
barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars;
|
1491 |
+
if (this.options.barSize) {
|
1492 |
+
barWidth = Math.min(barWidth, this.options.barSize);
|
1493 |
+
}
|
1494 |
+
spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1);
|
1495 |
+
leftPadding = spaceLeft / 2;
|
1496 |
+
zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null;
|
1497 |
+
return this.bars = (function() {
|
1498 |
+
var _i, _len, _ref, _results;
|
1499 |
+
_ref = this.data;
|
1500 |
+
_results = [];
|
1501 |
+
for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) {
|
1502 |
+
row = _ref[idx];
|
1503 |
+
lastTop = 0;
|
1504 |
+
_results.push((function() {
|
1505 |
+
var _j, _len1, _ref1, _results1;
|
1506 |
+
_ref1 = row._y;
|
1507 |
+
_results1 = [];
|
1508 |
+
for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) {
|
1509 |
+
ypos = _ref1[sidx];
|
1510 |
+
if (ypos !== null) {
|
1511 |
+
if (zeroPos) {
|
1512 |
+
top = Math.min(ypos, zeroPos);
|
1513 |
+
bottom = Math.max(ypos, zeroPos);
|
1514 |
+
} else {
|
1515 |
+
top = ypos;
|
1516 |
+
bottom = this.bottom;
|
1517 |
+
}
|
1518 |
+
left = this.left + idx * groupWidth + leftPadding;
|
1519 |
+
if (!this.options.stacked) {
|
1520 |
+
left += sidx * (barWidth + this.options.barGap);
|
1521 |
+
}
|
1522 |
+
size = bottom - top;
|
1523 |
+
if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) {
|
1524 |
+
this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius);
|
1525 |
+
}
|
1526 |
+
if (this.options.stacked) {
|
1527 |
+
top -= lastTop;
|
1528 |
+
}
|
1529 |
+
this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius);
|
1530 |
+
_results1.push(lastTop += size);
|
1531 |
+
} else {
|
1532 |
+
_results1.push(null);
|
1533 |
+
}
|
1534 |
+
}
|
1535 |
+
return _results1;
|
1536 |
+
}).call(this));
|
1537 |
+
}
|
1538 |
+
return _results;
|
1539 |
+
}).call(this);
|
1540 |
+
};
|
1541 |
+
|
1542 |
+
Bar.prototype.colorFor = function(row, sidx, type) {
|
1543 |
+
var r, s;
|
1544 |
+
if (typeof this.options.barColors === 'function') {
|
1545 |
+
r = {
|
1546 |
+
x: row.x,
|
1547 |
+
y: row.y[sidx],
|
1548 |
+
label: row.label
|
1549 |
+
};
|
1550 |
+
s = {
|
1551 |
+
index: sidx,
|
1552 |
+
key: this.options.ykeys[sidx],
|
1553 |
+
label: this.options.labels[sidx]
|
1554 |
+
};
|
1555 |
+
return this.options.barColors.call(this, r, s, type);
|
1556 |
+
} else {
|
1557 |
+
return this.options.barColors[sidx % this.options.barColors.length];
|
1558 |
+
}
|
1559 |
+
};
|
1560 |
+
|
1561 |
+
Bar.prototype.hitTest = function(x) {
|
1562 |
+
if (this.data.length === 0) {
|
1563 |
+
return null;
|
1564 |
+
}
|
1565 |
+
x = Math.max(Math.min(x, this.right), this.left);
|
1566 |
+
return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));
|
1567 |
+
};
|
1568 |
+
|
1569 |
+
Bar.prototype.onGridClick = function(x, y) {
|
1570 |
+
var index;
|
1571 |
+
index = this.hitTest(x);
|
1572 |
+
return this.fire('click', index, this.data[index].src, x, y);
|
1573 |
+
};
|
1574 |
+
|
1575 |
+
Bar.prototype.onHoverMove = function(x, y) {
|
1576 |
+
var index, _ref;
|
1577 |
+
index = this.hitTest(x);
|
1578 |
+
return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index));
|
1579 |
+
};
|
1580 |
+
|
1581 |
+
Bar.prototype.onHoverOut = function() {
|
1582 |
+
if (this.options.hideHover !== false) {
|
1583 |
+
return this.hover.hide();
|
1584 |
+
}
|
1585 |
+
};
|
1586 |
+
|
1587 |
+
Bar.prototype.hoverContentForRow = function(index) {
|
1588 |
+
var content, j, row, x, y, _i, _len, _ref;
|
1589 |
+
row = this.data[index];
|
1590 |
+
content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
|
1591 |
+
_ref = row.y;
|
1592 |
+
for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
|
1593 |
+
y = _ref[j];
|
1594 |
+
content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
|
1595 |
+
}
|
1596 |
+
if (typeof this.options.hoverCallback === 'function') {
|
1597 |
+
content = this.options.hoverCallback(index, this.options, content, row.src);
|
1598 |
+
}
|
1599 |
+
x = this.left + (index + 0.5) * this.width / this.data.length;
|
1600 |
+
return [content, x];
|
1601 |
+
};
|
1602 |
+
|
1603 |
+
Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) {
|
1604 |
+
var label;
|
1605 |
+
return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor);
|
1606 |
+
};
|
1607 |
+
|
1608 |
+
Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) {
|
1609 |
+
var maxRadius, path;
|
1610 |
+
maxRadius = Math.max.apply(Math, radiusArray);
|
1611 |
+
if (maxRadius === 0 || maxRadius > height) {
|
1612 |
+
path = this.raphael.rect(xPos, yPos, width, height);
|
1613 |
+
} else {
|
1614 |
+
path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray));
|
1615 |
+
}
|
1616 |
+
return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none');
|
1617 |
+
};
|
1618 |
+
|
1619 |
+
Bar.prototype.roundedRect = function(x, y, w, h, r) {
|
1620 |
+
if (r == null) {
|
1621 |
+
r = [0, 0, 0, 0];
|
1622 |
+
}
|
1623 |
+
return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"];
|
1624 |
+
};
|
1625 |
+
|
1626 |
+
return Bar;
|
1627 |
+
|
1628 |
+
})(Morris.Grid);
|
1629 |
+
|
1630 |
+
Morris.Donut = (function(_super) {
|
1631 |
+
__extends(Donut, _super);
|
1632 |
+
|
1633 |
+
Donut.prototype.defaults = {
|
1634 |
+
colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],
|
1635 |
+
backgroundColor: '#FFFFFF',
|
1636 |
+
labelColor: '#000000',
|
1637 |
+
formatter: Morris.commas,
|
1638 |
+
resize: false
|
1639 |
+
};
|
1640 |
+
|
1641 |
+
function Donut(options) {
|
1642 |
+
this.resizeHandler = __bind(this.resizeHandler, this);
|
1643 |
+
this.select = __bind(this.select, this);
|
1644 |
+
this.click = __bind(this.click, this);
|
1645 |
+
var _this = this;
|
1646 |
+
if (!(this instanceof Morris.Donut)) {
|
1647 |
+
return new Morris.Donut(options);
|
1648 |
+
}
|
1649 |
+
this.options = $.extend({}, this.defaults, options);
|
1650 |
+
if (typeof options.element === 'string') {
|
1651 |
+
this.el = $(document.getElementById(options.element));
|
1652 |
+
} else {
|
1653 |
+
this.el = $(options.element);
|
1654 |
+
}
|
1655 |
+
if (this.el === null || this.el.length === 0) {
|
1656 |
+
throw new Error("Graph placeholder not found.");
|
1657 |
+
}
|
1658 |
+
if (options.data === void 0 || options.data.length === 0) {
|
1659 |
+
return;
|
1660 |
+
}
|
1661 |
+
this.raphael = new Raphael(this.el[0]);
|
1662 |
+
if (this.options.resize) {
|
1663 |
+
$(window).bind('resize', function(evt) {
|
1664 |
+
if (_this.timeoutId != null) {
|
1665 |
+
window.clearTimeout(_this.timeoutId);
|
1666 |
+
}
|
1667 |
+
return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100);
|
1668 |
+
});
|
1669 |
+
}
|
1670 |
+
this.setData(options.data);
|
1671 |
+
}
|
1672 |
+
|
1673 |
+
Donut.prototype.redraw = function() {
|
1674 |
+
var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
|
1675 |
+
this.raphael.clear();
|
1676 |
+
cx = this.el.width() / 2;
|
1677 |
+
cy = this.el.height() / 2;
|
1678 |
+
w = (Math.min(cx, cy) - 10) / 3;
|
1679 |
+
total = 0;
|
1680 |
+
_ref = this.values;
|
1681 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1682 |
+
value = _ref[_i];
|
1683 |
+
total += value;
|
1684 |
+
}
|
1685 |
+
min = 5 / (2 * w);
|
1686 |
+
C = 1.9999 * Math.PI - min * this.data.length;
|
1687 |
+
last = 0;
|
1688 |
+
idx = 0;
|
1689 |
+
this.segments = [];
|
1690 |
+
_ref1 = this.values;
|
1691 |
+
for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {
|
1692 |
+
value = _ref1[i];
|
1693 |
+
next = last + min + C * (value / total);
|
1694 |
+
seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);
|
1695 |
+
seg.render();
|
1696 |
+
this.segments.push(seg);
|
1697 |
+
seg.on('hover', this.select);
|
1698 |
+
seg.on('click', this.click);
|
1699 |
+
last = next;
|
1700 |
+
idx += 1;
|
1701 |
+
}
|
1702 |
+
this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800);
|
1703 |
+
this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);
|
1704 |
+
max_value = Math.max.apply(Math, this.values);
|
1705 |
+
idx = 0;
|
1706 |
+
_ref2 = this.values;
|
1707 |
+
_results = [];
|
1708 |
+
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
|
1709 |
+
value = _ref2[_k];
|
1710 |
+
if (value === max_value) {
|
1711 |
+
this.select(idx);
|
1712 |
+
break;
|
1713 |
+
}
|
1714 |
+
_results.push(idx += 1);
|
1715 |
+
}
|
1716 |
+
return _results;
|
1717 |
+
};
|
1718 |
+
|
1719 |
+
Donut.prototype.setData = function(data) {
|
1720 |
+
var row;
|
1721 |
+
this.data = data;
|
1722 |
+
this.values = (function() {
|
1723 |
+
var _i, _len, _ref, _results;
|
1724 |
+
_ref = this.data;
|
1725 |
+
_results = [];
|
1726 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1727 |
+
row = _ref[_i];
|
1728 |
+
_results.push(parseFloat(row.value));
|
1729 |
+
}
|
1730 |
+
return _results;
|
1731 |
+
}).call(this);
|
1732 |
+
return this.redraw();
|
1733 |
+
};
|
1734 |
+
|
1735 |
+
Donut.prototype.click = function(idx) {
|
1736 |
+
return this.fire('click', idx, this.data[idx]);
|
1737 |
+
};
|
1738 |
+
|
1739 |
+
Donut.prototype.select = function(idx) {
|
1740 |
+
var row, s, segment, _i, _len, _ref;
|
1741 |
+
_ref = this.segments;
|
1742 |
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1743 |
+
s = _ref[_i];
|
1744 |
+
s.deselect();
|
1745 |
+
}
|
1746 |
+
segment = this.segments[idx];
|
1747 |
+
segment.select();
|
1748 |
+
row = this.data[idx];
|
1749 |
+
return this.setLabels(row.label, this.options.formatter(row.value, row));
|
1750 |
+
};
|
1751 |
+
|
1752 |
+
Donut.prototype.setLabels = function(label1, label2) {
|
1753 |
+
var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale;
|
1754 |
+
inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3;
|
1755 |
+
maxWidth = 1.8 * inner;
|
1756 |
+
maxHeightTop = inner / 2;
|
1757 |
+
maxHeightBottom = inner / 3;
|
1758 |
+
this.text1.attr({
|
1759 |
+
text: label1,
|
1760 |
+
transform: ''
|
1761 |
+
});
|
1762 |
+
text1bbox = this.text1.getBBox();
|
1763 |
+
text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height);
|
1764 |
+
this.text1.attr({
|
1765 |
+
transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height)
|
1766 |
+
});
|
1767 |
+
this.text2.attr({
|
1768 |
+
text: label2,
|
1769 |
+
transform: ''
|
1770 |
+
});
|
1771 |
+
text2bbox = this.text2.getBBox();
|
1772 |
+
text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height);
|
1773 |
+
return this.text2.attr({
|
1774 |
+
transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y
|
1775 |
+
});
|
1776 |
+
};
|
1777 |
+
|
1778 |
+
Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) {
|
1779 |
+
var text;
|
1780 |
+
text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color);
|
1781 |
+
if (fontWeight != null) {
|
1782 |
+
text.attr('font-weight', fontWeight);
|
1783 |
+
}
|
1784 |
+
return text;
|
1785 |
+
};
|
1786 |
+
|
1787 |
+
Donut.prototype.resizeHandler = function() {
|
1788 |
+
this.timeoutId = null;
|
1789 |
+
this.raphael.setSize(this.el.width(), this.el.height());
|
1790 |
+
return this.redraw();
|
1791 |
+
};
|
1792 |
+
|
1793 |
+
return Donut;
|
1794 |
+
|
1795 |
+
})(Morris.EventEmitter);
|
1796 |
+
|
1797 |
+
Morris.DonutSegment = (function(_super) {
|
1798 |
+
__extends(DonutSegment, _super);
|
1799 |
+
|
1800 |
+
function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {
|
1801 |
+
this.cx = cx;
|
1802 |
+
this.cy = cy;
|
1803 |
+
this.inner = inner;
|
1804 |
+
this.outer = outer;
|
1805 |
+
this.color = color;
|
1806 |
+
this.backgroundColor = backgroundColor;
|
1807 |
+
this.index = index;
|
1808 |
+
this.raphael = raphael;
|
1809 |
+
this.deselect = __bind(this.deselect, this);
|
1810 |
+
this.select = __bind(this.select, this);
|
1811 |
+
this.sin_p0 = Math.sin(p0);
|
1812 |
+
this.cos_p0 = Math.cos(p0);
|
1813 |
+
this.sin_p1 = Math.sin(p1);
|
1814 |
+
this.cos_p1 = Math.cos(p1);
|
1815 |
+
this.is_long = (p1 - p0) > Math.PI ? 1 : 0;
|
1816 |
+
this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5);
|
1817 |
+
this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer);
|
1818 |
+
this.hilight = this.calcArc(this.inner);
|
1819 |
+
}
|
1820 |
+
|
1821 |
+
DonutSegment.prototype.calcArcPoints = function(r) {
|
1822 |
+
return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1];
|
1823 |
+
};
|
1824 |
+
|
1825 |
+
DonutSegment.prototype.calcSegment = function(r1, r2) {
|
1826 |
+
var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1;
|
1827 |
+
_ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];
|
1828 |
+
_ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3];
|
1829 |
+
return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z";
|
1830 |
+
};
|
1831 |
+
|
1832 |
+
DonutSegment.prototype.calcArc = function(r) {
|
1833 |
+
var ix0, ix1, iy0, iy1, _ref;
|
1834 |
+
_ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3];
|
1835 |
+
return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1);
|
1836 |
+
};
|
1837 |
+
|
1838 |
+
DonutSegment.prototype.render = function() {
|
1839 |
+
var _this = this;
|
1840 |
+
this.arc = this.drawDonutArc(this.hilight, this.color);
|
1841 |
+
return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {
|
1842 |
+
return _this.fire('hover', _this.index);
|
1843 |
+
}, function() {
|
1844 |
+
return _this.fire('click', _this.index);
|
1845 |
+
});
|
1846 |
+
};
|
1847 |
+
|
1848 |
+
DonutSegment.prototype.drawDonutArc = function(path, color) {
|
1849 |
+
return this.raphael.path(path).attr({
|
1850 |
+
stroke: color,
|
1851 |
+
'stroke-width': 2,
|
1852 |
+
opacity: 0
|
1853 |
+
});
|
1854 |
+
};
|
1855 |
+
|
1856 |
+
DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {
|
1857 |
+
return this.raphael.path(path).attr({
|
1858 |
+
fill: fillColor,
|
1859 |
+
stroke: strokeColor,
|
1860 |
+
'stroke-width': 3
|
1861 |
+
}).hover(hoverFunction).click(clickFunction);
|
1862 |
+
};
|
1863 |
+
|
1864 |
+
DonutSegment.prototype.select = function() {
|
1865 |
+
if (!this.selected) {
|
1866 |
+
this.seg.animate({
|
1867 |
+
path: this.selectedPath
|
1868 |
+
}, 150, '<>');
|
1869 |
+
this.arc.animate({
|
1870 |
+
opacity: 1
|
1871 |
+
}, 150, '<>');
|
1872 |
+
return this.selected = true;
|
1873 |
+
}
|
1874 |
+
};
|
1875 |
+
|
1876 |
+
DonutSegment.prototype.deselect = function() {
|
1877 |
+
if (this.selected) {
|
1878 |
+
this.seg.animate({
|
1879 |
+
path: this.path
|
1880 |
+
}, 150, '<>');
|
1881 |
+
this.arc.animate({
|
1882 |
+
opacity: 0
|
1883 |
+
}, 150, '<>');
|
1884 |
+
return this.selected = false;
|
1885 |
+
}
|
1886 |
+
};
|
1887 |
+
|
1888 |
+
return DonutSegment;
|
1889 |
+
|
1890 |
+
})(Morris.EventEmitter);
|
1891 |
+
|
1892 |
+
}).call(this);
|
assets/admin/scripts/raphael.js
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// ┌────────────────────────────────────────────────────────────────────┐ \\
|
2 |
+
// │ Raphaël 2.1.2 - JavaScript Vector Library │ \\
|
3 |
+
// ├────────────────────────────────────────────────────────────────────┤ \\
|
4 |
+
// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
|
5 |
+
// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\
|
6 |
+
// ├────────────────────────────────────────────────────────────────────┤ \\
|
7 |
+
// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
|
8 |
+
// └────────────────────────────────────────────────────────────────────┘ \\
|
9 |
+
!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g="*",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return void(k._events=j={n:{}});var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(window||this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)<i)){var k,l=1,m=l/2,n=l-m,o=.01;for(k=j(a,b,c,d,e,f,g,h,n);Q(k-i)>o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)<P(e,g)||P(a,c)>O(e,g)||O(b,d)<P(f,h)||P(b,d)>O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)<b)return e;if(h=(3*l*e+2*k)*e+j,Q(h)<1e-6)break;e-=f/h}if(c=0,d=1,e=a,c>e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;b<ic.length;b++)ic[b].el.paper==a&&ic.splice(b--,1)}c.version="2.1.2",c.eve=b;var u,v,w=/[, ]+/,x={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},y=/\{(\d+)\}/g,z="hasOwnProperty",A={doc:document,win:a},B={was:Object.prototype[z].call(A.win,"Raphael"),is:A.win.Raphael},C=function(){this.ca=this.customAttributes={}},D="apply",E="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,G="",H=" ",I=String,J="split",K="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[J](H),L={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},M=I.prototype.toLowerCase,N=Math,O=N.max,P=N.min,Q=N.abs,R=N.pow,S=N.PI,T="number",U="string",V="array",W=Object.prototype.toString,X=(c._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),Y={NaN:1,Infinity:1,"-Infinity":1},Z=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,$=N.round,_=parseFloat,ab=parseInt,bb=I.prototype.toUpperCase,cb=c._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},db=c._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},eb=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,fb={hs:1,rg:1},gb=/,?([achlmqrstvxz]),?/gi,hb=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,ib=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,jb=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,kb=(c._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),lb=function(a,b){return _(a)-_(b)},mb=function(){},nb=function(a){return a},ob=c._rectPath=function(a,b,c,d,e){return e?[["M",a+e,b],["l",c-2*e,0],["a",e,e,0,0,1,e,e],["l",0,d-2*e],["a",e,e,0,0,1,-e,e],["l",2*e-c,0],["a",e,e,0,0,1,-e,-e],["l",0,2*e-d],["a",e,e,0,0,1,e,-e],["z"]]:[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},pb=function(a,b,c,d){return null==d&&(d=c),[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},qb=c._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)},set:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)}},rb=c.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=Kb(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='<v:shape adj="1"/>',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b};c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*N.random()|0,c="x"==a?b:3&b|8;return c.toString(16)});c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")};c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a};c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){{var e=[];M.call(c)}d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&n(a,[["M",b,d],["H",e.x2+10]],1)%2==1},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),l=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=O(d.length,e&&e.length||0))},k=0,l=O(d.length,e&&e.length||0);l>k;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var m=d[k],n=e&&e[k],o=m.length,p=e&&n.length;f.x=m[o-2],f.y=m[o-1],f.bx=_(m[o-4])||f.x,f.by=_(m[o-3])||f.y,g.bx=e&&(_(n[p-4])||g.x),g.by=e&&(_(n[p-3])||g.y),g.x=e&&n[p-2],g.y=e&&n[p-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[];for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])
|
10 |
+
}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],e,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin(2*(a-.075)*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;d<ic.length;d++){var e=ic[d];if(!e.el.removed&&!e.paused){var f,g,h=a-e.start,i=e.ms,j=e.easing,k=e.from,l=e.diff,m=e.to,n=(e.t,e.el),o={},p={};if(e.initstatus?(h=(e.initstatus*e.anim.top-e.prev)/(e.percent-e.prev)*i,e.status=e.initstatus,delete e.initstatus,e.stop&&ic.splice(d--,1)):e.status=(e.prev+(e.percent-e.prev)*(h/i))/e.anim.top,!(0>h))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);return f?(d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b)):new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.pause."+this.id,this,ic[c].anim)!==!1&&(ic[c].paused=!0);return this},$b.resume=function(a){for(var c=0;c<ic.length;c++)if(ic[c].el.id==this.id&&(!a||ic[c].anim==a)){var d=ic[c];b("raphael.anim.resume."+this.id,this,d.anim)!==!1&&(delete d.paused,this.status(d.anim,d.status))}return this},$b.stop=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.stop."+this.id,this,ic[c].anim)!==!1&&ic.splice(c--,1);return this},b.on("raphael.remove",t),b.on("raphael.clear",t),$b.toString=function(){return"Raphaël’s object"};var mc=function(a){if(this.items=[],this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;c<arguments.length;c++)f.push(arguments[c]);for(c=0;b>c;c++)e.push(this[a+c]);for(;c<this.length-a;c++)d.push(this[a+c]);var g=f.length;for(c=0;c<g+d.length;c++)this.items[a+c]=this[a+c]=g>c?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b.on("raphael.DOMload",function(){u=!0}),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"title":var u=i.getElementsByTagName("title");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q("title");var w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case"href":case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var z=q("a");x.insertBefore(z,i),z.appendChild(i),x=z}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var A=b(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q("clipPath"),C=q("rect");B.id=c.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{"clip-path":"url(#"+B.id+")"}),d.clip=C}if(!p){var D=i.getAttribute("clip-path");if(D){var E=c._g.doc.getElementById(D.replace(/(^url\(#|\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var F=b(p).match(c._ISURL);if(F){B=q("pattern");var G=q("image");B.id=c.createUUID(),q(B,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(G,{x:0,y:0,"xlink:href":F[1]}),B.appendChild(G),function(a){c._preload(F[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(G,{width:b,height:c}),d.paper.safari()})}(B),d.paper.defs.appendChild(B),q(i,{fill:"url(#"+B.id+")"}),d.pattern=B,d.pattern&&s(d);break}var H=c.getRGB(p);if(H.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(I){var J=I.getElementsByTagName("stop");q(J[J.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});H[a]("opacity")&&q(i,{"fill-opacity":H.opacity>1?H.opacity/100:H.opacity});case"stroke":H=c.getRGB(p),i.setAttribute(o,H.hex),"stroke"==o&&H[a]("opacity")&&q(i,{"stroke-opacity":H.opacity>1?H.opacity/100:H.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break;case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){I=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),I&&(J=I.getElementsByTagName("stop"),q(J[J.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var K=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;
|
11 |
+
if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},A=c.el;z.prototype=A,A.constructor=z,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},A.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},A.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},A.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},A.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},A.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},A.remove=function(){if(!this.removed&&this.node.parentNode){var a=this.paper;a.__set__&&a.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&a.defs.removeChild(this.gradient),c._tear(this,a),"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var b in this)this[b]="function"==typeof this[b]?c._removedFactory(b):null;this.removed=!0}},A._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}return a&&this.hide(),b},A.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},A.toFront=function(){if(this.removed)return this;"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var a=this.paper;return a.top!=this&&c._tofront(this,a),this},A.toBack=function(){if(this.removed)return this;var a=this.node.parentNode;"a"==a.tagName.toLowerCase()?a.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):a.firstChild!=this.node&&a.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper);this.paper;return this},A.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;return b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this},A.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;return b.parentNode.insertBefore(this.node,b),c._insertbefore(this,a,this.paper),this},A.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,font:c._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=g(c/this.width,d/this.height),j=this.top,l=e?"xMidYMid meet":"xMinYMin";for(null==a?(this._vbSize&&(i=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=i,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:l});i&&j;)h="stroke-width"in j.attrs?j.attrs["stroke-width"]:1,j.attr({"stroke-width":h}),j._.dirty=1,j._.dirtyT=1,j=j.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var B=c.st;for(var C in A)A[a](C)&&!B[a](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),"stroke-dasharray"in i){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/</g,"<").replace(/&/g,"&").replace(/\n/g,"<br>"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return d&&(this._.transform=d),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var h,i,j=this.width,k=this.height,l=1/g(d/j,e/k);return f&&(h=k/e,i=j/d,j>d*h&&(a-=(j-d*h)/2/h),k>e*i&&(b-=(k-e*i)/2/i)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:l},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,c});
|
assets/admin/styles/bootstrap.css
ADDED
@@ -0,0 +1,6174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.2.0 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2014 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*/
|
6 |
+
|
7 |
+
/*!
|
8 |
+
* Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=f9376f2970c50a5ddc7b)
|
9 |
+
* Config saved to config.json and https://gist.github.com/f9376f2970c50a5ddc7b
|
10 |
+
*/
|
11 |
+
/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
|
12 |
+
html {
|
13 |
+
font-family: sans-serif;
|
14 |
+
-ms-text-size-adjust: 100%;
|
15 |
+
-webkit-text-size-adjust: 100%;
|
16 |
+
}
|
17 |
+
body {
|
18 |
+
margin: 0;
|
19 |
+
}
|
20 |
+
article,
|
21 |
+
aside,
|
22 |
+
details,
|
23 |
+
figcaption,
|
24 |
+
figure,
|
25 |
+
footer,
|
26 |
+
header,
|
27 |
+
hgroup,
|
28 |
+
main,
|
29 |
+
nav,
|
30 |
+
section,
|
31 |
+
summary {
|
32 |
+
display: block;
|
33 |
+
}
|
34 |
+
audio,
|
35 |
+
canvas,
|
36 |
+
progress,
|
37 |
+
video {
|
38 |
+
display: inline-block;
|
39 |
+
vertical-align: baseline;
|
40 |
+
}
|
41 |
+
audio:not([controls]) {
|
42 |
+
display: none;
|
43 |
+
height: 0;
|
44 |
+
}
|
45 |
+
[hidden],
|
46 |
+
template {
|
47 |
+
display: none;
|
48 |
+
}
|
49 |
+
a {
|
50 |
+
background: transparent;
|
51 |
+
}
|
52 |
+
a:active,
|
53 |
+
a:hover {
|
54 |
+
outline: 0;
|
55 |
+
}
|
56 |
+
abbr[title] {
|
57 |
+
border-bottom: 1px dotted;
|
58 |
+
}
|
59 |
+
b,
|
60 |
+
strong {
|
61 |
+
font-weight: bold;
|
62 |
+
}
|
63 |
+
dfn {
|
64 |
+
font-style: italic;
|
65 |
+
}
|
66 |
+
h1 {
|
67 |
+
font-size: 2em;
|
68 |
+
margin: 0.67em 0;
|
69 |
+
}
|
70 |
+
mark {
|
71 |
+
background: #ff0;
|
72 |
+
color: #000;
|
73 |
+
}
|
74 |
+
small {
|
75 |
+
font-size: 80%;
|
76 |
+
}
|
77 |
+
sub,
|
78 |
+
sup {
|
79 |
+
font-size: 75%;
|
80 |
+
line-height: 0;
|
81 |
+
position: relative;
|
82 |
+
vertical-align: baseline;
|
83 |
+
}
|
84 |
+
sup {
|
85 |
+
top: -0.5em;
|
86 |
+
}
|
87 |
+
sub {
|
88 |
+
bottom: -0.25em;
|
89 |
+
}
|
90 |
+
img {
|
91 |
+
border: 0;
|
92 |
+
}
|
93 |
+
svg:not(:root) {
|
94 |
+
overflow: hidden;
|
95 |
+
}
|
96 |
+
figure {
|
97 |
+
margin: 1em 40px;
|
98 |
+
}
|
99 |
+
hr {
|
100 |
+
-moz-box-sizing: content-box;
|
101 |
+
box-sizing: content-box;
|
102 |
+
height: 0;
|
103 |
+
}
|
104 |
+
pre {
|
105 |
+
overflow: auto;
|
106 |
+
}
|
107 |
+
code,
|
108 |
+
kbd,
|
109 |
+
pre,
|
110 |
+
samp {
|
111 |
+
font-family: monospace, monospace;
|
112 |
+
font-size: 1em;
|
113 |
+
}
|
114 |
+
button,
|
115 |
+
input,
|
116 |
+
optgroup,
|
117 |
+
select,
|
118 |
+
textarea {
|
119 |
+
color: inherit;
|
120 |
+
font: inherit;
|
121 |
+
margin: 0;
|
122 |
+
}
|
123 |
+
button {
|
124 |
+
overflow: visible;
|
125 |
+
}
|
126 |
+
button,
|
127 |
+
select {
|
128 |
+
text-transform: none;
|
129 |
+
}
|
130 |
+
button,
|
131 |
+
html input[type="button"],
|
132 |
+
input[type="reset"],
|
133 |
+
input[type="submit"] {
|
134 |
+
-webkit-appearance: button;
|
135 |
+
cursor: pointer;
|
136 |
+
}
|
137 |
+
button[disabled],
|
138 |
+
html input[disabled] {
|
139 |
+
cursor: default;
|
140 |
+
}
|
141 |
+
button::-moz-focus-inner,
|
142 |
+
input::-moz-focus-inner {
|
143 |
+
border: 0;
|
144 |
+
padding: 0;
|
145 |
+
}
|
146 |
+
input {
|
147 |
+
line-height: normal;
|
148 |
+
}
|
149 |
+
input[type="checkbox"],
|
150 |
+
input[type="radio"] {
|
151 |
+
box-sizing: border-box;
|
152 |
+
padding: 0;
|
153 |
+
}
|
154 |
+
input[type="number"]::-webkit-inner-spin-button,
|
155 |
+
input[type="number"]::-webkit-outer-spin-button {
|
156 |
+
height: auto;
|
157 |
+
}
|
158 |
+
input[type="search"] {
|
159 |
+
-webkit-appearance: textfield;
|
160 |
+
-moz-box-sizing: content-box;
|
161 |
+
-webkit-box-sizing: content-box;
|
162 |
+
box-sizing: content-box;
|
163 |
+
}
|
164 |
+
input[type="search"]::-webkit-search-cancel-button,
|
165 |
+
input[type="search"]::-webkit-search-decoration {
|
166 |
+
-webkit-appearance: none;
|
167 |
+
}
|
168 |
+
fieldset {
|
169 |
+
border: 1px solid #c0c0c0;
|
170 |
+
margin: 0 2px;
|
171 |
+
padding: 0.35em 0.625em 0.75em;
|
172 |
+
}
|
173 |
+
legend {
|
174 |
+
border: 0;
|
175 |
+
padding: 0;
|
176 |
+
}
|
177 |
+
textarea {
|
178 |
+
overflow: auto;
|
179 |
+
}
|
180 |
+
optgroup {
|
181 |
+
font-weight: bold;
|
182 |
+
}
|
183 |
+
table {
|
184 |
+
border-collapse: collapse;
|
185 |
+
border-spacing: 0;
|
186 |
+
}
|
187 |
+
td,
|
188 |
+
th {
|
189 |
+
padding: 0;
|
190 |
+
}
|
191 |
+
@media print {
|
192 |
+
* {
|
193 |
+
text-shadow: none !important;
|
194 |
+
color: #000 !important;
|
195 |
+
background: transparent !important;
|
196 |
+
box-shadow: none !important;
|
197 |
+
}
|
198 |
+
a,
|
199 |
+
a:visited {
|
200 |
+
text-decoration: underline;
|
201 |
+
}
|
202 |
+
a[href]:after {
|
203 |
+
content: " (" attr(href) ")";
|
204 |
+
}
|
205 |
+
abbr[title]:after {
|
206 |
+
content: " (" attr(title) ")";
|
207 |
+
}
|
208 |
+
a[href^="javascript:"]:after,
|
209 |
+
a[href^="#"]:after {
|
210 |
+
content: "";
|
211 |
+
}
|
212 |
+
pre,
|
213 |
+
blockquote {
|
214 |
+
border: 1px solid #999;
|
215 |
+
page-break-inside: avoid;
|
216 |
+
}
|
217 |
+
thead {
|
218 |
+
display: table-header-group;
|
219 |
+
}
|
220 |
+
tr,
|
221 |
+
img {
|
222 |
+
page-break-inside: avoid;
|
223 |
+
}
|
224 |
+
img {
|
225 |
+
max-width: 100% !important;
|
226 |
+
}
|
227 |
+
p,
|
228 |
+
h2,
|
229 |
+
h3 {
|
230 |
+
orphans: 3;
|
231 |
+
widows: 3;
|
232 |
+
}
|
233 |
+
h2,
|
234 |
+
h3 {
|
235 |
+
page-break-after: avoid;
|
236 |
+
}
|
237 |
+
select {
|
238 |
+
background: #fff !important;
|
239 |
+
}
|
240 |
+
.navbar {
|
241 |
+
display: none;
|
242 |
+
}
|
243 |
+
.table td,
|
244 |
+
.table th {
|
245 |
+
background-color: #fff !important;
|
246 |
+
}
|
247 |
+
.btn > .caret,
|
248 |
+
.dropup > .btn > .caret {
|
249 |
+
border-top-color: #000 !important;
|
250 |
+
}
|
251 |
+
.label {
|
252 |
+
border: 1px solid #000;
|
253 |
+
}
|
254 |
+
.table {
|
255 |
+
border-collapse: collapse !important;
|
256 |
+
}
|
257 |
+
.table-bordered th,
|
258 |
+
.table-bordered td {
|
259 |
+
border: 1px solid #ddd !important;
|
260 |
+
}
|
261 |
+
}
|
262 |
+
@font-face {
|
263 |
+
font-family: 'Glyphicons Halflings';
|
264 |
+
src: url('fonts/glyphicons-halflings-regular.eot');
|
265 |
+
src: url('fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('fonts/glyphicons-halflings-regular.woff') format('woff'), url('fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
|
266 |
+
}
|
267 |
+
.glyphicon {
|
268 |
+
position: relative;
|
269 |
+
top: 1px;
|
270 |
+
display: inline-block;
|
271 |
+
font-family: 'Glyphicons Halflings';
|
272 |
+
font-style: normal;
|
273 |
+
font-weight: normal;
|
274 |
+
line-height: 1;
|
275 |
+
-webkit-font-smoothing: antialiased;
|
276 |
+
-moz-osx-font-smoothing: grayscale;
|
277 |
+
}
|
278 |
+
.glyphicon-asterisk:before {
|
279 |
+
content: "\2a";
|
280 |
+
}
|
281 |
+
.glyphicon-plus:before {
|
282 |
+
content: "\2b";
|
283 |
+
}
|
284 |
+
.glyphicon-euro:before {
|
285 |
+
content: "\20ac";
|
286 |
+
}
|
287 |
+
.glyphicon-minus:before {
|
288 |
+
content: "\2212";
|
289 |
+
}
|
290 |
+
.glyphicon-cloud:before {
|
291 |
+
content: "\2601";
|
292 |
+
}
|
293 |
+
.glyphicon-envelope:before {
|
294 |
+
content: "\2709";
|
295 |
+
}
|
296 |
+
.glyphicon-pencil:before {
|
297 |
+
content: "\270f";
|
298 |
+
}
|
299 |
+
.glyphicon-glass:before {
|
300 |
+
content: "\e001";
|
301 |
+
}
|
302 |
+
.glyphicon-music:before {
|
303 |
+
content: "\e002";
|
304 |
+
}
|
305 |
+
.glyphicon-search:before {
|
306 |
+
content: "\e003";
|
307 |
+
}
|
308 |
+
.glyphicon-heart:before {
|
309 |
+
content: "\e005";
|
310 |
+
}
|
311 |
+
.glyphicon-star:before {
|
312 |
+
content: "\e006";
|
313 |
+
}
|
314 |
+
.glyphicon-star-empty:before {
|
315 |
+
content: "\e007";
|
316 |
+
}
|
317 |
+
.glyphicon-user:before {
|
318 |
+
content: "\e008";
|
319 |
+
}
|
320 |
+
.glyphicon-film:before {
|
321 |
+
content: "\e009";
|
322 |
+
}
|
323 |
+
.glyphicon-th-large:before {
|
324 |
+
content: "\e010";
|
325 |
+
}
|
326 |
+
.glyphicon-th:before {
|
327 |
+
content: "\e011";
|
328 |
+
}
|
329 |
+
.glyphicon-th-list:before {
|
330 |
+
content: "\e012";
|
331 |
+
}
|
332 |
+
.glyphicon-ok:before {
|
333 |
+
content: "\e013";
|
334 |
+
}
|
335 |
+
.glyphicon-remove:before {
|
336 |
+
content: "\e014";
|
337 |
+
}
|
338 |
+
.glyphicon-zoom-in:before {
|
339 |
+
content: "\e015";
|
340 |
+
}
|
341 |
+
.glyphicon-zoom-out:before {
|
342 |
+
content: "\e016";
|
343 |
+
}
|
344 |
+
.glyphicon-off:before {
|
345 |
+
content: "\e017";
|
346 |
+
}
|
347 |
+
.glyphicon-signal:before {
|
348 |
+
content: "\e018";
|
349 |
+
}
|
350 |
+
.glyphicon-cog:before {
|
351 |
+
content: "\e019";
|
352 |
+
}
|
353 |
+
.glyphicon-trash:before {
|
354 |
+
content: "\e020";
|
355 |
+
}
|
356 |
+
.glyphicon-home:before {
|
357 |
+
content: "\e021";
|
358 |
+
}
|
359 |
+
.glyphicon-file:before {
|
360 |
+
content: "\e022";
|
361 |
+
}
|
362 |
+
.glyphicon-time:before {
|
363 |
+
content: "\e023";
|
364 |
+
}
|
365 |
+
.glyphicon-road:before {
|
366 |
+
content: "\e024";
|
367 |
+
}
|
368 |
+
.glyphicon-download-alt:before {
|
369 |
+
content: "\e025";
|
370 |
+
}
|
371 |
+
.glyphicon-download:before {
|
372 |
+
content: "\e026";
|
373 |
+
}
|
374 |
+
.glyphicon-upload:before {
|
375 |
+
content: "\e027";
|
376 |
+
}
|
377 |
+
.glyphicon-inbox:before {
|
378 |
+
content: "\e028";
|
379 |
+
}
|
380 |
+
.glyphicon-play-circle:before {
|
381 |
+
content: "\e029";
|
382 |
+
}
|
383 |
+
.glyphicon-repeat:before {
|
384 |
+
content: "\e030";
|
385 |
+
}
|
386 |
+
.glyphicon-refresh:before {
|
387 |
+
content: "\e031";
|
388 |
+
}
|
389 |
+
.glyphicon-list-alt:before {
|
390 |
+
content: "\e032";
|
391 |
+
}
|
392 |
+
.glyphicon-lock:before {
|
393 |
+
content: "\e033";
|
394 |
+
}
|
395 |
+
.glyphicon-flag:before {
|
396 |
+
content: "\e034";
|
397 |
+
}
|
398 |
+
.glyphicon-headphones:before {
|
399 |
+
content: "\e035";
|
400 |
+
}
|
401 |
+
.glyphicon-volume-off:before {
|
402 |
+
content: "\e036";
|
403 |
+
}
|
404 |
+
.glyphicon-volume-down:before {
|
405 |
+
content: "\e037";
|
406 |
+
}
|
407 |
+
.glyphicon-volume-up:before {
|
408 |
+
content: "\e038";
|
409 |
+
}
|
410 |
+
.glyphicon-qrcode:before {
|
411 |
+
content: "\e039";
|
412 |
+
}
|
413 |
+
.glyphicon-barcode:before {
|
414 |
+
content: "\e040";
|
415 |
+
}
|
416 |
+
.glyphicon-tag:before {
|
417 |
+
content: "\e041";
|
418 |
+
}
|
419 |
+
.glyphicon-tags:before {
|
420 |
+
content: "\e042";
|
421 |
+
}
|
422 |
+
.glyphicon-book:before {
|
423 |
+
content: "\e043";
|
424 |
+
}
|
425 |
+
.glyphicon-bookmark:before {
|
426 |
+
content: "\e044";
|
427 |
+
}
|
428 |
+
.glyphicon-print:before {
|
429 |
+
content: "\e045";
|
430 |
+
}
|
431 |
+
.glyphicon-camera:before {
|
432 |
+
content: "\e046";
|
433 |
+
}
|
434 |
+
.glyphicon-font:before {
|
435 |
+
content: "\e047";
|
436 |
+
}
|
437 |
+
.glyphicon-bold:before {
|
438 |
+
content: "\e048";
|
439 |
+
}
|
440 |
+
.glyphicon-italic:before {
|
441 |
+
content: "\e049";
|
442 |
+
}
|
443 |
+
.glyphicon-text-height:before {
|
444 |
+
content: "\e050";
|
445 |
+
}
|
446 |
+
.glyphicon-text-width:before {
|
447 |
+
content: "\e051";
|
448 |
+
}
|
449 |
+
.glyphicon-align-left:before {
|
450 |
+
content: "\e052";
|
451 |
+
}
|
452 |
+
.glyphicon-align-center:before {
|
453 |
+
content: "\e053";
|
454 |
+
}
|
455 |
+
.glyphicon-align-right:before {
|
456 |
+
content: "\e054";
|
457 |
+
}
|
458 |
+
.glyphicon-align-justify:before {
|
459 |
+
content: "\e055";
|
460 |
+
}
|
461 |
+
.glyphicon-list:before {
|
462 |
+
content: "\e056";
|
463 |
+
}
|
464 |
+
.glyphicon-indent-left:before {
|
465 |
+
content: "\e057";
|
466 |
+
}
|
467 |
+
.glyphicon-indent-right:before {
|
468 |
+
content: "\e058";
|
469 |
+
}
|
470 |
+
.glyphicon-facetime-video:before {
|
471 |
+
content: "\e059";
|
472 |
+
}
|
473 |
+
.glyphicon-picture:before {
|
474 |
+
content: "\e060";
|
475 |
+
}
|
476 |
+
.glyphicon-map-marker:before {
|
477 |
+
content: "\e062";
|
478 |
+
}
|
479 |
+
.glyphicon-adjust:before {
|
480 |
+
content: "\e063";
|
481 |
+
}
|
482 |
+
.glyphicon-tint:before {
|
483 |
+
content: "\e064";
|
484 |
+
}
|
485 |
+
.glyphicon-edit:before {
|
486 |
+
content: "\e065";
|
487 |
+
}
|
488 |
+
.glyphicon-share:before {
|
489 |
+
content: "\e066";
|
490 |
+
}
|
491 |
+
.glyphicon-check:before {
|
492 |
+
content: "\e067";
|
493 |
+
}
|
494 |
+
.glyphicon-move:before {
|
495 |
+
content: "\e068";
|
496 |
+
}
|
497 |
+
.glyphicon-step-backward:before {
|
498 |
+
content: "\e069";
|
499 |
+
}
|
500 |
+
.glyphicon-fast-backward:before {
|
501 |
+
content: "\e070";
|
502 |
+
}
|
503 |
+
.glyphicon-backward:before {
|
504 |
+
content: "\e071";
|
505 |
+
}
|
506 |
+
.glyphicon-play:before {
|
507 |
+
content: "\e072";
|
508 |
+
}
|
509 |
+
.glyphicon-pause:before {
|
510 |
+
content: "\e073";
|
511 |
+
}
|
512 |
+
.glyphicon-stop:before {
|
513 |
+
content: "\e074";
|
514 |
+
}
|
515 |
+
.glyphicon-forward:before {
|
516 |
+
content: "\e075";
|
517 |
+
}
|
518 |
+
.glyphicon-fast-forward:before {
|
519 |
+
content: "\e076";
|
520 |
+
}
|
521 |
+
.glyphicon-step-forward:before {
|
522 |
+
content: "\e077";
|
523 |
+
}
|
524 |
+
.glyphicon-eject:before {
|
525 |
+
content: "\e078";
|
526 |
+
}
|
527 |
+
.glyphicon-chevron-left:before {
|
528 |
+
content: "\e079";
|
529 |
+
}
|
530 |
+
.glyphicon-chevron-right:before {
|
531 |
+
content: "\e080";
|
532 |
+
}
|
533 |
+
.glyphicon-plus-sign:before {
|
534 |
+
content: "\e081";
|
535 |
+
}
|
536 |
+
.glyphicon-minus-sign:before {
|
537 |
+
content: "\e082";
|
538 |
+
}
|
539 |
+
.glyphicon-remove-sign:before {
|
540 |
+
content: "\e083";
|
541 |
+
}
|
542 |
+
.glyphicon-ok-sign:before {
|
543 |
+
content: "\e084";
|
544 |
+
}
|
545 |
+
.glyphicon-question-sign:before {
|
546 |
+
content: "\e085";
|
547 |
+
}
|
548 |
+
.glyphicon-info-sign:before {
|
549 |
+
content: "\e086";
|
550 |
+
}
|
551 |
+
.glyphicon-screenshot:before {
|
552 |
+
content: "\e087";
|
553 |
+
}
|
554 |
+
.glyphicon-remove-circle:before {
|
555 |
+
content: "\e088";
|
556 |
+
}
|
557 |
+
.glyphicon-ok-circle:before {
|
558 |
+
content: "\e089";
|
559 |
+
}
|
560 |
+
.glyphicon-ban-circle:before {
|
561 |
+
content: "\e090";
|
562 |
+
}
|
563 |
+
.glyphicon-arrow-left:before {
|
564 |
+
content: "\e091";
|
565 |
+
}
|
566 |
+
.glyphicon-arrow-right:before {
|
567 |
+
content: "\e092";
|
568 |
+
}
|
569 |
+
.glyphicon-arrow-up:before {
|
570 |
+
content: "\e093";
|
571 |
+
}
|
572 |
+
.glyphicon-arrow-down:before {
|
573 |
+
content: "\e094";
|
574 |
+
}
|
575 |
+
.glyphicon-share-alt:before {
|
576 |
+
content: "\e095";
|
577 |
+
}
|
578 |
+
.glyphicon-resize-full:before {
|
579 |
+
content: "\e096";
|
580 |
+
}
|
581 |
+
.glyphicon-resize-small:before {
|
582 |
+
content: "\e097";
|
583 |
+
}
|
584 |
+
.glyphicon-exclamation-sign:before {
|
585 |
+
content: "\e101";
|
586 |
+
}
|
587 |
+
.glyphicon-gift:before {
|
588 |
+
content: "\e102";
|
589 |
+
}
|
590 |
+
.glyphicon-leaf:before {
|
591 |
+
content: "\e103";
|
592 |
+
}
|
593 |
+
.glyphicon-fire:before {
|
594 |
+
content: "\e104";
|
595 |
+
}
|
596 |
+
.glyphicon-eye-open:before {
|
597 |
+
content: "\e105";
|
598 |
+
}
|
599 |
+
.glyphicon-eye-close:before {
|
600 |
+
content: "\e106";
|
601 |
+
}
|
602 |
+
.glyphicon-warning-sign:before {
|
603 |
+
content: "\e107";
|
604 |
+
}
|
605 |
+
.glyphicon-plane:before {
|
606 |
+
content: "\e108";
|
607 |
+
}
|
608 |
+
.glyphicon-calendar:before {
|
609 |
+
content: "\e109";
|
610 |
+
}
|
611 |
+
.glyphicon-random:before {
|
612 |
+
content: "\e110";
|
613 |
+
}
|
614 |
+
.glyphicon-comment:before {
|
615 |
+
content: "\e111";
|
616 |
+
}
|
617 |
+
.glyphicon-magnet:before {
|
618 |
+
content: "\e112";
|
619 |
+
}
|
620 |
+
.glyphicon-chevron-up:before {
|
621 |
+
content: "\e113";
|
622 |
+
}
|
623 |
+
.glyphicon-chevron-down:before {
|
624 |
+
content: "\e114";
|
625 |
+
}
|
626 |
+
.glyphicon-retweet:before {
|
627 |
+
content: "\e115";
|
628 |
+
}
|
629 |
+
.glyphicon-shopping-cart:before {
|
630 |
+
content: "\e116";
|
631 |
+
}
|
632 |
+
.glyphicon-folder-close:before {
|
633 |
+
content: "\e117";
|
634 |
+
}
|
635 |
+
.glyphicon-folder-open:before {
|
636 |
+
content: "\e118";
|
637 |
+
}
|
638 |
+
.glyphicon-resize-vertical:before {
|
639 |
+
content: "\e119";
|
640 |
+
}
|
641 |
+
.glyphicon-resize-horizontal:before {
|
642 |
+
content: "\e120";
|
643 |
+
}
|
644 |
+
.glyphicon-hdd:before {
|
645 |
+
content: "\e121";
|
646 |
+
}
|
647 |
+
.glyphicon-bullhorn:before {
|
648 |
+
content: "\e122";
|
649 |
+
}
|
650 |
+
.glyphicon-bell:before {
|
651 |
+
content: "\e123";
|
652 |
+
}
|
653 |
+
.glyphicon-certificate:before {
|
654 |
+
content: "\e124";
|
655 |
+
}
|
656 |
+
.glyphicon-thumbs-up:before {
|
657 |
+
content: "\e125";
|
658 |
+
}
|
659 |
+
.glyphicon-thumbs-down:before {
|
660 |
+
content: "\e126";
|
661 |
+
}
|
662 |
+
.glyphicon-hand-right:before {
|
663 |
+
content: "\e127";
|
664 |
+
}
|
665 |
+
.glyphicon-hand-left:before {
|
666 |
+
content: "\e128";
|
667 |
+
}
|
668 |
+
.glyphicon-hand-up:before {
|
669 |
+
content: "\e129";
|
670 |
+
}
|
671 |
+
.glyphicon-hand-down:before {
|
672 |
+
content: "\e130";
|
673 |
+
}
|
674 |
+
.glyphicon-circle-arrow-right:before {
|
675 |
+
content: "\e131";
|
676 |
+
}
|
677 |
+
.glyphicon-circle-arrow-left:before {
|
678 |
+
content: "\e132";
|
679 |
+
}
|
680 |
+
.glyphicon-circle-arrow-up:before {
|
681 |
+
content: "\e133";
|
682 |
+
}
|
683 |
+
.glyphicon-circle-arrow-down:before {
|
684 |
+
content: "\e134";
|
685 |
+
}
|
686 |
+
.glyphicon-globe:before {
|
687 |
+
content: "\e135";
|
688 |
+
}
|
689 |
+
.glyphicon-wrench:before {
|
690 |
+
content: "\e136";
|
691 |
+
}
|
692 |
+
.glyphicon-tasks:before {
|
693 |
+
content: "\e137";
|
694 |
+
}
|
695 |
+
.glyphicon-filter:before {
|
696 |
+
content: "\e138";
|
697 |
+
}
|
698 |
+
.glyphicon-briefcase:before {
|
699 |
+
content: "\e139";
|
700 |
+
}
|
701 |
+
.glyphicon-fullscreen:before {
|
702 |
+
content: "\e140";
|
703 |
+
}
|
704 |
+
.glyphicon-dashboard:before {
|
705 |
+
content: "\e141";
|
706 |
+
}
|
707 |
+
.glyphicon-paperclip:before {
|
708 |
+
content: "\e142";
|
709 |
+
}
|
710 |
+
.glyphicon-heart-empty:before {
|
711 |
+
content: "\e143";
|
712 |
+
}
|
713 |
+
.glyphicon-link:before {
|
714 |
+
content: "\e144";
|
715 |
+
}
|
716 |
+
.glyphicon-phone:before {
|
717 |
+
content: "\e145";
|
718 |
+
}
|
719 |
+
.glyphicon-pushpin:before {
|
720 |
+
content: "\e146";
|
721 |
+
}
|
722 |
+
.glyphicon-usd:before {
|
723 |
+
content: "\e148";
|
724 |
+
}
|
725 |
+
.glyphicon-gbp:before {
|
726 |
+
content: "\e149";
|
727 |
+
}
|
728 |
+
.glyphicon-sort:before {
|
729 |
+
content: "\e150";
|
730 |
+
}
|
731 |
+
.glyphicon-sort-by-alphabet:before {
|
732 |
+
content: "\e151";
|
733 |
+
}
|
734 |
+
.glyphicon-sort-by-alphabet-alt:before {
|
735 |
+
content: "\e152";
|
736 |
+
}
|
737 |
+
.glyphicon-sort-by-order:before {
|
738 |
+
content: "\e153";
|
739 |
+
}
|
740 |
+
.glyphicon-sort-by-order-alt:before {
|
741 |
+
content: "\e154";
|
742 |
+
}
|
743 |
+
.glyphicon-sort-by-attributes:before {
|
744 |
+
content: "\e155";
|
745 |
+
}
|
746 |
+
.glyphicon-sort-by-attributes-alt:before {
|
747 |
+
content: "\e156";
|
748 |
+
}
|
749 |
+
.glyphicon-unchecked:before {
|
750 |
+
content: "\e157";
|
751 |
+
}
|
752 |
+
.glyphicon-expand:before {
|
753 |
+
content: "\e158";
|
754 |
+
}
|
755 |
+
.glyphicon-collapse-down:before {
|
756 |
+
content: "\e159";
|
757 |
+
}
|
758 |
+
.glyphicon-collapse-up:before {
|
759 |
+
content: "\e160";
|
760 |
+
}
|
761 |
+
.glyphicon-log-in:before {
|
762 |
+
content: "\e161";
|
763 |
+
}
|
764 |
+
.glyphicon-flash:before {
|
765 |
+
content: "\e162";
|
766 |
+
}
|
767 |
+
.glyphicon-log-out:before {
|
768 |
+
content: "\e163";
|
769 |
+
}
|
770 |
+
.glyphicon-new-window:before {
|
771 |
+
content: "\e164";
|
772 |
+
}
|
773 |
+
.glyphicon-record:before {
|
774 |
+
content: "\e165";
|
775 |
+
}
|
776 |
+
.glyphicon-save:before {
|
777 |
+
content: "\e166";
|
778 |
+
}
|
779 |
+
.glyphicon-open:before {
|
780 |
+
content: "\e167";
|
781 |
+
}
|
782 |
+
.glyphicon-saved:before {
|
783 |
+
content: "\e168";
|
784 |
+
}
|
785 |
+
.glyphicon-import:before {
|
786 |
+
content: "\e169";
|
787 |
+
}
|
788 |
+
.glyphicon-export:before {
|
789 |
+
content: "\e170";
|
790 |
+
}
|
791 |
+
.glyphicon-send:before {
|
792 |
+
content: "\e171";
|
793 |
+
}
|
794 |
+
.glyphicon-floppy-disk:before {
|
795 |
+
content: "\e172";
|
796 |
+
}
|
797 |
+
.glyphicon-floppy-saved:before {
|
798 |
+
content: "\e173";
|
799 |
+
}
|
800 |
+
.glyphicon-floppy-remove:before {
|
801 |
+
content: "\e174";
|
802 |
+
}
|
803 |
+
.glyphicon-floppy-save:before {
|
804 |
+
content: "\e175";
|
805 |
+
}
|
806 |
+
.glyphicon-floppy-open:before {
|
807 |
+
content: "\e176";
|
808 |
+
}
|
809 |
+
.glyphicon-credit-card:before {
|
810 |
+
content: "\e177";
|
811 |
+
}
|
812 |
+
.glyphicon-transfer:before {
|
813 |
+
content: "\e178";
|
814 |
+
}
|
815 |
+
.glyphicon-cutlery:before {
|
816 |
+
content: "\e179";
|
817 |
+
}
|
818 |
+
.glyphicon-header:before {
|
819 |
+
content: "\e180";
|
820 |
+
}
|
821 |
+
.glyphicon-compressed:before {
|
822 |
+
content: "\e181";
|
823 |
+
}
|
824 |
+
.glyphicon-earphone:before {
|
825 |
+
content: "\e182";
|
826 |
+
}
|
827 |
+
.glyphicon-phone-alt:before {
|
828 |
+
content: "\e183";
|
829 |
+
}
|
830 |
+
.glyphicon-tower:before {
|
831 |
+
content: "\e184";
|
832 |
+
}
|
833 |
+
.glyphicon-stats:before {
|
834 |
+
content: "\e185";
|
835 |
+
}
|
836 |
+
.glyphicon-sd-video:before {
|
837 |
+
content: "\e186";
|
838 |
+
}
|
839 |
+
.glyphicon-hd-video:before {
|
840 |
+
content: "\e187";
|
841 |
+
}
|
842 |
+
.glyphicon-subtitles:before {
|
843 |
+
content: "\e188";
|
844 |
+
}
|
845 |
+
.glyphicon-sound-stereo:before {
|
846 |
+
content: "\e189";
|
847 |
+
}
|
848 |
+
.glyphicon-sound-dolby:before {
|
849 |
+
content: "\e190";
|
850 |
+
}
|
851 |
+
.glyphicon-sound-5-1:before {
|
852 |
+
content: "\e191";
|
853 |
+
}
|
854 |
+
.glyphicon-sound-6-1:before {
|
855 |
+
content: "\e192";
|
856 |
+
}
|
857 |
+
.glyphicon-sound-7-1:before {
|
858 |
+
content: "\e193";
|
859 |
+
}
|
860 |
+
.glyphicon-copyright-mark:before {
|
861 |
+
content: "\e194";
|
862 |
+
}
|
863 |
+
.glyphicon-registration-mark:before {
|
864 |
+
content: "\e195";
|
865 |
+
}
|
866 |
+
.glyphicon-cloud-download:before {
|
867 |
+
content: "\e197";
|
868 |
+
}
|
869 |
+
.glyphicon-cloud-upload:before {
|
870 |
+
content: "\e198";
|
871 |
+
}
|
872 |
+
.glyphicon-tree-conifer:before {
|
873 |
+
content: "\e199";
|
874 |
+
}
|
875 |
+
.glyphicon-tree-deciduous:before {
|
876 |
+
content: "\e200";
|
877 |
+
}
|
878 |
+
* {
|
879 |
+
-webkit-box-sizing: border-box;
|
880 |
+
-moz-box-sizing: border-box;
|
881 |
+
box-sizing: border-box;
|
882 |
+
}
|
883 |
+
*:before,
|
884 |
+
*:after {
|
885 |
+
-webkit-box-sizing: border-box;
|
886 |
+
-moz-box-sizing: border-box;
|
887 |
+
box-sizing: border-box;
|
888 |
+
}
|
889 |
+
html {
|
890 |
+
font-size: 10px;
|
891 |
+
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
892 |
+
}
|
893 |
+
body {
|
894 |
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
895 |
+
font-size: 14px;
|
896 |
+
line-height: 1.42857143;
|
897 |
+
color: #333333;
|
898 |
+
background-color: #ffffff;
|
899 |
+
}
|
900 |
+
input,
|
901 |
+
button,
|
902 |
+
select,
|
903 |
+
textarea {
|
904 |
+
font-family: inherit;
|
905 |
+
font-size: inherit;
|
906 |
+
line-height: inherit;
|
907 |
+
}
|
908 |
+
a {
|
909 |
+
color: #428bca;
|
910 |
+
text-decoration: none;
|
911 |
+
}
|
912 |
+
a:hover,
|
913 |
+
a:focus {
|
914 |
+
color: #2a6496;
|
915 |
+
text-decoration: underline;
|
916 |
+
}
|
917 |
+
a:focus {
|
918 |
+
outline: 5px auto -webkit-focus-ring-color;
|
919 |
+
outline-offset: -2px;
|
920 |
+
}
|
921 |
+
figure {
|
922 |
+
margin: 0;
|
923 |
+
}
|
924 |
+
img {
|
925 |
+
vertical-align: middle;
|
926 |
+
}
|
927 |
+
.img-responsive,
|
928 |
+
.thumbnail > img,
|
929 |
+
.thumbnail a > img,
|
930 |
+
.carousel-inner > .item > img,
|
931 |
+
.carousel-inner > .item > a > img {
|
932 |
+
display: block;
|
933 |
+
width: 100% \9;
|
934 |
+
max-width: 100%;
|
935 |
+
height: auto;
|
936 |
+
}
|
937 |
+
.img-rounded {
|
938 |
+
border-radius: 6px;
|
939 |
+
}
|
940 |
+
.img-thumbnail {
|
941 |
+
padding: 4px;
|
942 |
+
line-height: 1.42857143;
|
943 |
+
background-color: #ffffff;
|
944 |
+
border: 1px solid #dddddd;
|
945 |
+
border-radius: 4px;
|
946 |
+
-webkit-transition: all 0.2s ease-in-out;
|
947 |
+
-o-transition: all 0.2s ease-in-out;
|
948 |
+
transition: all 0.2s ease-in-out;
|
949 |
+
display: inline-block;
|
950 |
+
width: 100% \9;
|
951 |
+
max-width: 100%;
|
952 |
+
height: auto;
|
953 |
+
}
|
954 |
+
.img-circle {
|
955 |
+
border-radius: 50%;
|
956 |
+
}
|
957 |
+
hr {
|
958 |
+
margin-top: 20px;
|
959 |
+
margin-bottom: 20px;
|
960 |
+
border: 0;
|
961 |
+
border-top: 1px solid #eeeeee;
|
962 |
+
}
|
963 |
+
.sr-only {
|
964 |
+
position: absolute;
|
965 |
+
width: 1px;
|
966 |
+
height: 1px;
|
967 |
+
margin: -1px;
|
968 |
+
padding: 0;
|
969 |
+
overflow: hidden;
|
970 |
+
clip: rect(0, 0, 0, 0);
|
971 |
+
border: 0;
|
972 |
+
}
|
973 |
+
.sr-only-focusable:active,
|
974 |
+
.sr-only-focusable:focus {
|
975 |
+
position: static;
|
976 |
+
width: auto;
|
977 |
+
height: auto;
|
978 |
+
margin: 0;
|
979 |
+
overflow: visible;
|
980 |
+
clip: auto;
|
981 |
+
}
|
982 |
+
h1,
|
983 |
+
h2,
|
984 |
+
h3,
|
985 |
+
h4,
|
986 |
+
h5,
|
987 |
+
h6,
|
988 |
+
.h1,
|
989 |
+
.h2,
|
990 |
+
.h3,
|
991 |
+
.h4,
|
992 |
+
.h5,
|
993 |
+
.h6 {
|
994 |
+
font-family: inherit;
|
995 |
+
font-weight: 500;
|
996 |
+
line-height: 1.1;
|
997 |
+
color: inherit;
|
998 |
+
}
|
999 |
+
h1 small,
|
1000 |
+
h2 small,
|
1001 |
+
h3 small,
|
1002 |
+
h4 small,
|
1003 |
+
h5 small,
|
1004 |
+
h6 small,
|
1005 |
+
.h1 small,
|
1006 |
+
.h2 small,
|
1007 |
+
.h3 small,
|
1008 |
+
.h4 small,
|
1009 |
+
.h5 small,
|
1010 |
+
.h6 small,
|
1011 |
+
h1 .small,
|
1012 |
+
h2 .small,
|
1013 |
+
h3 .small,
|
1014 |
+
h4 .small,
|
1015 |
+
h5 .small,
|
1016 |
+
h6 .small,
|
1017 |
+
.h1 .small,
|
1018 |
+
.h2 .small,
|
1019 |
+
.h3 .small,
|
1020 |
+
.h4 .small,
|
1021 |
+
.h5 .small,
|
1022 |
+
.h6 .small {
|
1023 |
+
font-weight: normal;
|
1024 |
+
line-height: 1;
|
1025 |
+
color: #777777;
|
1026 |
+
}
|
1027 |
+
h1,
|
1028 |
+
.h1,
|
1029 |
+
h2,
|
1030 |
+
.h2,
|
1031 |
+
h3,
|
1032 |
+
.h3 {
|
1033 |
+
margin-top: 20px;
|
1034 |
+
margin-bottom: 10px;
|
1035 |
+
}
|
1036 |
+
h1 small,
|
1037 |
+
.h1 small,
|
1038 |
+
h2 small,
|
1039 |
+
.h2 small,
|
1040 |
+
h3 small,
|
1041 |
+
.h3 small,
|
1042 |
+
h1 .small,
|
1043 |
+
.h1 .small,
|
1044 |
+
h2 .small,
|
1045 |
+
.h2 .small,
|
1046 |
+
h3 .small,
|
1047 |
+
.h3 .small {
|
1048 |
+
font-size: 65%;
|
1049 |
+
}
|
1050 |
+
h4,
|
1051 |
+
.h4,
|
1052 |
+
h5,
|
1053 |
+
.h5,
|
1054 |
+
h6,
|
1055 |
+
.h6 {
|
1056 |
+
margin-top: 10px;
|
1057 |
+
margin-bottom: 10px;
|
1058 |
+
}
|
1059 |
+
h4 small,
|
1060 |
+
.h4 small,
|
1061 |
+
h5 small,
|
1062 |
+
.h5 small,
|
1063 |
+
h6 small,
|
1064 |
+
.h6 small,
|
1065 |
+
h4 .small,
|
1066 |
+
.h4 .small,
|
1067 |
+
h5 .small,
|
1068 |
+
.h5 .small,
|
1069 |
+
h6 .small,
|
1070 |
+
.h6 .small {
|
1071 |
+
font-size: 75%;
|
1072 |
+
}
|
1073 |
+
h1,
|
1074 |
+
.h1 {
|
1075 |
+
font-size: 36px;
|
1076 |
+
}
|
1077 |
+
h2,
|
1078 |
+
.h2 {
|
1079 |
+
font-size: 30px;
|
1080 |
+
}
|
1081 |
+
h3,
|
1082 |
+
.h3 {
|
1083 |
+
font-size: 24px;
|
1084 |
+
}
|
1085 |
+
h4,
|
1086 |
+
.h4 {
|
1087 |
+
font-size: 18px;
|
1088 |
+
}
|
1089 |
+
h5,
|
1090 |
+
.h5 {
|
1091 |
+
font-size: 14px;
|
1092 |
+
}
|
1093 |
+
h6,
|
1094 |
+
.h6 {
|
1095 |
+
font-size: 12px;
|
1096 |
+
}
|
1097 |
+
p {
|
1098 |
+
margin: 0 0 10px;
|
1099 |
+
}
|
1100 |
+
.lead {
|
1101 |
+
margin-bottom: 20px;
|
1102 |
+
font-size: 16px;
|
1103 |
+
font-weight: 300;
|
1104 |
+
line-height: 1.4;
|
1105 |
+
}
|
1106 |
+
@media (min-width: 768px) {
|
1107 |
+
.lead {
|
1108 |
+
font-size: 21px;
|
1109 |
+
}
|
1110 |
+
}
|
1111 |
+
small,
|
1112 |
+
.small {
|
1113 |
+
font-size: 85%;
|
1114 |
+
}
|
1115 |
+
cite {
|
1116 |
+
font-style: normal;
|
1117 |
+
}
|
1118 |
+
mark,
|
1119 |
+
.mark {
|
1120 |
+
background-color: #fcf8e3;
|
1121 |
+
padding: .2em;
|
1122 |
+
}
|
1123 |
+
.text-left {
|
1124 |
+
text-align: left;
|
1125 |
+
}
|
1126 |
+
.text-right {
|
1127 |
+
text-align: right;
|
1128 |
+
}
|
1129 |
+
.text-center {
|
1130 |
+
text-align: center;
|
1131 |
+
}
|
1132 |
+
.text-justify {
|
1133 |
+
text-align: justify;
|
1134 |
+
}
|
1135 |
+
.text-nowrap {
|
1136 |
+
white-space: nowrap;
|
1137 |
+
}
|
1138 |
+
.text-lowercase {
|
1139 |
+
text-transform: lowercase;
|
1140 |
+
}
|
1141 |
+
.text-uppercase {
|
1142 |
+
text-transform: uppercase;
|
1143 |
+
}
|
1144 |
+
.text-capitalize {
|
1145 |
+
text-transform: capitalize;
|
1146 |
+
}
|
1147 |
+
.text-muted {
|
1148 |
+
color: #777777;
|
1149 |
+
}
|
1150 |
+
.text-primary {
|
1151 |
+
color: #428bca;
|
1152 |
+
}
|
1153 |
+
a.text-primary:hover {
|
1154 |
+
color: #3071a9;
|
1155 |
+
}
|
1156 |
+
.text-success {
|
1157 |
+
color: #3c763d;
|
1158 |
+
}
|
1159 |
+
a.text-success:hover {
|
1160 |
+
color: #2b542c;
|
1161 |
+
}
|
1162 |
+
.text-info {
|
1163 |
+
color: #31708f;
|
1164 |
+
}
|
1165 |
+
a.text-info:hover {
|
1166 |
+
color: #245269;
|
1167 |
+
}
|
1168 |
+
.text-warning {
|
1169 |
+
color: #8a6d3b;
|
1170 |
+
}
|
1171 |
+
a.text-warning:hover {
|
1172 |
+
color: #66512c;
|
1173 |
+
}
|
1174 |
+
.text-danger {
|
1175 |
+
color: #a94442;
|
1176 |
+
}
|
1177 |
+
a.text-danger:hover {
|
1178 |
+
color: #843534;
|
1179 |
+
}
|
1180 |
+
.bg-primary {
|
1181 |
+
color: #fff;
|
1182 |
+
background-color: #428bca;
|
1183 |
+
}
|
1184 |
+
a.bg-primary:hover {
|
1185 |
+
background-color: #3071a9;
|
1186 |
+
}
|
1187 |
+
.bg-success {
|
1188 |
+
background-color: #dff0d8;
|
1189 |
+
}
|
1190 |
+
a.bg-success:hover {
|
1191 |
+
background-color: #c1e2b3;
|
1192 |
+
}
|
1193 |
+
.bg-info {
|
1194 |
+
background-color: #d9edf7;
|
1195 |
+
}
|
1196 |
+
a.bg-info:hover {
|
1197 |
+
background-color: #afd9ee;
|
1198 |
+
}
|
1199 |
+
.bg-warning {
|
1200 |
+
background-color: #fcf8e3;
|
1201 |
+
}
|
1202 |
+
a.bg-warning:hover {
|
1203 |
+
background-color: #f7ecb5;
|
1204 |
+
}
|
1205 |
+
.bg-danger {
|
1206 |
+
background-color: #f2dede;
|
1207 |
+
}
|
1208 |
+
a.bg-danger:hover {
|
1209 |
+
background-color: #e4b9b9;
|
1210 |
+
}
|
1211 |
+
.page-header {
|
1212 |
+
padding-bottom: 9px;
|
1213 |
+
margin: 40px 0 20px;
|
1214 |
+
border-bottom: 1px solid #eeeeee;
|
1215 |
+
}
|
1216 |
+
ul,
|
1217 |
+
ol {
|
1218 |
+
margin-top: 0;
|
1219 |
+
margin-bottom: 10px;
|
1220 |
+
}
|
1221 |
+
ul ul,
|
1222 |
+
ol ul,
|
1223 |
+
ul ol,
|
1224 |
+
ol ol {
|
1225 |
+
margin-bottom: 0;
|
1226 |
+
}
|
1227 |
+
.list-unstyled {
|
1228 |
+
padding-left: 0;
|
1229 |
+
list-style: none;
|
1230 |
+
}
|
1231 |
+
.list-inline {
|
1232 |
+
padding-left: 0;
|
1233 |
+
list-style: none;
|
1234 |
+
margin-left: -5px;
|
1235 |
+
}
|
1236 |
+
.list-inline > li {
|
1237 |
+
display: inline-block;
|
1238 |
+
padding-left: 5px;
|
1239 |
+
padding-right: 5px;
|
1240 |
+
}
|
1241 |
+
dl {
|
1242 |
+
margin-top: 0;
|
1243 |
+
margin-bottom: 20px;
|
1244 |
+
}
|
1245 |
+
dt,
|
1246 |
+
dd {
|
1247 |
+
line-height: 1.42857143;
|
1248 |
+
}
|
1249 |
+
dt {
|
1250 |
+
font-weight: bold;
|
1251 |
+
}
|
1252 |
+
dd {
|
1253 |
+
margin-left: 0;
|
1254 |
+
}
|
1255 |
+
@media (min-width: 768px) {
|
1256 |
+
.dl-horizontal dt {
|
1257 |
+
float: left;
|
1258 |
+
width: 160px;
|
1259 |
+
clear: left;
|
1260 |
+
text-align: right;
|
1261 |
+
overflow: hidden;
|
1262 |
+
text-overflow: ellipsis;
|
1263 |
+
white-space: nowrap;
|
1264 |
+
}
|
1265 |
+
.dl-horizontal dd {
|
1266 |
+
margin-left: 180px;
|
1267 |
+
}
|
1268 |
+
}
|
1269 |
+
abbr[title],
|
1270 |
+
abbr[data-original-title] {
|
1271 |
+
cursor: help;
|
1272 |
+
border-bottom: 1px dotted #777777;
|
1273 |
+
}
|
1274 |
+
.initialism {
|
1275 |
+
font-size: 90%;
|
1276 |
+
text-transform: uppercase;
|
1277 |
+
}
|
1278 |
+
blockquote {
|
1279 |
+
padding: 10px 20px;
|
1280 |
+
margin: 0 0 20px;
|
1281 |
+
font-size: 17.5px;
|
1282 |
+
border-left: 5px solid #eeeeee;
|
1283 |
+
}
|
1284 |
+
blockquote p:last-child,
|
1285 |
+
blockquote ul:last-child,
|
1286 |
+
blockquote ol:last-child {
|
1287 |
+
margin-bottom: 0;
|
1288 |
+
}
|
1289 |
+
blockquote footer,
|
1290 |
+
blockquote small,
|
1291 |
+
blockquote .small {
|
1292 |
+
display: block;
|
1293 |
+
font-size: 80%;
|
1294 |
+
line-height: 1.42857143;
|
1295 |
+
color: #777777;
|
1296 |
+
}
|
1297 |
+
blockquote footer:before,
|
1298 |
+
blockquote small:before,
|
1299 |
+
blockquote .small:before {
|
1300 |
+
content: '\2014 \00A0';
|
1301 |
+
}
|
1302 |
+
.blockquote-reverse,
|
1303 |
+
blockquote.pull-right {
|
1304 |
+
padding-right: 15px;
|
1305 |
+
padding-left: 0;
|
1306 |
+
border-right: 5px solid #eeeeee;
|
1307 |
+
border-left: 0;
|
1308 |
+
text-align: right;
|
1309 |
+
}
|
1310 |
+
.blockquote-reverse footer:before,
|
1311 |
+
blockquote.pull-right footer:before,
|
1312 |
+
.blockquote-reverse small:before,
|
1313 |
+
blockquote.pull-right small:before,
|
1314 |
+
.blockquote-reverse .small:before,
|
1315 |
+
blockquote.pull-right .small:before {
|
1316 |
+
content: '';
|
1317 |
+
}
|
1318 |
+
.blockquote-reverse footer:after,
|
1319 |
+
blockquote.pull-right footer:after,
|
1320 |
+
.blockquote-reverse small:after,
|
1321 |
+
blockquote.pull-right small:after,
|
1322 |
+
.blockquote-reverse .small:after,
|
1323 |
+
blockquote.pull-right .small:after {
|
1324 |
+
content: '\00A0 \2014';
|
1325 |
+
}
|
1326 |
+
blockquote:before,
|
1327 |
+
blockquote:after {
|
1328 |
+
content: "";
|
1329 |
+
}
|
1330 |
+
address {
|
1331 |
+
margin-bottom: 20px;
|
1332 |
+
font-style: normal;
|
1333 |
+
line-height: 1.42857143;
|
1334 |
+
}
|
1335 |
+
code,
|
1336 |
+
kbd,
|
1337 |
+
pre,
|
1338 |
+
samp {
|
1339 |
+
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
1340 |
+
}
|
1341 |
+
code {
|
1342 |
+
padding: 2px 4px;
|
1343 |
+
font-size: 90%;
|
1344 |
+
color: #c7254e;
|
1345 |
+
background-color: #f9f2f4;
|
1346 |
+
border-radius: 4px;
|
1347 |
+
}
|
1348 |
+
kbd {
|
1349 |
+
padding: 2px 4px;
|
1350 |
+
font-size: 90%;
|
1351 |
+
color: #ffffff;
|
1352 |
+
background-color: #333333;
|
1353 |
+
border-radius: 3px;
|
1354 |
+
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
|
1355 |
+
}
|
1356 |
+
kbd kbd {
|
1357 |
+
padding: 0;
|
1358 |
+
font-size: 100%;
|
1359 |
+
box-shadow: none;
|
1360 |
+
}
|
1361 |
+
pre {
|
1362 |
+
display: block;
|
1363 |
+
padding: 9.5px;
|
1364 |
+
margin: 0 0 10px;
|
1365 |
+
font-size: 13px;
|
1366 |
+
line-height: 1.42857143;
|
1367 |
+
word-break: break-all;
|
1368 |
+
word-wrap: break-word;
|
1369 |
+
color: #333333;
|
1370 |
+
background-color: #f5f5f5;
|
1371 |
+
border: 1px solid #cccccc;
|
1372 |
+
border-radius: 4px;
|
1373 |
+
}
|
1374 |
+
pre code {
|
1375 |
+
padding: 0;
|
1376 |
+
font-size: inherit;
|
1377 |
+
color: inherit;
|
1378 |
+
white-space: pre-wrap;
|
1379 |
+
background-color: transparent;
|
1380 |
+
border-radius: 0;
|
1381 |
+
}
|
1382 |
+
.pre-scrollable {
|
1383 |
+
max-height: 340px;
|
1384 |
+
overflow-y: scroll;
|
1385 |
+
}
|
1386 |
+
.container {
|
1387 |
+
margin-right: auto;
|
1388 |
+
margin-left: auto;
|
1389 |
+
padding-left: 15px;
|
1390 |
+
padding-right: 15px;
|
1391 |
+
}
|
1392 |
+
@media (min-width: 768px) {
|
1393 |
+
.container {
|
1394 |
+
width: 750px;
|
1395 |
+
}
|
1396 |
+
}
|
1397 |
+
@media (min-width: 992px) {
|
1398 |
+
.container {
|
1399 |
+
width: 970px;
|
1400 |
+
}
|
1401 |
+
}
|
1402 |
+
@media (min-width: 1200px) {
|
1403 |
+
.container {
|
1404 |
+
width: 1170px;
|
1405 |
+
}
|
1406 |
+
}
|
1407 |
+
.container-fluid {
|
1408 |
+
margin-right: auto;
|
1409 |
+
margin-left: auto;
|
1410 |
+
padding-left: 15px;
|
1411 |
+
padding-right: 15px;
|
1412 |
+
}
|
1413 |
+
.row {
|
1414 |
+
margin-left: -15px;
|
1415 |
+
margin-right: -15px;
|
1416 |
+
}
|
1417 |
+
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
|
1418 |
+
position: relative;
|
1419 |
+
min-height: 1px;
|
1420 |
+
padding-left: 15px;
|
1421 |
+
padding-right: 15px;
|
1422 |
+
}
|
1423 |
+
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
|
1424 |
+
float: left;
|
1425 |
+
}
|
1426 |
+
.col-xs-12 {
|
1427 |
+
width: 100%;
|
1428 |
+
}
|
1429 |
+
.col-xs-11 {
|
1430 |
+
width: 91.66666667%;
|
1431 |
+
}
|
1432 |
+
.col-xs-10 {
|
1433 |
+
width: 83.33333333%;
|
1434 |
+
}
|
1435 |
+
.col-xs-9 {
|
1436 |
+
width: 75%;
|
1437 |
+
}
|
1438 |
+
.col-xs-8 {
|
1439 |
+
width: 66.66666667%;
|
1440 |
+
}
|
1441 |
+
.col-xs-7 {
|
1442 |
+
width: 58.33333333%;
|
1443 |
+
}
|
1444 |
+
.col-xs-6 {
|
1445 |
+
width: 50%;
|
1446 |
+
}
|
1447 |
+
.col-xs-5 {
|
1448 |
+
width: 41.66666667%;
|
1449 |
+
}
|
1450 |
+
.col-xs-4 {
|
1451 |
+
width: 33.33333333%;
|
1452 |
+
}
|
1453 |
+
.col-xs-3 {
|
1454 |
+
width: 25%;
|
1455 |
+
}
|
1456 |
+
.col-xs-2 {
|
1457 |
+
width: 16.66666667%;
|
1458 |
+
}
|
1459 |
+
.col-xs-1 {
|
1460 |
+
width: 8.33333333%;
|
1461 |
+
}
|
1462 |
+
.col-xs-pull-12 {
|
1463 |
+
right: 100%;
|
1464 |
+
}
|
1465 |
+
.col-xs-pull-11 {
|
1466 |
+
right: 91.66666667%;
|
1467 |
+
}
|
1468 |
+
.col-xs-pull-10 {
|
1469 |
+
right: 83.33333333%;
|
1470 |
+
}
|
1471 |
+
.col-xs-pull-9 {
|
1472 |
+
right: 75%;
|
1473 |
+
}
|
1474 |
+
.col-xs-pull-8 {
|
1475 |
+
right: 66.66666667%;
|
1476 |
+
}
|
1477 |
+
.col-xs-pull-7 {
|
1478 |
+
right: 58.33333333%;
|
1479 |
+
}
|
1480 |
+
.col-xs-pull-6 {
|
1481 |
+
right: 50%;
|
1482 |
+
}
|
1483 |
+
.col-xs-pull-5 {
|
1484 |
+
right: 41.66666667%;
|
1485 |
+
}
|
1486 |
+
.col-xs-pull-4 {
|
1487 |
+
right: 33.33333333%;
|
1488 |
+
}
|
1489 |
+
.col-xs-pull-3 {
|
1490 |
+
right: 25%;
|
1491 |
+
}
|
1492 |
+
.col-xs-pull-2 {
|
1493 |
+
right: 16.66666667%;
|
1494 |
+
}
|
1495 |
+
.col-xs-pull-1 {
|
1496 |
+
right: 8.33333333%;
|
1497 |
+
}
|
1498 |
+
.col-xs-pull-0 {
|
1499 |
+
right: auto;
|
1500 |
+
}
|
1501 |
+
.col-xs-push-12 {
|
1502 |
+
left: 100%;
|
1503 |
+
}
|
1504 |
+
.col-xs-push-11 {
|
1505 |
+
left: 91.66666667%;
|
1506 |
+
}
|
1507 |
+
.col-xs-push-10 {
|
1508 |
+
left: 83.33333333%;
|
1509 |
+
}
|
1510 |
+
.col-xs-push-9 {
|
1511 |
+
left: 75%;
|
1512 |
+
}
|
1513 |
+
.col-xs-push-8 {
|
1514 |
+
left: 66.66666667%;
|
1515 |
+
}
|
1516 |
+
.col-xs-push-7 {
|
1517 |
+
left: 58.33333333%;
|
1518 |
+
}
|
1519 |
+
.col-xs-push-6 {
|
1520 |
+
left: 50%;
|
1521 |
+
}
|
1522 |
+
.col-xs-push-5 {
|
1523 |
+
left: 41.66666667%;
|
1524 |
+
}
|
1525 |
+
.col-xs-push-4 {
|
1526 |
+
left: 33.33333333%;
|
1527 |
+
}
|
1528 |
+
.col-xs-push-3 {
|
1529 |
+
left: 25%;
|
1530 |
+
}
|
1531 |
+
.col-xs-push-2 {
|
1532 |
+
left: 16.66666667%;
|
1533 |
+
}
|
1534 |
+
.col-xs-push-1 {
|
1535 |
+
left: 8.33333333%;
|
1536 |
+
}
|
1537 |
+
.col-xs-push-0 {
|
1538 |
+
left: auto;
|
1539 |
+
}
|
1540 |
+
.col-xs-offset-12 {
|
1541 |
+
margin-left: 100%;
|
1542 |
+
}
|
1543 |
+
.col-xs-offset-11 {
|
1544 |
+
margin-left: 91.66666667%;
|
1545 |
+
}
|
1546 |
+
.col-xs-offset-10 {
|
1547 |
+
margin-left: 83.33333333%;
|
1548 |
+
}
|
1549 |
+
.col-xs-offset-9 {
|
1550 |
+
margin-left: 75%;
|
1551 |
+
}
|
1552 |
+
.col-xs-offset-8 {
|
1553 |
+
margin-left: 66.66666667%;
|
1554 |
+
}
|
1555 |
+
.col-xs-offset-7 {
|
1556 |
+
margin-left: 58.33333333%;
|
1557 |
+
}
|
1558 |
+
.col-xs-offset-6 {
|
1559 |
+
margin-left: 50%;
|
1560 |
+
}
|
1561 |
+
.col-xs-offset-5 {
|
1562 |
+
margin-left: 41.66666667%;
|
1563 |
+
}
|
1564 |
+
.col-xs-offset-4 {
|
1565 |
+
margin-left: 33.33333333%;
|
1566 |
+
}
|
1567 |
+
.col-xs-offset-3 {
|
1568 |
+
margin-left: 25%;
|
1569 |
+
}
|
1570 |
+
.col-xs-offset-2 {
|
1571 |
+
margin-left: 16.66666667%;
|
1572 |
+
}
|
1573 |
+
.col-xs-offset-1 {
|
1574 |
+
margin-left: 8.33333333%;
|
1575 |
+
}
|
1576 |
+
.col-xs-offset-0 {
|
1577 |
+
margin-left: 0%;
|
1578 |
+
}
|
1579 |
+
@media (min-width: 768px) {
|
1580 |
+
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
|
1581 |
+
float: left;
|
1582 |
+
}
|
1583 |
+
.col-sm-12 {
|
1584 |
+
width: 100%;
|
1585 |
+
}
|
1586 |
+
.col-sm-11 {
|
1587 |
+
width: 91.66666667%;
|
1588 |
+
}
|
1589 |
+
.col-sm-10 {
|
1590 |
+
width: 83.33333333%;
|
1591 |
+
}
|
1592 |
+
.col-sm-9 {
|
1593 |
+
width: 75%;
|
1594 |
+
}
|
1595 |
+
.col-sm-8 {
|
1596 |
+
width: 66.66666667%;
|
1597 |
+
}
|
1598 |
+
.col-sm-7 {
|
1599 |
+
width: 58.33333333%;
|
1600 |
+
}
|
1601 |
+
.col-sm-6 {
|
1602 |
+
width: 50%;
|
1603 |
+
}
|
1604 |
+
.col-sm-5 {
|
1605 |
+
width: 41.66666667%;
|
1606 |
+
}
|
1607 |
+
.col-sm-4 {
|
1608 |
+
width: 33.33333333%;
|
1609 |
+
}
|
1610 |
+
.col-sm-3 {
|
1611 |
+
width: 25%;
|
1612 |
+
}
|
1613 |
+
.col-sm-2 {
|
1614 |
+
width: 16.66666667%;
|
1615 |
+
}
|
1616 |
+
.col-sm-1 {
|
1617 |
+
width: 8.33333333%;
|
1618 |
+
}
|
1619 |
+
.col-sm-pull-12 {
|
1620 |
+
right: 100%;
|
1621 |
+
}
|
1622 |
+
.col-sm-pull-11 {
|
1623 |
+
right: 91.66666667%;
|
1624 |
+
}
|
1625 |
+
.col-sm-pull-10 {
|
1626 |
+
right: 83.33333333%;
|
1627 |
+
}
|
1628 |
+
.col-sm-pull-9 {
|
1629 |
+
right: 75%;
|
1630 |
+
}
|
1631 |
+
.col-sm-pull-8 {
|
1632 |
+
right: 66.66666667%;
|
1633 |
+
}
|
1634 |
+
.col-sm-pull-7 {
|
1635 |
+
right: 58.33333333%;
|
1636 |
+
}
|
1637 |
+
.col-sm-pull-6 {
|
1638 |
+
right: 50%;
|
1639 |
+
}
|
1640 |
+
.col-sm-pull-5 {
|
1641 |
+
right: 41.66666667%;
|
1642 |
+
}
|
1643 |
+
.col-sm-pull-4 {
|
1644 |
+
right: 33.33333333%;
|
1645 |
+
}
|
1646 |
+
.col-sm-pull-3 {
|
1647 |
+
right: 25%;
|
1648 |
+
}
|
1649 |
+
.col-sm-pull-2 {
|
1650 |
+
right: 16.66666667%;
|
1651 |
+
}
|
1652 |
+
.col-sm-pull-1 {
|
1653 |
+
right: 8.33333333%;
|
1654 |
+
}
|
1655 |
+
.col-sm-pull-0 {
|
1656 |
+
right: auto;
|
1657 |
+
}
|
1658 |
+
.col-sm-push-12 {
|
1659 |
+
left: 100%;
|
1660 |
+
}
|
1661 |
+
.col-sm-push-11 {
|
1662 |
+
left: 91.66666667%;
|
1663 |
+
}
|
1664 |
+
.col-sm-push-10 {
|
1665 |
+
left: 83.33333333%;
|
1666 |
+
}
|
1667 |
+
.col-sm-push-9 {
|
1668 |
+
left: 75%;
|
1669 |
+
}
|
1670 |
+
.col-sm-push-8 {
|
1671 |
+
left: 66.66666667%;
|
1672 |
+
}
|
1673 |
+
.col-sm-push-7 {
|
1674 |
+
left: 58.33333333%;
|
1675 |
+
}
|
1676 |
+
.col-sm-push-6 {
|
1677 |
+
left: 50%;
|
1678 |
+
}
|
1679 |
+
.col-sm-push-5 {
|
1680 |
+
left: 41.66666667%;
|
1681 |
+
}
|
1682 |
+
.col-sm-push-4 {
|
1683 |
+
left: 33.33333333%;
|
1684 |
+
}
|
1685 |
+
.col-sm-push-3 {
|
1686 |
+
left: 25%;
|
1687 |
+
}
|
1688 |
+
.col-sm-push-2 {
|
1689 |
+
left: 16.66666667%;
|
1690 |
+
}
|
1691 |
+
.col-sm-push-1 {
|
1692 |
+
left: 8.33333333%;
|
1693 |
+
}
|
1694 |
+
.col-sm-push-0 {
|
1695 |
+
left: auto;
|
1696 |
+
}
|
1697 |
+
.col-sm-offset-12 {
|
1698 |
+
margin-left: 100%;
|
1699 |
+
}
|
1700 |
+
.col-sm-offset-11 {
|
1701 |
+
margin-left: 91.66666667%;
|
1702 |
+
}
|
1703 |
+
.col-sm-offset-10 {
|
1704 |
+
margin-left: 83.33333333%;
|
1705 |
+
}
|
1706 |
+
.col-sm-offset-9 {
|
1707 |
+
margin-left: 75%;
|
1708 |
+
}
|
1709 |
+
.col-sm-offset-8 {
|
1710 |
+
margin-left: 66.66666667%;
|
1711 |
+
}
|
1712 |
+
.col-sm-offset-7 {
|
1713 |
+
margin-left: 58.33333333%;
|
1714 |
+
}
|
1715 |
+
.col-sm-offset-6 {
|
1716 |
+
margin-left: 50%;
|
1717 |
+
}
|
1718 |
+
.col-sm-offset-5 {
|
1719 |
+
margin-left: 41.66666667%;
|
1720 |
+
}
|
1721 |
+
.col-sm-offset-4 {
|
1722 |
+
margin-left: 33.33333333%;
|
1723 |
+
}
|
1724 |
+
.col-sm-offset-3 {
|
1725 |
+
margin-left: 25%;
|
1726 |
+
}
|
1727 |
+
.col-sm-offset-2 {
|
1728 |
+
margin-left: 16.66666667%;
|
1729 |
+
}
|
1730 |
+
.col-sm-offset-1 {
|
1731 |
+
margin-left: 8.33333333%;
|
1732 |
+
}
|
1733 |
+
.col-sm-offset-0 {
|
1734 |
+
margin-left: 0%;
|
1735 |
+
}
|
1736 |
+
}
|
1737 |
+
@media (min-width: 992px) {
|
1738 |
+
.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
|
1739 |
+
float: left;
|
1740 |
+
}
|
1741 |
+
.col-md-12 {
|
1742 |
+
width: 100%;
|
1743 |
+
}
|
1744 |
+
.col-md-11 {
|
1745 |
+
width: 91.66666667%;
|
1746 |
+
}
|
1747 |
+
.col-md-10 {
|
1748 |
+
width: 83.33333333%;
|
1749 |
+
}
|
1750 |
+
.col-md-9 {
|
1751 |
+
width: 75%;
|
1752 |
+
}
|
1753 |
+
.col-md-8 {
|
1754 |
+
width: 66.66666667%;
|
1755 |
+
}
|
1756 |
+
.col-md-7 {
|
1757 |
+
width: 58.33333333%;
|
1758 |
+
}
|
1759 |
+
.col-md-6 {
|
1760 |
+
width: 50%;
|
1761 |
+
}
|
1762 |
+
.col-md-5 {
|
1763 |
+
width: 41.66666667%;
|
1764 |
+
}
|
1765 |
+
.col-md-4 {
|
1766 |
+
width: 33.33333333%;
|
1767 |
+
}
|
1768 |
+
.col-md-3 {
|
1769 |
+
width: 25%;
|
1770 |
+
}
|
1771 |
+
.col-md-2 {
|
1772 |
+
width: 16.66666667%;
|
1773 |
+
}
|
1774 |
+
.col-md-1 {
|
1775 |
+
width: 8.33333333%;
|
1776 |
+
}
|
1777 |
+
.col-md-pull-12 {
|
1778 |
+
right: 100%;
|
1779 |
+
}
|
1780 |
+
.col-md-pull-11 {
|
1781 |
+
right: 91.66666667%;
|
1782 |
+
}
|
1783 |
+
.col-md-pull-10 {
|
1784 |
+
right: 83.33333333%;
|
1785 |
+
}
|
1786 |
+
.col-md-pull-9 {
|
1787 |
+
right: 75%;
|
1788 |
+
}
|
1789 |
+
.col-md-pull-8 {
|
1790 |
+
right: 66.66666667%;
|
1791 |
+
}
|
1792 |
+
.col-md-pull-7 {
|
1793 |
+
right: 58.33333333%;
|
1794 |
+
}
|
1795 |
+
.col-md-pull-6 {
|
1796 |
+
right: 50%;
|
1797 |
+
}
|
1798 |
+
.col-md-pull-5 {
|
1799 |
+
right: 41.66666667%;
|
1800 |
+
}
|
1801 |
+
.col-md-pull-4 {
|
1802 |
+
right: 33.33333333%;
|
1803 |
+
}
|
1804 |
+
.col-md-pull-3 {
|
1805 |
+
right: 25%;
|
1806 |
+
}
|
1807 |
+
.col-md-pull-2 {
|
1808 |
+
right: 16.66666667%;
|
1809 |
+
}
|
1810 |
+
.col-md-pull-1 {
|
1811 |
+
right: 8.33333333%;
|
1812 |
+
}
|
1813 |
+
.col-md-pull-0 {
|
1814 |
+
right: auto;
|
1815 |
+
}
|
1816 |
+
.col-md-push-12 {
|
1817 |
+
left: 100%;
|
1818 |
+
}
|
1819 |
+
.col-md-push-11 {
|
1820 |
+
left: 91.66666667%;
|
1821 |
+
}
|
1822 |
+
.col-md-push-10 {
|
1823 |
+
left: 83.33333333%;
|
1824 |
+
}
|
1825 |
+
.col-md-push-9 {
|
1826 |
+
left: 75%;
|
1827 |
+
}
|
1828 |
+
.col-md-push-8 {
|
1829 |
+
left: 66.66666667%;
|
1830 |
+
}
|
1831 |
+
.col-md-push-7 {
|
1832 |
+
left: 58.33333333%;
|
1833 |
+
}
|
1834 |
+
.col-md-push-6 {
|
1835 |
+
left: 50%;
|
1836 |
+
}
|
1837 |
+
.col-md-push-5 {
|
1838 |
+
left: 41.66666667%;
|
1839 |
+
}
|
1840 |
+
.col-md-push-4 {
|
1841 |
+
left: 33.33333333%;
|
1842 |
+
}
|
1843 |
+
.col-md-push-3 {
|
1844 |
+
left: 25%;
|
1845 |
+
}
|
1846 |
+
.col-md-push-2 {
|
1847 |
+
left: 16.66666667%;
|
1848 |
+
}
|
1849 |
+
.col-md-push-1 {
|
1850 |
+
left: 8.33333333%;
|
1851 |
+
}
|
1852 |
+
.col-md-push-0 {
|
1853 |
+
left: auto;
|
1854 |
+
}
|
1855 |
+
.col-md-offset-12 {
|
1856 |
+
margin-left: 100%;
|
1857 |
+
}
|
1858 |
+
.col-md-offset-11 {
|
1859 |
+
margin-left: 91.66666667%;
|
1860 |
+
}
|
1861 |
+
.col-md-offset-10 {
|
1862 |
+
margin-left: 83.33333333%;
|
1863 |
+
}
|
1864 |
+
.col-md-offset-9 {
|
1865 |
+
margin-left: 75%;
|
1866 |
+
}
|
1867 |
+
.col-md-offset-8 {
|
1868 |
+
margin-left: 66.66666667%;
|
1869 |
+
}
|
1870 |
+
.col-md-offset-7 {
|
1871 |
+
margin-left: 58.33333333%;
|
1872 |
+
}
|
1873 |
+
.col-md-offset-6 {
|
1874 |
+
margin-left: 50%;
|
1875 |
+
}
|
1876 |
+
.col-md-offset-5 {
|
1877 |
+
margin-left: 41.66666667%;
|
1878 |
+
}
|
1879 |
+
.col-md-offset-4 {
|
1880 |
+
margin-left: 33.33333333%;
|
1881 |
+
}
|
1882 |
+
.col-md-offset-3 {
|
1883 |
+
margin-left: 25%;
|
1884 |
+
}
|
1885 |
+
.col-md-offset-2 {
|
1886 |
+
margin-left: 16.66666667%;
|
1887 |
+
}
|
1888 |
+
.col-md-offset-1 {
|
1889 |
+
margin-left: 8.33333333%;
|
1890 |
+
}
|
1891 |
+
.col-md-offset-0 {
|
1892 |
+
margin-left: 0%;
|
1893 |
+
}
|
1894 |
+
}
|
1895 |
+
@media (min-width: 1200px) {
|
1896 |
+
.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
|
1897 |
+
float: left;
|
1898 |
+
}
|
1899 |
+
.col-lg-12 {
|
1900 |
+
width: 100%;
|
1901 |
+
}
|
1902 |
+
.col-lg-11 {
|
1903 |
+
width: 91.66666667%;
|
1904 |
+
}
|
1905 |
+
.col-lg-10 {
|
1906 |
+
width: 83.33333333%;
|
1907 |
+
}
|
1908 |
+
.col-lg-9 {
|
1909 |
+
width: 75%;
|
1910 |
+
}
|
1911 |
+
.col-lg-8 {
|
1912 |
+
width: 66.66666667%;
|
1913 |
+
}
|
1914 |
+
.col-lg-7 {
|
1915 |
+
width: 58.33333333%;
|
1916 |
+
}
|
1917 |
+
.col-lg-6 {
|
1918 |
+
width: 50%;
|
1919 |
+
}
|
1920 |
+
.col-lg-5 {
|
1921 |
+
width: 41.66666667%;
|
1922 |
+
}
|
1923 |
+
.col-lg-4 {
|
1924 |
+
width: 33.33333333%;
|
1925 |
+
}
|
1926 |
+
.col-lg-3 {
|
1927 |
+
width: 25%;
|
1928 |
+
}
|
1929 |
+
.col-lg-2 {
|
1930 |
+
width: 16.66666667%;
|
1931 |
+
}
|
1932 |
+
.col-lg-1 {
|
1933 |
+
width: 8.33333333%;
|
1934 |
+
}
|
1935 |
+
.col-lg-pull-12 {
|
1936 |
+
right: 100%;
|
1937 |
+
}
|
1938 |
+
.col-lg-pull-11 {
|
1939 |
+
right: 91.66666667%;
|
1940 |
+
}
|
1941 |
+
.col-lg-pull-10 {
|
1942 |
+
right: 83.33333333%;
|
1943 |
+
}
|
1944 |
+
.col-lg-pull-9 {
|
1945 |
+
right: 75%;
|
1946 |
+
}
|
1947 |
+
.col-lg-pull-8 {
|
1948 |
+
right: 66.66666667%;
|
1949 |
+
}
|
1950 |
+
.col-lg-pull-7 {
|
1951 |
+
right: 58.33333333%;
|
1952 |
+
}
|
1953 |
+
.col-lg-pull-6 {
|
1954 |
+
right: 50%;
|
1955 |
+
}
|
1956 |
+
.col-lg-pull-5 {
|
1957 |
+
right: 41.66666667%;
|
1958 |
+
}
|
1959 |
+
.col-lg-pull-4 {
|
1960 |
+
right: 33.33333333%;
|
1961 |
+
}
|
1962 |
+
.col-lg-pull-3 {
|
1963 |
+
right: 25%;
|
1964 |
+
}
|
1965 |
+
.col-lg-pull-2 {
|
1966 |
+
right: 16.66666667%;
|
1967 |
+
}
|
1968 |
+
.col-lg-pull-1 {
|
1969 |
+
right: 8.33333333%;
|
1970 |
+
}
|
1971 |
+
.col-lg-pull-0 {
|
1972 |
+
right: auto;
|
1973 |
+
}
|
1974 |
+
.col-lg-push-12 {
|
1975 |
+
left: 100%;
|
1976 |
+
}
|
1977 |
+
.col-lg-push-11 {
|
1978 |
+
left: 91.66666667%;
|
1979 |
+
}
|
1980 |
+
.col-lg-push-10 {
|
1981 |
+
left: 83.33333333%;
|
1982 |
+
}
|
1983 |
+
.col-lg-push-9 {
|
1984 |
+
left: 75%;
|
1985 |
+
}
|
1986 |
+
.col-lg-push-8 {
|
1987 |
+
left: 66.66666667%;
|
1988 |
+
}
|
1989 |
+
.col-lg-push-7 {
|
1990 |
+
left: 58.33333333%;
|
1991 |
+
}
|
1992 |
+
.col-lg-push-6 {
|
1993 |
+
left: 50%;
|
1994 |
+
}
|
1995 |
+
.col-lg-push-5 {
|
1996 |
+
left: 41.66666667%;
|
1997 |
+
}
|
1998 |
+
.col-lg-push-4 {
|
1999 |
+
left: 33.33333333%;
|
2000 |
+
}
|
2001 |
+
.col-lg-push-3 {
|
2002 |
+
left: 25%;
|
2003 |
+
}
|
2004 |
+
.col-lg-push-2 {
|
2005 |
+
left: 16.66666667%;
|
2006 |
+
}
|
2007 |
+
.col-lg-push-1 {
|
2008 |
+
left: 8.33333333%;
|
2009 |
+
}
|
2010 |
+
.col-lg-push-0 {
|
2011 |
+
left: auto;
|
2012 |
+
}
|
2013 |
+
.col-lg-offset-12 {
|
2014 |
+
margin-left: 100%;
|
2015 |
+
}
|
2016 |
+
.col-lg-offset-11 {
|
2017 |
+
margin-left: 91.66666667%;
|
2018 |
+
}
|
2019 |
+
.col-lg-offset-10 {
|
2020 |
+
margin-left: 83.33333333%;
|
2021 |
+
}
|
2022 |
+
.col-lg-offset-9 {
|
2023 |
+
margin-left: 75%;
|
2024 |
+
}
|
2025 |
+
.col-lg-offset-8 {
|
2026 |
+
margin-left: 66.66666667%;
|
2027 |
+
}
|
2028 |
+
.col-lg-offset-7 {
|
2029 |
+
margin-left: 58.33333333%;
|
2030 |
+
}
|
2031 |
+
.col-lg-offset-6 {
|
2032 |
+
margin-left: 50%;
|
2033 |
+
}
|
2034 |
+
.col-lg-offset-5 {
|
2035 |
+
margin-left: 41.66666667%;
|
2036 |
+
}
|
2037 |
+
.col-lg-offset-4 {
|
2038 |
+
margin-left: 33.33333333%;
|
2039 |
+
}
|
2040 |
+
.col-lg-offset-3 {
|
2041 |
+
margin-left: 25%;
|
2042 |
+
}
|
2043 |
+
.col-lg-offset-2 {
|
2044 |
+
margin-left: 16.66666667%;
|
2045 |
+
}
|
2046 |
+
.col-lg-offset-1 {
|
2047 |
+
margin-left: 8.33333333%;
|
2048 |
+
}
|
2049 |
+
.col-lg-offset-0 {
|
2050 |
+
margin-left: 0%;
|
2051 |
+
}
|
2052 |
+
}
|
2053 |
+
table {
|
2054 |
+
background-color: transparent;
|
2055 |
+
}
|
2056 |
+
th {
|
2057 |
+
text-align: left;
|
2058 |
+
}
|
2059 |
+
.table {
|
2060 |
+
width: 100%;
|
2061 |
+
max-width: 100%;
|
2062 |
+
margin-bottom: 20px;
|
2063 |
+
}
|
2064 |
+
.table > thead > tr > th,
|
2065 |
+
.table > tbody > tr > th,
|
2066 |
+
.table > tfoot > tr > th,
|
2067 |
+
.table > thead > tr > td,
|
2068 |
+
.table > tbody > tr > td,
|
2069 |
+
.table > tfoot > tr > td {
|
2070 |
+
padding: 8px;
|
2071 |
+
line-height: 1.42857143;
|
2072 |
+
vertical-align: top;
|
2073 |
+
border-top: 1px solid #dddddd;
|
2074 |
+
}
|
2075 |
+
.table > thead > tr > th {
|
2076 |
+
vertical-align: bottom;
|
2077 |
+
border-bottom: 2px solid #dddddd;
|
2078 |
+
}
|
2079 |
+
.table > caption + thead > tr:first-child > th,
|
2080 |
+
.table > colgroup + thead > tr:first-child > th,
|
2081 |
+
.table > thead:first-child > tr:first-child > th,
|
2082 |
+
.table > caption + thead > tr:first-child > td,
|
2083 |
+
.table > colgroup + thead > tr:first-child > td,
|
2084 |
+
.table > thead:first-child > tr:first-child > td {
|
2085 |
+
border-top: 0;
|
2086 |
+
}
|
2087 |
+
.table > tbody + tbody {
|
2088 |
+
border-top: 2px solid #dddddd;
|
2089 |
+
}
|
2090 |
+
.table .table {
|
2091 |
+
background-color: #ffffff;
|
2092 |
+
}
|
2093 |
+
.table-condensed > thead > tr > th,
|
2094 |
+
.table-condensed > tbody > tr > th,
|
2095 |
+
.table-condensed > tfoot > tr > th,
|
2096 |
+
.table-condensed > thead > tr > td,
|
2097 |
+
.table-condensed > tbody > tr > td,
|
2098 |
+
.table-condensed > tfoot > tr > td {
|
2099 |
+
padding: 5px;
|
2100 |
+
}
|
2101 |
+
.table-bordered {
|
2102 |
+
border: 1px solid #dddddd;
|
2103 |
+
}
|
2104 |
+
.table-bordered > thead > tr > th,
|
2105 |
+
.table-bordered > tbody > tr > th,
|
2106 |
+
.table-bordered > tfoot > tr > th,
|
2107 |
+
.table-bordered > thead > tr > td,
|
2108 |
+
.table-bordered > tbody > tr > td,
|
2109 |
+
.table-bordered > tfoot > tr > td {
|
2110 |
+
border: 1px solid #dddddd;
|
2111 |
+
}
|
2112 |
+
.table-bordered > thead > tr > th,
|
2113 |
+
.table-bordered > thead > tr > td {
|
2114 |
+
border-bottom-width: 2px;
|
2115 |
+
}
|
2116 |
+
.table-striped > tbody > tr:nth-child(odd) > td,
|
2117 |
+
.table-striped > tbody > tr:nth-child(odd) > th {
|
2118 |
+
background-color: #f9f9f9;
|
2119 |
+
}
|
2120 |
+
.table-hover > tbody > tr:hover > td,
|
2121 |
+
.table-hover > tbody > tr:hover > th {
|
2122 |
+
background-color: #f5f5f5;
|
2123 |
+
}
|
2124 |
+
table col[class*="col-"] {
|
2125 |
+
position: static;
|
2126 |
+
float: none;
|
2127 |
+
display: table-column;
|
2128 |
+
}
|
2129 |
+
table td[class*="col-"],
|
2130 |
+
table th[class*="col-"] {
|
2131 |
+
position: static;
|
2132 |
+
float: none;
|
2133 |
+
display: table-cell;
|
2134 |
+
}
|
2135 |
+
.table > thead > tr > td.active,
|
2136 |
+
.table > tbody > tr > td.active,
|
2137 |
+
.table > tfoot > tr > td.active,
|
2138 |
+
.table > thead > tr > th.active,
|
2139 |
+
.table > tbody > tr > th.active,
|
2140 |
+
.table > tfoot > tr > th.active,
|
2141 |
+
.table > thead > tr.active > td,
|
2142 |
+
.table > tbody > tr.active > td,
|
2143 |
+
.table > tfoot > tr.active > td,
|
2144 |
+
.table > thead > tr.active > th,
|
2145 |
+
.table > tbody > tr.active > th,
|
2146 |
+
.table > tfoot > tr.active > th {
|
2147 |
+
background-color: #f5f5f5;
|
2148 |
+
}
|
2149 |
+
.table-hover > tbody > tr > td.active:hover,
|
2150 |
+
.table-hover > tbody > tr > th.active:hover,
|
2151 |
+
.table-hover > tbody > tr.active:hover > td,
|
2152 |
+
.table-hover > tbody > tr:hover > .active,
|
2153 |
+
.table-hover > tbody > tr.active:hover > th {
|
2154 |
+
background-color: #e8e8e8;
|
2155 |
+
}
|
2156 |
+
.table > thead > tr > td.success,
|
2157 |
+
.table > tbody > tr > td.success,
|
2158 |
+
.table > tfoot > tr > td.success,
|
2159 |
+
.table > thead > tr > th.success,
|
2160 |
+
.table > tbody > tr > th.success,
|
2161 |
+
.table > tfoot > tr > th.success,
|
2162 |
+
.table > thead > tr.success > td,
|
2163 |
+
.table > tbody > tr.success > td,
|
2164 |
+
.table > tfoot > tr.success > td,
|
2165 |
+
.table > thead > tr.success > th,
|
2166 |
+
.table > tbody > tr.success > th,
|
2167 |
+
.table > tfoot > tr.success > th {
|
2168 |
+
background-color: #dff0d8;
|
2169 |
+
}
|
2170 |
+
.table-hover > tbody > tr > td.success:hover,
|
2171 |
+
.table-hover > tbody > tr > th.success:hover,
|
2172 |
+
.table-hover > tbody > tr.success:hover > td,
|
2173 |
+
.table-hover > tbody > tr:hover > .success,
|
2174 |
+
.table-hover > tbody > tr.success:hover > th {
|
2175 |
+
background-color: #d0e9c6;
|
2176 |
+
}
|
2177 |
+
.table > thead > tr > td.info,
|
2178 |
+
.table > tbody > tr > td.info,
|
2179 |
+
.table > tfoot > tr > td.info,
|
2180 |
+
.table > thead > tr > th.info,
|
2181 |
+
.table > tbody > tr > th.info,
|
2182 |
+
.table > tfoot > tr > th.info,
|
2183 |
+
.table > thead > tr.info > td,
|
2184 |
+
.table > tbody > tr.info > td,
|
2185 |
+
.table > tfoot > tr.info > td,
|
2186 |
+
.table > thead > tr.info > th,
|
2187 |
+
.table > tbody > tr.info > th,
|
2188 |
+
.table > tfoot > tr.info > th {
|
2189 |
+
background-color: #d9edf7;
|
2190 |
+
}
|
2191 |
+
.table-hover > tbody > tr > td.info:hover,
|
2192 |
+
.table-hover > tbody > tr > th.info:hover,
|
2193 |
+
.table-hover > tbody > tr.info:hover > td,
|
2194 |
+
.table-hover > tbody > tr:hover > .info,
|
2195 |
+
.table-hover > tbody > tr.info:hover > th {
|
2196 |
+
background-color: #c4e3f3;
|
2197 |
+
}
|
2198 |
+
.table > thead > tr > td.warning,
|
2199 |
+
.table > tbody > tr > td.warning,
|
2200 |
+
.table > tfoot > tr > td.warning,
|
2201 |
+
.table > thead > tr > th.warning,
|
2202 |
+
.table > tbody > tr > th.warning,
|
2203 |
+
.table > tfoot > tr > th.warning,
|
2204 |
+
.table > thead > tr.warning > td,
|
2205 |
+
.table > tbody > tr.warning > td,
|
2206 |
+
.table > tfoot > tr.warning > td,
|
2207 |
+
.table > thead > tr.warning > th,
|
2208 |
+
.table > tbody > tr.warning > th,
|
2209 |
+
.table > tfoot > tr.warning > th {
|
2210 |
+
background-color: #fcf8e3;
|
2211 |
+
}
|
2212 |
+
.table-hover > tbody > tr > td.warning:hover,
|
2213 |
+
.table-hover > tbody > tr > th.warning:hover,
|
2214 |
+
.table-hover > tbody > tr.warning:hover > td,
|
2215 |
+
.table-hover > tbody > tr:hover > .warning,
|
2216 |
+
.table-hover > tbody > tr.warning:hover > th {
|
2217 |
+
background-color: #faf2cc;
|
2218 |
+
}
|
2219 |
+
.table > thead > tr > td.danger,
|
2220 |
+
.table > tbody > tr > td.danger,
|
2221 |
+
.table > tfoot > tr > td.danger,
|
2222 |
+
.table > thead > tr > th.danger,
|
2223 |
+
.table > tbody > tr > th.danger,
|
2224 |
+
.table > tfoot > tr > th.danger,
|
2225 |
+
.table > thead > tr.danger > td,
|
2226 |
+
.table > tbody > tr.danger > td,
|
2227 |
+
.table > tfoot > tr.danger > td,
|
2228 |
+
.table > thead > tr.danger > th,
|
2229 |
+
.table > tbody > tr.danger > th,
|
2230 |
+
.table > tfoot > tr.danger > th {
|
2231 |
+
background-color: #f2dede;
|
2232 |
+
}
|
2233 |
+
.table-hover > tbody > tr > td.danger:hover,
|
2234 |
+
.table-hover > tbody > tr > th.danger:hover,
|
2235 |
+
.table-hover > tbody > tr.danger:hover > td,
|
2236 |
+
.table-hover > tbody > tr:hover > .danger,
|
2237 |
+
.table-hover > tbody > tr.danger:hover > th {
|
2238 |
+
background-color: #ebcccc;
|
2239 |
+
}
|
2240 |
+
@media screen and (max-width: 767px) {
|
2241 |
+
.table-responsive {
|
2242 |
+
width: 100%;
|
2243 |
+
margin-bottom: 15px;
|
2244 |
+
overflow-y: hidden;
|
2245 |
+
overflow-x: auto;
|
2246 |
+
-ms-overflow-style: -ms-autohiding-scrollbar;
|
2247 |
+
border: 1px solid #dddddd;
|
2248 |
+
-webkit-overflow-scrolling: touch;
|
2249 |
+
}
|
2250 |
+
.table-responsive > .table {
|
2251 |
+
margin-bottom: 0;
|
2252 |
+
}
|
2253 |
+
.table-responsive > .table > thead > tr > th,
|
2254 |
+
.table-responsive > .table > tbody > tr > th,
|
2255 |
+
.table-responsive > .table > tfoot > tr > th,
|
2256 |
+
.table-responsive > .table > thead > tr > td,
|
2257 |
+
.table-responsive > .table > tbody > tr > td,
|
2258 |
+
.table-responsive > .table > tfoot > tr > td {
|
2259 |
+
white-space: nowrap;
|
2260 |
+
}
|
2261 |
+
.table-responsive > .table-bordered {
|
2262 |
+
border: 0;
|
2263 |
+
}
|
2264 |
+
.table-responsive > .table-bordered > thead > tr > th:first-child,
|
2265 |
+
.table-responsive > .table-bordered > tbody > tr > th:first-child,
|
2266 |
+
.table-responsive > .table-bordered > tfoot > tr > th:first-child,
|
2267 |
+
.table-responsive > .table-bordered > thead > tr > td:first-child,
|
2268 |
+
.table-responsive > .table-bordered > tbody > tr > td:first-child,
|
2269 |
+
.table-responsive > .table-bordered > tfoot > tr > td:first-child {
|
2270 |
+
border-left: 0;
|
2271 |
+
}
|
2272 |
+
.table-responsive > .table-bordered > thead > tr > th:last-child,
|
2273 |
+
.table-responsive > .table-bordered > tbody > tr > th:last-child,
|
2274 |
+
.table-responsive > .table-bordered > tfoot > tr > th:last-child,
|
2275 |
+
.table-responsive > .table-bordered > thead > tr > td:last-child,
|
2276 |
+
.table-responsive > .table-bordered > tbody > tr > td:last-child,
|
2277 |
+
.table-responsive > .table-bordered > tfoot > tr > td:last-child {
|
2278 |
+
border-right: 0;
|
2279 |
+
}
|
2280 |
+
.table-responsive > .table-bordered > tbody > tr:last-child > th,
|
2281 |
+
.table-responsive > .table-bordered > tfoot > tr:last-child > th,
|
2282 |
+
.table-responsive > .table-bordered > tbody > tr:last-child > td,
|
2283 |
+
.table-responsive > .table-bordered > tfoot > tr:last-child > td {
|
2284 |
+
border-bottom: 0;
|
2285 |
+
}
|
2286 |
+
}
|
2287 |
+
fieldset {
|
2288 |
+
padding: 0;
|
2289 |
+
margin: 0;
|
2290 |
+
border: 0;
|
2291 |
+
min-width: 0;
|
2292 |
+
}
|
2293 |
+
legend {
|
2294 |
+
display: block;
|
2295 |
+
width: 100%;
|
2296 |
+
padding: 0;
|
2297 |
+
margin-bottom: 20px;
|
2298 |
+
font-size: 21px;
|
2299 |
+
line-height: inherit;
|
2300 |
+
color: #333333;
|
2301 |
+
border: 0;
|
2302 |
+
border-bottom: 1px solid #e5e5e5;
|
2303 |
+
}
|
2304 |
+
label {
|
2305 |
+
display: inline-block;
|
2306 |
+
max-width: 100%;
|
2307 |
+
margin-bottom: 5px;
|
2308 |
+
font-weight: bold;
|
2309 |
+
}
|
2310 |
+
input[type="search"] {
|
2311 |
+
-webkit-box-sizing: border-box;
|
2312 |
+
-moz-box-sizing: border-box;
|
2313 |
+
box-sizing: border-box;
|
2314 |
+
}
|
2315 |
+
input[type="radio"],
|
2316 |
+
input[type="checkbox"] {
|
2317 |
+
margin: 4px 0 0;
|
2318 |
+
margin-top: 1px \9;
|
2319 |
+
line-height: normal;
|
2320 |
+
}
|
2321 |
+
input[type="file"] {
|
2322 |
+
display: block;
|
2323 |
+
}
|
2324 |
+
input[type="range"] {
|
2325 |
+
display: block;
|
2326 |
+
width: 100%;
|
2327 |
+
}
|
2328 |
+
select[multiple],
|
2329 |
+
select[size] {
|
2330 |
+
height: auto;
|
2331 |
+
}
|
2332 |
+
input[type="file"]:focus,
|
2333 |
+
input[type="radio"]:focus,
|
2334 |
+
input[type="checkbox"]:focus {
|
2335 |
+
outline: 5px auto -webkit-focus-ring-color;
|
2336 |
+
outline-offset: -2px;
|
2337 |
+
}
|
2338 |
+
output {
|
2339 |
+
display: block;
|
2340 |
+
padding-top: 7px;
|
2341 |
+
font-size: 14px;
|
2342 |
+
line-height: 1.42857143;
|
2343 |
+
color: #555555;
|
2344 |
+
}
|
2345 |
+
.form-control {
|
2346 |
+
display: block;
|
2347 |
+
width: 100%;
|
2348 |
+
height: 34px;
|
2349 |
+
padding: 6px 12px;
|
2350 |
+
font-size: 14px;
|
2351 |
+
line-height: 1.42857143;
|
2352 |
+
color: #555555;
|
2353 |
+
background-color: #ffffff;
|
2354 |
+
background-image: none;
|
2355 |
+
border: 1px solid #cccccc;
|
2356 |
+
border-radius: 4px;
|
2357 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2358 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2359 |
+
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
2360 |
+
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
2361 |
+
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
2362 |
+
}
|
2363 |
+
.form-control:focus {
|
2364 |
+
border-color: #66afe9;
|
2365 |
+
outline: 0;
|
2366 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
|
2367 |
+
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
|
2368 |
+
}
|
2369 |
+
.form-control::-moz-placeholder {
|
2370 |
+
color: #777777;
|
2371 |
+
opacity: 1;
|
2372 |
+
}
|
2373 |
+
.form-control:-ms-input-placeholder {
|
2374 |
+
color: #777777;
|
2375 |
+
}
|
2376 |
+
.form-control::-webkit-input-placeholder {
|
2377 |
+
color: #777777;
|
2378 |
+
}
|
2379 |
+
.form-control[disabled],
|
2380 |
+
.form-control[readonly],
|
2381 |
+
fieldset[disabled] .form-control {
|
2382 |
+
cursor: not-allowed;
|
2383 |
+
background-color: #eeeeee;
|
2384 |
+
opacity: 1;
|
2385 |
+
}
|
2386 |
+
textarea.form-control {
|
2387 |
+
height: auto;
|
2388 |
+
}
|
2389 |
+
input[type="search"] {
|
2390 |
+
-webkit-appearance: none;
|
2391 |
+
}
|
2392 |
+
input[type="date"],
|
2393 |
+
input[type="time"],
|
2394 |
+
input[type="datetime-local"],
|
2395 |
+
input[type="month"] {
|
2396 |
+
line-height: 1.42857143 \0;
|
2397 |
+
}
|
2398 |
+
input[type="date"].input-sm,
|
2399 |
+
input[type="time"].input-sm,
|
2400 |
+
input[type="datetime-local"].input-sm,
|
2401 |
+
input[type="month"].input-sm {
|
2402 |
+
line-height: 30px;
|
2403 |
+
}
|
2404 |
+
input[type="date"].input-lg,
|
2405 |
+
input[type="time"].input-lg,
|
2406 |
+
input[type="datetime-local"].input-lg,
|
2407 |
+
input[type="month"].input-lg {
|
2408 |
+
line-height: 46px;
|
2409 |
+
}
|
2410 |
+
.form-group {
|
2411 |
+
margin-bottom: 15px;
|
2412 |
+
}
|
2413 |
+
.radio,
|
2414 |
+
.checkbox {
|
2415 |
+
position: relative;
|
2416 |
+
display: block;
|
2417 |
+
min-height: 20px;
|
2418 |
+
margin-top: 10px;
|
2419 |
+
margin-bottom: 10px;
|
2420 |
+
}
|
2421 |
+
.radio label,
|
2422 |
+
.checkbox label {
|
2423 |
+
padding-left: 20px;
|
2424 |
+
margin-bottom: 0;
|
2425 |
+
font-weight: normal;
|
2426 |
+
cursor: pointer;
|
2427 |
+
}
|
2428 |
+
.radio input[type="radio"],
|
2429 |
+
.radio-inline input[type="radio"],
|
2430 |
+
.checkbox input[type="checkbox"],
|
2431 |
+
.checkbox-inline input[type="checkbox"] {
|
2432 |
+
position: absolute;
|
2433 |
+
margin-left: -20px;
|
2434 |
+
margin-top: 4px \9;
|
2435 |
+
}
|
2436 |
+
.radio + .radio,
|
2437 |
+
.checkbox + .checkbox {
|
2438 |
+
margin-top: -5px;
|
2439 |
+
}
|
2440 |
+
.radio-inline,
|
2441 |
+
.checkbox-inline {
|
2442 |
+
display: inline-block;
|
2443 |
+
padding-left: 20px;
|
2444 |
+
margin-bottom: 0;
|
2445 |
+
vertical-align: middle;
|
2446 |
+
font-weight: normal;
|
2447 |
+
cursor: pointer;
|
2448 |
+
}
|
2449 |
+
.radio-inline + .radio-inline,
|
2450 |
+
.checkbox-inline + .checkbox-inline {
|
2451 |
+
margin-top: 0;
|
2452 |
+
margin-left: 10px;
|
2453 |
+
}
|
2454 |
+
input[type="radio"][disabled],
|
2455 |
+
input[type="checkbox"][disabled],
|
2456 |
+
input[type="radio"].disabled,
|
2457 |
+
input[type="checkbox"].disabled,
|
2458 |
+
fieldset[disabled] input[type="radio"],
|
2459 |
+
fieldset[disabled] input[type="checkbox"] {
|
2460 |
+
cursor: not-allowed;
|
2461 |
+
}
|
2462 |
+
.radio-inline.disabled,
|
2463 |
+
.checkbox-inline.disabled,
|
2464 |
+
fieldset[disabled] .radio-inline,
|
2465 |
+
fieldset[disabled] .checkbox-inline {
|
2466 |
+
cursor: not-allowed;
|
2467 |
+
}
|
2468 |
+
.radio.disabled label,
|
2469 |
+
.checkbox.disabled label,
|
2470 |
+
fieldset[disabled] .radio label,
|
2471 |
+
fieldset[disabled] .checkbox label {
|
2472 |
+
cursor: not-allowed;
|
2473 |
+
}
|
2474 |
+
.form-control-static {
|
2475 |
+
padding-top: 7px;
|
2476 |
+
padding-bottom: 7px;
|
2477 |
+
margin-bottom: 0;
|
2478 |
+
}
|
2479 |
+
.form-control-static.input-lg,
|
2480 |
+
.form-control-static.input-sm {
|
2481 |
+
padding-left: 0;
|
2482 |
+
padding-right: 0;
|
2483 |
+
}
|
2484 |
+
.input-sm,
|
2485 |
+
.form-horizontal .form-group-sm .form-control {
|
2486 |
+
height: 30px;
|
2487 |
+
padding: 5px 10px;
|
2488 |
+
font-size: 12px;
|
2489 |
+
line-height: 1.5;
|
2490 |
+
border-radius: 3px;
|
2491 |
+
}
|
2492 |
+
select.input-sm {
|
2493 |
+
height: 30px;
|
2494 |
+
line-height: 30px;
|
2495 |
+
}
|
2496 |
+
textarea.input-sm,
|
2497 |
+
select[multiple].input-sm {
|
2498 |
+
height: auto;
|
2499 |
+
}
|
2500 |
+
.input-lg,
|
2501 |
+
.form-horizontal .form-group-lg .form-control {
|
2502 |
+
height: 46px;
|
2503 |
+
padding: 10px 16px;
|
2504 |
+
font-size: 18px;
|
2505 |
+
line-height: 1.33;
|
2506 |
+
border-radius: 6px;
|
2507 |
+
}
|
2508 |
+
select.input-lg {
|
2509 |
+
height: 46px;
|
2510 |
+
line-height: 46px;
|
2511 |
+
}
|
2512 |
+
textarea.input-lg,
|
2513 |
+
select[multiple].input-lg {
|
2514 |
+
height: auto;
|
2515 |
+
}
|
2516 |
+
.has-feedback {
|
2517 |
+
position: relative;
|
2518 |
+
}
|
2519 |
+
.has-feedback .form-control {
|
2520 |
+
padding-right: 42.5px;
|
2521 |
+
}
|
2522 |
+
.form-control-feedback {
|
2523 |
+
position: absolute;
|
2524 |
+
top: 25px;
|
2525 |
+
right: 0;
|
2526 |
+
z-index: 2;
|
2527 |
+
display: block;
|
2528 |
+
width: 34px;
|
2529 |
+
height: 34px;
|
2530 |
+
line-height: 34px;
|
2531 |
+
text-align: center;
|
2532 |
+
}
|
2533 |
+
.input-lg + .form-control-feedback {
|
2534 |
+
width: 46px;
|
2535 |
+
height: 46px;
|
2536 |
+
line-height: 46px;
|
2537 |
+
}
|
2538 |
+
.input-sm + .form-control-feedback {
|
2539 |
+
width: 30px;
|
2540 |
+
height: 30px;
|
2541 |
+
line-height: 30px;
|
2542 |
+
}
|
2543 |
+
.has-success .help-block,
|
2544 |
+
.has-success .control-label,
|
2545 |
+
.has-success .radio,
|
2546 |
+
.has-success .checkbox,
|
2547 |
+
.has-success .radio-inline,
|
2548 |
+
.has-success .checkbox-inline {
|
2549 |
+
color: #3c763d;
|
2550 |
+
}
|
2551 |
+
.has-success .form-control {
|
2552 |
+
border-color: #3c763d;
|
2553 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2554 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2555 |
+
}
|
2556 |
+
.has-success .form-control:focus {
|
2557 |
+
border-color: #2b542c;
|
2558 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
|
2559 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
|
2560 |
+
}
|
2561 |
+
.has-success .input-group-addon {
|
2562 |
+
color: #3c763d;
|
2563 |
+
border-color: #3c763d;
|
2564 |
+
background-color: #dff0d8;
|
2565 |
+
}
|
2566 |
+
.has-success .form-control-feedback {
|
2567 |
+
color: #3c763d;
|
2568 |
+
}
|
2569 |
+
.has-warning .help-block,
|
2570 |
+
.has-warning .control-label,
|
2571 |
+
.has-warning .radio,
|
2572 |
+
.has-warning .checkbox,
|
2573 |
+
.has-warning .radio-inline,
|
2574 |
+
.has-warning .checkbox-inline {
|
2575 |
+
color: #8a6d3b;
|
2576 |
+
}
|
2577 |
+
.has-warning .form-control {
|
2578 |
+
border-color: #8a6d3b;
|
2579 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2580 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2581 |
+
}
|
2582 |
+
.has-warning .form-control:focus {
|
2583 |
+
border-color: #66512c;
|
2584 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
|
2585 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
|
2586 |
+
}
|
2587 |
+
.has-warning .input-group-addon {
|
2588 |
+
color: #8a6d3b;
|
2589 |
+
border-color: #8a6d3b;
|
2590 |
+
background-color: #fcf8e3;
|
2591 |
+
}
|
2592 |
+
.has-warning .form-control-feedback {
|
2593 |
+
color: #8a6d3b;
|
2594 |
+
}
|
2595 |
+
.has-error .help-block,
|
2596 |
+
.has-error .control-label,
|
2597 |
+
.has-error .radio,
|
2598 |
+
.has-error .checkbox,
|
2599 |
+
.has-error .radio-inline,
|
2600 |
+
.has-error .checkbox-inline {
|
2601 |
+
color: #a94442;
|
2602 |
+
}
|
2603 |
+
.has-error .form-control {
|
2604 |
+
border-color: #a94442;
|
2605 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2606 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
2607 |
+
}
|
2608 |
+
.has-error .form-control:focus {
|
2609 |
+
border-color: #843534;
|
2610 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
|
2611 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
|
2612 |
+
}
|
2613 |
+
.has-error .input-group-addon {
|
2614 |
+
color: #a94442;
|
2615 |
+
border-color: #a94442;
|
2616 |
+
background-color: #f2dede;
|
2617 |
+
}
|
2618 |
+
.has-error .form-control-feedback {
|
2619 |
+
color: #a94442;
|
2620 |
+
}
|
2621 |
+
.has-feedback label.sr-only ~ .form-control-feedback {
|
2622 |
+
top: 0;
|
2623 |
+
}
|
2624 |
+
.help-block {
|
2625 |
+
display: block;
|
2626 |
+
margin-top: 5px;
|
2627 |
+
margin-bottom: 10px;
|
2628 |
+
color: #737373;
|
2629 |
+
}
|
2630 |
+
@media (min-width: 768px) {
|
2631 |
+
.form-inline .form-group {
|
2632 |
+
display: inline-block;
|
2633 |
+
margin-bottom: 0;
|
2634 |
+
vertical-align: middle;
|
2635 |
+
}
|
2636 |
+
.form-inline .form-control {
|
2637 |
+
display: inline-block;
|
2638 |
+
width: auto;
|
2639 |
+
vertical-align: middle;
|
2640 |
+
}
|
2641 |
+
.form-inline .input-group {
|
2642 |
+
display: inline-table;
|
2643 |
+
vertical-align: middle;
|
2644 |
+
}
|
2645 |
+
.form-inline .input-group .input-group-addon,
|
2646 |
+
.form-inline .input-group .input-group-btn,
|
2647 |
+
.form-inline .input-group .form-control {
|
2648 |
+
width: auto;
|
2649 |
+
}
|
2650 |
+
.form-inline .input-group > .form-control {
|
2651 |
+
width: 100%;
|
2652 |
+
}
|
2653 |
+
.form-inline .control-label {
|
2654 |
+
margin-bottom: 0;
|
2655 |
+
vertical-align: middle;
|
2656 |
+
}
|
2657 |
+
.form-inline .radio,
|
2658 |
+
.form-inline .checkbox {
|
2659 |
+
display: inline-block;
|
2660 |
+
margin-top: 0;
|
2661 |
+
margin-bottom: 0;
|
2662 |
+
vertical-align: middle;
|
2663 |
+
}
|
2664 |
+
.form-inline .radio label,
|
2665 |
+
.form-inline .checkbox label {
|
2666 |
+
padding-left: 0;
|
2667 |
+
}
|
2668 |
+
.form-inline .radio input[type="radio"],
|
2669 |
+
.form-inline .checkbox input[type="checkbox"] {
|
2670 |
+
position: relative;
|
2671 |
+
margin-left: 0;
|
2672 |
+
}
|
2673 |
+
.form-inline .has-feedback .form-control-feedback {
|
2674 |
+
top: 0;
|
2675 |
+
}
|
2676 |
+
}
|
2677 |
+
.form-horizontal .radio,
|
2678 |
+
.form-horizontal .checkbox,
|
2679 |
+
.form-horizontal .radio-inline,
|
2680 |
+
.form-horizontal .checkbox-inline {
|
2681 |
+
margin-top: 0;
|
2682 |
+
margin-bottom: 0;
|
2683 |
+
padding-top: 7px;
|
2684 |
+
}
|
2685 |
+
.form-horizontal .radio,
|
2686 |
+
.form-horizontal .checkbox {
|
2687 |
+
min-height: 27px;
|
2688 |
+
}
|
2689 |
+
.form-horizontal .form-group {
|
2690 |
+
margin-left: -15px;
|
2691 |
+
margin-right: -15px;
|
2692 |
+
}
|
2693 |
+
@media (min-width: 768px) {
|
2694 |
+
.form-horizontal .control-label {
|
2695 |
+
text-align: right;
|
2696 |
+
margin-bottom: 0;
|
2697 |
+
padding-top: 7px;
|
2698 |
+
}
|
2699 |
+
}
|
2700 |
+
.form-horizontal .has-feedback .form-control-feedback {
|
2701 |
+
top: 0;
|
2702 |
+
right: 15px;
|
2703 |
+
}
|
2704 |
+
@media (min-width: 768px) {
|
2705 |
+
.form-horizontal .form-group-lg .control-label {
|
2706 |
+
padding-top: 14.3px;
|
2707 |
+
}
|
2708 |
+
}
|
2709 |
+
@media (min-width: 768px) {
|
2710 |
+
.form-horizontal .form-group-sm .control-label {
|
2711 |
+
padding-top: 6px;
|
2712 |
+
}
|
2713 |
+
}
|
2714 |
+
.btn {
|
2715 |
+
display: inline-block;
|
2716 |
+
margin-bottom: 0;
|
2717 |
+
font-weight: normal;
|
2718 |
+
text-align: center;
|
2719 |
+
vertical-align: middle;
|
2720 |
+
cursor: pointer;
|
2721 |
+
background-image: none;
|
2722 |
+
border: 1px solid transparent;
|
2723 |
+
white-space: nowrap;
|
2724 |
+
padding: 6px 12px;
|
2725 |
+
font-size: 14px;
|
2726 |
+
line-height: 1.42857143;
|
2727 |
+
border-radius: 4px;
|
2728 |
+
-webkit-user-select: none;
|
2729 |
+
-moz-user-select: none;
|
2730 |
+
-ms-user-select: none;
|
2731 |
+
user-select: none;
|
2732 |
+
}
|
2733 |
+
.btn:focus,
|
2734 |
+
.btn:active:focus,
|
2735 |
+
.btn.active:focus {
|
2736 |
+
outline: 5px auto -webkit-focus-ring-color;
|
2737 |
+
outline-offset: -2px;
|
2738 |
+
}
|
2739 |
+
.btn:hover,
|
2740 |
+
.btn:focus {
|
2741 |
+
color: #333333;
|
2742 |
+
text-decoration: none;
|
2743 |
+
}
|
2744 |
+
.btn:active,
|
2745 |
+
.btn.active {
|
2746 |
+
outline: 0;
|
2747 |
+
background-image: none;
|
2748 |
+
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
|
2749 |
+
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
|
2750 |
+
}
|
2751 |
+
.btn.disabled,
|
2752 |
+
.btn[disabled],
|
2753 |
+
fieldset[disabled] .btn {
|
2754 |
+
cursor: not-allowed;
|
2755 |
+
pointer-events: none;
|
2756 |
+
opacity: 0.65;
|
2757 |
+
filter: alpha(opacity=65);
|
2758 |
+
-webkit-box-shadow: none;
|
2759 |
+
box-shadow: none;
|
2760 |
+
}
|
2761 |
+
.btn-default {
|
2762 |
+
color: #333333;
|
2763 |
+
background-color: #ffffff;
|
2764 |
+
border-color: #cccccc;
|
2765 |
+
}
|
2766 |
+
.btn-default:hover,
|
2767 |
+
.btn-default:focus,
|
2768 |
+
.btn-default:active,
|
2769 |
+
.btn-default.active,
|
2770 |
+
.open > .dropdown-toggle.btn-default {
|
2771 |
+
color: #333333;
|
2772 |
+
background-color: #e6e6e6;
|
2773 |
+
border-color: #adadad;
|
2774 |
+
}
|
2775 |
+
.btn-default:active,
|
2776 |
+
.btn-default.active,
|
2777 |
+
.open > .dropdown-toggle.btn-default {
|
2778 |
+
background-image: none;
|
2779 |
+
}
|
2780 |
+
.btn-default.disabled,
|
2781 |
+
.btn-default[disabled],
|
2782 |
+
fieldset[disabled] .btn-default,
|
2783 |
+
.btn-default.disabled:hover,
|
2784 |
+
.btn-default[disabled]:hover,
|
2785 |
+
fieldset[disabled] .btn-default:hover,
|
2786 |
+
.btn-default.disabled:focus,
|
2787 |
+
.btn-default[disabled]:focus,
|
2788 |
+
fieldset[disabled] .btn-default:focus,
|
2789 |
+
.btn-default.disabled:active,
|
2790 |
+
.btn-default[disabled]:active,
|
2791 |
+
fieldset[disabled] .btn-default:active,
|
2792 |
+
.btn-default.disabled.active,
|
2793 |
+
.btn-default[disabled].active,
|
2794 |
+
fieldset[disabled] .btn-default.active {
|
2795 |
+
background-color: #ffffff;
|
2796 |
+
border-color: #cccccc;
|
2797 |
+
}
|
2798 |
+
.btn-default .badge {
|
2799 |
+
color: #ffffff;
|
2800 |
+
background-color: #333333;
|
2801 |
+
}
|
2802 |
+
.btn-primary {
|
2803 |
+
color: #ffffff;
|
2804 |
+
background-color: #428bca;
|
2805 |
+
border-color: #357ebd;
|
2806 |
+
}
|
2807 |
+
.btn-primary:hover,
|
2808 |
+
.btn-primary:focus,
|
2809 |
+
.btn-primary:active,
|
2810 |
+
.btn-primary.active,
|
2811 |
+
.open > .dropdown-toggle.btn-primary {
|
2812 |
+
color: #ffffff;
|
2813 |
+
background-color: #3071a9;
|
2814 |
+
border-color: #285e8e;
|
2815 |
+
}
|
2816 |
+
.btn-primary:active,
|
2817 |
+
.btn-primary.active,
|
2818 |
+
.open > .dropdown-toggle.btn-primary {
|
2819 |
+
background-image: none;
|
2820 |
+
}
|
2821 |
+
.btn-primary.disabled,
|
2822 |
+
.btn-primary[disabled],
|
2823 |
+
fieldset[disabled] .btn-primary,
|
2824 |
+
.btn-primary.disabled:hover,
|
2825 |
+
.btn-primary[disabled]:hover,
|
2826 |
+
fieldset[disabled] .btn-primary:hover,
|
2827 |
+
.btn-primary.disabled:focus,
|
2828 |
+
.btn-primary[disabled]:focus,
|
2829 |
+
fieldset[disabled] .btn-primary:focus,
|
2830 |
+
.btn-primary.disabled:active,
|
2831 |
+
.btn-primary[disabled]:active,
|
2832 |
+
fieldset[disabled] .btn-primary:active,
|
2833 |
+
.btn-primary.disabled.active,
|
2834 |
+
.btn-primary[disabled].active,
|
2835 |
+
fieldset[disabled] .btn-primary.active {
|
2836 |
+
background-color: #428bca;
|
2837 |
+
border-color: #357ebd;
|
2838 |
+
}
|
2839 |
+
.btn-primary .badge {
|
2840 |
+
color: #428bca;
|
2841 |
+
background-color: #ffffff;
|
2842 |
+
}
|
2843 |
+
.btn-success {
|
2844 |
+
color: #ffffff;
|
2845 |
+
background-color: #5cb85c;
|
2846 |
+
border-color: #4cae4c;
|
2847 |
+
}
|
2848 |
+
.btn-success:hover,
|
2849 |
+
.btn-success:focus,
|
2850 |
+
.btn-success:active,
|
2851 |
+
.btn-success.active,
|
2852 |
+
.open > .dropdown-toggle.btn-success {
|
2853 |
+
color: #ffffff;
|
2854 |
+
background-color: #449d44;
|
2855 |
+
border-color: #398439;
|
2856 |
+
}
|
2857 |
+
.btn-success:active,
|
2858 |
+
.btn-success.active,
|
2859 |
+
.open > .dropdown-toggle.btn-success {
|
2860 |
+
background-image: none;
|
2861 |
+
}
|
2862 |
+
.btn-success.disabled,
|
2863 |
+
.btn-success[disabled],
|
2864 |
+
fieldset[disabled] .btn-success,
|
2865 |
+
.btn-success.disabled:hover,
|
2866 |
+
.btn-success[disabled]:hover,
|
2867 |
+
fieldset[disabled] .btn-success:hover,
|
2868 |
+
.btn-success.disabled:focus,
|
2869 |
+
.btn-success[disabled]:focus,
|
2870 |
+
fieldset[disabled] .btn-success:focus,
|
2871 |
+
.btn-success.disabled:active,
|
2872 |
+
.btn-success[disabled]:active,
|
2873 |
+
fieldset[disabled] .btn-success:active,
|
2874 |
+
.btn-success.disabled.active,
|
2875 |
+
.btn-success[disabled].active,
|
2876 |
+
fieldset[disabled] .btn-success.active {
|
2877 |
+
background-color: #5cb85c;
|
2878 |
+
border-color: #4cae4c;
|
2879 |
+
}
|
2880 |
+
.btn-success .badge {
|
2881 |
+
color: #5cb85c;
|
2882 |
+
background-color: #ffffff;
|
2883 |
+
}
|
2884 |
+
.btn-info {
|
2885 |
+
color: #ffffff;
|
2886 |
+
background-color: #5bc0de;
|
2887 |
+
border-color: #46b8da;
|
2888 |
+
}
|
2889 |
+
.btn-info:hover,
|
2890 |
+
.btn-info:focus,
|
2891 |
+
.btn-info:active,
|
2892 |
+
.btn-info.active,
|
2893 |
+
.open > .dropdown-toggle.btn-info {
|
2894 |
+
color: #ffffff;
|
2895 |
+
background-color: #31b0d5;
|
2896 |
+
border-color: #269abc;
|
2897 |
+
}
|
2898 |
+
.btn-info:active,
|
2899 |
+
.btn-info.active,
|
2900 |
+
.open > .dropdown-toggle.btn-info {
|
2901 |
+
background-image: none;
|
2902 |
+
}
|
2903 |
+
.btn-info.disabled,
|
2904 |
+
.btn-info[disabled],
|
2905 |
+
fieldset[disabled] .btn-info,
|
2906 |
+
.btn-info.disabled:hover,
|
2907 |
+
.btn-info[disabled]:hover,
|
2908 |
+
fieldset[disabled] .btn-info:hover,
|
2909 |
+
.btn-info.disabled:focus,
|
2910 |
+
.btn-info[disabled]:focus,
|
2911 |
+
fieldset[disabled] .btn-info:focus,
|
2912 |
+
.btn-info.disabled:active,
|
2913 |
+
.btn-info[disabled]:active,
|
2914 |
+
fieldset[disabled] .btn-info:active,
|
2915 |
+
.btn-info.disabled.active,
|
2916 |
+
.btn-info[disabled].active,
|
2917 |
+
fieldset[disabled] .btn-info.active {
|
2918 |
+
background-color: #5bc0de;
|
2919 |
+
border-color: #46b8da;
|
2920 |
+
}
|
2921 |
+
.btn-info .badge {
|
2922 |
+
color: #5bc0de;
|
2923 |
+
background-color: #ffffff;
|
2924 |
+
}
|
2925 |
+
.btn-warning {
|
2926 |
+
color: #ffffff;
|
2927 |
+
background-color: #f0ad4e;
|
2928 |
+
border-color: #eea236;
|
2929 |
+
}
|
2930 |
+
.btn-warning:hover,
|
2931 |
+
.btn-warning:focus,
|
2932 |
+
.btn-warning:active,
|
2933 |
+
.btn-warning.active,
|
2934 |
+
.open > .dropdown-toggle.btn-warning {
|
2935 |
+
color: #ffffff;
|
2936 |
+
background-color: #ec971f;
|
2937 |
+
border-color: #d58512;
|
2938 |
+
}
|
2939 |
+
.btn-warning:active,
|
2940 |
+
.btn-warning.active,
|
2941 |
+
.open > .dropdown-toggle.btn-warning {
|
2942 |
+
background-image: none;
|
2943 |
+
}
|
2944 |
+
.btn-warning.disabled,
|
2945 |
+
.btn-warning[disabled],
|
2946 |
+
fieldset[disabled] .btn-warning,
|
2947 |
+
.btn-warning.disabled:hover,
|
2948 |
+
.btn-warning[disabled]:hover,
|
2949 |
+
fieldset[disabled] .btn-warning:hover,
|
2950 |
+
.btn-warning.disabled:focus,
|
2951 |
+
.btn-warning[disabled]:focus,
|
2952 |
+
fieldset[disabled] .btn-warning:focus,
|
2953 |
+
.btn-warning.disabled:active,
|
2954 |
+
.btn-warning[disabled]:active,
|
2955 |
+
fieldset[disabled] .btn-warning:active,
|
2956 |
+
.btn-warning.disabled.active,
|
2957 |
+
.btn-warning[disabled].active,
|
2958 |
+
fieldset[disabled] .btn-warning.active {
|
2959 |
+
background-color: #f0ad4e;
|
2960 |
+
border-color: #eea236;
|
2961 |
+
}
|
2962 |
+
.btn-warning .badge {
|
2963 |
+
color: #f0ad4e;
|
2964 |
+
background-color: #ffffff;
|
2965 |
+
}
|
2966 |
+
.btn-danger {
|
2967 |
+
color: #ffffff;
|
2968 |
+
background-color: #d9534f;
|
2969 |
+
border-color: #d43f3a;
|
2970 |
+
}
|
2971 |
+
.btn-danger:hover,
|
2972 |
+
.btn-danger:focus,
|
2973 |
+
.btn-danger:active,
|
2974 |
+
.btn-danger.active,
|
2975 |
+
.open > .dropdown-toggle.btn-danger {
|
2976 |
+
color: #ffffff;
|
2977 |
+
background-color: #c9302c;
|
2978 |
+
border-color: #ac2925;
|
2979 |
+
}
|
2980 |
+
.btn-danger:active,
|
2981 |
+
.btn-danger.active,
|
2982 |
+
.open > .dropdown-toggle.btn-danger {
|
2983 |
+
background-image: none;
|
2984 |
+
}
|
2985 |
+
.btn-danger.disabled,
|
2986 |
+
.btn-danger[disabled],
|
2987 |
+
fieldset[disabled] .btn-danger,
|
2988 |
+
.btn-danger.disabled:hover,
|
2989 |
+
.btn-danger[disabled]:hover,
|
2990 |
+
fieldset[disabled] .btn-danger:hover,
|
2991 |
+
.btn-danger.disabled:focus,
|
2992 |
+
.btn-danger[disabled]:focus,
|
2993 |
+
fieldset[disabled] .btn-danger:focus,
|
2994 |
+
.btn-danger.disabled:active,
|
2995 |
+
.btn-danger[disabled]:active,
|
2996 |
+
fieldset[disabled] .btn-danger:active,
|
2997 |
+
.btn-danger.disabled.active,
|
2998 |
+
.btn-danger[disabled].active,
|
2999 |
+
fieldset[disabled] .btn-danger.active {
|
3000 |
+
background-color: #d9534f;
|
3001 |
+
border-color: #d43f3a;
|
3002 |
+
}
|
3003 |
+
.btn-danger .badge {
|
3004 |
+
color: #d9534f;
|
3005 |
+
background-color: #ffffff;
|
3006 |
+
}
|
3007 |
+
.btn-link {
|
3008 |
+
color: #428bca;
|
3009 |
+
font-weight: normal;
|
3010 |
+
cursor: pointer;
|
3011 |
+
border-radius: 0;
|
3012 |
+
}
|
3013 |
+
.btn-link,
|
3014 |
+
.btn-link:active,
|
3015 |
+
.btn-link[disabled],
|
3016 |
+
fieldset[disabled] .btn-link {
|
3017 |
+
background-color: transparent;
|
3018 |
+
-webkit-box-shadow: none;
|
3019 |
+
box-shadow: none;
|
3020 |
+
}
|
3021 |
+
.btn-link,
|
3022 |
+
.btn-link:hover,
|
3023 |
+
.btn-link:focus,
|
3024 |
+
.btn-link:active {
|
3025 |
+
border-color: transparent;
|
3026 |
+
}
|
3027 |
+
.btn-link:hover,
|
3028 |
+
.btn-link:focus {
|
3029 |
+
color: #2a6496;
|
3030 |
+
text-decoration: underline;
|
3031 |
+
background-color: transparent;
|
3032 |
+
}
|
3033 |
+
.btn-link[disabled]:hover,
|
3034 |
+
fieldset[disabled] .btn-link:hover,
|
3035 |
+
.btn-link[disabled]:focus,
|
3036 |
+
fieldset[disabled] .btn-link:focus {
|
3037 |
+
color: #777777;
|
3038 |
+
text-decoration: none;
|
3039 |
+
}
|
3040 |
+
.btn-lg,
|
3041 |
+
.btn-group-lg > .btn {
|
3042 |
+
padding: 10px 16px;
|
3043 |
+
font-size: 18px;
|
3044 |
+
line-height: 1.33;
|
3045 |
+
border-radius: 6px;
|
3046 |
+
}
|
3047 |
+
.btn-sm,
|
3048 |
+
.btn-group-sm > .btn {
|
3049 |
+
padding: 5px 10px;
|
3050 |
+
font-size: 12px;
|
3051 |
+
line-height: 1.5;
|
3052 |
+
border-radius: 3px;
|
3053 |
+
}
|
3054 |
+
.btn-xs,
|
3055 |
+
.btn-group-xs > .btn {
|
3056 |
+
padding: 1px 5px;
|
3057 |
+
font-size: 12px;
|
3058 |
+
line-height: 1.5;
|
3059 |
+
border-radius: 3px;
|
3060 |
+
}
|
3061 |
+
.btn-block {
|
3062 |
+
display: block;
|
3063 |
+
width: 100%;
|
3064 |
+
}
|
3065 |
+
.btn-block + .btn-block {
|
3066 |
+
margin-top: 5px;
|
3067 |
+
}
|
3068 |
+
input[type="submit"].btn-block,
|
3069 |
+
input[type="reset"].btn-block,
|
3070 |
+
input[type="button"].btn-block {
|
3071 |
+
width: 100%;
|
3072 |
+
}
|
3073 |
+
.fade {
|
3074 |
+
opacity: 0;
|
3075 |
+
-webkit-transition: opacity 0.15s linear;
|
3076 |
+
-o-transition: opacity 0.15s linear;
|
3077 |
+
transition: opacity 0.15s linear;
|
3078 |
+
}
|
3079 |
+
.fade.in {
|
3080 |
+
opacity: 1;
|
3081 |
+
}
|
3082 |
+
.collapse {
|
3083 |
+
display: none;
|
3084 |
+
}
|
3085 |
+
.collapse.in {
|
3086 |
+
display: block;
|
3087 |
+
}
|
3088 |
+
tr.collapse.in {
|
3089 |
+
display: table-row;
|
3090 |
+
}
|
3091 |
+
tbody.collapse.in {
|
3092 |
+
display: table-row-group;
|
3093 |
+
}
|
3094 |
+
.collapsing {
|
3095 |
+
position: relative;
|
3096 |
+
height: 0;
|
3097 |
+
overflow: hidden;
|
3098 |
+
-webkit-transition: height 0.35s ease;
|
3099 |
+
-o-transition: height 0.35s ease;
|
3100 |
+
transition: height 0.35s ease;
|
3101 |
+
}
|
3102 |
+
.caret {
|
3103 |
+
display: inline-block;
|
3104 |
+
width: 0;
|
3105 |
+
height: 0;
|
3106 |
+
margin-left: 2px;
|
3107 |
+
vertical-align: middle;
|
3108 |
+
border-top: 4px solid;
|
3109 |
+
border-right: 4px solid transparent;
|
3110 |
+
border-left: 4px solid transparent;
|
3111 |
+
}
|
3112 |
+
.dropdown {
|
3113 |
+
position: relative;
|
3114 |
+
}
|
3115 |
+
.dropdown-toggle:focus {
|
3116 |
+
outline: 0;
|
3117 |
+
}
|
3118 |
+
.dropdown-menu {
|
3119 |
+
position: absolute;
|
3120 |
+
top: 100%;
|
3121 |
+
left: 0;
|
3122 |
+
z-index: 1000;
|
3123 |
+
display: none;
|
3124 |
+
float: left;
|
3125 |
+
min-width: 160px;
|
3126 |
+
padding: 5px 0;
|
3127 |
+
margin: 2px 0 0;
|
3128 |
+
list-style: none;
|
3129 |
+
font-size: 14px;
|
3130 |
+
text-align: left;
|
3131 |
+
background-color: #ffffff;
|
3132 |
+
border: 1px solid #cccccc;
|
3133 |
+
border: 1px solid rgba(0, 0, 0, 0.15);
|
3134 |
+
border-radius: 4px;
|
3135 |
+
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
|
3136 |
+
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
|
3137 |
+
background-clip: padding-box;
|
3138 |
+
}
|
3139 |
+
.dropdown-menu.pull-right {
|
3140 |
+
right: 0;
|
3141 |
+
left: auto;
|
3142 |
+
}
|
3143 |
+
.dropdown-menu .divider {
|
3144 |
+
height: 1px;
|
3145 |
+
margin: 9px 0;
|
3146 |
+
overflow: hidden;
|
3147 |
+
background-color: #e5e5e5;
|
3148 |
+
}
|
3149 |
+
.dropdown-menu > li > a {
|
3150 |
+
display: block;
|
3151 |
+
padding: 3px 20px;
|
3152 |
+
clear: both;
|
3153 |
+
font-weight: normal;
|
3154 |
+
line-height: 1.42857143;
|
3155 |
+
color: #333333;
|
3156 |
+
white-space: nowrap;
|
3157 |
+
}
|
3158 |
+
.dropdown-menu > li > a:hover,
|
3159 |
+
.dropdown-menu > li > a:focus {
|
3160 |
+
text-decoration: none;
|
3161 |
+
color: #262626;
|
3162 |
+
background-color: #f5f5f5;
|
3163 |
+
}
|
3164 |
+
.dropdown-menu > .active > a,
|
3165 |
+
.dropdown-menu > .active > a:hover,
|
3166 |
+
.dropdown-menu > .active > a:focus {
|
3167 |
+
color: #ffffff;
|
3168 |
+
text-decoration: none;
|
3169 |
+
outline: 0;
|
3170 |
+
background-color: #428bca;
|
3171 |
+
}
|
3172 |
+
.dropdown-menu > .disabled > a,
|
3173 |
+
.dropdown-menu > .disabled > a:hover,
|
3174 |
+
.dropdown-menu > .disabled > a:focus {
|
3175 |
+
color: #777777;
|
3176 |
+
}
|
3177 |
+
.dropdown-menu > .disabled > a:hover,
|
3178 |
+
.dropdown-menu > .disabled > a:focus {
|
3179 |
+
text-decoration: none;
|
3180 |
+
background-color: transparent;
|
3181 |
+
background-image: none;
|
3182 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
3183 |
+
cursor: not-allowed;
|
3184 |
+
}
|
3185 |
+
.open > .dropdown-menu {
|
3186 |
+
display: block;
|
3187 |
+
}
|
3188 |
+
.open > a {
|
3189 |
+
outline: 0;
|
3190 |
+
}
|
3191 |
+
.dropdown-menu-right {
|
3192 |
+
left: auto;
|
3193 |
+
right: 0;
|
3194 |
+
}
|
3195 |
+
.dropdown-menu-left {
|
3196 |
+
left: 0;
|
3197 |
+
right: auto;
|
3198 |
+
}
|
3199 |
+
.dropdown-header {
|
3200 |
+
display: block;
|
3201 |
+
padding: 3px 20px;
|
3202 |
+
font-size: 12px;
|
3203 |
+
line-height: 1.42857143;
|
3204 |
+
color: #777777;
|
3205 |
+
white-space: nowrap;
|
3206 |
+
}
|
3207 |
+
.dropdown-backdrop {
|
3208 |
+
position: fixed;
|
3209 |
+
left: 0;
|
3210 |
+
right: 0;
|
3211 |
+
bottom: 0;
|
3212 |
+
top: 0;
|
3213 |
+
z-index: 990;
|
3214 |
+
}
|
3215 |
+
.pull-right > .dropdown-menu {
|
3216 |
+
right: 0;
|
3217 |
+
left: auto;
|
3218 |
+
}
|
3219 |
+
.dropup .caret,
|
3220 |
+
.navbar-fixed-bottom .dropdown .caret {
|
3221 |
+
border-top: 0;
|
3222 |
+
border-bottom: 4px solid;
|
3223 |
+
content: "";
|
3224 |
+
}
|
3225 |
+
.dropup .dropdown-menu,
|
3226 |
+
.navbar-fixed-bottom .dropdown .dropdown-menu {
|
3227 |
+
top: auto;
|
3228 |
+
bottom: 100%;
|
3229 |
+
margin-bottom: 1px;
|
3230 |
+
}
|
3231 |
+
@media (min-width: 768px) {
|
3232 |
+
.navbar-right .dropdown-menu {
|
3233 |
+
left: auto;
|
3234 |
+
right: 0;
|
3235 |
+
}
|
3236 |
+
.navbar-right .dropdown-menu-left {
|
3237 |
+
left: 0;
|
3238 |
+
right: auto;
|
3239 |
+
}
|
3240 |
+
}
|
3241 |
+
.btn-group,
|
3242 |
+
.btn-group-vertical {
|
3243 |
+
position: relative;
|
3244 |
+
display: inline-block;
|
3245 |
+
vertical-align: middle;
|
3246 |
+
}
|
3247 |
+
.btn-group > .btn,
|
3248 |
+
.btn-group-vertical > .btn {
|
3249 |
+
position: relative;
|
3250 |
+
float: left;
|
3251 |
+
}
|
3252 |
+
.btn-group > .btn:hover,
|
3253 |
+
.btn-group-vertical > .btn:hover,
|
3254 |
+
.btn-group > .btn:focus,
|
3255 |
+
.btn-group-vertical > .btn:focus,
|
3256 |
+
.btn-group > .btn:active,
|
3257 |
+
.btn-group-vertical > .btn:active,
|
3258 |
+
.btn-group > .btn.active,
|
3259 |
+
.btn-group-vertical > .btn.active {
|
3260 |
+
z-index: 2;
|
3261 |
+
}
|
3262 |
+
.btn-group > .btn:focus,
|
3263 |
+
.btn-group-vertical > .btn:focus {
|
3264 |
+
outline: 0;
|
3265 |
+
}
|
3266 |
+
.btn-group .btn + .btn,
|
3267 |
+
.btn-group .btn + .btn-group,
|
3268 |
+
.btn-group .btn-group + .btn,
|
3269 |
+
.btn-group .btn-group + .btn-group {
|
3270 |
+
margin-left: -1px;
|
3271 |
+
}
|
3272 |
+
.btn-toolbar {
|
3273 |
+
margin-left: -5px;
|
3274 |
+
}
|
3275 |
+
.btn-toolbar .btn-group,
|
3276 |
+
.btn-toolbar .input-group {
|
3277 |
+
float: left;
|
3278 |
+
}
|
3279 |
+
.btn-toolbar > .btn,
|
3280 |
+
.btn-toolbar > .btn-group,
|
3281 |
+
.btn-toolbar > .input-group {
|
3282 |
+
margin-left: 5px;
|
3283 |
+
}
|
3284 |
+
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
|
3285 |
+
border-radius: 0;
|
3286 |
+
}
|
3287 |
+
.btn-group > .btn:first-child {
|
3288 |
+
margin-left: 0;
|
3289 |
+
}
|
3290 |
+
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
|
3291 |
+
border-bottom-right-radius: 0;
|
3292 |
+
border-top-right-radius: 0;
|
3293 |
+
}
|
3294 |
+
.btn-group > .btn:last-child:not(:first-child),
|
3295 |
+
.btn-group > .dropdown-toggle:not(:first-child) {
|
3296 |
+
border-bottom-left-radius: 0;
|
3297 |
+
border-top-left-radius: 0;
|
3298 |
+
}
|
3299 |
+
.btn-group > .btn-group {
|
3300 |
+
float: left;
|
3301 |
+
}
|
3302 |
+
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
|
3303 |
+
border-radius: 0;
|
3304 |
+
}
|
3305 |
+
.btn-group > .btn-group:first-child > .btn:last-child,
|
3306 |
+
.btn-group > .btn-group:first-child > .dropdown-toggle {
|
3307 |
+
border-bottom-right-radius: 0;
|
3308 |
+
border-top-right-radius: 0;
|
3309 |
+
}
|
3310 |
+
.btn-group > .btn-group:last-child > .btn:first-child {
|
3311 |
+
border-bottom-left-radius: 0;
|
3312 |
+
border-top-left-radius: 0;
|
3313 |
+
}
|
3314 |
+
.btn-group .dropdown-toggle:active,
|
3315 |
+
.btn-group.open .dropdown-toggle {
|
3316 |
+
outline: 0;
|
3317 |
+
}
|
3318 |
+
.btn-group > .btn + .dropdown-toggle {
|
3319 |
+
padding-left: 8px;
|
3320 |
+
padding-right: 8px;
|
3321 |
+
}
|
3322 |
+
.btn-group > .btn-lg + .dropdown-toggle {
|
3323 |
+
padding-left: 12px;
|
3324 |
+
padding-right: 12px;
|
3325 |
+
}
|
3326 |
+
.btn-group.open .dropdown-toggle {
|
3327 |
+
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
|
3328 |
+
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
|
3329 |
+
}
|
3330 |
+
.btn-group.open .dropdown-toggle.btn-link {
|
3331 |
+
-webkit-box-shadow: none;
|
3332 |
+
box-shadow: none;
|
3333 |
+
}
|
3334 |
+
.btn .caret {
|
3335 |
+
margin-left: 0;
|
3336 |
+
}
|
3337 |
+
.btn-lg .caret {
|
3338 |
+
border-width: 5px 5px 0;
|
3339 |
+
border-bottom-width: 0;
|
3340 |
+
}
|
3341 |
+
.dropup .btn-lg .caret {
|
3342 |
+
border-width: 0 5px 5px;
|
3343 |
+
}
|
3344 |
+
.btn-group-vertical > .btn,
|
3345 |
+
.btn-group-vertical > .btn-group,
|
3346 |
+
.btn-group-vertical > .btn-group > .btn {
|
3347 |
+
display: block;
|
3348 |
+
float: none;
|
3349 |
+
width: 100%;
|
3350 |
+
max-width: 100%;
|
3351 |
+
}
|
3352 |
+
.btn-group-vertical > .btn-group > .btn {
|
3353 |
+
float: none;
|
3354 |
+
}
|
3355 |
+
.btn-group-vertical > .btn + .btn,
|
3356 |
+
.btn-group-vertical > .btn + .btn-group,
|
3357 |
+
.btn-group-vertical > .btn-group + .btn,
|
3358 |
+
.btn-group-vertical > .btn-group + .btn-group {
|
3359 |
+
margin-top: -1px;
|
3360 |
+
margin-left: 0;
|
3361 |
+
}
|
3362 |
+
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
|
3363 |
+
border-radius: 0;
|
3364 |
+
}
|
3365 |
+
.btn-group-vertical > .btn:first-child:not(:last-child) {
|
3366 |
+
border-top-right-radius: 4px;
|
3367 |
+
border-bottom-right-radius: 0;
|
3368 |
+
border-bottom-left-radius: 0;
|
3369 |
+
}
|
3370 |
+
.btn-group-vertical > .btn:last-child:not(:first-child) {
|
3371 |
+
border-bottom-left-radius: 4px;
|
3372 |
+
border-top-right-radius: 0;
|
3373 |
+
border-top-left-radius: 0;
|
3374 |
+
}
|
3375 |
+
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
|
3376 |
+
border-radius: 0;
|
3377 |
+
}
|
3378 |
+
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
|
3379 |
+
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
|
3380 |
+
border-bottom-right-radius: 0;
|
3381 |
+
border-bottom-left-radius: 0;
|
3382 |
+
}
|
3383 |
+
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
3384 |
+
border-top-right-radius: 0;
|
3385 |
+
border-top-left-radius: 0;
|
3386 |
+
}
|
3387 |
+
.btn-group-justified {
|
3388 |
+
display: table;
|
3389 |
+
width: 100%;
|
3390 |
+
table-layout: fixed;
|
3391 |
+
border-collapse: separate;
|
3392 |
+
}
|
3393 |
+
.btn-group-justified > .btn,
|
3394 |
+
.btn-group-justified > .btn-group {
|
3395 |
+
float: none;
|
3396 |
+
display: table-cell;
|
3397 |
+
width: 1%;
|
3398 |
+
}
|
3399 |
+
.btn-group-justified > .btn-group .btn {
|
3400 |
+
width: 100%;
|
3401 |
+
}
|
3402 |
+
.btn-group-justified > .btn-group .dropdown-menu {
|
3403 |
+
left: auto;
|
3404 |
+
}
|
3405 |
+
[data-toggle="buttons"] > .btn > input[type="radio"],
|
3406 |
+
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
|
3407 |
+
position: absolute;
|
3408 |
+
z-index: -1;
|
3409 |
+
opacity: 0;
|
3410 |
+
filter: alpha(opacity=0);
|
3411 |
+
}
|
3412 |
+
.input-group {
|
3413 |
+
position: relative;
|
3414 |
+
display: table;
|
3415 |
+
border-collapse: separate;
|
3416 |
+
}
|
3417 |
+
.input-group[class*="col-"] {
|
3418 |
+
float: none;
|
3419 |
+
padding-left: 0;
|
3420 |
+
padding-right: 0;
|
3421 |
+
}
|
3422 |
+
.input-group .form-control {
|
3423 |
+
position: relative;
|
3424 |
+
z-index: 2;
|
3425 |
+
float: left;
|
3426 |
+
width: 100%;
|
3427 |
+
margin-bottom: 0;
|
3428 |
+
}
|
3429 |
+
.input-group-lg > .form-control,
|
3430 |
+
.input-group-lg > .input-group-addon,
|
3431 |
+
.input-group-lg > .input-group-btn > .btn {
|
3432 |
+
height: 46px;
|
3433 |
+
padding: 10px 16px;
|
3434 |
+
font-size: 18px;
|
3435 |
+
line-height: 1.33;
|
3436 |
+
border-radius: 6px;
|
3437 |
+
}
|
3438 |
+
select.input-group-lg > .form-control,
|
3439 |
+
select.input-group-lg > .input-group-addon,
|
3440 |
+
select.input-group-lg > .input-group-btn > .btn {
|
3441 |
+
height: 46px;
|
3442 |
+
line-height: 46px;
|
3443 |
+
}
|
3444 |
+
textarea.input-group-lg > .form-control,
|
3445 |
+
textarea.input-group-lg > .input-group-addon,
|
3446 |
+
textarea.input-group-lg > .input-group-btn > .btn,
|
3447 |
+
select[multiple].input-group-lg > .form-control,
|
3448 |
+
select[multiple].input-group-lg > .input-group-addon,
|
3449 |
+
select[multiple].input-group-lg > .input-group-btn > .btn {
|
3450 |
+
height: auto;
|
3451 |
+
}
|
3452 |
+
.input-group-sm > .form-control,
|
3453 |
+
.input-group-sm > .input-group-addon,
|
3454 |
+
.input-group-sm > .input-group-btn > .btn {
|
3455 |
+
height: 30px;
|
3456 |
+
padding: 5px 10px;
|
3457 |
+
font-size: 12px;
|
3458 |
+
line-height: 1.5;
|
3459 |
+
border-radius: 3px;
|
3460 |
+
}
|
3461 |
+
select.input-group-sm > .form-control,
|
3462 |
+
select.input-group-sm > .input-group-addon,
|
3463 |
+
select.input-group-sm > .input-group-btn > .btn {
|
3464 |
+
height: 30px;
|
3465 |
+
line-height: 30px;
|
3466 |
+
}
|
3467 |
+
textarea.input-group-sm > .form-control,
|
3468 |
+
textarea.input-group-sm > .input-group-addon,
|
3469 |
+
textarea.input-group-sm > .input-group-btn > .btn,
|
3470 |
+
select[multiple].input-group-sm > .form-control,
|
3471 |
+
select[multiple].input-group-sm > .input-group-addon,
|
3472 |
+
select[multiple].input-group-sm > .input-group-btn > .btn {
|
3473 |
+
height: auto;
|
3474 |
+
}
|
3475 |
+
.input-group-addon,
|
3476 |
+
.input-group-btn,
|
3477 |
+
.input-group .form-control {
|
3478 |
+
display: table-cell;
|
3479 |
+
}
|
3480 |
+
.input-group-addon:not(:first-child):not(:last-child),
|
3481 |
+
.input-group-btn:not(:first-child):not(:last-child),
|
3482 |
+
.input-group .form-control:not(:first-child):not(:last-child) {
|
3483 |
+
border-radius: 0;
|
3484 |
+
}
|
3485 |
+
.input-group-addon,
|
3486 |
+
.input-group-btn {
|
3487 |
+
width: 1%;
|
3488 |
+
white-space: nowrap;
|
3489 |
+
vertical-align: middle;
|
3490 |
+
}
|
3491 |
+
.input-group-addon {
|
3492 |
+
padding: 6px 12px;
|
3493 |
+
font-size: 14px;
|
3494 |
+
font-weight: normal;
|
3495 |
+
line-height: 1;
|
3496 |
+
color: #555555;
|
3497 |
+
text-align: center;
|
3498 |
+
background-color: #eeeeee;
|
3499 |
+
border: 1px solid #cccccc;
|
3500 |
+
border-radius: 4px;
|
3501 |
+
}
|
3502 |
+
.input-group-addon.input-sm {
|
3503 |
+
padding: 5px 10px;
|
3504 |
+
font-size: 12px;
|
3505 |
+
border-radius: 3px;
|
3506 |
+
}
|
3507 |
+
.input-group-addon.input-lg {
|
3508 |
+
padding: 10px 16px;
|
3509 |
+
font-size: 18px;
|
3510 |
+
border-radius: 6px;
|
3511 |
+
}
|
3512 |
+
.input-group-addon input[type="radio"],
|
3513 |
+
.input-group-addon input[type="checkbox"] {
|
3514 |
+
margin-top: 0;
|
3515 |
+
}
|
3516 |
+
.input-group .form-control:first-child,
|
3517 |
+
.input-group-addon:first-child,
|
3518 |
+
.input-group-btn:first-child > .btn,
|
3519 |
+
.input-group-btn:first-child > .btn-group > .btn,
|
3520 |
+
.input-group-btn:first-child > .dropdown-toggle,
|
3521 |
+
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
3522 |
+
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
|
3523 |
+
border-bottom-right-radius: 0;
|
3524 |
+
border-top-right-radius: 0;
|
3525 |
+
}
|
3526 |
+
.input-group-addon:first-child {
|
3527 |
+
border-right: 0;
|
3528 |
+
}
|
3529 |
+
.input-group .form-control:last-child,
|
3530 |
+
.input-group-addon:last-child,
|
3531 |
+
.input-group-btn:last-child > .btn,
|
3532 |
+
.input-group-btn:last-child > .btn-group > .btn,
|
3533 |
+
.input-group-btn:last-child > .dropdown-toggle,
|
3534 |
+
.input-group-btn:first-child > .btn:not(:first-child),
|
3535 |
+
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
|
3536 |
+
border-bottom-left-radius: 0;
|
3537 |
+
border-top-left-radius: 0;
|
3538 |
+
}
|
3539 |
+
.input-group-addon:last-child {
|
3540 |
+
border-left: 0;
|
3541 |
+
}
|
3542 |
+
.input-group-btn {
|
3543 |
+
position: relative;
|
3544 |
+
font-size: 0;
|
3545 |
+
white-space: nowrap;
|
3546 |
+
}
|
3547 |
+
.input-group-btn > .btn {
|
3548 |
+
position: relative;
|
3549 |
+
}
|
3550 |
+
.input-group-btn > .btn + .btn {
|
3551 |
+
margin-left: -1px;
|
3552 |
+
}
|
3553 |
+
.input-group-btn > .btn:hover,
|
3554 |
+
.input-group-btn > .btn:focus,
|
3555 |
+
.input-group-btn > .btn:active {
|
3556 |
+
z-index: 2;
|
3557 |
+
}
|
3558 |
+
.input-group-btn:first-child > .btn,
|
3559 |
+
.input-group-btn:first-child > .btn-group {
|
3560 |
+
margin-right: -1px;
|
3561 |
+
}
|
3562 |
+
.input-group-btn:last-child > .btn,
|
3563 |
+
.input-group-btn:last-child > .btn-group {
|
3564 |
+
margin-left: -1px;
|
3565 |
+
}
|
3566 |
+
.nav {
|
3567 |
+
margin-bottom: 0;
|
3568 |
+
padding-left: 0;
|
3569 |
+
list-style: none;
|
3570 |
+
}
|
3571 |
+
.nav > li {
|
3572 |
+
position: relative;
|
3573 |
+
display: block;
|
3574 |
+
}
|
3575 |
+
.nav > li > a {
|
3576 |
+
position: relative;
|
3577 |
+
display: block;
|
3578 |
+
padding: 10px 15px;
|
3579 |
+
}
|
3580 |
+
.nav > li > a:hover,
|
3581 |
+
.nav > li > a:focus {
|
3582 |
+
text-decoration: none;
|
3583 |
+
background-color: #eeeeee;
|
3584 |
+
}
|
3585 |
+
.nav > li.disabled > a {
|
3586 |
+
color: #777777;
|
3587 |
+
}
|
3588 |
+
.nav > li.disabled > a:hover,
|
3589 |
+
.nav > li.disabled > a:focus {
|
3590 |
+
color: #777777;
|
3591 |
+
text-decoration: none;
|
3592 |
+
background-color: transparent;
|
3593 |
+
cursor: not-allowed;
|
3594 |
+
}
|
3595 |
+
.nav .open > a,
|
3596 |
+
.nav .open > a:hover,
|
3597 |
+
.nav .open > a:focus {
|
3598 |
+
background-color: #eeeeee;
|
3599 |
+
border-color: #428bca;
|
3600 |
+
}
|
3601 |
+
.nav .nav-divider {
|
3602 |
+
height: 1px;
|
3603 |
+
margin: 9px 0;
|
3604 |
+
overflow: hidden;
|
3605 |
+
background-color: #e5e5e5;
|
3606 |
+
}
|
3607 |
+
.nav > li > a > img {
|
3608 |
+
max-width: none;
|
3609 |
+
}
|
3610 |
+
.nav-tabs {
|
3611 |
+
border-bottom: 1px solid #dddddd;
|
3612 |
+
}
|
3613 |
+
.nav-tabs > li {
|
3614 |
+
float: left;
|
3615 |
+
margin-bottom: -1px;
|
3616 |
+
}
|
3617 |
+
.nav-tabs > li > a {
|
3618 |
+
margin-right: 2px;
|
3619 |
+
line-height: 1.42857143;
|
3620 |
+
border: 1px solid transparent;
|
3621 |
+
border-radius: 4px 4px 0 0;
|
3622 |
+
}
|
3623 |
+
.nav-tabs > li > a:hover {
|
3624 |
+
border-color: #eeeeee #eeeeee #dddddd;
|
3625 |
+
}
|
3626 |
+
.nav-tabs > li.active > a,
|
3627 |
+
.nav-tabs > li.active > a:hover,
|
3628 |
+
.nav-tabs > li.active > a:focus {
|
3629 |
+
color: #555555;
|
3630 |
+
background-color: #ffffff;
|
3631 |
+
border: 1px solid #dddddd;
|
3632 |
+
border-bottom-color: transparent;
|
3633 |
+
cursor: default;
|
3634 |
+
}
|
3635 |
+
.nav-tabs.nav-justified {
|
3636 |
+
width: 100%;
|
3637 |
+
border-bottom: 0;
|
3638 |
+
}
|
3639 |
+
.nav-tabs.nav-justified > li {
|
3640 |
+
float: none;
|
3641 |
+
}
|
3642 |
+
.nav-tabs.nav-justified > li > a {
|
3643 |
+
text-align: center;
|
3644 |
+
margin-bottom: 5px;
|
3645 |
+
}
|
3646 |
+
.nav-tabs.nav-justified > .dropdown .dropdown-menu {
|
3647 |
+
top: auto;
|
3648 |
+
left: auto;
|
3649 |
+
}
|
3650 |
+
@media (min-width: 768px) {
|
3651 |
+
.nav-tabs.nav-justified > li {
|
3652 |
+
display: table-cell;
|
3653 |
+
width: 1%;
|
3654 |
+
}
|
3655 |
+
.nav-tabs.nav-justified > li > a {
|
3656 |
+
margin-bottom: 0;
|
3657 |
+
}
|
3658 |
+
}
|
3659 |
+
.nav-tabs.nav-justified > li > a {
|
3660 |
+
margin-right: 0;
|
3661 |
+
border-radius: 4px;
|
3662 |
+
}
|
3663 |
+
.nav-tabs.nav-justified > .active > a,
|
3664 |
+
.nav-tabs.nav-justified > .active > a:hover,
|
3665 |
+
.nav-tabs.nav-justified > .active > a:focus {
|
3666 |
+
border: 1px solid #dddddd;
|
3667 |
+
}
|
3668 |
+
@media (min-width: 768px) {
|
3669 |
+
.nav-tabs.nav-justified > li > a {
|
3670 |
+
border-bottom: 1px solid #dddddd;
|
3671 |
+
border-radius: 4px 4px 0 0;
|
3672 |
+
}
|
3673 |
+
.nav-tabs.nav-justified > .active > a,
|
3674 |
+
.nav-tabs.nav-justified > .active > a:hover,
|
3675 |
+
.nav-tabs.nav-justified > .active > a:focus {
|
3676 |
+
border-bottom-color: #ffffff;
|
3677 |
+
}
|
3678 |
+
}
|
3679 |
+
.nav-pills > li {
|
3680 |
+
float: left;
|
3681 |
+
}
|
3682 |
+
.nav-pills > li > a {
|
3683 |
+
border-radius: 4px;
|
3684 |
+
}
|
3685 |
+
.nav-pills > li + li {
|
3686 |
+
margin-left: 2px;
|
3687 |
+
}
|
3688 |
+
.nav-pills > li.active > a,
|
3689 |
+
.nav-pills > li.active > a:hover,
|
3690 |
+
.nav-pills > li.active > a:focus {
|
3691 |
+
color: #ffffff;
|
3692 |
+
background-color: #428bca;
|
3693 |
+
}
|
3694 |
+
.nav-stacked > li {
|
3695 |
+
float: none;
|
3696 |
+
}
|
3697 |
+
.nav-stacked > li + li {
|
3698 |
+
margin-top: 2px;
|
3699 |
+
margin-left: 0;
|
3700 |
+
}
|
3701 |
+
.nav-justified {
|
3702 |
+
width: 100%;
|
3703 |
+
}
|
3704 |
+
.nav-justified > li {
|
3705 |
+
float: none;
|
3706 |
+
}
|
3707 |
+
.nav-justified > li > a {
|
3708 |
+
text-align: center;
|
3709 |
+
margin-bottom: 5px;
|
3710 |
+
}
|
3711 |
+
.nav-justified > .dropdown .dropdown-menu {
|
3712 |
+
top: auto;
|
3713 |
+
left: auto;
|
3714 |
+
}
|
3715 |
+
@media (min-width: 768px) {
|
3716 |
+
.nav-justified > li {
|
3717 |
+
display: table-cell;
|
3718 |
+
width: 1%;
|
3719 |
+
}
|
3720 |
+
.nav-justified > li > a {
|
3721 |
+
margin-bottom: 0;
|
3722 |
+
}
|
3723 |
+
}
|
3724 |
+
.nav-tabs-justified {
|
3725 |
+
border-bottom: 0;
|
3726 |
+
}
|
3727 |
+
.nav-tabs-justified > li > a {
|
3728 |
+
margin-right: 0;
|
3729 |
+
border-radius: 4px;
|
3730 |
+
}
|
3731 |
+
.nav-tabs-justified > .active > a,
|
3732 |
+
.nav-tabs-justified > .active > a:hover,
|
3733 |
+
.nav-tabs-justified > .active > a:focus {
|
3734 |
+
border: 1px solid #dddddd;
|
3735 |
+
}
|
3736 |
+
@media (min-width: 768px) {
|
3737 |
+
.nav-tabs-justified > li > a {
|
3738 |
+
border-bottom: 1px solid #dddddd;
|
3739 |
+
border-radius: 4px 4px 0 0;
|
3740 |
+
}
|
3741 |
+
.nav-tabs-justified > .active > a,
|
3742 |
+
.nav-tabs-justified > .active > a:hover,
|
3743 |
+
.nav-tabs-justified > .active > a:focus {
|
3744 |
+
border-bottom-color: #ffffff;
|
3745 |
+
}
|
3746 |
+
}
|
3747 |
+
.tab-content > .tab-pane {
|
3748 |
+
display: none;
|
3749 |
+
}
|
3750 |
+
.tab-content > .active {
|
3751 |
+
display: block;
|
3752 |
+
}
|
3753 |
+
.nav-tabs .dropdown-menu {
|
3754 |
+
margin-top: -1px;
|
3755 |
+
border-top-right-radius: 0;
|
3756 |
+
border-top-left-radius: 0;
|
3757 |
+
}
|
3758 |
+
.navbar {
|
3759 |
+
position: relative;
|
3760 |
+
min-height: 50px;
|
3761 |
+
margin-bottom: 20px;
|
3762 |
+
border: 1px solid transparent;
|
3763 |
+
}
|
3764 |
+
@media (min-width: 768px) {
|
3765 |
+
.navbar {
|
3766 |
+
border-radius: 4px;
|
3767 |
+
}
|
3768 |
+
}
|
3769 |
+
@media (min-width: 768px) {
|
3770 |
+
.navbar-header {
|
3771 |
+
float: left;
|
3772 |
+
}
|
3773 |
+
}
|
3774 |
+
.navbar-collapse {
|
3775 |
+
overflow-x: visible;
|
3776 |
+
padding-right: 15px;
|
3777 |
+
padding-left: 15px;
|
3778 |
+
border-top: 1px solid transparent;
|
3779 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
|
3780 |
+
-webkit-overflow-scrolling: touch;
|
3781 |
+
}
|
3782 |
+
.navbar-collapse.in {
|
3783 |
+
overflow-y: auto;
|
3784 |
+
}
|
3785 |
+
@media (min-width: 768px) {
|
3786 |
+
.navbar-collapse {
|
3787 |
+
width: auto;
|
3788 |
+
border-top: 0;
|
3789 |
+
box-shadow: none;
|
3790 |
+
}
|
3791 |
+
.navbar-collapse.collapse {
|
3792 |
+
display: block !important;
|
3793 |
+
height: auto !important;
|
3794 |
+
padding-bottom: 0;
|
3795 |
+
overflow: visible !important;
|
3796 |
+
}
|
3797 |
+
.navbar-collapse.in {
|
3798 |
+
overflow-y: visible;
|
3799 |
+
}
|
3800 |
+
.navbar-fixed-top .navbar-collapse,
|
3801 |
+
.navbar-static-top .navbar-collapse,
|
3802 |
+
.navbar-fixed-bottom .navbar-collapse {
|
3803 |
+
padding-left: 0;
|
3804 |
+
padding-right: 0;
|
3805 |
+
}
|
3806 |
+
}
|
3807 |
+
.navbar-fixed-top .navbar-collapse,
|
3808 |
+
.navbar-fixed-bottom .navbar-collapse {
|
3809 |
+
max-height: 340px;
|
3810 |
+
}
|
3811 |
+
@media (max-width: 480px) and (orientation: landscape) {
|
3812 |
+
.navbar-fixed-top .navbar-collapse,
|
3813 |
+
.navbar-fixed-bottom .navbar-collapse {
|
3814 |
+
max-height: 200px;
|
3815 |
+
}
|
3816 |
+
}
|
3817 |
+
.container > .navbar-header,
|
3818 |
+
.container-fluid > .navbar-header,
|
3819 |
+
.container > .navbar-collapse,
|
3820 |
+
.container-fluid > .navbar-collapse {
|
3821 |
+
margin-right: -15px;
|
3822 |
+
margin-left: -15px;
|
3823 |
+
}
|
3824 |
+
@media (min-width: 768px) {
|
3825 |
+
.container > .navbar-header,
|
3826 |
+
.container-fluid > .navbar-header,
|
3827 |
+
.container > .navbar-collapse,
|
3828 |
+
.container-fluid > .navbar-collapse {
|
3829 |
+
margin-right: 0;
|
3830 |
+
margin-left: 0;
|
3831 |
+
}
|
3832 |
+
}
|
3833 |
+
.navbar-static-top {
|
3834 |
+
z-index: 1000;
|
3835 |
+
border-width: 0 0 1px;
|
3836 |
+
}
|
3837 |
+
@media (min-width: 768px) {
|
3838 |
+
.navbar-static-top {
|
3839 |
+
border-radius: 0;
|
3840 |
+
}
|
3841 |
+
}
|
3842 |
+
.navbar-fixed-top,
|
3843 |
+
.navbar-fixed-bottom {
|
3844 |
+
position: fixed;
|
3845 |
+
right: 0;
|
3846 |
+
left: 0;
|
3847 |
+
z-index: 1030;
|
3848 |
+
-webkit-transform: translate3d(0, 0, 0);
|
3849 |
+
transform: translate3d(0, 0, 0);
|
3850 |
+
}
|
3851 |
+
@media (min-width: 768px) {
|
3852 |
+
.navbar-fixed-top,
|
3853 |
+
.navbar-fixed-bottom {
|
3854 |
+
border-radius: 0;
|
3855 |
+
}
|
3856 |
+
}
|
3857 |
+
.navbar-fixed-top {
|
3858 |
+
top: 0;
|
3859 |
+
border-width: 0 0 1px;
|
3860 |
+
}
|
3861 |
+
.navbar-fixed-bottom {
|
3862 |
+
bottom: 0;
|
3863 |
+
margin-bottom: 0;
|
3864 |
+
border-width: 1px 0 0;
|
3865 |
+
}
|
3866 |
+
.navbar-brand {
|
3867 |
+
float: left;
|
3868 |
+
padding: 15px 15px;
|
3869 |
+
font-size: 18px;
|
3870 |
+
line-height: 20px;
|
3871 |
+
height: 50px;
|
3872 |
+
}
|
3873 |
+
.navbar-brand:hover,
|
3874 |
+
.navbar-brand:focus {
|
3875 |
+
text-decoration: none;
|
3876 |
+
}
|
3877 |
+
@media (min-width: 768px) {
|
3878 |
+
.navbar > .container .navbar-brand,
|
3879 |
+
.navbar > .container-fluid .navbar-brand {
|
3880 |
+
margin-left: -15px;
|
3881 |
+
}
|
3882 |
+
}
|
3883 |
+
.navbar-toggle {
|
3884 |
+
position: relative;
|
3885 |
+
float: right;
|
3886 |
+
margin-right: 15px;
|
3887 |
+
padding: 9px 10px;
|
3888 |
+
margin-top: 8px;
|
3889 |
+
margin-bottom: 8px;
|
3890 |
+
background-color: transparent;
|
3891 |
+
background-image: none;
|
3892 |
+
border: 1px solid transparent;
|
3893 |
+
border-radius: 4px;
|
3894 |
+
}
|
3895 |
+
.navbar-toggle:focus {
|
3896 |
+
outline: 0;
|
3897 |
+
}
|
3898 |
+
.navbar-toggle .icon-bar {
|
3899 |
+
display: block;
|
3900 |
+
width: 22px;
|
3901 |
+
height: 2px;
|
3902 |
+
border-radius: 1px;
|
3903 |
+
}
|
3904 |
+
.navbar-toggle .icon-bar + .icon-bar {
|
3905 |
+
margin-top: 4px;
|
3906 |
+
}
|
3907 |
+
@media (min-width: 768px) {
|
3908 |
+
.navbar-toggle {
|
3909 |
+
display: none;
|
3910 |
+
}
|
3911 |
+
}
|
3912 |
+
.navbar-nav {
|
3913 |
+
margin: 7.5px -15px;
|
3914 |
+
}
|
3915 |
+
.navbar-nav > li > a {
|
3916 |
+
padding-top: 10px;
|
3917 |
+
padding-bottom: 10px;
|
3918 |
+
line-height: 20px;
|
3919 |
+
}
|
3920 |
+
@media (max-width: 767px) {
|
3921 |
+
.navbar-nav .open .dropdown-menu {
|
3922 |
+
position: static;
|
3923 |
+
float: none;
|
3924 |
+
width: auto;
|
3925 |
+
margin-top: 0;
|
3926 |
+
background-color: transparent;
|
3927 |
+
border: 0;
|
3928 |
+
box-shadow: none;
|
3929 |
+
}
|
3930 |
+
.navbar-nav .open .dropdown-menu > li > a,
|
3931 |
+
.navbar-nav .open .dropdown-menu .dropdown-header {
|
3932 |
+
padding: 5px 15px 5px 25px;
|
3933 |
+
}
|
3934 |
+
.navbar-nav .open .dropdown-menu > li > a {
|
3935 |
+
line-height: 20px;
|
3936 |
+
}
|
3937 |
+
.navbar-nav .open .dropdown-menu > li > a:hover,
|
3938 |
+
.navbar-nav .open .dropdown-menu > li > a:focus {
|
3939 |
+
background-image: none;
|
3940 |
+
}
|
3941 |
+
}
|
3942 |
+
@media (min-width: 768px) {
|
3943 |
+
.navbar-nav {
|
3944 |
+
float: left;
|
3945 |
+
margin: 0;
|
3946 |
+
}
|
3947 |
+
.navbar-nav > li {
|
3948 |
+
float: left;
|
3949 |
+
}
|
3950 |
+
.navbar-nav > li > a {
|
3951 |
+
padding-top: 15px;
|
3952 |
+
padding-bottom: 15px;
|
3953 |
+
}
|
3954 |
+
.navbar-nav.navbar-right:last-child {
|
3955 |
+
margin-right: -15px;
|
3956 |
+
}
|
3957 |
+
}
|
3958 |
+
@media (min-width: 768px) {
|
3959 |
+
.navbar-left {
|
3960 |
+
float: left !important;
|
3961 |
+
}
|
3962 |
+
.navbar-right {
|
3963 |
+
float: right !important;
|
3964 |
+
}
|
3965 |
+
}
|
3966 |
+
.navbar-form {
|
3967 |
+
margin-left: -15px;
|
3968 |
+
margin-right: -15px;
|
3969 |
+
padding: 10px 15px;
|
3970 |
+
border-top: 1px solid transparent;
|
3971 |
+
border-bottom: 1px solid transparent;
|
3972 |
+
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
3973 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
3974 |
+
margin-top: 8px;
|
3975 |
+
margin-bottom: 8px;
|
3976 |
+
}
|
3977 |
+
@media (min-width: 768px) {
|
3978 |
+
.navbar-form .form-group {
|
3979 |
+
display: inline-block;
|
3980 |
+
margin-bottom: 0;
|
3981 |
+
vertical-align: middle;
|
3982 |
+
}
|
3983 |
+
.navbar-form .form-control {
|
3984 |
+
display: inline-block;
|
3985 |
+
width: auto;
|
3986 |
+
vertical-align: middle;
|
3987 |
+
}
|
3988 |
+
.navbar-form .input-group {
|
3989 |
+
display: inline-table;
|
3990 |
+
vertical-align: middle;
|
3991 |
+
}
|
3992 |
+
.navbar-form .input-group .input-group-addon,
|
3993 |
+
.navbar-form .input-group .input-group-btn,
|
3994 |
+
.navbar-form .input-group .form-control {
|
3995 |
+
width: auto;
|
3996 |
+
}
|
3997 |
+
.navbar-form .input-group > .form-control {
|
3998 |
+
width: 100%;
|
3999 |
+
}
|
4000 |
+
.navbar-form .control-label {
|
4001 |
+
margin-bottom: 0;
|
4002 |
+
vertical-align: middle;
|
4003 |
+
}
|
4004 |
+
.navbar-form .radio,
|
4005 |
+
.navbar-form .checkbox {
|
4006 |
+
display: inline-block;
|
4007 |
+
margin-top: 0;
|
4008 |
+
margin-bottom: 0;
|
4009 |
+
vertical-align: middle;
|
4010 |
+
}
|
4011 |
+
.navbar-form .radio label,
|
4012 |
+
.navbar-form .checkbox label {
|
4013 |
+
padding-left: 0;
|
4014 |
+
}
|
4015 |
+
.navbar-form .radio input[type="radio"],
|
4016 |
+
.navbar-form .checkbox input[type="checkbox"] {
|
4017 |
+
position: relative;
|
4018 |
+
margin-left: 0;
|
4019 |
+
}
|
4020 |
+
.navbar-form .has-feedback .form-control-feedback {
|
4021 |
+
top: 0;
|
4022 |
+
}
|
4023 |
+
}
|
4024 |
+
@media (max-width: 767px) {
|
4025 |
+
.navbar-form .form-group {
|
4026 |
+
margin-bottom: 5px;
|
4027 |
+
}
|
4028 |
+
}
|
4029 |
+
@media (min-width: 768px) {
|
4030 |
+
.navbar-form {
|
4031 |
+
width: auto;
|
4032 |
+
border: 0;
|
4033 |
+
margin-left: 0;
|
4034 |
+
margin-right: 0;
|
4035 |
+
padding-top: 0;
|
4036 |
+
padding-bottom: 0;
|
4037 |
+
-webkit-box-shadow: none;
|
4038 |
+
box-shadow: none;
|
4039 |
+
}
|
4040 |
+
.navbar-form.navbar-right:last-child {
|
4041 |
+
margin-right: -15px;
|
4042 |
+
}
|
4043 |
+
}
|
4044 |
+
.navbar-nav > li > .dropdown-menu {
|
4045 |
+
margin-top: 0;
|
4046 |
+
border-top-right-radius: 0;
|
4047 |
+
border-top-left-radius: 0;
|
4048 |
+
}
|
4049 |
+
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
|
4050 |
+
border-bottom-right-radius: 0;
|
4051 |
+
border-bottom-left-radius: 0;
|
4052 |
+
}
|
4053 |
+
.navbar-btn {
|
4054 |
+
margin-top: 8px;
|
4055 |
+
margin-bottom: 8px;
|
4056 |
+
}
|
4057 |
+
.navbar-btn.btn-sm {
|
4058 |
+
margin-top: 10px;
|
4059 |
+
margin-bottom: 10px;
|
4060 |
+
}
|
4061 |
+
.navbar-btn.btn-xs {
|
4062 |
+
margin-top: 14px;
|
4063 |
+
margin-bottom: 14px;
|
4064 |
+
}
|
4065 |
+
.navbar-text {
|
4066 |
+
margin-top: 15px;
|
4067 |
+
margin-bottom: 15px;
|
4068 |
+
}
|
4069 |
+
@media (min-width: 768px) {
|
4070 |
+
.navbar-text {
|
4071 |
+
float: left;
|
4072 |
+
margin-left: 15px;
|
4073 |
+
margin-right: 15px;
|
4074 |
+
}
|
4075 |
+
.navbar-text.navbar-right:last-child {
|
4076 |
+
margin-right: 0;
|
4077 |
+
}
|
4078 |
+
}
|
4079 |
+
.navbar-default {
|
4080 |
+
background-color: #f8f8f8;
|
4081 |
+
border-color: #e7e7e7;
|
4082 |
+
}
|
4083 |
+
.navbar-default .navbar-brand {
|
4084 |
+
color: #777777;
|
4085 |
+
}
|
4086 |
+
.navbar-default .navbar-brand:hover,
|
4087 |
+
.navbar-default .navbar-brand:focus {
|
4088 |
+
color: #5e5e5e;
|
4089 |
+
background-color: transparent;
|
4090 |
+
}
|
4091 |
+
.navbar-default .navbar-text {
|
4092 |
+
color: #777777;
|
4093 |
+
}
|
4094 |
+
.navbar-default .navbar-nav > li > a {
|
4095 |
+
color: #777777;
|
4096 |
+
}
|
4097 |
+
.navbar-default .navbar-nav > li > a:hover,
|
4098 |
+
.navbar-default .navbar-nav > li > a:focus {
|
4099 |
+
color: #333333;
|
4100 |
+
background-color: transparent;
|
4101 |
+
}
|
4102 |
+
.navbar-default .navbar-nav > .active > a,
|
4103 |
+
.navbar-default .navbar-nav > .active > a:hover,
|
4104 |
+
.navbar-default .navbar-nav > .active > a:focus {
|
4105 |
+
color: #555555;
|
4106 |
+
background-color: #e7e7e7;
|
4107 |
+
}
|
4108 |
+
.navbar-default .navbar-nav > .disabled > a,
|
4109 |
+
.navbar-default .navbar-nav > .disabled > a:hover,
|
4110 |
+
.navbar-default .navbar-nav > .disabled > a:focus {
|
4111 |
+
color: #cccccc;
|
4112 |
+
background-color: transparent;
|
4113 |
+
}
|
4114 |
+
.navbar-default .navbar-toggle {
|
4115 |
+
border-color: #dddddd;
|
4116 |
+
}
|
4117 |
+
.navbar-default .navbar-toggle:hover,
|
4118 |
+
.navbar-default .navbar-toggle:focus {
|
4119 |
+
background-color: #dddddd;
|
4120 |
+
}
|
4121 |
+
.navbar-default .navbar-toggle .icon-bar {
|
4122 |
+
background-color: #888888;
|
4123 |
+
}
|
4124 |
+
.navbar-default .navbar-collapse,
|
4125 |
+
.navbar-default .navbar-form {
|
4126 |
+
border-color: #e7e7e7;
|
4127 |
+
}
|
4128 |
+
.navbar-default .navbar-nav > .open > a,
|
4129 |
+
.navbar-default .navbar-nav > .open > a:hover,
|
4130 |
+
.navbar-default .navbar-nav > .open > a:focus {
|
4131 |
+
background-color: #e7e7e7;
|
4132 |
+
color: #555555;
|
4133 |
+
}
|
4134 |
+
@media (max-width: 767px) {
|
4135 |
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
|
4136 |
+
color: #777777;
|
4137 |
+
}
|
4138 |
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
|
4139 |
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
|
4140 |
+
color: #333333;
|
4141 |
+
background-color: transparent;
|
4142 |
+
}
|
4143 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .active > a,
|
4144 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
|
4145 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
|
4146 |
+
color: #555555;
|
4147 |
+
background-color: #e7e7e7;
|
4148 |
+
}
|
4149 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
|
4150 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
|
4151 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
|
4152 |
+
color: #cccccc;
|
4153 |
+
background-color: transparent;
|
4154 |
+
}
|
4155 |
+
}
|
4156 |
+
.navbar-default .navbar-link {
|
4157 |
+
color: #777777;
|
4158 |
+
}
|
4159 |
+
.navbar-default .navbar-link:hover {
|
4160 |
+
color: #333333;
|
4161 |
+
}
|
4162 |
+
.navbar-default .btn-link {
|
4163 |
+
color: #777777;
|
4164 |
+
}
|
4165 |
+
.navbar-default .btn-link:hover,
|
4166 |
+
.navbar-default .btn-link:focus {
|
4167 |
+
color: #333333;
|
4168 |
+
}
|
4169 |
+
.navbar-default .btn-link[disabled]:hover,
|
4170 |
+
fieldset[disabled] .navbar-default .btn-link:hover,
|
4171 |
+
.navbar-default .btn-link[disabled]:focus,
|
4172 |
+
fieldset[disabled] .navbar-default .btn-link:focus {
|
4173 |
+
color: #cccccc;
|
4174 |
+
}
|
4175 |
+
.navbar-inverse {
|
4176 |
+
background-color: #222222;
|
4177 |
+
border-color: #080808;
|
4178 |
+
}
|
4179 |
+
.navbar-inverse .navbar-brand {
|
4180 |
+
color: #777777;
|
4181 |
+
}
|
4182 |
+
.navbar-inverse .navbar-brand:hover,
|
4183 |
+
.navbar-inverse .navbar-brand:focus {
|
4184 |
+
color: #ffffff;
|
4185 |
+
background-color: transparent;
|
4186 |
+
}
|
4187 |
+
.navbar-inverse .navbar-text {
|
4188 |
+
color: #777777;
|
4189 |
+
}
|
4190 |
+
.navbar-inverse .navbar-nav > li > a {
|
4191 |
+
color: #777777;
|
4192 |
+
}
|
4193 |
+
.navbar-inverse .navbar-nav > li > a:hover,
|
4194 |
+
.navbar-inverse .navbar-nav > li > a:focus {
|
4195 |
+
color: #ffffff;
|
4196 |
+
background-color: transparent;
|
4197 |
+
}
|
4198 |
+
.navbar-inverse .navbar-nav > .active > a,
|
4199 |
+
.navbar-inverse .navbar-nav > .active > a:hover,
|
4200 |
+
.navbar-inverse .navbar-nav > .active > a:focus {
|
4201 |
+
color: #ffffff;
|
4202 |
+
background-color: #080808;
|
4203 |
+
}
|
4204 |
+
.navbar-inverse .navbar-nav > .disabled > a,
|
4205 |
+
.navbar-inverse .navbar-nav > .disabled > a:hover,
|
4206 |
+
.navbar-inverse .navbar-nav > .disabled > a:focus {
|
4207 |
+
color: #444444;
|
4208 |
+
background-color: transparent;
|
4209 |
+
}
|
4210 |
+
.navbar-inverse .navbar-toggle {
|
4211 |
+
border-color: #333333;
|
4212 |
+
}
|
4213 |
+
.navbar-inverse .navbar-toggle:hover,
|
4214 |
+
.navbar-inverse .navbar-toggle:focus {
|
4215 |
+
background-color: #333333;
|
4216 |
+
}
|
4217 |
+
.navbar-inverse .navbar-toggle .icon-bar {
|
4218 |
+
background-color: #ffffff;
|
4219 |
+
}
|
4220 |
+
.navbar-inverse .navbar-collapse,
|
4221 |
+
.navbar-inverse .navbar-form {
|
4222 |
+
border-color: #101010;
|
4223 |
+
}
|
4224 |
+
.navbar-inverse .navbar-nav > .open > a,
|
4225 |
+
.navbar-inverse .navbar-nav > .open > a:hover,
|
4226 |
+
.navbar-inverse .navbar-nav > .open > a:focus {
|
4227 |
+
background-color: #080808;
|
4228 |
+
color: #ffffff;
|
4229 |
+
}
|
4230 |
+
@media (max-width: 767px) {
|
4231 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
|
4232 |
+
border-color: #080808;
|
4233 |
+
}
|
4234 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu .divider {
|
4235 |
+
background-color: #080808;
|
4236 |
+
}
|
4237 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
|
4238 |
+
color: #777777;
|
4239 |
+
}
|
4240 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
|
4241 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
|
4242 |
+
color: #ffffff;
|
4243 |
+
background-color: transparent;
|
4244 |
+
}
|
4245 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
|
4246 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
|
4247 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
|
4248 |
+
color: #ffffff;
|
4249 |
+
background-color: #080808;
|
4250 |
+
}
|
4251 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
|
4252 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
|
4253 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
|
4254 |
+
color: #444444;
|
4255 |
+
background-color: transparent;
|
4256 |
+
}
|
4257 |
+
}
|
4258 |
+
.navbar-inverse .navbar-link {
|
4259 |
+
color: #777777;
|
4260 |
+
}
|
4261 |
+
.navbar-inverse .navbar-link:hover {
|
4262 |
+
color: #ffffff;
|
4263 |
+
}
|
4264 |
+
.navbar-inverse .btn-link {
|
4265 |
+
color: #777777;
|
4266 |
+
}
|
4267 |
+
.navbar-inverse .btn-link:hover,
|
4268 |
+
.navbar-inverse .btn-link:focus {
|
4269 |
+
color: #ffffff;
|
4270 |
+
}
|
4271 |
+
.navbar-inverse .btn-link[disabled]:hover,
|
4272 |
+
fieldset[disabled] .navbar-inverse .btn-link:hover,
|
4273 |
+
.navbar-inverse .btn-link[disabled]:focus,
|
4274 |
+
fieldset[disabled] .navbar-inverse .btn-link:focus {
|
4275 |
+
color: #444444;
|
4276 |
+
}
|
4277 |
+
.breadcrumb {
|
4278 |
+
padding: 8px 15px;
|
4279 |
+
margin-bottom: 20px;
|
4280 |
+
list-style: none;
|
4281 |
+
background-color: #f5f5f5;
|
4282 |
+
border-radius: 4px;
|
4283 |
+
}
|
4284 |
+
.breadcrumb > li {
|
4285 |
+
display: inline-block;
|
4286 |
+
}
|
4287 |
+
.breadcrumb > li + li:before {
|
4288 |
+
content: "/\00a0";
|
4289 |
+
padding: 0 5px;
|
4290 |
+
color: #cccccc;
|
4291 |
+
}
|
4292 |
+
.breadcrumb > .active {
|
4293 |
+
color: #777777;
|
4294 |
+
}
|
4295 |
+
.pagination {
|
4296 |
+
display: inline-block;
|
4297 |
+
padding-left: 0;
|
4298 |
+
margin: 20px 0;
|
4299 |
+
border-radius: 4px;
|
4300 |
+
}
|
4301 |
+
.pagination > li {
|
4302 |
+
display: inline;
|
4303 |
+
}
|
4304 |
+
.pagination > li > a,
|
4305 |
+
.pagination > li > span {
|
4306 |
+
position: relative;
|
4307 |
+
float: left;
|
4308 |
+
padding: 6px 12px;
|
4309 |
+
line-height: 1.42857143;
|
4310 |
+
text-decoration: none;
|
4311 |
+
color: #428bca;
|
4312 |
+
background-color: #ffffff;
|
4313 |
+
border: 1px solid #dddddd;
|
4314 |
+
margin-left: -1px;
|
4315 |
+
}
|
4316 |
+
.pagination > li:first-child > a,
|
4317 |
+
.pagination > li:first-child > span {
|
4318 |
+
margin-left: 0;
|
4319 |
+
border-bottom-left-radius: 4px;
|
4320 |
+
border-top-left-radius: 4px;
|
4321 |
+
}
|
4322 |
+
.pagination > li:last-child > a,
|
4323 |
+
.pagination > li:last-child > span {
|
4324 |
+
border-bottom-right-radius: 4px;
|
4325 |
+
border-top-right-radius: 4px;
|
4326 |
+
}
|
4327 |
+
.pagination > li > a:hover,
|
4328 |
+
.pagination > li > span:hover,
|
4329 |
+
.pagination > li > a:focus,
|
4330 |
+
.pagination > li > span:focus {
|
4331 |
+
color: #2a6496;
|
4332 |
+
background-color: #eeeeee;
|
4333 |
+
border-color: #dddddd;
|
4334 |
+
}
|
4335 |
+
.pagination > .active > a,
|
4336 |
+
.pagination > .active > span,
|
4337 |
+
.pagination > .active > a:hover,
|
4338 |
+
.pagination > .active > span:hover,
|
4339 |
+
.pagination > .active > a:focus,
|
4340 |
+
.pagination > .active > span:focus {
|
4341 |
+
z-index: 2;
|
4342 |
+
color: #ffffff;
|
4343 |
+
background-color: #428bca;
|
4344 |
+
border-color: #428bca;
|
4345 |
+
cursor: default;
|
4346 |
+
}
|
4347 |
+
.pagination > .disabled > span,
|
4348 |
+
.pagination > .disabled > span:hover,
|
4349 |
+
.pagination > .disabled > span:focus,
|
4350 |
+
.pagination > .disabled > a,
|
4351 |
+
.pagination > .disabled > a:hover,
|
4352 |
+
.pagination > .disabled > a:focus {
|
4353 |
+
color: #777777;
|
4354 |
+
background-color: #ffffff;
|
4355 |
+
border-color: #dddddd;
|
4356 |
+
cursor: not-allowed;
|
4357 |
+
}
|
4358 |
+
.pagination-lg > li > a,
|
4359 |
+
.pagination-lg > li > span {
|
4360 |
+
padding: 10px 16px;
|
4361 |
+
font-size: 18px;
|
4362 |
+
}
|
4363 |
+
.pagination-lg > li:first-child > a,
|
4364 |
+
.pagination-lg > li:first-child > span {
|
4365 |
+
border-bottom-left-radius: 6px;
|
4366 |
+
border-top-left-radius: 6px;
|
4367 |
+
}
|
4368 |
+
.pagination-lg > li:last-child > a,
|
4369 |
+
.pagination-lg > li:last-child > span {
|
4370 |
+
border-bottom-right-radius: 6px;
|
4371 |
+
border-top-right-radius: 6px;
|
4372 |
+
}
|
4373 |
+
.pagination-sm > li > a,
|
4374 |
+
.pagination-sm > li > span {
|
4375 |
+
padding: 5px 10px;
|
4376 |
+
font-size: 12px;
|
4377 |
+
}
|
4378 |
+
.pagination-sm > li:first-child > a,
|
4379 |
+
.pagination-sm > li:first-child > span {
|
4380 |
+
border-bottom-left-radius: 3px;
|
4381 |
+
border-top-left-radius: 3px;
|
4382 |
+
}
|
4383 |
+
.pagination-sm > li:last-child > a,
|
4384 |
+
.pagination-sm > li:last-child > span {
|
4385 |
+
border-bottom-right-radius: 3px;
|
4386 |
+
border-top-right-radius: 3px;
|
4387 |
+
}
|
4388 |
+
.pager {
|
4389 |
+
padding-left: 0;
|
4390 |
+
margin: 20px 0;
|
4391 |
+
list-style: none;
|
4392 |
+
text-align: center;
|
4393 |
+
}
|
4394 |
+
.pager li {
|
4395 |
+
display: inline;
|
4396 |
+
}
|
4397 |
+
.pager li > a,
|
4398 |
+
.pager li > span {
|
4399 |
+
display: inline-block;
|
4400 |
+
padding: 5px 14px;
|
4401 |
+
background-color: #ffffff;
|
4402 |
+
border: 1px solid #dddddd;
|
4403 |
+
border-radius: 15px;
|
4404 |
+
}
|
4405 |
+
.pager li > a:hover,
|
4406 |
+
.pager li > a:focus {
|
4407 |
+
text-decoration: none;
|
4408 |
+
background-color: #eeeeee;
|
4409 |
+
}
|
4410 |
+
.pager .next > a,
|
4411 |
+
.pager .next > span {
|
4412 |
+
float: right;
|
4413 |
+
}
|
4414 |
+
.pager .previous > a,
|
4415 |
+
.pager .previous > span {
|
4416 |
+
float: left;
|
4417 |
+
}
|
4418 |
+
.pager .disabled > a,
|
4419 |
+
.pager .disabled > a:hover,
|
4420 |
+
.pager .disabled > a:focus,
|
4421 |
+
.pager .disabled > span {
|
4422 |
+
color: #777777;
|
4423 |
+
background-color: #ffffff;
|
4424 |
+
cursor: not-allowed;
|
4425 |
+
}
|
4426 |
+
.label {
|
4427 |
+
display: inline;
|
4428 |
+
padding: .2em .6em .3em;
|
4429 |
+
font-size: 75%;
|
4430 |
+
font-weight: bold;
|
4431 |
+
line-height: 1;
|
4432 |
+
color: #ffffff;
|
4433 |
+
text-align: center;
|
4434 |
+
white-space: nowrap;
|
4435 |
+
vertical-align: baseline;
|
4436 |
+
border-radius: .25em;
|
4437 |
+
}
|
4438 |
+
a.label:hover,
|
4439 |
+
a.label:focus {
|
4440 |
+
color: #ffffff;
|
4441 |
+
text-decoration: none;
|
4442 |
+
cursor: pointer;
|
4443 |
+
}
|
4444 |
+
.label:empty {
|
4445 |
+
display: none;
|
4446 |
+
}
|
4447 |
+
.btn .label {
|
4448 |
+
position: relative;
|
4449 |
+
top: -1px;
|
4450 |
+
}
|
4451 |
+
.label-default {
|
4452 |
+
background-color: #777777;
|
4453 |
+
}
|
4454 |
+
.label-default[href]:hover,
|
4455 |
+
.label-default[href]:focus {
|
4456 |
+
background-color: #5e5e5e;
|
4457 |
+
}
|
4458 |
+
.label-primary {
|
4459 |
+
background-color: #428bca;
|
4460 |
+
}
|
4461 |
+
.label-primary[href]:hover,
|
4462 |
+
.label-primary[href]:focus {
|
4463 |
+
background-color: #3071a9;
|
4464 |
+
}
|
4465 |
+
.label-success {
|
4466 |
+
background-color: #5cb85c;
|
4467 |
+
}
|
4468 |
+
.label-success[href]:hover,
|
4469 |
+
.label-success[href]:focus {
|
4470 |
+
background-color: #449d44;
|
4471 |
+
}
|
4472 |
+
.label-info {
|
4473 |
+
background-color: #5bc0de;
|
4474 |
+
}
|
4475 |
+
.label-info[href]:hover,
|
4476 |
+
.label-info[href]:focus {
|
4477 |
+
background-color: #31b0d5;
|
4478 |
+
}
|
4479 |
+
.label-warning {
|
4480 |
+
background-color: #f0ad4e;
|
4481 |
+
}
|
4482 |
+
.label-warning[href]:hover,
|
4483 |
+
.label-warning[href]:focus {
|
4484 |
+
background-color: #ec971f;
|
4485 |
+
}
|
4486 |
+
.label-danger {
|
4487 |
+
background-color: #d9534f;
|
4488 |
+
}
|
4489 |
+
.label-danger[href]:hover,
|
4490 |
+
.label-danger[href]:focus {
|
4491 |
+
background-color: #c9302c;
|
4492 |
+
}
|
4493 |
+
.badge {
|
4494 |
+
display: inline-block;
|
4495 |
+
min-width: 10px;
|
4496 |
+
padding: 3px 7px;
|
4497 |
+
font-size: 12px;
|
4498 |
+
font-weight: bold;
|
4499 |
+
color: #ffffff;
|
4500 |
+
line-height: 1;
|
4501 |
+
vertical-align: baseline;
|
4502 |
+
white-space: nowrap;
|
4503 |
+
text-align: center;
|
4504 |
+
background-color: #777777;
|
4505 |
+
border-radius: 10px;
|
4506 |
+
}
|
4507 |
+
.badge:empty {
|
4508 |
+
display: none;
|
4509 |
+
}
|
4510 |
+
.btn .badge {
|
4511 |
+
position: relative;
|
4512 |
+
top: -1px;
|
4513 |
+
}
|
4514 |
+
.btn-xs .badge {
|
4515 |
+
top: 0;
|
4516 |
+
padding: 1px 5px;
|
4517 |
+
}
|
4518 |
+
a.badge:hover,
|
4519 |
+
a.badge:focus {
|
4520 |
+
color: #ffffff;
|
4521 |
+
text-decoration: none;
|
4522 |
+
cursor: pointer;
|
4523 |
+
}
|
4524 |
+
a.list-group-item.active > .badge,
|
4525 |
+
.nav-pills > .active > a > .badge {
|
4526 |
+
color: #428bca;
|
4527 |
+
background-color: #ffffff;
|
4528 |
+
}
|
4529 |
+
.nav-pills > li > a > .badge {
|
4530 |
+
margin-left: 3px;
|
4531 |
+
}
|
4532 |
+
.jumbotron {
|
4533 |
+
padding: 30px;
|
4534 |
+
margin-bottom: 30px;
|
4535 |
+
color: inherit;
|
4536 |
+
background-color: #eeeeee;
|
4537 |
+
}
|
4538 |
+
.jumbotron h1,
|
4539 |
+
.jumbotron .h1 {
|
4540 |
+
color: inherit;
|
4541 |
+
}
|
4542 |
+
.jumbotron p {
|
4543 |
+
margin-bottom: 15px;
|
4544 |
+
font-size: 21px;
|
4545 |
+
font-weight: 200;
|
4546 |
+
}
|
4547 |
+
.jumbotron > hr {
|
4548 |
+
border-top-color: #d5d5d5;
|
4549 |
+
}
|
4550 |
+
.container .jumbotron {
|
4551 |
+
border-radius: 6px;
|
4552 |
+
}
|
4553 |
+
.jumbotron .container {
|
4554 |
+
max-width: 100%;
|
4555 |
+
}
|
4556 |
+
@media screen and (min-width: 768px) {
|
4557 |
+
.jumbotron {
|
4558 |
+
padding-top: 48px;
|
4559 |
+
padding-bottom: 48px;
|
4560 |
+
}
|
4561 |
+
.container .jumbotron {
|
4562 |
+
padding-left: 60px;
|
4563 |
+
padding-right: 60px;
|
4564 |
+
}
|
4565 |
+
.jumbotron h1,
|
4566 |
+
.jumbotron .h1 {
|
4567 |
+
font-size: 63px;
|
4568 |
+
}
|
4569 |
+
}
|
4570 |
+
.thumbnail {
|
4571 |
+
display: block;
|
4572 |
+
padding: 4px;
|
4573 |
+
margin-bottom: 20px;
|
4574 |
+
line-height: 1.42857143;
|
4575 |
+
background-color: #ffffff;
|
4576 |
+
border: 1px solid #dddddd;
|
4577 |
+
border-radius: 4px;
|
4578 |
+
-webkit-transition: all 0.2s ease-in-out;
|
4579 |
+
-o-transition: all 0.2s ease-in-out;
|
4580 |
+
transition: all 0.2s ease-in-out;
|
4581 |
+
}
|
4582 |
+
.thumbnail > img,
|
4583 |
+
.thumbnail a > img {
|
4584 |
+
margin-left: auto;
|
4585 |
+
margin-right: auto;
|
4586 |
+
}
|
4587 |
+
a.thumbnail:hover,
|
4588 |
+
a.thumbnail:focus,
|
4589 |
+
a.thumbnail.active {
|
4590 |
+
border-color: #428bca;
|
4591 |
+
}
|
4592 |
+
.thumbnail .caption {
|
4593 |
+
padding: 9px;
|
4594 |
+
color: #333333;
|
4595 |
+
}
|
4596 |
+
.alert {
|
4597 |
+
padding: 15px;
|
4598 |
+
margin-bottom: 20px;
|
4599 |
+
border: 1px solid transparent;
|
4600 |
+
border-radius: 4px;
|
4601 |
+
}
|
4602 |
+
.alert h4 {
|
4603 |
+
margin-top: 0;
|
4604 |
+
color: inherit;
|
4605 |
+
}
|
4606 |
+
.alert .alert-link {
|
4607 |
+
font-weight: bold;
|
4608 |
+
}
|
4609 |
+
.alert > p,
|
4610 |
+
.alert > ul {
|
4611 |
+
margin-bottom: 0;
|
4612 |
+
}
|
4613 |
+
.alert > p + p {
|
4614 |
+
margin-top: 5px;
|
4615 |
+
}
|
4616 |
+
.alert-dismissable,
|
4617 |
+
.alert-dismissible {
|
4618 |
+
padding-right: 35px;
|
4619 |
+
}
|
4620 |
+
.alert-dismissable .close,
|
4621 |
+
.alert-dismissible .close {
|
4622 |
+
position: relative;
|
4623 |
+
top: -2px;
|
4624 |
+
right: -21px;
|
4625 |
+
color: inherit;
|
4626 |
+
}
|
4627 |
+
.alert-success {
|
4628 |
+
background-color: #dff0d8;
|
4629 |
+
border-color: #d6e9c6;
|
4630 |
+
color: #3c763d;
|
4631 |
+
}
|
4632 |
+
.alert-success hr {
|
4633 |
+
border-top-color: #c9e2b3;
|
4634 |
+
}
|
4635 |
+
.alert-success .alert-link {
|
4636 |
+
color: #2b542c;
|
4637 |
+
}
|
4638 |
+
.alert-info {
|
4639 |
+
background-color: #d9edf7;
|
4640 |
+
border-color: #bce8f1;
|
4641 |
+
color: #31708f;
|
4642 |
+
}
|
4643 |
+
.alert-info hr {
|
4644 |
+
border-top-color: #a6e1ec;
|
4645 |
+
}
|
4646 |
+
.alert-info .alert-link {
|
4647 |
+
color: #245269;
|
4648 |
+
}
|
4649 |
+
.alert-warning {
|
4650 |
+
background-color: #fcf8e3;
|
4651 |
+
border-color: #faebcc;
|
4652 |
+
color: #8a6d3b;
|
4653 |
+
}
|
4654 |
+
.alert-warning hr {
|
4655 |
+
border-top-color: #f7e1b5;
|
4656 |
+
}
|
4657 |
+
.alert-warning .alert-link {
|
4658 |
+
color: #66512c;
|
4659 |
+
}
|
4660 |
+
.alert-danger {
|
4661 |
+
background-color: #f2dede;
|
4662 |
+
border-color: #ebccd1;
|
4663 |
+
color: #a94442;
|
4664 |
+
}
|
4665 |
+
.alert-danger hr {
|
4666 |
+
border-top-color: #e4b9c0;
|
4667 |
+
}
|
4668 |
+
.alert-danger .alert-link {
|
4669 |
+
color: #843534;
|
4670 |
+
}
|
4671 |
+
@-webkit-keyframes progress-bar-stripes {
|
4672 |
+
from {
|
4673 |
+
background-position: 40px 0;
|
4674 |
+
}
|
4675 |
+
to {
|
4676 |
+
background-position: 0 0;
|
4677 |
+
}
|
4678 |
+
}
|
4679 |
+
@keyframes progress-bar-stripes {
|
4680 |
+
from {
|
4681 |
+
background-position: 40px 0;
|
4682 |
+
}
|
4683 |
+
to {
|
4684 |
+
background-position: 0 0;
|
4685 |
+
}
|
4686 |
+
}
|
4687 |
+
.progress {
|
4688 |
+
overflow: hidden;
|
4689 |
+
height: 20px;
|
4690 |
+
margin-bottom: 20px;
|
4691 |
+
background-color: #f5f5f5;
|
4692 |
+
border-radius: 4px;
|
4693 |
+
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
4694 |
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
|
4695 |
+
}
|
4696 |
+
.progress-bar {
|
4697 |
+
float: left;
|
4698 |
+
width: 0%;
|
4699 |
+
height: 100%;
|
4700 |
+
font-size: 12px;
|
4701 |
+
line-height: 20px;
|
4702 |
+
color: #ffffff;
|
4703 |
+
text-align: center;
|
4704 |
+
background-color: #428bca;
|
4705 |
+
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
4706 |
+
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
4707 |
+
-webkit-transition: width 0.6s ease;
|
4708 |
+
-o-transition: width 0.6s ease;
|
4709 |
+
transition: width 0.6s ease;
|
4710 |
+
}
|
4711 |
+
.progress-striped .progress-bar,
|
4712 |
+
.progress-bar-striped {
|
4713 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4714 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4715 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4716 |
+
background-size: 40px 40px;
|
4717 |
+
}
|
4718 |
+
.progress.active .progress-bar,
|
4719 |
+
.progress-bar.active {
|
4720 |
+
-webkit-animation: progress-bar-stripes 2s linear infinite;
|
4721 |
+
-o-animation: progress-bar-stripes 2s linear infinite;
|
4722 |
+
animation: progress-bar-stripes 2s linear infinite;
|
4723 |
+
}
|
4724 |
+
.progress-bar[aria-valuenow="1"],
|
4725 |
+
.progress-bar[aria-valuenow="2"] {
|
4726 |
+
min-width: 30px;
|
4727 |
+
}
|
4728 |
+
.progress-bar[aria-valuenow="0"] {
|
4729 |
+
color: #777777;
|
4730 |
+
min-width: 30px;
|
4731 |
+
background-color: transparent;
|
4732 |
+
background-image: none;
|
4733 |
+
box-shadow: none;
|
4734 |
+
}
|
4735 |
+
.progress-bar-success {
|
4736 |
+
background-color: #5cb85c;
|
4737 |
+
}
|
4738 |
+
.progress-striped .progress-bar-success {
|
4739 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4740 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4741 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4742 |
+
}
|
4743 |
+
.progress-bar-info {
|
4744 |
+
background-color: #5bc0de;
|
4745 |
+
}
|
4746 |
+
.progress-striped .progress-bar-info {
|
4747 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4748 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4749 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4750 |
+
}
|
4751 |
+
.progress-bar-warning {
|
4752 |
+
background-color: #f0ad4e;
|
4753 |
+
}
|
4754 |
+
.progress-striped .progress-bar-warning {
|
4755 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4756 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4757 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4758 |
+
}
|
4759 |
+
.progress-bar-danger {
|
4760 |
+
background-color: #d9534f;
|
4761 |
+
}
|
4762 |
+
.progress-striped .progress-bar-danger {
|
4763 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4764 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4765 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
|
4766 |
+
}
|
4767 |
+
.media,
|
4768 |
+
.media-body {
|
4769 |
+
overflow: hidden;
|
4770 |
+
zoom: 1;
|
4771 |
+
}
|
4772 |
+
.media,
|
4773 |
+
.media .media {
|
4774 |
+
margin-top: 15px;
|
4775 |
+
}
|
4776 |
+
.media:first-child {
|
4777 |
+
margin-top: 0;
|
4778 |
+
}
|
4779 |
+
.media-object {
|
4780 |
+
display: block;
|
4781 |
+
}
|
4782 |
+
.media-heading {
|
4783 |
+
margin: 0 0 5px;
|
4784 |
+
}
|
4785 |
+
.media > .pull-left {
|
4786 |
+
margin-right: 10px;
|
4787 |
+
}
|
4788 |
+
.media > .pull-right {
|
4789 |
+
margin-left: 10px;
|
4790 |
+
}
|
4791 |
+
.media-list {
|
4792 |
+
padding-left: 0;
|
4793 |
+
list-style: none;
|
4794 |
+
}
|
4795 |
+
.list-group {
|
4796 |
+
margin-bottom: 20px;
|
4797 |
+
padding-left: 0;
|
4798 |
+
}
|
4799 |
+
.list-group-item {
|
4800 |
+
position: relative;
|
4801 |
+
display: block;
|
4802 |
+
padding: 10px 15px;
|
4803 |
+
margin-bottom: -1px;
|
4804 |
+
background-color: #ffffff;
|
4805 |
+
border: 1px solid #dddddd;
|
4806 |
+
}
|
4807 |
+
.list-group-item:first-child {
|
4808 |
+
border-top-right-radius: 4px;
|
4809 |
+
border-top-left-radius: 4px;
|
4810 |
+
}
|
4811 |
+
.list-group-item:last-child {
|
4812 |
+
margin-bottom: 0;
|
4813 |
+
border-bottom-right-radius: 4px;
|
4814 |
+
border-bottom-left-radius: 4px;
|
4815 |
+
}
|
4816 |
+
.list-group-item > .badge {
|
4817 |
+
float: right;
|
4818 |
+
}
|
4819 |
+
.list-group-item > .badge + .badge {
|
4820 |
+
margin-right: 5px;
|
4821 |
+
}
|
4822 |
+
a.list-group-item {
|
4823 |
+
color: #555555;
|
4824 |
+
}
|
4825 |
+
a.list-group-item .list-group-item-heading {
|
4826 |
+
color: #333333;
|
4827 |
+
}
|
4828 |
+
a.list-group-item:hover,
|
4829 |
+
a.list-group-item:focus {
|
4830 |
+
text-decoration: none;
|
4831 |
+
color: #555555;
|
4832 |
+
background-color: #f5f5f5;
|
4833 |
+
}
|
4834 |
+
.list-group-item.disabled,
|
4835 |
+
.list-group-item.disabled:hover,
|
4836 |
+
.list-group-item.disabled:focus {
|
4837 |
+
background-color: #eeeeee;
|
4838 |
+
color: #777777;
|
4839 |
+
}
|
4840 |
+
.list-group-item.disabled .list-group-item-heading,
|
4841 |
+
.list-group-item.disabled:hover .list-group-item-heading,
|
4842 |
+
.list-group-item.disabled:focus .list-group-item-heading {
|
4843 |
+
color: inherit;
|
4844 |
+
}
|
4845 |
+
.list-group-item.disabled .list-group-item-text,
|
4846 |
+
.list-group-item.disabled:hover .list-group-item-text,
|
4847 |
+
.list-group-item.disabled:focus .list-group-item-text {
|
4848 |
+
color: #777777;
|
4849 |
+
}
|
4850 |
+
.list-group-item.active,
|
4851 |
+
.list-group-item.active:hover,
|
4852 |
+
.list-group-item.active:focus {
|
4853 |
+
z-index: 2;
|
4854 |
+
color: #ffffff;
|
4855 |
+
background-color: #428bca;
|
4856 |
+
border-color: #428bca;
|
4857 |
+
}
|
4858 |
+
.list-group-item.active .list-group-item-heading,
|
4859 |
+
.list-group-item.active:hover .list-group-item-heading,
|
4860 |
+
.list-group-item.active:focus .list-group-item-heading,
|
4861 |
+
.list-group-item.active .list-group-item-heading > small,
|
4862 |
+
.list-group-item.active:hover .list-group-item-heading > small,
|
4863 |
+
.list-group-item.active:focus .list-group-item-heading > small,
|
4864 |
+
.list-group-item.active .list-group-item-heading > .small,
|
4865 |
+
.list-group-item.active:hover .list-group-item-heading > .small,
|
4866 |
+
.list-group-item.active:focus .list-group-item-heading > .small {
|
4867 |
+
color: inherit;
|
4868 |
+
}
|
4869 |
+
.list-group-item.active .list-group-item-text,
|
4870 |
+
.list-group-item.active:hover .list-group-item-text,
|
4871 |
+
.list-group-item.active:focus .list-group-item-text {
|
4872 |
+
color: #e1edf7;
|
4873 |
+
}
|
4874 |
+
.list-group-item-success {
|
4875 |
+
color: #3c763d;
|
4876 |
+
background-color: #dff0d8;
|
4877 |
+
}
|
4878 |
+
a.list-group-item-success {
|
4879 |
+
color: #3c763d;
|
4880 |
+
}
|
4881 |
+
a.list-group-item-success .list-group-item-heading {
|
4882 |
+
color: inherit;
|
4883 |
+
}
|
4884 |
+
a.list-group-item-success:hover,
|
4885 |
+
a.list-group-item-success:focus {
|
4886 |
+
color: #3c763d;
|
4887 |
+
background-color: #d0e9c6;
|
4888 |
+
}
|
4889 |
+
a.list-group-item-success.active,
|
4890 |
+
a.list-group-item-success.active:hover,
|
4891 |
+
a.list-group-item-success.active:focus {
|
4892 |
+
color: #fff;
|
4893 |
+
background-color: #3c763d;
|
4894 |
+
border-color: #3c763d;
|
4895 |
+
}
|
4896 |
+
.list-group-item-info {
|
4897 |
+
color: #31708f;
|
4898 |
+
background-color: #d9edf7;
|
4899 |
+
}
|
4900 |
+
a.list-group-item-info {
|
4901 |
+
color: #31708f;
|
4902 |
+
}
|
4903 |
+
a.list-group-item-info .list-group-item-heading {
|
4904 |
+
color: inherit;
|
4905 |
+
}
|
4906 |
+
a.list-group-item-info:hover,
|
4907 |
+
a.list-group-item-info:focus {
|
4908 |
+
color: #31708f;
|
4909 |
+
background-color: #c4e3f3;
|
4910 |
+
}
|
4911 |
+
a.list-group-item-info.active,
|
4912 |
+
a.list-group-item-info.active:hover,
|
4913 |
+
a.list-group-item-info.active:focus {
|
4914 |
+
color: #fff;
|
4915 |
+
background-color: #31708f;
|
4916 |
+
border-color: #31708f;
|
4917 |
+
}
|
4918 |
+
.list-group-item-warning {
|
4919 |
+
color: #8a6d3b;
|
4920 |
+
background-color: #fcf8e3;
|
4921 |
+
}
|
4922 |
+
a.list-group-item-warning {
|
4923 |
+
color: #8a6d3b;
|
4924 |
+
}
|
4925 |
+
a.list-group-item-warning .list-group-item-heading {
|
4926 |
+
color: inherit;
|
4927 |
+
}
|
4928 |
+
a.list-group-item-warning:hover,
|
4929 |
+
a.list-group-item-warning:focus {
|
4930 |
+
color: #8a6d3b;
|
4931 |
+
background-color: #faf2cc;
|
4932 |
+
}
|
4933 |
+
a.list-group-item-warning.active,
|
4934 |
+
a.list-group-item-warning.active:hover,
|
4935 |
+
a.list-group-item-warning.active:focus {
|
4936 |
+
color: #fff;
|
4937 |
+
background-color: #8a6d3b;
|
4938 |
+
border-color: #8a6d3b;
|
4939 |
+
}
|
4940 |
+
.list-group-item-danger {
|
4941 |
+
color: #a94442;
|
4942 |
+
background-color: #f2dede;
|
4943 |
+
}
|
4944 |
+
a.list-group-item-danger {
|
4945 |
+
color: #a94442;
|
4946 |
+
}
|
4947 |
+
a.list-group-item-danger .list-group-item-heading {
|
4948 |
+
color: inherit;
|
4949 |
+
}
|
4950 |
+
a.list-group-item-danger:hover,
|
4951 |
+
a.list-group-item-danger:focus {
|
4952 |
+
color: #a94442;
|
4953 |
+
background-color: #ebcccc;
|
4954 |
+
}
|
4955 |
+
a.list-group-item-danger.active,
|
4956 |
+
a.list-group-item-danger.active:hover,
|
4957 |
+
a.list-group-item-danger.active:focus {
|
4958 |
+
color: #fff;
|
4959 |
+
background-color: #a94442;
|
4960 |
+
border-color: #a94442;
|
4961 |
+
}
|
4962 |
+
.list-group-item-heading {
|
4963 |
+
margin-top: 0;
|
4964 |
+
margin-bottom: 5px;
|
4965 |
+
}
|
4966 |
+
.list-group-item-text {
|
4967 |
+
margin-bottom: 0;
|
4968 |
+
line-height: 1.3;
|
4969 |
+
}
|
4970 |
+
.panel {
|
4971 |
+
margin-bottom: 20px;
|
4972 |
+
background-color: #ffffff;
|
4973 |
+
border: 1px solid transparent;
|
4974 |
+
border-radius: 4px;
|
4975 |
+
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
|
4976 |
+
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
|
4977 |
+
}
|
4978 |
+
.panel-body {
|
4979 |
+
padding: 15px;
|
4980 |
+
}
|
4981 |
+
.panel-heading {
|
4982 |
+
padding: 10px 15px;
|
4983 |
+
border-bottom: 1px solid transparent;
|
4984 |
+
border-top-right-radius: 3px;
|
4985 |
+
border-top-left-radius: 3px;
|
4986 |
+
}
|
4987 |
+
.panel-heading > .dropdown .dropdown-toggle {
|
4988 |
+
color: inherit;
|
4989 |
+
}
|
4990 |
+
.panel-title {
|
4991 |
+
margin-top: 0;
|
4992 |
+
margin-bottom: 0;
|
4993 |
+
font-size: 16px;
|
4994 |
+
color: inherit;
|
4995 |
+
}
|
4996 |
+
.panel-title > a {
|
4997 |
+
color: inherit;
|
4998 |
+
}
|
4999 |
+
.panel-footer {
|
5000 |
+
padding: 10px 15px;
|
5001 |
+
background-color: #f5f5f5;
|
5002 |
+
border-top: 1px solid #dddddd;
|
5003 |
+
border-bottom-right-radius: 3px;
|
5004 |
+
border-bottom-left-radius: 3px;
|
5005 |
+
}
|
5006 |
+
.panel > .list-group {
|
5007 |
+
margin-bottom: 0;
|
5008 |
+
}
|
5009 |
+
.panel > .list-group .list-group-item {
|
5010 |
+
border-width: 1px 0;
|
5011 |
+
border-radius: 0;
|
5012 |
+
}
|
5013 |
+
.panel > .list-group:first-child .list-group-item:first-child {
|
5014 |
+
border-top: 0;
|
5015 |
+
border-top-right-radius: 3px;
|
5016 |
+
border-top-left-radius: 3px;
|
5017 |
+
}
|
5018 |
+
.panel > .list-group:last-child .list-group-item:last-child {
|
5019 |
+
border-bottom: 0;
|
5020 |
+
border-bottom-right-radius: 3px;
|
5021 |
+
border-bottom-left-radius: 3px;
|
5022 |
+
}
|
5023 |
+
.panel-heading + .list-group .list-group-item:first-child {
|
5024 |
+
border-top-width: 0;
|
5025 |
+
}
|
5026 |
+
.list-group + .panel-footer {
|
5027 |
+
border-top-width: 0;
|
5028 |
+
}
|
5029 |
+
.panel > .table,
|
5030 |
+
.panel > .table-responsive > .table,
|
5031 |
+
.panel > .panel-collapse > .table {
|
5032 |
+
margin-bottom: 0;
|
5033 |
+
}
|
5034 |
+
.panel > .table:first-child,
|
5035 |
+
.panel > .table-responsive:first-child > .table:first-child {
|
5036 |
+
border-top-right-radius: 3px;
|
5037 |
+
border-top-left-radius: 3px;
|
5038 |
+
}
|
5039 |
+
.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
|
5040 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
|
5041 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
|
5042 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
|
5043 |
+
.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
|
5044 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
|
5045 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
|
5046 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
|
5047 |
+
border-top-left-radius: 3px;
|
5048 |
+
}
|
5049 |
+
.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
|
5050 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
|
5051 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
|
5052 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
|
5053 |
+
.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
|
5054 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
|
5055 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
|
5056 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
|
5057 |
+
border-top-right-radius: 3px;
|
5058 |
+
}
|
5059 |
+
.panel > .table:last-child,
|
5060 |
+
.panel > .table-responsive:last-child > .table:last-child {
|
5061 |
+
border-bottom-right-radius: 3px;
|
5062 |
+
border-bottom-left-radius: 3px;
|
5063 |
+
}
|
5064 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
|
5065 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
|
5066 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
|
5067 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
|
5068 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
|
5069 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
|
5070 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
|
5071 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
|
5072 |
+
border-bottom-left-radius: 3px;
|
5073 |
+
}
|
5074 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
|
5075 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
|
5076 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
|
5077 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
|
5078 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
|
5079 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
|
5080 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
|
5081 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
|
5082 |
+
border-bottom-right-radius: 3px;
|
5083 |
+
}
|
5084 |
+
.panel > .panel-body + .table,
|
5085 |
+
.panel > .panel-body + .table-responsive {
|
5086 |
+
border-top: 1px solid #dddddd;
|
5087 |
+
}
|
5088 |
+
.panel > .table > tbody:first-child > tr:first-child th,
|
5089 |
+
.panel > .table > tbody:first-child > tr:first-child td {
|
5090 |
+
border-top: 0;
|
5091 |
+
}
|
5092 |
+
.panel > .table-bordered,
|
5093 |
+
.panel > .table-responsive > .table-bordered {
|
5094 |
+
border: 0;
|
5095 |
+
}
|
5096 |
+
.panel > .table-bordered > thead > tr > th:first-child,
|
5097 |
+
.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
|
5098 |
+
.panel > .table-bordered > tbody > tr > th:first-child,
|
5099 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
|
5100 |
+
.panel > .table-bordered > tfoot > tr > th:first-child,
|
5101 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
|
5102 |
+
.panel > .table-bordered > thead > tr > td:first-child,
|
5103 |
+
.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
|
5104 |
+
.panel > .table-bordered > tbody > tr > td:first-child,
|
5105 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
|
5106 |
+
.panel > .table-bordered > tfoot > tr > td:first-child,
|
5107 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
|
5108 |
+
border-left: 0;
|
5109 |
+
}
|
5110 |
+
.panel > .table-bordered > thead > tr > th:last-child,
|
5111 |
+
.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
|
5112 |
+
.panel > .table-bordered > tbody > tr > th:last-child,
|
5113 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
|
5114 |
+
.panel > .table-bordered > tfoot > tr > th:last-child,
|
5115 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
|
5116 |
+
.panel > .table-bordered > thead > tr > td:last-child,
|
5117 |
+
.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
|
5118 |
+
.panel > .table-bordered > tbody > tr > td:last-child,
|
5119 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
|
5120 |
+
.panel > .table-bordered > tfoot > tr > td:last-child,
|
5121 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
|
5122 |
+
border-right: 0;
|
5123 |
+
}
|
5124 |
+
.panel > .table-bordered > thead > tr:first-child > td,
|
5125 |
+
.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
|
5126 |
+
.panel > .table-bordered > tbody > tr:first-child > td,
|
5127 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
|
5128 |
+
.panel > .table-bordered > thead > tr:first-child > th,
|
5129 |
+
.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
|
5130 |
+
.panel > .table-bordered > tbody > tr:first-child > th,
|
5131 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
|
5132 |
+
border-bottom: 0;
|
5133 |
+
}
|
5134 |
+
.panel > .table-bordered > tbody > tr:last-child > td,
|
5135 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
|
5136 |
+
.panel > .table-bordered > tfoot > tr:last-child > td,
|
5137 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
|
5138 |
+
.panel > .table-bordered > tbody > tr:last-child > th,
|
5139 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
|
5140 |
+
.panel > .table-bordered > tfoot > tr:last-child > th,
|
5141 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
|
5142 |
+
border-bottom: 0;
|
5143 |
+
}
|
5144 |
+
.panel > .table-responsive {
|
5145 |
+
border: 0;
|
5146 |
+
margin-bottom: 0;
|
5147 |
+
}
|
5148 |
+
.panel-group {
|
5149 |
+
margin-bottom: 20px;
|
5150 |
+
}
|
5151 |
+
.panel-group .panel {
|
5152 |
+
margin-bottom: 0;
|
5153 |
+
border-radius: 4px;
|
5154 |
+
}
|
5155 |
+
.panel-group .panel + .panel {
|
5156 |
+
margin-top: 5px;
|
5157 |
+
}
|
5158 |
+
.panel-group .panel-heading {
|
5159 |
+
border-bottom: 0;
|
5160 |
+
}
|
5161 |
+
.panel-group .panel-heading + .panel-collapse > .panel-body {
|
5162 |
+
border-top: 1px solid #dddddd;
|
5163 |
+
}
|
5164 |
+
.panel-group .panel-footer {
|
5165 |
+
border-top: 0;
|
5166 |
+
}
|
5167 |
+
.panel-group .panel-footer + .panel-collapse .panel-body {
|
5168 |
+
border-bottom: 1px solid #dddddd;
|
5169 |
+
}
|
5170 |
+
.panel-default {
|
5171 |
+
border-color: #dddddd;
|
5172 |
+
}
|
5173 |
+
.panel-default > .panel-heading {
|
5174 |
+
color: #333333;
|
5175 |
+
background-color: #f5f5f5;
|
5176 |
+
border-color: #dddddd;
|
5177 |
+
}
|
5178 |
+
.panel-default > .panel-heading + .panel-collapse > .panel-body {
|
5179 |
+
border-top-color: #dddddd;
|
5180 |
+
}
|
5181 |
+
.panel-default > .panel-heading .badge {
|
5182 |
+
color: #f5f5f5;
|
5183 |
+
background-color: #333333;
|
5184 |
+
}
|
5185 |
+
.panel-default > .panel-footer + .panel-collapse > .panel-body {
|
5186 |
+
border-bottom-color: #dddddd;
|
5187 |
+
}
|
5188 |
+
.panel-primary {
|
5189 |
+
border-color: #428bca;
|
5190 |
+
}
|
5191 |
+
.panel-primary > .panel-heading {
|
5192 |
+
color: #ffffff;
|
5193 |
+
background-color: #428bca;
|
5194 |
+
border-color: #428bca;
|
5195 |
+
}
|
5196 |
+
.panel-primary > .panel-heading + .panel-collapse > .panel-body {
|
5197 |
+
border-top-color: #428bca;
|
5198 |
+
}
|
5199 |
+
.panel-primary > .panel-heading .badge {
|
5200 |
+
color: #428bca;
|
5201 |
+
background-color: #ffffff;
|
5202 |
+
}
|
5203 |
+
.panel-primary > .panel-footer + .panel-collapse > .panel-body {
|
5204 |
+
border-bottom-color: #428bca;
|
5205 |
+
}
|
5206 |
+
.panel-success {
|
5207 |
+
border-color: #d6e9c6;
|
5208 |
+
}
|
5209 |
+
.panel-success > .panel-heading {
|
5210 |
+
color: #3c763d;
|
5211 |
+
background-color: #dff0d8;
|
5212 |
+
border-color: #d6e9c6;
|
5213 |
+
}
|
5214 |
+
.panel-success > .panel-heading + .panel-collapse > .panel-body {
|
5215 |
+
border-top-color: #d6e9c6;
|
5216 |
+
}
|
5217 |
+
.panel-success > .panel-heading .badge {
|
5218 |
+
color: #dff0d8;
|
5219 |
+
background-color: #3c763d;
|
5220 |
+
}
|
5221 |
+
.panel-success > .panel-footer + .panel-collapse > .panel-body {
|
5222 |
+
border-bottom-color: #d6e9c6;
|
5223 |
+
}
|
5224 |
+
.panel-info {
|
5225 |
+
border-color: #bce8f1;
|
5226 |
+
}
|
5227 |
+
.panel-info > .panel-heading {
|
5228 |
+
color: #31708f;
|
5229 |
+
background-color: #d9edf7;
|
5230 |
+
border-color: #bce8f1;
|
5231 |
+
}
|
5232 |
+
.panel-info > .panel-heading + .panel-collapse > .panel-body {
|
5233 |
+
border-top-color: #bce8f1;
|
5234 |
+
}
|
5235 |
+
.panel-info > .panel-heading .badge {
|
5236 |
+
color: #d9edf7;
|
5237 |
+
background-color: #31708f;
|
5238 |
+
}
|
5239 |
+
.panel-info > .panel-footer + .panel-collapse > .panel-body {
|
5240 |
+
border-bottom-color: #bce8f1;
|
5241 |
+
}
|
5242 |
+
.panel-warning {
|
5243 |
+
border-color: #faebcc;
|
5244 |
+
}
|
5245 |
+
.panel-warning > .panel-heading {
|
5246 |
+
color: #8a6d3b;
|
5247 |
+
background-color: #fcf8e3;
|
5248 |
+
border-color: #faebcc;
|
5249 |
+
}
|
5250 |
+
.panel-warning > .panel-heading + .panel-collapse > .panel-body {
|
5251 |
+
border-top-color: #faebcc;
|
5252 |
+
}
|
5253 |
+
.panel-warning > .panel-heading .badge {
|
5254 |
+
color: #fcf8e3;
|
5255 |
+
background-color: #8a6d3b;
|
5256 |
+
}
|
5257 |
+
.panel-warning > .panel-footer + .panel-collapse > .panel-body {
|
5258 |
+
border-bottom-color: #faebcc;
|
5259 |
+
}
|
5260 |
+
.panel-danger {
|
5261 |
+
border-color: #ebccd1;
|
5262 |
+
}
|
5263 |
+
.panel-danger > .panel-heading {
|
5264 |
+
color: #a94442;
|
5265 |
+
background-color: #f2dede;
|
5266 |
+
border-color: #ebccd1;
|
5267 |
+
}
|
5268 |
+
.panel-danger > .panel-heading + .panel-collapse > .panel-body {
|
5269 |
+
border-top-color: #ebccd1;
|
5270 |
+
}
|
5271 |
+
.panel-danger > .panel-heading .badge {
|
5272 |
+
color: #f2dede;
|
5273 |
+
background-color: #a94442;
|
5274 |
+
}
|
5275 |
+
.panel-danger > .panel-footer + .panel-collapse > .panel-body {
|
5276 |
+
border-bottom-color: #ebccd1;
|
5277 |
+
}
|
5278 |
+
.embed-responsive {
|
5279 |
+
position: relative;
|
5280 |
+
display: block;
|
5281 |
+
height: 0;
|
5282 |
+
padding: 0;
|
5283 |
+
overflow: hidden;
|
5284 |
+
}
|
5285 |
+
.embed-responsive .embed-responsive-item,
|
5286 |
+
.embed-responsive iframe,
|
5287 |
+
.embed-responsive embed,
|
5288 |
+
.embed-responsive object {
|
5289 |
+
position: absolute;
|
5290 |
+
top: 0;
|
5291 |
+
left: 0;
|
5292 |
+
bottom: 0;
|
5293 |
+
height: 100%;
|
5294 |
+
width: 100%;
|
5295 |
+
border: 0;
|
5296 |
+
}
|
5297 |
+
.embed-responsive.embed-responsive-16by9 {
|
5298 |
+
padding-bottom: 56.25%;
|
5299 |
+
}
|
5300 |
+
.embed-responsive.embed-responsive-4by3 {
|
5301 |
+
padding-bottom: 75%;
|
5302 |
+
}
|
5303 |
+
.well {
|
5304 |
+
min-height: 20px;
|
5305 |
+
padding: 19px;
|
5306 |
+
margin-bottom: 20px;
|
5307 |
+
background-color: #f5f5f5;
|
5308 |
+
border: 1px solid #e3e3e3;
|
5309 |
+
border-radius: 4px;
|
5310 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
|
5311 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
|
5312 |
+
}
|
5313 |
+
.well blockquote {
|
5314 |
+
border-color: #ddd;
|
5315 |
+
border-color: rgba(0, 0, 0, 0.15);
|
5316 |
+
}
|
5317 |
+
.well-lg {
|
5318 |
+
padding: 24px;
|
5319 |
+
border-radius: 6px;
|
5320 |
+
}
|
5321 |
+
.well-sm {
|
5322 |
+
padding: 9px;
|
5323 |
+
border-radius: 3px;
|
5324 |
+
}
|
5325 |
+
.close {
|
5326 |
+
float: right;
|
5327 |
+
font-size: 21px;
|
5328 |
+
font-weight: bold;
|
5329 |
+
line-height: 1;
|
5330 |
+
color: #000000;
|
5331 |
+
text-shadow: 0 1px 0 #ffffff;
|
5332 |
+
opacity: 0.2;
|
5333 |
+
filter: alpha(opacity=20);
|
5334 |
+
}
|
5335 |
+
.close:hover,
|
5336 |
+
.close:focus {
|
5337 |
+
color: #000000;
|
5338 |
+
text-decoration: none;
|
5339 |
+
cursor: pointer;
|
5340 |
+
opacity: 0.5;
|
5341 |
+
filter: alpha(opacity=50);
|
5342 |
+
}
|
5343 |
+
button.close {
|
5344 |
+
padding: 0;
|
5345 |
+
cursor: pointer;
|
5346 |
+
background: transparent;
|
5347 |
+
border: 0;
|
5348 |
+
-webkit-appearance: none;
|
5349 |
+
}
|
5350 |
+
.modal-open {
|
5351 |
+
overflow: hidden;
|
5352 |
+
}
|
5353 |
+
.modal {
|
5354 |
+
display: none;
|
5355 |
+
overflow: hidden;
|
5356 |
+
position: fixed;
|
5357 |
+
top: 0;
|
5358 |
+
right: 0;
|
5359 |
+
bottom: 0;
|
5360 |
+
left: 0;
|
5361 |
+
z-index: 1050;
|
5362 |
+
-webkit-overflow-scrolling: touch;
|
5363 |
+
outline: 0;
|
5364 |
+
}
|
5365 |
+
.modal.fade .modal-dialog {
|
5366 |
+
-webkit-transform: translate3d(0, -25%, 0);
|
5367 |
+
transform: translate3d(0, -25%, 0);
|
5368 |
+
-webkit-transition: -webkit-transform 0.3s ease-out;
|
5369 |
+
-moz-transition: -moz-transform 0.3s ease-out;
|
5370 |
+
-o-transition: -o-transform 0.3s ease-out;
|
5371 |
+
transition: transform 0.3s ease-out;
|
5372 |
+
}
|
5373 |
+
.modal.in .modal-dialog {
|
5374 |
+
-webkit-transform: translate3d(0, 0, 0);
|
5375 |
+
transform: translate3d(0, 0, 0);
|
5376 |
+
}
|
5377 |
+
.modal-open .modal {
|
5378 |
+
overflow-x: hidden;
|
5379 |
+
overflow-y: auto;
|
5380 |
+
}
|
5381 |
+
.modal-dialog {
|
5382 |
+
position: relative;
|
5383 |
+
width: auto;
|
5384 |
+
margin: 10px;
|
5385 |
+
}
|
5386 |
+
.modal-content {
|
5387 |
+
position: relative;
|
5388 |
+
background-color: #ffffff;
|
5389 |
+
border: 1px solid #999999;
|
5390 |
+
border: 1px solid rgba(0, 0, 0, 0.2);
|
5391 |
+
border-radius: 6px;
|
5392 |
+
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
|
5393 |
+
box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
|
5394 |
+
background-clip: padding-box;
|
5395 |
+
outline: 0;
|
5396 |
+
}
|
5397 |
+
.modal-backdrop {
|
5398 |
+
position: fixed;
|
5399 |
+
top: 0;
|
5400 |
+
right: 0;
|
5401 |
+
bottom: 0;
|
5402 |
+
left: 0;
|
5403 |
+
z-index: 1040;
|
5404 |
+
background-color: #000000;
|
5405 |
+
}
|
5406 |
+
.modal-backdrop.fade {
|
5407 |
+
opacity: 0;
|
5408 |
+
filter: alpha(opacity=0);
|
5409 |
+
}
|
5410 |
+
.modal-backdrop.in {
|
5411 |
+
opacity: 0.5;
|
5412 |
+
filter: alpha(opacity=50);
|
5413 |
+
}
|
5414 |
+
.modal-header {
|
5415 |
+
padding: 15px;
|
5416 |
+
border-bottom: 1px solid #e5e5e5;
|
5417 |
+
min-height: 16.42857143px;
|
5418 |
+
}
|
5419 |
+
.modal-header .close {
|
5420 |
+
margin-top: -2px;
|
5421 |
+
}
|
5422 |
+
.modal-title {
|
5423 |
+
margin: 0;
|
5424 |
+
line-height: 1.42857143;
|
5425 |
+
}
|
5426 |
+
.modal-body {
|
5427 |
+
position: relative;
|
5428 |
+
padding: 15px;
|
5429 |
+
}
|
5430 |
+
.modal-footer {
|
5431 |
+
padding: 15px;
|
5432 |
+
text-align: right;
|
5433 |
+
border-top: 1px solid #e5e5e5;
|
5434 |
+
}
|
5435 |
+
.modal-footer .btn + .btn {
|
5436 |
+
margin-left: 5px;
|
5437 |
+
margin-bottom: 0;
|
5438 |
+
}
|
5439 |
+
.modal-footer .btn-group .btn + .btn {
|
5440 |
+
margin-left: -1px;
|
5441 |
+
}
|
5442 |
+
.modal-footer .btn-block + .btn-block {
|
5443 |
+
margin-left: 0;
|
5444 |
+
}
|
5445 |
+
.modal-scrollbar-measure {
|
5446 |
+
position: absolute;
|
5447 |
+
top: -9999px;
|
5448 |
+
width: 50px;
|
5449 |
+
height: 50px;
|
5450 |
+
overflow: scroll;
|
5451 |
+
}
|
5452 |
+
@media (min-width: 768px) {
|
5453 |
+
.modal-dialog {
|
5454 |
+
width: 600px;
|
5455 |
+
margin: 30px auto;
|
5456 |
+
}
|
5457 |
+
.modal-content {
|
5458 |
+
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
|
5459 |
+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
|
5460 |
+
}
|
5461 |
+
.modal-sm {
|
5462 |
+
width: 300px;
|
5463 |
+
}
|
5464 |
+
}
|
5465 |
+
@media (min-width: 992px) {
|
5466 |
+
.modal-lg {
|
5467 |
+
width: 900px;
|
5468 |
+
}
|
5469 |
+
}
|
5470 |
+
.tooltip {
|
5471 |
+
position: absolute;
|
5472 |
+
z-index: 1070;
|
5473 |
+
display: block;
|
5474 |
+
visibility: visible;
|
5475 |
+
font-size: 12px;
|
5476 |
+
line-height: 1.4;
|
5477 |
+
opacity: 0;
|
5478 |
+
filter: alpha(opacity=0);
|
5479 |
+
}
|
5480 |
+
.tooltip.in {
|
5481 |
+
opacity: 0.9;
|
5482 |
+
filter: alpha(opacity=90);
|
5483 |
+
}
|
5484 |
+
.tooltip.top {
|
5485 |
+
margin-top: -3px;
|
5486 |
+
padding: 5px 0;
|
5487 |
+
}
|
5488 |
+
.tooltip.right {
|
5489 |
+
margin-left: 3px;
|
5490 |
+
padding: 0 5px;
|
5491 |
+
}
|
5492 |
+
.tooltip.bottom {
|
5493 |
+
margin-top: 3px;
|
5494 |
+
padding: 5px 0;
|
5495 |
+
}
|
5496 |
+
.tooltip.left {
|
5497 |
+
margin-left: -3px;
|
5498 |
+
padding: 0 5px;
|
5499 |
+
}
|
5500 |
+
.tooltip-inner {
|
5501 |
+
max-width: 200px;
|
5502 |
+
padding: 3px 8px;
|
5503 |
+
color: #ffffff;
|
5504 |
+
text-align: center;
|
5505 |
+
text-decoration: none;
|
5506 |
+
background-color: #000000;
|
5507 |
+
border-radius: 4px;
|
5508 |
+
}
|
5509 |
+
.tooltip-arrow {
|
5510 |
+
position: absolute;
|
5511 |
+
width: 0;
|
5512 |
+
height: 0;
|
5513 |
+
border-color: transparent;
|
5514 |
+
border-style: solid;
|
5515 |
+
}
|
5516 |
+
.tooltip.top .tooltip-arrow {
|
5517 |
+
bottom: 0;
|
5518 |
+
left: 50%;
|
5519 |
+
margin-left: -5px;
|
5520 |
+
border-width: 5px 5px 0;
|
5521 |
+
border-top-color: #000000;
|
5522 |
+
}
|
5523 |
+
.tooltip.top-left .tooltip-arrow {
|
5524 |
+
bottom: 0;
|
5525 |
+
left: 5px;
|
5526 |
+
border-width: 5px 5px 0;
|
5527 |
+
border-top-color: #000000;
|
5528 |
+
}
|
5529 |
+
.tooltip.top-right .tooltip-arrow {
|
5530 |
+
bottom: 0;
|
5531 |
+
right: 5px;
|
5532 |
+
border-width: 5px 5px 0;
|
5533 |
+
border-top-color: #000000;
|
5534 |
+
}
|
5535 |
+
.tooltip.right .tooltip-arrow {
|
5536 |
+
top: 50%;
|
5537 |
+
left: 0;
|
5538 |
+
margin-top: -5px;
|
5539 |
+
border-width: 5px 5px 5px 0;
|
5540 |
+
border-right-color: #000000;
|
5541 |
+
}
|
5542 |
+
.tooltip.left .tooltip-arrow {
|
5543 |
+
top: 50%;
|
5544 |
+
right: 0;
|
5545 |
+
margin-top: -5px;
|
5546 |
+
border-width: 5px 0 5px 5px;
|
5547 |
+
border-left-color: #000000;
|
5548 |
+
}
|
5549 |
+
.tooltip.bottom .tooltip-arrow {
|
5550 |
+
top: 0;
|
5551 |
+
left: 50%;
|
5552 |
+
margin-left: -5px;
|
5553 |
+
border-width: 0 5px 5px;
|
5554 |
+
border-bottom-color: #000000;
|
5555 |
+
}
|
5556 |
+
.tooltip.bottom-left .tooltip-arrow {
|
5557 |
+
top: 0;
|
5558 |
+
left: 5px;
|
5559 |
+
border-width: 0 5px 5px;
|
5560 |
+
border-bottom-color: #000000;
|
5561 |
+
}
|
5562 |
+
.tooltip.bottom-right .tooltip-arrow {
|
5563 |
+
top: 0;
|
5564 |
+
right: 5px;
|
5565 |
+
border-width: 0 5px 5px;
|
5566 |
+
border-bottom-color: #000000;
|
5567 |
+
}
|
5568 |
+
.popover {
|
5569 |
+
position: absolute;
|
5570 |
+
top: 0;
|
5571 |
+
left: 0;
|
5572 |
+
z-index: 1060;
|
5573 |
+
display: none;
|
5574 |
+
max-width: 276px;
|
5575 |
+
padding: 1px;
|
5576 |
+
text-align: left;
|
5577 |
+
background-color: #ffffff;
|
5578 |
+
background-clip: padding-box;
|
5579 |
+
border: 1px solid #cccccc;
|
5580 |
+
border: 1px solid rgba(0, 0, 0, 0.2);
|
5581 |
+
border-radius: 6px;
|
5582 |
+
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
5583 |
+
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
|
5584 |
+
white-space: normal;
|
5585 |
+
}
|
5586 |
+
.popover.top {
|
5587 |
+
margin-top: -10px;
|
5588 |
+
}
|
5589 |
+
.popover.right {
|
5590 |
+
margin-left: 10px;
|
5591 |
+
}
|
5592 |
+
.popover.bottom {
|
5593 |
+
margin-top: 10px;
|
5594 |
+
}
|
5595 |
+
.popover.left {
|
5596 |
+
margin-left: -10px;
|
5597 |
+
}
|
5598 |
+
.popover-title {
|
5599 |
+
margin: 0;
|
5600 |
+
padding: 8px 14px;
|
5601 |
+
font-size: 14px;
|
5602 |
+
font-weight: normal;
|
5603 |
+
line-height: 18px;
|
5604 |
+
background-color: #f7f7f7;
|
5605 |
+
border-bottom: 1px solid #ebebeb;
|
5606 |
+
border-radius: 5px 5px 0 0;
|
5607 |
+
}
|
5608 |
+
.popover-content {
|
5609 |
+
padding: 9px 14px;
|
5610 |
+
}
|
5611 |
+
.popover > .arrow,
|
5612 |
+
.popover > .arrow:after {
|
5613 |
+
position: absolute;
|
5614 |
+
display: block;
|
5615 |
+
width: 0;
|
5616 |
+
height: 0;
|
5617 |
+
border-color: transparent;
|
5618 |
+
border-style: solid;
|
5619 |
+
}
|
5620 |
+
.popover > .arrow {
|
5621 |
+
border-width: 11px;
|
5622 |
+
}
|
5623 |
+
.popover > .arrow:after {
|
5624 |
+
border-width: 10px;
|
5625 |
+
content: "";
|
5626 |
+
}
|
5627 |
+
.popover.top > .arrow {
|
5628 |
+
left: 50%;
|
5629 |
+
margin-left: -11px;
|
5630 |
+
border-bottom-width: 0;
|
5631 |
+
border-top-color: #999999;
|
5632 |
+
border-top-color: rgba(0, 0, 0, 0.25);
|
5633 |
+
bottom: -11px;
|
5634 |
+
}
|
5635 |
+
.popover.top > .arrow:after {
|
5636 |
+
content: " ";
|
5637 |
+
bottom: 1px;
|
5638 |
+
margin-left: -10px;
|
5639 |
+
border-bottom-width: 0;
|
5640 |
+
border-top-color: #ffffff;
|
5641 |
+
}
|
5642 |
+
.popover.right > .arrow {
|
5643 |
+
top: 50%;
|
5644 |
+
left: -11px;
|
5645 |
+
margin-top: -11px;
|
5646 |
+
border-left-width: 0;
|
5647 |
+
border-right-color: #999999;
|
5648 |
+
border-right-color: rgba(0, 0, 0, 0.25);
|
5649 |
+
}
|
5650 |
+
.popover.right > .arrow:after {
|
5651 |
+
content: " ";
|
5652 |
+
left: 1px;
|
5653 |
+
bottom: -10px;
|
5654 |
+
border-left-width: 0;
|
5655 |
+
border-right-color: #ffffff;
|
5656 |
+
}
|
5657 |
+
.popover.bottom > .arrow {
|
5658 |
+
left: 50%;
|
5659 |
+
margin-left: -11px;
|
5660 |
+
border-top-width: 0;
|
5661 |
+
border-bottom-color: #999999;
|
5662 |
+
border-bottom-color: rgba(0, 0, 0, 0.25);
|
5663 |
+
top: -11px;
|
5664 |
+
}
|
5665 |
+
.popover.bottom > .arrow:after {
|
5666 |
+
content: " ";
|
5667 |
+
top: 1px;
|
5668 |
+
margin-left: -10px;
|
5669 |
+
border-top-width: 0;
|
5670 |
+
border-bottom-color: #ffffff;
|
5671 |
+
}
|
5672 |
+
.popover.left > .arrow {
|
5673 |
+
top: 50%;
|
5674 |
+
right: -11px;
|
5675 |
+
margin-top: -11px;
|
5676 |
+
border-right-width: 0;
|
5677 |
+
border-left-color: #999999;
|
5678 |
+
border-left-color: rgba(0, 0, 0, 0.25);
|
5679 |
+
}
|
5680 |
+
.popover.left > .arrow:after {
|
5681 |
+
content: " ";
|
5682 |
+
right: 1px;
|
5683 |
+
border-right-width: 0;
|
5684 |
+
border-left-color: #ffffff;
|
5685 |
+
bottom: -10px;
|
5686 |
+
}
|
5687 |
+
.carousel {
|
5688 |
+
position: relative;
|
5689 |
+
}
|
5690 |
+
.carousel-inner {
|
5691 |
+
position: relative;
|
5692 |
+
overflow: hidden;
|
5693 |
+
width: 100%;
|
5694 |
+
}
|
5695 |
+
.carousel-inner > .item {
|
5696 |
+
display: none;
|
5697 |
+
position: relative;
|
5698 |
+
-webkit-transition: 0.6s ease-in-out left;
|
5699 |
+
-o-transition: 0.6s ease-in-out left;
|
5700 |
+
transition: 0.6s ease-in-out left;
|
5701 |
+
}
|
5702 |
+
.carousel-inner > .item > img,
|
5703 |
+
.carousel-inner > .item > a > img {
|
5704 |
+
line-height: 1;
|
5705 |
+
}
|
5706 |
+
.carousel-inner > .active,
|
5707 |
+
.carousel-inner > .next,
|
5708 |
+
.carousel-inner > .prev {
|
5709 |
+
display: block;
|
5710 |
+
}
|
5711 |
+
.carousel-inner > .active {
|
5712 |
+
left: 0;
|
5713 |
+
}
|
5714 |
+
.carousel-inner > .next,
|
5715 |
+
.carousel-inner > .prev {
|
5716 |
+
position: absolute;
|
5717 |
+
top: 0;
|
5718 |
+
width: 100%;
|
5719 |
+
}
|
5720 |
+
.carousel-inner > .next {
|
5721 |
+
left: 100%;
|
5722 |
+
}
|
5723 |
+
.carousel-inner > .prev {
|
5724 |
+
left: -100%;
|
5725 |
+
}
|
5726 |
+
.carousel-inner > .next.left,
|
5727 |
+
.carousel-inner > .prev.right {
|
5728 |
+
left: 0;
|
5729 |
+
}
|
5730 |
+
.carousel-inner > .active.left {
|
5731 |
+
left: -100%;
|
5732 |
+
}
|
5733 |
+
.carousel-inner > .active.right {
|
5734 |
+
left: 100%;
|
5735 |
+
}
|
5736 |
+
.carousel-control {
|
5737 |
+
position: absolute;
|
5738 |
+
top: 0;
|
5739 |
+
left: 0;
|
5740 |
+
bottom: 0;
|
5741 |
+
width: 15%;
|
5742 |
+
opacity: 0.5;
|
5743 |
+
filter: alpha(opacity=50);
|
5744 |
+
font-size: 20px;
|
5745 |
+
color: #ffffff;
|
5746 |
+
text-align: center;
|
5747 |
+
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
|
5748 |
+
}
|
5749 |
+
.carousel-control.left {
|
5750 |
+
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
|
5751 |
+
background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
|
5752 |
+
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
|
5753 |
+
background-repeat: repeat-x;
|
5754 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
|
5755 |
+
}
|
5756 |
+
.carousel-control.right {
|
5757 |
+
left: auto;
|
5758 |
+
right: 0;
|
5759 |
+
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
|
5760 |
+
background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
|
5761 |
+
background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
|
5762 |
+
background-repeat: repeat-x;
|
5763 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
|
5764 |
+
}
|
5765 |
+
.carousel-control:hover,
|
5766 |
+
.carousel-control:focus {
|
5767 |
+
outline: 0;
|
5768 |
+
color: #ffffff;
|
5769 |
+
text-decoration: none;
|
5770 |
+
opacity: 0.9;
|
5771 |
+
filter: alpha(opacity=90);
|
5772 |
+
}
|
5773 |
+
.carousel-control .icon-prev,
|
5774 |
+
.carousel-control .icon-next,
|
5775 |
+
.carousel-control .glyphicon-chevron-left,
|
5776 |
+
.carousel-control .glyphicon-chevron-right {
|
5777 |
+
position: absolute;
|
5778 |
+
top: 50%;
|
5779 |
+
z-index: 5;
|
5780 |
+
display: inline-block;
|
5781 |
+
}
|
5782 |
+
.carousel-control .icon-prev,
|
5783 |
+
.carousel-control .glyphicon-chevron-left {
|
5784 |
+
left: 50%;
|
5785 |
+
margin-left: -10px;
|
5786 |
+
}
|
5787 |
+
.carousel-control .icon-next,
|
5788 |
+
.carousel-control .glyphicon-chevron-right {
|
5789 |
+
right: 50%;
|
5790 |
+
margin-right: -10px;
|
5791 |
+
}
|
5792 |
+
.carousel-control .icon-prev,
|
5793 |
+
.carousel-control .icon-next {
|
5794 |
+
width: 20px;
|
5795 |
+
height: 20px;
|
5796 |
+
margin-top: -10px;
|
5797 |
+
font-family: serif;
|
5798 |
+
}
|
5799 |
+
.carousel-control .icon-prev:before {
|
5800 |
+
content: '\2039';
|
5801 |
+
}
|
5802 |
+
.carousel-control .icon-next:before {
|
5803 |
+
content: '\203a';
|
5804 |
+
}
|
5805 |
+
.carousel-indicators {
|
5806 |
+
position: absolute;
|
5807 |
+
bottom: 10px;
|
5808 |
+
left: 50%;
|
5809 |
+
z-index: 15;
|
5810 |
+
width: 60%;
|
5811 |
+
margin-left: -30%;
|
5812 |
+
padding-left: 0;
|
5813 |
+
list-style: none;
|
5814 |
+
text-align: center;
|
5815 |
+
}
|
5816 |
+
.carousel-indicators li {
|
5817 |
+
display: inline-block;
|
5818 |
+
width: 10px;
|
5819 |
+
height: 10px;
|
5820 |
+
margin: 1px;
|
5821 |
+
text-indent: -999px;
|
5822 |
+
border: 1px solid #ffffff;
|
5823 |
+
border-radius: 10px;
|
5824 |
+
cursor: pointer;
|
5825 |
+
background-color: #000 \9;
|
5826 |
+
background-color: rgba(0, 0, 0, 0);
|
5827 |
+
}
|
5828 |
+
.carousel-indicators .active {
|
5829 |
+
margin: 0;
|
5830 |
+
width: 12px;
|
5831 |
+
height: 12px;
|
5832 |
+
background-color: #ffffff;
|
5833 |
+
}
|
5834 |
+
.carousel-caption {
|
5835 |
+
position: absolute;
|
5836 |
+
left: 15%;
|
5837 |
+
right: 15%;
|
5838 |
+
bottom: 20px;
|
5839 |
+
z-index: 10;
|
5840 |
+
padding-top: 20px;
|
5841 |
+
padding-bottom: 20px;
|
5842 |
+
color: #ffffff;
|
5843 |
+
text-align: center;
|
5844 |
+
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
|
5845 |
+
}
|
5846 |
+
.carousel-caption .btn {
|
5847 |
+
text-shadow: none;
|
5848 |
+
}
|
5849 |
+
@media screen and (min-width: 768px) {
|
5850 |
+
.carousel-control .glyphicon-chevron-left,
|
5851 |
+
.carousel-control .glyphicon-chevron-right,
|
5852 |
+
.carousel-control .icon-prev,
|
5853 |
+
.carousel-control .icon-next {
|
5854 |
+
width: 30px;
|
5855 |
+
height: 30px;
|
5856 |
+
margin-top: -15px;
|
5857 |
+
font-size: 30px;
|
5858 |
+
}
|
5859 |
+
.carousel-control .glyphicon-chevron-left,
|
5860 |
+
.carousel-control .icon-prev {
|
5861 |
+
margin-left: -15px;
|
5862 |
+
}
|
5863 |
+
.carousel-control .glyphicon-chevron-right,
|
5864 |
+
.carousel-control .icon-next {
|
5865 |
+
margin-right: -15px;
|
5866 |
+
}
|
5867 |
+
.carousel-caption {
|
5868 |
+
left: 20%;
|
5869 |
+
right: 20%;
|
5870 |
+
padding-bottom: 30px;
|
5871 |
+
}
|
5872 |
+
.carousel-indicators {
|
5873 |
+
bottom: 20px;
|
5874 |
+
}
|
5875 |
+
}
|
5876 |
+
.clearfix:before,
|
5877 |
+
.clearfix:after,
|
5878 |
+
.dl-horizontal dd:before,
|
5879 |
+
.dl-horizontal dd:after,
|
5880 |
+
.container:before,
|
5881 |
+
.container:after,
|
5882 |
+
.container-fluid:before,
|
5883 |
+
.container-fluid:after,
|
5884 |
+
.row:before,
|
5885 |
+
.row:after,
|
5886 |
+
.form-horizontal .form-group:before,
|
5887 |
+
.form-horizontal .form-group:after,
|
5888 |
+
.btn-toolbar:before,
|
5889 |
+
.btn-toolbar:after,
|
5890 |
+
.btn-group-vertical > .btn-group:before,
|
5891 |
+
.btn-group-vertical > .btn-group:after,
|
5892 |
+
.nav:before,
|
5893 |
+
.nav:after,
|
5894 |
+
.navbar:before,
|
5895 |
+
.navbar:after,
|
5896 |
+
.navbar-header:before,
|
5897 |
+
.navbar-header:after,
|
5898 |
+
.navbar-collapse:before,
|
5899 |
+
.navbar-collapse:after,
|
5900 |
+
.pager:before,
|
5901 |
+
.pager:after,
|
5902 |
+
.panel-body:before,
|
5903 |
+
.panel-body:after,
|
5904 |
+
.modal-footer:before,
|
5905 |
+
.modal-footer:after {
|
5906 |
+
content: " ";
|
5907 |
+
display: table;
|
5908 |
+
}
|
5909 |
+
.clearfix:after,
|
5910 |
+
.dl-horizontal dd:after,
|
5911 |
+
.container:after,
|
5912 |
+
.container-fluid:after,
|
5913 |
+
.row:after,
|
5914 |
+
.form-horizontal .form-group:after,
|
5915 |
+
.btn-toolbar:after,
|
5916 |
+
.btn-group-vertical > .btn-group:after,
|
5917 |
+
.nav:after,
|
5918 |
+
.navbar:after,
|
5919 |
+
.navbar-header:after,
|
5920 |
+
.navbar-collapse:after,
|
5921 |
+
.pager:after,
|
5922 |
+
.panel-body:after,
|
5923 |
+
.modal-footer:after {
|
5924 |
+
clear: both;
|
5925 |
+
}
|
5926 |
+
.center-block {
|
5927 |
+
display: block;
|
5928 |
+
margin-left: auto;
|
5929 |
+
margin-right: auto;
|
5930 |
+
}
|
5931 |
+
.pull-right {
|
5932 |
+
float: right !important;
|
5933 |
+
}
|
5934 |
+
.pull-left {
|
5935 |
+
float: left !important;
|
5936 |
+
}
|
5937 |
+
.hide {
|
5938 |
+
display: none !important;
|
5939 |
+
}
|
5940 |
+
.show {
|
5941 |
+
display: block !important;
|
5942 |
+
}
|
5943 |
+
.invisible {
|
5944 |
+
visibility: hidden;
|
5945 |
+
}
|
5946 |
+
.text-hide {
|
5947 |
+
font: 0/0 a;
|
5948 |
+
color: transparent;
|
5949 |
+
text-shadow: none;
|
5950 |
+
background-color: transparent;
|
5951 |
+
border: 0;
|
5952 |
+
}
|
5953 |
+
.hidden {
|
5954 |
+
display: none !important;
|
5955 |
+
visibility: hidden !important;
|
5956 |
+
}
|
5957 |
+
.affix {
|
5958 |
+
position: fixed;
|
5959 |
+
-webkit-transform: translate3d(0, 0, 0);
|
5960 |
+
transform: translate3d(0, 0, 0);
|
5961 |
+
}
|
5962 |
+
@-ms-viewport {
|
5963 |
+
width: device-width;
|
5964 |
+
}
|
5965 |
+
.visible-xs,
|
5966 |
+
.visible-sm,
|
5967 |
+
.visible-md,
|
5968 |
+
.visible-lg {
|
5969 |
+
display: none !important;
|
5970 |
+
}
|
5971 |
+
.visible-xs-block,
|
5972 |
+
.visible-xs-inline,
|
5973 |
+
.visible-xs-inline-block,
|
5974 |
+
.visible-sm-block,
|
5975 |
+
.visible-sm-inline,
|
5976 |
+
.visible-sm-inline-block,
|
5977 |
+
.visible-md-block,
|
5978 |
+
.visible-md-inline,
|
5979 |
+
.visible-md-inline-block,
|
5980 |
+
.visible-lg-block,
|
5981 |
+
.visible-lg-inline,
|
5982 |
+
.visible-lg-inline-block {
|
5983 |
+
display: none !important;
|
5984 |
+
}
|
5985 |
+
@media (max-width: 767px) {
|
5986 |
+
.visible-xs {
|
5987 |
+
display: block !important;
|
5988 |
+
}
|
5989 |
+
table.visible-xs {
|
5990 |
+
display: table;
|
5991 |
+
}
|
5992 |
+
tr.visible-xs {
|
5993 |
+
display: table-row !important;
|
5994 |
+
}
|
5995 |
+
th.visible-xs,
|
5996 |
+
td.visible-xs {
|
5997 |
+
display: table-cell !important;
|
5998 |
+
}
|
5999 |
+
}
|
6000 |
+
@media (max-width: 767px) {
|
6001 |
+
.visible-xs-block {
|
6002 |
+
display: block !important;
|
6003 |
+
}
|
6004 |
+
}
|
6005 |
+
@media (max-width: 767px) {
|
6006 |
+
.visible-xs-inline {
|
6007 |
+
display: inline !important;
|
6008 |
+
}
|
6009 |
+
}
|
6010 |
+
@media (max-width: 767px) {
|
6011 |
+
.visible-xs-inline-block {
|
6012 |
+
display: inline-block !important;
|
6013 |
+
}
|
6014 |
+
}
|
6015 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6016 |
+
.visible-sm {
|
6017 |
+
display: block !important;
|
6018 |
+
}
|
6019 |
+
table.visible-sm {
|
6020 |
+
display: table;
|
6021 |
+
}
|
6022 |
+
tr.visible-sm {
|
6023 |
+
display: table-row !important;
|
6024 |
+
}
|
6025 |
+
th.visible-sm,
|
6026 |
+
td.visible-sm {
|
6027 |
+
display: table-cell !important;
|
6028 |
+
}
|
6029 |
+
}
|
6030 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6031 |
+
.visible-sm-block {
|
6032 |
+
display: block !important;
|
6033 |
+
}
|
6034 |
+
}
|
6035 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6036 |
+
.visible-sm-inline {
|
6037 |
+
display: inline !important;
|
6038 |
+
}
|
6039 |
+
}
|
6040 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6041 |
+
.visible-sm-inline-block {
|
6042 |
+
display: inline-block !important;
|
6043 |
+
}
|
6044 |
+
}
|
6045 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6046 |
+
.visible-md {
|
6047 |
+
display: block !important;
|
6048 |
+
}
|
6049 |
+
table.visible-md {
|
6050 |
+
display: table;
|
6051 |
+
}
|
6052 |
+
tr.visible-md {
|
6053 |
+
display: table-row !important;
|
6054 |
+
}
|
6055 |
+
th.visible-md,
|
6056 |
+
td.visible-md {
|
6057 |
+
display: table-cell !important;
|
6058 |
+
}
|
6059 |
+
}
|
6060 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6061 |
+
.visible-md-block {
|
6062 |
+
display: block !important;
|
6063 |
+
}
|
6064 |
+
}
|
6065 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6066 |
+
.visible-md-inline {
|
6067 |
+
display: inline !important;
|
6068 |
+
}
|
6069 |
+
}
|
6070 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6071 |
+
.visible-md-inline-block {
|
6072 |
+
display: inline-block !important;
|
6073 |
+
}
|
6074 |
+
}
|
6075 |
+
@media (min-width: 1200px) {
|
6076 |
+
.visible-lg {
|
6077 |
+
display: block !important;
|
6078 |
+
}
|
6079 |
+
table.visible-lg {
|
6080 |
+
display: table;
|
6081 |
+
}
|
6082 |
+
tr.visible-lg {
|
6083 |
+
display: table-row !important;
|
6084 |
+
}
|
6085 |
+
th.visible-lg,
|
6086 |
+
td.visible-lg {
|
6087 |
+
display: table-cell !important;
|
6088 |
+
}
|
6089 |
+
}
|
6090 |
+
@media (min-width: 1200px) {
|
6091 |
+
.visible-lg-block {
|
6092 |
+
display: block !important;
|
6093 |
+
}
|
6094 |
+
}
|
6095 |
+
@media (min-width: 1200px) {
|
6096 |
+
.visible-lg-inline {
|
6097 |
+
display: inline !important;
|
6098 |
+
}
|
6099 |
+
}
|
6100 |
+
@media (min-width: 1200px) {
|
6101 |
+
.visible-lg-inline-block {
|
6102 |
+
display: inline-block !important;
|
6103 |
+
}
|
6104 |
+
}
|
6105 |
+
@media (max-width: 767px) {
|
6106 |
+
.hidden-xs {
|
6107 |
+
display: none !important;
|
6108 |
+
}
|
6109 |
+
}
|
6110 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6111 |
+
.hidden-sm {
|
6112 |
+
display: none !important;
|
6113 |
+
}
|
6114 |
+
}
|
6115 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6116 |
+
.hidden-md {
|
6117 |
+
display: none !important;
|
6118 |
+
}
|
6119 |
+
}
|
6120 |
+
@media (min-width: 1200px) {
|
6121 |
+
.hidden-lg {
|
6122 |
+
display: none !important;
|
6123 |
+
}
|
6124 |
+
}
|
6125 |
+
.visible-print {
|
6126 |
+
display: none !important;
|
6127 |
+
}
|
6128 |
+
@media print {
|
6129 |
+
.visible-print {
|
6130 |
+
display: block !important;
|
6131 |
+
}
|
6132 |
+
table.visible-print {
|
6133 |
+
display: table;
|
6134 |
+
}
|
6135 |
+
tr.visible-print {
|
6136 |
+
display: table-row !important;
|
6137 |
+
}
|
6138 |
+
th.visible-print,
|
6139 |
+
td.visible-print {
|
6140 |
+
display: table-cell !important;
|
6141 |
+
}
|
6142 |
+
}
|
6143 |
+
.visible-print-block {
|
6144 |
+
display: none !important;
|
6145 |
+
}
|
6146 |
+
@media print {
|
6147 |
+
.visible-print-block {
|
6148 |
+
display: block !important;
|
6149 |
+
}
|
6150 |
+
}
|
6151 |
+
.visible-print-inline {
|
6152 |
+
display: none !important;
|
6153 |
+
}
|
6154 |
+
@media print {
|
6155 |
+
.visible-print-inline {
|
6156 |
+
display: inline !important;
|
6157 |
+
}
|
6158 |
+
}
|
6159 |
+
.visible-print-inline-block {
|
6160 |
+
display: none !important;
|
6161 |
+
}
|
6162 |
+
@media print {
|
6163 |
+
.visible-print-inline-block {
|
6164 |
+
display: inline-block !important;
|
6165 |
+
}
|
6166 |
+
}
|
6167 |
+
@media print {
|
6168 |
+
.hidden-print {
|
6169 |
+
display: none !important;
|
6170 |
+
}
|
6171 |
+
}
|
6172 |
+
.wp-caption{
|
6173 |
+
max-width:98%
|
6174 |
+
}
|
assets/admin/styles/fonts/glyphicons-halflings-regular.eot
ADDED
Binary file
|
assets/admin/styles/fonts/glyphicons-halflings-regular.svg
ADDED
@@ -0,0 +1,229 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" standalone="no"?>
|
2 |
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
3 |
+
<svg xmlns="http://www.w3.org/2000/svg">
|
4 |
+
<metadata></metadata>
|
5 |
+
<defs>
|
6 |
+
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
7 |
+
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
8 |
+
<missing-glyph horiz-adv-x="500" />
|
9 |
+
<glyph />
|
10 |
+
<glyph />
|
11 |
+
<glyph unicode="
" />
|
12 |
+
<glyph unicode=" " />
|
13 |
+
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
|
14 |
+
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
|
15 |
+
<glyph unicode=" " />
|
16 |
+
<glyph unicode=" " horiz-adv-x="652" />
|
17 |
+
<glyph unicode=" " horiz-adv-x="1304" />
|
18 |
+
<glyph unicode=" " horiz-adv-x="652" />
|
19 |
+
<glyph unicode=" " horiz-adv-x="1304" />
|
20 |
+
<glyph unicode=" " horiz-adv-x="434" />
|
21 |
+
<glyph unicode=" " horiz-adv-x="326" />
|
22 |
+
<glyph unicode=" " horiz-adv-x="217" />
|
23 |
+
<glyph unicode=" " horiz-adv-x="217" />
|
24 |
+
<glyph unicode=" " horiz-adv-x="163" />
|
25 |
+
<glyph unicode=" " horiz-adv-x="260" />
|
26 |
+
<glyph unicode=" " horiz-adv-x="72" />
|
27 |
+
<glyph unicode=" " horiz-adv-x="260" />
|
28 |
+
<glyph unicode=" " horiz-adv-x="326" />
|
29 |
+
<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
|
30 |
+
<glyph unicode="−" d="M200 400h900v300h-900v-300z" />
|
31 |
+
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
32 |
+
<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
|
33 |
+
<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
|
34 |
+
<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
|
35 |
+
<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
|
36 |
+
<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
|
37 |
+
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
|
38 |
+
<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
|
39 |
+
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
|
40 |
+
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
|
41 |
+
<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
|
42 |
+
<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
|
43 |
+
<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
|
44 |
+
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
|
45 |
+
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
|
46 |
+
<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
|
47 |
+
<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
|
48 |
+
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
|
49 |
+
<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
|
50 |
+
<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
|
51 |
+
<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
|
52 |
+
<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
|
53 |
+
<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
|
54 |
+
<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
|
55 |
+
<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
|
56 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
|
57 |
+
<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
|
58 |
+
<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
|
59 |
+
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
|
60 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
|
61 |
+
<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
|
62 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
|
63 |
+
<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
|
64 |
+
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
|
65 |
+
<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
|
66 |
+
<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
|
67 |
+
<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
|
68 |
+
<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
|
69 |
+
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
|
70 |
+
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
|
71 |
+
<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
|
72 |
+
<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
|
73 |
+
<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
|
74 |
+
<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
|
75 |
+
<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
|
76 |
+
<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
|
77 |
+
<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
|
78 |
+
<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
|
79 |
+
<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
|
80 |
+
<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
|
81 |
+
<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
|
82 |
+
<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
|
83 |
+
<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
|
84 |
+
<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
|
85 |
+
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
86 |
+
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
87 |
+
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
|
88 |
+
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
|
89 |
+
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
|
90 |
+
<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
|
91 |
+
<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
|
92 |
+
<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
|
93 |
+
<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
|
94 |
+
<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
|
95 |
+
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
|
96 |
+
<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
|
97 |
+
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
|
98 |
+
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
|
99 |
+
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
|
100 |
+
<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
|
101 |
+
<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
102 |
+
<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
103 |
+
<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
|
104 |
+
<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />
|
105 |
+
<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
106 |
+
<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
107 |
+
<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
|
108 |
+
<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
|
109 |
+
<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
|
110 |
+
<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
|
111 |
+
<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
|
112 |
+
<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
|
113 |
+
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
|
114 |
+
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
|
115 |
+
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
|
116 |
+
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
|
117 |
+
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
|
118 |
+
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
|
119 |
+
<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
|
120 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
|
121 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
|
122 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
|
123 |
+
<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />
|
124 |
+
<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
|
125 |
+
<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
|
126 |
+
<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />
|
127 |
+
<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
|
128 |
+
<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
|
129 |
+
<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
|
130 |
+
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
|
131 |
+
<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
|
132 |
+
<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
|
133 |
+
<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
|
134 |
+
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
|
135 |
+
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
|
136 |
+
<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
|
137 |
+
<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
|
138 |
+
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
|
139 |
+
<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
|
140 |
+
<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
|
141 |
+
<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
|
142 |
+
<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
|
143 |
+
<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
|
144 |
+
<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
|
145 |
+
<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
|
146 |
+
<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
|
147 |
+
<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
|
148 |
+
<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
|
149 |
+
<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
|
150 |
+
<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
|
151 |
+
<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
|
152 |
+
<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
|
153 |
+
<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
|
154 |
+
<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
|
155 |
+
<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
|
156 |
+
<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
|
157 |
+
<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
|
158 |
+
<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
|
159 |
+
<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
|
160 |
+
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
|
161 |
+
<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
|
162 |
+
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
|
163 |
+
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
|
164 |
+
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
|
165 |
+
<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
|
166 |
+
<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
|
167 |
+
<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
|
168 |
+
<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
|
169 |
+
<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
|
170 |
+
<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
|
171 |
+
<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
|
172 |
+
<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
|
173 |
+
<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
|
174 |
+
<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
|
175 |
+
<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
|
176 |
+
<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
|
177 |
+
<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
|
178 |
+
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
|
179 |
+
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
|
180 |
+
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
|
181 |
+
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
|
182 |
+
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
|
183 |
+
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
|
184 |
+
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
|
185 |
+
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
|
186 |
+
<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
|
187 |
+
<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
|
188 |
+
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
|
189 |
+
<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
|
190 |
+
<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
|
191 |
+
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
|
192 |
+
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
|
193 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
|
194 |
+
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
|
195 |
+
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
|
196 |
+
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
|
197 |
+
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
|
198 |
+
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
|
199 |
+
<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
|
200 |
+
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
|
201 |
+
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
|
202 |
+
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
|
203 |
+
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
|
204 |
+
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
|
205 |
+
<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
|
206 |
+
<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
|
207 |
+
<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
|
208 |
+
<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
|
209 |
+
<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
|
210 |
+
<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
|
211 |
+
<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
|
212 |
+
<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
|
213 |
+
<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
|
214 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
215 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
216 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
|
217 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
|
218 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
|
219 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
220 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
221 |
+
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
|
222 |
+
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
|
223 |
+
<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
|
224 |
+
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
|
225 |
+
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
|
226 |
+
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
|
227 |
+
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
|
228 |
+
</font>
|
229 |
+
</defs></svg>
|
assets/admin/styles/fonts/glyphicons-halflings-regular.ttf
ADDED
Binary file
|
assets/admin/styles/fonts/glyphicons-halflings-regular.woff
ADDED
Binary file
|
assets/admin/styles/gdbc-admin.css
ADDED
@@ -0,0 +1,832 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
body
|
2 |
+
{
|
3 |
+
color: #444;
|
4 |
+
font-family: "Open Sans",sans-serif;
|
5 |
+
font-size: 13px;
|
6 |
+
line-height: 1.4em;
|
7 |
+
color:#444;
|
8 |
+
background-color: #F1F1F1;
|
9 |
+
}
|
10 |
+
|
11 |
+
div.wrap.container-fluid
|
12 |
+
{
|
13 |
+
margin: 10px 20px 0px 2px;
|
14 |
+
padding:0;
|
15 |
+
}
|
16 |
+
|
17 |
+
|
18 |
+
|
19 |
+
div.gdbc-settings .clearfix:after
|
20 |
+
{
|
21 |
+
content: ".";
|
22 |
+
display: block;
|
23 |
+
height: 0;
|
24 |
+
clear: both;
|
25 |
+
visibility: hidden;
|
26 |
+
zoom: 1
|
27 |
+
}
|
28 |
+
|
29 |
+
#gdbc-reports-holder
|
30 |
+
{
|
31 |
+
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
32 |
+
}
|
33 |
+
#gdbc-reports-holder h3
|
34 |
+
{
|
35 |
+
font-size: 1.5em;
|
36 |
+
}
|
37 |
+
|
38 |
+
#adminmenuwrap{
|
39 |
+
height: 100%
|
40 |
+
}
|
41 |
+
|
42 |
+
#chart-container{ height: 235px; width: 100% }
|
43 |
+
|
44 |
+
.gdbcwidget {
|
45 |
+
border-radius: 0;
|
46 |
+
margin: 0 0 30px;
|
47 |
+
padding: 0;
|
48 |
+
}
|
49 |
+
|
50 |
+
.gdbcwidget .widget-body {
|
51 |
+
min-height: 100px;
|
52 |
+
/*padding-bottom: 13px;*/
|
53 |
+
position: relative;
|
54 |
+
}
|
55 |
+
|
56 |
+
.gdbcwidget header {
|
57 |
+
border-radius: 0;
|
58 |
+
box-shadow: 0 -2px 0 rgba(0, 0, 0, 0.05) inset;
|
59 |
+
background: none repeat scroll 0 0 #fafafa;
|
60 |
+
border: 1px solid #c2c2c2;
|
61 |
+
color: #333;
|
62 |
+
height: 34px;
|
63 |
+
line-height: 40px;
|
64 |
+
padding: 0;
|
65 |
+
font-size: 13px;
|
66 |
+
}
|
67 |
+
|
68 |
+
.gdbcwidget > header {
|
69 |
+
background: none repeat scroll 0 0 #fafafa;
|
70 |
+
border: 1px solid #c2c2c2;
|
71 |
+
color: #333;
|
72 |
+
}
|
73 |
+
|
74 |
+
.gdbcwidget header h2 {
|
75 |
+
float: left;
|
76 |
+
display: inline-block;
|
77 |
+
font-size: 14px;
|
78 |
+
font-weight: 400;
|
79 |
+
height: 100%;
|
80 |
+
letter-spacing: 0;
|
81 |
+
line-height: 34px;
|
82 |
+
margin: 0;
|
83 |
+
position: relative;
|
84 |
+
width: auto;
|
85 |
+
padding: 0 !important;
|
86 |
+
}
|
87 |
+
|
88 |
+
.gdbcwidget > div {
|
89 |
+
border-bottom-color: #ccc !important;
|
90 |
+
border-left-color: #ccc !important;
|
91 |
+
border-radius: 0;
|
92 |
+
border-right-color: #ccc !important;
|
93 |
+
border-style: none solid solid;
|
94 |
+
border-top: medium none;
|
95 |
+
border-width: medium 1px 2px;
|
96 |
+
float: left;
|
97 |
+
font-size: 13px;
|
98 |
+
margin: 0;
|
99 |
+
overflow: visible;
|
100 |
+
padding: 13px 13px 0;
|
101 |
+
position: relative;
|
102 |
+
width: 100%;
|
103 |
+
background-color: #fff !important
|
104 |
+
}
|
105 |
+
|
106 |
+
.no-padding {
|
107 |
+
padding: 0 !important;
|
108 |
+
}
|
109 |
+
|
110 |
+
.row.no-space {
|
111 |
+
margin:0;
|
112 |
+
padding:0;
|
113 |
+
border:none;
|
114 |
+
}
|
115 |
+
|
116 |
+
.no-space {
|
117 |
+
margin: 0;
|
118 |
+
}
|
119 |
+
|
120 |
+
.widget-icon {
|
121 |
+
display:block;
|
122 |
+
float: left;
|
123 |
+
font-size: 111%;
|
124 |
+
height: 32px;
|
125 |
+
line-height: 32px;
|
126 |
+
position: relative;
|
127 |
+
text-align: center;
|
128 |
+
width: 30px
|
129 |
+
}
|
130 |
+
#dashboard-navigation{
|
131 |
+
float: left
|
132 |
+
}
|
133 |
+
|
134 |
+
.gdbcwidget-loader {
|
135 |
+
background-position: center center;
|
136 |
+
background-repeat: no-repeat;
|
137 |
+
display: none;
|
138 |
+
float: right;
|
139 |
+
font-size: 111%;
|
140 |
+
height: 32px;
|
141 |
+
line-height: 32px;
|
142 |
+
margin: 0;
|
143 |
+
text-align: center;
|
144 |
+
width: 32px
|
145 |
+
}
|
146 |
+
|
147 |
+
.no-space > [class*="col-"] {
|
148 |
+
margin: 0 !important;
|
149 |
+
padding-left: 0;
|
150 |
+
padding-right: 0;
|
151 |
+
}
|
152 |
+
|
153 |
+
.nav > li {
|
154 |
+
display: block;
|
155 |
+
position: relative;
|
156 |
+
}
|
157 |
+
|
158 |
+
.nav-tabs > li {
|
159 |
+
float: left;
|
160 |
+
margin-bottom: -2px;
|
161 |
+
margin-right: -3px;
|
162 |
+
}
|
163 |
+
|
164 |
+
.gdbcwidget header:first-child .nav-tabs li {
|
165 |
+
padding-left: 0;
|
166 |
+
}
|
167 |
+
|
168 |
+
.gdbcwidget header .nav-tabs > li.active > a, .gdbcwidget header .nav-tabs > li.active > a:focus, .gdbcwidget header .nav-tabs > li.active > a:hover {
|
169 |
+
-moz-border-bottom-colors: none;
|
170 |
+
-moz-border-left-colors: none;
|
171 |
+
-moz-border-right-colors: none;
|
172 |
+
-moz-border-top-colors: none;
|
173 |
+
background-color: #fff;
|
174 |
+
border-color: -moz-use-text-color #c2c2c2 transparent;
|
175 |
+
border-image: none;
|
176 |
+
border-left: 1px solid #c2c2c2;
|
177 |
+
border-right: 1px solid #c2c2c2;
|
178 |
+
border-style: none solid solid;
|
179 |
+
border-width: medium 1px 1px;
|
180 |
+
color: #555;
|
181 |
+
cursor: default;
|
182 |
+
}
|
183 |
+
|
184 |
+
.gdbcwidget header .nav-tabs > li > a {
|
185 |
+
border: medium none;
|
186 |
+
border-radius: 0;
|
187 |
+
padding: 7px 15px 6px;
|
188 |
+
}
|
189 |
+
|
190 |
+
.module-pagingation
|
191 |
+
{
|
192 |
+
margin-top: 0 !important;
|
193 |
+
margin-bottom: 0 !important
|
194 |
+
}
|
195 |
+
|
196 |
+
.nav-tabs > li.active > a {
|
197 |
+
border-top-width: 0 !important;
|
198 |
+
box-shadow: 0 -2px 0 #57889c;
|
199 |
+
font-weight: 700;
|
200 |
+
margin-top: 1px !important;
|
201 |
+
}
|
202 |
+
|
203 |
+
.nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover {
|
204 |
+
-moz-border-bottom-colors: none;
|
205 |
+
-moz-border-left-colors: none;
|
206 |
+
-moz-border-right-colors: none;
|
207 |
+
-moz-border-top-colors: none;
|
208 |
+
background-color: #fff;
|
209 |
+
border-color: #ddd #ddd transparent;
|
210 |
+
border-image: none;
|
211 |
+
border-style: solid;
|
212 |
+
border-width: 1px;
|
213 |
+
color: #555;
|
214 |
+
cursor: default;
|
215 |
+
}
|
216 |
+
|
217 |
+
.nav-tabs > li > a {
|
218 |
+
border-radius: 0;
|
219 |
+
color: #333;
|
220 |
+
}
|
221 |
+
.nav-tabs > li > a {
|
222 |
+
border: 1px solid transparent;
|
223 |
+
border-radius: 2px 2px 0 0;
|
224 |
+
line-height: 1.42857;
|
225 |
+
margin-right: 2px;
|
226 |
+
}
|
227 |
+
.nav > li > a {
|
228 |
+
display: block;
|
229 |
+
padding: 9px 10px 10px;
|
230 |
+
position: relative;
|
231 |
+
}
|
232 |
+
|
233 |
+
.vector-map, #gdbc-stats{
|
234 |
+
height: 300px;
|
235 |
+
width: 100%;
|
236 |
+
}
|
237 |
+
|
238 |
+
.vector-map{
|
239 |
+
padding: 10px;
|
240 |
+
}
|
241 |
+
|
242 |
+
.progress {
|
243 |
+
border-radius: 0;
|
244 |
+
height: 7px;
|
245 |
+
margin-bottom: 15px;
|
246 |
+
margin-top: 3px;
|
247 |
+
}
|
248 |
+
|
249 |
+
.easyPieChart{
|
250 |
+
display: inline-block;
|
251 |
+
text-align: center;
|
252 |
+
position: relative;
|
253 |
+
width: 60px;
|
254 |
+
height: 60px;
|
255 |
+
line-height: 60px
|
256 |
+
}
|
257 |
+
|
258 |
+
.easyPieChart canvas{
|
259 |
+
position: absolute;
|
260 |
+
top:0;
|
261 |
+
left:0
|
262 |
+
}
|
263 |
+
|
264 |
+
.pie-chart-widgets > div {
|
265 |
+
border-right: 1px solid #dadada !important;
|
266 |
+
border-top: 1px solid #dadada !important;
|
267 |
+
margin-top: 10px !important;
|
268 |
+
overflow: hidden;
|
269 |
+
padding: 7px 9px;
|
270 |
+
}
|
271 |
+
|
272 |
+
.padding-10
|
273 |
+
{
|
274 |
+
padding: 10px !important;
|
275 |
+
}
|
276 |
+
|
277 |
+
.table img
|
278 |
+
{
|
279 |
+
margin-right: 5px
|
280 |
+
}
|
281 |
+
|
282 |
+
.countriesTable tbody tr, #gdbc-pie-chart table tbody tr{
|
283 |
+
height: 40px;
|
284 |
+
}
|
285 |
+
|
286 |
+
.bg-color-dark-blue{
|
287 |
+
background-color: #4c4f53 !important;
|
288 |
+
}
|
289 |
+
|
290 |
+
.bg-color-blue{
|
291 |
+
background-color: #57889c !important;
|
292 |
+
}
|
293 |
+
|
294 |
+
.bg-color-green{
|
295 |
+
background-color: #71843f !important;
|
296 |
+
}
|
297 |
+
|
298 |
+
.bg-color-dark-orange{
|
299 |
+
background-color: #a57225
|
300 |
+
}
|
301 |
+
|
302 |
+
.view-buttons{
|
303 |
+
width:100%;
|
304 |
+
}
|
305 |
+
|
306 |
+
.view-buttons span
|
307 |
+
{
|
308 |
+
display: inline-block;
|
309 |
+
width: 200px;
|
310 |
+
float:right;
|
311 |
+
}
|
312 |
+
|
313 |
+
/* Map with location of all the attempts */
|
314 |
+
.jvectormap-zoomin,.jvectormap-zoomout
|
315 |
+
{
|
316 |
+
position:absolute;
|
317 |
+
padding:4px;
|
318 |
+
width:22px;
|
319 |
+
height:22px;
|
320 |
+
cursor:pointer;
|
321 |
+
line-height:10px;
|
322 |
+
text-align:center;
|
323 |
+
font-size:14px;
|
324 |
+
border-radius:2px;
|
325 |
+
-webkit-border-radius:2px;
|
326 |
+
-moz-border-radius:2px;
|
327 |
+
box-shadow:inset 0 -2px 0 rgba(0,0,0,.05);
|
328 |
+
-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,.05);
|
329 |
+
-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,.05);
|
330 |
+
background-color:#fff;
|
331 |
+
border:1px solid #bfbfbf
|
332 |
+
}
|
333 |
+
|
334 |
+
.jvectormap-zoomin:hover,.jvectormap-zoomout:hover
|
335 |
+
{
|
336 |
+
background:#eee;border-color:#d9d9d9
|
337 |
+
}
|
338 |
+
|
339 |
+
.jvectormap-zoomin
|
340 |
+
{
|
341 |
+
top:0
|
342 |
+
}
|
343 |
+
|
344 |
+
.jvectormap-zoomout
|
345 |
+
{
|
346 |
+
top:24px
|
347 |
+
}
|
348 |
+
|
349 |
+
.jvectormap-label
|
350 |
+
{
|
351 |
+
position:absolute;
|
352 |
+
display:none;
|
353 |
+
border:solid 1px #CDCDCD;
|
354 |
+
-webkit-border-radius:3px;
|
355 |
+
-moz-border-radius:3px;
|
356 |
+
border-radius:3px;
|
357 |
+
background:#292929;
|
358 |
+
color:#fff;
|
359 |
+
font-family:sans-serif,Verdana;
|
360 |
+
font-size:smaller;
|
361 |
+
padding:3px
|
362 |
+
}
|
363 |
+
|
364 |
+
.bg-color-greenLight {
|
365 |
+
background-color: #71843f !important;
|
366 |
+
}
|
367 |
+
|
368 |
+
.bg-color-blueLight {
|
369 |
+
background-color: #92a2a8 !important;
|
370 |
+
}
|
371 |
+
|
372 |
+
.bg-color-red{
|
373 |
+
background-color: #a90329 !important;
|
374 |
+
}
|
375 |
+
|
376 |
+
.icon-success{
|
377 |
+
color: #5cb85c
|
378 |
+
}
|
379 |
+
|
380 |
+
.icon-danger{
|
381 |
+
color: #d9534f
|
382 |
+
}
|
383 |
+
|
384 |
+
.icon-primary{
|
385 |
+
color: #428bca
|
386 |
+
}
|
387 |
+
|
388 |
+
a.badge:hover{
|
389 |
+
background-color: #92a2a8 !important;
|
390 |
+
}
|
391 |
+
|
392 |
+
a.easy-tool-tip:hover span:hover {
|
393 |
+
background-color: #92a2a8 !important;
|
394 |
+
cursor: hand;
|
395 |
+
}
|
396 |
+
|
397 |
+
.pie-chart-widgets span.label {
|
398 |
+
min-width: 30px;
|
399 |
+
display: block;
|
400 |
+
text-align: center;
|
401 |
+
}
|
402 |
+
|
403 |
+
.dropdown-menu-xs {
|
404 |
+
min-width: 37px;
|
405 |
+
}
|
406 |
+
|
407 |
+
/*modules page*/
|
408 |
+
.toolbar {
|
409 |
+
display: block;
|
410 |
+
margin-bottom: 0;
|
411 |
+
margin-left: 0;
|
412 |
+
margin-right: 0;
|
413 |
+
margin-top: 0;
|
414 |
+
background-attachment: scroll;
|
415 |
+
background-clip: border-box;
|
416 |
+
background-image: none;
|
417 |
+
background-origin: padding-box;
|
418 |
+
background-position: 0 0;
|
419 |
+
background-repeat: repeat;
|
420 |
+
background-size: auto auto;
|
421 |
+
border-bottom-color: #ccc;
|
422 |
+
border-bottom-style: solid;
|
423 |
+
border-bottom-width: 1px;
|
424 |
+
min-height: 42px;
|
425 |
+
padding-bottom: 8px;
|
426 |
+
padding-left: 10px;
|
427 |
+
padding-right: 10px;
|
428 |
+
padding-top: 8px;
|
429 |
+
background-color: #fff;
|
430 |
+
color: #666;
|
431 |
+
outline-color: -moz-use-text-color;
|
432 |
+
outline-style: none;
|
433 |
+
outline-width: 0;
|
434 |
+
position: relative;
|
435 |
+
}
|
436 |
+
|
437 |
+
#modules-chart .inline-group:after {
|
438 |
+
clear: both;
|
439 |
+
content: "";
|
440 |
+
display: table;
|
441 |
+
}
|
442 |
+
|
443 |
+
|
444 |
+
#modules-chart *, #modules-chart *:after, #modules-chart *:before {
|
445 |
+
box-sizing: content-box;
|
446 |
+
margin-bottom: 0;
|
447 |
+
margin-left: 0;
|
448 |
+
margin-right: 0;
|
449 |
+
margin-top: 0;
|
450 |
+
padding-bottom: 0;
|
451 |
+
padding-left: 0;
|
452 |
+
padding-right: 0;
|
453 |
+
padding-top: 0;
|
454 |
+
}
|
455 |
+
|
456 |
+
#modules-chart .inline-group .checkbox, #modules-chart .inline-group .radio {
|
457 |
+
float: left;
|
458 |
+
margin-right: 30px;
|
459 |
+
width: 130px
|
460 |
+
}
|
461 |
+
|
462 |
+
#modules-chart .checkbox, #modules-chart .radio {
|
463 |
+
color: #404040;
|
464 |
+
cursor: pointer;
|
465 |
+
font-size: 13px;
|
466 |
+
line-height: 25px;
|
467 |
+
margin-bottom: 4px;
|
468 |
+
padding-left: 25px;
|
469 |
+
}
|
470 |
+
|
471 |
+
#modules-chart .checkbox input, #modules-chart .radio input {
|
472 |
+
left: -9999px;
|
473 |
+
position: absolute;
|
474 |
+
}
|
475 |
+
|
476 |
+
#modules-chart input[type="checkbox"], .checkbox-inline input[type="checkbox"], .radio input[type="radio"], .radio-inline input[type="radio"] {
|
477 |
+
margin-left: -20px;
|
478 |
+
}
|
479 |
+
|
480 |
+
input[type="checkbox"], input[type="radio"] {
|
481 |
+
line-height: normal;
|
482 |
+
margin-bottom: 0;
|
483 |
+
margin-right: 0;
|
484 |
+
margin-top: 4px;
|
485 |
+
box-sizing: border-box;
|
486 |
+
padding-bottom: 0;
|
487 |
+
padding-left: 0;
|
488 |
+
padding-right: 0;
|
489 |
+
padding-top: 0;
|
490 |
+
}
|
491 |
+
|
492 |
+
#modules-chart .checkbox input:checked + i:after, #modules-chart .radio input:checked + i:after {
|
493 |
+
opacity: 1;
|
494 |
+
}
|
495 |
+
|
496 |
+
#modules-chart .checkbox input:checked + i:after {
|
497 |
+
-moz-font-feature-settings: normal;
|
498 |
+
-moz-font-language-override: normal;
|
499 |
+
-x-system-font: none;
|
500 |
+
content: "";
|
501 |
+
font-family: "Glyphicons Halflings";
|
502 |
+
font-size: 16px;
|
503 |
+
font-size-adjust: none;
|
504 |
+
font-stretch: normal;
|
505 |
+
font-style: normal;
|
506 |
+
font-variant: normal;
|
507 |
+
font-weight: 400;
|
508 |
+
height: 15px;
|
509 |
+
left: 1px;
|
510 |
+
line-height: 19px;
|
511 |
+
text-align: center;
|
512 |
+
top: -1px;
|
513 |
+
width: 15px;
|
514 |
+
color: #3276b1;
|
515 |
+
margin-right: 10px;
|
516 |
+
}
|
517 |
+
|
518 |
+
#modules-chart .checkbox input + i:after {
|
519 |
+
-moz-font-feature-settings: normal;
|
520 |
+
-moz-font-language-override: normal;
|
521 |
+
-x-system-font: none;
|
522 |
+
content: "";
|
523 |
+
font-family: "Glyphicons Halflings";
|
524 |
+
font-size: 16px;
|
525 |
+
font-size-adjust: none;
|
526 |
+
font-stretch: normal;
|
527 |
+
font-style: normal;
|
528 |
+
font-variant: normal;
|
529 |
+
font-weight: 400;
|
530 |
+
height: 15px;
|
531 |
+
left: 1px;
|
532 |
+
line-height: 19px;
|
533 |
+
text-align: center;
|
534 |
+
top: -1px;
|
535 |
+
width: 15px;
|
536 |
+
color: #3276b1;
|
537 |
+
margin-right: 10px;
|
538 |
+
}
|
539 |
+
|
540 |
+
#modules-chart .checkbox input:checked:hover + i:after{
|
541 |
+
content: "";
|
542 |
+
}
|
543 |
+
|
544 |
+
#modules-chart .checkbox input:checked + i, #modules-chart .radio input:checked + i, #modules-chart .toggle input:checked + i {
|
545 |
+
border-bottom-color: #3276b1;
|
546 |
+
border-left-color-ltr-source: physical;
|
547 |
+
border-left-color-rtl-source: physical;
|
548 |
+
border-left-color-value: #3276b1;
|
549 |
+
border-right-color-ltr-source: physical;
|
550 |
+
border-right-color-rtl-source: physical;
|
551 |
+
border-right-color-value: #3276b1;
|
552 |
+
border-top-color: #3276b1
|
553 |
+
}
|
554 |
+
|
555 |
+
#flot-container {
|
556 |
+
height: 235px;
|
557 |
+
width: 100%;
|
558 |
+
}
|
559 |
+
|
560 |
+
#flotTip{
|
561 |
+
padding:3px 5px;
|
562 |
+
background-color:#fff;
|
563 |
+
z-index:9999;
|
564 |
+
color:#333;
|
565 |
+
-webkit-box-shadow:0 1px 8px rgba(0,0,0,.1);
|
566 |
+
-moz-box-shadow:0 1px 8px rgba(0,0,0,.1);
|
567 |
+
box-shadow:0 1px 8px rgba(0,0,0,.1);
|
568 |
+
font-size:14px;
|
569 |
+
border:1px solid #C1C1C1;
|
570 |
+
-moz-border-radius:4px;
|
571 |
+
-khtml-border-radius:4px;
|
572 |
+
-webkit-border-radius:4px;
|
573 |
+
border-radius:4px
|
574 |
+
}
|
575 |
+
|
576 |
+
#flotTip p
|
577 |
+
{
|
578 |
+
text-align: center;
|
579 |
+
margin:0;
|
580 |
+
padding: 0;
|
581 |
+
}
|
582 |
+
|
583 |
+
#flotTip span{
|
584 |
+
color:#38812D;
|
585 |
+
font-weight:700
|
586 |
+
}
|
587 |
+
|
588 |
+
.module-pagination ul{
|
589 |
+
margin-top: 0;
|
590 |
+
margin-bottom: 0
|
591 |
+
}
|
592 |
+
|
593 |
+
.gdbc-settings h3.hndle
|
594 |
+
{
|
595 |
+
padding: 10px 12px 8px !important;
|
596 |
+
}
|
597 |
+
|
598 |
+
.gdbc-settings form table.form-table
|
599 |
+
{
|
600 |
+
width:auto !important;
|
601 |
+
position: relative !important;
|
602 |
+
}
|
603 |
+
|
604 |
+
.gdbc-settings form table.form-table tr
|
605 |
+
{
|
606 |
+
position:relative !important;
|
607 |
+
|
608 |
+
}
|
609 |
+
|
610 |
+
.gdbc-settings form table.form-table th
|
611 |
+
{
|
612 |
+
width: 265px !important;
|
613 |
+
padding: 18px 10px 12px 0 !important;
|
614 |
+
}
|
615 |
+
|
616 |
+
.gdbc-settings form table.form-table td
|
617 |
+
{
|
618 |
+
padding:10px 0;
|
619 |
+
}
|
620 |
+
|
621 |
+
.gdbc-settings form table.form-table td p
|
622 |
+
{
|
623 |
+
left: 0;
|
624 |
+
position: absolute;
|
625 |
+
width: 850px;
|
626 |
+
margin:0 !important;
|
627 |
+
}
|
628 |
+
|
629 |
+
.gdbc-settings form > h3
|
630 |
+
{
|
631 |
+
margin-bottom: 0 !important;
|
632 |
+
padding-bottom: 0 !important;
|
633 |
+
background: #EFEFEF;
|
634 |
+
margin: 0 -12px !important;
|
635 |
+
padding: 8px 12px;
|
636 |
+
border-bottom: 1px solid #cccccc;
|
637 |
+
border-top: 1px solid #cccccc;
|
638 |
+
|
639 |
+
}
|
640 |
+
.gdbc-settings p.submit
|
641 |
+
{
|
642 |
+
padding-top:0 !important;
|
643 |
+
}
|
644 |
+
.gdbc-settings form hr
|
645 |
+
{
|
646 |
+
margin:0 -12px !important;
|
647 |
+
}
|
648 |
+
|
649 |
+
.gdbc-settings div.error, .gdbc-settings div.updated {
|
650 |
+
margin: 15px 0 5px !important;
|
651 |
+
}
|
652 |
+
|
653 |
+
/*.toplevel_page_goodbye-captcha-settings form table.form-table th,*/
|
654 |
+
/*.toplevel_page_goodbye-captcha-settings form table.form-table td,*/
|
655 |
+
/*.goodbye-captcha-new_page_goodbye-captcha-security form table.form-table th,*/
|
656 |
+
/*.goodbye-captcha-new_page_goodbye-captcha-security form table.form-table td*/
|
657 |
+
/*{*/
|
658 |
+
/*padding-bottom: 30px !important;*/
|
659 |
+
/*}*/
|
660 |
+
|
661 |
+
.gdbc-settings form table.form-table td, .gdbc-settings form table.form-table th
|
662 |
+
{
|
663 |
+
padding-bottom: 30px !important;
|
664 |
+
}
|
665 |
+
.gdbc-settings #normal-sortables:empty, .gdbc-settings #advanced-sortables:empty, .gdbc-settings #bottom-sortables:empty
|
666 |
+
{
|
667 |
+
display:none;
|
668 |
+
}
|
669 |
+
|
670 |
+
.text-center
|
671 |
+
{
|
672 |
+
margin-top: 10px;
|
673 |
+
text-align: center !important;
|
674 |
+
}
|
675 |
+
|
676 |
+
.btn-label
|
677 |
+
{
|
678 |
+
background: none repeat scroll 0 0 rgba(0, 0, 0, 0.15);
|
679 |
+
border-radius: 3px 0 0 3px;
|
680 |
+
display: inline-block;
|
681 |
+
left: -12px;
|
682 |
+
padding: 6px 12px;
|
683 |
+
position: relative;
|
684 |
+
}
|
685 |
+
|
686 |
+
.btn {
|
687 |
+
border-radius: 2px;
|
688 |
+
box-shadow: 0 -2px 0 rgba(0, 0, 0, 0.05) inset;
|
689 |
+
}
|
690 |
+
|
691 |
+
a.btn-rate-gdbc
|
692 |
+
{
|
693 |
+
display:none;
|
694 |
+
}
|
695 |
+
|
696 |
+
a.btn-rate-gdbc:hover i.glyphicon
|
697 |
+
{
|
698 |
+
color: #ffff00;
|
699 |
+
}
|
700 |
+
|
701 |
+
.btn-labeled {
|
702 |
+
padding-bottom: 0;
|
703 |
+
padding-top: 0;
|
704 |
+
}
|
705 |
+
|
706 |
+
div.gdbcwidget ul.pagination a:hover
|
707 |
+
{
|
708 |
+
cursor: pointer;
|
709 |
+
}
|
710 |
+
|
711 |
+
#gdbc-barchart-holder div.morris-hover.morris-default-style p
|
712 |
+
{
|
713 |
+
font-weight: bold;
|
714 |
+
margin:0 !important;
|
715 |
+
}
|
716 |
+
#gdbc-barchart-holder div.morris-hover.morris-default-style p span
|
717 |
+
{
|
718 |
+
color: #972d2c;
|
719 |
+
}
|
720 |
+
|
721 |
+
.gdbc-settings .mch-right-side-holder h3.hndle
|
722 |
+
{
|
723 |
+
padding: 0 0 0 10px !important;
|
724 |
+
}
|
725 |
+
|
726 |
+
|
727 |
+
.gdbc-settings .mch-right-side-holder h3.hndle span, .gdbc-settings .mch-right-side-holder h2.hndle span
|
728 |
+
{
|
729 |
+
display:inline-block;
|
730 |
+
padding: 10px 0px 8px 22px !important;
|
731 |
+
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAyJJREFUOI1tkltMVHcQxr///5y9wYrsYvDAohSoGNDEqtDa1htirKttUAMxqfX2VJNWWy9JH9qGpDGpaRse7FtNNAaMrbZ2o42IUiwUUOMt1W5NINTCuixZ2MpyWXb37DlfH1oMUCeZZCaZ7zfJNyMwI2prKW/2dHqHR5Ibw0Px1RMJatludcWDaxsez5wFAHVqs+fDu+vOtFz9LBSOv54yCKsiYJWIpuwW43liABCTxY4Dd/b5moJfGwZV1yw1WJzvPPlSedb3EzZrf//C4tjGNXAsEhBwYqxCiPg0ysdf+GvSin20FflY7m1uOFjrdwPAe91cu8rPE/PvsDu3k1FPB0fW/8ad08QXrgzm5L18OWQp/JHed9rrAaAuQMdrfp7NaCftrWRWO6ndYEy7wfH1j7hrmgdXf3nydiic0OZp9uDe3aXvNzYATVGcvT2EqgwVoyvd+NzjwEVLAhElCWOBipHmqYRl3uY2teACq/Z21gHAwcesSmsltQ6OH+ph5fOto5xMNTgQX2y3KcjOtP0KAL+PY3MKQL4dTXVF4udJye4Dt4/W+/q2OtMtlPInCkETEFHVJAUAqBbTAIAUoYh/z5OculOxily7VSmxWiQJSlKA5ITM09K64gkTkWHjFQAoSUeLABBI4I1Pe7l8EjDPk3Vo5SpPfsUKrWBTZc4WKQVIJGS+x+EDgft/RLefuk57TQG+K3ehLZxE5oknuFT9iLv2dzMPG16IvXqyLHj+m7K+wvkZvaZJAIAsK81umDvH9vdf/bGiy9/eOlYhRMrrQHWJCy2jBnIaB3H6XBhd9WPoOXMPf27v4ptJh0hK/gf45PCLgX07C4+oisDF5oEP1my7/lWiAU8fLBGVNTnYsWA2rgk7JmIKsscATwywKZD6/155856Oj9puRY7puom5buvDRcXO40uXaY2h2e6RgJmaU+oSszIzhNSHGIr4gwt/uBRsTRkcfgYAgOp3b1bdfTh8NDQYX0wTcDokJBmxSsSEKk0CME2oVERaUqeL5Og0AAAc+XIgPdQb2NrTO/pWXyi+JKkbubrOGXOklFIH8PQfWXdiApL00zIAAAAASUVORK5CYII=') 0 center no-repeat;
|
732 |
+
}
|
733 |
+
.gdbc-settings .mch-right-side-holder h2.hndle span
|
734 |
+
{
|
735 |
+
padding:0 0 0 22px !important;
|
736 |
+
}
|
737 |
+
|
738 |
+
.gdbc-settings .metabox-holder h3 {
|
739 |
+
font-size: 14px;
|
740 |
+
line-height: 1.4;
|
741 |
+
margin: 0;
|
742 |
+
padding: 8px 12px;
|
743 |
+
}
|
744 |
+
|
745 |
+
/*#gdbc-help-metabox h3.hndle span*/
|
746 |
+
/*{*/
|
747 |
+
/*border-left: 4px solid #428bca;*/
|
748 |
+
/*}*/
|
749 |
+
|
750 |
+
|
751 |
+
#gdbc-help-metabox .logo-help {
|
752 |
+
width: 70%;
|
753 |
+
display:block;
|
754 |
+
margin: 0 auto;
|
755 |
+
padding:10px;
|
756 |
+
}
|
757 |
+
|
758 |
+
#gdbc-help-metabox .inside
|
759 |
+
{
|
760 |
+
margin:0;
|
761 |
+
background-color: #f9f9f9 !important;
|
762 |
+
}
|
763 |
+
|
764 |
+
#gdbc-help-metabox .contact-help {
|
765 |
+
display:block;
|
766 |
+
text-align: center;
|
767 |
+
border-top: 1px solid #ccc;
|
768 |
+
padding-top:10px;
|
769 |
+
}
|
770 |
+
|
771 |
+
|
772 |
+
div.mch-meta-notice
|
773 |
+
{}
|
774 |
+
|
775 |
+
div.mch-meta-notice-info
|
776 |
+
{
|
777 |
+
border-left:4px solid #428bca; padding:3px 8px; text-align: justify;
|
778 |
+
}
|
779 |
+
|
780 |
+
div.mch-meta-notice-warning
|
781 |
+
{
|
782 |
+
border-left:4px solid #ffba00; background:#fcf8e3; padding:3px 8px; text-align: center
|
783 |
+
}
|
784 |
+
|
785 |
+
|
786 |
+
/*div.mch-plugin-notice*/
|
787 |
+
/*{*/
|
788 |
+
|
789 |
+
/*}*/
|
790 |
+
|
791 |
+
/*div.mch-plugin-notice p*/
|
792 |
+
/*{*/
|
793 |
+
|
794 |
+
/*}*/
|
795 |
+
|
796 |
+
.report-spinner {
|
797 |
+
position: absolute;
|
798 |
+
left: 50%;
|
799 |
+
top: 50%;
|
800 |
+
height:40px;
|
801 |
+
width:40px;
|
802 |
+
margin:0px auto;
|
803 |
+
-webkit-animation: rotation .6s infinite linear;
|
804 |
+
-moz-animation: rotation .6s infinite linear;
|
805 |
+
-o-animation: rotation .6s infinite linear;
|
806 |
+
animation: rotation .6s infinite linear;
|
807 |
+
border-left:6px solid rgba(0,174,239,.15);
|
808 |
+
border-right:6px solid rgba(0,174,239,.15);
|
809 |
+
border-bottom:6px solid rgba(0,174,239,.15);
|
810 |
+
border-top:6px solid rgba(0,174,239,.8);
|
811 |
+
border-radius:100%;
|
812 |
+
}
|
813 |
+
|
814 |
+
@-webkit-keyframes rotation {
|
815 |
+
from {-webkit-transform: rotate(0deg);}
|
816 |
+
to {-webkit-transform: rotate(359deg);}
|
817 |
+
}
|
818 |
+
@-moz-keyframes rotation {
|
819 |
+
from {-moz-transform: rotate(0deg);}
|
820 |
+
to {-moz-transform: rotate(359deg);}
|
821 |
+
}
|
822 |
+
@-o-keyframes rotation {
|
823 |
+
from {-o-transform: rotate(0deg);}
|
824 |
+
to {-o-transform: rotate(359deg);}
|
825 |
+
}
|
826 |
+
@keyframes rotation {
|
827 |
+
from {transform: rotate(0deg);}
|
828 |
+
to {transform: rotate(359deg);}
|
829 |
+
}
|
830 |
+
|
831 |
+
|
832 |
+
|
assets/admin/styles/morris.css
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
1 |
+
.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}
|
2 |
+
.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}
|
assets/public/scripts/gdbc-client.js.php
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
defined( 'ABSPATH' ) || exit;
|
21 |
+
|
22 |
+
function gdbcRewriteNoCacheHeaders($arrHeaders)
|
23 |
+
{
|
24 |
+
$arrHeaders['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0';
|
25 |
+
$arrHeaders['Content-Type'] = 'application/javascript; charset=utf-8';
|
26 |
+
|
27 |
+
return $arrHeaders;
|
28 |
+
}
|
29 |
+
|
30 |
+
add_filter('nocache_headers', 'gdbcRewriteNoCacheHeaders', 1);
|
31 |
+
|
32 |
+
nocache_headers();
|
33 |
+
|
34 |
+
|
35 |
+
?>
|
36 |
+
|
37 |
+
(function($) {
|
38 |
+
$.GdbcClient = function(el, options) {
|
39 |
+
var gdbcClient = this, defaults = {};
|
40 |
+
gdbcClient.settings = {};
|
41 |
+
var init = function() {
|
42 |
+
gdbcClient.settings = $.extend({}, defaults, options);
|
43 |
+
};
|
44 |
+
|
45 |
+
gdbcClient.requestTokens = function() {
|
46 |
+
$('form input[name=' + Gdbc.formFieldName + ']').each(function(){
|
47 |
+
requestTokenValue($(this));
|
48 |
+
});
|
49 |
+
};
|
50 |
+
|
51 |
+
var requestTokenValue = function(elm) {
|
52 |
+
var ajaxData = {};
|
53 |
+
|
54 |
+
ajaxData[Gdbc.formFieldName] = '<?php echo GdbcAjaxController::getAjaxNonce(); ?>';
|
55 |
+
ajaxData['action'] = '<?php echo GdbcAjaxController::ACTION_RETRIEVE_TOKEN ?>';
|
56 |
+
ajaxData['requestTime'] = (new Date()).getTime();
|
57 |
+
ajaxData['browserInfo'] = JSON.stringify(Gdbc.browserInfo);
|
58 |
+
$.ajax({
|
59 |
+
type : "post",
|
60 |
+
cache: false,
|
61 |
+
dataType : "json",
|
62 |
+
url : Gdbc.ajaxUrl + '?t=' + ajaxData['requestTime'],
|
63 |
+
data : ajaxData,
|
64 |
+
success: function(response){
|
65 |
+
$.each(response.data, function(prop, val){
|
66 |
+
if(prop === 'token'){
|
67 |
+
elm.val(val);return;
|
68 |
+
}
|
69 |
+
|
70 |
+
var value = '', arrValues = val.split('|');
|
71 |
+
for(var i=0; i<arrValues.length; ++i) {
|
72 |
+
if (Gdbc.browserInfo.hasOwnProperty(arrValues[i]))
|
73 |
+
value += Gdbc.browserInfo[arrValues[i]];
|
74 |
+
}
|
75 |
+
$('<input>').prop({type:'hidden',name:prop,value:value}).appendTo(elm.closest('form'));
|
76 |
+
});
|
77 |
+
}
|
78 |
+
});
|
79 |
+
};
|
80 |
+
init();
|
81 |
+
}
|
82 |
+
})(jQuery);
|
83 |
+
|
84 |
+
jQuery(document).ready(function($){(new $.GdbcClient()).requestTokens();});
|
assets/public/scripts/gdbc-public.js
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function(g,d,b,c){b = g.createElement('script');c=g.scripts[0];b.async=1;b.src=Gdbc.clientUrl+'-'+(new Date()).getTime();c.parentNode.insertBefore(b,c);})(document);
|
2 |
+
|
3 |
+
jQuery(document).ready(function($) {"use strict";
|
4 |
+
var w=window,d=document,e=0,f=0;e|=w.ActiveXObject?1:0;e|=w.opera?2:0;e|=w.chrome?4:0;
|
5 |
+
e|='getBoxObjectFor' in d || 'mozInnerScreenX' in w?8:0;e|=('WebKitCSSMatrix' in w||'WebKitPoint' in w||'webkitStorageInfo' in w||'webkitURL' in w)?16:0;
|
6 |
+
e|=(e&16&&({}.toString).toString().indexOf("\n")===-1)?32:0;f|='sandbox' in d.createElement('iframe')?1:0;f|='WebSocket' in w?2:0;
|
7 |
+
f|=w.Worker?4:0;f|=w.applicationCache?8:0;f|=w.history && history.pushState?16:0;f|=d.documentElement.webkitRequestFullScreen?32:0;f|='FileReader' in w?64:0;
|
8 |
+
|
9 |
+
var ua = navigator.userAgent.toLowerCase();
|
10 |
+
var regex = /compatible; ([\w.+]+)[ \/]([\w.+]*)|([\w .+]+)[: \/]([\w.+]+)|([\w.+]+)/g;
|
11 |
+
var match = regex.exec(ua);
|
12 |
+
Gdbc.browserInfo = {screenWidth:screen.width,screenHeight:screen.height,engine:e,features:f};
|
13 |
+
while (match !== null) {
|
14 |
+
var prop = {};
|
15 |
+
if (match[1]) {
|
16 |
+
prop.type = match[1];
|
17 |
+
prop.version = match[2];
|
18 |
+
} else if (match[3]) {
|
19 |
+
prop.type = match[3];
|
20 |
+
prop.version = match[4];
|
21 |
+
} else {
|
22 |
+
prop.type = match[5];
|
23 |
+
}
|
24 |
+
prop.type = $.trim(prop.type).replace(".","").replace(" ","_");
|
25 |
+
var value = prop.version ? prop.version : true;
|
26 |
+
if (Gdbc.browserInfo[prop.type]) {
|
27 |
+
!$.isArray(Gdbc.browserInfo[prop.type])?Gdbc.browserInfo[prop.type]=new Array(Gdbc.browserInfo[prop.type]):'';
|
28 |
+
Gdbc.browserInfo[prop.type].push(value);
|
29 |
+
}
|
30 |
+
else Gdbc.browserInfo[prop.type] = value;
|
31 |
+
match = regex.exec(ua);
|
32 |
+
}
|
33 |
+
});
|
assets/public/scripts/index.php
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
<?php // Silence is golden
|
engine/GdbcAjaxController.php
ADDED
@@ -0,0 +1,166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GdbcAjaxController
|
21 |
+
{
|
22 |
+
CONST ACTION_RETRIEVE_TOKEN = 'gdbcRetrieveToken';
|
23 |
+
CONST AJAX_NONCE_VALUE = __CLASS__;
|
24 |
+
|
25 |
+
public static function processRequest()
|
26 |
+
{
|
27 |
+
if( ! GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS) )
|
28 |
+
return;
|
29 |
+
|
30 |
+
if(self::isPublicGdbcAjaxRequest() ) {
|
31 |
+
|
32 |
+
self::sendAjaxHeaders();
|
33 |
+
|
34 |
+
if ( ! self::clientCanRetrieveToken() ) {
|
35 |
+
wp_send_json_error();
|
36 |
+
}
|
37 |
+
|
38 |
+
$arrTokenData = GdbcRequestController::getEncryptedToken();
|
39 |
+
|
40 |
+
wp_send_json_success( $arrTokenData );
|
41 |
+
|
42 |
+
exit;
|
43 |
+
}
|
44 |
+
|
45 |
+
if( ! did_action ('plugins_loaded') )
|
46 |
+
return;
|
47 |
+
|
48 |
+
foreach(array(
|
49 |
+
|
50 |
+
GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP,
|
51 |
+
GdbcModulesController::MODULE_ZM_ALR,
|
52 |
+
GdbcModulesController::MODULE_NINJA_FORMS,
|
53 |
+
GdbcModulesController::MODULE_USER_PRO,
|
54 |
+
|
55 |
+
) as $moduleName){
|
56 |
+
|
57 |
+
if(null === ($publicModuleInstance = GdbcModulesController::getPublicModuleInstance($moduleName)))
|
58 |
+
continue;
|
59 |
+
|
60 |
+
$publicModuleInstance->registerAttachedHooks();
|
61 |
+
}
|
62 |
+
|
63 |
+
|
64 |
+
|
65 |
+
|
66 |
+
if(self::isAdminAjaxRequestValid())
|
67 |
+
{
|
68 |
+
$arrAjaxAdminReportsActions = array(
|
69 |
+
'retrieveInitialDashboardData',
|
70 |
+
'retrieveLatestAttemptsTable',
|
71 |
+
'retrieveTotalAttemptsPerModule',
|
72 |
+
'retrieveDetailedAttemptsForChart',
|
73 |
+
'retrieveDetailedAttemptsPerModule',
|
74 |
+
'retrieveFormattedBlockedContent',
|
75 |
+
'retrieveAttemptsPerModuleAndSection',
|
76 |
+
'retrieveAttemptsPerClientIp',
|
77 |
+
'manageClientIpAddress',
|
78 |
+
);
|
79 |
+
|
80 |
+
foreach ($arrAjaxAdminReportsActions as $adminAjaxActionRequest) {
|
81 |
+
add_action('wp_ajax_' . $adminAjaxActionRequest, array(GdbcReportsAdminModule::getInstance(), $adminAjaxActionRequest));
|
82 |
+
}
|
83 |
+
|
84 |
+
foreach(GoodByeCaptchaAdmin::getAdminRegisteredNotices() as $adminNotice){
|
85 |
+
if( !($adminNotice instanceof GdbcAdminNotice) || !$adminNotice->isDismissible())
|
86 |
+
continue;
|
87 |
+
|
88 |
+
add_action('wp_ajax_gdbc-dismiss-' . $adminNotice->getFormattedNoticeKey(), array($adminNotice, 'dismiss'));
|
89 |
+
}
|
90 |
+
|
91 |
+
}
|
92 |
+
|
93 |
+
|
94 |
+
}
|
95 |
+
|
96 |
+
private static function clientCanRetrieveToken()
|
97 |
+
{
|
98 |
+
$settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
|
99 |
+
if(null === $settingsModuleInstance)
|
100 |
+
return false;
|
101 |
+
|
102 |
+
if(null === ($hiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME)))
|
103 |
+
return false;
|
104 |
+
|
105 |
+
if(empty($_POST[$hiddenInputName]))
|
106 |
+
return false;
|
107 |
+
|
108 |
+
if(!isset($_SERVER['HTTP_ACCEPT']) || false === stripos($_SERVER['HTTP_ACCEPT'], 'json'))
|
109 |
+
return false;
|
110 |
+
|
111 |
+
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) || (0 !== strcasecmp($_SERVER['HTTP_X_REQUESTED_WITH'], 'XMLHttpRequest')))
|
112 |
+
return false;
|
113 |
+
|
114 |
+
require_once( ABSPATH . WPINC . '/pluggable.php' );
|
115 |
+
|
116 |
+
( !defined('LOGGED_IN_COOKIE') && function_exists('wp_cookie_constants') ) ? wp_cookie_constants() : null;
|
117 |
+
|
118 |
+
if(!GoodByeCaptchaUtils::isValidReferer())
|
119 |
+
return false;
|
120 |
+
|
121 |
+
if(false === wp_verify_nonce($_POST[$hiddenInputName], __CLASS__))
|
122 |
+
return false;
|
123 |
+
|
124 |
+
|
125 |
+
if(GdbcIPUtils::isIpAddressBlocked(GdbcIPUtils::getClientIpAddress()))
|
126 |
+
return false;
|
127 |
+
|
128 |
+
return true;
|
129 |
+
|
130 |
+
}
|
131 |
+
|
132 |
+
|
133 |
+
private static function sendAjaxHeaders()
|
134 |
+
{
|
135 |
+
wp_magic_quotes();
|
136 |
+
send_origin_headers();
|
137 |
+
|
138 |
+
@header('X-Robots-Tag: noindex' );
|
139 |
+
|
140 |
+
send_nosniff_header();
|
141 |
+
nocache_headers();
|
142 |
+
|
143 |
+
@header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
|
144 |
+
@header('Content-Type: application/json; charset=' . get_option( 'blog_charset' ));
|
145 |
+
}
|
146 |
+
|
147 |
+
private static function isPublicGdbcAjaxRequest()
|
148 |
+
{
|
149 |
+
if(empty($_POST['browserInfo']) || empty($_POST['action']) || (self::ACTION_RETRIEVE_TOKEN !== $_POST['action']))
|
150 |
+
return false;
|
151 |
+
|
152 |
+
return true;
|
153 |
+
}
|
154 |
+
|
155 |
+
public static function getAjaxNonce()
|
156 |
+
{
|
157 |
+
require_once( ABSPATH . WPINC . '/pluggable.php' );
|
158 |
+
|
159 |
+
return wp_create_nonce(__CLASS__);
|
160 |
+
}
|
161 |
+
|
162 |
+
public static function isAdminAjaxRequestValid()
|
163 |
+
{
|
164 |
+
return check_ajax_referer(self::AJAX_NONCE_VALUE, 'ajaxRequestNonce', false);
|
165 |
+
}
|
166 |
+
}
|
engine/GdbcBruteGuardian.php
ADDED
@@ -0,0 +1,230 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GdbcBruteGuardian
|
21 |
+
{
|
22 |
+
|
23 |
+
private static $arrSecurityDirectoryFiles = array(
|
24 |
+
'.htaccess' => 'deny from all',
|
25 |
+
'index.php' => '<?php',
|
26 |
+
'index.html' => '',
|
27 |
+
);
|
28 |
+
|
29 |
+
private static $SITE_UNDER_ATTACK_FLAG = 'gdbc-under-attack-detected';
|
30 |
+
private static $SITE_ATTACK_WARNING_FLAG = 'gdbc-suspicious-ips-detected';
|
31 |
+
|
32 |
+
public static function startGuarding()
|
33 |
+
{
|
34 |
+
if( !GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS) )
|
35 |
+
return;
|
36 |
+
|
37 |
+
if( empty($_POST) )
|
38 |
+
return;
|
39 |
+
|
40 |
+
$loginAttemptsHits = 0;
|
41 |
+
$arrLatestLoginAttempts = GdbcDbAccessController::getLatestLoginAttempts(60, false);
|
42 |
+
foreach($arrLatestLoginAttempts as $index => $loginAttempt){
|
43 |
+
$loginAttemptsHits += $loginAttempt->Hits;
|
44 |
+
$arrLatestLoginAttempts[$loginAttempt->ClientIp] = $loginAttempt->Hits;
|
45 |
+
unset($arrLatestLoginAttempts[$index]);
|
46 |
+
}
|
47 |
+
|
48 |
+
switch(true)
|
49 |
+
{
|
50 |
+
case ($loginAttemptsHits > 35 && !self::isSiteUnderAttack()) :
|
51 |
+
|
52 |
+
self::triggerSiteUnderAttack();
|
53 |
+
|
54 |
+
GdbcNotificationsController::sendBruteForceAttackDetectedEmailNotification($arrLatestLoginAttempts);
|
55 |
+
|
56 |
+
break;
|
57 |
+
|
58 |
+
case ($loginAttemptsHits > 25 && !self::isSiteUnderAttack()) :
|
59 |
+
|
60 |
+
break;
|
61 |
+
|
62 |
+
|
63 |
+
case ($loginAttemptsHits < 15) :
|
64 |
+
|
65 |
+
if(self::isSiteUnderAttack()){
|
66 |
+
self::unTriggerSiteUnderAttack();
|
67 |
+
}
|
68 |
+
|
69 |
+
break;
|
70 |
+
}
|
71 |
+
|
72 |
+
|
73 |
+
if(self::isSiteUnderAttack() && GdbcBruteForcePublicModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_AUTO_BLOCK_IP)) {
|
74 |
+
if( isset($arrLatestLoginAttempts[GdbcIPUtils::getClientIpAddress()]) && $arrLatestLoginAttempts[GdbcIPUtils::getClientIpAddress()] > 4 && (!GdbcIPUtils::isClientIpBlackListed()) ){
|
75 |
+
GdbcBlackListedIpsAdminModule::getInstance()->registerBlackListedIp(GdbcIPUtils::getClientIpAddress());
|
76 |
+
}
|
77 |
+
}
|
78 |
+
|
79 |
+
}
|
80 |
+
|
81 |
+
|
82 |
+
private static function isSiteUnderAttack()
|
83 |
+
{
|
84 |
+
static $siteUnderAttack = null;
|
85 |
+
if(null !== $siteUnderAttack)
|
86 |
+
return $siteUnderAttack;
|
87 |
+
|
88 |
+
return $siteUnderAttack = self::flagExists(self::$SITE_UNDER_ATTACK_FLAG);
|
89 |
+
}
|
90 |
+
|
91 |
+
private static function triggerSiteUnderAttack()
|
92 |
+
{
|
93 |
+
self::setSiteFlag(self::$SITE_UNDER_ATTACK_FLAG, true);
|
94 |
+
|
95 |
+
GdbcSettingsAdminModule::getInstance()->saveSecuredOptions(true);
|
96 |
+
|
97 |
+
}
|
98 |
+
|
99 |
+
private static function unTriggerSiteUnderAttack()
|
100 |
+
{
|
101 |
+
self::setSiteFlag(self::$SITE_UNDER_ATTACK_FLAG, false);
|
102 |
+
}
|
103 |
+
|
104 |
+
private static function flagExists($flagName)
|
105 |
+
{
|
106 |
+
$cacheHolder = GoodByeCaptchaUtils::getAvailableCacheStorage(self::getBaseCacheDirectoryPath());
|
107 |
+
if(null === $cacheHolder)
|
108 |
+
return 0;
|
109 |
+
|
110 |
+
return $cacheHolder->has($flagName);
|
111 |
+
}
|
112 |
+
|
113 |
+
private static function setSiteFlag($flagName, $flagBooleanValue)
|
114 |
+
{
|
115 |
+
$cacheHolder = GoodByeCaptchaUtils::getAvailableCacheStorage(self::getBaseCacheDirectoryPath());
|
116 |
+
if(null === $cacheHolder)
|
117 |
+
return ;
|
118 |
+
|
119 |
+
if(false === $flagBooleanValue){
|
120 |
+
return $cacheHolder->delete($flagName);
|
121 |
+
}
|
122 |
+
|
123 |
+
if($cacheHolder->getCacheStorage() instanceof MchGdbcCacheFileStorage)
|
124 |
+
{
|
125 |
+
foreach(self::$arrSecurityDirectoryFiles as $fileName => $fileContent)
|
126 |
+
{
|
127 |
+
$filePath = self::getBaseCacheDirectoryPath() . DIRECTORY_SEPARATOR . $fileName;
|
128 |
+
if(MchGdbcWpUtils::fileExists($filePath))
|
129 |
+
break;
|
130 |
+
|
131 |
+
MchGdbcWpUtils::writeContentToFile($fileContent, $filePath, false);
|
132 |
+
}
|
133 |
+
}
|
134 |
+
|
135 |
+
$cacheHolder->write($flagName, MchGdbcHttpRequest::getServerRequestTime(false));
|
136 |
+
}
|
137 |
+
|
138 |
+
private static function getBaseCacheDirectoryPath()
|
139 |
+
{
|
140 |
+
static $cacheDirectoryPath = false;
|
141 |
+
if(false !== $cacheDirectoryPath)
|
142 |
+
return $cacheDirectoryPath;
|
143 |
+
|
144 |
+
$cacheDirectoryPath = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_CACHE_DIR_PATH);
|
145 |
+
if(!empty($cacheDirectoryPath)){
|
146 |
+
$cacheDirectoryPath .= DIRECTORY_SEPARATOR . GoodByeCaptcha::PLUGIN_SLUG . DIRECTORY_SEPARATOR . get_current_blog_id();
|
147 |
+
if(MchGdbcWpUtils::isDirectoryUsable($cacheDirectoryPath, true)){
|
148 |
+
return $cacheDirectoryPath;
|
149 |
+
}
|
150 |
+
}
|
151 |
+
|
152 |
+
$cacheDirectoryPath = MchGdbcWpUtils::getDirectoryPathForCache();
|
153 |
+
if(null === $cacheDirectoryPath)
|
154 |
+
return null;
|
155 |
+
|
156 |
+
$cacheDirectoryPath .= DIRECTORY_SEPARATOR . GoodByeCaptcha::PLUGIN_SLUG . DIRECTORY_SEPARATOR . get_current_blog_id();
|
157 |
+
if(! MchGdbcWpUtils::isDirectoryUsable($cacheDirectoryPath, true) ) {
|
158 |
+
return $cacheDirectoryPath = null;
|
159 |
+
}
|
160 |
+
|
161 |
+
GdbcSettingsAdminModule::getInstance()->saveOption(GdbcSettingsAdminModule::OPTION_CACHE_DIR_PATH, MchGdbcWpUtils::getDirectoryPathForCache());
|
162 |
+
|
163 |
+
return $cacheDirectoryPath;
|
164 |
+
}
|
165 |
+
|
166 |
+
public static function logRejectedAttempt(GdbcAttemptEntity $attemptEntity)
|
167 |
+
{
|
168 |
+
if( ((int)GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_MAX_LOGS_DAYS)) < 1 ) //logs are NOT enabled
|
169 |
+
return;
|
170 |
+
|
171 |
+
$attemptEntity->SiteId = get_current_blog_id();
|
172 |
+
$attemptEntity->CreatedDate = MchGdbcHttpRequest::getServerRequestTime();
|
173 |
+
$attemptEntity->ClientIp = GdbcIPUtils::getClientIpAddress();
|
174 |
+
|
175 |
+
|
176 |
+
if( ((int)GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_BLOCKED_CONTENT_LOG_DAYS)) < 1 ) //blocked content logs are NOT enabled
|
177 |
+
$attemptEntity->Notes = null;
|
178 |
+
|
179 |
+
|
180 |
+
GdbcDbAccessController::registerAttempt( $attemptEntity );
|
181 |
+
|
182 |
+
// if(self::isSiteUnderAttack() && GoodByeCaptchaUtils::isLoginAttemptEntity($attemptEntity) && ( !GdbcIPUtils::isClientIpWhiteListed() )){
|
183 |
+
// self::registerClientIpBruteForceRequest();
|
184 |
+
// }
|
185 |
+
|
186 |
+
}
|
187 |
+
|
188 |
+
private static function getIpAddressDirPath($flagName, $ipAddress)
|
189 |
+
{
|
190 |
+
if (null === self::getBaseCacheDirectoryPath())
|
191 |
+
return null;
|
192 |
+
|
193 |
+
$subDirectoryName = null;
|
194 |
+
switch ($flagName)
|
195 |
+
{
|
196 |
+
case self::$SITE_UNDER_ATTACK_FLAG : $subDirectoryName = 'brute-ips'; break;
|
197 |
+
case self::$SITE_ATTACK_WARNING_FLAG : $subDirectoryName = 'suspicious-ips'; break;
|
198 |
+
}
|
199 |
+
|
200 |
+
return self::getBaseCacheDirectoryPath() . DIRECTORY_SEPARATOR . $subDirectoryName . DIRECTORY_SEPARATOR . $ipAddress;
|
201 |
+
}
|
202 |
+
|
203 |
+
private static function isClientIpBruteForcing()
|
204 |
+
{
|
205 |
+
return @is_dir(self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()));
|
206 |
+
}
|
207 |
+
|
208 |
+
private static function registerClientIpBruteForceRequest()
|
209 |
+
{
|
210 |
+
if(self::isClientIpBruteForcing())
|
211 |
+
{
|
212 |
+
MchGdbcWpUtils::writeContentToFile(null, self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()) . DIRECTORY_SEPARATOR . MchGdbcHttpRequest::getServerRequestTime(true) . '.gdbc', false);
|
213 |
+
return;
|
214 |
+
}
|
215 |
+
|
216 |
+
if( ! MchGdbcWpUtils::isDirectoryUsable(self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()), true) )
|
217 |
+
return;
|
218 |
+
|
219 |
+
foreach(self::$arrSecurityDirectoryFiles as $fileName => $fileContent){
|
220 |
+
$filePath = self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()) . DIRECTORY_SEPARATOR . $fileName;
|
221 |
+
MchGdbcWpUtils::writeContentToFile($fileContent, $filePath, false);
|
222 |
+
}
|
223 |
+
|
224 |
+
MchGdbcWpUtils::writeContentToFile(null, self::getIpAddressDirPath(self::$SITE_UNDER_ATTACK_FLAG, GdbcIPUtils::getClientIpAddress()) . DIRECTORY_SEPARATOR . MchGdbcHttpRequest::getServerRequestTime(true) . '.gdbc', false);
|
225 |
+
}
|
226 |
+
|
227 |
+
private function __construct()
|
228 |
+
{}
|
229 |
+
|
230 |
+
}
|
engine/GdbcIPUtils.php
ADDED
@@ -0,0 +1,404 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright (C) 2015 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
final class GdbcIPUtils
|
22 |
+
{
|
23 |
+
|
24 |
+
public static function getClientIpAddress()
|
25 |
+
{
|
26 |
+
return MchGdbcHttpRequest::getClientIp(array());
|
27 |
+
}
|
28 |
+
|
29 |
+
public static function isClientIpBlackListed()
|
30 |
+
{
|
31 |
+
return self::isIpBlackListed(self::getClientIpAddress());
|
32 |
+
}
|
33 |
+
|
34 |
+
public static function isClientIpWhiteListed()
|
35 |
+
{
|
36 |
+
return self::isIpWhiteListed(self::getClientIpAddress());
|
37 |
+
}
|
38 |
+
|
39 |
+
public static function isIpWhiteListed($ipAddress)
|
40 |
+
{
|
41 |
+
static $arrWhiteVerifiedIPs = array();
|
42 |
+
if(isset($arrWhiteVerifiedIPs[$ipAddress]))
|
43 |
+
return $arrWhiteVerifiedIPs[$ipAddress];
|
44 |
+
|
45 |
+
if( self::isIpInFormattedRanges($ipAddress, GdbcWhiteListedIpsPublicModule::getInstance()->getOption(GdbcWhiteListedIpsAdminModule::OPTION_WHITE_LISTED_IPS)) )
|
46 |
+
$arrWhiteVerifiedIPs[$ipAddress] = true;
|
47 |
+
|
48 |
+
return isset($arrWhiteVerifiedIPs[$ipAddress]);
|
49 |
+
|
50 |
+
}
|
51 |
+
|
52 |
+
public static function isIpBlackListed($ipAddress)
|
53 |
+
{
|
54 |
+
static $arrBlackVerifiedIPs = array();
|
55 |
+
if(isset($arrBlackVerifiedIPs[$ipAddress]))
|
56 |
+
return $arrBlackVerifiedIPs[$ipAddress];
|
57 |
+
|
58 |
+
if(self::isIpInFormattedRanges($ipAddress, GdbcBlackListedIpsPublicModule::getInstance()->getOption(GdbcBlackListedIpsAdminModule::OPTION_BLACK_LISTED_IPS)))
|
59 |
+
$arrBlackVerifiedIPs[$ipAddress] = true;
|
60 |
+
|
61 |
+
return isset($arrBlackVerifiedIPs[$ipAddress]);
|
62 |
+
}
|
63 |
+
|
64 |
+
|
65 |
+
public static function isIpAddressBlocked($ipAddress)
|
66 |
+
{
|
67 |
+
if(self::isIpBlackListed($ipAddress))
|
68 |
+
return true;
|
69 |
+
|
70 |
+
if(null === ($bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE)))
|
71 |
+
return false;
|
72 |
+
|
73 |
+
if($bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS) && MchGdbcUnTrustedIPRanges::isAttachingHostIP($ipAddress))
|
74 |
+
return true;
|
75 |
+
|
76 |
+
if($bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY) && MchGdbcUnTrustedIPRanges::isAnonymizerProxyIP($ipAddress))
|
77 |
+
return true;
|
78 |
+
|
79 |
+
return false;
|
80 |
+
|
81 |
+
}
|
82 |
+
|
83 |
+
public static function isClientIpProxyAnonymizer($checkBruteForceModuleSettings = true)
|
84 |
+
{
|
85 |
+
static $isAnonymizer = null;
|
86 |
+
if(null !== $isAnonymizer)
|
87 |
+
return $isAnonymizer;
|
88 |
+
|
89 |
+
$bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE);
|
90 |
+
if(null === $bruteForceModuleInstance)
|
91 |
+
return $isAnonymizer = false;
|
92 |
+
|
93 |
+
if( $checkBruteForceModuleSettings && (! $bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY)) )
|
94 |
+
return $isAnonymizer = false;
|
95 |
+
|
96 |
+
return $isAnonymizer = MchGdbcUnTrustedIPRanges::isAnonymizerProxyIP(GdbcIPUtils::getClientIpAddress());
|
97 |
+
}
|
98 |
+
|
99 |
+
public static function isClientIpWebAttacker($checkBruteForceModuleSettings = true)
|
100 |
+
{
|
101 |
+
static $isAttacker = null;
|
102 |
+
if(null !== $isAttacker)
|
103 |
+
return $isAttacker;
|
104 |
+
|
105 |
+
$bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE);
|
106 |
+
if(null === $bruteForceModuleInstance)
|
107 |
+
return $isAttacker = false;
|
108 |
+
|
109 |
+
if( $checkBruteForceModuleSettings && (! $bruteForceModuleInstance->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS)) )
|
110 |
+
return $isAttacker = false;
|
111 |
+
|
112 |
+
return $isAttacker = MchGdbcUnTrustedIPRanges::isAttachingHostIP(GdbcIPUtils::getClientIpAddress());
|
113 |
+
|
114 |
+
}
|
115 |
+
|
116 |
+
public static function isIpProxyAnonymizer($ipAddress)
|
117 |
+
{
|
118 |
+
return MchGdbcUnTrustedIPRanges::isAnonymizerProxyIP($ipAddress);
|
119 |
+
}
|
120 |
+
|
121 |
+
public static function isIpWebAttacker($ipAddress)
|
122 |
+
{
|
123 |
+
return MchGdbcUnTrustedIPRanges::isAttachingHostIP($ipAddress);
|
124 |
+
}
|
125 |
+
|
126 |
+
|
127 |
+
|
128 |
+
|
129 |
+
|
130 |
+
public static function isIpInFormattedRanges($ipAddress, $arrFormattedRanges)
|
131 |
+
{
|
132 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
|
133 |
+
|
134 |
+
if( -1 === $ipVersion )
|
135 |
+
return false;
|
136 |
+
|
137 |
+
if(empty($arrFormattedRanges[$ipVersion]))
|
138 |
+
return false;
|
139 |
+
|
140 |
+
|
141 |
+
if($ipVersion === MchGdbcIPUtils::IP_VERSION_6)
|
142 |
+
{
|
143 |
+
$ipAddress = MchGdbcIPUtils::compressIPV6($ipAddress);
|
144 |
+
if(isset($arrFormattedRanges[$ipVersion][$ipAddress]))
|
145 |
+
return true;
|
146 |
+
|
147 |
+
foreach($arrFormattedRanges[$ipVersion] as $blockedIPRange => $value)
|
148 |
+
{
|
149 |
+
if(false === strpos($blockedIPRange, '/'))
|
150 |
+
continue;
|
151 |
+
|
152 |
+
if( ! MchGdbcIPUtils::isIpInCIDRRange($ipAddress, $blockedIPRange, MchGdbcIPUtils::IP_VERSION_6, true) )
|
153 |
+
continue;
|
154 |
+
|
155 |
+
return true;
|
156 |
+
}
|
157 |
+
|
158 |
+
return false;
|
159 |
+
}
|
160 |
+
|
161 |
+
$ipNumber = MchGdbcIPUtils::ipAddressToNumber($ipAddress, MchGdbcIPUtils::IP_VERSION_4);
|
162 |
+
if(isset($arrFormattedRanges[$ipVersion][$ipNumber])) // single IP
|
163 |
+
return true;
|
164 |
+
|
165 |
+
foreach($arrFormattedRanges[$ipVersion] as $minIpNumber => $maxIpNumber)
|
166 |
+
{
|
167 |
+
if( (1 !== $maxIpNumber) && ($minIpNumber <= $ipNumber) && ($ipNumber <= $maxIpNumber) )
|
168 |
+
return true;
|
169 |
+
}
|
170 |
+
|
171 |
+
return false;
|
172 |
+
|
173 |
+
}
|
174 |
+
|
175 |
+
|
176 |
+
public static function removeIpFromFormattedRange($ipAddress, $arrFormattedRange)
|
177 |
+
{
|
178 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
|
179 |
+
if(-1 === $ipVersion)
|
180 |
+
return $arrFormattedRange;
|
181 |
+
|
182 |
+
if($ipVersion === MchGdbcIPUtils::IP_VERSION_6)
|
183 |
+
{
|
184 |
+
unset($arrFormattedRange[MchGdbcIPUtils::compressIPV6($ipAddress)]);
|
185 |
+
return $arrFormattedRange;
|
186 |
+
}
|
187 |
+
|
188 |
+
$ipNumber = MchGdbcIPUtils::ipAddressToNumber($ipAddress, $ipVersion);
|
189 |
+
if(isset($arrFormattedRange[$ipNumber]) && 1 == $arrFormattedRange[$ipNumber])
|
190 |
+
{
|
191 |
+
unset($arrFormattedRange[$ipNumber]);
|
192 |
+
return $arrFormattedRange;
|
193 |
+
}
|
194 |
+
|
195 |
+
$arrSingleIPs = array();
|
196 |
+
$arrNewRanges = array();
|
197 |
+
foreach($arrFormattedRange as $minValue => $maxValue)
|
198 |
+
{
|
199 |
+
if(1 == $maxValue)
|
200 |
+
{
|
201 |
+
$arrSingleIPs[$minValue] = $maxValue;
|
202 |
+
continue;
|
203 |
+
}
|
204 |
+
|
205 |
+
if( ($minValue > $ipNumber) || ($ipNumber > $maxValue) )
|
206 |
+
{
|
207 |
+
$arrNewRanges[] = array($minValue, $maxValue);
|
208 |
+
continue;
|
209 |
+
}
|
210 |
+
|
211 |
+
if($minValue == $ipNumber)
|
212 |
+
{
|
213 |
+
if($minValue + 1 <= $maxValue) {
|
214 |
+
$arrNewRanges[] = array( $minValue + 1, $maxValue );
|
215 |
+
}
|
216 |
+
unset($arrFormattedRange[$minValue]);
|
217 |
+
continue;
|
218 |
+
}
|
219 |
+
|
220 |
+
if($maxValue == $ipNumber)
|
221 |
+
{
|
222 |
+
if($minValue <= $maxValue - 1) {
|
223 |
+
$arrNewRanges[] = array( $minValue, $maxValue - 1 );
|
224 |
+
}
|
225 |
+
unset($arrFormattedRange[$minValue]);
|
226 |
+
continue;
|
227 |
+
}
|
228 |
+
|
229 |
+
if($minValue == $ipNumber - 1)
|
230 |
+
{
|
231 |
+
$arrSingleIPs[$minValue] = 1;
|
232 |
+
$arrNewRanges[] = array( $ipNumber + 1, $maxValue );
|
233 |
+
continue;
|
234 |
+
}
|
235 |
+
|
236 |
+
if($maxValue == $ipNumber + 1)
|
237 |
+
{
|
238 |
+
$arrSingleIPs[$maxValue] = 1;
|
239 |
+
$arrNewRanges[] = array( $minValue, $ipNumber -1 );
|
240 |
+
continue;
|
241 |
+
}
|
242 |
+
|
243 |
+
$arrNewRanges[] = array( $minValue, $ipNumber -1 );
|
244 |
+
$arrNewRanges[] = array( $ipNumber + 1, $maxValue);
|
245 |
+
|
246 |
+
}
|
247 |
+
|
248 |
+
$arrFormattedRange = $arrSingleIPs; unset($arrSingleIPs);
|
249 |
+
|
250 |
+
for($i = 0, $rangeLength = count($arrNewRanges); $i < $rangeLength; ++$i)
|
251 |
+
{
|
252 |
+
if($arrNewRanges[$i][0] < $arrNewRanges[$i][1])
|
253 |
+
continue;
|
254 |
+
|
255 |
+
$arrFormattedRange[$arrNewRanges[$i][0]] = 1;
|
256 |
+
unset($arrNewRanges[$i]);
|
257 |
+
}
|
258 |
+
|
259 |
+
$arrNewRanges = MchGdbcUtils::overlapIntervals($arrNewRanges);
|
260 |
+
|
261 |
+
foreach($arrNewRanges as $arrRange){
|
262 |
+
$arrFormattedRange[ $arrRange[0] ] = $arrRange[1];
|
263 |
+
}
|
264 |
+
|
265 |
+
return $arrFormattedRange;
|
266 |
+
|
267 |
+
}
|
268 |
+
|
269 |
+
public static function getFormattedIpRangeForDb($receivedIpAddress)
|
270 |
+
{
|
271 |
+
if(empty($receivedIpAddress))
|
272 |
+
return array();
|
273 |
+
|
274 |
+
$receivedIpAddress = trim($receivedIpAddress);
|
275 |
+
|
276 |
+
$arrPreparedData = array();
|
277 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion($receivedIpAddress);
|
278 |
+
if(-1 !== $ipVersion) // single IP
|
279 |
+
{
|
280 |
+
if($ipVersion === MchGdbcIPUtils::IP_VERSION_4)
|
281 |
+
{
|
282 |
+
$arrPreparedData[MchGdbcIPUtils::IP_VERSION_4] = array(MchGdbcIPUtils::ipAddressToNumber($receivedIpAddress), 1);
|
283 |
+
}
|
284 |
+
else
|
285 |
+
{
|
286 |
+
$arrPreparedData[MchGdbcIPUtils::IP_VERSION_6] = array(MchGdbcIPUtils::compressIPV6($receivedIpAddress), 1);
|
287 |
+
}
|
288 |
+
|
289 |
+
return $arrPreparedData;
|
290 |
+
}
|
291 |
+
|
292 |
+
$sanitizedRange = MchGdbcIPUtils::sanitizeCIDRRange($receivedIpAddress);
|
293 |
+
if(null !== $sanitizedRange) // CIDR Block
|
294 |
+
{
|
295 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion(MchGdbcIPUtils::sanitizeIpAddress($sanitizedRange));
|
296 |
+
if($ipVersion === MchGdbcIPUtils::IP_VERSION_4)
|
297 |
+
{
|
298 |
+
$sanitizedRange = MchGdbcIPUtils::getCIDRRangeBounds($sanitizedRange);
|
299 |
+
if(empty($sanitizedRange[0]) || empty($sanitizedRange[1]))
|
300 |
+
return array();
|
301 |
+
|
302 |
+
$sanitizedRange[0] = MchGdbcIPUtils::ipAddressToNumber($sanitizedRange[0]);
|
303 |
+
$sanitizedRange[1] = MchGdbcIPUtils::ipAddressToNumber($sanitizedRange[1]);
|
304 |
+
|
305 |
+
$arrPreparedData[$ipVersion] = $sanitizedRange;
|
306 |
+
|
307 |
+
}
|
308 |
+
else // IPV6
|
309 |
+
{
|
310 |
+
list($ipv6, $bits) = explode('/', $sanitizedRange, 2);
|
311 |
+
|
312 |
+
$ipv6 = MchGdbcIPUtils::compressIPV6($ipv6);
|
313 |
+
|
314 |
+
$arrPreparedData[ $ipVersion ] = $bits == MchGdbcIPUtils::IP_V6_MAX_BITS ? array($ipv6, 1) : array("$ipv6/$bits", 1);
|
315 |
+
}
|
316 |
+
|
317 |
+
return $arrPreparedData;
|
318 |
+
}
|
319 |
+
$arrSanitizedRange = explode('-', $receivedIpAddress, 2);
|
320 |
+
if(2 !== count($arrSanitizedRange))
|
321 |
+
return array();
|
322 |
+
|
323 |
+
$sanitizedLowIp = MchGdbcIPUtils::sanitizeIpAddress(MchGdbcIPUtils::sanitizeCIDRRange($arrSanitizedRange[0]));
|
324 |
+
$sanitizedHighIp = MchGdbcIPUtils::sanitizeIpAddress(MchGdbcIPUtils::sanitizeCIDRRange($arrSanitizedRange[1]));
|
325 |
+
|
326 |
+
if(!MchGdbcIPUtils::isValidIpAddress($sanitizedLowIp) || !MchGdbcIPUtils::isValidIpAddress($sanitizedHighIp)) {
|
327 |
+
return array();
|
328 |
+
}
|
329 |
+
|
330 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion($sanitizedLowIp);
|
331 |
+
if($ipVersion !== MchGdbcIPUtils::getIpAddressVersion($sanitizedHighIp))
|
332 |
+
return array();
|
333 |
+
|
334 |
+
if( $ipVersion !== MchGdbcIPUtils::IP_VERSION_4 ) // non standard range allowed just for IPv4
|
335 |
+
return array();
|
336 |
+
|
337 |
+
$minIpNumber = MchGdbcIPUtils::ipAddressToNumber($sanitizedLowIp, MchGdbcIPUtils::IP_VERSION_4);
|
338 |
+
$maxIpNumber = MchGdbcIPUtils::ipAddressToNumber($sanitizedHighIp, MchGdbcIPUtils::IP_VERSION_4);
|
339 |
+
|
340 |
+
if($minIpNumber >= $maxIpNumber) // single IP
|
341 |
+
{
|
342 |
+
$arrPreparedData[$ipVersion] = array($minIpNumber, 1);
|
343 |
+
}
|
344 |
+
else
|
345 |
+
{
|
346 |
+
$arrPreparedData[$ipVersion] = array($minIpNumber, $maxIpNumber);
|
347 |
+
}
|
348 |
+
|
349 |
+
return $arrPreparedData;
|
350 |
+
|
351 |
+
}
|
352 |
+
|
353 |
+
|
354 |
+
public static function getFormattedIpRangesForDisplay($arrSavedIpRanges)
|
355 |
+
{
|
356 |
+
|
357 |
+
$arrIps = array();
|
358 |
+
foreach((array)$arrSavedIpRanges as $ipVersion => $arrSavedIps)
|
359 |
+
{
|
360 |
+
|
361 |
+
foreach($arrSavedIps as $savedIp => $value)
|
362 |
+
{
|
363 |
+
if($ipVersion == MchGdbcIPUtils::IP_VERSION_6)
|
364 |
+
{
|
365 |
+
$arrIps[] = $savedIp . '|' . MchGdbcIPUtils::getCIDRNumberOfHosts($savedIp);
|
366 |
+
continue;
|
367 |
+
}
|
368 |
+
|
369 |
+
if($value === 1)
|
370 |
+
{
|
371 |
+
$arrIps[] = MchGdbcIPUtils::ipAddressFromNumber( $savedIp, MchGdbcIPUtils::IP_VERSION_4 ) . '|' . 1;
|
372 |
+
|
373 |
+
continue;
|
374 |
+
}
|
375 |
+
|
376 |
+
// $arrRange = explode('/', $savedIp);
|
377 |
+
// if(isset($arrRange[1]) && !isset($arrRange[2]))
|
378 |
+
// {
|
379 |
+
// $arrIps[] = $savedIp . '|' . MchGdbcIPUtils::getCIDRNumberOfHosts($savedIp);
|
380 |
+
//
|
381 |
+
// continue;
|
382 |
+
// }
|
383 |
+
|
384 |
+
$arrRange = array($savedIp , $value);
|
385 |
+
if(is_numeric($arrRange[0]) && is_numeric($arrRange[1]))
|
386 |
+
{
|
387 |
+
$displayIp = MchGdbcIPUtils::ipAddressFromNumber($arrRange[0], MchGdbcIPUtils::IP_VERSION_4) . ' - ' . MchGdbcIPUtils::ipAddressFromNumber($arrRange[1], MchGdbcIPUtils::IP_VERSION_4);
|
388 |
+
$displayIp .= '|' . ($arrRange[1] - $arrRange[0] + 1);
|
389 |
+
$arrIps[] = $displayIp;
|
390 |
+
|
391 |
+
continue;
|
392 |
+
}
|
393 |
+
|
394 |
+
}
|
395 |
+
}
|
396 |
+
|
397 |
+
return array_reverse($arrIps);
|
398 |
+
}
|
399 |
+
|
400 |
+
|
401 |
+
|
402 |
+
|
403 |
+
private function __construct(){}
|
404 |
+
}
|
engine/GdbcModulesController.php
ADDED
@@ -0,0 +1,566 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright (C) 2014 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
spl_autoload_register(array('GdbcModulesController','autoLoadModulesClasses'));
|
22 |
+
|
23 |
+
final class GdbcModulesController
|
24 |
+
{
|
25 |
+
CONST MODULE_SETTINGS = 'Settings';
|
26 |
+
CONST MODULE_WORDPRESS = 'WordPress';
|
27 |
+
CONST MODULE_BRUTE_FORCE = 'BruteForce';
|
28 |
+
|
29 |
+
//CONST MODULE_POPULAR_FORMS = 'PopularForms';
|
30 |
+
|
31 |
+
CONST MODULE_REPORTS = 'Reports';
|
32 |
+
|
33 |
+
CONST MODULE_WOOCOMMERCE = 'WooCommerce';
|
34 |
+
|
35 |
+
CONST MODULE_MAIL_CHIMP_FOR_WP = 'MailChimpForWp';
|
36 |
+
CONST MODULE_MAIL_POET = 'MailPoet';
|
37 |
+
|
38 |
+
CONST MODULE_NINJA_FORMS = 'NinjaForms';
|
39 |
+
CONST MODULE_CONTACT_FORM_7 = 'ContactForm7';
|
40 |
+
CONST MODULE_GRAVITY_FORMS = 'GravityForms';
|
41 |
+
CONST MODULE_FAST_SECURE_FORM = 'FastSecureForm';
|
42 |
+
CONST MODULE_FORMIDABLE_FORMS = 'FormidableForms';
|
43 |
+
CONST MODULE_JETPACK_CONTACT_FORM = 'JetPackContactForm';
|
44 |
+
|
45 |
+
|
46 |
+
CONST MODULE_ULTIMATE_MEMBER = 'UltimateMember';
|
47 |
+
CONST MODULE_USER_PRO = 'UserPro';
|
48 |
+
CONST MODULE_UPME = 'UPME';
|
49 |
+
CONST MODULE_BUDDY_PRESS = 'BuddyPress';
|
50 |
+
CONST MODULE_BB_PRESS = 'BBPress';
|
51 |
+
|
52 |
+
CONST MODULE_BLACK_LISTED_IPS = 'BlackListedIps';
|
53 |
+
CONST MODULE_WHITE_LISTED_IPS = 'WhiteListedIps';
|
54 |
+
|
55 |
+
CONST MODULE_ZM_ALR = 'ZM-ALR';
|
56 |
+
|
57 |
+
CONST MODULE_SEAMLESS_DONATIONS = 'SeamlessDonations';
|
58 |
+
CONST MODULE_WORDPRESS_TWEAKS = 'WordPressTweaks';
|
59 |
+
|
60 |
+
CONST MODULE_PLANSO_FORMS = 'PlanSoForms';
|
61 |
+
CONST MODULE_EMAIL_NOTIFICATIONS = 'EmailNotifications';
|
62 |
+
|
63 |
+
private static $arrRegisteredModules = null;
|
64 |
+
private static $arrAllModules = array(
|
65 |
+
|
66 |
+
|
67 |
+
# --------- Default Modules -------------------------
|
68 |
+
self::MODULE_SETTINGS => array(
|
69 |
+
'info' => array(
|
70 |
+
'ModuleId' => 1,
|
71 |
+
'IsPublic' => true,
|
72 |
+
),
|
73 |
+
|
74 |
+
'classes' => array(
|
75 |
+
'GdbcSettingsAdminModule' => '/modules/settings/GdbcSettingsAdminModule.php',
|
76 |
+
'GdbcSettingsPublicModule' => '/modules/settings/GdbcSettingsPublicModule.php',
|
77 |
+
),
|
78 |
+
|
79 |
+
),
|
80 |
+
|
81 |
+
self::MODULE_WORDPRESS => array(
|
82 |
+
'info' => array(
|
83 |
+
'ModuleId' => 2,
|
84 |
+
'IsPublic' => true,
|
85 |
+
),
|
86 |
+
'classes' => array(
|
87 |
+
'GdbcWordPressAdminModule' => '/modules/wordpress/GdbcWordPressAdminModule.php',
|
88 |
+
'GdbcWordPressPublicModule' => '/modules/wordpress/GdbcWordPressPublicModule.php',
|
89 |
+
)
|
90 |
+
),
|
91 |
+
|
92 |
+
# --------- Contact Forms Modules -------------------------
|
93 |
+
self::MODULE_JETPACK_CONTACT_FORM => array(
|
94 |
+
'info' => array(
|
95 |
+
'ModuleId' => 3,
|
96 |
+
'IsPublic' => true,
|
97 |
+
),
|
98 |
+
'classes' => array(
|
99 |
+
'GdbcJetPackContactFormAdminModule' => '/modules/jetpack-contact-form/GdbcJetPackContactFormAdminModule.php',
|
100 |
+
'GdbcJetPackContactFormPublicModule' => '/modules/jetpack-contact-form/GdbcJetPackContactFormPublicModule.php',
|
101 |
+
)
|
102 |
+
),
|
103 |
+
|
104 |
+
|
105 |
+
self::MODULE_NINJA_FORMS => array(
|
106 |
+
'info' => array(
|
107 |
+
'ModuleId' => 4,
|
108 |
+
'IsPublic' => false,
|
109 |
+
),
|
110 |
+
'classes' => array(
|
111 |
+
'GdbcNinjaFormsAdminModule' => '/modules/ninja-forms/GdbcNinjaFormsAdminModule.php',
|
112 |
+
'GdbcNinjaFormsPublicModule' => '/modules/ninja-forms/GdbcNinjaFormsPublicModule.php',
|
113 |
+
)
|
114 |
+
),
|
115 |
+
|
116 |
+
self::MODULE_CONTACT_FORM_7 => array(
|
117 |
+
'info' => array(
|
118 |
+
'ModuleId' => 5,
|
119 |
+
'IsPublic' => false,
|
120 |
+
),
|
121 |
+
'classes' => array(
|
122 |
+
'GdbcContactForm7AdminModule' => '/modules/contact-form-7/GdbcContactForm7AdminModule.php',
|
123 |
+
'GdbcContactForm7PublicModule' => '/modules/contact-form-7/GdbcContactForm7PublicModule.php',
|
124 |
+
)
|
125 |
+
),
|
126 |
+
|
127 |
+
self::MODULE_GRAVITY_FORMS => array(
|
128 |
+
'info' => array(
|
129 |
+
'ModuleId' => 6,
|
130 |
+
'IsPublic' => false,
|
131 |
+
),
|
132 |
+
'classes' => array(
|
133 |
+
'GdbcGravityFormsAdminModule' => '/modules/gravity-forms/GdbcGravityFormsAdminModule.php',
|
134 |
+
'GdbcGravityFormsPublicModule' => '/modules/gravity-forms/GdbcGravityFormsPublicModule.php',
|
135 |
+
)
|
136 |
+
),
|
137 |
+
|
138 |
+
self::MODULE_FAST_SECURE_FORM => array(
|
139 |
+
'info' => array(
|
140 |
+
'ModuleId' => 7,
|
141 |
+
'IsPublic' => false,
|
142 |
+
),
|
143 |
+
'classes' => array(
|
144 |
+
'GdbcFastSecureFormAdminModule' => '/modules/fast-secure-form/GdbcFastSecureFormAdminModule.php',
|
145 |
+
'GdbcFastSecureFormPublicModule' => '/modules/fast-secure-form/GdbcFastSecureFormPublicModule.php',
|
146 |
+
)
|
147 |
+
),
|
148 |
+
|
149 |
+
self::MODULE_FORMIDABLE_FORMS => array(
|
150 |
+
'info' => array(
|
151 |
+
'ModuleId' => 8,
|
152 |
+
'IsPublic' => false,
|
153 |
+
),
|
154 |
+
'classes' => array(
|
155 |
+
'GdbcFormidableFormsAdminModule' => '/modules/formidable-forms/GdbcFormidableFormsAdminModule.php',
|
156 |
+
'GdbcFormidableFormsPublicModule' => '/modules/formidable-forms/GdbcFormidableFormsPublicModule.php',
|
157 |
+
)
|
158 |
+
),
|
159 |
+
|
160 |
+
|
161 |
+
# --------- Community Modules -------------------------
|
162 |
+
|
163 |
+
self::MODULE_ULTIMATE_MEMBER => array(
|
164 |
+
'info' => array(
|
165 |
+
'ModuleId' => 9,
|
166 |
+
'IsPublic' => true,
|
167 |
+
),
|
168 |
+
'classes' => array(
|
169 |
+
'GdbcUltimateMemberAdminModule' => '/modules/ultimate-member/GdbcUltimateMemberAdminModule.php',
|
170 |
+
'GdbcUltimateMemberPublicModule' => '/modules/ultimate-member/GdbcUltimateMemberPublicModule.php',
|
171 |
+
)
|
172 |
+
),
|
173 |
+
|
174 |
+
self::MODULE_BUDDY_PRESS => array(
|
175 |
+
'info' => array(
|
176 |
+
'ModuleId' => 10,
|
177 |
+
'IsPublic' => false,
|
178 |
+
),
|
179 |
+
'classes' => array(
|
180 |
+
'GdbcBuddyPressAdminModule' => '/modules/buddy-press/GdbcBuddyPressAdminModule.php',
|
181 |
+
'GdbcBuddyPressPublicModule' => '/modules/buddy-press/GdbcBuddyPressPublicModule.php',
|
182 |
+
)
|
183 |
+
),
|
184 |
+
|
185 |
+
self::MODULE_BB_PRESS => array(
|
186 |
+
'info' => array(
|
187 |
+
'ModuleId' => 11,
|
188 |
+
'IsPublic' => false,
|
189 |
+
),
|
190 |
+
'classes' => array(
|
191 |
+
'GdbcBbPressAdminModule' => '/modules/bb-press/GdbcBbPressAdminModule.php',
|
192 |
+
'GdbcBbPressPublicModule' => '/modules/bb-press/GdbcBbPressPublicModule.php',
|
193 |
+
)
|
194 |
+
),
|
195 |
+
|
196 |
+
self::MODULE_USER_PRO => array(
|
197 |
+
'info' => array(
|
198 |
+
'ModuleId' => 12,
|
199 |
+
'IsPublic' => false,
|
200 |
+
),
|
201 |
+
'classes' => array(
|
202 |
+
'GdbcUserProAdminModule' => '/modules/user-pro/GdbcUserProAdminModule.php',
|
203 |
+
'GdbcUserProPublicModule' => '/modules/user-pro/GdbcUserProPublicModule.php',
|
204 |
+
)
|
205 |
+
),
|
206 |
+
|
207 |
+
self::MODULE_UPME => array(
|
208 |
+
'info' => array(
|
209 |
+
'ModuleId' => 13,
|
210 |
+
'IsPublic' => false,
|
211 |
+
),
|
212 |
+
'classes' => array(
|
213 |
+
'GdbcUPMEAdminModule' => '/modules/upme/GdbcUPMEAdminModule.php',
|
214 |
+
'GdbcUPMEPublicModule' => '/modules/upme/GdbcUPMEPublicModule.php',
|
215 |
+
)
|
216 |
+
),
|
217 |
+
|
218 |
+
|
219 |
+
# --------- Subscriptions Modules -------------------------
|
220 |
+
|
221 |
+
|
222 |
+
self::MODULE_MAIL_CHIMP_FOR_WP => array(
|
223 |
+
'info' => array(
|
224 |
+
'ModuleId' => 14,
|
225 |
+
'IsPublic' => true,
|
226 |
+
),
|
227 |
+
'classes' => array(
|
228 |
+
'GdbcMailChimpForWpAdminModule' => '/modules/mc-for-wp/GdbcMailChimpForWpAdminModule.php',
|
229 |
+
'GdbcMailChimpForWpPublicModule' => '/modules/mc-for-wp/GdbcMailChimpForWpPublicModule.php',
|
230 |
+
)
|
231 |
+
),
|
232 |
+
|
233 |
+
self::MODULE_MAIL_POET => array(
|
234 |
+
'info' => array(
|
235 |
+
'ModuleId' => 15,
|
236 |
+
'IsPublic' => false,
|
237 |
+
),
|
238 |
+
'classes' => array(
|
239 |
+
'GdbcMailPoetAdminModule' => '/modules/mail-poet/GdbcMailPoetAdminModule.php',
|
240 |
+
'GdbcMailPoetPublicModule' => '/modules/mail-poet/GdbcMailPoetPublicModule.php',
|
241 |
+
)
|
242 |
+
),
|
243 |
+
|
244 |
+
self::MODULE_WOOCOMMERCE => array(
|
245 |
+
'info' => array(
|
246 |
+
'ModuleId' => 16,
|
247 |
+
'IsPublic' => false,
|
248 |
+
),
|
249 |
+
'classes' => array(
|
250 |
+
'GdbcWooCommerceAdminModule' => '/modules/woocommerce/GdbcWooCommerceAdminModule.php',
|
251 |
+
'GdbcWooCommercePublicModule' => '/modules/woocommerce/GdbcWooCommercePublicModule.php',
|
252 |
+
)
|
253 |
+
),
|
254 |
+
|
255 |
+
|
256 |
+
self::MODULE_REPORTS => array(
|
257 |
+
'info' => array(
|
258 |
+
'ModuleId' => 17,
|
259 |
+
'IsPublic' => true,
|
260 |
+
),
|
261 |
+
'classes' => array(
|
262 |
+
'GdbcReportsAdminModule' => '/modules/reports/GdbcReportsAdminModule.php',
|
263 |
+
'GdbcReportsPublicModule' => '/modules/reports/GdbcReportsPublicModule.php',
|
264 |
+
)
|
265 |
+
),
|
266 |
+
|
267 |
+
self::MODULE_BRUTE_FORCE => array(
|
268 |
+
'info' => array(
|
269 |
+
'ModuleId' => 18,
|
270 |
+
'IsPublic' => true,
|
271 |
+
),
|
272 |
+
'classes' => array(
|
273 |
+
'GdbcBruteForceAdminModule' => '/modules/brute-force/GdbcBruteForceAdminModule.php',
|
274 |
+
'GdbcBruteForcePublicModule' => '/modules/brute-force/GdbcBruteForcePublicModule.php',
|
275 |
+
)
|
276 |
+
),
|
277 |
+
|
278 |
+
|
279 |
+
self::MODULE_BLACK_LISTED_IPS => array(
|
280 |
+
'info' => array(
|
281 |
+
'ModuleId' => 19,
|
282 |
+
'IsPublic' => true,
|
283 |
+
),
|
284 |
+
'classes' => array(
|
285 |
+
'GdbcBlackListedIpsAdminModule' => '/modules/black-listed-ips/GdbcBlackListedIpsAdminModule.php',
|
286 |
+
'GdbcBlackListedIpsPublicModule' => '/modules/black-listed-ips/GdbcBlackListedIpsPublicModule.php',
|
287 |
+
)
|
288 |
+
),
|
289 |
+
|
290 |
+
self::MODULE_WHITE_LISTED_IPS => array(
|
291 |
+
'info' => array(
|
292 |
+
'ModuleId' => 20,
|
293 |
+
'IsPublic' => true,
|
294 |
+
),
|
295 |
+
'classes' => array(
|
296 |
+
'GdbcWhiteListedIpsAdminModule' => '/modules/white-listed-ips/GdbcWhiteListedIpsAdminModule.php',
|
297 |
+
'GdbcWhiteListedIpsPublicModule' => '/modules/white-listed-ips/GdbcWhiteListedIpsPublicModule.php',
|
298 |
+
)
|
299 |
+
),
|
300 |
+
|
301 |
+
self::MODULE_ZM_ALR => array(
|
302 |
+
'info' => array(
|
303 |
+
'ModuleId' => 21,
|
304 |
+
'IsPublic' => true,
|
305 |
+
),
|
306 |
+
'classes' => array(
|
307 |
+
'GdbcZmAlrAdminModule' => '/modules/zm-ajax-login-register/GdbcZmAlrAdminModule.php',
|
308 |
+
'GdbcZmAlrPublicModule' => '/modules/zm-ajax-login-register/GdbcZmAlrPublicModule.php',
|
309 |
+
)
|
310 |
+
),
|
311 |
+
|
312 |
+
self::MODULE_SEAMLESS_DONATIONS => array(
|
313 |
+
'info' => array(
|
314 |
+
'ModuleId' => 22,
|
315 |
+
'IsPublic' => true,
|
316 |
+
),
|
317 |
+
'classes' => array(
|
318 |
+
'GdbcSeamlessDonationsAdminModule' => '/modules/seamless-donations/GdbcSeamlessDonationsAdminModule.php',
|
319 |
+
'GdbcSeamlessDonationsPublicModule' => '/modules/seamless-donations/GdbcSeamlessDonationsPublicModule.php',
|
320 |
+
)
|
321 |
+
),
|
322 |
+
|
323 |
+
self::MODULE_WORDPRESS_TWEAKS => array(
|
324 |
+
'info' => array(
|
325 |
+
'ModuleId' => 23,
|
326 |
+
'IsPublic' => true,
|
327 |
+
),
|
328 |
+
'classes' => array(
|
329 |
+
'GdbcWordPressTweaksAdminModule' => '/modules/wordpress-tweaks/GdbcWordPressTweaksAdminModule.php',
|
330 |
+
'GdbcWordPressTweaksPublicModule' => '/modules/wordpress-tweaks/GdbcWordPressTweaksPublicModule.php',
|
331 |
+
)
|
332 |
+
),
|
333 |
+
|
334 |
+
self::MODULE_EMAIL_NOTIFICATIONS => array(
|
335 |
+
'info' => array(
|
336 |
+
'ModuleId' => 24,
|
337 |
+
'IsPublic' => true,
|
338 |
+
),
|
339 |
+
'classes' => array(
|
340 |
+
'GdbcEmailNotificationsAdminModule' => '/modules/email-notifications/GdbcEmailNotificationsAdminModule.php',
|
341 |
+
'GdbcEmailNotificationsPublicModule' => '/modules/email-notifications/GdbcEmailNotificationsPublicModule.php',
|
342 |
+
)
|
343 |
+
),
|
344 |
+
|
345 |
+
self::MODULE_PLANSO_FORMS => array(
|
346 |
+
'info' => array(
|
347 |
+
'ModuleId' => 25,
|
348 |
+
'IsPublic' => true,
|
349 |
+
),
|
350 |
+
'classes' => array(
|
351 |
+
'GdbcPlanSoFormsAdminModule' => '/modules/planso-forms/GdbcPlanSoFormsAdminModule.php',
|
352 |
+
'GdbcPlanSoFormsPublicModule' => '/modules/planso-forms/GdbcPlanSoFormsPublicModule.php',
|
353 |
+
)
|
354 |
+
),
|
355 |
+
|
356 |
+
);
|
357 |
+
|
358 |
+
public static function getRegisteredModules()
|
359 |
+
{
|
360 |
+
if(null === self::$arrRegisteredModules)
|
361 |
+
self::setRegisteredModules();
|
362 |
+
|
363 |
+
return self::$arrRegisteredModules;
|
364 |
+
}
|
365 |
+
|
366 |
+
private static function setRegisteredModules()
|
367 |
+
{
|
368 |
+
if(null !== self::$arrRegisteredModules)
|
369 |
+
return;
|
370 |
+
|
371 |
+
self::$arrRegisteredModules = array();
|
372 |
+
|
373 |
+
$activatedPlugins = defined('WP_PLUGIN_DIR') ? array_merge( array_flip((array) get_option( 'active_plugins', array())), (array) get_site_option( 'active_sitewide_plugins', array() ) ) : array(); // wp_get_mu_plugins()
|
374 |
+
|
375 |
+
foreach(self::$arrAllModules as $moduleName => $arrModule)
|
376 |
+
{
|
377 |
+
self::$arrRegisteredModules[$moduleName] = array();
|
378 |
+
|
379 |
+
foreach ($arrModule['classes'] as $className => $filePath)
|
380 |
+
{
|
381 |
+
$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . ( $dirPath = trim( dirname($filePath) , '/\\' ) . DIRECTORY_SEPARATOR . basename($filePath) );
|
382 |
+
|
383 |
+
if(file_exists($filePath))
|
384 |
+
{
|
385 |
+
self::$arrRegisteredModules[$moduleName][$className] = $filePath;
|
386 |
+
continue;
|
387 |
+
}
|
388 |
+
|
389 |
+
foreach($activatedPlugins as $activePlugin => $value)
|
390 |
+
{
|
391 |
+
if(false === strpos($activePlugin, 'GoodByeCaptcha')){
|
392 |
+
unset($activatedPlugins[$activePlugin]);continue;
|
393 |
+
}
|
394 |
+
|
395 |
+
if(false === strpos($activePlugin, "GoodByeCaptcha$moduleName"))
|
396 |
+
continue;
|
397 |
+
|
398 |
+
$filePath = @dirname(WP_PLUGIN_DIR . '/' . $activePlugin ) . "/engine/$dirPath" ;
|
399 |
+
|
400 |
+
break;
|
401 |
+
|
402 |
+
}
|
403 |
+
|
404 |
+
file_exists($filePath) ? self::$arrRegisteredModules[$moduleName][$className] = $filePath : null;
|
405 |
+
}
|
406 |
+
|
407 |
+
if(empty(self::$arrRegisteredModules[$moduleName]))
|
408 |
+
unset(self::$arrRegisteredModules[$moduleName]);
|
409 |
+
}
|
410 |
+
|
411 |
+
|
412 |
+
}
|
413 |
+
|
414 |
+
|
415 |
+
public static function getModuleIdByName($moduleName)
|
416 |
+
{
|
417 |
+
return isset(self::$arrAllModules[$moduleName]['info']['ModuleId']) ? self::$arrAllModules[$moduleName]['info']['ModuleId'] : null;
|
418 |
+
}
|
419 |
+
|
420 |
+
public static function isPublicModule($moduleIdORmoduleName)
|
421 |
+
{
|
422 |
+
$moduleName = ((false === filter_var($moduleIdORmoduleName, FILTER_VALIDATE_INT)) ? $moduleIdORmoduleName : self::getModuleNameById($moduleIdORmoduleName));
|
423 |
+
|
424 |
+
if(!isset(self::$arrAllModules[$moduleName]['info']['IsPublic']))
|
425 |
+
return false;
|
426 |
+
|
427 |
+
#Returns TRUE for true, "1", "true", "on" and "yes"
|
428 |
+
return (false === filter_var(self::$arrAllModules[$moduleName]['info']['IsPublic'], FILTER_VALIDATE_BOOLEAN)) ? false : true;
|
429 |
+
}
|
430 |
+
|
431 |
+
|
432 |
+
public static function unRegisterModule($moduleName)
|
433 |
+
{
|
434 |
+
unset(self::$arrRegisteredModules[(string)$moduleName]);
|
435 |
+
}
|
436 |
+
|
437 |
+
|
438 |
+
public static function getPublicModulesName()
|
439 |
+
{
|
440 |
+
$arrFreeModules = array();
|
441 |
+
foreach(self::$arrAllModules as $moduleName => $arrAllModulesettings)
|
442 |
+
{
|
443 |
+
self::isPublicModule($moduleName) ? $arrFreeModules[] = $moduleName : null;
|
444 |
+
}
|
445 |
+
|
446 |
+
return $arrFreeModules;
|
447 |
+
}
|
448 |
+
|
449 |
+
public static function getModuleNameById($moduleId)
|
450 |
+
{
|
451 |
+
foreach(self::$arrAllModules as $moduleKey => $moduleValue)
|
452 |
+
{
|
453 |
+
if (isset($moduleValue['info']['ModuleId']) && $moduleValue['info']['ModuleId'] == $moduleId)
|
454 |
+
return $moduleKey;
|
455 |
+
}
|
456 |
+
|
457 |
+
return null;
|
458 |
+
}
|
459 |
+
|
460 |
+
public static function getModuleOptionDisplayText($moduleId, $optionId)
|
461 |
+
{
|
462 |
+
if(null === ($moduleAdminInstance = self::getAdminModuleInstance(self::getModuleNameById($moduleId))))
|
463 |
+
return null;
|
464 |
+
|
465 |
+
return $moduleAdminInstance->getOptionDisplayTextByOptionId($optionId);
|
466 |
+
}
|
467 |
+
|
468 |
+
public static function getModuleOptionId($moduleName, $optionName)
|
469 |
+
{
|
470 |
+
if(null === ($moduleAdminInstance = self::getAdminModuleInstance($moduleName)))
|
471 |
+
return null;
|
472 |
+
|
473 |
+
return $moduleAdminInstance->getOptionIdByOptionName($optionName);
|
474 |
+
}
|
475 |
+
|
476 |
+
public static function getModuleDirectoryPath($moduleName)
|
477 |
+
{
|
478 |
+
if(null === self::$arrRegisteredModules)
|
479 |
+
self::setRegisteredModules();
|
480 |
+
|
481 |
+
if(!isset(self::$arrRegisteredModules[$moduleName]) || !is_array(self::$arrRegisteredModules[$moduleName]))
|
482 |
+
return null;
|
483 |
+
|
484 |
+
return @dirname(reset(self::$arrRegisteredModules[$moduleName]));
|
485 |
+
}
|
486 |
+
|
487 |
+
/**
|
488 |
+
*
|
489 |
+
* @staticvar array $arrInstances
|
490 |
+
* @param string $moduleName
|
491 |
+
* @param int $moduleType
|
492 |
+
* @return \MchGdbcBaseModule | null
|
493 |
+
*/
|
494 |
+
private static function getModuleInstance($moduleName, $moduleType)
|
495 |
+
{
|
496 |
+
if(null === self::$arrRegisteredModules)
|
497 |
+
self::setRegisteredModules();
|
498 |
+
|
499 |
+
if(!isset(self::$arrRegisteredModules[$moduleName]))
|
500 |
+
return null;
|
501 |
+
|
502 |
+
foreach (self::$arrRegisteredModules[$moduleName] as $moduleClassName => $filePath)
|
503 |
+
{
|
504 |
+
if(1 === $moduleType && (false === strpos($moduleClassName, 'Admin')))
|
505 |
+
continue;
|
506 |
+
elseif(2 === $moduleType && (false === strpos($moduleClassName, 'Public')))
|
507 |
+
continue;
|
508 |
+
|
509 |
+
if(!method_exists($moduleClassName, 'getInstance'))
|
510 |
+
return null;
|
511 |
+
|
512 |
+
if(false !== ($moduleInstance = call_user_func(array($moduleClassName, 'getInstance'))))
|
513 |
+
return $moduleInstance;
|
514 |
+
}
|
515 |
+
|
516 |
+
return null;
|
517 |
+
}
|
518 |
+
|
519 |
+
/**
|
520 |
+
* @param string $moduleName Module name
|
521 |
+
*
|
522 |
+
* @return \GdbcBaseAdminModule|null
|
523 |
+
*/
|
524 |
+
public static function getAdminModuleInstance($moduleName)
|
525 |
+
{
|
526 |
+
return self::getModuleInstance($moduleName, 1);
|
527 |
+
}
|
528 |
+
|
529 |
+
/**
|
530 |
+
* @param string $moduleName Module name
|
531 |
+
*
|
532 |
+
* @return \MchGdbcBasePublicModule|null
|
533 |
+
*/
|
534 |
+
public static function getPublicModuleInstance($moduleName)
|
535 |
+
{
|
536 |
+
return self::getModuleInstance($moduleName, 2);
|
537 |
+
}
|
538 |
+
|
539 |
+
|
540 |
+
/**
|
541 |
+
* @param $moduleName string Module name
|
542 |
+
*
|
543 |
+
* @return bool
|
544 |
+
*/
|
545 |
+
public static function isModuleRegistered($moduleName)
|
546 |
+
{
|
547 |
+
if(null === self::$arrRegisteredModules)
|
548 |
+
self::setRegisteredModules();
|
549 |
+
|
550 |
+
return isset(self::$arrRegisteredModules[$moduleName]);
|
551 |
+
}
|
552 |
+
|
553 |
+
public static function autoLoadModulesClasses($moduleClassName)
|
554 |
+
{
|
555 |
+
if(null === self::$arrRegisteredModules)
|
556 |
+
self::setRegisteredModules();
|
557 |
+
|
558 |
+
foreach(self::$arrRegisteredModules as $arrModuleClasses)
|
559 |
+
{
|
560 |
+
if(!isset($arrModuleClasses[$moduleClassName]))
|
561 |
+
continue;
|
562 |
+
|
563 |
+
return require_once($arrModuleClasses[$moduleClassName]);
|
564 |
+
}
|
565 |
+
}
|
566 |
+
}
|
engine/GdbcNotificationsController.php
ADDED
@@ -0,0 +1,152 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GdbcNotificationsController
|
21 |
+
{
|
22 |
+
public static function sendTestModeEmailNotification(GdbcAttemptEntity $gdbcAttemptEntity)
|
23 |
+
{
|
24 |
+
GdbcEmailNotificationsPublicModule::getInstance()->EmailSubject = __('GoodBye Captcha - Test Mode Notification', GoodByeCaptcha::PLUGIN_SLUG);
|
25 |
+
|
26 |
+
$clientIpAddress = GdbcIPUtils::getClientIpAddress();
|
27 |
+
$currentSiteLink = MchGdbcWpUtils::getCurrentBlogLink();
|
28 |
+
$adminFullName = MchGdbcWpUtils::getAdminFullName();
|
29 |
+
empty($adminFullName) ? $adminFullName = MchGdbcWpUtils::getAdminDisplayName() : null;
|
30 |
+
|
31 |
+
$submittedForm = GdbcModulesController::getModuleNameById($gdbcAttemptEntity->ModuleId);
|
32 |
+
$submittedForm .= empty($gdbcAttemptEntity->SectionId) ? '' : '/' . GdbcModulesController::getModuleOptionDisplayText($gdbcAttemptEntity->ModuleId, $gdbcAttemptEntity->SectionId);
|
33 |
+
|
34 |
+
$rejectReason = GdbcRequestController::tokenAlreadyRejected() ? GdbcRequestController::getRejectReasonDescription(GdbcRequestController::getRejectReasonId()) : null;
|
35 |
+
|
36 |
+
$moduleDirPath = GdbcModulesController::getModuleDirectoryPath(GdbcModulesController::MODULE_EMAIL_NOTIFICATIONS);
|
37 |
+
|
38 |
+
if(empty($moduleDirPath))
|
39 |
+
{
|
40 |
+
GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = __('GoodBye Captcha encountered an error while trying to parse the email template!', GoodByeCaptcha::PLUGIN_SLUG);
|
41 |
+
}
|
42 |
+
else
|
43 |
+
{
|
44 |
+
ob_start();
|
45 |
+
require_once ($moduleDirPath . '/templates/notification-test-mode.php');
|
46 |
+
GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = ob_get_clean() . "\n";
|
47 |
+
}
|
48 |
+
|
49 |
+
GdbcEmailNotificationsPublicModule::getInstance()->send(true);
|
50 |
+
|
51 |
+
}
|
52 |
+
|
53 |
+
public static function sendBruteForceAttackDetectedEmailNotification(array $arrLoginAttempts)
|
54 |
+
{
|
55 |
+
|
56 |
+
if( ! GdbcEmailNotificationsPublicModule::getInstance()->getOption(GdbcEmailNotificationsAdminModule::OPTION_BRUTE_FORCE_ATTACK_DETECTED) )
|
57 |
+
return;
|
58 |
+
|
59 |
+
GdbcEmailNotificationsPublicModule::getInstance()->EmailSubject = __('Alert - Brute Force Attack Detected by GoodBye Captcha!', GoodByeCaptcha::PLUGIN_SLUG);
|
60 |
+
|
61 |
+
$adminFullName = MchGdbcWpUtils::getAdminFullName();
|
62 |
+
empty($adminFullName) ? $adminFullName = MchGdbcWpUtils::getAdminDisplayName() : null;
|
63 |
+
|
64 |
+
$totalHits = 0;
|
65 |
+
$totalIPs = 0;
|
66 |
+
$totalProxyAnonym = 0;
|
67 |
+
$totalWebAttackers = 0;
|
68 |
+
$totalBlackListed = 0;
|
69 |
+
|
70 |
+
$detectedDate = get_date_from_gmt ( date( 'Y-m-d H:i:s', MchGdbcHttpRequest::getServerRequestTime() ), 'l, F d, Y');
|
71 |
+
$detectedTime = get_date_from_gmt ( date( 'Y-m-d H:i:s', MchGdbcHttpRequest::getServerRequestTime() ), 'H:i:s');
|
72 |
+
|
73 |
+
foreach($arrLoginAttempts as $clientIp => $hits)
|
74 |
+
{
|
75 |
+
$totalHits += $hits;
|
76 |
+
$totalIPs++;
|
77 |
+
|
78 |
+
$loginAttempt = new stdClass();
|
79 |
+
$loginAttempt->IsIpBlackListed = GdbcIPUtils::isIpBlackListed($clientIp);
|
80 |
+
$loginAttempt->IsIpProxyAnonym = GdbcIPUtils::isIpProxyAnonymizer($clientIp);
|
81 |
+
$loginAttempt->IsIpWebAttacker = GdbcIPUtils::isIpWebAttacker($clientIp);
|
82 |
+
|
83 |
+
|
84 |
+
$totalBlackListed += $loginAttempt->IsIpBlackListed ? 1 : 0;
|
85 |
+
$totalWebAttackers += $loginAttempt->IsIpWebAttacker ? 1 : 0;
|
86 |
+
$totalProxyAnonym += ($loginAttempt->IsIpProxyAnonym && !$loginAttempt->IsIpWebAttacker) ? 1 : 0;
|
87 |
+
}
|
88 |
+
|
89 |
+
if( 0 === $totalIPs )
|
90 |
+
return;
|
91 |
+
|
92 |
+
$totalBlackListed = $totalBlackListed . ' (' . number_format( 100 - ( ($totalIPs - $totalBlackListed) * (100 / $totalIPs) ), 2, '.', '' ) . '%)';
|
93 |
+
$totalWebAttackers = $totalWebAttackers . ' (' . number_format( 100 - ( ($totalIPs - $totalWebAttackers) * (100 / $totalIPs) ), 2, '.', '' ) . '%)';
|
94 |
+
$totalProxyAnonym = $totalProxyAnonym . ' (' . number_format( 100 - ( ($totalIPs - $totalProxyAnonym) * (100 / $totalIPs) ), 2, '.', '' ) . '%)';
|
95 |
+
|
96 |
+
$arrReplaceableContent = array(
|
97 |
+
|
98 |
+
'{current-site-link}' => MchGdbcWpUtils::getCurrentBlogLink(),
|
99 |
+
'{admin-full-name}' => $adminFullName,
|
100 |
+
'{total-hits}' => $totalHits,
|
101 |
+
'{total-ips}' => $totalIPs,
|
102 |
+
'{total-black-listed}' => $totalBlackListed,
|
103 |
+
'{total-web-attackers}' => $totalWebAttackers,
|
104 |
+
'{total-proxy-anonymizers}' => $totalProxyAnonym,
|
105 |
+
'{detection-date-time}' => $detectedDate . ' at ' . $detectedTime,
|
106 |
+
);
|
107 |
+
|
108 |
+
$arrSuggestions = array(
|
109 |
+
GdbcBruteForceAdminModule::OPTION_AUTO_BLOCK_IP => GdbcBruteForceAdminModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_AUTO_BLOCK_IP),
|
110 |
+
GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS => GdbcBruteForceAdminModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS),
|
111 |
+
GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY => GdbcBruteForceAdminModule::getInstance()->getOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY),
|
112 |
+
);
|
113 |
+
|
114 |
+
foreach($arrSuggestions as $optionName => &$optionInfo)
|
115 |
+
{
|
116 |
+
if(!empty($optionInfo))
|
117 |
+
{
|
118 |
+
unset($arrSuggestions[$optionName]);
|
119 |
+
continue;
|
120 |
+
}
|
121 |
+
|
122 |
+
|
123 |
+
$arrDefaultOptions = GdbcBruteForceAdminModule::getInstance()->getDefaultOptions();
|
124 |
+
if(!isset($arrDefaultOptions[$optionName]['LabelText']))
|
125 |
+
continue;
|
126 |
+
|
127 |
+
$optionInfo = $arrDefaultOptions[$optionName]['LabelText'];
|
128 |
+
}
|
129 |
+
|
130 |
+
$moduleDirPath = GdbcModulesController::getModuleDirectoryPath(GdbcModulesController::MODULE_EMAIL_NOTIFICATIONS);
|
131 |
+
if(empty($moduleDirPath))
|
132 |
+
{
|
133 |
+
GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = __("Brute Force attack detected on " . MchGdbcWpUtils::getCurrentBlogLink(), GoodByeCaptcha::PLUGIN_SLUG);
|
134 |
+
}
|
135 |
+
else
|
136 |
+
{
|
137 |
+
ob_start();
|
138 |
+
require_once ($moduleDirPath . '/templates/notification-brute-force-attack.php');
|
139 |
+
$emailContent = ob_get_clean();
|
140 |
+
|
141 |
+
$emailContent = str_replace(array_keys($arrReplaceableContent), array_values($arrReplaceableContent), $emailContent);
|
142 |
+
|
143 |
+
GdbcEmailNotificationsPublicModule::getInstance()->EmailBodyContent = $emailContent;
|
144 |
+
}
|
145 |
+
|
146 |
+
unset($emailContent, $arrLoginAttempts, $moduleDirPath, $totalHits, $totalIPs, $totalProxyAnonym, $totalWebAttackers);
|
147 |
+
|
148 |
+
GdbcEmailNotificationsPublicModule::getInstance()->send(true);
|
149 |
+
|
150 |
+
}
|
151 |
+
|
152 |
+
}
|
engine/GdbcRequestController.php
ADDED
@@ -0,0 +1,288 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright (C) 2014 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
final class GdbcRequestController
|
22 |
+
{
|
23 |
+
|
24 |
+
CONST TOKEN_SEPARATOR = '|';
|
25 |
+
|
26 |
+
CONST REJECT_REASON_TOKEN_INVALID = 1;
|
27 |
+
CONST REJECT_REASON_TOKEN_MISSING = 2;
|
28 |
+
CONST REJECT_REASON_TOKEN_EXPIRED = 3;
|
29 |
+
CONST REJECT_REASON_TOKEN_SUBMITTED_EARLY = 4;
|
30 |
+
CONST REJECT_REASON_CLIENT_IP_BLOCKED = 5;
|
31 |
+
CONST REJECT_REASON_BROWSER_INFO_MISSING = 6;
|
32 |
+
CONST REJECT_REASON_BROWSER_INFO_INVALID = 7;
|
33 |
+
CONST REJECT_REASON_CLIENT_IP_UNDETECTABLE = 8;
|
34 |
+
CONST REJECT_REASON_USER_ENUMERATION = 9;
|
35 |
+
CONST REJECT_REASON_PROXY_ANONYMIZER = 10;
|
36 |
+
CONST REJECT_REASON_WEB_ATTACKER = 11;
|
37 |
+
CONST REJECT_REASON_SERVICE_UNAVAILABLE = 12;
|
38 |
+
|
39 |
+
private static $rejectReasonCode = null;
|
40 |
+
private static $browserInfoInputName = null;
|
41 |
+
|
42 |
+
|
43 |
+
public static function isValid(GdbcAttemptEntity $attemptEntity)
|
44 |
+
{
|
45 |
+
static $isRequestValid = null;
|
46 |
+
|
47 |
+
if(null !== $isRequestValid)
|
48 |
+
return $isRequestValid;
|
49 |
+
|
50 |
+
$settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
|
51 |
+
if(null === $settingsModuleInstance)
|
52 |
+
return $isRequestValid = false;
|
53 |
+
|
54 |
+
$isTestModeActivated = (bool)$settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_TEST_MODE_ACTIVATED);
|
55 |
+
|
56 |
+
if( (!$isTestModeActivated) && GdbcIPUtils::isClientIpWhiteListed())
|
57 |
+
return $isRequestValid = true;
|
58 |
+
|
59 |
+
if( self::isReceivedTokenValid($attemptEntity) && GdbcIPUtils::isClientIpBlackListed()){
|
60 |
+
self::$rejectReasonCode = self::REJECT_REASON_CLIENT_IP_BLOCKED;
|
61 |
+
}
|
62 |
+
elseif( (null === self::$rejectReasonCode) && GdbcIPUtils::isClientIpWebAttacker()){
|
63 |
+
self::$rejectReasonCode = self::REJECT_REASON_WEB_ATTACKER;
|
64 |
+
}
|
65 |
+
elseif( (null === self::$rejectReasonCode) && GdbcIPUtils::isClientIpProxyAnonymizer()){
|
66 |
+
self::$rejectReasonCode = self::REJECT_REASON_PROXY_ANONYMIZER;
|
67 |
+
}
|
68 |
+
|
69 |
+
if($isTestModeActivated){
|
70 |
+
GdbcNotificationsController::sendTestModeEmailNotification($attemptEntity);
|
71 |
+
self::$rejectReasonCode = null;
|
72 |
+
}
|
73 |
+
|
74 |
+
if(null === self::$rejectReasonCode){
|
75 |
+
return $isRequestValid = true;
|
76 |
+
}
|
77 |
+
|
78 |
+
$attemptEntity->ReasonId = self::getRejectReasonId();
|
79 |
+
GdbcBruteGuardian::logRejectedAttempt($attemptEntity);
|
80 |
+
|
81 |
+
return $isRequestValid = false;
|
82 |
+
|
83 |
+
}
|
84 |
+
|
85 |
+
|
86 |
+
private static function isReceivedTokenValid(GdbcAttemptEntity $attemptEntity)
|
87 |
+
{
|
88 |
+
if(self::$rejectReasonCode !== null) {
|
89 |
+
return false;
|
90 |
+
}
|
91 |
+
|
92 |
+
$settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
|
93 |
+
if(null === $settingsModuleInstance)
|
94 |
+
return false;
|
95 |
+
|
96 |
+
$tokenSecretKey = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_TOKEN_SECRET_KEY);
|
97 |
+
$hiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
|
98 |
+
|
99 |
+
$minSubmissionTime = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_MIN_SUBMISSION_TIME);
|
100 |
+
|
101 |
+
// $isPluginInTestMode = (bool)$settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_TEST_MODE_ACTIVATED);
|
102 |
+
|
103 |
+
$isProtectionDisabled = ((bool)$settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_DISABLE_IF_USER_LOGGED_IN)) && MchGdbcWpUtils::isUserLoggedIn();
|
104 |
+
if($isProtectionDisabled) {
|
105 |
+
return true;
|
106 |
+
}
|
107 |
+
|
108 |
+
if(null === GdbcIPUtils::getClientIpAddress())
|
109 |
+
{
|
110 |
+
self::$rejectReasonCode = self::REJECT_REASON_CLIENT_IP_UNDETECTABLE;
|
111 |
+
return false;
|
112 |
+
}
|
113 |
+
|
114 |
+
$receivedToken = isset($_POST[$hiddenInputName]) ? $_POST[$hiddenInputName] : null;
|
115 |
+
|
116 |
+
if(null === $receivedToken){
|
117 |
+
self::$rejectReasonCode = self::REJECT_REASON_TOKEN_MISSING;
|
118 |
+
return false;
|
119 |
+
}
|
120 |
+
|
121 |
+
if(!isset($receivedToken[10])) {
|
122 |
+
self::$rejectReasonCode = self::REJECT_REASON_TOKEN_INVALID;
|
123 |
+
return false;
|
124 |
+
}
|
125 |
+
|
126 |
+
$arrDecryptedToken = json_decode(MchCrypt::decryptToken($tokenSecretKey, $receivedToken), true);
|
127 |
+
|
128 |
+
// if($isPluginInTestMode)
|
129 |
+
// {
|
130 |
+
// //$this->arrTokenDebugData['received-info'] = $arrDecryptedToken;
|
131 |
+
// //$this->arrTokenDebugData['token-data'] = $this->getTokenData();
|
132 |
+
// }
|
133 |
+
|
134 |
+
if( !isset($arrDecryptedToken[0]) || false === ($tokenIndex = strpos($arrDecryptedToken[0], self::TOKEN_SEPARATOR)) )
|
135 |
+
{
|
136 |
+
self::$rejectReasonCode = self::REJECT_REASON_TOKEN_INVALID;
|
137 |
+
return false;
|
138 |
+
}
|
139 |
+
|
140 |
+
self::$browserInfoInputName = substr($arrDecryptedToken[0], 0, $tokenIndex);
|
141 |
+
|
142 |
+
$receivedBrowserInfoInput = isset($_POST[self::$browserInfoInputName]) ? $_POST[self::$browserInfoInputName] : null;
|
143 |
+
|
144 |
+
if( null === $receivedBrowserInfoInput )
|
145 |
+
{
|
146 |
+
self::$rejectReasonCode = self::REJECT_REASON_BROWSER_INFO_MISSING;
|
147 |
+
return false;
|
148 |
+
}
|
149 |
+
|
150 |
+
$receivedBrowserInfoInput = MchGdbcUtils::replaceNonAlphaNumericCharacters($receivedBrowserInfoInput, '');
|
151 |
+
|
152 |
+
if($arrDecryptedToken[0] !== self::$browserInfoInputName . self::TOKEN_SEPARATOR . $receivedBrowserInfoInput)
|
153 |
+
{
|
154 |
+
self::$rejectReasonCode = self::REJECT_REASON_BROWSER_INFO_INVALID;
|
155 |
+
return false;
|
156 |
+
}
|
157 |
+
|
158 |
+
array_shift($arrDecryptedToken);
|
159 |
+
|
160 |
+
$arrTokenData = self::getTokenData();
|
161 |
+
|
162 |
+
$timeSinceGenerated = ((int)array_pop($arrTokenData)) - ((int)array_pop($arrDecryptedToken));
|
163 |
+
|
164 |
+
if($timeSinceGenerated < $minSubmissionTime)
|
165 |
+
{
|
166 |
+
if( ! GoodByeCaptchaUtils::isLoginAttemptEntity($attemptEntity) ){
|
167 |
+
self::$rejectReasonCode = self::REJECT_REASON_TOKEN_SUBMITTED_EARLY;
|
168 |
+
return false;
|
169 |
+
}
|
170 |
+
}
|
171 |
+
|
172 |
+
if(count(array_diff($arrDecryptedToken, $arrTokenData)) !== 0)
|
173 |
+
{
|
174 |
+
self::$rejectReasonCode = self::REJECT_REASON_TOKEN_INVALID;
|
175 |
+
return false;
|
176 |
+
}
|
177 |
+
|
178 |
+
unset($_POST[self::$browserInfoInputName], $_POST[$hiddenInputName]);
|
179 |
+
|
180 |
+
global $ultimatemember;
|
181 |
+
|
182 |
+
if(isset($ultimatemember->form))
|
183 |
+
{
|
184 |
+
unset($ultimatemember->form->post_form[self::$browserInfoInputName], $ultimatemember->form->post_form[$hiddenInputName]);
|
185 |
+
unset($ultimatemember->form->post_form['submitted'][self::$browserInfoInputName], $ultimatemember->form->post_form['submitted'][$hiddenInputName]);
|
186 |
+
}
|
187 |
+
|
188 |
+
return true;
|
189 |
+
|
190 |
+
}
|
191 |
+
|
192 |
+
|
193 |
+
public static function getEncryptedToken()
|
194 |
+
{
|
195 |
+
if( ! isset($_POST['browserInfo']) || null === ($arrBrowserInfo = json_decode(stripcslashes($_POST['browserInfo']), true)))
|
196 |
+
return array();
|
197 |
+
|
198 |
+
foreach ((array)$arrBrowserInfo as $prop => $propValue)
|
199 |
+
{
|
200 |
+
if(!is_array($propValue) && false === strpos($prop, ' '))
|
201 |
+
continue;
|
202 |
+
|
203 |
+
unset($arrBrowserInfo[$prop]);
|
204 |
+
}
|
205 |
+
|
206 |
+
if( ($arrBrowserInfoLength = count($arrBrowserInfo)) < 3)
|
207 |
+
return array();
|
208 |
+
|
209 |
+
$arrKeysToSave = array_flip((array)array_rand($arrBrowserInfo, mt_rand(3, $arrBrowserInfoLength - 1)));
|
210 |
+
|
211 |
+
foreach ($arrKeysToSave as $key => &$val)
|
212 |
+
{
|
213 |
+
$val = var_export($arrBrowserInfo[$key], true);
|
214 |
+
}
|
215 |
+
|
216 |
+
$arrTokenData = self::getTokenData();
|
217 |
+
$browserField = MchGdbcUtils::replaceNonAlphaCharacters(MchCrypt::getRandomString(25), '-');
|
218 |
+
|
219 |
+
array_unshift($arrTokenData, $browserField . self::TOKEN_SEPARATOR . MchGdbcUtils::replaceNonAlphaNumericCharacters(implode('', array_values($arrKeysToSave)), ''));
|
220 |
+
|
221 |
+
return array(
|
222 |
+
'token' => MchCrypt::encryptToken(GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_TOKEN_SECRET_KEY), json_encode($arrTokenData)),
|
223 |
+
$browserField => implode(self::TOKEN_SEPARATOR, array_keys($arrKeysToSave))
|
224 |
+
);
|
225 |
+
|
226 |
+
}
|
227 |
+
|
228 |
+
|
229 |
+
private static function getTokenData()
|
230 |
+
{
|
231 |
+
$arrData = array();
|
232 |
+
|
233 |
+
$arrData[] = get_current_blog_id();
|
234 |
+
$arrData[] = GdbcIPUtils::getClientIpAddress();
|
235 |
+
$arrData[] = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_TOKEN_CREATED_TIMESTAMP);
|
236 |
+
$arrData[] = MchGdbcHttpRequest::getServerRequestTime();
|
237 |
+
|
238 |
+
return array_filter($arrData);
|
239 |
+
}
|
240 |
+
|
241 |
+
public static function tokenAlreadyRejected()
|
242 |
+
{
|
243 |
+
return null !== self::$rejectReasonCode;
|
244 |
+
}
|
245 |
+
|
246 |
+
public static function getRejectReasonId()
|
247 |
+
{
|
248 |
+
return self::$rejectReasonCode;
|
249 |
+
}
|
250 |
+
|
251 |
+
public static function getRejectReasonDescription($reasonId)
|
252 |
+
{
|
253 |
+
static $arrReasonDescription = null;
|
254 |
+
if(null === $arrReasonDescription)
|
255 |
+
{
|
256 |
+
$arrReasonDescription = array(
|
257 |
+
|
258 |
+
self::REJECT_REASON_TOKEN_INVALID => __('Invalid Token', GoodByeCaptcha::PLUGIN_SLUG),
|
259 |
+
self::REJECT_REASON_TOKEN_MISSING => __('Token Not Submitted', GoodByeCaptcha::PLUGIN_SLUG),
|
260 |
+
self::REJECT_REASON_TOKEN_EXPIRED => __('Token Expired', GoodByeCaptcha::PLUGIN_SLUG),
|
261 |
+
self::REJECT_REASON_TOKEN_SUBMITTED_EARLY => __('Token Submitted Early', GoodByeCaptcha::PLUGIN_SLUG),
|
262 |
+
self::REJECT_REASON_CLIENT_IP_BLOCKED => __('Client IP Blocked', GoodByeCaptcha::PLUGIN_SLUG),
|
263 |
+
self::REJECT_REASON_BROWSER_INFO_MISSING => __('Browser Info Missing', GoodByeCaptcha::PLUGIN_SLUG),
|
264 |
+
self::REJECT_REASON_BROWSER_INFO_INVALID => __('Browser Info Invalid', GoodByeCaptcha::PLUGIN_SLUG),
|
265 |
+
self::REJECT_REASON_CLIENT_IP_UNDETECTABLE => __('Undetectable Client IP', GoodByeCaptcha::PLUGIN_SLUG),
|
266 |
+
self::REJECT_REASON_USER_ENUMERATION => __('User Enumeration', GoodByeCaptcha::PLUGIN_SLUG),
|
267 |
+
self::REJECT_REASON_PROXY_ANONYMIZER => __('Proxy Anonymizer', GoodByeCaptcha::PLUGIN_SLUG),
|
268 |
+
self::REJECT_REASON_WEB_ATTACKER => __('Web Attacker', GoodByeCaptcha::PLUGIN_SLUG),
|
269 |
+
self::REJECT_REASON_SERVICE_UNAVAILABLE => __('Service Unavailable', GoodByeCaptcha::PLUGIN_SLUG),
|
270 |
+
);
|
271 |
+
}
|
272 |
+
|
273 |
+
return isset($arrReasonDescription[$reasonId]) ? $arrReasonDescription[$reasonId] : __('Unknown', GoodByeCaptcha::PLUGIN_SLUG);
|
274 |
+
|
275 |
+
}
|
276 |
+
|
277 |
+
|
278 |
+
public static function getPostedBrowserInfoInputName()
|
279 |
+
{
|
280 |
+
return self::$browserInfoInputName;
|
281 |
+
}
|
282 |
+
|
283 |
+
public static function redirectToHomePage()
|
284 |
+
{
|
285 |
+
wp_redirect( home_url() ); exit;
|
286 |
+
}
|
287 |
+
|
288 |
+
}
|
engine/GdbcTaskScheduler.php
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GdbcTaskScheduler
|
21 |
+
{
|
22 |
+
private static function getGdbcTasks()
|
23 |
+
{
|
24 |
+
return array(
|
25 |
+
new GdbcLogsCleanerTask(MchGdbcWpTaskScheduler::SECONDS_IN_DAY, true),
|
26 |
+
);
|
27 |
+
|
28 |
+
// static $arrGdbcTasks = array();
|
29 |
+
// if(!empty($arrGdbcTasks))
|
30 |
+
// return $arrGdbcTasks;
|
31 |
+
//
|
32 |
+
// $arrGdbcTasks[] = new GdbcLogsCleanerTask(MchGdbcWpTaskScheduler::SECONDS_IN_DAY, true);
|
33 |
+
//
|
34 |
+
// return $arrGdbcTasks;
|
35 |
+
}
|
36 |
+
|
37 |
+
public static function scheduleGdbcTasks()
|
38 |
+
{
|
39 |
+
foreach(self::getGdbcTasks() as $gdbcTask)
|
40 |
+
{
|
41 |
+
MchGdbcWpTaskScheduler::getInstance()->registerTask($gdbcTask);
|
42 |
+
}
|
43 |
+
|
44 |
+
MchGdbcWpTaskScheduler::getInstance()->scheduleRegisteredTasks();
|
45 |
+
}
|
46 |
+
|
47 |
+
public static function unScheduleGdbcTasks()
|
48 |
+
{
|
49 |
+
foreach(self::getGdbcTasks() as $gdbcTask)
|
50 |
+
{
|
51 |
+
MchGdbcWpTaskScheduler::getInstance()->registerTask($gdbcTask);
|
52 |
+
MchGdbcWpTaskScheduler::getInstance()->unScheduleRegisteredTask($gdbcTask);
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
private function __construct(){}
|
57 |
+
private function __clone(){}
|
58 |
+
}
|
engine/GdbcUpdatesController.php
ADDED
@@ -0,0 +1,317 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GdbcUpdatesController
|
21 |
+
{
|
22 |
+
public static function updateToCurrentVersion()
|
23 |
+
{
|
24 |
+
|
25 |
+
if(null === ($settingsModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_SETTINGS)))
|
26 |
+
return;
|
27 |
+
|
28 |
+
$savedPluginVersion = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_PLUGIN_VERSION);
|
29 |
+
|
30 |
+
if(null === $savedPluginVersion) // fresh install. Save default options
|
31 |
+
{
|
32 |
+
foreach(array_keys(GdbcModulesController::getRegisteredModules()) as $moduleName)
|
33 |
+
{
|
34 |
+
if(null === ($adminModuleInstance = GdbcModulesController::getAdminModuleInstance($moduleName)))
|
35 |
+
continue;
|
36 |
+
|
37 |
+
foreach($adminModuleInstance->getDefaultOptionsValues() as $optionName => $optionValue)
|
38 |
+
{
|
39 |
+
if( ! is_scalar($optionValue) )
|
40 |
+
continue;
|
41 |
+
|
42 |
+
$adminModuleInstance->saveOption($optionName, $optionValue);
|
43 |
+
}
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
$arrPublicModulesKeys = array_flip(GdbcModulesController::getPublicModulesName());
|
48 |
+
foreach( array_keys(GdbcModulesController::getRegisteredModules()) as $registeredModuleName)
|
49 |
+
{
|
50 |
+
if( isset( $arrPublicModulesKeys[$registeredModuleName] ) )
|
51 |
+
continue;
|
52 |
+
|
53 |
+
if( ! defined("GoodByeCaptcha$registeredModuleName::MODULE_VERSION") || -1 !== version_compare(constant("GoodByeCaptcha$registeredModuleName::MODULE_VERSION"), '2.0') )
|
54 |
+
continue;
|
55 |
+
|
56 |
+
GdbcModulesController::unRegisterModule($registeredModuleName);
|
57 |
+
remove_action('plugins_loaded', array("GoodByeCaptcha$registeredModuleName", 'getInstance'));
|
58 |
+
|
59 |
+
}
|
60 |
+
remove_action('plugins_loaded', array( 'GoodByeCaptchaPro', 'getInstance' ));
|
61 |
+
|
62 |
+
if(MchGdbcWpUtils::isUserInDashboard())
|
63 |
+
{
|
64 |
+
$arrActiveSites = MchGdbcWpUtils::isMultiSite() ? MchGdbcWpUtils::getAllBlogIds() : array(get_current_blog_id());
|
65 |
+
|
66 |
+
foreach($arrActiveSites as $blogId) {
|
67 |
+
self::migrateTableDataFromV1($blogId);
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
if( 0 === version_compare($savedPluginVersion, GoodByeCaptcha::PLUGIN_VERSION) )
|
72 |
+
return;
|
73 |
+
|
74 |
+
|
75 |
+
$arrActiveSites = MchGdbcWpUtils::isMultiSite() ? MchGdbcWpUtils::getAllBlogIds() : array(get_current_blog_id());
|
76 |
+
|
77 |
+
if( -1 === version_compare($savedPluginVersion, '2.0') )
|
78 |
+
{
|
79 |
+
GdbcTaskScheduler::unScheduleGdbcTasks();
|
80 |
+
delete_site_option('gdbc-blocked-attempts');
|
81 |
+
|
82 |
+
self::updateToVersion_2_0();
|
83 |
+
|
84 |
+
foreach($arrActiveSites as $blogId){
|
85 |
+
self::migrateTableDataFromV1($blogId);
|
86 |
+
}
|
87 |
+
|
88 |
+
}
|
89 |
+
|
90 |
+
|
91 |
+
$settingsModuleInstance->saveOption(GdbcSettingsAdminModule::OPTION_PLUGIN_VERSION, GoodByeCaptcha::PLUGIN_VERSION);
|
92 |
+
|
93 |
+
|
94 |
+
GoodByeCaptchaUtils::flushSiteCache();
|
95 |
+
|
96 |
+
if(GoodByeCaptcha::isNetworkActivated()){
|
97 |
+
foreach($arrActiveSites as $blogId){
|
98 |
+
$blogId != get_current_blog_id() ? GoodByeCaptchaUtils::flushSiteCache($blogId) : null;
|
99 |
+
}
|
100 |
+
}
|
101 |
+
|
102 |
+
|
103 |
+
}
|
104 |
+
|
105 |
+
private static function updateToVersion_2_0()
|
106 |
+
{
|
107 |
+
global $wpdb;
|
108 |
+
|
109 |
+
$suppressOldValue = $wpdb->suppress_errors(true);
|
110 |
+
$wpdb->hide_errors();
|
111 |
+
|
112 |
+
if(!GdbcDbAccessController::attemptsTableExists()){
|
113 |
+
GdbcDbAccessController::createAttemptsTable();
|
114 |
+
}
|
115 |
+
|
116 |
+
$arrBlogs = MchGdbcWpUtils::isMultiSite() ? MchGdbcWpUtils::getAllBlogIds() : array(get_current_blog_id());
|
117 |
+
|
118 |
+
foreach($arrBlogs as $blogId)
|
119 |
+
{
|
120 |
+
$blogTablePrefix = $wpdb->get_blog_prefix($blogId);
|
121 |
+
|
122 |
+
$gdbcTableName = $blogTablePrefix . 'gdbc_attempts';
|
123 |
+
|
124 |
+
if($wpdb->get_var("SHOW TABLES LIKE '$gdbcTableName'") !== $gdbcTableName)
|
125 |
+
continue;
|
126 |
+
|
127 |
+
$arrQueryResult = $wpdb->get_results("SELECT * FROM $gdbcTableName LIMIT 1");
|
128 |
+
|
129 |
+
if(isset($arrQueryResult[0]->IsDeleted) || empty($arrQueryResult)) {
|
130 |
+
$wpdb->query( "RENAME TABLE $gdbcTableName TO {$gdbcTableName}_old" );
|
131 |
+
}
|
132 |
+
}
|
133 |
+
|
134 |
+
GdbcDbAccessController::createAttemptsTable();
|
135 |
+
|
136 |
+
$wpdb->suppress_errors($suppressOldValue);
|
137 |
+
|
138 |
+
}
|
139 |
+
|
140 |
+
private static function migrateTableDataFromV1($blogId)
|
141 |
+
{
|
142 |
+
global $wpdb;
|
143 |
+
$blogTablePrefix = $wpdb->get_blog_prefix($blogId);
|
144 |
+
|
145 |
+
$gdbcOldTableName = $blogTablePrefix . 'gdbc_attempts_old' ;
|
146 |
+
|
147 |
+
if($wpdb->get_var("SHOW TABLES LIKE '$gdbcOldTableName'") !== $gdbcOldTableName)
|
148 |
+
return;
|
149 |
+
|
150 |
+
if( ! GdbcDbAccessController::attemptsTableExists() )
|
151 |
+
return;
|
152 |
+
|
153 |
+
$alreadyBlockedIpsList = (array)$wpdb->get_results("SELECT DISTINCT ClientIp FROM $gdbcOldTableName WHERE IsIpBlocked <> 0 AND IsDeleted = 0");
|
154 |
+
|
155 |
+
foreach($alreadyBlockedIpsList as $ipAddressObject)
|
156 |
+
{
|
157 |
+
$clientIp = MchGdbcIPUtils::ipAddressFromBinary($ipAddressObject->ClientIp);
|
158 |
+
if(!MchGdbcIPUtils::isValidIpAddress($clientIp))
|
159 |
+
continue;
|
160 |
+
|
161 |
+
if(GdbcIPUtils::isIpBlackListed($clientIp))
|
162 |
+
continue;
|
163 |
+
|
164 |
+
GdbcBlackListedIpsAdminModule::getInstance()->registerBlackListedIp($clientIp);
|
165 |
+
|
166 |
+
}
|
167 |
+
|
168 |
+
unset($alreadyBlockedIpsList, $ipAddressObject, $clientIp);
|
169 |
+
|
170 |
+
|
171 |
+
$arrModulesIdMapping = array( // key - oldModuleId
|
172 |
+
1 => GdbcModulesController::MODULE_WORDPRESS ,
|
173 |
+
2 => GdbcModulesController::MODULE_JETPACK_CONTACT_FORM ,
|
174 |
+
3 => GdbcModulesController::MODULE_BUDDY_PRESS ,
|
175 |
+
4 => GdbcModulesController::MODULE_NINJA_FORMS ,
|
176 |
+
5 => GdbcModulesController::MODULE_CONTACT_FORM_7 ,
|
177 |
+
6 => GdbcModulesController::MODULE_GRAVITY_FORMS ,
|
178 |
+
7 => GdbcModulesController::MODULE_FAST_SECURE_FORM ,
|
179 |
+
8 => GdbcModulesController::MODULE_FORMIDABLE_FORMS ,
|
180 |
+
9 => GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP ,
|
181 |
+
11 => GdbcModulesController::MODULE_USER_PRO ,
|
182 |
+
12 => GdbcModulesController::MODULE_ULTIMATE_MEMBER ,
|
183 |
+
13 => GdbcModulesController::MODULE_WOOCOMMERCE ,
|
184 |
+
14 => GdbcModulesController::MODULE_UPME ,
|
185 |
+
15 => GdbcModulesController::MODULE_PLANSO_FORMS ,
|
186 |
+
16 => GdbcModulesController::MODULE_SEAMLESS_DONATIONS ,
|
187 |
+
);
|
188 |
+
|
189 |
+
|
190 |
+
|
191 |
+
$minDateTime = date('Y-m-d H:i:s', strtotime(((-1) * (30)) . ' days', current_time( 'timestamp' )));
|
192 |
+
$maxDateTime = date('Y-m-d H:i:s', current_time( 'timestamp' ));
|
193 |
+
|
194 |
+
$gdbcAttemptsQuery = "
|
195 |
+
SELECT Id, UNIX_TIMESTAMP(CreatedDate) AS CreatedDate, ModuleId, SectionId, ClientIp, CountryId, ReasonId
|
196 |
+
FROM $gdbcOldTableName WHERE IsDeleted = 0 AND CreatedDate BETWEEN '$minDateTime' AND '$maxDateTime' order by CreatedDate DESC LIMIT 500;
|
197 |
+
";
|
198 |
+
|
199 |
+
|
200 |
+
$gdbcAttemptsList = (array)$wpdb->get_results($gdbcAttemptsQuery);
|
201 |
+
|
202 |
+
$oldSettingsOptions = get_site_option('gdbcsettingsadminmodule-settings');
|
203 |
+
if(!empty($oldSettingsOptions['TrustedIps'][0]) && MchGdbcIPUtils::isValidIpAddress($oldSettingsOptions['TrustedIps'][0]))
|
204 |
+
{
|
205 |
+
if(!GdbcIPUtils::isIpWhiteListed($oldSettingsOptions['TrustedIps'][0])){
|
206 |
+
GdbcWhiteListedIpsAdminModule::getInstance()->registerWhiteListedIp($oldSettingsOptions['TrustedIps'][0]);
|
207 |
+
}
|
208 |
+
}
|
209 |
+
|
210 |
+
$oldSettingsOptions = get_site_option('gdbcwordpressadminmodule-settings');
|
211 |
+
if(!empty($oldSettingsOptions['IsCommentsFormActivated']))
|
212 |
+
{
|
213 |
+
GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_COMMENTS_FORM, true);
|
214 |
+
}
|
215 |
+
|
216 |
+
if(!empty($oldSettingsOptions['IsLoginFormActivated']))
|
217 |
+
{
|
218 |
+
GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_LOGIN_FORM, true);
|
219 |
+
}
|
220 |
+
if(!empty($oldSettingsOptions['IsLostPasswordFormActivated']))
|
221 |
+
{
|
222 |
+
GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_LOST_PASSWORD_FORM, true);
|
223 |
+
}
|
224 |
+
if(!empty($oldSettingsOptions['IsUserRegistrationFormActivated']))
|
225 |
+
{
|
226 |
+
GdbcWordPressAdminModule::getInstance()->saveOption(GdbcWordPressAdminModule::WORDPRESS_REGISTRATION_FORM, true);
|
227 |
+
}
|
228 |
+
|
229 |
+
$oldSettingsOptions = get_site_option('gdbcultimatememberadminmodule-settings');
|
230 |
+
if(!empty($oldSettingsOptions['IsUMLoginActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
|
231 |
+
{
|
232 |
+
GdbcUltimateMemberAdminModule::getInstance()->saveOption(GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_LOGIN_FORM, true);
|
233 |
+
}
|
234 |
+
if(!empty($oldSettingsOptions['IsUMRegisterActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
|
235 |
+
{
|
236 |
+
GdbcUltimateMemberAdminModule::getInstance()->saveOption(GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_REGISTER_FORM, true);
|
237 |
+
}
|
238 |
+
if(!empty($oldSettingsOptions['IsUMLostPasswordActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
|
239 |
+
{
|
240 |
+
GdbcUltimateMemberAdminModule::getInstance()->saveOption(GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_LOST_PASSWORD_FORM, true);
|
241 |
+
}
|
242 |
+
|
243 |
+
$oldSettingsOptions = get_site_option('gdbcsubscriptionsadminmodule-settings');
|
244 |
+
if(!empty($oldSettingsOptions['IsMCLActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP))
|
245 |
+
{
|
246 |
+
GdbcMailChimpForWpAdminModule::getInstance()->saveOption(GdbcMailChimpForWpAdminModule::OPTION_MODULE_MAIL_CHIMP_FOR_WP, true);
|
247 |
+
}
|
248 |
+
|
249 |
+
$oldSettingsOptions = get_site_option('gdbcpopularformsadminmodule-settings');
|
250 |
+
if(!empty($oldSettingsOptions['IsJCFctivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_JETPACK_CONTACT_FORM))
|
251 |
+
{
|
252 |
+
GdbcJetPackContactFormAdminModule::getInstance()->saveOption(GdbcJetPackContactFormAdminModule::OPTION_IS_JETPACK_CONTACT_FORM_ACTIVATE, true);
|
253 |
+
}
|
254 |
+
if(!empty($oldSettingsOptions['IsPFActivated']) && GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_PLANSO_FORMS))
|
255 |
+
{
|
256 |
+
GdbcPlanSoFormsAdminModule::getInstance()->saveOption(GdbcPlanSoFormsAdminModule::OPTION_PLANSO_GENERAL_FORM, true);
|
257 |
+
}
|
258 |
+
|
259 |
+
delete_site_option('gdbcsettingsadminmodule-settings');
|
260 |
+
delete_site_option('gdbcwordpressadminmodule-settings');
|
261 |
+
delete_site_option('gdbcultimatememberadminmodule-settings');
|
262 |
+
delete_site_option('gdbcsubscriptionsadminmodule-settings');
|
263 |
+
delete_site_option('gdbcpopularformsadminmodule-settings');
|
264 |
+
|
265 |
+
if(empty($gdbcAttemptsList)) {
|
266 |
+
|
267 |
+
foreach(GdbcModulesController::getRegisteredModules() as $moduleName => $arrModuleInfo)
|
268 |
+
{
|
269 |
+
if(null === ($adminModuleInstance = GdbcModulesController::getAdminModuleInstance($moduleName)))
|
270 |
+
continue;
|
271 |
+
|
272 |
+
$oldOptionKey = strtolower(get_class($adminModuleInstance)) . '-settings';
|
273 |
+
|
274 |
+
MchGdbcWpUtils::isMultiSite() && function_exists('delete_blog_option') ? delete_blog_option($blogId, $oldOptionKey) : delete_option($oldOptionKey);
|
275 |
+
}
|
276 |
+
|
277 |
+
|
278 |
+
$wpdb->query("DROP TABLE IF EXISTS $gdbcOldTableName");
|
279 |
+
return;
|
280 |
+
}
|
281 |
+
|
282 |
+
$arrSelectedIds = array();
|
283 |
+
foreach($gdbcAttemptsList as $gdbcAttempt)
|
284 |
+
{
|
285 |
+
|
286 |
+
empty($gdbcAttempt->SectionId) ? $gdbcAttempt->SectionId = 0 : null;
|
287 |
+
|
288 |
+
$newModuleName = isset($arrModulesIdMapping[$gdbcAttempt->ModuleId]) ? $arrModulesIdMapping[$gdbcAttempt->ModuleId] : null;
|
289 |
+
$newModuleId = GdbcModulesController::getModuleIdByName($newModuleName);
|
290 |
+
|
291 |
+
if(empty($newModuleId))
|
292 |
+
continue;
|
293 |
+
|
294 |
+
$attemptEntity = new GdbcAttemptEntity($newModuleId);
|
295 |
+
|
296 |
+
$attemptEntity->ModuleId = $newModuleId;
|
297 |
+
$attemptEntity->SectionId = !empty($gdbcAttempt->SectionId) ? $gdbcAttempt->SectionId : 0;
|
298 |
+
$attemptEntity->SiteId = $blogId;
|
299 |
+
$attemptEntity->CreatedDate = $gdbcAttempt->CreatedDate;
|
300 |
+
$attemptEntity->ReasonId = $gdbcAttempt->ReasonId;
|
301 |
+
$attemptEntity->ClientIp = MchGdbcIPUtils::ipAddressFromBinary($gdbcAttempt->ClientIp);
|
302 |
+
|
303 |
+
|
304 |
+
if(0 !== GdbcDbAccessController::registerAttempt($attemptEntity)) {
|
305 |
+
$arrSelectedIds[] = $gdbcAttempt->Id;
|
306 |
+
}
|
307 |
+
|
308 |
+
}
|
309 |
+
|
310 |
+
$wpdb->query("DELETE FROM $gdbcOldTableName WHERE Id IN (" . implode(',', $arrSelectedIds) . ")");
|
311 |
+
|
312 |
+
}
|
313 |
+
|
314 |
+
|
315 |
+
private function __construct()
|
316 |
+
{}
|
317 |
+
}
|
engine/GoodByeCaptchaAdmin.php
ADDED
@@ -0,0 +1,306 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GoodByeCaptchaAdmin extends MchGdbcBaseAdminPlugin
|
21 |
+
{
|
22 |
+
CONST GDBC_ADMIN_NOTICES_FILTER_KEY = 'gdbc-admin-notices';
|
23 |
+
|
24 |
+
private static $adminNoticesList = array();
|
25 |
+
|
26 |
+
protected function __construct(array $arrPluginInfo)
|
27 |
+
{
|
28 |
+
|
29 |
+
parent::__construct($arrPluginInfo);
|
30 |
+
|
31 |
+
$this->adminPagesList = array(
|
32 |
+
|
33 |
+
new GdbcSettingsAdminPage(__('Settings', self::$PLUGIN_SLUG), __('General Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
34 |
+
new GdbcSecurityAdminPage(__('Security', self::$PLUGIN_SLUG), __('Security Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
35 |
+
new GdbcWordpressAdminPage(__('WordPress', self::$PLUGIN_SLUG), __('WordPress Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
36 |
+
new GdbcContactFormsAdminPage(__('Contact Forms', self::$PLUGIN_SLUG), __('Contact Forms Plugins', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
37 |
+
new GdbcMembershipAdminPage(__('Membership', self::$PLUGIN_SLUG), __('Membership Page Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
38 |
+
new GdbcOthersAdminPage(__('Others', self::$PLUGIN_SLUG), __('All other popular plugins settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
39 |
+
new GdbcNotificationsAdminPage(__('Notifications', self::$PLUGIN_SLUG), __('Notifications Settings', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
40 |
+
new GdbcReportsAdminPage(__('Reports', self::$PLUGIN_SLUG), __('GoodBye Captcha - Blocked Attempts', self::$PLUGIN_SLUG), self::$PLUGIN_SLUG),
|
41 |
+
|
42 |
+
);
|
43 |
+
|
44 |
+
|
45 |
+
if(MchGdbcWpUtils::isMultiSite() && GoodByeCaptcha::isNetworkActivated())
|
46 |
+
{
|
47 |
+
add_action( 'network_admin_menu', array( $this, 'buildPluginMenu' ), 10 );
|
48 |
+
}
|
49 |
+
else
|
50 |
+
{
|
51 |
+
add_action( 'admin_menu', array( $this, 'buildPluginMenu' ), 10 );
|
52 |
+
}
|
53 |
+
|
54 |
+
foreach(self::getAdminRegisteredNotices() as $adminNotice)
|
55 |
+
{
|
56 |
+
if($adminNotice->isDismissible() && $adminNotice->isDismissed())
|
57 |
+
continue;
|
58 |
+
|
59 |
+
if(MchGdbcWpUtils::isMultiSite() && GoodByeCaptcha::isNetworkActivated())
|
60 |
+
{
|
61 |
+
add_action('network_admin_notices', array($adminNotice, 'showNotice'));
|
62 |
+
}
|
63 |
+
else
|
64 |
+
{
|
65 |
+
add_action( 'admin_notices', array( $adminNotice, 'showNotice' ) );
|
66 |
+
}
|
67 |
+
|
68 |
+
}
|
69 |
+
|
70 |
+
}
|
71 |
+
|
72 |
+
public static function getAdminRegisteredNotices()
|
73 |
+
{
|
74 |
+
if( empty(self::$adminNoticesList) )
|
75 |
+
self::registerAdminNotices();
|
76 |
+
|
77 |
+
return self::$adminNoticesList = apply_filters(self::GDBC_ADMIN_NOTICES_FILTER_KEY, self::$adminNoticesList);
|
78 |
+
|
79 |
+
}
|
80 |
+
|
81 |
+
private static function registerAdminNotices()
|
82 |
+
{
|
83 |
+
$bruteForceModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::MODULE_BRUTE_FORCE);
|
84 |
+
|
85 |
+
if( !GdbcIPUtils::isClientIpWhiteListed() && GdbcIPUtils::isClientIpWebAttacker(true) && $bruteForceModuleInstance)
|
86 |
+
{
|
87 |
+
$bruteForceModuleInstance->deleteOption(GdbcBruteForceAdminModule::OPTION_BLOCK_WEB_ATTACKERS, GoodByeCaptcha::isNetworkActivated());
|
88 |
+
$adminNotice = new GdbcAdminNotice( GdbcAdminNotice::USER_IP_WEB_ATTACKER_NOTICE_KEY, GdbcAdminNotice::NOTICE_TYPE_DANGER );
|
89 |
+
|
90 |
+
$noticeMessage = '<p><b>';
|
91 |
+
$noticeMessage .= sprintf( __( "Your IP Address - %s - is reported as a Web Attacker! In order to keep <b>Block Web Attackers IPs</b> option activated you must white-list your IP Address!", GoodByeCaptcha::PLUGIN_SLUG ), esc_html( GdbcIPUtils::getClientIpAddress() ) );
|
92 |
+
$noticeMessage .= '</b></p>';
|
93 |
+
|
94 |
+
$adminNotice->setMessage( $noticeMessage );
|
95 |
+
$adminNotice->setIsDismissible( true );
|
96 |
+
|
97 |
+
self::$adminNoticesList[] = $adminNotice;
|
98 |
+
|
99 |
+
}
|
100 |
+
|
101 |
+
if( !GdbcIPUtils::isClientIpWhiteListed() && GdbcIPUtils::isClientIpProxyAnonymizer(true))
|
102 |
+
{
|
103 |
+
$bruteForceModuleInstance->deleteOption(GdbcBruteForceAdminModule::OPTION_BLOCK_ANONYMOUS_PROXY, GoodByeCaptcha::isNetworkActivated());
|
104 |
+
|
105 |
+
$adminNotice = new GdbcAdminNotice(GdbcAdminNotice::USER_IP_PROXY_ANONYM_NOTICE_KEY, GdbcAdminNotice::NOTICE_TYPE_DANGER);
|
106 |
+
$noticeMessage = '<p><b>';
|
107 |
+
$noticeMessage .= sprintf(__("Your IP Address - %s - is reported as a dangerous Anonymous Proxy IP! In order to keep <b>Block Anonymous Proxy IPs</b> option activated you must white-list your IP Address!", GoodByeCaptcha::PLUGIN_SLUG), esc_html(GdbcIPUtils::getClientIpAddress()));
|
108 |
+
$noticeMessage .= '</b></p>';
|
109 |
+
|
110 |
+
$adminNotice->setMessage($noticeMessage);
|
111 |
+
$adminNotice->setIsDismissible(false);
|
112 |
+
|
113 |
+
self::$adminNoticesList[] = $adminNotice;
|
114 |
+
|
115 |
+
}
|
116 |
+
|
117 |
+
}
|
118 |
+
|
119 |
+
public function renderPluginActiveAdminPage()
|
120 |
+
{
|
121 |
+
$activeAdminPage = $this->getActivePage();
|
122 |
+
|
123 |
+
$adminPageHtmlCode = '<div class="' . "wrap container-fluid gdbc-settings " . $activeAdminPage->getAdminScreenId() . '">';
|
124 |
+
|
125 |
+
$adminPageHtmlCode .= '<h2 class="nav-tab-wrapper">';
|
126 |
+
|
127 |
+
foreach($this->getRegisteredAdminPages() as $adminPage)
|
128 |
+
{
|
129 |
+
$adminPageHtmlCode .= '<a class="nav-tab' . (($adminPage->isActive()) ? ' nav-tab-active' : '') . '" href="?page=' . $adminPage->getPageMenuSlug() . '">';
|
130 |
+
$adminPageHtmlCode .= $adminPage->getPageMenuTitle() . '</a>';
|
131 |
+
}
|
132 |
+
|
133 |
+
$adminPageHtmlCode .= '</h2>';
|
134 |
+
|
135 |
+
|
136 |
+
echo $adminPageHtmlCode;
|
137 |
+
|
138 |
+
|
139 |
+
if(null !== $activeAdminPage)
|
140 |
+
{
|
141 |
+
$activeAdminPage->renderPageContent();
|
142 |
+
}
|
143 |
+
|
144 |
+
echo '</div>';
|
145 |
+
}
|
146 |
+
|
147 |
+
public function buildPluginMenu()
|
148 |
+
{
|
149 |
+
$arrRegisteredPages = $this->getRegisteredAdminPages();
|
150 |
+
$adminFirstPage = reset($arrRegisteredPages);
|
151 |
+
if(false === $adminFirstPage)
|
152 |
+
return;
|
153 |
+
|
154 |
+
$pageAdminScreenId = add_menu_page(
|
155 |
+
$adminFirstPage->getPageBrowserTitle(),
|
156 |
+
'GoodBye Captcha',
|
157 |
+
'manage_options',
|
158 |
+
$adminFirstPage->getPageMenuSlug(),
|
159 |
+
array($this, 'renderPluginActiveAdminPage'),
|
160 |
+
'dashicons-shield',
|
161 |
+
'53.8393'
|
162 |
+
);
|
163 |
+
|
164 |
+
$this->adminPagesList[0]->setAdminScreenId($pageAdminScreenId);
|
165 |
+
|
166 |
+
$arrSize = count($this->adminPagesList);
|
167 |
+
if(1 === $arrSize)
|
168 |
+
return;
|
169 |
+
|
170 |
+
add_submenu_page(
|
171 |
+
$adminFirstPage->getPageMenuSlug(),
|
172 |
+
$adminFirstPage->getPageBrowserTitle(),
|
173 |
+
$adminFirstPage->getPageMenuTitle(),
|
174 |
+
'manage_options',
|
175 |
+
$adminFirstPage->getPageMenuSlug()
|
176 |
+
);
|
177 |
+
|
178 |
+
|
179 |
+
for($i = 1; $i < $arrSize; ++$i)
|
180 |
+
{
|
181 |
+
if(!$this->adminPagesList[$i]->hasRegisteredModules())
|
182 |
+
{
|
183 |
+
unset($this->adminPagesList[$i]);
|
184 |
+
continue;
|
185 |
+
}
|
186 |
+
|
187 |
+
$pageAdminScreenId = add_submenu_page(
|
188 |
+
$adminFirstPage->getPageMenuSlug(),
|
189 |
+
$this->adminPagesList[$i]->getPageBrowserTitle(),
|
190 |
+
$this->adminPagesList[$i]->getPageMenuTitle(),
|
191 |
+
'manage_options',
|
192 |
+
$this->adminPagesList[$i]->getPageMenuSlug(),
|
193 |
+
array($this, 'renderPluginActiveAdminPage')
|
194 |
+
);
|
195 |
+
|
196 |
+
$this->adminPagesList[$i]->setAdminScreenId($pageAdminScreenId);
|
197 |
+
}
|
198 |
+
|
199 |
+
|
200 |
+
}
|
201 |
+
|
202 |
+
|
203 |
+
|
204 |
+
public function enqueueAdminScriptsAndStyles()
|
205 |
+
{
|
206 |
+
|
207 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-admin-script', plugins_url('/assets/admin/scripts/gdbc-admin.js', self::$PLUGIN_MAIN_FILE), array('jquery'), self::$PLUGIN_VERSION);
|
208 |
+
|
209 |
+
wp_localize_script(self::$PLUGIN_SLUG . '-admin-script', 'GdbcAdmin', array(
|
210 |
+
'ajaxUrl' => admin_url('admin-ajax.php'),
|
211 |
+
'ajaxRequestNonce' => wp_create_nonce(GdbcAjaxController::AJAX_NONCE_VALUE),
|
212 |
+
));
|
213 |
+
|
214 |
+
if(null === ($activeAdminPage = $this->getActivePage()))
|
215 |
+
return;
|
216 |
+
|
217 |
+
if($this->getActivePage() instanceof GdbcReportsAdminPage)
|
218 |
+
{
|
219 |
+
remove_action( 'admin_print_styles', 'print_emoji_styles' );
|
220 |
+
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
|
221 |
+
|
222 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-flot', plugins_url('/assets/admin/scripts/jquery-flot.js', self::$PLUGIN_MAIN_FILE), array('jquery'), self::$PLUGIN_VERSION);
|
223 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-flot-tooltip', plugins_url('/assets/admin/scripts/jquery-flot-tooltip.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
224 |
+
|
225 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-raphael', plugins_url('/assets/admin/scripts/raphael.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
226 |
+
|
227 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-morris', plugins_url('/assets/admin/scripts/morris.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
228 |
+
|
229 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-reports-script', plugins_url('/assets/admin/scripts/gdbc-reports.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
230 |
+
|
231 |
+
|
232 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-bootstrap', plugins_url('/assets/admin/scripts/bootstrap.min.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
233 |
+
|
234 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-jvectormap', plugins_url('/assets/admin/scripts/jquery-jvectormap-1.2.2.min.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
235 |
+
wp_enqueue_script(self::$PLUGIN_SLUG . '-jquery-jvectormap-world', plugins_url('/assets/admin/scripts/jquery-jvectormap-world-mill-en.js', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
236 |
+
|
237 |
+
wp_enqueue_style(self::$PLUGIN_SLUG . '-bootstrap', plugins_url('/assets/admin/styles/bootstrap.css', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
238 |
+
wp_enqueue_style(self::$PLUGIN_SLUG . '-morris', plugins_url('/assets/admin/styles/morris.css', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
239 |
+
}
|
240 |
+
|
241 |
+
|
242 |
+
wp_enqueue_style('dashboard');
|
243 |
+
wp_enqueue_script('dashboard');
|
244 |
+
|
245 |
+
|
246 |
+
wp_enqueue_style (self::$PLUGIN_SLUG . '-admin-style', plugins_url('/assets/admin/styles/gdbc-admin.css', self::$PLUGIN_MAIN_FILE), array(), self::$PLUGIN_VERSION);
|
247 |
+
|
248 |
+
}
|
249 |
+
|
250 |
+
|
251 |
+
public static function getInstance(array $arrPluginInfo)
|
252 |
+
{
|
253 |
+
static $gdbcAdminInstance = null;
|
254 |
+
return null !== $gdbcAdminInstance ? $gdbcAdminInstance : $gdbcAdminInstance = new self($arrPluginInfo);
|
255 |
+
}
|
256 |
+
|
257 |
+
public function initializeAdminPlugin()
|
258 |
+
{
|
259 |
+
parent::initializeAdminPlugin();
|
260 |
+
|
261 |
+
if(MchGdbcWpUtils::isAjaxRequest())
|
262 |
+
return;
|
263 |
+
|
264 |
+
|
265 |
+
add_action('shutdown', array($this, 'executeLowPriorityTasks'));
|
266 |
+
|
267 |
+
}
|
268 |
+
|
269 |
+
public function executeLowPriorityTasks()
|
270 |
+
{
|
271 |
+
|
272 |
+
GdbcDbAccessController::deleteAttemptsOlderThan(GdbcSettingsAdminModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_MAX_LOGS_DAYS));
|
273 |
+
GdbcDbAccessController::clearAttemptsNotesOlderThan(GdbcSettingsAdminModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_BLOCKED_CONTENT_LOG_DAYS));
|
274 |
+
|
275 |
+
if(null === self::$PLUGIN_MAIN_FILE)
|
276 |
+
return;
|
277 |
+
|
278 |
+
if (!current_user_can( 'manage_options' ))
|
279 |
+
return;
|
280 |
+
|
281 |
+
$pluginBaseName = plugin_basename(self::$PLUGIN_MAIN_FILE);
|
282 |
+
$arrBlogActivePlugins = (array) get_option( 'active_plugins', array() );
|
283 |
+
|
284 |
+
$firstActivatedPlugin = reset($arrBlogActivePlugins);
|
285 |
+
if(false === $firstActivatedPlugin || $firstActivatedPlugin === $pluginBaseName)
|
286 |
+
return;
|
287 |
+
|
288 |
+
$gdbcPluginKey = array_search( $pluginBaseName, $arrBlogActivePlugins );
|
289 |
+
if(false === $gdbcPluginKey)
|
290 |
+
return;
|
291 |
+
|
292 |
+
array_splice( $arrBlogActivePlugins, $gdbcPluginKey, 1 );
|
293 |
+
array_unshift( $arrBlogActivePlugins, $pluginBaseName );
|
294 |
+
|
295 |
+
update_option( 'active_plugins', $arrBlogActivePlugins );
|
296 |
+
|
297 |
+
}
|
298 |
+
|
299 |
+
|
300 |
+
public static function onPluginActivate()
|
301 |
+
{}
|
302 |
+
|
303 |
+
private function __clone()
|
304 |
+
{}
|
305 |
+
|
306 |
+
}
|
engine/GoodByeCaptchaPublic.php
ADDED
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GoodByeCaptchaPublic extends MchGdbcBasePublicPlugin
|
21 |
+
{
|
22 |
+
|
23 |
+
private $formHiddenInputName = null;
|
24 |
+
|
25 |
+
protected function __construct(array $arrPluginInfo)
|
26 |
+
{
|
27 |
+
parent::__construct($arrPluginInfo);
|
28 |
+
|
29 |
+
if(!GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS))
|
30 |
+
return ;
|
31 |
+
|
32 |
+
$settingsModuleInstance = GdbcModulesController::getPublicModuleInstance(GdbcModulesController::MODULE_SETTINGS);
|
33 |
+
if(null === $settingsModuleInstance)
|
34 |
+
return;
|
35 |
+
|
36 |
+
$this->formHiddenInputName = $settingsModuleInstance->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
|
37 |
+
|
38 |
+
foreach(array_keys((array)GdbcModulesController::getRegisteredModules()) as $moduleName)
|
39 |
+
{
|
40 |
+
$moduleInstance = GdbcModulesController::getPublicModuleInstance($moduleName);
|
41 |
+
|
42 |
+
if( ! ($moduleInstance instanceof MchGdbcBaseModule) )
|
43 |
+
continue;
|
44 |
+
|
45 |
+
call_user_func(array($moduleInstance, 'registerAttachedHooks'));
|
46 |
+
}
|
47 |
+
|
48 |
+
}
|
49 |
+
|
50 |
+
public function initializePlugin()
|
51 |
+
{
|
52 |
+
parent::initializePlugin();
|
53 |
+
|
54 |
+
}
|
55 |
+
|
56 |
+
|
57 |
+
public function registerAfterSetupThemeHooks()
|
58 |
+
{
|
59 |
+
|
60 |
+
add_action('login_enqueue_scripts', array($this, 'enqueuePublicScriptsAndStyles'));
|
61 |
+
}
|
62 |
+
|
63 |
+
public static function getInstance(array $arrPluginInfo)
|
64 |
+
{
|
65 |
+
static $gdbcPublicInstance = null;
|
66 |
+
return null !== $gdbcPublicInstance ? $gdbcPublicInstance : $gdbcPublicInstance = new self($arrPluginInfo);
|
67 |
+
}
|
68 |
+
|
69 |
+
public function enqueuePublicScriptsAndStyles()
|
70 |
+
{
|
71 |
+
$scriptId = self::$PLUGIN_SLUG . '-public-script';
|
72 |
+
|
73 |
+
wp_register_script($scriptId, plugins_url( '/assets/public/scripts/gdbc-public.js', self::$PLUGIN_MAIN_FILE ), array( 'jquery' ), self::$PLUGIN_VERSION);
|
74 |
+
|
75 |
+
wp_localize_script($scriptId, 'Gdbc', array(
|
76 |
+
'ajaxUrl' => MchGdbcWpUtils::getAjaxUrl(),
|
77 |
+
'clientUrl' => esc_url(home_url('/', MchGdbcWpUtils::isSslRequest() ? 'https' : 'http') . '?gdbc-client=' . self::$PLUGIN_VERSION),
|
78 |
+
'formFieldName' => $this->formHiddenInputName,
|
79 |
+
'shortCode' => self::$PLUGIN_SHORT_CODE,
|
80 |
+
'slug' => self::$PLUGIN_SLUG,
|
81 |
+
));
|
82 |
+
|
83 |
+
wp_enqueue_script($scriptId);
|
84 |
+
|
85 |
+
}
|
86 |
+
|
87 |
+
|
88 |
+
private function __clone()
|
89 |
+
{}
|
90 |
+
|
91 |
+
}
|
engine/GoodByeCaptchaUtils.php
ADDED
@@ -0,0 +1,593 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GoodByeCaptchaUtils
|
21 |
+
{
|
22 |
+
|
23 |
+
public static function isZmAlrActivated()
|
24 |
+
{
|
25 |
+
return defined('ZM_ALR_NAMESPACE');
|
26 |
+
}
|
27 |
+
|
28 |
+
public static function isUserProfileMadeEasyActivated()
|
29 |
+
{
|
30 |
+
return defined('upme_path');
|
31 |
+
}
|
32 |
+
|
33 |
+
public static function isWooCommerceActivated()
|
34 |
+
{
|
35 |
+
return class_exists('WooCommerce');
|
36 |
+
}
|
37 |
+
|
38 |
+
public static function isUltimateMemberActivated()
|
39 |
+
{
|
40 |
+
return class_exists('UM_API');
|
41 |
+
}
|
42 |
+
|
43 |
+
public static function isUjiCountDownActivated()
|
44 |
+
{
|
45 |
+
return class_exists('Uji_Countdown');
|
46 |
+
}
|
47 |
+
|
48 |
+
public static function isMailChimpForWPActivated()
|
49 |
+
{
|
50 |
+
return function_exists('__mc4wp_load_plugin') || function_exists('__mc4wp_premium_load') || function_exists('mc4wp_load_plugin') || function_exists('mc4wp_pro_load_plugin');
|
51 |
+
}
|
52 |
+
|
53 |
+
public static function isNinjaFormsActivated()
|
54 |
+
{
|
55 |
+
return class_exists('Ninja_Forms');
|
56 |
+
}
|
57 |
+
|
58 |
+
public static function isPlanSoFormsActivated()
|
59 |
+
{
|
60 |
+
return function_exists('psfb_register');
|
61 |
+
}
|
62 |
+
|
63 |
+
public static function isSeamlessDonationsActivated()
|
64 |
+
{
|
65 |
+
return function_exists('seamless_donations_init');
|
66 |
+
}
|
67 |
+
|
68 |
+
public static function isGravityFormsActivated()
|
69 |
+
{
|
70 |
+
return class_exists('GFForms');
|
71 |
+
}
|
72 |
+
|
73 |
+
public static function isContactForm7Activated()
|
74 |
+
{
|
75 |
+
return class_exists('WPCF7_ContactForm');
|
76 |
+
}
|
77 |
+
|
78 |
+
public static function isFastSecureFormActivated()
|
79 |
+
{
|
80 |
+
return class_exists('FSCF_Util');
|
81 |
+
}
|
82 |
+
|
83 |
+
public static function isFormidableFormsActivated()
|
84 |
+
{
|
85 |
+
return class_exists('FrmSettings');
|
86 |
+
}
|
87 |
+
|
88 |
+
public static function isUserProPluginActivated()
|
89 |
+
{
|
90 |
+
return class_exists('userpro_api');
|
91 |
+
}
|
92 |
+
|
93 |
+
// public static function setCookie($cookieKey, $cookieValue, $cookieTime, $path = null, $httpOnly = true)
|
94 |
+
// {
|
95 |
+
// if(headers_sent()) return;
|
96 |
+
// return setcookie($cookieKey, $cookieValue, $cookieTime + (isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time()), empty($path) ? COOKIEPATH : $path, COOKIE_DOMAIN, is_ssl(), $httpOnly);
|
97 |
+
// }
|
98 |
+
//
|
99 |
+
// public static function getCookie($cookieKey)
|
100 |
+
// {
|
101 |
+
// return isset($_COOKIE[$cookieKey]) ? $_COOKIE[$cookieKey] : null;
|
102 |
+
// }
|
103 |
+
//
|
104 |
+
// public static function deleteCookie($cookieKey)
|
105 |
+
// {
|
106 |
+
// if(headers_sent()) return;
|
107 |
+
// return setcookie($cookieKey, null, (isset($_SERVER['REQUEST_TIME']) ? $_SERVER['REQUEST_TIME'] : time()) - 3600);
|
108 |
+
// }
|
109 |
+
|
110 |
+
public static function isJetPackContactFormModuleActivated()
|
111 |
+
{
|
112 |
+
return self::isJetPackModuleActivated('contact-form');
|
113 |
+
}
|
114 |
+
|
115 |
+
public static function isJetPackCommentsModuleActivated()
|
116 |
+
{
|
117 |
+
return self::isJetPackModuleActivated('comments');
|
118 |
+
}
|
119 |
+
|
120 |
+
public static function isValidReferer()
|
121 |
+
{
|
122 |
+
static $validReferer = null;
|
123 |
+
if(null !== $validReferer)
|
124 |
+
return $validReferer;
|
125 |
+
|
126 |
+
$referer = wp_get_referer();
|
127 |
+
$actualHost = parse_url(home_url(), PHP_URL_HOST);
|
128 |
+
|
129 |
+
return $validReferer = (!empty($referer) && !empty($actualHost) && false !== stripos($referer, $actualHost));
|
130 |
+
}
|
131 |
+
|
132 |
+
public static function isNginxWebServer()
|
133 |
+
{
|
134 |
+
if(empty($_SERVER['SERVER_SOFTWARE']))
|
135 |
+
return false;
|
136 |
+
|
137 |
+
return (false !== stripos($_SERVER['SERVER_SOFTWARE'], 'nginx')) && (@php_sapi_name() === 'fpm-fcgi');
|
138 |
+
}
|
139 |
+
|
140 |
+
public static function isJetPackPluginActivated()
|
141 |
+
{
|
142 |
+
return class_exists('Jetpack');
|
143 |
+
}
|
144 |
+
|
145 |
+
private static function isJetPackModuleActivated($moduleName)
|
146 |
+
{
|
147 |
+
static $arrActivatedModules = array();
|
148 |
+
if(isset($arrActivatedModules[$moduleName]))
|
149 |
+
return $arrActivatedModules[$moduleName];
|
150 |
+
|
151 |
+
return $arrActivatedModules[$moduleName] = ((null !== ($arrJetPackModules = self::getJetPackActiveModules())) &&
|
152 |
+
in_array(strtolower($moduleName), $arrJetPackModules, true));
|
153 |
+
}
|
154 |
+
|
155 |
+
private static function getJetPackActiveModules()
|
156 |
+
{
|
157 |
+
static $isActivated = null;
|
158 |
+
(null === $isActivated) ? $isActivated = class_exists( 'Jetpack' ) : null;
|
159 |
+
|
160 |
+
if( !$isActivated)
|
161 |
+
return null;
|
162 |
+
|
163 |
+
static $arrJetPackOptions = null;
|
164 |
+
if(null !== $arrJetPackOptions)
|
165 |
+
return $arrJetPackOptions;
|
166 |
+
|
167 |
+
$arrJetPackOptions = get_option('jetpack_active_modules');
|
168 |
+
if(false === $arrJetPackOptions)
|
169 |
+
return null;
|
170 |
+
|
171 |
+
foreach ($arrJetPackOptions as &$moduleName)
|
172 |
+
$moduleName = strtolower(trim($moduleName));
|
173 |
+
|
174 |
+
return $arrJetPackOptions;
|
175 |
+
}
|
176 |
+
|
177 |
+
|
178 |
+
public static function getCountryIdByCode($countryCode)
|
179 |
+
{
|
180 |
+
$countryCode = trim(strtoupper($countryCode));
|
181 |
+
|
182 |
+
foreach (self::getCountryDataSource() as $key => $value)
|
183 |
+
if ($countryCode === $value[1])
|
184 |
+
return $key;
|
185 |
+
|
186 |
+
return 0;
|
187 |
+
}
|
188 |
+
|
189 |
+
public static function getCountryCodeById($countryId)
|
190 |
+
{
|
191 |
+
$arrCountry = self::getCountryDataSource();
|
192 |
+
return isset($arrCountry[$countryId][1]) ? $arrCountry[$countryId][1] : null;
|
193 |
+
}
|
194 |
+
|
195 |
+
public static function getCountryNameById($countryId)
|
196 |
+
{
|
197 |
+
$arrCountry = self::getCountryDataSource();
|
198 |
+
return isset($arrCountry[$countryId][0]) ? $arrCountry[$countryId][0] : null;
|
199 |
+
}
|
200 |
+
|
201 |
+
private static function getCountryDataSource()
|
202 |
+
{
|
203 |
+
return array(
|
204 |
+
1 => array("Afghanistan", "AF"),
|
205 |
+
2 => array("Aland Islands", "AX"),
|
206 |
+
3 => array("Albania", "AL"),
|
207 |
+
4 => array("Algeria", "DZ"),
|
208 |
+
5 => array("American Samoa", "AS"),
|
209 |
+
6 => array("Andorra", "AD"),
|
210 |
+
7 => array("Angola", "AO"),
|
211 |
+
8 => array("Anguilla", "AI"),
|
212 |
+
9 => array("Antarctica", "AQ"),
|
213 |
+
10 => array("Antigua and Barbuda", "AG"),
|
214 |
+
11 => array("Argentina", "AR"),
|
215 |
+
12 => array("Armenia", "AM"),
|
216 |
+
13 => array("Aruba", "AW"),
|
217 |
+
14 => array("Australia", "AU"),
|
218 |
+
15 => array("Austria", "AT"),
|
219 |
+
16 => array("Azerbaijan", "AZ"),
|
220 |
+
17 => array("Bahamas", "BS"),
|
221 |
+
18 => array("Bahrain", "BH"),
|
222 |
+
19 => array("Bangladesh", "BD"),
|
223 |
+
20 => array("Barbados", "BB"),
|
224 |
+
21 => array("Belarus", "BY"),
|
225 |
+
22 => array("Belgium", "BE"),
|
226 |
+
23 => array("Belize", "BZ"),
|
227 |
+
24 => array("Benin", "BJ"),
|
228 |
+
25 => array("Bermuda", "BM"),
|
229 |
+
26 => array("Bhutan", "BT"),
|
230 |
+
27 => array("Bolivia", "BO"),
|
231 |
+
28 => array("Bosnia and Herzegovina", "BA"),
|
232 |
+
29 => array("Botswana", "BW"),
|
233 |
+
30 => array("Bouvet island", "BV"),
|
234 |
+
31 => array("Brazil", "BR"),
|
235 |
+
32 => array("British Indian Ocean", "IO"),
|
236 |
+
33 => array("Brunei Darussalam", "BN"),
|
237 |
+
34 => array("Bulgaria", "BG"),
|
238 |
+
35 => array("Burkina Faso", "BF"),
|
239 |
+
36 => array("Burundi", "BI"),
|
240 |
+
37 => array("Cambodia", "KH"),
|
241 |
+
38 => array("Cameroon", "CM"),
|
242 |
+
39 => array("Canada", "CA"),
|
243 |
+
40 => array("Cape Verde", "CV"),
|
244 |
+
41 => array("Cayman Islands", "KY"),
|
245 |
+
42 => array("Central African Republic", "CF"),
|
246 |
+
43 => array("Chad", "TD"),
|
247 |
+
44 => array("Chile", "CL"),
|
248 |
+
45 => array("China", "CN"),
|
249 |
+
46 => array("Christmas Island", "CX"),
|
250 |
+
47 => array("Cocos Islands", "CC"),
|
251 |
+
48 => array("Colombia", "CO"),
|
252 |
+
49 => array("Comoros", "KM"),
|
253 |
+
50 => array("Congo", "CG"),
|
254 |
+
51 => array("Congo", "CD"),
|
255 |
+
52 => array("Cook Islands", "CK"),
|
256 |
+
53 => array("Costa Rica", "CR"),
|
257 |
+
54 => array("Cote d'Ivoire", "CI"),
|
258 |
+
55 => array("Croatia", "HR"),
|
259 |
+
56 => array("Cuba", "CU"),
|
260 |
+
57 => array("Cyprus", "CY"),
|
261 |
+
58 => array("Czech Republic", "CZ"),
|
262 |
+
59 => array("Denmark", "DK"),
|
263 |
+
60 => array("Djibouti", "DJ"),
|
264 |
+
61 => array("Dominica", "DM"),
|
265 |
+
62 => array("Dominican republic", "DO"),
|
266 |
+
63 => array("Ecuador", "EC"),
|
267 |
+
64 => array("Egypt", "EG"),
|
268 |
+
65 => array("El Salvador", "SV"),
|
269 |
+
66 => array("Equatorial Guinea", "GQ"),
|
270 |
+
67 => array("Eritrea", "ER"),
|
271 |
+
68 => array("Estonia", "EE"),
|
272 |
+
69 => array("Ethiopia", "ET"),
|
273 |
+
70 => array("Falkland Islands", "FK"),
|
274 |
+
71 => array("Faroe Islands", "FO"),
|
275 |
+
72 => array("Fiji", "FJ"),
|
276 |
+
73 => array("Finland", "FI"),
|
277 |
+
74 => array("France", "FR"),
|
278 |
+
75 => array("French Guiana", "GF"),
|
279 |
+
76 => array("French Polynesia", "PF"),
|
280 |
+
77 => array("French Southern Territories", "TF"),
|
281 |
+
78 => array("Gabon", "GA"),
|
282 |
+
79 => array("Gambia", "GM"),
|
283 |
+
80 => array("Georgia", "GE"),
|
284 |
+
81 => array("Germany", "DE"),
|
285 |
+
82 => array("Ghana", "GH"),
|
286 |
+
83 => array("Gibraltar", "GI"),
|
287 |
+
84 => array("Greece", "GR"),
|
288 |
+
85 => array("Greenland", "Gl"),
|
289 |
+
86 => array("Grenada", "GD"),
|
290 |
+
87 => array("Guadeloupe", "GP"),
|
291 |
+
88 => array("Guam", "GU"),
|
292 |
+
89 => array("Guatemala", "GT"),
|
293 |
+
90 => array("Guernsey", "GG"),
|
294 |
+
91 => array("Guinea", "GN"),
|
295 |
+
92 => array("Guinea-Bissau", "GW"),
|
296 |
+
93 => array("Guyana", "GY"),
|
297 |
+
94 => array("Haiti", "HT"),
|
298 |
+
95 => array("Heard and Mcdonald Islands", "HM"),
|
299 |
+
96 => array("Vatican", "VA"),
|
300 |
+
97 => array("Honduras", "HN"),
|
301 |
+
98 => array("Hong Kong", "HK"),
|
302 |
+
99 => array("Hungary", "HU"),
|
303 |
+
100 => array("Iceland", "IS"),
|
304 |
+
101 => array("India", "IN"),
|
305 |
+
102 => array("Indonesia", "ID"),
|
306 |
+
103 => array("Iran", "IR"),
|
307 |
+
104 => array("Iraq", "IQ"),
|
308 |
+
105 => array("Ireland", "IE"),
|
309 |
+
106 => array("Isle of Man", "IM"),
|
310 |
+
107 => array("Israel", "IL"),
|
311 |
+
108 => array("Italy", "IT"),
|
312 |
+
109 => array("Jamaica", "JM"),
|
313 |
+
110 => array("Japan", "JP"),
|
314 |
+
111 => array("Jersey", "JE"),
|
315 |
+
112 => array("Jordan", "JO"),
|
316 |
+
113 => array("Kazakhstan", "KZ"),
|
317 |
+
114 => array("Kenya", "KE"),
|
318 |
+
115 => array("Kiribati", "KI"),
|
319 |
+
116 => array("Korea", "KP"),
|
320 |
+
117 => array("Korea", "KR"),
|
321 |
+
118 => array("Kuwait", "KW"),
|
322 |
+
119 => array("Kyrgyzstan", "KG"),
|
323 |
+
120 => array("Lao Republic", "LA"),
|
324 |
+
121 => array("Latvia", "LV"),
|
325 |
+
122 => array("Lebanon", "LB"),
|
326 |
+
123 => array("Lesotho", "LS"),
|
327 |
+
124 => array("Liberia", "LR"),
|
328 |
+
125 => array("Libyan Arab Jamahiriya", "LY"),
|
329 |
+
126 => array("Liechtenstein", "LI"),
|
330 |
+
127 => array("Lithuania", "LT"),
|
331 |
+
128 => array("Luxembourg", "LU"),
|
332 |
+
129 => array("Macao", "MO"),
|
333 |
+
130 => array("Macedonia", "MK"),
|
334 |
+
131 => array("Madagascar", "MG"),
|
335 |
+
132 => array("Malawi", "MW"),
|
336 |
+
133 => array("Malaysia", "MY"),
|
337 |
+
134 => array("Maldives", "MV"),
|
338 |
+
135 => array("Mali", "Ml"),
|
339 |
+
136 => array("Malta", "MT"),
|
340 |
+
137 => array("Marshall Islands", "MH"),
|
341 |
+
138 => array("Martinique", "MQ"),
|
342 |
+
139 => array("Mauritania", "MR"),
|
343 |
+
140 => array("Mauritius", "MU"),
|
344 |
+
141 => array("Mayotte", "YT"),
|
345 |
+
142 => array("Mexico", "MX"),
|
346 |
+
143 => array("Micronesia", "FM"),
|
347 |
+
144 => array("Moldova", "MD"),
|
348 |
+
145 => array("Monaco", "MC"),
|
349 |
+
146 => array("Mongolia", "MN"),
|
350 |
+
147 => array("Montenegro", "ME"),
|
351 |
+
148 => array("Montserrat", "MS"),
|
352 |
+
149 => array("Morocco", "MA"),
|
353 |
+
150 => array("Mozambique", "MZ"),
|
354 |
+
151 => array("Myanmar", "MM"),
|
355 |
+
152 => array("Namibia", "NA"),
|
356 |
+
153 => array("Nauru", "NR"),
|
357 |
+
154 => array("Nepal", "NP"),
|
358 |
+
155 => array("Netherlands", "NL"),
|
359 |
+
156 => array("Netherlands Antilles", "AN"),
|
360 |
+
157 => array("New Caledonia", "NC"),
|
361 |
+
158 => array("New Zealand", "NZ"),
|
362 |
+
159 => array("Nicaragua", "NI"),
|
363 |
+
160 => array("Niger", "NE"),
|
364 |
+
161 => array("Nigeria", "NG"),
|
365 |
+
162 => array("Niue", "NU"),
|
366 |
+
163 => array("Norfolk Island", "NF"),
|
367 |
+
164 => array("Northern Mariana Islands", "MP"),
|
368 |
+
165 => array("Norway", "NO"),
|
369 |
+
166 => array("Oman", "OM"),
|
370 |
+
167 => array("Pakistan", "PK"),
|
371 |
+
168 => array("Palau", "PW"),
|
372 |
+
169 => array("Palestinian Territory Occupied", "PS"),
|
373 |
+
170 => array("Panama", "PA"),
|
374 |
+
171 => array("Papua New Guinea", "PG"),
|
375 |
+
172 => array("Paraguay", "PY"),
|
376 |
+
173 => array("Peru", "PE"),
|
377 |
+
174 => array("Philippines", "PH"),
|
378 |
+
175 => array("Pitcairn", "PN"),
|
379 |
+
176 => array("Poland", "PL"),
|
380 |
+
177 => array("Portugal", "PT"),
|
381 |
+
178 => array("Puerto rico", "PR"),
|
382 |
+
179 => array("Qatar", "QA"),
|
383 |
+
180 => array("Reunion", "RE"),
|
384 |
+
181 => array("Romania", "RO"),
|
385 |
+
182 => array("Russian Federation", "RU"),
|
386 |
+
183 => array("Rwanda", "RW"),
|
387 |
+
184 => array("Saint Barthelemy", "BL"),
|
388 |
+
185 => array("Saint Helena", "SH"),
|
389 |
+
186 => array("Saint Kitts and Nevis", "KN"),
|
390 |
+
187 => array("Saint Lucia", "LC"),
|
391 |
+
188 => array("Saint Martin", "MF"),
|
392 |
+
189 => array("Saint Pierre and Miquelon", "PM"),
|
393 |
+
190 => array("Saint Vincent", "VC"),
|
394 |
+
191 => array("Samoa", "WS"),
|
395 |
+
192 => array("San Marino", "SM"),
|
396 |
+
193 => array("Sao Tome and Principe", "ST"),
|
397 |
+
194 => array("Saudi Arabia", "SA"),
|
398 |
+
195 => array("Senegal", "SN"),
|
399 |
+
196 => array("Serbia", "RS"),
|
400 |
+
197 => array("Seychelles", "SC"),
|
401 |
+
198 => array("Sierra Leone", "SL"),
|
402 |
+
199 => array("Singapore", "SG"),
|
403 |
+
200 => array("Slovakia", "SK"),
|
404 |
+
201 => array("Slovenia", "SI"),
|
405 |
+
202 => array("Solomon Islands", "SB"),
|
406 |
+
203 => array("Somalia", "SO"),
|
407 |
+
204 => array("South Africa", "ZA"),
|
408 |
+
205 => array("South Georgia and Islands", "GS"),
|
409 |
+
206 => array("Spain", "ES"),
|
410 |
+
207 => array("Sri Lanka", "LK"),
|
411 |
+
208 => array("Sudan", "SD"),
|
412 |
+
209 => array("Suriname", "SR"),
|
413 |
+
210 => array("Svalbard and Jan Mayen", "SJ"),
|
414 |
+
211 => array("Swaziland", "SZ"),
|
415 |
+
212 => array("Sweden", "SE"),
|
416 |
+
213 => array("Switzerland", "CH"),
|
417 |
+
214 => array("Syrian Arab Republic", "SY"),
|
418 |
+
215 => array("Taiwan", "TW"),
|
419 |
+
216 => array("Tajikistan", "TJ"),
|
420 |
+
217 => array("Tanzania", "TZ"),
|
421 |
+
218 => array("Thailand", "TH"),
|
422 |
+
219 => array("Timor-Leste", "TL"),
|
423 |
+
220 => array("Togo", "TG"),
|
424 |
+
221 => array("Tokelau", "TK"),
|
425 |
+
222 => array("Tonga", "TO"),
|
426 |
+
223 => array("Trinidad and Tobago", "TT"),
|
427 |
+
224 => array("Tunisia", "TN"),
|
428 |
+
225 => array("Turkey", "TR"),
|
429 |
+
226 => array("Turkmenistan", "TM"),
|
430 |
+
227 => array("Turks and Caicos Islands", "TC"),
|
431 |
+
228 => array("Tuvalu", "TV"),
|
432 |
+
229 => array("Uganda", "UG"),
|
433 |
+
230 => array("Ukraine", "UA"),
|
434 |
+
231 => array("United Arab Emirates", "AE"),
|
435 |
+
232 => array("United Kingdom", "GB"),
|
436 |
+
233 => array("United States", "US"),
|
437 |
+
234 => array("United States Minor Islands", "UM"),
|
438 |
+
235 => array("Uruguay", "UY"),
|
439 |
+
236 => array("Uzbekistan", "UZ"),
|
440 |
+
237 => array("Vanuatu", "VU"),
|
441 |
+
238 => array("Venezuela", "VE"),
|
442 |
+
239 => array("Vietnam", "VN"),
|
443 |
+
240 => array("Virgin Islands British", "VG"),
|
444 |
+
241 => array("Virgin Islands U.S.", "VI"),
|
445 |
+
242 => array("Wallis and Futuna", "WF"),
|
446 |
+
243 => array("Western Sahara", "EH"),
|
447 |
+
244 => array("Yemen", "YE"),
|
448 |
+
245 => array("Zambia", "ZM"),
|
449 |
+
246 => array("Zimbabwe", "ZW")
|
450 |
+
);
|
451 |
+
}
|
452 |
+
|
453 |
+
public static function isLoginAttemptEntity(GdbcAttemptEntity $attemptEntity)
|
454 |
+
{
|
455 |
+
foreach(self::getAllPossibleLoginAttemptEntities() as $loginAttemptEntity)
|
456 |
+
{
|
457 |
+
if( ($loginAttemptEntity->ModuleId == $attemptEntity->ModuleId) && ($loginAttemptEntity->SectionId == $attemptEntity->SectionId) )
|
458 |
+
return true;
|
459 |
+
}
|
460 |
+
|
461 |
+
return false;
|
462 |
+
}
|
463 |
+
|
464 |
+
public static function getAllPossibleLoginAttemptEntities()
|
465 |
+
{
|
466 |
+
static $loginEntitiesList = null;
|
467 |
+
if(null !== $loginEntitiesList)
|
468 |
+
return $loginEntitiesList;
|
469 |
+
|
470 |
+
$loginEntitiesList = array();
|
471 |
+
|
472 |
+
foreach(GdbcModulesController::getRegisteredModules() as $moduleName => $arrModuleClasses)
|
473 |
+
{
|
474 |
+
switch($moduleName)
|
475 |
+
{
|
476 |
+
case GdbcModulesController::MODULE_WORDPRESS :
|
477 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcWordPressAdminModule::WORDPRESS_LOGIN_FORM);
|
478 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcWordPressAdminModule::WORDPRESS_LOGIN_XML_RPC);
|
479 |
+
break;
|
480 |
+
|
481 |
+
case GdbcModulesController::MODULE_ULTIMATE_MEMBER :
|
482 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcUltimateMemberAdminModule::OPTION_ULTIMATE_MEMBER_LOGIN_FORM);
|
483 |
+
break;
|
484 |
+
|
485 |
+
case GdbcModulesController::MODULE_WOOCOMMERCE :
|
486 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcWooCommerceAdminModule::WOOCOMMERCE_LOGIN_FORM);
|
487 |
+
break;
|
488 |
+
|
489 |
+
case GdbcModulesController::MODULE_USER_PRO :
|
490 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcUserProAdminModule::OPTION_LOGIN_FORM_PROTECTION_ACTIVATED);
|
491 |
+
break;
|
492 |
+
|
493 |
+
case GdbcModulesController::MODULE_UPME :
|
494 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcUPMEAdminModule::UPME_LOGIN_FORM);
|
495 |
+
break;
|
496 |
+
|
497 |
+
case GdbcModulesController::MODULE_ZM_ALR :
|
498 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcZmAlrAdminModule::OPTION_ZM_ALR_LOGIN_FORM);
|
499 |
+
break;
|
500 |
+
|
501 |
+
case GdbcModulesController::MODULE_PLANSO_FORMS :
|
502 |
+
$loginEntitiesList[] = new GdbcAttemptEntity(GdbcModulesController::getModuleIdByName($moduleName), GdbcPlanSoFormsAdminModule::OPTION_PLANSO_LOGIN_FORM);
|
503 |
+
break;
|
504 |
+
|
505 |
+
|
506 |
+
}
|
507 |
+
}
|
508 |
+
|
509 |
+
|
510 |
+
foreach($loginEntitiesList as $index => &$attemptEntity)
|
511 |
+
{
|
512 |
+
$attemptEntity->SectionId = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::getModuleNameById($attemptEntity->ModuleId))->getOptionIdByOptionName($attemptEntity->SectionId);
|
513 |
+
unset($attemptEntity->Id, $attemptEntity->ClientIp, $attemptEntity->CreatedDate, $attemptEntity->Notes, $attemptEntity->ReasonId, $attemptEntity->SiteId);
|
514 |
+
}
|
515 |
+
|
516 |
+
return $loginEntitiesList;
|
517 |
+
}
|
518 |
+
|
519 |
+
|
520 |
+
|
521 |
+
|
522 |
+
public static function flushSiteCache($siteId = 0)
|
523 |
+
{
|
524 |
+
$siteId = absint($siteId);
|
525 |
+
if($siteId === 0)
|
526 |
+
$siteId = get_current_blog_id();
|
527 |
+
|
528 |
+
// $blogDetails = get_blog_details($siteId, false);
|
529 |
+
// if(empty($blogDetails))
|
530 |
+
// return;
|
531 |
+
|
532 |
+
unset($blogDetails);
|
533 |
+
|
534 |
+
$shouldSwitchSite = ($siteId !== get_current_blog_id());
|
535 |
+
|
536 |
+
($shouldSwitchSite) ? switch_to_blog( $siteId) : null;
|
537 |
+
|
538 |
+
if(function_exists('w3tc_flush_all')) { // w3tc
|
539 |
+
w3tc_flush_all();
|
540 |
+
}
|
541 |
+
elseif(function_exists('wp_cache_clear_cache')){ // wp super cache
|
542 |
+
wp_cache_clear_cache();
|
543 |
+
}
|
544 |
+
elseif(isset($GLOBALS['wp_fastest_cache']) && method_exists($GLOBALS['wp_fastest_cache'], 'deleteCache')){ // wp fastest cache
|
545 |
+
$GLOBALS['wp_fastest_cache']->deleteCache();
|
546 |
+
}
|
547 |
+
elseif(class_exists('zencache') && method_exists('zencache', 'clear')){ // zencache
|
548 |
+
zencache::clear();
|
549 |
+
}
|
550 |
+
// elseif{
|
551 |
+
// /*
|
552 |
+
// * @TODO - Support for Wp Rocket
|
553 |
+
// */
|
554 |
+
//
|
555 |
+
// }
|
556 |
+
|
557 |
+
|
558 |
+
($shouldSwitchSite) ? restore_current_blog() : null;
|
559 |
+
}
|
560 |
+
|
561 |
+
|
562 |
+
/*
|
563 |
+
* return /MchGdbcCache
|
564 |
+
*/
|
565 |
+
public static function getAvailableCacheStorage($dirPathForFileStorage)
|
566 |
+
{
|
567 |
+
static $cacheStorage = false;
|
568 |
+
if(false !== $cacheStorage)
|
569 |
+
return $cacheStorage;
|
570 |
+
|
571 |
+
$arrPossibleCacheStorage = array(
|
572 |
+
!empty($dirPathForFileStorage) ? new MchGdbcCacheFileStorage($dirPathForFileStorage, true, 'txt') : null,
|
573 |
+
new MchGdbcWordPressTransientsStorage(false),
|
574 |
+
new MchGdbcCacheAPCUStorage(),
|
575 |
+
new MchGdbcCacheAPCStorage(),
|
576 |
+
new MchGdbcCacheXCacheStorage(),
|
577 |
+
new MchGdbcCacheZendMemoryStorage(),
|
578 |
+
new MchGdbcCacheZendDiskStorage(),
|
579 |
+
new MchGdbcWordPressTransientsStorage(true),
|
580 |
+
);
|
581 |
+
|
582 |
+
foreach ($arrPossibleCacheStorage as $cacheStorageObject) {
|
583 |
+
if (null === $cacheStorageObject || !$cacheStorageObject->isAvailable())
|
584 |
+
continue;
|
585 |
+
|
586 |
+
return $cacheStorage = new MchGdbcCache($cacheStorageObject);
|
587 |
+
}
|
588 |
+
|
589 |
+
return $cacheStorage = null;
|
590 |
+
}
|
591 |
+
|
592 |
+
|
593 |
+
}
|
engine/admin/GdbcAdminNotice.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Copyright (C) 2015 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
final class GdbcAdminNotice extends MchGdbcAdminNotice
|
22 |
+
{
|
23 |
+
CONST USER_IP_WEB_ATTACKER_NOTICE_KEY = 'UserIpWebAttacker';
|
24 |
+
CONST USER_IP_PROXY_ANONYM_NOTICE_KEY = 'UserIpProxyAnonym';
|
25 |
+
|
26 |
+
public function __construct($noticeKey, $noticeType, $noticeMessage = null)
|
27 |
+
{
|
28 |
+
parent::__construct( $noticeKey, $noticeType, $noticeMessage );
|
29 |
+
}
|
30 |
+
|
31 |
+
|
32 |
+
|
33 |
+
|
34 |
+
}
|
engine/admin/pages/GdbcBaseAdminPage.php
ADDED
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
abstract class GdbcBaseAdminPage extends MchGdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
private static $arrPageInstances = array();
|
23 |
+
|
24 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
25 |
+
{
|
26 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
27 |
+
$this->setPageLayoutColumns(2);
|
28 |
+
self::$arrPageInstances[get_class($this)] = $this;
|
29 |
+
}
|
30 |
+
|
31 |
+
public function registerPageMetaBoxes()
|
32 |
+
{
|
33 |
+
|
34 |
+
parent::registerPageMetaBoxes();
|
35 |
+
|
36 |
+
if($this->getPageLayoutColumns() <= 1)
|
37 |
+
return;
|
38 |
+
|
39 |
+
add_meta_box(
|
40 |
+
"gdbc-help-metabox",
|
41 |
+
__('Need help? Have questions...?', GoodByeCaptcha::PLUGIN_SLUG),
|
42 |
+
array( $this, 'renderNeedHelpMetaBox' ),
|
43 |
+
$this->getAdminScreenId(),
|
44 |
+
'side',
|
45 |
+
'core',
|
46 |
+
null
|
47 |
+
);
|
48 |
+
|
49 |
+
add_meta_box(
|
50 |
+
"gdbc-help-metabox-test",
|
51 |
+
__('How to verify if it works?', GoodByeCaptcha::PLUGIN_SLUG),
|
52 |
+
array( $this, 'renderHowToTestMetaBox' ),
|
53 |
+
$this->getAdminScreenId(),
|
54 |
+
'side',
|
55 |
+
'low',
|
56 |
+
null
|
57 |
+
);
|
58 |
+
|
59 |
+
}
|
60 |
+
|
61 |
+
|
62 |
+
public function renderNeedHelpMetaBox()
|
63 |
+
{
|
64 |
+
$img = plugins_url('/assets/admin/images/gdbc-logo.png', GoodByeCaptcha::PLUGIN_MAIN_FILE);
|
65 |
+
|
66 |
+
$display_div = '<img class="logo-help" src="' . esc_attr($img) . '" />';
|
67 |
+
|
68 |
+
$display_div .= '<p class="contact-help"> <a class = "button-primary" href="' . GoodByeCaptcha::PLUGIN_SITE_URL . '/contact" target="_blank">Contact Us</a></p>';
|
69 |
+
|
70 |
+
echo $display_div;
|
71 |
+
}
|
72 |
+
|
73 |
+
public function renderHowToTestMetaBox()
|
74 |
+
{
|
75 |
+
$settingsPageUrl = isset(self::$arrPageInstances['GdbcSettingsAdminPage']) ? self::$arrPageInstances['GdbcSettingsAdminPage']->getAdminUrl() : '';
|
76 |
+
$notificationsPageUrl = isset(self::$arrPageInstances['GdbcNotificationsAdminPage']) ? self::$arrPageInstances['GdbcNotificationsAdminPage']->getAdminUrl() : '';
|
77 |
+
|
78 |
+
$textInfo = __('In order to verify if GoodBye Captcha works as expected, just go to, ', GoodByeCaptcha::PLUGIN_SLUG);
|
79 |
+
$textInfo .= MchGdbcHtmlUtils::createAnchorElement(__('Settings Page', GoodByeCaptcha::PLUGIN_SLUG), array('href' => $settingsPageUrl));
|
80 |
+
$textInfo .= __(' and <b>Switch the plugin to Test Mode</b>. <br/>While in test mode, the plugin just verifies if it can properly protect the enabled options and sends email notifications to the email address you set in ', GoodByeCaptcha::PLUGIN_SLUG);
|
81 |
+
$textInfo .= MchGdbcHtmlUtils::createAnchorElement(__('Notifications Page', GoodByeCaptcha::PLUGIN_SLUG), array('href' => $notificationsPageUrl));
|
82 |
+
|
83 |
+
$textInfo .= __(' For example, if you want to test the login form protection, just enable protection for the WordPress Login Form, logout from your dashboard and login again. The plugin will send an email notification letting you know if you can keep the protection activated.', GoodByeCaptcha::PLUGIN_SLUG);
|
84 |
+
|
85 |
+
$textInfo .= __(' In case something goes wrong, a warning message will be shown.', GoodByeCaptcha::PLUGIN_SLUG);
|
86 |
+
|
87 |
+
echo '<p style="text-align: justify">' . $textInfo . "</p>";
|
88 |
+
|
89 |
+
$textInfo = '<div class = "mch-meta-notice-warning">';
|
90 |
+
$textInfo .= __('<b>Turn off Test Mode as soon as you\'re done with testing!</b>', GoodByeCaptcha::PLUGIN_SLUG);
|
91 |
+
$textInfo .= '</div>';
|
92 |
+
|
93 |
+
echo $textInfo;
|
94 |
+
|
95 |
+
}
|
96 |
+
|
97 |
+
|
98 |
+
}
|
engine/admin/pages/GdbcContactFormsAdminPage.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcContactFormsAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
23 |
+
{
|
24 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
25 |
+
|
26 |
+
$modulesList = array();
|
27 |
+
|
28 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_JETPACK_CONTACT_FORM))
|
29 |
+
$modulesList[] = GdbcJetPackContactFormAdminModule::getInstance();
|
30 |
+
|
31 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_CONTACT_FORM_7))
|
32 |
+
$modulesList[] = GdbcContactForm7AdminModule::getInstance();
|
33 |
+
|
34 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_FAST_SECURE_FORM))
|
35 |
+
$modulesList[] = GdbcFastSecureFormAdminModule::getInstance();
|
36 |
+
|
37 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_FORMIDABLE_FORMS))
|
38 |
+
$modulesList[] = GdbcFormidableFormsAdminModule::getInstance();
|
39 |
+
|
40 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_GRAVITY_FORMS))
|
41 |
+
$modulesList[] = GdbcGravityFormsAdminModule::getInstance();
|
42 |
+
|
43 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_NINJA_FORMS))
|
44 |
+
$modulesList[] = GdbcNinjaFormsAdminModule::getInstance();
|
45 |
+
|
46 |
+
$this->registerGroupedModules(array(
|
47 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - Popular Contact Forms Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
|
48 |
+
)
|
49 |
+
);
|
50 |
+
|
51 |
+
}
|
52 |
+
|
53 |
+
|
54 |
+
|
55 |
+
}
|
engine/admin/pages/GdbcMembershipAdminPage.php
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcMembershipAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
23 |
+
{
|
24 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
25 |
+
|
26 |
+
$arrModules = array();
|
27 |
+
|
28 |
+
|
29 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ULTIMATE_MEMBER))
|
30 |
+
$arrModules[] = GdbcUltimateMemberAdminModule::getInstance();
|
31 |
+
|
32 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BUDDY_PRESS))
|
33 |
+
$arrModules[] = GdbcBuddyPressAdminModule::getInstance();
|
34 |
+
|
35 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BB_PRESS))
|
36 |
+
$arrModules[] = GdbcBbPressAdminModule::getInstance();
|
37 |
+
|
38 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_USER_PRO))
|
39 |
+
$arrModules[] = GdbcUserProAdminModule::getInstance();
|
40 |
+
|
41 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_UPME))
|
42 |
+
$arrModules[] = GdbcUPMEAdminModule::getInstance();
|
43 |
+
|
44 |
+
|
45 |
+
$this->registerGroupedModules(array(
|
46 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - Membership Plugins Settings', GoodByeCaptcha::PLUGIN_SLUG), $arrModules)
|
47 |
+
)
|
48 |
+
);
|
49 |
+
|
50 |
+
}
|
51 |
+
|
52 |
+
}
|
engine/admin/pages/GdbcNotificationsAdminPage.php
ADDED
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Copyright (C) 2015 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
class GdbcNotificationsAdminPage extends GdbcBaseAdminPage
|
22 |
+
{
|
23 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
24 |
+
{
|
25 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
26 |
+
|
27 |
+
$modulesList = array();
|
28 |
+
|
29 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_EMAIL_NOTIFICATIONS))
|
30 |
+
$modulesList[] = GdbcEmailNotificationsAdminModule::getInstance();
|
31 |
+
|
32 |
+
$this->registerGroupedModules(array(
|
33 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - Notifications Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
|
34 |
+
)
|
35 |
+
);
|
36 |
+
|
37 |
+
}
|
38 |
+
|
39 |
+
|
40 |
+
|
41 |
+
}
|
engine/admin/pages/GdbcOthersAdminPage.php
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcOthersAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
23 |
+
{
|
24 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
25 |
+
|
26 |
+
$modulesList = array();
|
27 |
+
|
28 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_MAIL_CHIMP_FOR_WP))
|
29 |
+
$modulesList[] = GdbcMailChimpForWpAdminModule::getInstance();
|
30 |
+
|
31 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_MAIL_POET))
|
32 |
+
$modulesList[] = GdbcMailPoetAdminModule::getInstance();
|
33 |
+
|
34 |
+
|
35 |
+
$this->registerGroupedModules(array(
|
36 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - Subscriptions Plugins Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
|
37 |
+
)
|
38 |
+
);
|
39 |
+
|
40 |
+
|
41 |
+
$modulesList = array();
|
42 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_WOOCOMMERCE))
|
43 |
+
$modulesList[] = GdbcWooCommerceAdminModule::getInstance();
|
44 |
+
|
45 |
+
$this->registerGroupedModules(array(
|
46 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - eCommerce Plugins Settings', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
|
47 |
+
)
|
48 |
+
);
|
49 |
+
|
50 |
+
|
51 |
+
$modulesList = array();
|
52 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_ZM_ALR))
|
53 |
+
$modulesList[] = GdbcZmAlrAdminModule::getInstance();
|
54 |
+
|
55 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_PLANSO_FORMS))
|
56 |
+
$modulesList[] = GdbcPlanSoFormsAdminModule::getInstance();
|
57 |
+
|
58 |
+
|
59 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SEAMLESS_DONATIONS))
|
60 |
+
$modulesList[] = GdbcSeamlessDonationsAdminModule::getInstance();
|
61 |
+
|
62 |
+
$this->registerGroupedModules(array(
|
63 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - Other Popular Plugins', GoodByeCaptcha::PLUGIN_SLUG), $modulesList)
|
64 |
+
)
|
65 |
+
);
|
66 |
+
|
67 |
+
|
68 |
+
|
69 |
+
}
|
70 |
+
|
71 |
+
}
|
engine/admin/pages/GdbcReportsAdminPage.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcReportsAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
23 |
+
{
|
24 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
25 |
+
|
26 |
+
$this->setPageLayoutColumns(1);
|
27 |
+
|
28 |
+
if(!GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_REPORTS))
|
29 |
+
return;
|
30 |
+
|
31 |
+
$this->registerGroupedModules(array(
|
32 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha - Blocked Attempts', GoodByeCaptcha::PLUGIN_SLUG), array(GdbcReportsAdminModule::getInstance()))
|
33 |
+
)
|
34 |
+
);
|
35 |
+
|
36 |
+
|
37 |
+
}
|
38 |
+
|
39 |
+
|
40 |
+
public function renderPageContent()
|
41 |
+
{
|
42 |
+
$arrReportsNavigationTabUrl = array();
|
43 |
+
|
44 |
+
$arrQueryString = array(
|
45 |
+
'page' => $this->getPageMenuSlug()
|
46 |
+
);
|
47 |
+
|
48 |
+
$pageAdminUrl = GoodByeCaptcha::isNetworkActivated() ? network_admin_url('admin.php') : admin_url('admin.php');
|
49 |
+
$arrReportsNavigationTabUrl[] = esc_url(add_query_arg($arrQueryString, $pageAdminUrl));
|
50 |
+
$arrQueryString['gdbc-detailed-report'] = 1;
|
51 |
+
$arrReportsNavigationTabUrl[] = esc_url(add_query_arg($arrQueryString, $pageAdminUrl));
|
52 |
+
|
53 |
+
echo '<div id = "gdbc-reports-holder" class = "clearfix">';
|
54 |
+
echo '<h3>' . __('GoodBye Captcha - Blocked Attempts', GoodByeCaptcha::PLUGIN_SLUG) . '</h3>';
|
55 |
+
|
56 |
+
GdbcReportsAdminModule::getInstance()->renderReportsMainPageContent($arrReportsNavigationTabUrl);
|
57 |
+
|
58 |
+
echo '</div>';
|
59 |
+
}
|
60 |
+
|
61 |
+
|
62 |
+
|
63 |
+
|
64 |
+
}
|
engine/admin/pages/GdbcSecurityAdminPage.php
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcSecurityAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
private $blackListedIpsGroupIndex = null;
|
23 |
+
private $whiteListedIpsGroupIndex = null;
|
24 |
+
|
25 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
26 |
+
{
|
27 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
28 |
+
|
29 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BRUTE_FORCE))
|
30 |
+
{
|
31 |
+
$this->registerGroupedModules(array(
|
32 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha Brute Force Settings', GoodByeCaptcha::PLUGIN_SLUG), array(
|
33 |
+
GdbcBruteForceAdminModule::getInstance())
|
34 |
+
)
|
35 |
+
));
|
36 |
+
}
|
37 |
+
|
38 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_WHITE_LISTED_IPS))
|
39 |
+
{
|
40 |
+
$this->whiteListedIpsGroupIndex = $this->registerGroupedModules(array(
|
41 |
+
new MchGdbcGroupedModules(__('White Listed IPs', GoodByeCaptcha::PLUGIN_SLUG), array(
|
42 |
+
GdbcWhiteListedIpsAdminModule::getInstance())
|
43 |
+
)
|
44 |
+
));
|
45 |
+
}
|
46 |
+
|
47 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_BLACK_LISTED_IPS))
|
48 |
+
{
|
49 |
+
$this->blackListedIpsGroupIndex = $this->registerGroupedModules(array(
|
50 |
+
new MchGdbcGroupedModules(__('Black Listed IPs', GoodByeCaptcha::PLUGIN_SLUG), array(
|
51 |
+
GdbcBlackListedIpsAdminModule::getInstance())
|
52 |
+
)
|
53 |
+
));
|
54 |
+
}
|
55 |
+
|
56 |
+
}
|
57 |
+
|
58 |
+
private function getBlackListedIpsInputName()
|
59 |
+
{
|
60 |
+
return esc_attr(GdbcBlackListedIpsAdminModule::getInstance()->getSettingKey() . '[' . GdbcBlackListedIpsAdminModule::OPTION_BLACK_LISTED_IPS . ']');
|
61 |
+
}
|
62 |
+
private function getWhiteListedIpsInputName()
|
63 |
+
{
|
64 |
+
return esc_attr(GdbcWhiteListedIpsAdminModule::getInstance()->getSettingKey() . '[' . GdbcWhiteListedIpsAdminModule::OPTION_WHITE_LISTED_IPS . ']');
|
65 |
+
}
|
66 |
+
|
67 |
+
public function renderGroupModulesSettings($groupIndex = null)
|
68 |
+
{
|
69 |
+
|
70 |
+
if(!is_numeric($groupIndex))
|
71 |
+
{
|
72 |
+
foreach ( func_get_args() as $receivedArgument )
|
73 |
+
{
|
74 |
+
if ( ! isset( $receivedArgument['args'] ) || !is_numeric($receivedArgument['args']))
|
75 |
+
continue;
|
76 |
+
|
77 |
+
$groupIndex = $receivedArgument['args'];
|
78 |
+
break;
|
79 |
+
}
|
80 |
+
}
|
81 |
+
|
82 |
+
$this->displayGroupModulesMessages($groupIndex);
|
83 |
+
|
84 |
+
if($this->whiteListedIpsGroupIndex == $groupIndex)
|
85 |
+
{
|
86 |
+
if(null !== GdbcWhiteListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath())
|
87 |
+
{
|
88 |
+
include_once GdbcWhiteListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath();
|
89 |
+
}
|
90 |
+
|
91 |
+
return;
|
92 |
+
}
|
93 |
+
|
94 |
+
|
95 |
+
if($this->blackListedIpsGroupIndex == $groupIndex)
|
96 |
+
{
|
97 |
+
if(null !== GdbcBlackListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath())
|
98 |
+
{
|
99 |
+
include_once GdbcBlackListedIpsAdminModule::getInstance()->getPartialAdminSettingsFilePath();
|
100 |
+
}
|
101 |
+
|
102 |
+
return;
|
103 |
+
}
|
104 |
+
|
105 |
+
return parent::renderGroupModulesSettings($groupIndex);
|
106 |
+
|
107 |
+
}
|
108 |
+
|
109 |
+
|
110 |
+
public function registerPageMetaBoxes()
|
111 |
+
{
|
112 |
+
parent::registerPageMetaBoxes();
|
113 |
+
|
114 |
+
if($this->getPageLayoutColumns() <= 1)
|
115 |
+
return;
|
116 |
+
|
117 |
+
add_meta_box(
|
118 |
+
"gdbc-help-web-attackers-list",
|
119 |
+
__('Web Attackers IPs List', GoodByeCaptcha::PLUGIN_SLUG),
|
120 |
+
array( $this, 'renderWebAttackersMetaBox' ),
|
121 |
+
$this->getAdminScreenId(),
|
122 |
+
'side',
|
123 |
+
'core',
|
124 |
+
null
|
125 |
+
);
|
126 |
+
|
127 |
+
add_meta_box(
|
128 |
+
"gdbc-help-proxy-anonymizers-list",
|
129 |
+
__('Anonymous Proxy IPs List', GoodByeCaptcha::PLUGIN_SLUG),
|
130 |
+
array( $this, 'renderProxyAnonymizersMetaBox' ),
|
131 |
+
$this->getAdminScreenId(),
|
132 |
+
'side',
|
133 |
+
'core',
|
134 |
+
null
|
135 |
+
);
|
136 |
+
|
137 |
+
}
|
138 |
+
|
139 |
+
public function renderWebAttackersMetaBox()
|
140 |
+
{
|
141 |
+
$textInfo = __('Provides security against the most well known attackers, with the minimum of false positives. Contains more than 100.000 attackers\' IPs reported by <a href="http://www.spamhaus.org/">Spamhaus.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
|
142 |
+
$textInfo .= __(' <a href="http://www.dshield.org/">DShield.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
|
143 |
+
$textInfo .= __(' <a href="http://www.openbl.org/">OpenBL.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
|
144 |
+
$textInfo .= __(' <a href="http://www.blocklist.de/">BlockList.de</a>,', GoodByeCaptcha::PLUGIN_SLUG);
|
145 |
+
$textInfo .= __(' <a href="http://www.projecthoneypot.org/">ProjectHoneypot.org</a> ', GoodByeCaptcha::PLUGIN_SLUG);
|
146 |
+
$textInfo .= __(' and <a href="https://greensnow.co/">GreenSnow.co</a>.', GoodByeCaptcha::PLUGIN_SLUG);
|
147 |
+
|
148 |
+
|
149 |
+
echo '<p>' . $textInfo . '</p>';
|
150 |
+
}
|
151 |
+
|
152 |
+
public function renderProxyAnonymizersMetaBox()
|
153 |
+
{
|
154 |
+
$textInfo = __('Provides protection against the most Proxy used IP addresses identified as high risk by reported by <a href="http://www.spamhaus.org/">Spamhaus.org</a>,', GoodByeCaptcha::PLUGIN_SLUG);
|
155 |
+
$textInfo .= __(' <a href="http://www.projecthoneypot.org/">ProjectHoneypot.org</a> and <a href="https://www.maxmind.com/en/proxy-detection-sample-list">MaxMind.com</a>.', GoodByeCaptcha::PLUGIN_SLUG);
|
156 |
+
$textInfo .= __(' <b>The list also contains the most fraudulent TOR network, TOR Nodes and TOR Exit Points IP Addresses.</b>', GoodByeCaptcha::PLUGIN_SLUG);
|
157 |
+
|
158 |
+
echo '<p style="text-align: justify">' . $textInfo . '</p>';
|
159 |
+
}
|
160 |
+
|
161 |
+
}
|
engine/admin/pages/GdbcSettingsAdminPage.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcSettingsAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
23 |
+
{
|
24 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
25 |
+
|
26 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_SETTINGS))
|
27 |
+
{
|
28 |
+
$this->registerGroupedModules(array(
|
29 |
+
new MchGdbcGroupedModules(__('GoodBye Captcha General Settings', GoodByeCaptcha::PLUGIN_SLUG), array(
|
30 |
+
GdbcSettingsAdminModule::getInstance())
|
31 |
+
)
|
32 |
+
));
|
33 |
+
}
|
34 |
+
|
35 |
+
}
|
36 |
+
|
37 |
+
}
|
engine/admin/pages/GdbcWordpressAdminPage.php
ADDED
@@ -0,0 +1,107 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcWordpressAdminPage extends GdbcBaseAdminPage
|
21 |
+
{
|
22 |
+
public function __construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug)
|
23 |
+
{
|
24 |
+
parent::__construct($pageMenuTitle, $pageBrowserTitle, $pluginSlug);
|
25 |
+
|
26 |
+
if(GdbcModulesController::isModuleRegistered(GdbcModulesController::MODULE_WORDPRESS))
|
27 |
+
{
|
28 |
+
$this->registerGroupedModules(array(
|
29 |
+
new MchGdbcGroupedModules(__('WordPress Standard Forms Settings', GoodByeCaptcha::PLUGIN_SLUG), array(
|
30 |
+
GdbcWordPressAdminModule::getInstance(),
|
31 |
+
)
|
32 |
+
)
|
33 |
+
));
|
34 |
+
|
35 |
+
|
36 |
+
$this->registerGroupedModules(array(
|
37 |
+
new MchGdbcGroupedModules(__('Tweaking WordPress', GoodByeCaptcha::PLUGIN_SLUG), array(
|
38 |
+
GdbcWordPressTweaksAdminModule::getInstance(),
|
39 |
+
)
|
40 |
+
)
|
41 |
+
));
|
42 |
+
|
43 |
+
}
|
44 |
+
|
45 |
+
}
|
46 |
+
|
47 |
+
public function registerPageMetaBoxes()
|
48 |
+
{
|
49 |
+
parent::registerPageMetaBoxes();
|
50 |
+
|
51 |
+
if($this->getPageLayoutColumns() <= 1)
|
52 |
+
return;
|
53 |
+
|
54 |
+
add_meta_box(
|
55 |
+
"gdbc-help-xml-rpc",
|
56 |
+
__('Disabling XML-RPC Service', GoodByeCaptcha::PLUGIN_SLUG),
|
57 |
+
array( $this, 'renderXmlRpcMetaBox' ),
|
58 |
+
$this->getAdminScreenId(),
|
59 |
+
'side',
|
60 |
+
'core',
|
61 |
+
null
|
62 |
+
);
|
63 |
+
|
64 |
+
add_meta_box(
|
65 |
+
"gdbc-help-xml-rpc-pingback",
|
66 |
+
__('Disabling XML-RPC Pingbacks', GoodByeCaptcha::PLUGIN_SLUG),
|
67 |
+
array( $this, 'renderXmlRpcPingbacksMetaBox' ),
|
68 |
+
$this->getAdminScreenId(),
|
69 |
+
'side',
|
70 |
+
'core',
|
71 |
+
null
|
72 |
+
);
|
73 |
+
|
74 |
+
}
|
75 |
+
|
76 |
+
public function renderXmlRpcMetaBox()
|
77 |
+
{
|
78 |
+
$textInfo = __('XML-RPC is used in WordPress as an API for third-party clients such as WordPress mobile apps, popular weblog clients like Windows Writer or popular plugins such as Jetpack.', GoodByeCaptcha::PLUGIN_SLUG);
|
79 |
+
$textInfo .= __('If you use any application which calls your XML-RPC Service, <b>do not</b> Completely Disable XML-RPC. Otherwise, completely disabling XML-RPC it is strongly recommended.', GoodByeCaptcha::PLUGIN_SLUG);
|
80 |
+
|
81 |
+
echo '<p style="text-align: justify">' . $textInfo . '</p>';
|
82 |
+
|
83 |
+
|
84 |
+
$textInfo = '<div class = "mch-meta-notice-info">';
|
85 |
+
$textInfo .= __('<span><b>Feel free to Completely Disable XML-RPC if you are using Jetpack plugin</b>. GoodBye Captcha simply allows Jetpack\'s XML-RPC Requests</span>', GoodByeCaptcha::PLUGIN_SLUG);
|
86 |
+
$textInfo .= '</div>';
|
87 |
+
|
88 |
+
echo $textInfo;
|
89 |
+
|
90 |
+
}
|
91 |
+
|
92 |
+
|
93 |
+
public function renderXmlRpcPingbacksMetaBox()
|
94 |
+
{
|
95 |
+
$textInfo = __('XML-RPC is used for Pingbacks and Trackbacks which can be heavily misused to start <a href="https://blog.sucuri.net/2014/03/more-than-162000-wordpress-sites-used-for-distributed-denial-of-service-attack.html">DDoS attacks</a>.', GoodByeCaptcha::PLUGIN_SLUG);
|
96 |
+
|
97 |
+
echo '<p style="text-align: justify">' . $textInfo . '</p>';
|
98 |
+
|
99 |
+
$textInfo = '<div class = "mch-meta-notice-info">';
|
100 |
+
$textInfo .= __('<span>If the <b>Completely Disable XML-RPC</b> option is checked, enabling/disabling this option has no effect!</span>', GoodByeCaptcha::PLUGIN_SLUG);
|
101 |
+
$textInfo .= '</div>';
|
102 |
+
|
103 |
+
echo $textInfo;
|
104 |
+
}
|
105 |
+
|
106 |
+
|
107 |
+
}
|
engine/db-access/GdbcDbAccessController.php
ADDED
@@ -0,0 +1,356 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
final class GdbcDbAccessController
|
21 |
+
{
|
22 |
+
public static $LAST_INSERTED_ATTEMPT_ID = 0;
|
23 |
+
|
24 |
+
private static function sanitizeEntityNotes($entityNote)
|
25 |
+
{
|
26 |
+
if(is_string($entityNote))
|
27 |
+
{
|
28 |
+
return wp_filter_kses(wp_check_invalid_utf8($entityNote));
|
29 |
+
}
|
30 |
+
|
31 |
+
if(is_array($entityNote))
|
32 |
+
{
|
33 |
+
return array_map( array( __CLASS__, 'sanitizeEntityNotes' ), $entityNote );
|
34 |
+
}
|
35 |
+
|
36 |
+
return $entityNote;
|
37 |
+
}
|
38 |
+
|
39 |
+
public static function registerAttempt(GdbcAttemptEntity $attemptEntity)
|
40 |
+
{
|
41 |
+
self::$LAST_INSERTED_ATTEMPT_ID = 0;
|
42 |
+
|
43 |
+
if(empty($attemptEntity->ModuleId) || empty($attemptEntity->SiteId) || empty($attemptEntity->CreatedDate) || empty($attemptEntity->ReasonId))
|
44 |
+
return;
|
45 |
+
|
46 |
+
unset($attemptEntity->Id);
|
47 |
+
|
48 |
+
if(is_array($attemptEntity->Notes))
|
49 |
+
{
|
50 |
+
$attemptEntity->Notes = array_filter($attemptEntity->Notes);
|
51 |
+
|
52 |
+
$tokenFieldName = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
|
53 |
+
$browserInputName = GdbcRequestController::getPostedBrowserInfoInputName();
|
54 |
+
|
55 |
+
$arrKeysToUnset = array($tokenFieldName, $browserInputName, strtolower($tokenFieldName), strtolower($browserInputName), strtoupper($tokenFieldName), strtoupper($browserInputName), '_wpnonce');
|
56 |
+
foreach($arrKeysToUnset as $keyName)
|
57 |
+
{
|
58 |
+
unset($attemptEntity->Notes[$keyName]);
|
59 |
+
}
|
60 |
+
}
|
61 |
+
|
62 |
+
$attemptEntity->Notes = !empty($attemptEntity->Notes) ? maybe_serialize(self::sanitizeEntityNotes($attemptEntity->Notes)) : null;
|
63 |
+
global $wpdb;
|
64 |
+
|
65 |
+
return self::$LAST_INSERTED_ATTEMPT_ID = (false === $wpdb->insert(self::getAttemptsTableName(), array_filter((array)$attemptEntity))) ? 0 : $wpdb->insert_id;
|
66 |
+
}
|
67 |
+
|
68 |
+
|
69 |
+
public static function getCombinedAttemptsPerDay($numberOfDays)
|
70 |
+
{
|
71 |
+
$createdDateTime = self::getDaysAgoTimeStamp($numberOfDays);
|
72 |
+
|
73 |
+
global $wpdb;
|
74 |
+
|
75 |
+
$sqlQuery = "SELECT COUNT(1) AS AttemptsNumber, FROM_UNIXTIME(CreatedDate, '%%Y-%%m-%%d') as CreatedDate FROM " . self::getAttemptsTableName() . " WHERE CreatedDate >= %d ";
|
76 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? '' : ' AND SiteId = %d ';
|
77 |
+
$sqlQuery .= " GROUP BY FROM_UNIXTIME(CreatedDate, '%%Y-%%m-%%d') ORDER BY CreatedDate ";
|
78 |
+
|
79 |
+
$arrParams = array($createdDateTime);
|
80 |
+
GoodByeCaptcha::isNetworkActivated() ? null : $arrParams[] = get_current_blog_id();
|
81 |
+
|
82 |
+
return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
83 |
+
|
84 |
+
}
|
85 |
+
|
86 |
+
public static function getLatestAttempts($numberOfAttempts)
|
87 |
+
{
|
88 |
+
global $wpdb;
|
89 |
+
|
90 |
+
$sqlQuery = 'SELECT * FROM ' . self::getAttemptsTableName();
|
91 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? '' : ' WHERE SiteId = %d';
|
92 |
+
$sqlQuery .= ' ORDER BY CreatedDate DESC LIMIT 0, %d';
|
93 |
+
|
94 |
+
$arrParams = array();
|
95 |
+
GoodByeCaptcha::isNetworkActivated() ? null : $arrParams[] = get_current_blog_id();
|
96 |
+
|
97 |
+
$arrParams[] = (int)$numberOfAttempts;
|
98 |
+
|
99 |
+
$latestAttemptsList = (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
100 |
+
|
101 |
+
return $latestAttemptsList;
|
102 |
+
}
|
103 |
+
|
104 |
+
public static function getAttemptsByClientIp($pageNumber, $recordsPerPage = 10)
|
105 |
+
{
|
106 |
+
global $wpdb;
|
107 |
+
|
108 |
+
$sqlQuery = "SELECT COUNT(1) AS Attempts, ClientIp FROM " . self::getAttemptsTableName();
|
109 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
|
110 |
+
$sqlQuery .= 'GROUP BY ClientIp ORDER BY Attempts DESC LIMIT %d, %d';
|
111 |
+
|
112 |
+
$arrParams = array();
|
113 |
+
|
114 |
+
GoodByeCaptcha::isNetworkActivated() ? null : $arrParams[] = get_current_blog_id();
|
115 |
+
|
116 |
+
$arrParams = array();
|
117 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
118 |
+
$arrParams[] = ($pageNumber-1) * $recordsPerPage;
|
119 |
+
$arrParams[] = $recordsPerPage;
|
120 |
+
|
121 |
+
return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
122 |
+
|
123 |
+
}
|
124 |
+
|
125 |
+
public static function getTotalAttemptsPerModule()
|
126 |
+
{
|
127 |
+
global $wpdb;
|
128 |
+
$sqlQuery = 'SELECT ModuleId, COUNT(1) as Total FROM ' . self::getAttemptsTableName();
|
129 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d' : ' WHERE SiteId = %d';
|
130 |
+
$sqlQuery .= ' GROUP BY ModuleId';
|
131 |
+
|
132 |
+
$arrParams = array();
|
133 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
134 |
+
|
135 |
+
return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
136 |
+
}
|
137 |
+
|
138 |
+
public static function getAttemptsPerModuleAndDay($numberOfDays)
|
139 |
+
{
|
140 |
+
global $wpdb;
|
141 |
+
$createdDateTime = self::getDaysAgoTimeStamp($numberOfDays) + 1;
|
142 |
+
|
143 |
+
$sqlQuery = "SELECT ModuleId, FROM_UNIXTIME(CreatedDate, '%%Y-%%m-%%d') AS AttemptDate, COUNT(1) AS AttemptsNumber FROM " . self::getAttemptsTableName();
|
144 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
|
145 |
+
$sqlQuery .= " AND CreatedDate > $createdDateTime GROUP BY ModuleId, AttemptDate ORDER BY ModuleId ASC, AttemptDate DESC";
|
146 |
+
|
147 |
+
$arrParams = array();
|
148 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
149 |
+
|
150 |
+
return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
151 |
+
}
|
152 |
+
|
153 |
+
public static function getNumberOfAttemptsByModuleId($moduleId)
|
154 |
+
{
|
155 |
+
global $wpdb;
|
156 |
+
$sqlQuery = 'SELECT COUNT(1) AS Total FROM ' . self::getAttemptsTableName();
|
157 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
|
158 |
+
$sqlQuery .= ' AND ModuleId = %d ';
|
159 |
+
|
160 |
+
$arrParams = array();
|
161 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
162 |
+
$arrParams[] = $moduleId;
|
163 |
+
|
164 |
+
$arrTotalAttempts = self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
165 |
+
|
166 |
+
return isset($arrTotalAttempts[0]) ? (int)$arrTotalAttempts[0]->Total : 0;
|
167 |
+
|
168 |
+
}
|
169 |
+
|
170 |
+
public static function getAttemptsPerModule($moduleId, $pageNumber, $recordsPerPage)
|
171 |
+
{
|
172 |
+
global $wpdb;
|
173 |
+
|
174 |
+
$pageNumber < 1 ? $pageNumber = 1 : null;
|
175 |
+
|
176 |
+
$sqlQuery = "SELECT * FROM " . self::getAttemptsTableName();
|
177 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d ' : ' WHERE SiteId = %d ';
|
178 |
+
$sqlQuery .= ' AND ModuleId = %d ORDER BY CreatedDate DESC LIMIT %d, %d';
|
179 |
+
|
180 |
+
$arrParams = array();
|
181 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
182 |
+
$arrParams[] = $moduleId;
|
183 |
+
|
184 |
+
$arrParams[] = ($pageNumber-1) * $recordsPerPage;
|
185 |
+
$arrParams[] = $recordsPerPage;
|
186 |
+
|
187 |
+
return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
188 |
+
}
|
189 |
+
|
190 |
+
public static function getAttemptById($attemptId)
|
191 |
+
{
|
192 |
+
global $wpdb;
|
193 |
+
$sqlQuery = 'SELECT * FROM ' . self::getAttemptsTableName() . ' WHERE Id = %d';
|
194 |
+
$arrGdbcAttempts = self::executePreparedQuery($wpdb->prepare($sqlQuery, $attemptId));
|
195 |
+
return isset($arrGdbcAttempts[0]) ? $arrGdbcAttempts[0] : 0;
|
196 |
+
}
|
197 |
+
|
198 |
+
public static function getAttemptsPerModuleAndSection()
|
199 |
+
{
|
200 |
+
global $wpdb;
|
201 |
+
$sqlQuery = 'SELECT ModuleId, SectionId, Count(ModuleId) AS Attempts FROM ' . self::getAttemptsTableName();
|
202 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' WHERE Id > %d' : ' WHERE SiteId = %d';
|
203 |
+
$sqlQuery .= ' GROUP BY ModuleId, SectionId';
|
204 |
+
|
205 |
+
$arrParams = array();
|
206 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
207 |
+
|
208 |
+
return (array)self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
209 |
+
|
210 |
+
|
211 |
+
}
|
212 |
+
|
213 |
+
private static function getDaysAgoTimeStamp($numberOfDays)
|
214 |
+
{
|
215 |
+
return MchGdbcHttpRequest::getServerRequestTime() - ( absint($numberOfDays) * 3600 * 24 );
|
216 |
+
}
|
217 |
+
|
218 |
+
private static function executePreparedQuery($sqlQuery)
|
219 |
+
{
|
220 |
+
global $wpdb;
|
221 |
+
return null !== ($queryResult = $wpdb->get_results($sqlQuery)) ? $queryResult : array();
|
222 |
+
}
|
223 |
+
|
224 |
+
public static function createAttemptsTable()
|
225 |
+
{
|
226 |
+
global $wpdb;
|
227 |
+
if(self::attemptsTableExists())
|
228 |
+
return false;
|
229 |
+
|
230 |
+
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
231 |
+
|
232 |
+
$createTableStatement = "CREATE TABLE " . self::getAttemptsTableName() . " (
|
233 |
+
Id int unsigned NOT NULL auto_increment,
|
234 |
+
CreatedDate int unsigned NOT NULL,
|
235 |
+
SiteId smallint unsigned NOT NULL,
|
236 |
+
ClientIp varchar(45) DEFAULT NULL,
|
237 |
+
ModuleId tinyint unsigned NOT NULL,
|
238 |
+
SectionId tinyint unsigned default 0,
|
239 |
+
ReasonId tinyint unsigned NOT NULL,
|
240 |
+
Notes longtext NOT NULL DEFAULT '',
|
241 |
+
PRIMARY KEY (Id),
|
242 |
+
KEY idx_gdbc_CreatedDateSiteId (CreatedDate, SiteId)
|
243 |
+
)"; //KEY index_gdbc_ClientIp (ClientIp)
|
244 |
+
|
245 |
+
$createTableStatement .= !empty($wpdb->charset) ? " DEFAULT CHARACTER SET {$wpdb->charset}" : '';
|
246 |
+
$createTableStatement .= !empty($wpdb->collate) ? " COLLATE {$wpdb->collate}" : '';
|
247 |
+
|
248 |
+
$result = dbDelta($createTableStatement);
|
249 |
+
|
250 |
+
return !empty($result) ? true : false;
|
251 |
+
|
252 |
+
}
|
253 |
+
|
254 |
+
|
255 |
+
|
256 |
+
public static function deleteAttemptsOlderThan($numberOfDays)
|
257 |
+
{
|
258 |
+
if(empty($numberOfDays))
|
259 |
+
return;
|
260 |
+
|
261 |
+
$createdDateTime = self::getDaysAgoTimeStamp($numberOfDays);
|
262 |
+
|
263 |
+
global $wpdb;
|
264 |
+
$sqlQuery = 'DELETE FROM ' . self::getAttemptsTableName() . ' WHERE CreatedDate < %d ';
|
265 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' AND Id > %d ' : ' AND SiteId = %d ';
|
266 |
+
$sqlQuery .= 'LIMIT 300';
|
267 |
+
|
268 |
+
$arrParams = array($createdDateTime);
|
269 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
270 |
+
|
271 |
+
self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
272 |
+
|
273 |
+
}
|
274 |
+
|
275 |
+
public static function clearAttemptsNotesOlderThan($numberOfDays)
|
276 |
+
{
|
277 |
+
if(empty($numberOfDays))
|
278 |
+
return;
|
279 |
+
|
280 |
+
$createdDateTime = self::getDaysAgoTimeStamp($numberOfDays);
|
281 |
+
|
282 |
+
global $wpdb;
|
283 |
+
$sqlQuery = 'UPDATE ' . self::getAttemptsTableName() . " SET Notes = '' WHERE CreatedDate < %d AND (Notes <> '' OR Notes IS NOT NULL )";
|
284 |
+
$sqlQuery .= GoodByeCaptcha::isNetworkActivated() ? ' AND Id > %d ' : ' AND SiteId = %d ';
|
285 |
+
$sqlQuery .= 'LIMIT 300';
|
286 |
+
|
287 |
+
$arrParams = array($createdDateTime);
|
288 |
+
$arrParams[] = GoodByeCaptcha::isNetworkActivated() ? 0 : get_current_blog_id();
|
289 |
+
|
290 |
+
self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
291 |
+
|
292 |
+
}
|
293 |
+
|
294 |
+
|
295 |
+
public static function getLatestLoginAttempts($numberOfSecondsAgo, $calculateAverage = false)
|
296 |
+
{
|
297 |
+
global $wpdb;
|
298 |
+
|
299 |
+
$averageStatement = ($calculateAverage) ? 'FORMAT( (MAX(CreatedDate) - MIN(CreatedDate)) / (Count(1) - 1) , 2) As TimeAverage,' : '';
|
300 |
+
|
301 |
+
$sqlQuery = "SELECT Count(1) AS Hits, $averageStatement ClientIp FROM " . self::getAttemptsTableName();
|
302 |
+
$sqlQuery .= ' WHERE CreatedDate > %d ' . ( GoodByeCaptcha::isNetworkActivated() ? 'AND SiteId = %d' : '');
|
303 |
+
$sqlQuery .= ' AND ( ';
|
304 |
+
|
305 |
+
foreach(GoodByeCaptchaUtils::getAllPossibleLoginAttemptEntities() as $gdbcAttempt){
|
306 |
+
$sqlQuery .= '(ModuleId = ' . $gdbcAttempt->ModuleId . ' AND SectionId = ' . $gdbcAttempt->SectionId . ') OR ';
|
307 |
+
}
|
308 |
+
|
309 |
+
$sqlQuery = substr($sqlQuery, 0, -4) . ' ) GROUP BY ClientIp';
|
310 |
+
|
311 |
+
$arrParams = array(MchGdbcHttpRequest::getServerRequestTime() - $numberOfSecondsAgo - 1);
|
312 |
+
|
313 |
+
$arrParams = array(
|
314 |
+
MchGdbcHttpRequest::getServerRequestTime() - $numberOfSecondsAgo - 2,
|
315 |
+
get_current_blog_id()
|
316 |
+
);
|
317 |
+
|
318 |
+
|
319 |
+
return self::executePreparedQuery($wpdb->prepare($sqlQuery, $arrParams));
|
320 |
+
|
321 |
+
}
|
322 |
+
|
323 |
+
|
324 |
+
public static function attemptsTableExistsAndIsEmpty()
|
325 |
+
{
|
326 |
+
if(!self::attemptsTableExists())
|
327 |
+
return false;
|
328 |
+
|
329 |
+
global $wpdb;
|
330 |
+
$arrFirstId = $wpdb->get_col('SELECT Id FROM ' . self::getAttemptsTableName() . ' LIMIT 1');
|
331 |
+
return empty($arrFirstId);
|
332 |
+
}
|
333 |
+
|
334 |
+
public static function attemptsTableExists()
|
335 |
+
{
|
336 |
+
global $wpdb;
|
337 |
+
return ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", self::getAttemptsTableName())) === self::getAttemptsTableName());
|
338 |
+
}
|
339 |
+
|
340 |
+
|
341 |
+
public static function getAttemptsTableName()
|
342 |
+
{
|
343 |
+
global $wpdb;
|
344 |
+
return $wpdb->base_prefix . 'gdbc_attempts';
|
345 |
+
}
|
346 |
+
|
347 |
+
|
348 |
+
public static function getLoginAttempts($lastNumberOfSeconds)
|
349 |
+
{
|
350 |
+
// SELECT Count(1) AS Hits , ((MAX(CreatedDate) - MIN(CreatedDate)) / (Count(1) - 1)) As Average, ClientIp
|
351 |
+
// from wp_gdbc_attempts qa where qa.CreatedDate > (1443473534 - (1 * 60)) GROUP BY ClientIp;
|
352 |
+
}
|
353 |
+
|
354 |
+
private function __construct()
|
355 |
+
{}
|
356 |
+
}
|
engine/entities/GdbcAttemptEntity.php
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright (C) 2014 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
class GdbcAttemptEntity
|
22 |
+
{
|
23 |
+
public $Id = null;
|
24 |
+
public $CreatedDate = null;
|
25 |
+
public $ModuleId = null;
|
26 |
+
public $SectionId = null;
|
27 |
+
public $SiteId = null;
|
28 |
+
public $ClientIp = null;
|
29 |
+
// public $CountryId = null;
|
30 |
+
public $ReasonId = null;
|
31 |
+
public $Notes = null;
|
32 |
+
|
33 |
+
public function __construct($moduleId, $sectionId = 0)
|
34 |
+
{
|
35 |
+
$this->ModuleId = $moduleId;
|
36 |
+
$this->SectionId = $sectionId;
|
37 |
+
}
|
38 |
+
|
39 |
+
public static function getInstanceFromRawData($rawDataEntity)
|
40 |
+
{
|
41 |
+
if(empty($rawDataEntity))
|
42 |
+
return null;
|
43 |
+
|
44 |
+
$jsonDecoded = is_string($rawDataEntity) ? json_decode($rawDataEntity, true) : null;
|
45 |
+
if(null !== $jsonDecoded)
|
46 |
+
$rawDataEntity = $jsonDecoded;
|
47 |
+
|
48 |
+
$rawDataEntity = (null !== $jsonDecoded) ? $jsonDecoded : (array)$rawDataEntity;
|
49 |
+
|
50 |
+
if(empty($rawDataEntity['ModuleId']))
|
51 |
+
return null;
|
52 |
+
|
53 |
+
$attemptEntity = new GdbcAttemptEntity($rawDataEntity['ModuleId']);
|
54 |
+
foreach($rawDataEntity as $property=>$value)
|
55 |
+
{
|
56 |
+
if(!property_exists($attemptEntity, $property))
|
57 |
+
continue;
|
58 |
+
|
59 |
+
$attemptEntity->{$property} = $value;
|
60 |
+
}
|
61 |
+
|
62 |
+
return $attemptEntity;
|
63 |
+
}
|
64 |
+
}
|
engine/modules/GdbcBaseAdminModule.php
ADDED
@@ -0,0 +1,194 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
abstract class GdbcBaseAdminModule extends MchGdbcBaseAdminModule
|
21 |
+
{
|
22 |
+
|
23 |
+
protected function __construct()
|
24 |
+
{
|
25 |
+
parent::__construct();
|
26 |
+
}
|
27 |
+
|
28 |
+
public abstract function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity);
|
29 |
+
|
30 |
+
protected function getAllSavedOptions($asNetworkOption = true)
|
31 |
+
{
|
32 |
+
return parent::getAllSavedOptions(GoodByeCaptcha::isNetworkActivated());
|
33 |
+
}
|
34 |
+
|
35 |
+
public function getOption($optionName, $asNetworkOption = true)
|
36 |
+
{
|
37 |
+
return parent::getOption($optionName, GoodByeCaptcha::isNetworkActivated());
|
38 |
+
}
|
39 |
+
|
40 |
+
public function saveOption($optionName, $optionValue, $asNetworkOption = true)
|
41 |
+
{
|
42 |
+
return parent::saveOption($optionName, $optionValue, GoodByeCaptcha::isNetworkActivated());
|
43 |
+
}
|
44 |
+
|
45 |
+
public function renderModuleSettingsSectionHeader(array $arrSectionInfo)
|
46 |
+
{
|
47 |
+
//echo '<h3>' . __('WordPress General Settings', GoodByeCaptcha::PLUGIN_SLUG) . '</h3><hr />';
|
48 |
+
}
|
49 |
+
|
50 |
+
public function renderModuleSettingsField(array $arrSettingsField)
|
51 |
+
{
|
52 |
+
$arrDefaultValues = $this->getDefaultOptionsValues();
|
53 |
+
$optionName = key($arrSettingsField);
|
54 |
+
if(null === $optionName || !array_key_exists($optionName, $arrDefaultValues))
|
55 |
+
return;
|
56 |
+
|
57 |
+
$optionValue = $this->getOption($optionName);
|
58 |
+
// if(null === $optionValue && isset($arrDefaultValues[$optionName]))
|
59 |
+
// {
|
60 |
+
// if(!is_array($arrDefaultValues[$optionName])) {
|
61 |
+
// $optionValue = $arrDefaultValues[$optionName];
|
62 |
+
// }
|
63 |
+
// }
|
64 |
+
|
65 |
+
$arrSettingsField = $arrSettingsField[$optionName];
|
66 |
+
$arrFieldAttributes = array(
|
67 |
+
'name' => $this->getSettingKey() . '[' . $optionName . ']',
|
68 |
+
'type' => !empty($arrSettingsField['InputType']) ? $arrSettingsField['InputType'] : 'text',
|
69 |
+
'value' => $optionValue,
|
70 |
+
'id' => $this->getSettingKey() . '-' . $optionName,
|
71 |
+
);
|
72 |
+
|
73 |
+
if($arrFieldAttributes['type'] === MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX)
|
74 |
+
{
|
75 |
+
!empty($arrFieldAttributes['value']) ? $arrFieldAttributes['checked'] = 'checked' : null;
|
76 |
+
$arrFieldAttributes['value'] = true;
|
77 |
+
}
|
78 |
+
|
79 |
+
|
80 |
+
switch ($arrFieldAttributes['type'])
|
81 |
+
{
|
82 |
+
case MchGdbcHtmlUtils::FORM_ELEMENT_SELECT :
|
83 |
+
|
84 |
+
echo MchGdbcHtmlUtils::createSelectElement($arrFieldAttributes);
|
85 |
+
|
86 |
+
break;
|
87 |
+
|
88 |
+
default :
|
89 |
+
|
90 |
+
echo MchGdbcHtmlUtils::createInputElement($arrFieldAttributes);
|
91 |
+
}
|
92 |
+
|
93 |
+
if(!empty($arrSettingsField['Description']))
|
94 |
+
{
|
95 |
+
echo '<p class = "description">' . $arrSettingsField['Description'] . '</p>';
|
96 |
+
}
|
97 |
+
|
98 |
+
}
|
99 |
+
|
100 |
+
protected function getFormattedFieldDescription($description)
|
101 |
+
{
|
102 |
+
return '<p class = "description">' . esc_html( $description ); '</p>';
|
103 |
+
}
|
104 |
+
|
105 |
+
|
106 |
+
public function getOptionDisplayTextByOptionId($settingOptionId)
|
107 |
+
{
|
108 |
+
$settingOptionId = (int)$settingOptionId;
|
109 |
+
|
110 |
+
foreach($this->getDefaultOptions() as $arrOptionInfo)
|
111 |
+
{
|
112 |
+
if (isset($arrOptionInfo['Id']) && $arrOptionInfo['Id'] === $settingOptionId && isset($arrOptionInfo['DisplayText']))
|
113 |
+
return esc_html($arrOptionInfo['DisplayText']);
|
114 |
+
}
|
115 |
+
|
116 |
+
return null;
|
117 |
+
}
|
118 |
+
|
119 |
+
public function getOptionIdByOptionName($settingOptionName)
|
120 |
+
{
|
121 |
+
$arrDefaultSettingOptions = $this->getDefaultOptions();
|
122 |
+
|
123 |
+
return isset($arrDefaultSettingOptions[$settingOptionName]['Id']) ? $arrDefaultSettingOptions[$settingOptionName]['Id'] : 0;
|
124 |
+
}
|
125 |
+
|
126 |
+
public function getOptionNameByOptionId($settingOptionId)
|
127 |
+
{
|
128 |
+
$settingOptionId = (int)$settingOptionId;
|
129 |
+
foreach($this->getDefaultOptions() as $optionName => $arrOptionInfo)
|
130 |
+
{
|
131 |
+
if (isset($arrOptionInfo['Id']) && (int)$arrOptionInfo['Id'] === $settingOptionId)
|
132 |
+
return $optionName;
|
133 |
+
}
|
134 |
+
|
135 |
+
return null;
|
136 |
+
}
|
137 |
+
|
138 |
+
protected static function getBlockedContentDisplayableKey($blockedContentKey)
|
139 |
+
{
|
140 |
+
$arrMappedKeys = array(
|
141 |
+
|
142 |
+
'username' => __('Username', GoodByeCaptcha::PLUGIN_SLUG),
|
143 |
+
'password' => __('Password', GoodByeCaptcha::PLUGIN_SLUG),
|
144 |
+
'email' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
|
145 |
+
'post' => __('Post', GoodByeCaptcha::PLUGIN_SLUG),
|
146 |
+
'page' => __('Page', GoodByeCaptcha::PLUGIN_SLUG),
|
147 |
+
|
148 |
+
'comment_post_ID' => __('Post Id', GoodByeCaptcha::PLUGIN_SLUG),
|
149 |
+
'comment_author' => __('Author', GoodByeCaptcha::PLUGIN_SLUG),
|
150 |
+
'comment_author_email' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
|
151 |
+
'comment_author_url' => __('Website', GoodByeCaptcha::PLUGIN_SLUG),
|
152 |
+
'comment_content' => __('Content', GoodByeCaptcha::PLUGIN_SLUG),
|
153 |
+
'comment_parent' => __('As Reply to', GoodByeCaptcha::PLUGIN_SLUG),
|
154 |
+
|
155 |
+
'your-name' => __('Name', GoodByeCaptcha::PLUGIN_SLUG),
|
156 |
+
'your-email' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
|
157 |
+
'your-subject' => __('Subject', GoodByeCaptcha::PLUGIN_SLUG),
|
158 |
+
'your-message' => __('Message', GoodByeCaptcha::PLUGIN_SLUG),
|
159 |
+
|
160 |
+
'page-url' => __('Page URL', GoodByeCaptcha::PLUGIN_SLUG),
|
161 |
+
'post-url' => __('Post URL', GoodByeCaptcha::PLUGIN_SLUG),
|
162 |
+
|
163 |
+
'ADDRESS' => __('Address', GoodByeCaptcha::PLUGIN_SLUG),
|
164 |
+
'FNAME' => __('First Name', GoodByeCaptcha::PLUGIN_SLUG),
|
165 |
+
'LNAME' => __('Last Name', GoodByeCaptcha::PLUGIN_SLUG),
|
166 |
+
'NNAME' => __('Nick Name', GoodByeCaptcha::PLUGIN_SLUG),
|
167 |
+
'GROUPINGS' => __('Group', GoodByeCaptcha::PLUGIN_SLUG),
|
168 |
+
'EMAIL' => __('Email', GoodByeCaptcha::PLUGIN_SLUG),
|
169 |
+
|
170 |
+
|
171 |
+
'honoreestate' => __('State', GoodByeCaptcha::PLUGIN_SLUG),
|
172 |
+
'honoreeprovince' => __('Province', GoodByeCaptcha::PLUGIN_SLUG),
|
173 |
+
'honoreecountry' => __('Country', GoodByeCaptcha::PLUGIN_SLUG),
|
174 |
+
|
175 |
+
'firstname' => __('First Name', GoodByeCaptcha::PLUGIN_SLUG),
|
176 |
+
'lastname' => __('Last Name', GoodByeCaptcha::PLUGIN_SLUG),
|
177 |
+
'phone' => __('Phone', GoodByeCaptcha::PLUGIN_SLUG),
|
178 |
+
|
179 |
+
|
180 |
+
'country' => __('Country', GoodByeCaptcha::PLUGIN_SLUG),
|
181 |
+
'item_name' => __('Item', GoodByeCaptcha::PLUGIN_SLUG),
|
182 |
+
'amount' => __('Amount', GoodByeCaptcha::PLUGIN_SLUG),
|
183 |
+
'paymentmethod' => __('Method', GoodByeCaptcha::PLUGIN_SLUG),
|
184 |
+
|
185 |
+
|
186 |
+
'secretkey' => __('Secret key', GoodByeCaptcha::PLUGIN_SLUG),
|
187 |
+
'authorid' => __('Author Id', GoodByeCaptcha::PLUGIN_SLUG),
|
188 |
+
);
|
189 |
+
|
190 |
+
$blockedKey = trim($blockedContentKey);
|
191 |
+
return isset($arrMappedKeys[$blockedKey]) ? $arrMappedKeys[$blockedKey] : esc_html($blockedContentKey);
|
192 |
+
}
|
193 |
+
|
194 |
+
}
|
engine/modules/GdbcBasePublicModule.php
ADDED
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
abstract class GdbcBasePublicModule extends MchGdbcBasePublicModule
|
21 |
+
{
|
22 |
+
private $submittedData = null;
|
23 |
+
|
24 |
+
|
25 |
+
protected $attemptEntity = null;
|
26 |
+
|
27 |
+
/**
|
28 |
+
* @return int
|
29 |
+
*/
|
30 |
+
protected abstract function getModuleId();
|
31 |
+
|
32 |
+
protected function __construct()
|
33 |
+
{
|
34 |
+
parent::__construct();
|
35 |
+
|
36 |
+
$this->submittedData = array();
|
37 |
+
$this->attemptEntity = new GdbcAttemptEntity($this->getModuleId());
|
38 |
+
}
|
39 |
+
|
40 |
+
protected function getAllSavedOptions($asNetworkOption = true)
|
41 |
+
{
|
42 |
+
return parent::getAllSavedOptions(GoodByeCaptcha::isNetworkActivated());
|
43 |
+
}
|
44 |
+
|
45 |
+
public function getOption($optionName, $asNetworkOption = true)
|
46 |
+
{
|
47 |
+
return parent::getOption($optionName, GoodByeCaptcha::isNetworkActivated());
|
48 |
+
}
|
49 |
+
|
50 |
+
protected function setSubmittedData(array $submittedData)
|
51 |
+
{
|
52 |
+
$this->submittedData = $submittedData;
|
53 |
+
}
|
54 |
+
|
55 |
+
protected function getSubmittedData()
|
56 |
+
{
|
57 |
+
return $this->submittedData;
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* @return GdbcAttemptEntity | null
|
62 |
+
*/
|
63 |
+
|
64 |
+
protected function getAttemptEntity()
|
65 |
+
{
|
66 |
+
return $this->attemptEntity;
|
67 |
+
}
|
68 |
+
|
69 |
+
|
70 |
+
public function getOptionIdByOptionName($settingOptionName)
|
71 |
+
{
|
72 |
+
|
73 |
+
$adminModuleInstance = GdbcModulesController::getAdminModuleInstance(GdbcModulesController::getModuleNameById($this->getModuleId()));
|
74 |
+
if(null === $adminModuleInstance)
|
75 |
+
return 0;
|
76 |
+
|
77 |
+
return $adminModuleInstance->getOptionIdByOptionName($settingOptionName);
|
78 |
+
|
79 |
+
}
|
80 |
+
|
81 |
+
|
82 |
+
public function renderTokenFieldIntoForm()
|
83 |
+
{
|
84 |
+
echo $this->getTokenFieldHtml();
|
85 |
+
}
|
86 |
+
|
87 |
+
public function getTokenFieldHtml()
|
88 |
+
{
|
89 |
+
$hiddenField = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
|
90 |
+
if(!isset($hiddenField[0]))
|
91 |
+
{
|
92 |
+
GdbcSettingsAdminModule::getInstance()->saveSecuredOptions(true);
|
93 |
+
$hiddenField = GdbcSettingsPublicModule::getInstance()->getOption(GdbcSettingsAdminModule::OPTION_HIDDEN_INPUT_NAME);
|
94 |
+
}
|
95 |
+
|
96 |
+
return '<input type="hidden" autocomplete="off" autocorrect="off" name="' . esc_attr( $hiddenField ) . '" value="" />';
|
97 |
+
}
|
98 |
+
|
99 |
+
|
100 |
+
}
|
engine/modules/black-listed-ips/GdbcBlackListedIpsAdminModule.php
ADDED
@@ -0,0 +1,249 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright (C) 2015 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
final class GdbcBlackListedIpsAdminModule extends GdbcBaseAdminModule
|
22 |
+
{
|
23 |
+
CONST OPTION_BLACK_LISTED_IPS = 'BlackListedIps';
|
24 |
+
|
25 |
+
protected function __construct()
|
26 |
+
{
|
27 |
+
parent::__construct();
|
28 |
+
}
|
29 |
+
|
30 |
+
public function getDefaultOptions()
|
31 |
+
{
|
32 |
+
static $arrDefaultSettingOptions = null;
|
33 |
+
if(null !== $arrDefaultSettingOptions)
|
34 |
+
return $arrDefaultSettingOptions;
|
35 |
+
|
36 |
+
$arrDefaultSettingOptions = array(
|
37 |
+
|
38 |
+
self::OPTION_BLACK_LISTED_IPS => array(
|
39 |
+
'Id' => 1,
|
40 |
+
'Value' => null,
|
41 |
+
'LabelText' => null,
|
42 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_TEXT
|
43 |
+
),
|
44 |
+
|
45 |
+
);
|
46 |
+
|
47 |
+
return $arrDefaultSettingOptions;
|
48 |
+
|
49 |
+
}
|
50 |
+
|
51 |
+
public function validateModuleSettingsFields($arrSettingOptions)
|
52 |
+
{
|
53 |
+
$arrSettingOptions = array_map('sanitize_text_field', (array)$arrSettingOptions);
|
54 |
+
$arrAlreadySavedIps = (array)$this->getOption(self::OPTION_BLACK_LISTED_IPS);
|
55 |
+
|
56 |
+
$action = 'add';
|
57 |
+
if(!empty($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]) && strpos($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS], 'remove-') !== false)
|
58 |
+
{
|
59 |
+
$action = 'remove';
|
60 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = str_replace('remove-', '', $arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]);
|
61 |
+
}
|
62 |
+
|
63 |
+
$preparedData = empty($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]) ? array() : GdbcIPUtils::getFormattedIpRangeForDb($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]);
|
64 |
+
$ipVersion = key($preparedData);
|
65 |
+
|
66 |
+
if('remove' === $action && !empty($preparedData[$ipVersion]))
|
67 |
+
{
|
68 |
+
$minIpValue = $preparedData[$ipVersion][0];
|
69 |
+
$maxIpValue = $preparedData[$ipVersion][1];
|
70 |
+
|
71 |
+
if( isset($arrAlreadySavedIps[$ipVersion][$minIpValue]) && $arrAlreadySavedIps[$ipVersion][$minIpValue] == $maxIpValue)
|
72 |
+
{
|
73 |
+
$this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
|
74 |
+
unset($arrAlreadySavedIps[$ipVersion][$minIpValue]);
|
75 |
+
}
|
76 |
+
|
77 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
|
78 |
+
return $arrSettingOptions;
|
79 |
+
}
|
80 |
+
|
81 |
+
if(empty($preparedData[$ipVersion]) || !is_array($preparedData[$ipVersion]))
|
82 |
+
{
|
83 |
+
$this->registerErrorMessage(__('Invalid IP/CIDR/Range provided!', GoodByeCaptcha::PLUGIN_SLUG));
|
84 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
|
85 |
+
|
86 |
+
return $arrSettingOptions;
|
87 |
+
}
|
88 |
+
|
89 |
+
if(!in_array($ipVersion, array(MchGdbcIPUtils::IP_VERSION_4, MchGdbcIPUtils::IP_VERSION_6)))
|
90 |
+
{
|
91 |
+
$this->registerErrorMessage(__('Invalid IP/CIDR/Range provided', GoodByeCaptcha::PLUGIN_SLUG));
|
92 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
|
93 |
+
|
94 |
+
return $arrSettingOptions;
|
95 |
+
}
|
96 |
+
|
97 |
+
if(1 === $preparedData[$ipVersion][1])
|
98 |
+
{
|
99 |
+
if (GdbcIPUtils::isIpBlackListed($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS]))
|
100 |
+
{
|
101 |
+
$this->registerErrorMessage(sprintf(__("The IP %s is already black-listed!", GoodByeCaptcha::PLUGIN_SLUG), esc_html($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS])));
|
102 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
|
103 |
+
|
104 |
+
return $arrSettingOptions;
|
105 |
+
}
|
106 |
+
}
|
107 |
+
|
108 |
+
if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4]))
|
109 |
+
$arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4] = array();
|
110 |
+
|
111 |
+
if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6]))
|
112 |
+
$arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6] = array();
|
113 |
+
|
114 |
+
$arrIpRanges = array();
|
115 |
+
$arrSingleIPs = array();
|
116 |
+
if(1 !== $preparedData[$ipVersion][1])
|
117 |
+
{
|
118 |
+
foreach($arrAlreadySavedIps[$ipVersion] as $minValue => $maxValue)
|
119 |
+
{
|
120 |
+
if( 1 === $maxValue )
|
121 |
+
{
|
122 |
+
$arrSingleIPs[] = $minValue;
|
123 |
+
continue;
|
124 |
+
}
|
125 |
+
|
126 |
+
if( ($minValue <= $preparedData[$ipVersion][0]) && ($preparedData[$ipVersion][1] <= $maxValue) )
|
127 |
+
{
|
128 |
+
$this->registerErrorMessage(sprintf(__("The IP Range %s is already black-listed!", GoodByeCaptcha::PLUGIN_SLUG), esc_html($arrSettingOptions[self::OPTION_BLACK_LISTED_IPS])));
|
129 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
|
130 |
+
|
131 |
+
return $arrSettingOptions;
|
132 |
+
}
|
133 |
+
|
134 |
+
$arrIpRanges[] = array($minValue, $maxValue);
|
135 |
+
}
|
136 |
+
|
137 |
+
$arrIpRanges[] = $preparedData[$ipVersion];
|
138 |
+
}
|
139 |
+
|
140 |
+
if(!empty($arrIpRanges)) {
|
141 |
+
$arrIpRanges = MchGdbcUtils::overlapIntervals($arrIpRanges);
|
142 |
+
|
143 |
+
$arrAlreadySavedIps[$ipVersion] = array();
|
144 |
+
// Add single IPs always on top of Ranges
|
145 |
+
foreach($arrSingleIPs as $ipNumber){
|
146 |
+
if(!isset($arrAlreadySavedIps[$ipVersion][$ipNumber]))
|
147 |
+
$arrAlreadySavedIps[$ipVersion][$ipNumber] = 1;
|
148 |
+
}
|
149 |
+
|
150 |
+
foreach($arrIpRanges as $arrRange){
|
151 |
+
$arrAlreadySavedIps[$ipVersion][ $arrRange[0] ] = $arrRange[1];
|
152 |
+
}
|
153 |
+
}
|
154 |
+
else
|
155 |
+
{
|
156 |
+
$arrAlreadySavedIps[$ipVersion][$preparedData[$ipVersion][0]] = $preparedData[$ipVersion][1];
|
157 |
+
}
|
158 |
+
|
159 |
+
|
160 |
+
$arrSettingOptions[self::OPTION_BLACK_LISTED_IPS] = $arrAlreadySavedIps;
|
161 |
+
|
162 |
+
$this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
|
163 |
+
|
164 |
+
return $arrSettingOptions;
|
165 |
+
}
|
166 |
+
|
167 |
+
public function renderModuleSettingsSectionHeader(array $arrSectionInfo)
|
168 |
+
{}
|
169 |
+
|
170 |
+
public function getPartialAdminSettingsFilePath()
|
171 |
+
{
|
172 |
+
$filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'partials' . DIRECTORY_SEPARATOR . 'admin-settings.php';
|
173 |
+
return is_file($filePath) ? $filePath : null;
|
174 |
+
}
|
175 |
+
|
176 |
+
public static function getInstance()
|
177 |
+
{
|
178 |
+
static $adminInstance = null;
|
179 |
+
return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
|
180 |
+
}
|
181 |
+
|
182 |
+
public function registerBlackListedIp($ipAddress)
|
183 |
+
{
|
184 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
|
185 |
+
|
186 |
+
if($ipVersion !== MchGdbcIPUtils::IP_VERSION_4 && $ipVersion !== MchGdbcIPUtils::IP_VERSION_6)
|
187 |
+
return false;
|
188 |
+
|
189 |
+
$arrAlreadySavedIps = $this->getOption(self::OPTION_BLACK_LISTED_IPS);
|
190 |
+
(null === $arrAlreadySavedIps) ? $arrAlreadySavedIps = array() : null;
|
191 |
+
|
192 |
+
if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4]))
|
193 |
+
$arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4] = array();
|
194 |
+
|
195 |
+
if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6]))
|
196 |
+
$arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6] = array();
|
197 |
+
|
198 |
+
$preparedDataForDb = GdbcIPUtils::getFormattedIpRangeForDb($ipAddress);
|
199 |
+
|
200 |
+
if(!isset($preparedDataForDb[$ipVersion][0]))
|
201 |
+
return false;
|
202 |
+
|
203 |
+
if(isset($arrAlreadySavedIps[$ipVersion][ $preparedDataForDb[$ipVersion][0] ])) // single IP
|
204 |
+
return true;
|
205 |
+
|
206 |
+
$arrAlreadySavedIps[$ipVersion][$preparedDataForDb[$ipVersion][0]] = $preparedDataForDb[$ipVersion][1];
|
207 |
+
|
208 |
+
|
209 |
+
return $this->saveOption(self::OPTION_BLACK_LISTED_IPS, $arrAlreadySavedIps);
|
210 |
+
|
211 |
+
}
|
212 |
+
|
213 |
+
public function unRegisterBlackListedIp($ipAddress)
|
214 |
+
{
|
215 |
+
$ipVersion = MchGdbcIPUtils::getIpAddressVersion($ipAddress);
|
216 |
+
|
217 |
+
if($ipVersion !== MchGdbcIPUtils::IP_VERSION_4 && $ipVersion !== MchGdbcIPUtils::IP_VERSION_6)
|
218 |
+
return false;
|
219 |
+
|
220 |
+
|
221 |
+
$arrAlreadySavedIps = $this->getOption(self::OPTION_BLACK_LISTED_IPS);
|
222 |
+
(null === $arrAlreadySavedIps) ? $arrAlreadySavedIps = array() : null;
|
223 |
+
|
224 |
+
if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4]))
|
225 |
+
$arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_4] = array();
|
226 |
+
|
227 |
+
if(!isset($arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6]))
|
228 |
+
$arrAlreadySavedIps[MchGdbcIPUtils::IP_VERSION_6] = array();
|
229 |
+
|
230 |
+
if(empty($arrAlreadySavedIps[$ipVersion]))
|
231 |
+
return false;
|
232 |
+
|
233 |
+
$arrFormattedRanges = GdbcIPUtils::removeIpFromFormattedRange($ipAddress, $arrAlreadySavedIps[$ipVersion]);
|
234 |
+
if($arrFormattedRanges == $arrAlreadySavedIps[$ipVersion])
|
235 |
+
return false;
|
236 |
+
|
237 |
+
$arrAlreadySavedIps[$ipVersion] = $arrFormattedRanges;
|
238 |
+
|
239 |
+
return $this->saveOption(self::OPTION_BLACK_LISTED_IPS, $arrAlreadySavedIps);
|
240 |
+
|
241 |
+
}
|
242 |
+
|
243 |
+
public function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity)
|
244 |
+
{
|
245 |
+
return null;
|
246 |
+
}
|
247 |
+
|
248 |
+
|
249 |
+
}
|
engine/modules/black-listed-ips/GdbcBlackListedIpsPublicModule.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
* Copyright (C) 2015 Mihai Chelaru
|
5 |
+
*
|
6 |
+
* This program is free software; you can redistribute it and/or
|
7 |
+
* modify it under the terms of the GNU General Public License
|
8 |
+
* as published by the Free Software Foundation; either version 2
|
9 |
+
* of the License, or (at your option) any later version.
|
10 |
+
*
|
11 |
+
* This program is distributed in the hope that it will be useful,
|
12 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14 |
+
* GNU General Public License for more details.
|
15 |
+
*
|
16 |
+
* You should have received a copy of the GNU General Public License
|
17 |
+
* along with this program; if not, write to the Free Software
|
18 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19 |
+
*/
|
20 |
+
|
21 |
+
final class GdbcBlackListedIpsPublicModule extends GdbcBasePublicModule
|
22 |
+
{
|
23 |
+
|
24 |
+
protected function __construct()
|
25 |
+
{
|
26 |
+
parent::__construct();
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @return int
|
31 |
+
*/
|
32 |
+
protected function getModuleId()
|
33 |
+
{
|
34 |
+
return GdbcModulesController::getModuleIdByName(GdbcModulesController::MODULE_BLACK_LISTED_IPS);
|
35 |
+
}
|
36 |
+
|
37 |
+
public static function getInstance()
|
38 |
+
{
|
39 |
+
static $adminInstance = null;
|
40 |
+
return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
|
41 |
+
}
|
42 |
+
|
43 |
+
}
|
engine/modules/black-listed-ips/partials/admin-settings.php
ADDED
@@ -0,0 +1,214 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2015 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
?>
|
20 |
+
<style type="text/css">
|
21 |
+
|
22 |
+
.gdbc-settings tr.even
|
23 |
+
{
|
24 |
+
background-color:#f5f5f5;
|
25 |
+
}
|
26 |
+
|
27 |
+
.gdbc-blacklisted-ips-holder input[type="text"]
|
28 |
+
{
|
29 |
+
width: 99%;
|
30 |
+
}
|
31 |
+
.gdbc-blacklisted-ips-holder thead tbody > tr form > td:first-child
|
32 |
+
{
|
33 |
+
padding: 0 30px !important;
|
34 |
+
}
|
35 |
+
|
36 |
+
.gdbc-blacklisted-ips-holder td
|
37 |
+
{
|
38 |
+
vertical-align: middle !important;
|
39 |
+
word-wrap: normal !important;
|
40 |
+
}
|
41 |
+
.gdbc-blacklisted-ips-holder th
|
42 |
+
{
|
43 |
+
font-weight: 700;
|
44 |
+
}
|
45 |
+
|
46 |
+
.gdbc-settings .tablenav-pages span.current {
|
47 |
+
font-size: 18px;
|
48 |
+
font-weight: bold;
|
49 |
+
line-height: 30px;
|
50 |
+
padding: 4px 6px;
|
51 |
+
text-decoration: none;
|
52 |
+
}
|
53 |
+
|
54 |
+
</style>
|
55 |
+
|
56 |
+
<?php
|
57 |
+
|
58 |
+
$formAction = GoodByeCaptcha::isNetworkActivated() ? '' : 'options.php';
|
59 |
+
|
60 |
+
?>
|
61 |
+
|
62 |
+
|
63 |
+
<table class="wp-list-table widefat fixed gdbc-blacklisted-ips-holder">
|
64 |
+
<thead>
|
65 |
+
|
66 |
+
<tr>
|
67 |
+
<th></th>
|
68 |
+
<th></th>
|
69 |
+
<th></th>
|
70 |
+
<th></th>
|
71 |
+
</tr>
|
72 |
+
|
73 |
+
|
74 |
+
<tr class = "even">
|
75 |
+
<td colspan="4" style=" text-align: right">
|
76 |
+
<form method="post" action="<?php echo $formAction ?>">
|
77 |
+
<div class="clearfix" style="margin:0 auto; width: 700px;">
|
78 |
+
<input style = "float: left;clear: left; width: 80%;" type="text" name="<?php echo $this->getBlackListedIpsInputName();?>" placeholder="<?php _e('IP/RANGE/CIDR', GoodByeCaptcha::PLUGIN_SLUG); ?>" required />
|
79 |
+
<input style = "float: right;" type="submit" value="<?php _e('Add to BlackList', GoodByeCaptcha::PLUGIN_SLUG); ?>" class="button button-primary" />
|
80 |
+
</div>
|
81 |
+
|
82 |
+
<?php settings_fields( $this->getSettingGroupId($this->blackListedIpsGroupIndex) );?>
|
83 |
+
|
84 |
+
</form>
|
85 |
+
</td>
|
86 |
+
</tr>
|
87 |
+
<tr>
|
88 |
+
<th width="5%"></th>
|
89 |
+
<th width="30%"></th>
|
90 |
+
<th width="50%"></th>
|
91 |
+
<th width="15%"></th>
|
92 |
+
</tr>
|
93 |
+
|
94 |
+
<tr>
|
95 |
+
<th width="5%"><?php _e('Blocked Hosts', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
|
96 |
+
<th width="30%"><?php _e('IP Address/Range/CIDR', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
|
97 |
+
<th width="60%"><?php _e('Country', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
|
98 |
+
<th width="5%" style="text-align: right; padding-right: 22px"><?php _e('Actions', GoodByeCaptcha::PLUGIN_SLUG); ?></th>
|
99 |
+
</tr>
|
100 |
+
|
101 |
+
</thead>
|
102 |
+
|
103 |
+
<tbody>
|
104 |
+
<?php
|
105 |
+
|
106 |
+
$arrAllIPs = GdbcIPUtils::getFormattedIpRangesForDisplay(GdbcBlackListedIpsAdminModule::getInstance()->getOption(GdbcBlackListedIpsAdminModule::OPTION_BLACK_LISTED_IPS));
|
107 |
+
|
108 |
+
$blackListPageNumber = !empty( $_GET['blackListPageNumber'] ) ? absint( sanitize_text_field($_GET['blackListPageNumber']) ) : 1;
|
109 |
+
|
110 |
+
$recordsPerPage = 10;
|
111 |
+
|
112 |
+
$paginationCode = null;
|
113 |
+
|
114 |
+
$arrRecords = array_chunk($arrAllIPs, $recordsPerPage, true);
|
115 |
+
|
116 |
+
if(isset($arrRecords[1]))
|
117 |
+
{
|
118 |
+
$paginationCode = paginate_links(
|
119 |
+
array(
|
120 |
+
'base' => add_query_arg( 'blackListPageNumber', '%#%' ),
|
121 |
+
'format' => '',
|
122 |
+
'prev_text' => __( '«', GoodByeCaptcha::PLUGIN_SLUG ),
|
123 |
+
'next_text' => __( '»', GoodByeCaptcha::PLUGIN_SLUG ),
|
124 |
+
'total' => ceil(count($arrAllIPs)/$recordsPerPage),
|
125 |
+
'current' => $blackListPageNumber
|
126 |
+
)
|
127 |
+
);
|
128 |
+
}
|
129 |
+
|
130 |
+
if(!empty($arrRecords[$blackListPageNumber - 1]))
|
131 |
+
$arrRecords = $arrRecords[$blackListPageNumber - 1];
|
132 |
+
else
|
133 |
+
$arrRecords = $arrAllIPs;
|
134 |
+
|
135 |
+
foreach($arrRecords as $key => $formattedIp)
|
136 |
+
{
|
137 |
+
|
138 |
+
$arrFormattedIp = explode('|', $formattedIp);
|
139 |
+
if(count($arrFormattedIp) != 2)
|
140 |
+
continue;
|
141 |
+
|
142 |
+
$countryCode = sanitize_text_field(MchGdbcIPUtils::getCountryCode($arrFormattedIp[0]));
|
143 |
+
|
144 |
+
$countryName = GoodByeCaptchaUtils::getCountryNameById(GoodByeCaptchaUtils::getCountryIdByCode($countryCode));
|
145 |
+
|
146 |
+
if(empty($countryName))
|
147 |
+
{
|
148 |
+
$countryName = __('Unavailable', GoodByeCaptcha::PLUGIN_SLUG);
|
149 |
+
}
|
150 |
+
|
151 |
+
$rowClass = (($key % 2) == 0) ? 'even' : '';
|
152 |
+
|
153 |
+
echo '<tr class="' . $rowClass . '">';
|
154 |
+
|
155 |
+
echo '<td width="5%">' . $arrFormattedIp[1] . '</td>';
|
156 |
+
echo '<td width="30%">' . strtoupper($arrFormattedIp[0]) . '</td>';
|
157 |
+
echo '<td width="60%">' . $countryName . '</td>';
|
158 |
+
|
159 |
+
?>
|
160 |
+
|
161 |
+
<td style="text-align: right;" width="5%">
|
162 |
+
<form method="post" action="<?php echo $formAction ?>">
|
163 |
+
<?php settings_fields( $this->getSettingGroupId($this->blackListedIpsGroupIndex) );?>
|
164 |
+
<input type="hidden" name="<?php echo $this->getBlackListedIpsInputName();?>" value="<?php echo 'remove-' . $arrFormattedIp[0]?>" />
|
165 |
+
<input type="submit" value="<?php echo __('Remove', GoodByeCaptcha::PLUGIN_SLUG); ?>" class="button" />
|
166 |
+
</form>
|
167 |
+
</td>
|
168 |
+
|
169 |
+
|
170 |
+
|
171 |
+
<?php
|
172 |
+
|
173 |
+
echo '</tr>';
|
174 |
+
|
175 |
+
}
|
176 |
+
|
177 |
+
|
178 |
+
?>
|
179 |
+
|
180 |
+
|
181 |
+
</tbody>
|
182 |
+
</table>
|
183 |
+
|
184 |
+
|
185 |
+
<?php
|
186 |
+
if(!empty($paginationCode))
|
187 |
+
{
|
188 |
+
echo '<div class="postbox-footer clearfix" style="">';
|
189 |
+
echo '<div class="tablenav"><div class="tablenav-pages" style="margin:0">' . $paginationCode . '</div></div></div>';
|
190 |
+
}
|
191 |
+
?>
|
192 |
+
|
193 |
+
|
194 |
+
<div class="postbox-footer clearfix" style="">
|
195 |
+
|
196 |
+
<dl style="width: 48%; float: left; border-right: 1px solid #ddd; padding-right: 15px">
|
197 |
+
<dt><h4 style="margin: 2px 0; border-bottom: 1px solid #ccc;">Accepted IPV4 Formats</h4></dt>
|
198 |
+
<dd style="margin-left: 0">Standard IPV4 format <span style="float: right">123.123.1.1</span></dd>
|
199 |
+
<dd style="margin-left: 0">Standard CIDR Block format <span style="float: right">123.123.1.1/32</span></dd>
|
200 |
+
<dd style="margin-left: 0">Wildcard Range format <span style="float: right">123.123.1.*</span></dd>
|
201 |
+
<dd style="margin-left: 0">Non-Standard Range format <span style="float: right">123.123.1.1 - 123.123.1.10</span></dd>
|
202 |
+
</dl>
|
203 |
+
|
204 |
+
<dl style="width: 50%; float: right;" >
|
205 |
+
<dt><h4 style="margin: 2px 0; border-bottom: 1px solid #ccc;">Accepted IPV6 Formats</h4></dt>
|
206 |
+
<dd style="margin-left: 0">Fully Uncompressed format <span style="float: right">2002:4559:1FE2:0000:0000:0000:4559:1FE2</span></dd>
|
207 |
+
<dd style="margin-left: 0">Standard CIDR Block format <span style="float: right">2002:4559:1FE2::4559:1FE2/128</span></dd>
|
208 |
+
<dd style="margin-left: 0">Uncompressed format <span style="float: right">2002:4559:1FE2:0:0:0:4559:1FE2</span></dd>
|
209 |
+
<dd style="margin-left: 0">Compressed format <span style="float: right">2002:4559:1FE2::4559:1FE2</span></dd>
|
210 |
+
</dl>
|
211 |
+
|
212 |
+
</div>
|
213 |
+
|
214 |
+
|
engine/modules/brute-force/GdbcBruteForceAdminModule.php
ADDED
@@ -0,0 +1,156 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcBruteForceAdminModule extends GdbcBaseAdminModule
|
21 |
+
{
|
22 |
+
CONST OPTION_AUTO_BLOCK_IP = 'AutoBlockIp';
|
23 |
+
CONST OPTION_PREVENT_USER_ENUM = 'PreventUserEnum';
|
24 |
+
CONST OPTION_BLOCK_ANONYMOUS_PROXY = 'AnonymousProxy';
|
25 |
+
CONST OPTION_BLOCK_WEB_ATTACKERS = 'WebAttackers';
|
26 |
+
|
27 |
+
protected function __construct()
|
28 |
+
{
|
29 |
+
parent::__construct();
|
30 |
+
}
|
31 |
+
|
32 |
+
public function getDefaultOptions()
|
33 |
+
{
|
34 |
+
static $arrDefaultSettingOptions = null;
|
35 |
+
if(null !== $arrDefaultSettingOptions)
|
36 |
+
return $arrDefaultSettingOptions;
|
37 |
+
|
38 |
+
$arrDefaultSettingOptions = array(
|
39 |
+
|
40 |
+
self::OPTION_AUTO_BLOCK_IP => array(
|
41 |
+
'Id' => 1,
|
42 |
+
'Value' => NULL,
|
43 |
+
'LabelText' => __('Automatically Block IP Addresses', GoodByeCaptcha::PLUGIN_SLUG),
|
44 |
+
'Description' => __('Automatically block IP Addresses that are brute-forcing your system', GoodByeCaptcha::PLUGIN_SLUG),
|
45 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
|
46 |
+
),
|
47 |
+
|
48 |
+
self::OPTION_PREVENT_USER_ENUM => array(
|
49 |
+
'Id' => 2,
|
50 |
+
'Value' => true,
|
51 |
+
'LabelText' => __('Prevent User Enumeration', GoodByeCaptcha::PLUGIN_SLUG),
|
52 |
+
'Description' => __('Prevents bots from enumerating users by ID in order to find their real username', GoodByeCaptcha::PLUGIN_SLUG),
|
53 |
+
'DisplayText' => __('UserEnumeration', GoodByeCaptcha::PLUGIN_SLUG),
|
54 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
|
55 |
+
),
|
56 |
+
|
57 |
+
|
58 |
+
self::OPTION_BLOCK_WEB_ATTACKERS => array(
|
59 |
+
'Id' => 3,
|
60 |
+
'Value' => NULL,
|
61 |
+
'LabelText' => __('Block Web Attackers IPs', GoodByeCaptcha::PLUGIN_SLUG),
|
62 |
+
'Description' => __('Blocks most dangerous IP addresses involved in brute force attacks, cross-site scripting or SQL injection', GoodByeCaptcha::PLUGIN_SLUG),
|
63 |
+
'DisplayText' => __('Attacker', GoodByeCaptcha::PLUGIN_SLUG),
|
64 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
|
65 |
+
),
|
66 |
+
|
67 |
+
self::OPTION_BLOCK_ANONYMOUS_PROXY => array(
|
68 |
+
'Id' => 4,
|
69 |
+
'Value' => NULL,
|
70 |
+
'LabelText' => __('Block Anonymous Proxy IPs', GoodByeCaptcha::PLUGIN_SLUG),
|
71 |
+
'Description' => __('Blocks most dangerous IP addresses associated with web proxies that shield the originator\'s IP address', GoodByeCaptcha::PLUGIN_SLUG),
|
72 |
+
'DisplayText' => __('Anonymizer', GoodByeCaptcha::PLUGIN_SLUG),
|
73 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
|
74 |
+
),
|
75 |
+
|
76 |
+
);
|
77 |
+
|
78 |
+
return $arrDefaultSettingOptions;
|
79 |
+
|
80 |
+
}
|
81 |
+
|
82 |
+
public function renderModuleSettingsField(array $arrSettingsField)
|
83 |
+
{
|
84 |
+
|
85 |
+
$optionName = key($arrSettingsField);
|
86 |
+
if(null === $optionName || !array_key_exists($optionName, $this->getDefaultOptionsValues()))
|
87 |
+
return;
|
88 |
+
|
89 |
+
parent::renderModuleSettingsField($arrSettingsField);
|
90 |
+
}
|
91 |
+
|
92 |
+
|
93 |
+
public function validateModuleSettingsFields($arrSettingOptions)
|
94 |
+
{
|
95 |
+
$arrSettingOptions = array_map('sanitize_text_field', (array)$arrSettingOptions);
|
96 |
+
|
97 |
+
$this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
|
98 |
+
|
99 |
+
return $arrSettingOptions;
|
100 |
+
|
101 |
+
}
|
102 |
+
|
103 |
+
public function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity)
|
104 |
+
{
|
105 |
+
$attemptEntity->Notes = (array)maybe_unserialize($attemptEntity->Notes);
|
106 |
+
$arrContent = array('table-head-rows' => '', 'table-body-rows' => '');
|
107 |
+
|
108 |
+
$section = null;
|
109 |
+
switch($this->getOptionNameByOptionId($attemptEntity->SectionId))
|
110 |
+
{
|
111 |
+
case self::OPTION_PREVENT_USER_ENUM :
|
112 |
+
$section = __('User Enumeration', GoodByeCaptcha::PLUGIN_SLUG);
|
113 |
+
break;
|
114 |
+
|
115 |
+
default:
|
116 |
+
$section = __('Brute Force', GoodByeCaptcha::PLUGIN_SLUG);
|
117 |
+
break;
|
118 |
+
|
119 |
+
}
|
120 |
+
|
121 |
+
$tableHeadRows = '';
|
122 |
+
$tableBodyRows = '';
|
123 |
+
|
124 |
+
$tableHeadRows .= '<tr>';
|
125 |
+
$tableHeadRows .= '<th colspan="2">' . sprintf(__("%s - Blocked Attempt", GoodByeCaptcha::PLUGIN_SLUG), $section) . '</th>';
|
126 |
+
$tableHeadRows .= '</tr>';
|
127 |
+
|
128 |
+
$tableHeadRows .= '<tr>';
|
129 |
+
$tableHeadRows .= '<th>' . __('Field', GoodByeCaptcha::PLUGIN_SLUG) . '</th>';
|
130 |
+
$tableHeadRows .= '<th>' . __('Value', GoodByeCaptcha::PLUGIN_SLUG) . '</th>';
|
131 |
+
$tableHeadRows .= '</tr>';
|
132 |
+
|
133 |
+
|
134 |
+
foreach($attemptEntity->Notes as $key => $value)
|
135 |
+
{
|
136 |
+
$tableBodyRows .='<tr>';
|
137 |
+
$tableBodyRows .= '<td>' . self::getBlockedContentDisplayableKey($key) . '</td>';
|
138 |
+
$tableBodyRows .= '<td>' . wp_filter_kses(print_r($value, true)) . '</td>';
|
139 |
+
$tableBodyRows .='</tr>';
|
140 |
+
}
|
141 |
+
|
142 |
+
$arrContent['table-head-rows'] = $tableHeadRows;
|
143 |
+
$arrContent['table-body-rows'] = $tableBodyRows;
|
144 |
+
|
145 |
+
return $arrContent;
|
146 |
+
|
147 |
+
}
|
148 |
+
|
149 |
+
public static function getInstance()
|
150 |
+
{
|
151 |
+
static $adminInstance = null;
|
152 |
+
return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
|
153 |
+
}
|
154 |
+
|
155 |
+
|
156 |
+
}
|
engine/modules/brute-force/GdbcBruteForcePublicModule.php
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcBruteForcePublicModule extends GdbcBasePublicModule
|
21 |
+
{
|
22 |
+
private $preventUserEnumHookIndex = null;
|
23 |
+
|
24 |
+
protected function __construct()
|
25 |
+
{
|
26 |
+
parent::__construct();
|
27 |
+
|
28 |
+
if($this->getOption(GdbcBruteForceAdminModule::OPTION_PREVENT_USER_ENUM))
|
29 |
+
{
|
30 |
+
$this->preventUserEnumHookIndex = $this->addActionHook('pre_get_posts', array($this, 'checkUserEnumeration'), 10, 1);
|
31 |
+
}
|
32 |
+
|
33 |
+
}
|
34 |
+
|
35 |
+
public function checkUserEnumeration($wpQuery)
|
36 |
+
{
|
37 |
+
if(!$wpQuery->is_main_query() || !$wpQuery->is_author() || empty($_REQUEST['author']) || !is_numeric($_REQUEST['author']))
|
38 |
+
return;
|
39 |
+
|
40 |
+
$wpQuery->set('author_name', '');
|
41 |
+
|
42 |
+
$this->attemptEntity->SectionId = $this->getOptionIdByOptionName(GdbcBruteForceAdminModule::OPTION_PREVENT_USER_ENUM);
|
43 |
+
$this->attemptEntity->Notes = array('authorid'=>absint($_REQUEST['author']));
|
44 |
+
$this->attemptEntity->ReasonId = GdbcRequestController::REJECT_REASON_USER_ENUMERATION;
|
45 |
+
|
46 |
+
GdbcBruteGuardian::logRejectedAttempt($this->attemptEntity);
|
47 |
+
|
48 |
+
GdbcRequestController::redirectToHomePage();
|
49 |
+
}
|
50 |
+
|
51 |
+
|
52 |
+
/**
|
53 |
+
* @return int
|
54 |
+
*/
|
55 |
+
protected function getModuleId()
|
56 |
+
{
|
57 |
+
return GdbcModulesController::getModuleIdByName(GdbcModulesController::MODULE_BRUTE_FORCE);
|
58 |
+
}
|
59 |
+
|
60 |
+
public static function getInstance()
|
61 |
+
{
|
62 |
+
static $publicInstance = null;
|
63 |
+
return null !== $publicInstance ? $publicInstance : $publicInstance = new self();
|
64 |
+
}
|
65 |
+
|
66 |
+
}
|
engine/modules/email-notifications/GdbcEmailNotificationsAdminModule.php
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcEmailNotificationsAdminModule extends GdbcBaseAdminModule
|
21 |
+
{
|
22 |
+
CONST OPTION_EMAIL_ADDRESS = 'Email';
|
23 |
+
CONST OPTION_TEST_MODE_NOTIFICATION = 'TestModeNotification';
|
24 |
+
CONST OPTION_BRUTE_FORCE_ATTACK_DETECTED = 'IsUnderAttack';
|
25 |
+
|
26 |
+
protected function __construct()
|
27 |
+
{
|
28 |
+
parent::__construct();
|
29 |
+
}
|
30 |
+
|
31 |
+
public function getDefaultOptions()
|
32 |
+
{
|
33 |
+
static $arrDefaultSettingOptions = null;
|
34 |
+
if(null !== $arrDefaultSettingOptions)
|
35 |
+
return $arrDefaultSettingOptions;
|
36 |
+
|
37 |
+
$arrDefaultSettingOptions = array(
|
38 |
+
|
39 |
+
self::OPTION_BRUTE_FORCE_ATTACK_DETECTED => array(
|
40 |
+
'Value' => true,
|
41 |
+
'LabelText' => __('Brute Force Attack Detected', GoodByeCaptcha::PLUGIN_SLUG),
|
42 |
+
'Description' => __('A notification email will be sent when a brute force attack is detected', GoodByeCaptcha::PLUGIN_SLUG),
|
43 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_CHECKBOX
|
44 |
+
),
|
45 |
+
|
46 |
+
self::OPTION_EMAIL_ADDRESS => array(
|
47 |
+
'Value' => MchGdbcWpUtils::getAdminEmailAddress(),
|
48 |
+
'LabelText' => __('Administrator Email Address', GoodByeCaptcha::PLUGIN_SLUG),
|
49 |
+
'Description' => __('The email address where GoodBye Captcha will send notifications', GoodByeCaptcha::PLUGIN_SLUG),
|
50 |
+
'InputType' => MchGdbcHtmlUtils::FORM_ELEMENT_INPUT_TEXT
|
51 |
+
),
|
52 |
+
|
53 |
+
);
|
54 |
+
|
55 |
+
return $arrDefaultSettingOptions;
|
56 |
+
|
57 |
+
}
|
58 |
+
|
59 |
+
|
60 |
+
public function renderModuleSettingsSectionHeader(array $arrSectionInfo)
|
61 |
+
{
|
62 |
+
echo '<h3>' . __('Email Notifications Settings', GoodByeCaptcha::PLUGIN_SLUG) . '</h3><hr />';
|
63 |
+
}
|
64 |
+
|
65 |
+
public function renderModuleSettingsField(array $arrSettingsField)
|
66 |
+
{
|
67 |
+
parent::renderModuleSettingsField($arrSettingsField);
|
68 |
+
}
|
69 |
+
|
70 |
+
|
71 |
+
public function validateModuleSettingsFields($arrSettingOptions)
|
72 |
+
{
|
73 |
+
|
74 |
+
$arrSettingOptions = array_map('sanitize_text_field', (array)$arrSettingOptions);
|
75 |
+
if(!empty($arrSettingOptions[self::OPTION_EMAIL_ADDRESS]))
|
76 |
+
{
|
77 |
+
$arrSettingOptions[self::OPTION_EMAIL_ADDRESS] = sanitize_email($arrSettingOptions[self::OPTION_EMAIL_ADDRESS]);
|
78 |
+
if(false === is_email($arrSettingOptions[self::OPTION_EMAIL_ADDRESS])){
|
79 |
+
$this->registerErrorMessage(__('Please provide a valid email address!', GoodByeCaptcha::PLUGIN_SLUG));
|
80 |
+
unset($arrSettingOptions[self::OPTION_EMAIL_ADDRESS]);
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
$this->registerSuccessMessage(__('Your changes were successfully saved!', GoodByeCaptcha::PLUGIN_SLUG));
|
85 |
+
|
86 |
+
return $arrSettingOptions;
|
87 |
+
|
88 |
+
}
|
89 |
+
|
90 |
+
public static function getInstance()
|
91 |
+
{
|
92 |
+
static $adminInstance = null;
|
93 |
+
return null !== $adminInstance ? $adminInstance : $adminInstance = new self();
|
94 |
+
}
|
95 |
+
|
96 |
+
public function getFormattedBlockedContent(GdbcAttemptEntity $attemptEntity)
|
97 |
+
{
|
98 |
+
return null;
|
99 |
+
}
|
100 |
+
|
101 |
+
}
|
engine/modules/email-notifications/GdbcEmailNotificationsPublicModule.php
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright (C) 2014 Mihai Chelaru
|
4 |
+
*
|
5 |
+
* This program is free software; you can redistribute it and/or
|
6 |
+
* modify it under the terms of the GNU General Public License
|
7 |
+
* as published by the Free Software Foundation; either version 2
|
8 |
+
* of the License, or (at your option) any later version.
|
9 |
+
*
|
10 |
+
* This program is distributed in the hope that it will be useful,
|
11 |
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13 |
+
* GNU General Public License for more details.
|
14 |
+
*
|
15 |
+
* You should have received a copy of the GNU General Public License
|
16 |
+
* along with this program; if not, write to the Free Software
|
17 |
+
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
18 |
+
*/
|
19 |
+
|
20 |
+
class GdbcEmailNotificationsPublicModule extends GdbcBasePublicModule
|
21 |
+
{
|
22 |
+
|
23 |
+
//private $layoutTemplateFilePath = null;
|
24 |
+
//private $isHtmlFormattedEmail = false;
|
25 |
+
|
26 |
+
//public $AddressToSend = null;
|
27 |
+
|