diff --git a/Cargo.lock b/Cargo.lock
index 0680d62..df51821 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -512,6 +512,7 @@ dependencies = [
"include_dir",
"jwt-simple",
"lazy-regex",
+ "lazy_static",
"log",
"mime_guess",
"qrcode-generator",
diff --git a/Cargo.toml b/Cargo.toml
index b723d5e..1488e24 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -36,4 +36,5 @@ webauthn-rs = { version = "0.4.7", features = ["danger-allow-state-serialisation
url = "2.3.1"
aes-gcm = { version = "0.10.1", features = ["aes"] }
bincode = "1.3.3"
-chrono = "0.4.22"
\ No newline at end of file
+chrono = "0.4.22"
+lazy_static = "1.4.0"
\ No newline at end of file
diff --git a/assets/img/countries/ac.png b/assets/img/countries/ac.png
new file mode 100644
index 0000000..d3508b4
Binary files /dev/null and b/assets/img/countries/ac.png differ
diff --git a/assets/img/countries/ad.png b/assets/img/countries/ad.png
new file mode 100644
index 0000000..206df81
Binary files /dev/null and b/assets/img/countries/ad.png differ
diff --git a/assets/img/countries/ae.png b/assets/img/countries/ae.png
new file mode 100644
index 0000000..6833162
Binary files /dev/null and b/assets/img/countries/ae.png differ
diff --git a/assets/img/countries/af.png b/assets/img/countries/af.png
new file mode 100644
index 0000000..bb14bc6
Binary files /dev/null and b/assets/img/countries/af.png differ
diff --git a/assets/img/countries/ag.png b/assets/img/countries/ag.png
new file mode 100644
index 0000000..4f0d39f
Binary files /dev/null and b/assets/img/countries/ag.png differ
diff --git a/assets/img/countries/ai.png b/assets/img/countries/ai.png
new file mode 100644
index 0000000..cba2aee
Binary files /dev/null and b/assets/img/countries/ai.png differ
diff --git a/assets/img/countries/al.png b/assets/img/countries/al.png
new file mode 100644
index 0000000..5e49b1b
Binary files /dev/null and b/assets/img/countries/al.png differ
diff --git a/assets/img/countries/am.png b/assets/img/countries/am.png
new file mode 100644
index 0000000..b1b0e0b
Binary files /dev/null and b/assets/img/countries/am.png differ
diff --git a/assets/img/countries/ao.png b/assets/img/countries/ao.png
new file mode 100644
index 0000000..85de752
Binary files /dev/null and b/assets/img/countries/ao.png differ
diff --git a/assets/img/countries/aq.png b/assets/img/countries/aq.png
new file mode 100644
index 0000000..d5127e1
Binary files /dev/null and b/assets/img/countries/aq.png differ
diff --git a/assets/img/countries/ar.png b/assets/img/countries/ar.png
new file mode 100644
index 0000000..383a7d3
Binary files /dev/null and b/assets/img/countries/ar.png differ
diff --git a/assets/img/countries/as.png b/assets/img/countries/as.png
new file mode 100644
index 0000000..05136ff
Binary files /dev/null and b/assets/img/countries/as.png differ
diff --git a/assets/img/countries/at.png b/assets/img/countries/at.png
new file mode 100644
index 0000000..2857e10
Binary files /dev/null and b/assets/img/countries/at.png differ
diff --git a/assets/img/countries/au.png b/assets/img/countries/au.png
new file mode 100644
index 0000000..6f6957b
Binary files /dev/null and b/assets/img/countries/au.png differ
diff --git a/assets/img/countries/aw.png b/assets/img/countries/aw.png
new file mode 100644
index 0000000..c5dde1a
Binary files /dev/null and b/assets/img/countries/aw.png differ
diff --git a/assets/img/countries/ax.png b/assets/img/countries/ax.png
new file mode 100644
index 0000000..485020f
Binary files /dev/null and b/assets/img/countries/ax.png differ
diff --git a/assets/img/countries/az.png b/assets/img/countries/az.png
new file mode 100644
index 0000000..1d48556
Binary files /dev/null and b/assets/img/countries/az.png differ
diff --git a/assets/img/countries/ba.png b/assets/img/countries/ba.png
new file mode 100644
index 0000000..105b67b
Binary files /dev/null and b/assets/img/countries/ba.png differ
diff --git a/assets/img/countries/bb.png b/assets/img/countries/bb.png
new file mode 100644
index 0000000..20b0e61
Binary files /dev/null and b/assets/img/countries/bb.png differ
diff --git a/assets/img/countries/bd.png b/assets/img/countries/bd.png
new file mode 100644
index 0000000..8cc8a25
Binary files /dev/null and b/assets/img/countries/bd.png differ
diff --git a/assets/img/countries/be.png b/assets/img/countries/be.png
new file mode 100644
index 0000000..9a598e4
Binary files /dev/null and b/assets/img/countries/be.png differ
diff --git a/assets/img/countries/bf.png b/assets/img/countries/bf.png
new file mode 100644
index 0000000..d9999ae
Binary files /dev/null and b/assets/img/countries/bf.png differ
diff --git a/assets/img/countries/bg.png b/assets/img/countries/bg.png
new file mode 100644
index 0000000..0126066
Binary files /dev/null and b/assets/img/countries/bg.png differ
diff --git a/assets/img/countries/bh.png b/assets/img/countries/bh.png
new file mode 100644
index 0000000..ea6f53c
Binary files /dev/null and b/assets/img/countries/bh.png differ
diff --git a/assets/img/countries/bi.png b/assets/img/countries/bi.png
new file mode 100644
index 0000000..5892748
Binary files /dev/null and b/assets/img/countries/bi.png differ
diff --git a/assets/img/countries/bj.png b/assets/img/countries/bj.png
new file mode 100644
index 0000000..6533cdd
Binary files /dev/null and b/assets/img/countries/bj.png differ
diff --git a/assets/img/countries/bl.png b/assets/img/countries/bl.png
new file mode 100644
index 0000000..08ce439
Binary files /dev/null and b/assets/img/countries/bl.png differ
diff --git a/assets/img/countries/bm.png b/assets/img/countries/bm.png
new file mode 100644
index 0000000..8287abf
Binary files /dev/null and b/assets/img/countries/bm.png differ
diff --git a/assets/img/countries/bn.png b/assets/img/countries/bn.png
new file mode 100644
index 0000000..0529ca4
Binary files /dev/null and b/assets/img/countries/bn.png differ
diff --git a/assets/img/countries/bo.png b/assets/img/countries/bo.png
new file mode 100644
index 0000000..dc88687
Binary files /dev/null and b/assets/img/countries/bo.png differ
diff --git a/assets/img/countries/bq.png b/assets/img/countries/bq.png
new file mode 100644
index 0000000..3097029
Binary files /dev/null and b/assets/img/countries/bq.png differ
diff --git a/assets/img/countries/br.png b/assets/img/countries/br.png
new file mode 100644
index 0000000..1c78001
Binary files /dev/null and b/assets/img/countries/br.png differ
diff --git a/assets/img/countries/bs.png b/assets/img/countries/bs.png
new file mode 100644
index 0000000..cdce24d
Binary files /dev/null and b/assets/img/countries/bs.png differ
diff --git a/assets/img/countries/bt.png b/assets/img/countries/bt.png
new file mode 100644
index 0000000..0c0ae17
Binary files /dev/null and b/assets/img/countries/bt.png differ
diff --git a/assets/img/countries/bv.png b/assets/img/countries/bv.png
new file mode 100644
index 0000000..4af066a
Binary files /dev/null and b/assets/img/countries/bv.png differ
diff --git a/assets/img/countries/bw.png b/assets/img/countries/bw.png
new file mode 100644
index 0000000..9f05ff3
Binary files /dev/null and b/assets/img/countries/bw.png differ
diff --git a/assets/img/countries/by.png b/assets/img/countries/by.png
new file mode 100644
index 0000000..d209417
Binary files /dev/null and b/assets/img/countries/by.png differ
diff --git a/assets/img/countries/bz.png b/assets/img/countries/bz.png
new file mode 100644
index 0000000..6ad69ea
Binary files /dev/null and b/assets/img/countries/bz.png differ
diff --git a/assets/img/countries/ca.png b/assets/img/countries/ca.png
new file mode 100644
index 0000000..16a83b7
Binary files /dev/null and b/assets/img/countries/ca.png differ
diff --git a/assets/img/countries/cc.png b/assets/img/countries/cc.png
new file mode 100644
index 0000000..55e45c7
Binary files /dev/null and b/assets/img/countries/cc.png differ
diff --git a/assets/img/countries/cd.png b/assets/img/countries/cd.png
new file mode 100644
index 0000000..7cd90ec
Binary files /dev/null and b/assets/img/countries/cd.png differ
diff --git a/assets/img/countries/cefta.png b/assets/img/countries/cefta.png
new file mode 100644
index 0000000..2fd6b76
Binary files /dev/null and b/assets/img/countries/cefta.png differ
diff --git a/assets/img/countries/cf.png b/assets/img/countries/cf.png
new file mode 100644
index 0000000..d412896
Binary files /dev/null and b/assets/img/countries/cf.png differ
diff --git a/assets/img/countries/cg.png b/assets/img/countries/cg.png
new file mode 100644
index 0000000..0cb2979
Binary files /dev/null and b/assets/img/countries/cg.png differ
diff --git a/assets/img/countries/ch.png b/assets/img/countries/ch.png
new file mode 100644
index 0000000..300d65f
Binary files /dev/null and b/assets/img/countries/ch.png differ
diff --git a/assets/img/countries/ci.png b/assets/img/countries/ci.png
new file mode 100644
index 0000000..30e8428
Binary files /dev/null and b/assets/img/countries/ci.png differ
diff --git a/assets/img/countries/ck.png b/assets/img/countries/ck.png
new file mode 100644
index 0000000..9c6e39e
Binary files /dev/null and b/assets/img/countries/ck.png differ
diff --git a/assets/img/countries/cl.png b/assets/img/countries/cl.png
new file mode 100644
index 0000000..99dad32
Binary files /dev/null and b/assets/img/countries/cl.png differ
diff --git a/assets/img/countries/cm.png b/assets/img/countries/cm.png
new file mode 100644
index 0000000..f193243
Binary files /dev/null and b/assets/img/countries/cm.png differ
diff --git a/assets/img/countries/cn.png b/assets/img/countries/cn.png
new file mode 100644
index 0000000..b77d2d2
Binary files /dev/null and b/assets/img/countries/cn.png differ
diff --git a/assets/img/countries/co.png b/assets/img/countries/co.png
new file mode 100644
index 0000000..7962fe0
Binary files /dev/null and b/assets/img/countries/co.png differ
diff --git a/assets/img/countries/cp.png b/assets/img/countries/cp.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/cp.png differ
diff --git a/assets/img/countries/cr.png b/assets/img/countries/cr.png
new file mode 100644
index 0000000..9c5dfc4
Binary files /dev/null and b/assets/img/countries/cr.png differ
diff --git a/assets/img/countries/cu.png b/assets/img/countries/cu.png
new file mode 100644
index 0000000..77db169
Binary files /dev/null and b/assets/img/countries/cu.png differ
diff --git a/assets/img/countries/cv.png b/assets/img/countries/cv.png
new file mode 100644
index 0000000..08d8674
Binary files /dev/null and b/assets/img/countries/cv.png differ
diff --git a/assets/img/countries/cw.png b/assets/img/countries/cw.png
new file mode 100644
index 0000000..39f967d
Binary files /dev/null and b/assets/img/countries/cw.png differ
diff --git a/assets/img/countries/cx.png b/assets/img/countries/cx.png
new file mode 100644
index 0000000..ddc4243
Binary files /dev/null and b/assets/img/countries/cx.png differ
diff --git a/assets/img/countries/cy.png b/assets/img/countries/cy.png
new file mode 100644
index 0000000..84cbb45
Binary files /dev/null and b/assets/img/countries/cy.png differ
diff --git a/assets/img/countries/cz.png b/assets/img/countries/cz.png
new file mode 100644
index 0000000..18aee74
Binary files /dev/null and b/assets/img/countries/cz.png differ
diff --git a/assets/img/countries/de.png b/assets/img/countries/de.png
new file mode 100644
index 0000000..cb64fdd
Binary files /dev/null and b/assets/img/countries/de.png differ
diff --git a/assets/img/countries/dg.png b/assets/img/countries/dg.png
new file mode 100644
index 0000000..8cdfe20
Binary files /dev/null and b/assets/img/countries/dg.png differ
diff --git a/assets/img/countries/dj.png b/assets/img/countries/dj.png
new file mode 100644
index 0000000..17e4f3a
Binary files /dev/null and b/assets/img/countries/dj.png differ
diff --git a/assets/img/countries/dk.png b/assets/img/countries/dk.png
new file mode 100644
index 0000000..29baf9c
Binary files /dev/null and b/assets/img/countries/dk.png differ
diff --git a/assets/img/countries/dm.png b/assets/img/countries/dm.png
new file mode 100644
index 0000000..aa490c3
Binary files /dev/null and b/assets/img/countries/dm.png differ
diff --git a/assets/img/countries/do.png b/assets/img/countries/do.png
new file mode 100644
index 0000000..3f0ed4f
Binary files /dev/null and b/assets/img/countries/do.png differ
diff --git a/assets/img/countries/dz.png b/assets/img/countries/dz.png
new file mode 100644
index 0000000..01e70e2
Binary files /dev/null and b/assets/img/countries/dz.png differ
diff --git a/assets/img/countries/ea.png b/assets/img/countries/ea.png
new file mode 100644
index 0000000..0d66ccf
Binary files /dev/null and b/assets/img/countries/ea.png differ
diff --git a/assets/img/countries/ec.png b/assets/img/countries/ec.png
new file mode 100644
index 0000000..a4a2e47
Binary files /dev/null and b/assets/img/countries/ec.png differ
diff --git a/assets/img/countries/ee.png b/assets/img/countries/ee.png
new file mode 100644
index 0000000..3f6c179
Binary files /dev/null and b/assets/img/countries/ee.png differ
diff --git a/assets/img/countries/eg.png b/assets/img/countries/eg.png
new file mode 100644
index 0000000..5079c49
Binary files /dev/null and b/assets/img/countries/eg.png differ
diff --git a/assets/img/countries/eh.png b/assets/img/countries/eh.png
new file mode 100644
index 0000000..9724b9a
Binary files /dev/null and b/assets/img/countries/eh.png differ
diff --git a/assets/img/countries/er.png b/assets/img/countries/er.png
new file mode 100644
index 0000000..7473f68
Binary files /dev/null and b/assets/img/countries/er.png differ
diff --git a/assets/img/countries/es-ct.png b/assets/img/countries/es-ct.png
new file mode 100644
index 0000000..df55eff
Binary files /dev/null and b/assets/img/countries/es-ct.png differ
diff --git a/assets/img/countries/es-ga.png b/assets/img/countries/es-ga.png
new file mode 100644
index 0000000..b31af94
Binary files /dev/null and b/assets/img/countries/es-ga.png differ
diff --git a/assets/img/countries/es.png b/assets/img/countries/es.png
new file mode 100644
index 0000000..0d66ccf
Binary files /dev/null and b/assets/img/countries/es.png differ
diff --git a/assets/img/countries/et.png b/assets/img/countries/et.png
new file mode 100644
index 0000000..4840387
Binary files /dev/null and b/assets/img/countries/et.png differ
diff --git a/assets/img/countries/eu.png b/assets/img/countries/eu.png
new file mode 100644
index 0000000..78679e4
Binary files /dev/null and b/assets/img/countries/eu.png differ
diff --git a/assets/img/countries/fi.png b/assets/img/countries/fi.png
new file mode 100644
index 0000000..8c09c9c
Binary files /dev/null and b/assets/img/countries/fi.png differ
diff --git a/assets/img/countries/fj.png b/assets/img/countries/fj.png
new file mode 100644
index 0000000..9b433e0
Binary files /dev/null and b/assets/img/countries/fj.png differ
diff --git a/assets/img/countries/fk.png b/assets/img/countries/fk.png
new file mode 100644
index 0000000..4868ba6
Binary files /dev/null and b/assets/img/countries/fk.png differ
diff --git a/assets/img/countries/fm.png b/assets/img/countries/fm.png
new file mode 100644
index 0000000..0d1262b
Binary files /dev/null and b/assets/img/countries/fm.png differ
diff --git a/assets/img/countries/fo.png b/assets/img/countries/fo.png
new file mode 100644
index 0000000..3f16d8c
Binary files /dev/null and b/assets/img/countries/fo.png differ
diff --git a/assets/img/countries/fr.png b/assets/img/countries/fr.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/fr.png differ
diff --git a/assets/img/countries/ga.png b/assets/img/countries/ga.png
new file mode 100644
index 0000000..769ec01
Binary files /dev/null and b/assets/img/countries/ga.png differ
diff --git a/assets/img/countries/gb-eng.png b/assets/img/countries/gb-eng.png
new file mode 100644
index 0000000..e54ceff
Binary files /dev/null and b/assets/img/countries/gb-eng.png differ
diff --git a/assets/img/countries/gb-nir.png b/assets/img/countries/gb-nir.png
new file mode 100644
index 0000000..d1431b7
Binary files /dev/null and b/assets/img/countries/gb-nir.png differ
diff --git a/assets/img/countries/gb-sct.png b/assets/img/countries/gb-sct.png
new file mode 100644
index 0000000..694f99e
Binary files /dev/null and b/assets/img/countries/gb-sct.png differ
diff --git a/assets/img/countries/gb-wls.png b/assets/img/countries/gb-wls.png
new file mode 100644
index 0000000..aedfe06
Binary files /dev/null and b/assets/img/countries/gb-wls.png differ
diff --git a/assets/img/countries/gb.png b/assets/img/countries/gb.png
new file mode 100644
index 0000000..b724a01
Binary files /dev/null and b/assets/img/countries/gb.png differ
diff --git a/assets/img/countries/gd.png b/assets/img/countries/gd.png
new file mode 100644
index 0000000..46e910e
Binary files /dev/null and b/assets/img/countries/gd.png differ
diff --git a/assets/img/countries/ge.png b/assets/img/countries/ge.png
new file mode 100644
index 0000000..287a0b9
Binary files /dev/null and b/assets/img/countries/ge.png differ
diff --git a/assets/img/countries/gf.png b/assets/img/countries/gf.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/gf.png differ
diff --git a/assets/img/countries/gg.png b/assets/img/countries/gg.png
new file mode 100644
index 0000000..b6a9d08
Binary files /dev/null and b/assets/img/countries/gg.png differ
diff --git a/assets/img/countries/gh.png b/assets/img/countries/gh.png
new file mode 100644
index 0000000..4e4980a
Binary files /dev/null and b/assets/img/countries/gh.png differ
diff --git a/assets/img/countries/gi.png b/assets/img/countries/gi.png
new file mode 100644
index 0000000..88c6565
Binary files /dev/null and b/assets/img/countries/gi.png differ
diff --git a/assets/img/countries/gl.png b/assets/img/countries/gl.png
new file mode 100644
index 0000000..f979999
Binary files /dev/null and b/assets/img/countries/gl.png differ
diff --git a/assets/img/countries/gm.png b/assets/img/countries/gm.png
new file mode 100644
index 0000000..7052054
Binary files /dev/null and b/assets/img/countries/gm.png differ
diff --git a/assets/img/countries/gn.png b/assets/img/countries/gn.png
new file mode 100644
index 0000000..ce56822
Binary files /dev/null and b/assets/img/countries/gn.png differ
diff --git a/assets/img/countries/gp.png b/assets/img/countries/gp.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/gp.png differ
diff --git a/assets/img/countries/gq.png b/assets/img/countries/gq.png
new file mode 100644
index 0000000..96e4a9c
Binary files /dev/null and b/assets/img/countries/gq.png differ
diff --git a/assets/img/countries/gr.png b/assets/img/countries/gr.png
new file mode 100644
index 0000000..f9831d2
Binary files /dev/null and b/assets/img/countries/gr.png differ
diff --git a/assets/img/countries/gs.png b/assets/img/countries/gs.png
new file mode 100644
index 0000000..07eedef
Binary files /dev/null and b/assets/img/countries/gs.png differ
diff --git a/assets/img/countries/gt.png b/assets/img/countries/gt.png
new file mode 100644
index 0000000..ae85233
Binary files /dev/null and b/assets/img/countries/gt.png differ
diff --git a/assets/img/countries/gu.png b/assets/img/countries/gu.png
new file mode 100644
index 0000000..dd400b0
Binary files /dev/null and b/assets/img/countries/gu.png differ
diff --git a/assets/img/countries/gw.png b/assets/img/countries/gw.png
new file mode 100644
index 0000000..f30c0bd
Binary files /dev/null and b/assets/img/countries/gw.png differ
diff --git a/assets/img/countries/gy.png b/assets/img/countries/gy.png
new file mode 100644
index 0000000..778a447
Binary files /dev/null and b/assets/img/countries/gy.png differ
diff --git a/assets/img/countries/hk.png b/assets/img/countries/hk.png
new file mode 100644
index 0000000..b7e1d05
Binary files /dev/null and b/assets/img/countries/hk.png differ
diff --git a/assets/img/countries/hm.png b/assets/img/countries/hm.png
new file mode 100644
index 0000000..6f6957b
Binary files /dev/null and b/assets/img/countries/hm.png differ
diff --git a/assets/img/countries/hn.png b/assets/img/countries/hn.png
new file mode 100644
index 0000000..35394fa
Binary files /dev/null and b/assets/img/countries/hn.png differ
diff --git a/assets/img/countries/hr.png b/assets/img/countries/hr.png
new file mode 100644
index 0000000..4999378
Binary files /dev/null and b/assets/img/countries/hr.png differ
diff --git a/assets/img/countries/ht.png b/assets/img/countries/ht.png
new file mode 100644
index 0000000..e92f656
Binary files /dev/null and b/assets/img/countries/ht.png differ
diff --git a/assets/img/countries/hu.png b/assets/img/countries/hu.png
new file mode 100644
index 0000000..7135ac6
Binary files /dev/null and b/assets/img/countries/hu.png differ
diff --git a/assets/img/countries/ic.png b/assets/img/countries/ic.png
new file mode 100644
index 0000000..7e7019a
Binary files /dev/null and b/assets/img/countries/ic.png differ
diff --git a/assets/img/countries/id.png b/assets/img/countries/id.png
new file mode 100644
index 0000000..358b7a8
Binary files /dev/null and b/assets/img/countries/id.png differ
diff --git a/assets/img/countries/ie.png b/assets/img/countries/ie.png
new file mode 100644
index 0000000..7a29c26
Binary files /dev/null and b/assets/img/countries/ie.png differ
diff --git a/assets/img/countries/il.png b/assets/img/countries/il.png
new file mode 100644
index 0000000..2625c1b
Binary files /dev/null and b/assets/img/countries/il.png differ
diff --git a/assets/img/countries/im.png b/assets/img/countries/im.png
new file mode 100644
index 0000000..b0ed5db
Binary files /dev/null and b/assets/img/countries/im.png differ
diff --git a/assets/img/countries/in.png b/assets/img/countries/in.png
new file mode 100644
index 0000000..36a542c
Binary files /dev/null and b/assets/img/countries/in.png differ
diff --git a/assets/img/countries/io.png b/assets/img/countries/io.png
new file mode 100644
index 0000000..8cdfe20
Binary files /dev/null and b/assets/img/countries/io.png differ
diff --git a/assets/img/countries/iq.png b/assets/img/countries/iq.png
new file mode 100644
index 0000000..a01cf16
Binary files /dev/null and b/assets/img/countries/iq.png differ
diff --git a/assets/img/countries/ir.png b/assets/img/countries/ir.png
new file mode 100644
index 0000000..63fc958
Binary files /dev/null and b/assets/img/countries/ir.png differ
diff --git a/assets/img/countries/is.png b/assets/img/countries/is.png
new file mode 100644
index 0000000..c323852
Binary files /dev/null and b/assets/img/countries/is.png differ
diff --git a/assets/img/countries/it.png b/assets/img/countries/it.png
new file mode 100644
index 0000000..d7be0ed
Binary files /dev/null and b/assets/img/countries/it.png differ
diff --git a/assets/img/countries/je.png b/assets/img/countries/je.png
new file mode 100644
index 0000000..6b5809f
Binary files /dev/null and b/assets/img/countries/je.png differ
diff --git a/assets/img/countries/jm.png b/assets/img/countries/jm.png
new file mode 100644
index 0000000..4950140
Binary files /dev/null and b/assets/img/countries/jm.png differ
diff --git a/assets/img/countries/jo.png b/assets/img/countries/jo.png
new file mode 100644
index 0000000..d384f83
Binary files /dev/null and b/assets/img/countries/jo.png differ
diff --git a/assets/img/countries/jp.png b/assets/img/countries/jp.png
new file mode 100644
index 0000000..edf76a5
Binary files /dev/null and b/assets/img/countries/jp.png differ
diff --git a/assets/img/countries/ke.png b/assets/img/countries/ke.png
new file mode 100644
index 0000000..38cf5b9
Binary files /dev/null and b/assets/img/countries/ke.png differ
diff --git a/assets/img/countries/kg.png b/assets/img/countries/kg.png
new file mode 100644
index 0000000..3de8dfb
Binary files /dev/null and b/assets/img/countries/kg.png differ
diff --git a/assets/img/countries/kh.png b/assets/img/countries/kh.png
new file mode 100644
index 0000000..343d01a
Binary files /dev/null and b/assets/img/countries/kh.png differ
diff --git a/assets/img/countries/ki.png b/assets/img/countries/ki.png
new file mode 100644
index 0000000..ebfdd86
Binary files /dev/null and b/assets/img/countries/ki.png differ
diff --git a/assets/img/countries/km.png b/assets/img/countries/km.png
new file mode 100644
index 0000000..f8d3672
Binary files /dev/null and b/assets/img/countries/km.png differ
diff --git a/assets/img/countries/kn.png b/assets/img/countries/kn.png
new file mode 100644
index 0000000..bd0b5fd
Binary files /dev/null and b/assets/img/countries/kn.png differ
diff --git a/assets/img/countries/kp.png b/assets/img/countries/kp.png
new file mode 100644
index 0000000..60e9e22
Binary files /dev/null and b/assets/img/countries/kp.png differ
diff --git a/assets/img/countries/kr.png b/assets/img/countries/kr.png
new file mode 100644
index 0000000..42cd872
Binary files /dev/null and b/assets/img/countries/kr.png differ
diff --git a/assets/img/countries/kw.png b/assets/img/countries/kw.png
new file mode 100644
index 0000000..7117660
Binary files /dev/null and b/assets/img/countries/kw.png differ
diff --git a/assets/img/countries/ky.png b/assets/img/countries/ky.png
new file mode 100644
index 0000000..26d4740
Binary files /dev/null and b/assets/img/countries/ky.png differ
diff --git a/assets/img/countries/kz.png b/assets/img/countries/kz.png
new file mode 100644
index 0000000..f1aed1f
Binary files /dev/null and b/assets/img/countries/kz.png differ
diff --git a/assets/img/countries/la.png b/assets/img/countries/la.png
new file mode 100644
index 0000000..caa5adc
Binary files /dev/null and b/assets/img/countries/la.png differ
diff --git a/assets/img/countries/lb.png b/assets/img/countries/lb.png
new file mode 100644
index 0000000..87bc8ea
Binary files /dev/null and b/assets/img/countries/lb.png differ
diff --git a/assets/img/countries/lc.png b/assets/img/countries/lc.png
new file mode 100644
index 0000000..36c1114
Binary files /dev/null and b/assets/img/countries/lc.png differ
diff --git a/assets/img/countries/li.png b/assets/img/countries/li.png
new file mode 100644
index 0000000..4168113
Binary files /dev/null and b/assets/img/countries/li.png differ
diff --git a/assets/img/countries/lk.png b/assets/img/countries/lk.png
new file mode 100644
index 0000000..124d2c7
Binary files /dev/null and b/assets/img/countries/lk.png differ
diff --git a/assets/img/countries/lr.png b/assets/img/countries/lr.png
new file mode 100644
index 0000000..ec9052f
Binary files /dev/null and b/assets/img/countries/lr.png differ
diff --git a/assets/img/countries/ls.png b/assets/img/countries/ls.png
new file mode 100644
index 0000000..bd1fa2c
Binary files /dev/null and b/assets/img/countries/ls.png differ
diff --git a/assets/img/countries/lt.png b/assets/img/countries/lt.png
new file mode 100644
index 0000000..84bb63c
Binary files /dev/null and b/assets/img/countries/lt.png differ
diff --git a/assets/img/countries/lu.png b/assets/img/countries/lu.png
new file mode 100644
index 0000000..e2b0911
Binary files /dev/null and b/assets/img/countries/lu.png differ
diff --git a/assets/img/countries/lv.png b/assets/img/countries/lv.png
new file mode 100644
index 0000000..ffc10d7
Binary files /dev/null and b/assets/img/countries/lv.png differ
diff --git a/assets/img/countries/ly.png b/assets/img/countries/ly.png
new file mode 100644
index 0000000..a63631f
Binary files /dev/null and b/assets/img/countries/ly.png differ
diff --git a/assets/img/countries/ma.png b/assets/img/countries/ma.png
new file mode 100644
index 0000000..8d0b65c
Binary files /dev/null and b/assets/img/countries/ma.png differ
diff --git a/assets/img/countries/mc.png b/assets/img/countries/mc.png
new file mode 100644
index 0000000..9074f5f
Binary files /dev/null and b/assets/img/countries/mc.png differ
diff --git a/assets/img/countries/md.png b/assets/img/countries/md.png
new file mode 100644
index 0000000..c326e02
Binary files /dev/null and b/assets/img/countries/md.png differ
diff --git a/assets/img/countries/me.png b/assets/img/countries/me.png
new file mode 100644
index 0000000..ab619f2
Binary files /dev/null and b/assets/img/countries/me.png differ
diff --git a/assets/img/countries/mf.png b/assets/img/countries/mf.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/mf.png differ
diff --git a/assets/img/countries/mg.png b/assets/img/countries/mg.png
new file mode 100644
index 0000000..be20579
Binary files /dev/null and b/assets/img/countries/mg.png differ
diff --git a/assets/img/countries/mh.png b/assets/img/countries/mh.png
new file mode 100644
index 0000000..7382382
Binary files /dev/null and b/assets/img/countries/mh.png differ
diff --git a/assets/img/countries/mk.png b/assets/img/countries/mk.png
new file mode 100644
index 0000000..f7c7b19
Binary files /dev/null and b/assets/img/countries/mk.png differ
diff --git a/assets/img/countries/ml.png b/assets/img/countries/ml.png
new file mode 100644
index 0000000..0513efd
Binary files /dev/null and b/assets/img/countries/ml.png differ
diff --git a/assets/img/countries/mm.png b/assets/img/countries/mm.png
new file mode 100644
index 0000000..8742d22
Binary files /dev/null and b/assets/img/countries/mm.png differ
diff --git a/assets/img/countries/mn.png b/assets/img/countries/mn.png
new file mode 100644
index 0000000..2453a2a
Binary files /dev/null and b/assets/img/countries/mn.png differ
diff --git a/assets/img/countries/mo.png b/assets/img/countries/mo.png
new file mode 100644
index 0000000..8482f5b
Binary files /dev/null and b/assets/img/countries/mo.png differ
diff --git a/assets/img/countries/mp.png b/assets/img/countries/mp.png
new file mode 100644
index 0000000..09af77c
Binary files /dev/null and b/assets/img/countries/mp.png differ
diff --git a/assets/img/countries/mq.png b/assets/img/countries/mq.png
new file mode 100644
index 0000000..08ce439
Binary files /dev/null and b/assets/img/countries/mq.png differ
diff --git a/assets/img/countries/mr.png b/assets/img/countries/mr.png
new file mode 100644
index 0000000..1986c78
Binary files /dev/null and b/assets/img/countries/mr.png differ
diff --git a/assets/img/countries/ms.png b/assets/img/countries/ms.png
new file mode 100644
index 0000000..d457df3
Binary files /dev/null and b/assets/img/countries/ms.png differ
diff --git a/assets/img/countries/mt.png b/assets/img/countries/mt.png
new file mode 100644
index 0000000..cba7faa
Binary files /dev/null and b/assets/img/countries/mt.png differ
diff --git a/assets/img/countries/mu.png b/assets/img/countries/mu.png
new file mode 100644
index 0000000..1743cfc
Binary files /dev/null and b/assets/img/countries/mu.png differ
diff --git a/assets/img/countries/mv.png b/assets/img/countries/mv.png
new file mode 100644
index 0000000..e04f8f5
Binary files /dev/null and b/assets/img/countries/mv.png differ
diff --git a/assets/img/countries/mw.png b/assets/img/countries/mw.png
new file mode 100644
index 0000000..3f04591
Binary files /dev/null and b/assets/img/countries/mw.png differ
diff --git a/assets/img/countries/mx.png b/assets/img/countries/mx.png
new file mode 100644
index 0000000..1fc0a22
Binary files /dev/null and b/assets/img/countries/mx.png differ
diff --git a/assets/img/countries/my.png b/assets/img/countries/my.png
new file mode 100644
index 0000000..1ad9cc7
Binary files /dev/null and b/assets/img/countries/my.png differ
diff --git a/assets/img/countries/mz.png b/assets/img/countries/mz.png
new file mode 100644
index 0000000..6caccbd
Binary files /dev/null and b/assets/img/countries/mz.png differ
diff --git a/assets/img/countries/na.png b/assets/img/countries/na.png
new file mode 100644
index 0000000..8fb195a
Binary files /dev/null and b/assets/img/countries/na.png differ
diff --git a/assets/img/countries/nc.png b/assets/img/countries/nc.png
new file mode 100644
index 0000000..ddaf174
Binary files /dev/null and b/assets/img/countries/nc.png differ
diff --git a/assets/img/countries/ne.png b/assets/img/countries/ne.png
new file mode 100644
index 0000000..817ef1c
Binary files /dev/null and b/assets/img/countries/ne.png differ
diff --git a/assets/img/countries/nf.png b/assets/img/countries/nf.png
new file mode 100644
index 0000000..1cf9d8a
Binary files /dev/null and b/assets/img/countries/nf.png differ
diff --git a/assets/img/countries/ng.png b/assets/img/countries/ng.png
new file mode 100644
index 0000000..f70d5bf
Binary files /dev/null and b/assets/img/countries/ng.png differ
diff --git a/assets/img/countries/ni.png b/assets/img/countries/ni.png
new file mode 100644
index 0000000..08f862a
Binary files /dev/null and b/assets/img/countries/ni.png differ
diff --git a/assets/img/countries/nl.png b/assets/img/countries/nl.png
new file mode 100644
index 0000000..3097029
Binary files /dev/null and b/assets/img/countries/nl.png differ
diff --git a/assets/img/countries/no.png b/assets/img/countries/no.png
new file mode 100644
index 0000000..2697cba
Binary files /dev/null and b/assets/img/countries/no.png differ
diff --git a/assets/img/countries/np.png b/assets/img/countries/np.png
new file mode 100644
index 0000000..64bd3fd
Binary files /dev/null and b/assets/img/countries/np.png differ
diff --git a/assets/img/countries/nr.png b/assets/img/countries/nr.png
new file mode 100644
index 0000000..720e9ee
Binary files /dev/null and b/assets/img/countries/nr.png differ
diff --git a/assets/img/countries/nu.png b/assets/img/countries/nu.png
new file mode 100644
index 0000000..534ac7e
Binary files /dev/null and b/assets/img/countries/nu.png differ
diff --git a/assets/img/countries/nz.png b/assets/img/countries/nz.png
new file mode 100644
index 0000000..92228be
Binary files /dev/null and b/assets/img/countries/nz.png differ
diff --git a/assets/img/countries/om.png b/assets/img/countries/om.png
new file mode 100644
index 0000000..fdc134f
Binary files /dev/null and b/assets/img/countries/om.png differ
diff --git a/assets/img/countries/pa.png b/assets/img/countries/pa.png
new file mode 100644
index 0000000..ddf66ed
Binary files /dev/null and b/assets/img/countries/pa.png differ
diff --git a/assets/img/countries/pe.png b/assets/img/countries/pe.png
new file mode 100644
index 0000000..a4b0f60
Binary files /dev/null and b/assets/img/countries/pe.png differ
diff --git a/assets/img/countries/pf.png b/assets/img/countries/pf.png
new file mode 100644
index 0000000..53b68ad
Binary files /dev/null and b/assets/img/countries/pf.png differ
diff --git a/assets/img/countries/pg.png b/assets/img/countries/pg.png
new file mode 100644
index 0000000..d36543c
Binary files /dev/null and b/assets/img/countries/pg.png differ
diff --git a/assets/img/countries/ph.png b/assets/img/countries/ph.png
new file mode 100644
index 0000000..1176deb
Binary files /dev/null and b/assets/img/countries/ph.png differ
diff --git a/assets/img/countries/pk.png b/assets/img/countries/pk.png
new file mode 100644
index 0000000..8d2ee42
Binary files /dev/null and b/assets/img/countries/pk.png differ
diff --git a/assets/img/countries/pl.png b/assets/img/countries/pl.png
new file mode 100644
index 0000000..43feb64
Binary files /dev/null and b/assets/img/countries/pl.png differ
diff --git a/assets/img/countries/pm.png b/assets/img/countries/pm.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/pm.png differ
diff --git a/assets/img/countries/pn.png b/assets/img/countries/pn.png
new file mode 100644
index 0000000..e2bd38c
Binary files /dev/null and b/assets/img/countries/pn.png differ
diff --git a/assets/img/countries/pr.png b/assets/img/countries/pr.png
new file mode 100644
index 0000000..50c29cb
Binary files /dev/null and b/assets/img/countries/pr.png differ
diff --git a/assets/img/countries/ps.png b/assets/img/countries/ps.png
new file mode 100644
index 0000000..093d7e5
Binary files /dev/null and b/assets/img/countries/ps.png differ
diff --git a/assets/img/countries/pt.png b/assets/img/countries/pt.png
new file mode 100644
index 0000000..67bd032
Binary files /dev/null and b/assets/img/countries/pt.png differ
diff --git a/assets/img/countries/pw.png b/assets/img/countries/pw.png
new file mode 100644
index 0000000..6986534
Binary files /dev/null and b/assets/img/countries/pw.png differ
diff --git a/assets/img/countries/py.png b/assets/img/countries/py.png
new file mode 100644
index 0000000..c6289f4
Binary files /dev/null and b/assets/img/countries/py.png differ
diff --git a/assets/img/countries/qa.png b/assets/img/countries/qa.png
new file mode 100644
index 0000000..1409f55
Binary files /dev/null and b/assets/img/countries/qa.png differ
diff --git a/assets/img/countries/re.png b/assets/img/countries/re.png
new file mode 100644
index 0000000..08ce439
Binary files /dev/null and b/assets/img/countries/re.png differ
diff --git a/assets/img/countries/ro.png b/assets/img/countries/ro.png
new file mode 100644
index 0000000..4772ffd
Binary files /dev/null and b/assets/img/countries/ro.png differ
diff --git a/assets/img/countries/rs.png b/assets/img/countries/rs.png
new file mode 100644
index 0000000..1acb525
Binary files /dev/null and b/assets/img/countries/rs.png differ
diff --git a/assets/img/countries/ru.png b/assets/img/countries/ru.png
new file mode 100644
index 0000000..0052370
Binary files /dev/null and b/assets/img/countries/ru.png differ
diff --git a/assets/img/countries/rw.png b/assets/img/countries/rw.png
new file mode 100644
index 0000000..201717b
Binary files /dev/null and b/assets/img/countries/rw.png differ
diff --git a/assets/img/countries/sa.png b/assets/img/countries/sa.png
new file mode 100644
index 0000000..d48f3e9
Binary files /dev/null and b/assets/img/countries/sa.png differ
diff --git a/assets/img/countries/sb.png b/assets/img/countries/sb.png
new file mode 100644
index 0000000..8975d1f
Binary files /dev/null and b/assets/img/countries/sb.png differ
diff --git a/assets/img/countries/sc.png b/assets/img/countries/sc.png
new file mode 100644
index 0000000..25aff1a
Binary files /dev/null and b/assets/img/countries/sc.png differ
diff --git a/assets/img/countries/sd.png b/assets/img/countries/sd.png
new file mode 100644
index 0000000..aaa48d9
Binary files /dev/null and b/assets/img/countries/sd.png differ
diff --git a/assets/img/countries/se.png b/assets/img/countries/se.png
new file mode 100644
index 0000000..9536a91
Binary files /dev/null and b/assets/img/countries/se.png differ
diff --git a/assets/img/countries/sg.png b/assets/img/countries/sg.png
new file mode 100644
index 0000000..cedc4ef
Binary files /dev/null and b/assets/img/countries/sg.png differ
diff --git a/assets/img/countries/sh.png b/assets/img/countries/sh.png
new file mode 100644
index 0000000..d3508b4
Binary files /dev/null and b/assets/img/countries/sh.png differ
diff --git a/assets/img/countries/si.png b/assets/img/countries/si.png
new file mode 100644
index 0000000..dfcfd72
Binary files /dev/null and b/assets/img/countries/si.png differ
diff --git a/assets/img/countries/sj.png b/assets/img/countries/sj.png
new file mode 100644
index 0000000..65b5578
Binary files /dev/null and b/assets/img/countries/sj.png differ
diff --git a/assets/img/countries/sk.png b/assets/img/countries/sk.png
new file mode 100644
index 0000000..6a495fa
Binary files /dev/null and b/assets/img/countries/sk.png differ
diff --git a/assets/img/countries/sl.png b/assets/img/countries/sl.png
new file mode 100644
index 0000000..35d735a
Binary files /dev/null and b/assets/img/countries/sl.png differ
diff --git a/assets/img/countries/sm.png b/assets/img/countries/sm.png
new file mode 100644
index 0000000..36bd274
Binary files /dev/null and b/assets/img/countries/sm.png differ
diff --git a/assets/img/countries/sn.png b/assets/img/countries/sn.png
new file mode 100644
index 0000000..397ac5d
Binary files /dev/null and b/assets/img/countries/sn.png differ
diff --git a/assets/img/countries/so.png b/assets/img/countries/so.png
new file mode 100644
index 0000000..c1a3177
Binary files /dev/null and b/assets/img/countries/so.png differ
diff --git a/assets/img/countries/sr.png b/assets/img/countries/sr.png
new file mode 100644
index 0000000..4c98cc9
Binary files /dev/null and b/assets/img/countries/sr.png differ
diff --git a/assets/img/countries/ss.png b/assets/img/countries/ss.png
new file mode 100644
index 0000000..efbc968
Binary files /dev/null and b/assets/img/countries/ss.png differ
diff --git a/assets/img/countries/st.png b/assets/img/countries/st.png
new file mode 100644
index 0000000..344db8a
Binary files /dev/null and b/assets/img/countries/st.png differ
diff --git a/assets/img/countries/sv.png b/assets/img/countries/sv.png
new file mode 100644
index 0000000..e24595c
Binary files /dev/null and b/assets/img/countries/sv.png differ
diff --git a/assets/img/countries/sx.png b/assets/img/countries/sx.png
new file mode 100644
index 0000000..acd1de2
Binary files /dev/null and b/assets/img/countries/sx.png differ
diff --git a/assets/img/countries/sy.png b/assets/img/countries/sy.png
new file mode 100644
index 0000000..e05b447
Binary files /dev/null and b/assets/img/countries/sy.png differ
diff --git a/assets/img/countries/sz.png b/assets/img/countries/sz.png
new file mode 100644
index 0000000..727232a
Binary files /dev/null and b/assets/img/countries/sz.png differ
diff --git a/assets/img/countries/ta.png b/assets/img/countries/ta.png
new file mode 100644
index 0000000..d3508b4
Binary files /dev/null and b/assets/img/countries/ta.png differ
diff --git a/assets/img/countries/tc.png b/assets/img/countries/tc.png
new file mode 100644
index 0000000..da85b4f
Binary files /dev/null and b/assets/img/countries/tc.png differ
diff --git a/assets/img/countries/td.png b/assets/img/countries/td.png
new file mode 100644
index 0000000..41dad3b
Binary files /dev/null and b/assets/img/countries/td.png differ
diff --git a/assets/img/countries/tf.png b/assets/img/countries/tf.png
new file mode 100644
index 0000000..14df3e1
Binary files /dev/null and b/assets/img/countries/tf.png differ
diff --git a/assets/img/countries/tg.png b/assets/img/countries/tg.png
new file mode 100644
index 0000000..6a6dc2d
Binary files /dev/null and b/assets/img/countries/tg.png differ
diff --git a/assets/img/countries/th.png b/assets/img/countries/th.png
new file mode 100644
index 0000000..ece93ce
Binary files /dev/null and b/assets/img/countries/th.png differ
diff --git a/assets/img/countries/tj.png b/assets/img/countries/tj.png
new file mode 100644
index 0000000..f10f228
Binary files /dev/null and b/assets/img/countries/tj.png differ
diff --git a/assets/img/countries/tk.png b/assets/img/countries/tk.png
new file mode 100644
index 0000000..0da0318
Binary files /dev/null and b/assets/img/countries/tk.png differ
diff --git a/assets/img/countries/tl.png b/assets/img/countries/tl.png
new file mode 100644
index 0000000..db79478
Binary files /dev/null and b/assets/img/countries/tl.png differ
diff --git a/assets/img/countries/tm.png b/assets/img/countries/tm.png
new file mode 100644
index 0000000..ac0f330
Binary files /dev/null and b/assets/img/countries/tm.png differ
diff --git a/assets/img/countries/tn.png b/assets/img/countries/tn.png
new file mode 100644
index 0000000..73b26cc
Binary files /dev/null and b/assets/img/countries/tn.png differ
diff --git a/assets/img/countries/to.png b/assets/img/countries/to.png
new file mode 100644
index 0000000..5b41de4
Binary files /dev/null and b/assets/img/countries/to.png differ
diff --git a/assets/img/countries/tr.png b/assets/img/countries/tr.png
new file mode 100644
index 0000000..7f88c20
Binary files /dev/null and b/assets/img/countries/tr.png differ
diff --git a/assets/img/countries/tt.png b/assets/img/countries/tt.png
new file mode 100644
index 0000000..6497fe8
Binary files /dev/null and b/assets/img/countries/tt.png differ
diff --git a/assets/img/countries/tv.png b/assets/img/countries/tv.png
new file mode 100644
index 0000000..098a895
Binary files /dev/null and b/assets/img/countries/tv.png differ
diff --git a/assets/img/countries/tw.png b/assets/img/countries/tw.png
new file mode 100644
index 0000000..f2367bc
Binary files /dev/null and b/assets/img/countries/tw.png differ
diff --git a/assets/img/countries/tz.png b/assets/img/countries/tz.png
new file mode 100644
index 0000000..e49e1a8
Binary files /dev/null and b/assets/img/countries/tz.png differ
diff --git a/assets/img/countries/ua.png b/assets/img/countries/ua.png
new file mode 100644
index 0000000..152ced5
Binary files /dev/null and b/assets/img/countries/ua.png differ
diff --git a/assets/img/countries/ug.png b/assets/img/countries/ug.png
new file mode 100644
index 0000000..88f2542
Binary files /dev/null and b/assets/img/countries/ug.png differ
diff --git a/assets/img/countries/um.png b/assets/img/countries/um.png
new file mode 100644
index 0000000..ae19d47
Binary files /dev/null and b/assets/img/countries/um.png differ
diff --git a/assets/img/countries/un.png b/assets/img/countries/un.png
new file mode 100644
index 0000000..bfb6d2e
Binary files /dev/null and b/assets/img/countries/un.png differ
diff --git a/assets/img/countries/us.png b/assets/img/countries/us.png
new file mode 100644
index 0000000..64b03d1
Binary files /dev/null and b/assets/img/countries/us.png differ
diff --git a/assets/img/countries/uy.png b/assets/img/countries/uy.png
new file mode 100644
index 0000000..f9b0a65
Binary files /dev/null and b/assets/img/countries/uy.png differ
diff --git a/assets/img/countries/uz.png b/assets/img/countries/uz.png
new file mode 100644
index 0000000..9172bc8
Binary files /dev/null and b/assets/img/countries/uz.png differ
diff --git a/assets/img/countries/va.png b/assets/img/countries/va.png
new file mode 100644
index 0000000..aa8f4c9
Binary files /dev/null and b/assets/img/countries/va.png differ
diff --git a/assets/img/countries/vc.png b/assets/img/countries/vc.png
new file mode 100644
index 0000000..a02d527
Binary files /dev/null and b/assets/img/countries/vc.png differ
diff --git a/assets/img/countries/ve.png b/assets/img/countries/ve.png
new file mode 100644
index 0000000..58803ac
Binary files /dev/null and b/assets/img/countries/ve.png differ
diff --git a/assets/img/countries/vg.png b/assets/img/countries/vg.png
new file mode 100644
index 0000000..2138a2c
Binary files /dev/null and b/assets/img/countries/vg.png differ
diff --git a/assets/img/countries/vi.png b/assets/img/countries/vi.png
new file mode 100644
index 0000000..fb71ddc
Binary files /dev/null and b/assets/img/countries/vi.png differ
diff --git a/assets/img/countries/vn.png b/assets/img/countries/vn.png
new file mode 100644
index 0000000..16bddd9
Binary files /dev/null and b/assets/img/countries/vn.png differ
diff --git a/assets/img/countries/vu.png b/assets/img/countries/vu.png
new file mode 100644
index 0000000..0a1c8f2
Binary files /dev/null and b/assets/img/countries/vu.png differ
diff --git a/assets/img/countries/wf.png b/assets/img/countries/wf.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/wf.png differ
diff --git a/assets/img/countries/ws.png b/assets/img/countries/ws.png
new file mode 100644
index 0000000..27bb6f7
Binary files /dev/null and b/assets/img/countries/ws.png differ
diff --git a/assets/img/countries/xk.png b/assets/img/countries/xk.png
new file mode 100644
index 0000000..692130f
Binary files /dev/null and b/assets/img/countries/xk.png differ
diff --git a/assets/img/countries/xx.png b/assets/img/countries/xx.png
new file mode 100644
index 0000000..7060296
Binary files /dev/null and b/assets/img/countries/xx.png differ
diff --git a/assets/img/countries/ye.png b/assets/img/countries/ye.png
new file mode 100644
index 0000000..c373cd2
Binary files /dev/null and b/assets/img/countries/ye.png differ
diff --git a/assets/img/countries/yt.png b/assets/img/countries/yt.png
new file mode 100644
index 0000000..dbdd329
Binary files /dev/null and b/assets/img/countries/yt.png differ
diff --git a/assets/img/countries/za.png b/assets/img/countries/za.png
new file mode 100644
index 0000000..6e61d55
Binary files /dev/null and b/assets/img/countries/za.png differ
diff --git a/assets/img/countries/zm.png b/assets/img/countries/zm.png
new file mode 100644
index 0000000..d59ec47
Binary files /dev/null and b/assets/img/countries/zm.png differ
diff --git a/assets/img/countries/zw.png b/assets/img/countries/zw.png
new file mode 100644
index 0000000..ecd6e20
Binary files /dev/null and b/assets/img/countries/zw.png differ
diff --git a/assets/js/ip_location_service.js b/assets/js/ip_location_service.js
new file mode 100644
index 0000000..2814188
--- /dev/null
+++ b/assets/js/ip_location_service.js
@@ -0,0 +1,43 @@
+/**
+ * IP location service client
+ *
+ * @author Pierre Hubert
+ */
+
+/**
+ * Apply location information where requested
+ */
+async function apply_location_information() {
+ for (const el of document.querySelectorAll("locateip")) {
+ if (el.hasAttribute("updated"))
+ continue;
+
+ el.setAttribute("updated", "1");
+
+ try {
+ if(typeof IP_LOCATION_API === undefined)
+ throw new Error("IP location service is undefined!");
+
+ const URL = IP_LOCATION_API + "?ip=" + el.getAttribute("ip");
+ const res = await (await fetch(URL)).json();
+
+ if (res.country_code === undefined || res.country_name === undefined)
+ throw new Error("IP location information unavailable!");
+
+ let loc = " ";
+
+ if (res.region_name !== undefined && res.region_name !== "")
+ loc += res.region_name + " (" + res.country_name + ")";
+ else
+ loc += res.country_name;
+
+ el.innerHTML = loc;
+
+ } catch(e) {
+ console.error(e);
+ el.innerHTML = "Unavailable";
+ }
+ }
+}
+
+window.addEventListener("load", () => apply_location_information());
diff --git a/src/controllers/openid_controller.rs b/src/controllers/openid_controller.rs
index 766180a..c65f4e2 100644
--- a/src/controllers/openid_controller.rs
+++ b/src/controllers/openid_controller.rs
@@ -23,7 +23,7 @@ use crate::data::user::User;
use crate::utils::string_utils::rand_str;
use crate::utils::time::time;
-pub async fn get_configuration(req: HttpRequest, app_conf: web::Data) -> impl Responder {
+pub async fn get_configuration(req: HttpRequest) -> impl Responder {
let is_secure_request = req
.headers()
.get("HTTP_X_FORWARDED_PROTO")
@@ -45,8 +45,8 @@ pub async fn get_configuration(req: HttpRequest, app_conf: web::Data)
);
HttpResponse::Ok().json(OpenIDConfig {
- issuer: app_conf.website_origin.clone(),
- authorization_endpoint: app_conf.full_url(AUTHORIZE_URI),
+ issuer: AppConfig::get().website_origin.clone(),
+ authorization_endpoint: AppConfig::get().full_url(AUTHORIZE_URI),
token_endpoint: curr_origin.clone() + TOKEN_URI,
userinfo_endpoint: curr_origin.clone() + USERINFO_URI,
jwks_uri: curr_origin + CERT_URI,
@@ -263,7 +263,6 @@ pub async fn token(
req: HttpRequest,
query: web::Form,
clients: web::Data,
- app_config: web::Data,
sessions: web::Data>,
users: web::Data>,
jwt_signer: web::Data,
@@ -416,7 +415,7 @@ pub async fn token(
));
}
- session.regenerate_access_and_refresh_tokens(&app_config, &jwt_signer)?;
+ session.regenerate_access_and_refresh_tokens(AppConfig::get(), &jwt_signer)?;
sessions
.send(openid_sessions_actor::UpdateSession(session.clone()))
@@ -435,7 +434,7 @@ pub async fn token(
// Generate id token
let id_token = IdToken {
- issuer: app_config.website_origin.to_string(),
+ issuer: AppConfig::get().website_origin.to_string(),
subject_identifier: session.user.0,
audience: session.client.0.to_string(),
expiration_time: session.access_token_expire_at,
@@ -488,7 +487,7 @@ pub async fn token(
));
}
- session.regenerate_access_and_refresh_tokens(&app_config, &jwt_signer)?;
+ session.regenerate_access_and_refresh_tokens(AppConfig::get(), &jwt_signer)?;
sessions
.send(openid_sessions_actor::UpdateSession(session.clone()))
diff --git a/src/controllers/settings_controller.rs b/src/controllers/settings_controller.rs
index a23f3ce..991c924 100644
--- a/src/controllers/settings_controller.rs
+++ b/src/controllers/settings_controller.rs
@@ -6,6 +6,7 @@ use crate::actors::bruteforce_actor::BruteForceActor;
use crate::actors::users_actor::UsersActor;
use crate::actors::{bruteforce_actor, users_actor};
use crate::constants::{APP_NAME, MAX_FAILED_LOGIN_ATTEMPTS, MIN_PASS_LEN};
+use crate::data::app_config::AppConfig;
use crate::data::current_user::CurrentUser;
use crate::data::remote_ip::RemoteIP;
use crate::data::user::User;
@@ -18,6 +19,7 @@ pub(crate) struct BaseSettingsPage {
pub is_admin: bool,
pub user_name: String,
pub version: &'static str,
+ pub ip_location_api: Option<&'static str>,
}
impl BaseSettingsPage {
@@ -35,6 +37,7 @@ impl BaseSettingsPage {
is_admin: user.admin,
user_name: user.username.to_string(),
version: env!("CARGO_PKG_VERSION"),
+ ip_location_api: AppConfig::get().ip_location_service.as_deref(),
}
}
}
diff --git a/src/controllers/two_factors_controller.rs b/src/controllers/two_factors_controller.rs
index ad4e979..a9dc6e7 100644
--- a/src/controllers/two_factors_controller.rs
+++ b/src/controllers/two_factors_controller.rs
@@ -1,6 +1,6 @@
use std::ops::Deref;
-use actix_web::{web, HttpResponse, Responder};
+use actix_web::{HttpResponse, Responder};
use askama::Template;
use qrcode_generator::QrCodeEcc;
@@ -48,14 +48,14 @@ pub async fn two_factors_route(user: CurrentUser) -> impl Responder {
}
/// Configure a new TOTP authentication factor
-pub async fn add_totp_factor_route(
- user: CurrentUser,
- app_conf: web::Data,
-) -> impl Responder {
+pub async fn add_totp_factor_route(user: CurrentUser) -> impl Responder {
let key = TotpKey::new_random();
- let qr_code =
- qrcode_generator::to_png_to_vec(key.url_for_user(&user, &app_conf), QrCodeEcc::Low, 1024);
+ let qr_code = qrcode_generator::to_png_to_vec(
+ key.url_for_user(&user, AppConfig::get()),
+ QrCodeEcc::Low,
+ 1024,
+ );
let qr_code = match qr_code {
Ok(q) => q,
Err(e) => {
@@ -68,7 +68,7 @@ pub async fn add_totp_factor_route(
AddTotpPage {
_p: BaseSettingsPage::get("New authenticator app", &user, None, None),
qr_code: base64::encode(qr_code),
- account_name: key.account_name(&user, &app_conf),
+ account_name: key.account_name(&user, AppConfig::get()),
secret_key: key.get_secret(),
}
.render()
diff --git a/src/data/app_config.rs b/src/data/app_config.rs
index 30dff4e..f5298b5 100644
--- a/src/data/app_config.rs
+++ b/src/data/app_config.rs
@@ -27,9 +27,35 @@ pub struct AppConfig {
/// Proxy IP, might end with a star "*"
#[clap(short, long, env)]
pub proxy_ip: Option,
+
+ /// IP location service API
+ ///
+ /// Up instance of IP location service : https://gitlab.com/pierre42100/iplocationserver
+ ///
+ /// Example: "https://api.geoip.rs"
+ #[arg(long, short, env)]
+ pub ip_location_service: Option,
+}
+
+lazy_static::lazy_static! {
+ static ref ARGS: AppConfig = {
+ let mut config = AppConfig::parse();
+
+ // In debug mode only, use dummy token
+ if cfg!(debug_assertions) && config.token_key.is_empty() {
+ config.token_key = String::from_utf8_lossy(&[32; 64]).to_string();
+ }
+
+ config
+ };
}
impl AppConfig {
+ /// Get parsed command line arguments
+ pub fn get() -> &'static AppConfig {
+ &ARGS
+ }
+
pub fn secure_cookie(&self) -> bool {
self.website_origin.starts_with("https:")
}
@@ -58,3 +84,14 @@ impl AppConfig {
self.website_origin.split('/').nth(2).unwrap_or(APP_NAME)
}
}
+
+#[cfg(test)]
+mod test {
+ use crate::data::app_config::AppConfig;
+
+ #[test]
+ fn verify_cli() {
+ use clap::CommandFactory;
+ AppConfig::command().debug_assert()
+ }
+}
diff --git a/src/data/remote_ip.rs b/src/data/remote_ip.rs
index 25b5b2a..98b7531 100644
--- a/src/data/remote_ip.rs
+++ b/src/data/remote_ip.rs
@@ -1,7 +1,7 @@
use std::net::IpAddr;
use actix_web::dev::Payload;
-use actix_web::{web, Error, FromRequest, HttpRequest};
+use actix_web::{Error, FromRequest, HttpRequest};
use futures_util::future::{ready, Ready};
use crate::data::app_config::AppConfig;
@@ -22,7 +22,9 @@ impl FromRequest for RemoteIP {
#[inline]
fn from_request(req: &HttpRequest, _: &mut Payload) -> Self::Future {
- let config: &web::Data = req.app_data().expect("AppData undefined!");
- ready(Ok(RemoteIP(get_remote_ip(req, config.proxy_ip.as_deref()))))
+ ready(Ok(RemoteIP(get_remote_ip(
+ req,
+ AppConfig::get().proxy_ip.as_deref(),
+ ))))
}
}
diff --git a/src/main.rs b/src/main.rs
index 4243b19..affbe37 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,7 +9,6 @@ use actix_session::SessionMiddleware;
use actix_web::cookie::{Key, SameSite};
use actix_web::middleware::Logger;
use actix_web::{get, middleware, web, App, HttpResponse, HttpServer};
-use clap::Parser;
use basic_oidc::actors::bruteforce_actor::BruteForceActor;
use basic_oidc::actors::openid_sessions_actor::OpenIDSessionsActor;
@@ -34,12 +33,7 @@ async fn health() -> &'static str {
async fn main() -> std::io::Result<()> {
env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
- let mut config: AppConfig = AppConfig::parse();
-
- // In debug mode only, use dummy token
- if cfg!(debug_assertions) && config.token_key.is_empty() {
- config.token_key = String::from_utf8_lossy(&[32; 64]).to_string();
- }
+ let config = AppConfig::get();
if !config.storage_path().exists() {
log::error!(
@@ -73,7 +67,7 @@ async fn main() -> std::io::Result<()> {
let bruteforce_actor = BruteForceActor::default().start();
let openid_sessions_actor = OpenIDSessionsActor::default().start();
let jwt_signer = JWTSigner::gen_from_memory().expect("Failed to generate JWKS key");
- let webauthn_manager = Arc::new(WebAuthManager::init(&config));
+ let webauthn_manager = Arc::new(WebAuthManager::init(config));
log::info!("Server will listen on {}", config.listen_address);
let listen_address = config.listen_address.to_string();
@@ -102,7 +96,6 @@ async fn main() -> std::io::Result<()> {
.app_data(web::Data::new(users_actor.clone()))
.app_data(web::Data::new(bruteforce_actor.clone()))
.app_data(web::Data::new(openid_sessions_actor.clone()))
- .app_data(web::Data::new(config.clone()))
.app_data(web::Data::new(clients))
.app_data(web::Data::new(jwt_signer.clone()))
.app_data(web::Data::new(webauthn_manager.clone()))
diff --git a/src/middlewares/auth_middleware.rs b/src/middlewares/auth_middleware.rs
index 3791af4..546bb4b 100644
--- a/src/middlewares/auth_middleware.rs
+++ b/src/middlewares/auth_middleware.rs
@@ -9,7 +9,7 @@ use actix_web::body::EitherBody;
use actix_web::http::{header, Method};
use actix_web::{
dev::{forward_ready, Service, ServiceRequest, ServiceResponse, Transform},
- web, Error, HttpResponse,
+ Error, HttpResponse,
};
use crate::constants::{
@@ -87,14 +87,16 @@ where
// Forward request
Box::pin(async move {
- let config: &web::Data = req.app_data().expect("AppData undefined!");
-
// Check if POST request comes from another website (block invalid origins)
let origin = req.headers().get(header::ORIGIN);
if req.method() == Method::POST && req.path() != TOKEN_URI && req.path() != USERINFO_URI
{
if let Some(o) = origin {
- if !o.to_str().unwrap_or("bad").eq(&config.website_origin) {
+ if !o
+ .to_str()
+ .unwrap_or("bad")
+ .eq(&AppConfig::get().website_origin)
+ {
log::warn!(
"Blocked POST request from invalid origin! Origin given {:?}",
o
diff --git a/templates/settings/base_settings_page.html b/templates/settings/base_settings_page.html
index 2d407d0..88328b7 100644
--- a/templates/settings/base_settings_page.html
+++ b/templates/settings/base_settings_page.html
@@ -83,8 +83,10 @@
if(el.href === location.href) el.classList.add("active");
else el.classList.remove("active")
})
-
-
+{% if _p.ip_location_api.is_some() %}
+
+{% endif %}
+