├── COPYING
├── FAQ
├── README.md
├── TODO
├── docs
├── Makefile
├── bugs.rst
├── changes.rst
├── conf.py
├── configuration.rst
├── developer.rst
├── faq.rst
├── index.rst
├── installation
│ ├── debian.rst
│ ├── gentoo.rst
│ ├── index.rst
│ ├── initial_config.rst
│ ├── mod_asn.rst
│ ├── opensuse.rst
│ ├── prerequirements.rst
│ ├── source.rst
│ └── troubleshooting.rst
├── intro.rst
├── mirrors.rst
├── platforms.rst
├── tuning.rst
├── upgrading.rst
└── usecases.rst
├── mb
├── famfamfam_flag_icons
│ ├── gif
│ │ ├── ad.gif
│ │ ├── ae.gif
│ │ ├── af.gif
│ │ ├── ag.gif
│ │ ├── ai.gif
│ │ ├── al.gif
│ │ ├── am.gif
│ │ ├── an.gif
│ │ ├── ao.gif
│ │ ├── ar.gif
│ │ ├── as.gif
│ │ ├── at.gif
│ │ ├── au.gif
│ │ ├── aw.gif
│ │ ├── ax.gif
│ │ ├── az.gif
│ │ ├── ba.gif
│ │ ├── bb.gif
│ │ ├── bd.gif
│ │ ├── be.gif
│ │ ├── bf.gif
│ │ ├── bg.gif
│ │ ├── bh.gif
│ │ ├── bi.gif
│ │ ├── bj.gif
│ │ ├── bm.gif
│ │ ├── bn.gif
│ │ ├── bo.gif
│ │ ├── br.gif
│ │ ├── bs.gif
│ │ ├── bt.gif
│ │ ├── bv.gif
│ │ ├── bw.gif
│ │ ├── by.gif
│ │ ├── bz.gif
│ │ ├── ca.gif
│ │ ├── catalonia.gif
│ │ ├── cc.gif
│ │ ├── cd.gif
│ │ ├── cf.gif
│ │ ├── cg.gif
│ │ ├── ch.gif
│ │ ├── ci.gif
│ │ ├── ck.gif
│ │ ├── cl.gif
│ │ ├── cm.gif
│ │ ├── cn.gif
│ │ ├── co.gif
│ │ ├── cr.gif
│ │ ├── cs.gif
│ │ ├── cu.gif
│ │ ├── cv.gif
│ │ ├── cx.gif
│ │ ├── cy.gif
│ │ ├── cz.gif
│ │ ├── de.gif
│ │ ├── dj.gif
│ │ ├── dk.gif
│ │ ├── dm.gif
│ │ ├── do.gif
│ │ ├── dz.gif
│ │ ├── ec.gif
│ │ ├── ee.gif
│ │ ├── eg.gif
│ │ ├── eh.gif
│ │ ├── england.gif
│ │ ├── er.gif
│ │ ├── es.gif
│ │ ├── et.gif
│ │ ├── europeanunion.gif
│ │ ├── fam.gif
│ │ ├── fi.gif
│ │ ├── fj.gif
│ │ ├── fk.gif
│ │ ├── fm.gif
│ │ ├── fo.gif
│ │ ├── fr.gif
│ │ ├── ga.gif
│ │ ├── gb.gif
│ │ ├── gd.gif
│ │ ├── ge.gif
│ │ ├── gf.gif
│ │ ├── gh.gif
│ │ ├── gi.gif
│ │ ├── gl.gif
│ │ ├── gm.gif
│ │ ├── gn.gif
│ │ ├── gp.gif
│ │ ├── gq.gif
│ │ ├── gr.gif
│ │ ├── gs.gif
│ │ ├── gt.gif
│ │ ├── gu.gif
│ │ ├── gw.gif
│ │ ├── gy.gif
│ │ ├── hk.gif
│ │ ├── hm.gif
│ │ ├── hn.gif
│ │ ├── hr.gif
│ │ ├── ht.gif
│ │ ├── hu.gif
│ │ ├── id.gif
│ │ ├── ie.gif
│ │ ├── il.gif
│ │ ├── in.gif
│ │ ├── io.gif
│ │ ├── iq.gif
│ │ ├── ir.gif
│ │ ├── is.gif
│ │ ├── it.gif
│ │ ├── jm.gif
│ │ ├── jo.gif
│ │ ├── jp.gif
│ │ ├── ke.gif
│ │ ├── kg.gif
│ │ ├── kh.gif
│ │ ├── ki.gif
│ │ ├── km.gif
│ │ ├── kn.gif
│ │ ├── kp.gif
│ │ ├── kr.gif
│ │ ├── kw.gif
│ │ ├── ky.gif
│ │ ├── kz.gif
│ │ ├── la.gif
│ │ ├── lb.gif
│ │ ├── lc.gif
│ │ ├── li.gif
│ │ ├── lk.gif
│ │ ├── lr.gif
│ │ ├── ls.gif
│ │ ├── lt.gif
│ │ ├── lu.gif
│ │ ├── lv.gif
│ │ ├── ly.gif
│ │ ├── ma.gif
│ │ ├── mc.gif
│ │ ├── md.gif
│ │ ├── me.gif
│ │ ├── mg.gif
│ │ ├── mh.gif
│ │ ├── mk.gif
│ │ ├── ml.gif
│ │ ├── mm.gif
│ │ ├── mn.gif
│ │ ├── mo.gif
│ │ ├── mp.gif
│ │ ├── mq.gif
│ │ ├── mr.gif
│ │ ├── ms.gif
│ │ ├── mt.gif
│ │ ├── mu.gif
│ │ ├── mv.gif
│ │ ├── mw.gif
│ │ ├── mx.gif
│ │ ├── my.gif
│ │ ├── mz.gif
│ │ ├── na.gif
│ │ ├── nc.gif
│ │ ├── ne.gif
│ │ ├── nf.gif
│ │ ├── ng.gif
│ │ ├── ni.gif
│ │ ├── nl.gif
│ │ ├── no.gif
│ │ ├── np.gif
│ │ ├── nr.gif
│ │ ├── nu.gif
│ │ ├── nz.gif
│ │ ├── om.gif
│ │ ├── pa.gif
│ │ ├── pe.gif
│ │ ├── pf.gif
│ │ ├── pg.gif
│ │ ├── ph.gif
│ │ ├── pk.gif
│ │ ├── pl.gif
│ │ ├── pm.gif
│ │ ├── pn.gif
│ │ ├── pr.gif
│ │ ├── ps.gif
│ │ ├── pt.gif
│ │ ├── pw.gif
│ │ ├── py.gif
│ │ ├── qa.gif
│ │ ├── re.gif
│ │ ├── ro.gif
│ │ ├── rs.gif
│ │ ├── ru.gif
│ │ ├── rw.gif
│ │ ├── sa.gif
│ │ ├── sb.gif
│ │ ├── sc.gif
│ │ ├── scotland.gif
│ │ ├── sd.gif
│ │ ├── se.gif
│ │ ├── sg.gif
│ │ ├── sh.gif
│ │ ├── si.gif
│ │ ├── sj.gif
│ │ ├── sk.gif
│ │ ├── sl.gif
│ │ ├── sm.gif
│ │ ├── sn.gif
│ │ ├── so.gif
│ │ ├── sr.gif
│ │ ├── st.gif
│ │ ├── sv.gif
│ │ ├── sy.gif
│ │ ├── sz.gif
│ │ ├── tc.gif
│ │ ├── td.gif
│ │ ├── tf.gif
│ │ ├── tg.gif
│ │ ├── th.gif
│ │ ├── tj.gif
│ │ ├── tk.gif
│ │ ├── tl.gif
│ │ ├── tm.gif
│ │ ├── tn.gif
│ │ ├── to.gif
│ │ ├── tr.gif
│ │ ├── tt.gif
│ │ ├── tv.gif
│ │ ├── tw.gif
│ │ ├── tz.gif
│ │ ├── ua.gif
│ │ ├── ug.gif
│ │ ├── um.gif
│ │ ├── us.gif
│ │ ├── uy.gif
│ │ ├── uz.gif
│ │ ├── va.gif
│ │ ├── vc.gif
│ │ ├── ve.gif
│ │ ├── vg.gif
│ │ ├── vi.gif
│ │ ├── vn.gif
│ │ ├── vu.gif
│ │ ├── wales.gif
│ │ ├── wf.gif
│ │ ├── ws.gif
│ │ ├── ye.gif
│ │ ├── yt.gif
│ │ ├── za.gif
│ │ ├── zm.gif
│ │ └── zw.gif
│ ├── png
│ │ ├── ad.png
│ │ ├── ae.png
│ │ ├── af.png
│ │ ├── ag.png
│ │ ├── ai.png
│ │ ├── al.png
│ │ ├── am.png
│ │ ├── an.png
│ │ ├── ao.png
│ │ ├── ar.png
│ │ ├── as.png
│ │ ├── at.png
│ │ ├── au.png
│ │ ├── aw.png
│ │ ├── ax.png
│ │ ├── az.png
│ │ ├── ba.png
│ │ ├── bb.png
│ │ ├── bd.png
│ │ ├── be.png
│ │ ├── bf.png
│ │ ├── bg.png
│ │ ├── bh.png
│ │ ├── bi.png
│ │ ├── bj.png
│ │ ├── bm.png
│ │ ├── bn.png
│ │ ├── bo.png
│ │ ├── br.png
│ │ ├── bs.png
│ │ ├── bt.png
│ │ ├── bv.png
│ │ ├── bw.png
│ │ ├── by.png
│ │ ├── bz.png
│ │ ├── ca.png
│ │ ├── catalonia.png
│ │ ├── cc.png
│ │ ├── cd.png
│ │ ├── cf.png
│ │ ├── cg.png
│ │ ├── ch.png
│ │ ├── ci.png
│ │ ├── ck.png
│ │ ├── cl.png
│ │ ├── cm.png
│ │ ├── cn.png
│ │ ├── co.png
│ │ ├── cr.png
│ │ ├── cs.png
│ │ ├── cu.png
│ │ ├── cv.png
│ │ ├── cx.png
│ │ ├── cy.png
│ │ ├── cz.png
│ │ ├── de.png
│ │ ├── dj.png
│ │ ├── dk.png
│ │ ├── dm.png
│ │ ├── do.png
│ │ ├── dz.png
│ │ ├── ec.png
│ │ ├── ee.png
│ │ ├── eg.png
│ │ ├── eh.png
│ │ ├── england.png
│ │ ├── er.png
│ │ ├── es.png
│ │ ├── et.png
│ │ ├── europeanunion.png
│ │ ├── fam.png
│ │ ├── fi.png
│ │ ├── fj.png
│ │ ├── fk.png
│ │ ├── fm.png
│ │ ├── fo.png
│ │ ├── fr.png
│ │ ├── ga.png
│ │ ├── gb.png
│ │ ├── gd.png
│ │ ├── ge.png
│ │ ├── gf.png
│ │ ├── gh.png
│ │ ├── gi.png
│ │ ├── gl.png
│ │ ├── gm.png
│ │ ├── gn.png
│ │ ├── gp.png
│ │ ├── gq.png
│ │ ├── gr.png
│ │ ├── gs.png
│ │ ├── gt.png
│ │ ├── gu.png
│ │ ├── gw.png
│ │ ├── gy.png
│ │ ├── hk.png
│ │ ├── hm.png
│ │ ├── hn.png
│ │ ├── hr.png
│ │ ├── ht.png
│ │ ├── hu.png
│ │ ├── id.png
│ │ ├── ie.png
│ │ ├── il.png
│ │ ├── in.png
│ │ ├── io.png
│ │ ├── iq.png
│ │ ├── ir.png
│ │ ├── is.png
│ │ ├── it.png
│ │ ├── jm.png
│ │ ├── jo.png
│ │ ├── jp.png
│ │ ├── ke.png
│ │ ├── kg.png
│ │ ├── kh.png
│ │ ├── ki.png
│ │ ├── km.png
│ │ ├── kn.png
│ │ ├── kp.png
│ │ ├── kr.png
│ │ ├── kw.png
│ │ ├── ky.png
│ │ ├── kz.png
│ │ ├── la.png
│ │ ├── lb.png
│ │ ├── lc.png
│ │ ├── li.png
│ │ ├── lk.png
│ │ ├── lr.png
│ │ ├── ls.png
│ │ ├── lt.png
│ │ ├── lu.png
│ │ ├── lv.png
│ │ ├── ly.png
│ │ ├── ma.png
│ │ ├── mc.png
│ │ ├── md.png
│ │ ├── me.png
│ │ ├── mg.png
│ │ ├── mh.png
│ │ ├── mk.png
│ │ ├── ml.png
│ │ ├── mm.png
│ │ ├── mn.png
│ │ ├── mo.png
│ │ ├── mp.png
│ │ ├── mq.png
│ │ ├── mr.png
│ │ ├── ms.png
│ │ ├── mt.png
│ │ ├── mu.png
│ │ ├── mv.png
│ │ ├── mw.png
│ │ ├── mx.png
│ │ ├── my.png
│ │ ├── mz.png
│ │ ├── na.png
│ │ ├── nc.png
│ │ ├── ne.png
│ │ ├── nf.png
│ │ ├── ng.png
│ │ ├── ni.png
│ │ ├── nl.png
│ │ ├── no.png
│ │ ├── np.png
│ │ ├── nr.png
│ │ ├── nu.png
│ │ ├── nz.png
│ │ ├── om.png
│ │ ├── pa.png
│ │ ├── pe.png
│ │ ├── pf.png
│ │ ├── pg.png
│ │ ├── ph.png
│ │ ├── pk.png
│ │ ├── pl.png
│ │ ├── pm.png
│ │ ├── pn.png
│ │ ├── pr.png
│ │ ├── ps.png
│ │ ├── pt.png
│ │ ├── pw.png
│ │ ├── py.png
│ │ ├── qa.png
│ │ ├── re.png
│ │ ├── ro.png
│ │ ├── rs.png
│ │ ├── ru.png
│ │ ├── rw.png
│ │ ├── sa.png
│ │ ├── sb.png
│ │ ├── sc.png
│ │ ├── scotland.png
│ │ ├── sd.png
│ │ ├── se.png
│ │ ├── sg.png
│ │ ├── sh.png
│ │ ├── si.png
│ │ ├── sj.png
│ │ ├── sk.png
│ │ ├── sl.png
│ │ ├── sm.png
│ │ ├── sn.png
│ │ ├── so.png
│ │ ├── sr.png
│ │ ├── st.png
│ │ ├── sv.png
│ │ ├── sy.png
│ │ ├── sz.png
│ │ ├── tc.png
│ │ ├── td.png
│ │ ├── tf.png
│ │ ├── tg.png
│ │ ├── th.png
│ │ ├── tj.png
│ │ ├── tk.png
│ │ ├── tl.png
│ │ ├── tm.png
│ │ ├── tn.png
│ │ ├── to.png
│ │ ├── tr.png
│ │ ├── tt.png
│ │ ├── tv.png
│ │ ├── tw.png
│ │ ├── tz.png
│ │ ├── ua.png
│ │ ├── ug.png
│ │ ├── um.png
│ │ ├── us.png
│ │ ├── uy.png
│ │ ├── uz.png
│ │ ├── va.png
│ │ ├── vc.png
│ │ ├── ve.png
│ │ ├── vg.png
│ │ ├── vi.png
│ │ ├── vn.png
│ │ ├── vu.png
│ │ ├── wales.png
│ │ ├── wf.png
│ │ ├── ws.png
│ │ ├── ye.png
│ │ ├── yt.png
│ │ ├── za.png
│ │ ├── zm.png
│ │ └── zw.png
│ └── readme.txt
├── mb.py
├── mb
│ ├── __init__.py
│ ├── asn.py
│ ├── conf.py
│ ├── conn.py
│ ├── core.py
│ ├── crawl.py
│ ├── crawlers
│ │ ├── __init__.py
│ │ ├── ftp.py
│ │ ├── http.py
│ │ └── rsync.py
│ ├── dbmaint.py
│ ├── exports.py
│ ├── filelist.py
│ ├── files.py
│ ├── geoip.py
│ ├── hashes.py
│ ├── mberr.py
│ ├── mirrorlists.py
│ ├── randomfile.py
│ ├── testmirror.py
│ ├── timestamps.py
│ └── util.py
├── setup.py
└── zsyncmodule.c
├── mirrorprobe
└── mirrorprobe.py
├── mod_autoindex_mb
├── INSTALL
├── NOTICE
├── mod_autoindex.c.patch
└── mod_autoindex_mb.c
├── mod_mirrorbrain
├── mod_dbd.conf
├── mod_memcache.conf
├── mod_mirrorbrain.c
└── mod_mirrorbrain.conf
├── mod_stats
├── README
├── TODO
├── downloadstats
│ ├── __init__.py
│ ├── manage.py
│ ├── settings.py.dist
│ ├── stats
│ │ ├── __init__.py
│ │ ├── admin.py
│ │ ├── models.py
│ │ ├── urls.py
│ │ └── views.py
│ └── urls.py
├── mod_dbd.conf
├── mod_stats.c
├── mod_stats.conf
└── tools
│ ├── dlcount.py
│ ├── go-oo.conf
│ ├── ooo.conf
│ ├── tdf.conf
│ └── xbmc.conf
├── sql
├── initialdata-postgresql.sql
├── migrations
│ └── schema-postgresql-upgrade-2.6-2.7.sql
└── schema-postgresql.sql
└── tools
├── Makefile
├── README
├── bdecode
├── create_timestamp
├── geoip-lite-update
├── geoiplookup_city.c
├── geoiplookup_continent.c
├── mirrorprobe-logrotate
├── null-rsync
├── null-rsync.1
├── null-rsync.1.html
├── null-rsync.1.ronn
├── push2mirrors
├── rsyncinfo
├── rsyncusers
├── rsyncusers.sh
└── scanner.pl
/FAQ:
--------------------------------------------------------------------------------
1 | The issues listed in this file should be moved into the main documentation.
2 | http://mirrorbrain.org/faq/ has answers to some more general questions.
3 |
4 |
5 |
6 |
7 | Q: How often does the scan take place? What I am wondering is; if I chose to
8 | delete something, how long before the distribution server sees it? I
9 | would not want anyone to get an error when they try to download
10 | something.
11 |
12 | A: Good question. For now, the "best" is to send a note that one is going to
13 | delete something... the master site can then disable redirection to the
14 | mirror, and re-enable it after a scan once they are done...
15 |
16 | A brute-force approach would be to make the server return a 404, or take it
17 | offline for some minutes, because every (e.g.) 5 minutes the redirector
18 | checks with a request to '/' that the host is alive, and disables
19 | redirection if that returns an error.
20 | Yes, too ugly.
21 |
22 | The plan is, to provide admin access to the redirector database, so
23 | mirrors could
24 | * disable redirection themselves,
25 | * trigger a scan, and re-enable it
26 | * maybe even mark parts of the tree as deleted in the database, so
27 | they can safely delete them without further action required.
28 |
29 | This could possibly solved to a satisfactory degree by more frequent
30 | scanning, of random files, basically simulating a (very light) workload.
31 |
32 |
33 |
34 | Q: What does "zrkadlo" mean?
35 | A: mod_zrkadlo was the previous name of mod_mirrorbrain. "zrkadlo" is a word
36 | found when travelling in Slovakia in 2006. 'zrkadlo' is Slovakian for 'mirror',
37 | and comprises about 33% of my Slovakian vocabulary :)
38 |
39 | Here is a nice illustration: http://sk.wikiquote.org/wiki/Zrkadlo
40 |
41 |
42 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # mirrorbrain
2 |
3 | This code used to live in Subversion so far, hosted on mirrorbrain.org. Maybe it's time to experiment with moving to GitHub.
4 | *poeml, Mon 11 May 2015 23:06:47 CEST*
5 |
--------------------------------------------------------------------------------
/TODO:
--------------------------------------------------------------------------------
1 | This file is relatively obsolete. Issues are tracked in the issue tracker
2 | meanwhile, which can be found here:
3 | http://mirrorbrain.org/issues
4 |
5 | Missing features:
6 |
7 | * mb probefile: follow redirects. Testcase:
8 | http://distro.ibiblio.org/pub/linux/distributions/opensuse/factory/iso/openSUSE-NET-i586-Build0138-Media.iso
9 | which "blindly" redirects to an FTP server (by URL rewriting), but the file isn't there.
10 | see http://diveintopython.org/http_web_services/redirects.html for some ideas/details
11 |
12 | * mirrorprobe: does it deal with FTP urls entered as baseurl (which is meant for HTTP)?
13 |
14 | * make MirrorBrainExcludeNetwork work by prefix match, instead of simple string
15 | prefix comparison using apr_ipsubnet_create() and apr_ipsubnet_test() as
16 | mod_authz_host does?
17 |
18 | * make installation easier, by providing Makefiles, and a setup.py for the Python module.
19 |
20 |
21 | Improvements:
22 |
23 | * rewrite debugLog(r, cfg, ...) as macro which checks for cfg->debug==1 before
24 | caling ebugLog()
25 |
26 | * check whether the maxconnections metalink attribute should be included, so that
27 | aria2c downloads from more than one server even when every server has a distinct
28 | preference value.
29 |
30 |
31 | * ?mirrorlist mirror lists: set Vary header on X-AS?
32 | make it more cacheable?
33 | Cf. http://redbot.org/?uri=http%3A%2F%2Fdownload.opensuse.org%2Frepositories%2FApache%2FFedora_10%2FApache.repo%3Fmirrorlist
34 | Metalinks:
35 | make them less cacheable?
36 |
37 | * check if the Vary header on Accept is added on all requests!
38 |
39 | Further ideas:
40 |
41 | * evaluate if it makes sense to memcache database query results, which may not be
42 | practicable for all objects, but for some particular objects, like those with
43 | mime type application/x-cd-image. They should not be cached for a significant
44 | amount of time, but a few minutes shouldn't be a problem.
45 | As a key for the memcache object, one could use the label of the prepared SQL
46 | statement combined with the filename.
47 |
48 | * stickyness of (large) files to certain mirrors, to make better use of buffer caches?
49 |
50 | * collect statistics on number and volume (cumulated file sizes) of redirects
51 | for mod_status, show per mirror identifier since last restart
52 |
53 |
--------------------------------------------------------------------------------
/docs/developer.rst:
--------------------------------------------------------------------------------
1 |
2 | Documentation for Developers
3 | ============================
4 |
5 |
6 | If you are contributing to the MirrorBrain project, please read this first.
7 |
8 |
9 | Participating in the community
10 | ------------------------------
11 |
12 | The community exists mainly through mailing lists and a Subversion repository.
13 | To participate:
14 |
15 | Go to http://mirrorbrain.org/communication/ and join the "mirrorbrain",
16 | "mirrorbrain-commits", and "mirrorbrain-announce" mailing lists. The dev list,
17 | "mirrorbrain", is where almost all discussion takes place. All development
18 | questions should go there, though you might want to check the list archives
19 | first. The "mirrorbrain-commits" list receives automated commit emails.
20 |
21 | Get a copy of the latest development sources from
22 | http://svn.mirrorbrain.org/svn/mirrorbrain/trunk/. New development always
23 | takes place on trunk. Bugfixes, enhancements, and new features might be
24 | backported from there to the various release branches.
25 |
26 | How to work on the documentation is described in :ref:`hacking_the_docs`.
27 |
28 |
29 | .. TODO
30 | Hacking on the apache modules
31 | -----------------------------
32 |
33 | To be written.
34 |
35 |
36 | Writing extensions for the Python module
37 | ----------------------------------------
38 |
39 | To be written.
40 |
41 |
42 | Debugging notes
43 | ---------------
44 |
45 | To be written.
46 |
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | .. MirrorBrain documentation master file, created by
2 | sphinx-quickstart on Tue Jul 7 20:18:43 2009.
3 | You can adapt this file completely to your liking, but it should at least
4 | contain the root `toctree` directive.
5 |
6 | Table of Contents
7 | =======================================
8 | :Release: |version|
9 | :Date: |today|
10 |
11 | .. toctree::
12 |
13 | intro
14 | faq
15 | platforms
16 | installation/index
17 | mirrors
18 | configuration
19 | usecases
20 | tuning
21 | upgrading
22 | developer
23 | bugs
24 | changes
25 |
26 | .. configuration_reference
27 |
28 | Indices and tables
29 | ==================
30 |
31 | * :ref:`genindex`
32 | * :ref:`modindex`
33 |
34 |
--------------------------------------------------------------------------------
/docs/installation/index.rst:
--------------------------------------------------------------------------------
1 | Installation
2 | ============
3 |
4 | .. toctree::
5 | :glob:
6 |
7 | prerequirements
8 | source
9 | opensuse
10 | debian
11 | gentoo
12 | mod_asn
13 | initial_config
14 | troubleshooting
15 |
16 |
--------------------------------------------------------------------------------
/docs/installation/mod_asn.rst:
--------------------------------------------------------------------------------
1 |
2 | .. _installing_mod_asn:
3 |
4 | Installing mod_asn
5 | ------------------
6 |
7 | `mod_asn `_ is an optional extension for
8 | MirrorBrain. It is not required.
9 |
10 | mod_asn allows a refined mirror selection upon certain network characteristics.
11 |
12 | *Without* mod_asn, MirrorBrain selects an appropriate mirror by geolocation
13 | through the GeoIP database. Thus, the client gets his download from a mirror
14 | within the same country, or if that isn't possible from a mirror within the
15 | same continent at least. That's often all that you need.
16 |
17 | *With* mod_asn, MirrorBrain additionally looks at the network prefix that the
18 | client's IP address is contained in, and the autonomous system (AS) that it
19 | belongs to, and (if possible) matches that to the networks that the mirrors
20 | live in. This can be useful in the following scenarios:
21 |
22 | - You have a lot of mirrors - so many, that there is a chance that a client
23 | might have a mirror on his own network. mod_asn will find it by matching the
24 | AS and network prefix. For instance, if there's a large ISP who run a
25 | mirror, and they probably have a significant number of downloaders among
26 | their customers, it is generally desirable to send them to their ISPs mirror,
27 | instead of somewhere else.
28 |
29 | On the contrary, if such "network locality" does not exist, there is no
30 | reason to look up the network prefix or autonomous system and match them to
31 | the mirrors. For instance, say you have exactly one US mirror, one in India,
32 | and one in Germany; then GeoIP is good enough to assign the clients to their
33 | closest mirror simply by looking at the client's country.
34 |
35 | - You have a certain mirror that has a lot of users on the same network, and
36 | you want to make sure that those clients all get sent to that mirror, and not
37 | just to *any* mirror in the same country (what GeoIP alone would do).
38 |
39 | - You have a certain mirror that doesn't want to get requests from any network
40 | other than its own. Only local traffic is wanted, by policy. MirrorBrain
41 | knows which clients are "local", and you set a flag in the mirror's config
42 | (``prefixOnly`` or ``asOnly``) which tells MirrorBrain that the mirror should
43 | not get any other traffic. The mirrors will be happy to know about this
44 | possibility.
45 |
46 | To install mod_asn, refer to the `its documentation`__.
47 |
48 | __ /mod_asn/docs/
49 |
50 |
51 |
--------------------------------------------------------------------------------
/docs/installation/opensuse.rst:
--------------------------------------------------------------------------------
1 |
2 |
3 | Installation on openSUSE Linux or SLE
4 | =====================================
5 |
6 | Adding package repositories
7 | ---------------------------
8 |
9 | Add the needed repositories, using the subdirectory that matches your
10 | distribution version:
11 |
12 | * http://download.opensuse.org/repositories/Apache:/MirrorBrain/
13 | * http://download.opensuse.org/repositories/devel:/languages:/python/
14 | * http://download.opensuse.org/repositories/server:/database:/postgresql/
15 |
16 | You can do this via commandline (we are using openSUSE 13.1 in our example)::
17 |
18 | zypper addrepo --refresh http://download.opensuse.org/repositories/Apache:/MirrorBrain/Apache_openSUSE_13.1 Apache:MirrorBrain
19 | zypper addrepo --refresh http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_13.1 devel:languages:python
20 | zypper addrepo --refresh http://download.opensuse.org/repositories/server:/database:/postgresql/openSUSE_13.1 server:database:postgresql
21 |
22 |
23 | Installing the MirrorBrain packages
24 | -----------------------------------
25 |
26 | Here's a list of packages needed to have one host running the database and the
27 | redirector:
28 |
29 | apache2 apache2-mod_asn apache2-mod_geoip apache2-mod_mirrorbrain
30 | apache2-mod_form apache2-worker GeoIP libapr-util1-dbd-pgsql
31 | libGeoIP1 mirrorbrain mirrorbrain-scanner mirrorbrain-tools
32 | perl-Config-IniFiles perl-DBD-Pg perl-Digest-MD4 perl-libwww-perl perl-TimeDate
33 | postgresql postgresql-ip4r postgresql-server python-cmdln python-psycopg2
34 | python-SQLObject python-FormEncode
35 |
36 | .. note:: If the web server is set up on a separate host than the database
37 | server, the web server needs only the package libapr-util1-dbd-pgsql
38 | and no other postgresql* packages.
39 |
40 | You can install the packages via the following commandline::
41 |
42 | zypper install apache2-worker \
43 | apache2-mod_asn apache2-mod_mirrorbrain \
44 | postgresql-server postgresql-ip4r \
45 | mirrorbrain mirrorbrain-scanner mirrorbrain-tools
46 |
47 | The packages not mentioned in this commandline are drawn in via package
48 | dependencies.
49 |
50 |
51 | Next steps
52 | ----------
53 |
54 | From here, follow on with :ref:`initial_configuration`.
55 |
--------------------------------------------------------------------------------
/docs/installation/troubleshooting.rst:
--------------------------------------------------------------------------------
1 |
2 | Troubleshooting
3 | ---------------
4 |
5 | If Apache doesn't start, or anything else seems wrong, make sure to check
6 | Apache's error_log. It usually points into the right direction.
7 |
8 | A general note about Apache configuration which might be in order. With most
9 | config directives, it is important to pay attention where to put them - the
10 | order does not matter, but the context does. There is the concept of directory
11 | contexts and vhost contexts, which must not be overlooked. Things can be
12 | "global", or inside a container, or within a
13 | container.
14 |
15 | This matters because Apache applies the config recursively onto subdirectories,
16 | and for each request it does a "merge" of possibly overlapping directives.
17 | Settings in vhost context are merged only when the server forks, while settings
18 | in directory context are merged for each request. This is also the reason why
19 | some of mod_asn's config directives are programmed to be used in one or the
20 | other context, for performance reasons.
21 |
22 | The install docs you are reading attempt to always point out in which context
23 | the directives belong.
24 |
25 | .. note:: To get help, please subscribe to the mirrorbrain mailing list, see
26 | http://mirrorbrain.org/communication . Questions can be answered
27 | there, and all kind of feedback is appreciated.
28 |
29 | .. note:: Bugs should be reported via http://mirrorbrain.org/issues/ or via the
30 | mailing list.
31 |
32 |
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ad.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ad.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ae.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ae.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/af.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/af.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ag.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ag.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ai.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ai.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/al.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/al.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/am.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/am.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/an.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/an.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ao.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ao.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ar.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/as.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/as.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/at.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/at.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/au.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/au.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/aw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/aw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ax.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ax.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/az.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/az.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ba.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ba.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bb.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bb.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bd.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bd.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/be.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/be.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bh.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bi.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bj.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bj.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bo.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/br.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/br.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bs.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bv.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bv.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/by.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/by.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/bz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ca.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ca.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/catalonia.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/catalonia.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cd.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cd.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ch.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ch.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ci.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ci.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ck.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ck.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cl.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/co.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/co.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cs.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cv.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cv.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cx.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cx.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cy.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cy.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/cz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/de.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/de.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/dj.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dj.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/dk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/dm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/do.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/do.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/dz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ec.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ec.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ee.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ee.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/eg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/eg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/eh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/eh.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/england.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/england.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/er.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/er.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/es.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/es.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/et.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/et.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/europeanunion.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/europeanunion.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fam.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fam.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fi.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fj.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fj.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fo.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/fr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ga.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ga.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gb.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gb.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gd.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gd.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ge.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ge.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gh.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gi.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gl.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gp.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gp.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gq.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gq.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gs.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/gy.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gy.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/hk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/hm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/hn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/hr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ht.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ht.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/hu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/id.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/id.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ie.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ie.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/il.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/il.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/in.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/in.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/io.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/io.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/iq.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/iq.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ir.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ir.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/is.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/is.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/it.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/it.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/jm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/jm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/jo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/jo.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/jp.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/jp.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ke.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ke.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kh.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ki.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ki.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/km.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/km.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kp.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kp.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ky.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ky.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/kz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/la.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/la.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lb.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lb.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/li.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/li.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ls.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ls.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/lv.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lv.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ly.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ly.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ma.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ma.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/md.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/md.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/me.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/me.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mh.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ml.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ml.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mo.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mp.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mp.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mq.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mq.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ms.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ms.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mv.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mv.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mx.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mx.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/my.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/my.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/mz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/na.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/na.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/nc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ne.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ne.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/nf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ng.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ng.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ni.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ni.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/nl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nl.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/no.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/no.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/np.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/np.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/nr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/nu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/nz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/om.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/om.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pa.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pa.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pe.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pe.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ph.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ph.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pl.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ps.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ps.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/pw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/py.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/py.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/qa.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/qa.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/re.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/re.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ro.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ro.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/rs.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/rs.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ru.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ru.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/rw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/rw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sa.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sa.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sb.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sb.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/scotland.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/scotland.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sd.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sd.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/se.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/se.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sh.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/si.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/si.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sj.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sj.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sl.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/so.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/so.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/st.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/st.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sv.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sv.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sy.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sy.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/sz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/td.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/td.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/th.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/th.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tj.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tj.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tk.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tl.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/to.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/to.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tr.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tv.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tv.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/tz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ua.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ua.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ug.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ug.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/um.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/um.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/us.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/us.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/uy.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/uy.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/uz.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/uz.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/va.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/va.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/vc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vc.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ve.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ve.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/vg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vg.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/vi.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vi.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/vn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vn.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/vu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vu.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/wales.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/wales.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/wf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/wf.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ws.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ws.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/ye.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ye.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/yt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/yt.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/za.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/za.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/zm.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/zm.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/gif/zw.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/zw.gif
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ad.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ae.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ae.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/af.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/af.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ag.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ai.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/al.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/al.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/am.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/am.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/an.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/an.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ao.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ao.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ar.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/as.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/as.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/at.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/at.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/au.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/au.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/aw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/aw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ax.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/az.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/az.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ba.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ba.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bb.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bd.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/be.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/be.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bh.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bi.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bj.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bo.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/br.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/br.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bs.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bv.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/by.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/by.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/bz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ca.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ca.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/catalonia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/catalonia.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cd.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ch.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ci.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ci.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ck.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ck.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cl.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/co.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/co.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cs.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cv.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cx.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cy.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/cz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/de.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/de.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/dj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dj.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/dk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/dm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/do.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/do.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/dz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ec.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ee.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/eg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/eh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/eh.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/england.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/england.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/er.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/er.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/es.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/es.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/et.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/et.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/europeanunion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/europeanunion.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fam.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fi.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fj.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fo.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/fr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ga.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ga.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gb.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gd.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ge.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gh.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gi.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gl.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gp.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gq.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gs.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/gy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gy.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/hk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/hm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/hr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ht.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ht.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/hu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/id.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/id.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ie.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/il.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/il.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/in.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/in.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/io.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/iq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/iq.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ir.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/is.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/is.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/it.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/it.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/jm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/jm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/jo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/jo.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/jp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/jp.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ke.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ke.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kh.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ki.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ki.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/km.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/km.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kp.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ky.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ky.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/kz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/la.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/la.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lb.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/li.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/li.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ls.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ls.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/lv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lv.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ly.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ma.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/md.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/md.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/me.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/me.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mh.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ml.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mo.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mp.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mq.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ms.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ms.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mv.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mx.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/my.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/my.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/mz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/na.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/na.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/nc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ne.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ne.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/nf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ng.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ni.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ni.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/nl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nl.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/no.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/no.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/np.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/np.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/nr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/nu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/nz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/om.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/om.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pa.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pe.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ph.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pl.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ps.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/pw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/py.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/qa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/qa.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/re.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/re.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ro.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/rs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/rs.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ru.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/rw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/rw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sa.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sb.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/scotland.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/scotland.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sd.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/se.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/se.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sh.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/si.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/si.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sj.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sl.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/so.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/so.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/st.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/st.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sv.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sy.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/sz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/td.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/td.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/th.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/th.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tj.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tk.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tl.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/to.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/to.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tr.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tv.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/tz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ua.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ua.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ug.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/um.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/um.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/us.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/us.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/uy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/uy.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/uz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/uz.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/va.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/va.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/vc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vc.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ve.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ve.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/vg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vg.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/vi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vi.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/vn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vn.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/vu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vu.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/wales.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/wales.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/wf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/wf.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ws.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ws.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/ye.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ye.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/yt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/yt.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/za.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/za.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/zm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/zm.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/png/zw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/zw.png
--------------------------------------------------------------------------------
/mb/famfamfam_flag_icons/readme.txt:
--------------------------------------------------------------------------------
1 | Flag icons - http://www.famfamfam.com
2 |
3 | These icons are public domain, and as such are free for any use (attribution appreciated but not required).
4 |
5 | Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. A list of codes can be found at http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
6 |
7 | If you find these icons useful, please donate via paypal to mjames@gmail.com (or click the donate button available at http://www.famfamfam.com/lab/icons/silk)
8 |
9 | Contact: mjames@gmail.com
--------------------------------------------------------------------------------
/mb/mb/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/mb/__init__.py
--------------------------------------------------------------------------------
/mb/mb/asn.py:
--------------------------------------------------------------------------------
1 |
2 | def iplookup(conn, s):
3 |
4 | from mb.util import IpAddress
5 | import mb.mberr
6 |
7 |
8 | if s[0].isdigit():
9 | a = IpAddress()
10 | if ':' in s:
11 | a.ip6 = s
12 | else:
13 | a.ip = s
14 |
15 | else:
16 | import sys, socket
17 | ips = []
18 | ip6s = []
19 | try:
20 | for res in socket.getaddrinfo(s, None):
21 | af, socktype, proto, canonname, sa = res
22 | if ':' in sa[0]:
23 | if sa[0] not in ip6s:
24 | ip6s.append(sa[0])
25 | else:
26 | if sa[0] not in ips:
27 | ips.append(sa[0])
28 | except socket.error, e:
29 | if e[0] == socket.EAI_NONAME:
30 | raise mb.mberr.NameOrServiceNotKnown(s)
31 | else:
32 | print 'socket error msg:', str(e)
33 | return None
34 |
35 |
36 | #print ips
37 | #print ip6s
38 | if len(ips) > 1 or len(ip6s) > 1:
39 | print >>sys.stderr, '>>> warning: %r resolves to multiple IP addresses: ' % s,
40 | if len(ips) > 1:
41 | print >>sys.stderr, ', '.join(ips),
42 | if len(ip6s) > 1:
43 | print >>sys.stderr, ', '.join(ip6s),
44 | print >>sys.stderr, '\n>>> see http://mirrorbrain.org/archive/mirrorbrain/0042.html why this could\n' \
45 | '>>> could be a problem, and what to do about it. But note that this is not\n' \
46 | '>>> necessarily a problem and could actually be intended depending on the\n' \
47 | '>>> mirror\'s configuration (see http://mirrorbrain.org/issues/issue152).\n' \
48 | '>>> It\'s best to talk to the mirror\'s admins.\n'
49 | a = IpAddress()
50 | if ips: a.ip = ips[0]
51 | if ip6s: a.ip6 = ip6s[0]
52 |
53 |
54 | if not a.ip:
55 | return a
56 | query = """SELECT pfx, asn \
57 | FROM pfx2asn \
58 | WHERE pfx >>= ip4r('%s') \
59 | ORDER BY ip4r_size(pfx) \
60 | LIMIT 1""" % a.ip
61 |
62 | try:
63 | res = conn.Pfx2asn._connection.queryAll(query)
64 | except AttributeError:
65 | # we get this error if mod_asn isn't installed as well
66 | return a
67 |
68 | if len(res) != 1:
69 | return a
70 | (a.prefix, a.asn) = res[0]
71 | return a
72 |
73 | def asn_prefixes(conn, asn):
74 |
75 | query = """SELECT pfx \
76 | FROM pfx2asn \
77 | WHERE asn='%s'""" % asn
78 |
79 | res = conn.Pfx2asn._connection.queryAll(query)
80 | l = [ i[0] for i in res ]
81 | return l
82 |
--------------------------------------------------------------------------------
/mb/mb/core.py:
--------------------------------------------------------------------------------
1 | import mb.mberr
2 |
3 | class Directory:
4 | def __init__(self, name):
5 | self.name = name
6 | self.files = []
7 |
8 | def __str__(self):
9 | #return '%s:\n%s' % (self.name, '\n'.join(self.files))
10 | return '%-45s: %6s files' % (self.name, int(len(self.files)))
11 |
12 |
13 | def delete_mirror(conn, mirror):
14 | """delete a mirror by specifying its (exact) identifier string)"""
15 | try:
16 | m = conn.Server.select(conn.Server.q.identifier == mirror)[0]
17 | except IndexError:
18 | raise mb.mberr.MirrorNotFoundError(mirror)
19 |
20 | query = """SELECT mirr_del_byid(%d, id) FROM filearr WHERE %s = ANY(mirrors)""" \
21 | % (m.id, m.id)
22 | conn.Server._connection.queryAll(query)
23 |
24 | conn.Server.delete(m.id)
25 |
26 |
27 | def mirror_get_nfiles(conn, mirror):
28 | query = """SELECT mirr_get_nfiles(%d)""" % (mirror.id)
29 | return conn.Server._connection.queryAll(query)[0]
30 |
31 |
--------------------------------------------------------------------------------
/mb/mb/crawl.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | import sys
4 | import os
5 | import re
6 |
7 | def get_filelist(url):
8 | child_stdin, child_stdout, child_stderr = os.popen3(['rsync', '-r', url])
9 | #child_stdin, child_stdout, child_stderr = os.popen3(['cat', 'buildservice-repos.txt'])
10 | child_stdin.close()
11 |
12 | dirs = {}
13 | for line in child_stdout:
14 | # split line, but take into account that filenames could contain spaces
15 | #
16 | # >>> a = '-rw-r--r-- 4405843968 2007/09/27 17:50:25 distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso'
17 | # >>> a.split(None, 4)
18 | # ['-rw-r--r--', '4405843968', '2007/09/27', '17:50:25', 'distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso']
19 | try:
20 | mode, size, date, time, name = line.split(None, 4)
21 | except:
22 | print repr(line)
23 | import sys
24 | sys.exit(1)
25 | name = name.rstrip()
26 |
27 | if mode.startswith('d'):
28 | dirs[name] = Directory(name)
29 |
30 | elif mode.startswith('-'):
31 | d, p = os.path.split(name)
32 | if not d:
33 | d = '.'
34 | dirs[d].files.append(p)
35 |
36 | elif mode.startswith('l'):
37 | # we ignore symbolic links
38 | continue
39 | else:
40 | # something unknown...
41 | print 'skipping', line
42 |
43 | err = child_stderr.read()
44 |
45 | return dirs, err
46 |
47 |
48 |
49 |
50 | from mechanize import Browser
51 |
52 | burl, url = sys.argv[1], sys.argv[2]
53 | #burl_len = len('http://widehat.opensuse.org/')
54 | #burl_len = len('http://opensuse.unixheads.net/')
55 | #burl_len = len('http://download.opensuse.org/pub/opensuse/')
56 | burl_len = len(burl)
57 |
58 | br = Browser()
59 | br.open(url)
60 |
61 |
62 | print 'directories:'
63 | for link in br.links(url_regex=re.compile(r"""
64 | ^(?!(http|mailto|\?|/))
65 | .*
66 | /$
67 | """, re.X)):
68 | #print link.url
69 | print link.base_url[burl_len:] + link.url
70 |
71 | print
72 | print 'files:'
73 | for link in br.links(url_regex=re.compile(r"""
74 | ^(?!(http|mailto|\?|/))
75 | .*
76 | [^/]$
77 | """, re.X)):
78 | #print link
79 | print link.base_url[burl_len:] + link.url
80 |
81 | for line in get_filelist('rsync.opensuse.org::opensuse-updates'):
82 | print line
83 |
--------------------------------------------------------------------------------
/mb/mb/crawlers/__init__.py:
--------------------------------------------------------------------------------
1 | __all__ = ['http', 'rsync', 'ftp']
2 |
--------------------------------------------------------------------------------
/mb/mb/crawlers/rsync.py:
--------------------------------------------------------------------------------
1 |
2 | import os
3 | import mb.core
4 |
5 | # split lines, but take into account that filenames could contain spaces
6 | #
7 | # >>> a = '-rw-r--r-- 4405843968 2007/09/27 17:50:25 distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso'
8 | # >>> a.split(None, 4)
9 | # ['-rw-r--r--', '4405843968', '2007/09/27', '17:50:25', 'distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso']
10 |
11 | def get_filelist(url):
12 | import urlparse
13 | import subprocess
14 |
15 | print url
16 | url = list(urlparse.urlparse(url))
17 | if not ':' in url[1]: url[1] += ':873'
18 | url = urlparse.urlunparse(url)
19 | print url
20 | # old
21 | ### child_stdin, child_stdout, child_stderr = os.popen3(['rsync', '-r', url])
22 | ### #child_stdin, child_stdout, child_stderr = os.popen3(['cat', 'buildservice-repos.txt'])
23 | ### child_stdin.close()
24 |
25 | ### # new
26 | ### p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=True)
27 | ### (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr)
28 |
29 | # newer
30 | o = subprocess.Popen(['rsync', '-r', url], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True).stdout
31 | print 'done'
32 | #import time
33 | #time.sleep(100)
34 |
35 | dirCollection = {}
36 | ### for line in child_stdout:
37 | for line in o.readlines():
38 | print 'a line'
39 | try:
40 | mode, size, date, time, name = line.split(None, 4)
41 | except:
42 | # may be the stupid motd
43 | import sys
44 | print 'could not parse this line: %s' % repr(line)
45 | #sys.exit('could not parse this line:\n%s' % repr(line))
46 | continue
47 | name = name.rstrip()
48 |
49 | if mode.startswith('d'):
50 | dirCollection[name] = mb.core.Directory(name)
51 |
52 | elif mode.startswith('-'):
53 | d, p = os.path.split(name)
54 | if not d:
55 | d = '.'
56 | dirCollection[d].files.append(p)
57 |
58 | elif mode.startswith('l'):
59 | # we ignore symbolic links
60 | continue
61 | else:
62 | # something unknown...
63 | print 'skipping', line
64 |
65 | err = child_stderr.read()
66 |
67 | return dirCollection, err
68 |
69 |
70 |
--------------------------------------------------------------------------------
/mb/mb/dbmaint.py:
--------------------------------------------------------------------------------
1 |
2 | def stale(conn, quietness):
3 | """show statistics about stale files in the database"""
4 |
5 | n_file_total = conn.Filearr.select().count()
6 |
7 | query = """SELECT count(*) FROM filearr
8 | LEFT OUTER JOIN hash ON filearr.id = hash.file_id
9 | WHERE mirrors = '{}' AND hash.file_id IS NULL"""
10 | n_file_stale = conn.Filearr._connection.queryAll(query)[0]
11 |
12 |
13 | if quietness < 1:
14 | print 'Total files: %10d' % n_file_total
15 | print 'Stale files (not on any mirror): %10d' % n_file_stale
16 |
17 |
18 | def vacuum(conn, quietness):
19 | """delete stale file entries from the database"""
20 |
21 | if quietness < 1:
22 | print 'Deleting stale files...'
23 | query = """DELETE FROM filearr
24 | WHERE id IN (
25 | SELECT filearr.id FROM filearr
26 | LEFT OUTER JOIN hash ON filearr.id = hash.file_id
27 | WHERE mirrors = '{}' AND hash.file_id IS NULL
28 | )"""
29 | conn.Filearr._connection.query(query)
30 |
31 | if quietness < 1:
32 | print 'Done.'
33 |
34 |
35 | def stats(conn):
36 | """show statistics about stale files in the database"""
37 |
38 | query = """SELECT relname, relkind, relfilenode, reltuples, relpages,
39 | relpages*8 AS relKB
40 | FROM pg_class
41 | WHERE relkind IN ('r', 'i')
42 | AND relname ~ '^.*(file|server|pfx|temp1|stats|hash).*'
43 | ORDER BY 1"""
44 | rows = conn.Filearr._connection.queryAll(query)
45 |
46 | print 'Size(MB) Relation'
47 | total = 0
48 | for row in rows:
49 | name, kind, filenode, tuples, pages, size = row
50 | sizeMB = float(size) / 1024
51 | total += sizeMB
52 | print '%5.1f %s' % (sizeMB, name)
53 |
54 | print 'Total: %.1f' % total
55 |
56 |
57 | def shell(c):
58 | """spawn a database shell (psql).
59 |
60 | The argument is the configuration structure for that MirrorBrain instance."""
61 | import os
62 | os.environ['PGHOST'] = c.get('dbhost')
63 | os.environ['PGPORT'] = c.get('dbport', '5432')
64 | os.environ['PGUSER'] = c.get('dbuser')
65 | os.environ['PGPASSWORD'] = c.get('dbpass')
66 | os.environ['PGDATABASE'] = c.get('dbname')
67 | os.execlp('psql', 'psql')
68 |
--------------------------------------------------------------------------------
/mb/mb/exports.py:
--------------------------------------------------------------------------------
1 | import time
2 |
3 | postgresql_header = """
4 | --
5 | -- generated on %s
6 | --
7 | """ % time.asctime()
8 |
9 | postgresql_template = """\
10 | --
11 | -- %(identifier)s
12 | --
13 | INSERT INTO server (
14 | identifier, baseurl, baseurl_ftp, baseurl_rsync, enabled, status_baseurl,
15 | region, country, asn, prefix,
16 | score, comment, operator_name, operator_url, public_notes,
17 | admin, admin_email, lat, lng,
18 | country_only, region_only, as_only, prefix_only,
19 | other_countries, file_maxsize, scan_fpm)
20 | VALUES (
21 | '%(identifier)s', '%(baseurl)s', '%(baseurlFtp)s', '%(baseurlRsync)s', '%(enabled)s', '%(statusBaseurl)s',
22 | '%(region)s', '%(country)s', '%(asn)s', '%(prefix)s',
23 | '%(score)s', $QUOTE$%(comment)s$QUOTE$, $QUOTE$%(operatorName)s$QUOTE$, '%(operatorUrl)s', $QUOTE$%(publicNotes)s$QUOTE$,
24 | $QUOTE$%(admin)s$QUOTE$, $QUOTE$%(adminEmail)s$QUOTE$, '%(lat)s', '%(lng)s',
25 | '%(countryOnly)s', '%(regionOnly)s', '%(asOnly)s', '%(prefixOnly)s',
26 | '%(otherCountries)s', '%(fileMaxsize)s', '%(scanFpm)s');
27 | """
28 |
29 | django_header = """#!/usr/bin/env python
30 | import os, sys
31 |
32 | mybasepath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
33 | sys.path.insert(0, mybasepath)
34 | os.environ['DJANGO_SETTINGS_MODULE'] = 'mirrordjango.settings'
35 |
36 | from django.db import connection
37 |
38 | from mirrordjango.mb.models import Contact, Operator, Project, Server, Mirror
39 |
40 | """
41 |
42 | django_template = """\
43 |
44 | # ------------------------------------------------------------
45 | try:
46 | c = Contact.objects.get_or_create(username=%(admin)r, password='UNSET', name=%(admin)r, email=%(adminEmail)r)[0]
47 | except:
48 | connection.connection.rollback()
49 | c = None
50 | o = Operator.objects.get_or_create(name='%(identifier)s', logo='')[0]
51 | p = Project.objects.filter(name='%(project)s')
52 | p = p[0]
53 | s = Server.objects.get_or_create(identifier='%(identifier)s', operator=o, region='%(region)s', country='%(country)s', country_only='%(countryOnly)s', region_only='%(regionOnly)s', as_only='%(asOnly)s', prefix_only='%(prefixOnly)s', other_countries=%(otherCountries)r, file_maxsize='%(fileMaxsize)s', comment=%(comment)r, bandwidth=1)[0]
54 | m = Mirror.objects.get_or_create(http='%(baseurl)s', ftp='%(baseurlFtp)s', rsync='%(baseurlRsync)s', prio='%(score)s', project=p, server=s)[0]
55 | # s.mirrors.add(m)
56 | if c:
57 | s.contacts.add(c)
58 |
59 | """
60 |
61 | # mirmon configured with "list_style = apache"
62 | mirmon_apache_template = """%(proto)s\t%(country)s\t%(url)s\t%(adminEmail)s"""
63 | # mirmon configured with "list_style = plain"
64 | mirmon_template = """%(country)s\t%(url)s\t%(adminEmail)s"""
65 |
--------------------------------------------------------------------------------
/mb/mb/filelist.py:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | def get_filelist(url):
5 |
6 | if url.startswith('rsync'):
7 | import mb.crawlers.rsync
8 | return mb.crawlers.rsync.get_filelist(url)
9 |
10 | elif url.startswith('http'):
11 | import mb.crawlers.http
12 | return mb.crawlers.http.get_filelist(url)
13 |
14 | elif url.startswith('ftp'):
15 | import mb.crawlers.ftp
16 | return mb.crawlers.ftp.get_filelist(url)
17 |
18 | else:
19 | import sys
20 | sys.exit('unknown error... url is \'%s\'' % url)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/mb/mb/geoip.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import os
3 | from subprocess import Popen, PIPE
4 | import errno
5 |
6 | ENV = {'PATH': ':'.join([os.getenv('PATH'), '/usr/share/mirrorbrain'])}
7 |
8 | # try different databases and different locations
9 | databases = ['/var/lib/GeoIP/GeoLiteCity.dat.updated',
10 | '/var/lib/GeoIP/GeoLiteCity.dat',
11 | '/var/lib/GeoIP/GeoIP.dat.updated',
12 | '/var/lib/GeoIP/GeoIP.dat',
13 | '/usr/share/GeoIP/GeoLiteCity.dat.updated',
14 | '/usr/share/GeoIP/GeoLiteCity.dat',
15 | '/usr/share/GeoIP/GeoIP.dat.updated',
16 | '/usr/share/GeoIP/GeoIP.dat',
17 | ]
18 | for i in databases:
19 | if os.path.exists(i):
20 | database = i
21 | break
22 | databases6 = ['/var/lib/GeoIP/GeoIPv6.dat.updated',
23 | '/var/lib/GeoIP/GeoIPv6.dat',
24 | '/usr/share/GeoIP/GeoIPv6.dat.updated',
25 | '/usr/share/GeoIP/GeoIPv6.dat',
26 | ]
27 | for i in databases6:
28 | if os.path.exists(i):
29 | database6 = i
30 | break
31 |
32 |
33 | def lookup_country_code(addr):
34 | out = Popen(['geoiplookup', '-f', database, addr], env=ENV, stdout=PIPE).communicate()[0]
35 | out = out.split(':')[1].strip().split(',')[0]
36 |
37 | return out.lower()
38 |
39 |
40 | def lookup_region_code(addr):
41 | try:
42 | out = Popen(['geoiplookup_continent', '-f', database, addr], env=ENV, stdout=PIPE).communicate()[0]
43 | except OSError, e:
44 | if e.errno == errno.ENOENT:
45 | sys.exit('Error: The geoiplookup_continent binary could not be found.\n'
46 | 'Make sure to install the geoiplookup_continent into a directory contained in $PATH.')
47 |
48 | return out.strip().lower()
49 |
50 | def lookup_coordinates(addr):
51 | try:
52 | out = Popen(['geoiplookup_city', '-f', database, addr], env=ENV, stdout=PIPE).communicate()[0]
53 | except OSError, e:
54 | if e.errno == errno.ENOENT:
55 | sys.exit('Error: The geoiplookup_city binary could not be found.\n'
56 | 'Make sure to install the geoiplookup_city into a directory contained in $PATH.')
57 |
58 | lat = lng = 0
59 | for line in out.splitlines():
60 | if line.startswith('Latitude'):
61 | lat = float(line.split()[1])
62 | continue
63 | if line.startswith('Longitude'):
64 | lng = float(line.split()[1])
65 | continue
66 |
67 | # if the number of digits here matches the database declaration, we can
68 | # compare the values and see whether they have changed
69 | lat = round(lat, 3)
70 | lng = round(lng, 3)
71 | return lat, lng
72 |
73 |
74 | if __name__ == '__main__':
75 | import sys
76 | print 'country:', lookup_country_code(sys.argv[1])
77 | print 'region:', lookup_region_code(sys.argv[1])
78 |
--------------------------------------------------------------------------------
/mb/mb/mberr.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | # Copyright (C) 2008-2010 Peter Poeml. All rights reserved.
4 | # This program is free software; it may be used, copied, modified
5 | # and distributed under the terms of the GNU General Public Licence,
6 | # either version 2, or (at your option) any later version.
7 |
8 |
9 | # exception classes
10 |
11 | class MbBaseError(Exception):
12 | def __init__(self, args=()):
13 | Exception.__init__(self)
14 | self.args = args
15 | def __str__(self):
16 | return ''.join(self.args)
17 |
18 | class SignalInterrupt(Exception):
19 | """Exception raised on SIGTERM and SIGHUP."""
20 |
21 | class UserAbort(MbBaseError):
22 | """Exception raised when the user requested abortion"""
23 |
24 | class NoConfigfile(MbBaseError):
25 | """Exception raised when mb's configfile cannot be found"""
26 | def __init__(self, fname, msg):
27 | MbBaseError.__init__(self)
28 | self.file = fname
29 | self.msg = msg
30 |
31 | class ConfigError(MbBaseError):
32 | """Exception raised when there is an error in the config file"""
33 | def __init__(self, msg, fname):
34 | MbBaseError.__init__(self)
35 | self.msg = msg
36 | self.file = fname
37 |
38 | class MirrorNotFoundError(MbBaseError):
39 | """Raised when a mirror wasn't found in the database"""
40 | def __init__(self, identifier):
41 | MbBaseError.__init__(self)
42 | self.identifier = identifier
43 | self.msg = 'A mirror with identifier %r does not exist in the database\n' \
44 | '(full name required for this operation!)' \
45 | % self.identifier
46 |
47 | class SocketError(MbBaseError):
48 | """Raised for network errors"""
49 | def __init__(self, url, msg):
50 | MbBaseError.__init__(self)
51 | self.url = url
52 | self.msg = 'Could not access %r: %r' % (url, msg)
53 |
54 | class NameOrServiceNotKnown(MbBaseError):
55 | """Raised when a hostname could not be looked up in the DNS"""
56 | def __init__(self, hostname):
57 | MbBaseError.__init__(self)
58 | self.msg = 'DNS lookup for hostname %r failed: Name or service not known' % hostname
59 |
60 |
--------------------------------------------------------------------------------
/mb/mb/randomfile.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | import sys
4 | import os
5 | import os.path
6 |
7 | # python equivalent for this:
8 | # find /srv/mirrors/openoffice -type f | head -n 1
9 |
10 | # needs local file tree and knowledge of base dir
11 |
12 |
13 | def find_first_file_in_tree(bdir):
14 | files = None
15 | for (path, dirs, files) in os.walk(bdir):
16 | #print path
17 | #print dirs
18 | #print files
19 | #print "----"
20 | if files:
21 | break
22 | #print '********'
23 | if files:
24 | found = os.path.join(path, files[0])
25 | found = found[len(bdir):]
26 | found = found.lstrip('/')
27 | return found
28 | else:
29 | return None
30 |
31 |
32 | if __name__ == '__main__':
33 |
34 | bdir = sys.argv[1]
35 | print find_first_file_in_tree(bdir)
36 |
37 |
--------------------------------------------------------------------------------
/mb/mb/timestamps.py:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 |
3 | import os
4 | import sys
5 | import time
6 | import tempfile
7 | import pwd, grp
8 |
9 | explanation = """
10 | Should you wonder about this file, it supplies timestamps that can be
11 | used to assess possible lags in mirroring.
12 |
13 | These are not used by MirrorBrain for mirror checking, but can help
14 | human beings with verifying a mirrors setup. (Maybe MirrorBrain could/should
15 | make use of these timestamps in the future.)
16 |
17 | In addition, the .timestamp_invisible is supposed to be not visible
18 | through HTTP, FTP or rsync. This serves to ensure that a mirrors's
19 | permission setup is correct. Keeping certain files temporarily
20 | unreadable can be an important step in the process of publishing content.
21 |
22 | Feel free to contact mirrorbrain at mirrorbrain org for more information;
23 | Thanks.
24 |
25 | """
26 |
27 | def create(tstamps, user=None, group=None):
28 |
29 | epoch = int(time.time())
30 | utc = time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime())
31 |
32 |
33 | if user:
34 | user = pwd.getpwnam(user).pw_uid
35 | else:
36 | user = os.geteuid()
37 |
38 | if group:
39 | group = grp.getgrnam(group).gr_gid
40 | else:
41 | group = os.getegid()
42 |
43 | for tstamp in tstamps:
44 | try:
45 | # we might write in a directory not owned by root
46 | (fd, tmpfilename) = tempfile.mkstemp(prefix = os.path.basename(tstamp),
47 | dir = os.path.dirname(tstamp))
48 | except OSError, e:
49 | sys.exit(e)
50 |
51 | if tstamp.endswith('invisible'):
52 | mode = 0640
53 | else:
54 | mode = 0644
55 |
56 | try:
57 | os.chown(tmpfilename,
58 | user,
59 | group)
60 | except OSError, e:
61 | sys.exit(e)
62 |
63 | os.chmod(tmpfilename, mode)
64 |
65 | f = os.fdopen(fd, 'w')
66 | f.write('%s\n%s\n\n' % (epoch, utc))
67 | f.write(explanation)
68 | f.close()
69 |
70 | os.rename(tmpfilename, tstamp)
71 |
72 |
--------------------------------------------------------------------------------
/mb/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | from distutils.core import setup, Extension
4 |
5 | s = setup(name='mb',
6 | version='2.19.0',
7 | description='mb, a tool to maintain the MirrorBrain database',
8 | author='MirrorBrain project',
9 | author_email='info@mirrorbrain.org',
10 | license='GPLv2',
11 | url='http://mirrorbrain.org/',
12 |
13 | packages=['mb'],
14 | scripts=['mb.py'],
15 |
16 | ext_modules=[Extension('zsync', sources=['zsyncmodule.c'])],
17 | )
18 |
19 |
20 | # Since the "mb" script has the same name as the Python module, it'd
21 | # try to import itself as long as there's mb.py in the script's directory.
22 | # Therefore, we remove mb.py and only leave mb.
23 | # Don't know if there's a better way to achieve this...
24 | from distutils.command.install_scripts import install_scripts
25 | from os.path import join, exists
26 | from os import unlink, rename
27 | script_install_dir = s.get_command_obj('install_scripts').install_dir
28 |
29 | if script_install_dir:
30 | if exists(join(script_install_dir, 'mb')):
31 | unlink(join(script_install_dir, 'mb.py'))
32 | else:
33 | rename(join(script_install_dir, 'mb.py'), join(script_install_dir, 'mb'))
34 |
--------------------------------------------------------------------------------
/mb/zsyncmodule.c:
--------------------------------------------------------------------------------
1 | /* "rsum" checksumming function from zsync's librcksum/rsum.c, version 0.6.1,
2 | * wrapped into a Python extension
3 | *
4 | * Copyright 2010,2012 Peter Poeml
5 | *
6 | * The checksumming function itself is available under the Artistic License;
7 | * the boilerplate was a nice exercise.
8 | *
9 | * This is something that will be a whole lot slower when programmed in a
10 | * scripting language, thus I wanted this Python extension. */
11 |
12 | #include
13 | #include
14 | #include "Python.h"
15 |
16 | static PyObject *zsync_rsum06(PyObject *self, PyObject *args) {
17 | char *data;
18 | int len;
19 | unsigned short a, b;
20 | unsigned char digest[4];
21 | memset(digest, 0, sizeof(digest));
22 |
23 | if (!PyArg_ParseTuple(args, "s#", &data, &len))
24 | return NULL;
25 |
26 | {
27 | register unsigned short aa = 0;
28 | register unsigned short bb = 0;
29 | while (len) {
30 | register unsigned char c = *data++;
31 | aa += c;
32 | bb += len * c;
33 | len--;
34 | }
35 | a = aa;
36 | b = bb;
37 | }
38 |
39 | a = htons(a);
40 | b = htons(b);
41 | memcpy((void *)&digest, &a, 2);
42 | memcpy((void *)&digest + 2, &b, 2);
43 |
44 | return PyString_FromStringAndSize((const char *)digest, sizeof(digest));
45 | }
46 |
47 | static PyMethodDef zsyncMethods[] = {
48 | {"rsum06", zsync_rsum06, METH_VARARGS, "Calculate a zsync rsum value."},
49 | {NULL, NULL, 0, NULL}
50 | };
51 |
52 | void initzsync() {
53 | Py_InitModule("zsync", zsyncMethods);
54 | }
55 |
56 | /* vim: set ts=4 sw=4 expandtab smarttab: */
57 |
--------------------------------------------------------------------------------
/mod_autoindex_mb/INSTALL:
--------------------------------------------------------------------------------
1 | mod_autoindex_mb is a patched mod_autoindex. It adds a little further
2 | capability as index option.
3 |
4 | The following option is provided:
5 |
6 |
7 | IndexOptions Mirrorlist
8 |
9 |
10 | This adds a link named "Details" for each item in the index, which links to
11 | the same item but with ".mirrorlist" appended.
12 |
13 |
14 | The provided mod_autoindex.c.patch shows the differences to the original module.
15 | This patch is *not* meant to be applied to mod_autoindex in the httpd source tree.
16 | It merely serves to illustrate in which way mod_autoindex_mb differs from
17 | mod_autoindex.
18 |
19 | Only one module can be loaded at a time - either mod_autoindex or mod_autoindex_mb.
20 | The two modules can not usefully run side by side, because they share the same
21 | configuration directives.
22 | The module name differs, so that it can be explicit which module is loaded.
23 |
24 |
25 | The module can be compiled like this:
26 | apxs2 -c '-Wc,-Wall -g -D_GNU_SOURCE' mod_autoindex_mb.c
27 |
28 | (I can't remember why I needed the _GNU_SOURCE. It was on Linux and was probably
29 | related to filesystem access. The module should work on any platform, of course.)
30 |
31 | poeml, Tue Jul 14 01:02:15 CEST 2009
32 |
--------------------------------------------------------------------------------
/mod_autoindex_mb/NOTICE:
--------------------------------------------------------------------------------
1 | This product includes software developed at
2 | The Apache Software Foundation (http://www.apache.org/).
3 |
4 | Portions of this software were developed at the National Center
5 | for Supercomputing Applications (NCSA) at the University of
6 | Illinois at Urbana-Champaign.
7 |
--------------------------------------------------------------------------------
/mod_mirrorbrain/mod_dbd.conf:
--------------------------------------------------------------------------------
1 | # This is configuration is per server.
2 |
3 | DBDriver pgsql
4 | DBDParams "host=localhost user=mb password=foobar dbname=mb connect_timeout=15"
5 |
6 | # applies to threaded MPMs only. Prefork will use one databae connection
7 | # per child.
8 |
9 | DBDMin 0
10 | DBDMax 32
11 | DBDKeep 4
12 | DBDExptime 10
13 |
14 |
15 |
--------------------------------------------------------------------------------
/mod_mirrorbrain/mod_memcache.conf:
--------------------------------------------------------------------------------
1 |
2 | MemcacheServer 127.0.0.1:11211 min=0 smax=4 max=16 ttl=600
3 |
4 |
--------------------------------------------------------------------------------
/mod_stats/README:
--------------------------------------------------------------------------------
1 | See http://mirrorbrain.org/download-statistics/ for background information on
2 | this module (and possible further plans).
3 |
4 |
5 | The Apache module isn't usable at this time. Instructions how to build it
6 | are here just for archive purposes:
7 |
8 | # packages:
9 |
10 | http://download.opensuse.org/repositories/Apache:/Modules/
11 |
12 |
13 | # build and install man manually:
14 |
15 | sudo apxs2 -ci -Wc,"-Wall -g" mod_stats.c
16 |
17 | a2enmod dbd
18 | a2enmod stats
19 |
20 | copy mod_dbd.conf to /etc/apache2 and include it server-wide (via
21 | /etc/sysconfig/apache2:APACHE_CONF_INCLUDE_FILES)
22 |
23 | copy contents of mod_stats.conf into your virtual host configuration.
24 |
25 |
26 |
27 |
28 | Archiving and pruning old data from the 'stats_counter' table:
29 |
30 | pg_dump -U mb -t stats_counter > stats_counter-20101004.dump
31 | delete from stats_counter where date between E'2009-01-01 00:00:00' and E'2010-08-31 23:59:59.999999';
32 | vacuum full stats_counter;
33 |
--------------------------------------------------------------------------------
/mod_stats/TODO:
--------------------------------------------------------------------------------
1 | Handle "cmd=deleted" requests, to allow marking packages as deleted.
2 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mod_stats/downloadstats/__init__.py
--------------------------------------------------------------------------------
/mod_stats/downloadstats/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | from django.core.management import execute_manager
3 | try:
4 | import settings # Assumed to be in the same directory.
5 | except ImportError:
6 | import sys
7 | sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
8 | sys.exit(1)
9 |
10 | if __name__ == "__main__":
11 | execute_manager(settings)
12 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/settings.py.dist:
--------------------------------------------------------------------------------
1 | # Django settings for downloadstats project.
2 |
3 | DEBUG = True
4 | TEMPLATE_DEBUG = DEBUG
5 |
6 | ADMINS = (
7 | # ('Your Name', 'your_email@domain.com'),
8 | )
9 |
10 | MANAGERS = ADMINS
11 |
12 | DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
13 | DATABASE_NAME = 'sqlite3.db' # Or path to database file if using sqlite3.
14 | DATABASE_USER = '' # Not used with sqlite3.
15 | DATABASE_PASSWORD = '' # Not used with sqlite3.
16 | DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
17 | DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
18 |
19 | # Local time zone for this installation. Choices can be found here:
20 | # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
21 | # although not all choices may be available on all operating systems.
22 | # If running in a Windows environment this must be set to the same as your
23 | # system time zone.
24 | TIME_ZONE = 'America/Chicago'
25 |
26 | # Language code for this installation. All choices can be found here:
27 | # http://www.i18nguy.com/unicode/language-identifiers.html
28 | LANGUAGE_CODE = 'en-us'
29 |
30 | SITE_ID = 1
31 |
32 | # If you set this to False, Django will make some optimizations so as not
33 | # to load the internationalization machinery.
34 | USE_I18N = True
35 |
36 | # Absolute path to the directory that holds media.
37 | # Example: "/home/media/media.lawrence.com/"
38 | MEDIA_ROOT = ''
39 |
40 | # URL that handles the media served from MEDIA_ROOT. Make sure to use a
41 | # trailing slash if there is a path component (optional in other cases).
42 | # Examples: "http://media.lawrence.com", "http://example.com/media/"
43 | MEDIA_URL = ''
44 |
45 | # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
46 | # trailing slash.
47 | # Examples: "http://foo.com/media/", "/media/".
48 | ADMIN_MEDIA_PREFIX = '/media/'
49 |
50 | # Make this unique, and don't share it with anybody.
51 | SECRET_KEY = 'fq!(-m$39vb(t_n=s!c-z1(m%^xf338kaj)02f&(ha&l950bx&'
52 |
53 | # List of callables that know how to import templates from various sources.
54 | TEMPLATE_LOADERS = (
55 | 'django.template.loaders.filesystem.load_template_source',
56 | 'django.template.loaders.app_directories.load_template_source',
57 | # 'django.template.loaders.eggs.load_template_source',
58 | )
59 |
60 | MIDDLEWARE_CLASSES = (
61 | 'django.middleware.common.CommonMiddleware',
62 | 'django.contrib.sessions.middleware.SessionMiddleware',
63 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
64 | )
65 |
66 | ROOT_URLCONF = 'downloadstats.urls'
67 |
68 | TEMPLATE_DIRS = (
69 | # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
70 | # Always use forward slashes, even on Windows.
71 | # Don't forget to use absolute paths, not relative paths.
72 | )
73 |
74 | INSTALLED_APPS = (
75 | 'django.contrib.auth',
76 | 'django.contrib.contenttypes',
77 | 'django.contrib.sessions',
78 | 'django.contrib.sites',
79 | 'django.contrib.admin',
80 | 'downloadstats.stats',
81 | )
82 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/stats/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mod_stats/downloadstats/stats/__init__.py
--------------------------------------------------------------------------------
/mod_stats/downloadstats/stats/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from downloadstats.stats.models import Counter
4 |
5 |
6 | class CounterAdmin(admin.ModelAdmin):
7 |
8 | list_display = ('product', 'osname', 'version', 'lang', 'country', 'date', 'count')
9 | ordering = ('product', 'osname', 'version', 'lang', 'country')
10 |
11 | search_fields = ('product', 'osname')
12 | list_filter = ('date', 'product', 'osname', 'version', 'lang', 'country')
13 |
14 | admin.site.register(Counter, CounterAdmin)
15 |
16 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/stats/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 |
4 | class Counter(models.Model):
5 |
6 | # I'm undecided whether to settle for a "normal" date field, or optimize as
7 | # described in the proposal.
8 | #year = models.PositiveSmallIntegerField()
9 | #day = models.PositiveSmallIntegerField()
10 | date = models.DateField(db_index=True)
11 |
12 | product = models.CharField(max_length=256, db_index=True)
13 |
14 | # all these should probably called attr1, attr2, attr3, ...
15 | osname = models.CharField(max_length=256, db_index=True)
16 | version = models.CharField(max_length=32, db_index=True)
17 | lang = models.CharField(max_length=32, db_index=True)
18 | country = models.CharField(max_length=2, db_index=True)
19 |
20 | count = models.IntegerField(default=1)
21 |
22 | def __unicode__(self):
23 | return u'%s / %s / %s / %s / %s' % (self.product,
24 | self.osname,
25 | self.version,
26 | self.lang,
27 | self.country)
28 |
29 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/stats/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls.defaults import *
2 |
3 | urlpatterns = patterns('downloadstats.stats.views',
4 |
5 | (r'^csv/(?P\d{4})(?P\d{2})(?P\d{2})\.csv$', 'stats_csv'),
6 | (r'^csv/(?P\d{4})(?P\d{2})\.csv$', 'stats_csv'),
7 |
8 | (r'^csv/all-countries/(?P\d{4})(?P\d{2})(?P\d{2})\.csv$', 'stats_csv', {'by_country': False}),
9 | (r'^csv/all-countries/(?P\d{4})(?P\d{2})\.csv$', 'stats_csv', {'by_country': False}),
10 | )
11 |
12 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/stats/views.py:
--------------------------------------------------------------------------------
1 | from django.http import HttpResponse
2 | from django.db.models import Sum
3 |
4 | from downloadstats.stats.models import Counter
5 |
6 |
7 | def stats_csv(request, year, month, day=None, by_country=True):
8 | import csv
9 |
10 | response = HttpResponse(mimetype='text/plain')
11 | #response['Content-Disposition'] = 'attachment; filename=%s%s%s.csv' % (year, month, day or '')
12 |
13 | writer = csv.writer(response)
14 | if by_country:
15 | writer.writerow(['Date', 'Product', 'Version', 'OS', 'Language', 'Country', 'Downloads'])
16 | else:
17 | writer.writerow(['Date', 'Product', 'Version', 'OS', 'Language', 'Downloads'])
18 |
19 |
20 | products = [ i['product'] for i in Counter.objects.values('product').distinct() ]
21 |
22 | for product in products:
23 |
24 | s = Counter.objects.filter(product=product)
25 | s = s.filter(date__year=year, date__month=month)
26 | if day:
27 | s = s.filter(date__day=day)
28 | if by_country:
29 | s = s.values('date', 'product', 'version', 'osname', 'lang', 'country')
30 | else:
31 | s = s.values('date', 'product', 'version', 'osname', 'lang')
32 | s = s.annotate(counter=Sum('count'))
33 | s = s.order_by('date', 'product')
34 |
35 | for i in s:
36 | if by_country:
37 | writer.writerow((i['date'], i['product'], i['version'], i['osname'], i['lang'], i['country'], i['counter']))
38 | else:
39 | writer.writerow((i['date'], i['product'], i['version'], i['osname'], i['lang'], i['counter']))
40 |
41 | return response
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/mod_stats/downloadstats/urls.py:
--------------------------------------------------------------------------------
1 | from django.conf.urls.defaults import *
2 |
3 | # Uncomment the next two lines to enable the admin:
4 | from django.contrib import admin
5 | admin.autodiscover()
6 |
7 | urlpatterns = patterns('',
8 | (r'', include('downloadstats.stats.urls')),
9 |
10 | # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
11 | # to INSTALLED_APPS to enable admin documentation:
12 | # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
13 |
14 | # Uncomment the next line to enable the admin:
15 | (r'^admin/', include(admin.site.urls)),
16 | )
17 |
--------------------------------------------------------------------------------
/mod_stats/mod_dbd.conf:
--------------------------------------------------------------------------------
1 | # This is configuration is per server.
2 |
3 | DBDriver mysql
4 | DBDParams "host=host, user=user, pass=pass, dbname=dbname"
5 |
--------------------------------------------------------------------------------
/mod_stats/mod_stats.conf:
--------------------------------------------------------------------------------
1 | # mod_stats.c configuration example
2 |
3 |
4 |
5 | # These configuration directives are per directory.
6 |
7 | # Statistics will be collected for this directory.
8 | # It is the directory containing the "projects".
9 | Stats On
10 |
11 | # Ignore files which do not match this regexp.
12 | StatsFileMask "\.(rpm|deb)$"
13 |
14 | # Debugging should only be enabled on specific subdirectories for testing,
15 | # because it is very extensive.
16 | StatsDebug Off
17 |
18 | # Hosts that are allowed to use ?cmd=... commands to add packages
19 | # or delete them
20 | StatsAdminHost 10.10.10.28
21 | StatsAdminHost 2001:780:101:a00:204:23ff:fea6:9458
22 |
23 | # required to enable ?cmd= commands
24 | FormGET On
25 |
26 |
27 |
28 | # SQL statements to be prepared
29 | #
30 | # This configuration is per server.
31 | #
32 | StatsDBDQuery "\
33 | UPDATE redirect_stats \
34 | SET count=count+1, \
35 | counted_at=NOW() \
36 | WHERE project=%s \
37 | AND repository=%s \
38 | AND arch=%s \
39 | AND filename=%s \
40 | AND filetype=%s \
41 | AND version=%s \
42 | AND `release`=%s"
43 |
44 | StatsDBDSelectQuery "\
45 | SELECT \
46 | id \
47 | FROM \
48 | redirect_stats \
49 | WHERE \
50 | project=%s \
51 | AND repository=%s \
52 | AND arch=%s \
53 | AND filename=%s \
54 | AND filetype=%s \
55 | AND version=%s \
56 | AND `release`=%s"
57 |
58 | StatsDBDDeleteQuery "\
59 | DELETE \
60 | FROM \
61 | redirect_stats \
62 | WHERE \
63 | project=%s \
64 | AND repository=%s \
65 | AND arch=%s \
66 | AND filename=%s \
67 | AND filetype=%s \
68 | AND version=%s \
69 | AND `release`=%s"
70 |
71 | StatsDBDInsertQuery "\
72 | INSERT INTO \
73 | redirect_stats \
74 | SET \
75 | project=%s, \
76 | repository=%s, \
77 | arch=%s, \
78 | filename=%s, \
79 | filetype=%s, \
80 | version=%s, \
81 | `release`=%s, \
82 | counted_at=NOW(), \
83 | package=%s"
84 |
85 |
86 |
87 | # vim: set ft=apache ts=4 sw=4 ai expandtab smarttab:
88 |
--------------------------------------------------------------------------------
/mod_stats/tools/xbmc.conf:
--------------------------------------------------------------------------------
1 | StatsLogMask "^(\S+).+\[(.*?)\] \"GET (\S*) HTTP.*\" (200|302) [^\"]+ \"([^\"]*)\" \"([^\"]*)\".*"
2 | StatsDupWindow 200
3 | StatsIgnoreMask ".*\?.*"
4 | StatsIgnoreMask "^.*\.(txt|list|html)$"
5 | # strip prefixed protocol (normally only sent to proxies, but sometimes occurs in the wild)
6 | StatsPrefilter "^http://[^/]+/" ""
7 | # remove duplicated slashes
8 | StatsPrefilter "/+" "/"
9 | # strip appended .metalink suffix
10 | StatsPrefilter "\.metalink$" ""
11 |
12 | # dharma-pre/metadata.artists.freebase.com/metadata.artists.freebase.com-1.0.6.zip
13 | # $osname/$product/$product-$version.zip
14 |
15 | StatsCount "^/addons/([^/]+)/([^/]+)/\2-([0-9.]+)\.zip$" "prod: \2 os: \1 version: \3 lang: --"
16 |
17 |
18 | StatsPostfilter "(prod|os|version|lang): " ""
19 | # FIXME: we didn't need to add those words in the first place; not needed at all.
20 | # they were just useful for orientation.
21 |
22 |
23 | # vim: ft=apache ai ts=4 sw=4 smarttab expandtab smarttab
24 |
--------------------------------------------------------------------------------
/tools/Makefile:
--------------------------------------------------------------------------------
1 | prefix = /usr/local
2 | exec_prefix = $(prefix)
3 | bindir = $(exec_prefix)/bin
4 | mandir = $(prefix)/share/man
5 | sysconfdir = $(prefix)/etc
6 | datadir = $(prefix)/share
7 | docdir = $(datadir)/doc/packages
8 |
9 | BINDIR = $(PREFIX)/bin
10 | MANDIR = $(PREFIX)/share/man
11 |
12 | INSTALL = install
13 | RONN = ronn-1.9
14 |
15 |
16 | null-rsync.1: null-rsync.1.ronn
17 | $(RONN) --roff $<
18 | $(RONN) --html $<
19 |
20 | install: null-rsync null-rsync.1
21 | $(INSTALL) -d $(DESTDIR)$(bindir)
22 | $(INSTALL) -d $(DESTDIR)$(mandir)/man1
23 | $(INSTALL) -d $(DESTDIR)$(docdir)/mirrorbrain-tools
24 | $(INSTALL) null-rsync $(DESTDIR)$(bindir)
25 | $(INSTALL) -m 0644 null-rsync.1 $(DESTDIR)$(mandir)/man1
26 | $(INSTALL) -m 0644 null-rsync.1.html README.md $(DESTDIR)$(docdir)/mirrorbrain-tools
27 |
28 |
--------------------------------------------------------------------------------
/tools/README:
--------------------------------------------------------------------------------
1 | This directory contains some tools that are used by the "mb" tool, or are
2 | packaged just for conveniency.
3 |
4 |
5 |
6 | Needed by "mb" (and therefore required to be placed within $PATH) are:
7 |
8 | geoiplookup_continent.c
9 | A minimal clone of the "standard" geoiplookup tool (which comes with GeoIP),
10 | just that it can print out the continent, which the standard tool can't.
11 | Install it to /usr/bin/geoiplookup_continent
12 |
13 | scanner.pl
14 | The scanner, for now written in Perl, which is integral part of MirrorBrain.
15 | Install it as /usr/bin/scanner. You don't execute it directly though.
16 | It's called for you when you use the command "mb scan".
17 |
18 |
19 | Optional tools:
20 |
21 | geoip-lite-update
22 | Can fetch updated databases from GeoIP
23 |
24 |
25 | Additional tools that may or may not be useful for operators of MirrorBrain, or
26 | of a mirror infrastructure in general. You can ignore them for a MirrorBrain
27 | install:
28 |
29 | create_timestamp
30 | Creates a small file containing a timestamp which can be used to let it
31 | spread to mirrors, so to check them for uptodate-ness.
32 |
33 | geoiplookup_city.c
34 | Show details from a city GeoIP database, similar to what the standard
35 | geoiplookup tool does, but also shows the continent.
36 |
37 | mirrorprobe-logrotate
38 | Logrotate snippet for the /var/log/mirrorbrain/mirrorprobe.log file
39 |
40 | push2mirrors
41 | Skeleton script to push content to mirrors, via rsync, in parallel.
42 |
43 | rsyncusers
44 | Tool to summarize rsync uses from an rsync log file
45 | rsyncusers.sh
46 | Same tool in a more stupid but more portable shell implementation
47 |
48 | rsyncinfo
49 | Tool to assess the size of rsync modules on a remote server, or a
50 | subdirectory
51 |
52 | bdecode
53 | Parse a Torrent file (or other BEncoded input), and pretty-print it.
54 | Can read from standard input: curl -s | bdecode
55 | Useful to work on the Torrent generator in mod_mirrorbrain.
56 |
--------------------------------------------------------------------------------
/tools/bdecode:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 |
3 | # Bencode decoder
4 | #
5 | # This code is in the public domain
6 | # http://buffis.com/2007/07/28/bittorrent-bencode-decoder-in-python-using-30-lines-of-code/
7 |
8 | import fileinput
9 | from pprint import pprint
10 |
11 | class Decoder(object):
12 | def __init__(self, data): self.data, self.ptr = data, 0
13 | def _cur(self): return self.data[self.ptr]
14 | def _get(self, x):
15 | self.ptr += x
16 | return self.data[self.ptr-x:self.ptr]
17 | def _get_int_until(self, c):
18 | num = int(self._get(self.data.index(c, self.ptr)-self.ptr))
19 | self._get(1) # kill extra char
20 | return num
21 | def _get_str(self): return self._get(self._get_int_until(":"))
22 | def _get_int(self): return self._get_int_until("e")
23 | def decode(self):
24 | i = self._get(1)
25 | if i == "d":
26 | r = {}
27 | while self._cur() != "e":
28 | key = self._get_str()
29 | val = self.decode()
30 | r[key] = val
31 | self._get(1)
32 | elif i == "l":
33 | r = []
34 | while self._cur() != "e": r.append(self.decode())
35 | self._get(1)
36 | elif i == "i": r = self._get_int()
37 | elif i.isdigit():
38 | self._get(-1) # reeeeewind
39 | r = self._get_str()
40 | return r
41 |
42 |
43 | lines = []
44 | for line in fileinput.input():
45 | lines.append(line)
46 | #print repr(''.join(lines))
47 |
48 | d=Decoder(''.join(lines))
49 | pprint(d.decode())
50 |
--------------------------------------------------------------------------------
/tools/geoip-lite-update:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # geoip-lite-update -- update geoip lite database(s).
4 | # (c) 2008,2009,2010,2011,2012,2013,2014 poeml@cmdline.net
5 | # Distribute under GPLv2 if it proves worthy.
6 |
7 | for i in curl wget ftp; do
8 | if which $i &>/dev/null; then
9 | prg=$i
10 | break
11 | fi
12 | done
13 |
14 | if [ -z "$prg" ]; then
15 | echo cannot find a tool to download, like curl or wget >&2
16 | exit 1
17 | fi
18 |
19 | case $prg in
20 | curl)
21 | prg="curl -s -O"
22 | ;;
23 | wget)
24 | prg="wget --quiet"
25 | ;;
26 | esac
27 |
28 |
29 | set -e
30 |
31 | # GeoIP data used to be in /usr/share/GeoIP in the openSUSE package, and was moved later.
32 | # try the old location first - if it's present, it means that the user had his own
33 | # updated database there
34 | cd /usr/share/GeoIP/ 2>/dev/null || cd /var/lib/GeoIP
35 |
36 | $prg http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
37 | rm -f GeoIP.dat.gz.1
38 | gunzip -c GeoIP.dat.gz > GeoIP.dat.updated.new
39 | mv GeoIP.dat.updated.new GeoIP.dat.updated
40 |
41 | $prg http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
42 | rm -f GeoLiteCity.dat.gz.1
43 | gunzip -c GeoLiteCity.dat.gz > GeoLiteCity.dat.updated.new
44 | mv GeoLiteCity.dat.updated.new GeoLiteCity.dat.updated
45 |
46 | $prg http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz
47 | rm -f GeoIPv6.dat.gz.1
48 | gunzip -c GeoIPv6.dat.gz > GeoIPv6.dat.updated.new
49 | mv GeoIPv6.dat.updated.new GeoIPv6.dat.updated
50 |
51 | set +e
52 |
53 | if [ "$1" = "--no-reload" ]; then
54 | exit 0
55 | fi
56 |
57 | if [ -x /etc/init.d/apache2 ]; then
58 | /etc/init.d/apache2 reload
59 | elif [ -x /etc/init.d/httpd ]; then
60 | /etc/init.d/httpd reload
61 | elif [ -x /usr/bin/systemctl ]; then
62 | /usr/bin/systemctl reload httpd >/dev/null 2>&1 || :
63 | elif [ -x /bin/systemctl ]; then
64 | /bin/systemctl reload httpd >/dev/null 2>&1 || :
65 | fi
66 |
67 |
--------------------------------------------------------------------------------
/tools/geoiplookup_continent.c:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2007,2008,2009,2010,2011,2012 Peter Poeml
3 | *
4 | * This program is free software; you can redistribute it and/or
5 | * modify it under the terms of the GNU General Public License version 2
6 | * as published by the Free Software Foundation;
7 | *
8 | * This program is distributed in the hope that it will be useful,
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 | * GNU General Public License for more details.
12 | *
13 | * You should have received a copy of the GNU General Public License
14 | * along with this program; if not, write to the Free Software
15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
16 | *
17 | *
18 | *
19 | * handy tool to look up the continent of an IP address or DNS name
20 | *
21 | * It should be possible to compile this as such:
22 | * gcc -g -Wall -lGeoIP -o geoiplookup_continent geoiplookup_continent.c */
23 |
24 | #include
25 | #include
26 | #include
27 |
28 | #ifndef DEFAULT_GEOIPFILE
29 | #define DEFAULT_GEOIPFILE "/var/lib/GeoIP/GeoIP.dat"
30 | #endif
31 |
32 | int main(int argc, char **argv) {
33 | const char *geoipfilename = DEFAULT_GEOIPFILE;
34 | GeoIP *gip = NULL;
35 | GeoIPRecord *gir = NULL;
36 | char *name;
37 | const char *region_name;
38 | int edition, i;
39 |
40 | if ((argc != 2) && (argc != 4)) {
41 | printf("Usage: geoiplookup_continent [-f custom_file] \n");
42 | return 1;
43 | }
44 |
45 | i = 1;
46 | while (i < argc) {
47 | if (strcmp(argv[i],"-f") == 0) {
48 | if ((i+1) < argc){
49 | i++;
50 | geoipfilename = argv[i];
51 | }
52 | } else {
53 | name = argv[i];
54 | }
55 | i++;
56 | }
57 |
58 | gip = GeoIP_open(geoipfilename, GEOIP_STANDARD);
59 | if (gip == NULL) {
60 | printf("An error occured during GeoIP_open\n");
61 | return 1;
62 | }
63 | edition = GeoIP_database_edition(gip);
64 |
65 | if (edition == GEOIP_COUNTRY_EDITION) {
66 | short int country_id = GeoIP_country_id_by_name(gip, name);
67 | region_name = GeoIP_country_continent[country_id];
68 | printf("%s\n", region_name);
69 |
70 | } else if ((edition == GEOIP_CITY_EDITION_REV0) ||
71 | (edition == GEOIP_CITY_EDITION_REV1)) {
72 | gir = GeoIP_record_by_name(gip, name);
73 | if (NULL == gir) {
74 | /* printf("%s: IP Address not found\n", GeoIPDBDescription[edition]); */
75 | printf("--\n");
76 | return 1;
77 | } else {
78 | printf("%s\n", gir->continent_code);
79 | }
80 | }
81 |
82 | return 0;
83 | }
84 |
85 |
--------------------------------------------------------------------------------
/tools/mirrorprobe-logrotate:
--------------------------------------------------------------------------------
1 | /var/log/mirrorprobe.log {
2 | compress
3 | dateext
4 | rotate 99
5 | size=+16M
6 | notifempty
7 | missingok
8 | create 660 root mirrorbrain
9 | }
10 |
11 | /var/log/mirrorbrain/mirrorprobe.log {
12 | compress
13 | dateext
14 | rotate 99
15 | size=+16M
16 | notifempty
17 | missingok
18 | create 640 mirrorbrain mirrorbrain
19 | }
20 |
21 |
--------------------------------------------------------------------------------
/tools/null-rsync.1:
--------------------------------------------------------------------------------
1 | .\" generated with Ronn/v0.7.3
2 | .\" http://github.com/rtomayko/ronn/tree/0.7.3
3 | .
4 | .TH "NULL\-RSYNC" "1" "June 2015" "" ""
5 | .
6 | .SH "NAME"
7 | \fBnull\-rsync\fR \- mirror a file tree to sparse files
8 | .
9 | .SH "SYNOPSIS"
10 | \fBnull\-rsync\fR [\fIoptions\fR] \fIrsync_source_url\fR \fIlocal_path\fR
11 | .
12 | .br
13 | \fBnull\-rsync\fR [\fB\-\-exclude\fR=\fIpattern\fR] [\fB\-q\fR|\fB\-\-quiet\fR] [\fB\-v\fR|\fB\-\-verbose\fR] \fIrsync_source_url\fR \fIlocal_path\fR
14 | .
15 | .br
16 | \fBnull\-rsync\fR [\fB\-h\fR|\fB\-\-help\fR]
17 | .
18 | .br
19 | \fBnull\-rsync\fR [\fB\-\-version\fR]
20 | .
21 | .SH "DESCRIPTION"
22 | null\-rsync(1) mimics rsync(1), but can save massive amounts of time and diskspace if you need a copy of a file tree for testing purposes\. If you don\'t care if the files contain zeroes, null\-rsync(1) will create a filetree as a copy from a remote host, just like rsync does\. But all files will contain only zeroes\. Moreover, they will be created as sparse files that don\'t take disk space (besids metadata of the filesystem itself)\.
23 | .
24 | .P
25 | Technically, to get the file metadata over rsync, rsync\'s own itemized output is used, because it tells us all we need to know:
26 | .
27 | .IP "" 4
28 | .
29 | .nf
30 |
31 | del\. rw\-r\-\-r\-\- *deleting ultimate\-edition\-1\.9\-x64\.iso 0 1970/01/01\-01:00:00
32 | recv rwxr\-xr\-x cd+++++++++ firefox/releases/3\.0\.15/ 4096 2009/10/26\-19:23:12
33 | recv rw\-r\-\-r\-\- >f+++++++++ firefox/releases/3\.0\.15/MD5SUMS 54256 2009/10/26\-19:21:21
34 | .
35 | .fi
36 | .
37 | .IP "" 0
38 | .
39 | .P
40 | null\-rsync(1) copies all permissions and timestamps where possible\. An exception are timestamps on symlinks, that can\'t be set by Python (its \fBos\.utime()\fR implementation always follows to the target)\. (It \fIwould\fR work if Python would export \fButimensat()\fR with \fBAT_SYMLINK_NOFOLLOW\fR\. See utimensat(2)\.) But it doesn\'t really matter\.
41 | .
42 | .P
43 | null\-rsync(1) can be run again and again to synchronize the local tree with upstream changes\. Just like you would do with rsync(1)\.
44 | .
45 | .SH "SECURITY"
46 | If the remote source contains world\-writable directories, they are not made world\-writable locally\.
47 | .
48 | .SH "OPTIONS"
49 | .
50 | .TP
51 | \fB\-v\fR, \fB\-\-verbose\fR
52 | Print debug messages to stderr\.
53 | .
54 | .TP
55 | \fB\-q\fR, \fB\-\-quiet\fR
56 | If lock can\'t be acquired immediately, silently quit without error\.
57 | .
58 | .TP
59 | \fB\-\-version\fR
60 | Show program\'s version number and exit\.
61 | .
62 | .TP
63 | \fB\-h\fR, \fB\-\-help\fR
64 | Show command synopsis and exit\.
65 | .
66 | .TP
67 | \fB\-\-exclude\fR=\fIpattern\fR
68 | Exclude files matching \fIpattern\fR (which is passed through to rsync)
69 | .
70 | .SH "EXAMPLES"
71 | You can simply substitute a usual rsync(1) call with null\-rsync(1)\.
72 | .
73 | .IP "" 4
74 | .
75 | .nf
76 |
77 | null\-rsync \-\-exclude source rsync://mirrors\.tds\.net/debian/dists/jessie/main/ /tmp/sparse\-debian\-mirror
78 | .
79 | .fi
80 | .
81 | .IP "" 0
82 | .
83 | .SH "AUTHOR"
84 | This program was written by Peter Pöml \fIpeter@poeml\.de\fR in 2009\-2015\.
85 | .
86 | .SH "SEE ALSO"
87 | rsync(1)
88 |
--------------------------------------------------------------------------------
/tools/null-rsync.1.ronn:
--------------------------------------------------------------------------------
1 | null-rsync(1) -- mirror a file tree to sparse files
2 | ===================================================
3 |
4 | ## SYNOPSIS
5 |
6 | `null-rsync` []
7 | `null-rsync` [`--exclude`=] [`-q`|`--quiet`] [`-v`|`--verbose`]
8 | `null-rsync` [`-h`|`--help`]
9 | `null-rsync` [`--version`]
10 |
11 |
12 | ## DESCRIPTION
13 |
14 | null-rsync(1) mimics rsync(1), but can save massive amounts of time and
15 | diskspace if you need a copy of a file tree for testing purposes. If you don't
16 | care if the files contain zeroes, null-rsync(1) will create a filetree as a
17 | copy from a remote host, just like rsync does. But all files will contain only
18 | zeroes. Moreover, they will be created as sparse files that don't take disk
19 | space (besids metadata of the filesystem itself).
20 |
21 | Technically, to get the file metadata over rsync, rsync's own itemized output
22 | is used, because it tells us all we need to know:
23 | del. rw-r--r-- *deleting ultimate-edition-1.9-x64.iso 0 1970/01/01-01:00:00
24 | recv rwxr-xr-x cd+++++++++ firefox/releases/3.0.15/ 4096 2009/10/26-19:23:12
25 | recv rw-r--r-- >f+++++++++ firefox/releases/3.0.15/MD5SUMS 54256 2009/10/26-19:21:21
26 |
27 | null-rsync(1) copies all permissions and timestamps where possible. An
28 | exception are timestamps on symlinks, that can't be set by Python (its
29 | `os.utime()` implementation always follows to the target). (It *would* work if
30 | Python would export `utimensat()` with `AT_SYMLINK_NOFOLLOW`. See
31 | utimensat(2).) But it doesn't really matter.
32 |
33 | null-rsync(1) can be run again and again to synchronize the local tree with
34 | upstream changes. Just like you would do with rsync(1).
35 |
36 | ## SECURITY
37 |
38 | If the remote source contains world-writable directories, they are not made
39 | world-writable locally.
40 |
41 | ## OPTIONS
42 |
43 | * `-v`, `--verbose`:
44 | Print debug messages to stderr.
45 |
46 | * `-q`, `--quiet`:
47 | If lock can't be acquired immediately, silently quit without error.
48 |
49 | * `--version`:
50 | Show program's version number and exit.
51 |
52 | * `-h`, `--help`:
53 | Show command synopsis and exit.
54 |
55 | * `--exclude`=:
56 | Exclude files matching (which is passed through to rsync)
57 |
58 |
59 | ## EXAMPLES
60 |
61 | You can simply substitute a usual rsync(1) call with null-rsync(1).
62 |
63 | null-rsync --exclude source rsync://mirrors.tds.net/debian/dists/jessie/main/ /tmp/sparse-debian-mirror
64 |
65 |
66 | ## AUTHOR
67 |
68 | This program was written by Peter Pöml in 2009-2015.
69 |
70 | ## SEE ALSO
71 |
72 | rsync(1)
73 |
--------------------------------------------------------------------------------
/tools/rsyncusers.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # analyze rsync logfile to list rsync users per rsync module
4 |
5 | # Copyright 2008,2009,2010,2011,2012 Peter Poeml
6 | #
7 | # This program is free software; you can redistribute it and/or
8 | # modify it under the terms of the GNU General Public License version 2
9 | # as published by the Free Software Foundation;
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 |
20 | __version__='1.0'
21 | __author__='Peter Poeml '
22 | __copyright__='Peter poeml '
23 | __license__='GPLv2'
24 | __url__='http://mirrorbrain.org'
25 |
26 |
27 | LOGFILE=${1:?An rsync logfile is needed as argument. (It may be compressed.)}
28 |
29 | case $LOGFILE in
30 | *.bz2) CAT=bzcat; GREP=zgrep;;
31 | *.gz) CAT=zcat; GREP=zgrep;;
32 | *) CAT=cat; GREP=grep;;
33 | esac
34 |
35 | $CAT $LOGFILE | \
36 | for i in $(grep "rsync on " | awk '{ print $6 }' | cut -d/ -f1 | sort | uniq); do
37 | echo
38 | echo $i
39 | $GREP "rsync on $i" $LOGFILE \
40 | | awk '{ printf " %-18s %s\n", $9, $8 }' \
41 | | sed 's/(//g ; s/)//g' \
42 | | sort -n \
43 | | uniq
44 | done
45 |
46 |
--------------------------------------------------------------------------------