├── .DS_Store ├── LICENSE ├── README.md ├── v1 ├── builds │ ├── 0.1.4.xpi │ ├── 0.1.4b1.xpi │ ├── 0.1.4b2.xpi │ ├── 0.1.5.xpi │ ├── 0.1.6.xpi │ ├── 0.1.7.xpi │ ├── 0.1.8.xpi │ └── 0.1.9.xpi └── src │ ├── data │ ├── flags │ │ ├── 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 │ │ ├── error.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 │ │ ├── local.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 │ ├── icons │ │ ├── 128.png │ │ ├── 16.png │ │ ├── 24.png │ │ ├── 256.png │ │ ├── 32.png │ │ ├── 48.png │ │ ├── 64.png │ │ └── toolbar │ │ │ ├── blue │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 36.png │ │ │ └── 38.png │ │ │ ├── gray │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 36.png │ │ │ └── 38.png │ │ │ ├── green │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 36.png │ │ │ └── 38.png │ │ │ ├── orange │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 36.png │ │ │ └── 38.png │ │ │ └── red │ │ │ ├── 0 │ │ │ ├── 18.png │ │ │ └── 36.png │ │ │ ├── 1 │ │ │ ├── 18.png │ │ │ └── 36.png │ │ │ ├── 2 │ │ │ ├── 18.png │ │ │ └── 36.png │ │ │ ├── 3 │ │ │ ├── 18.png │ │ │ └── 36.png │ │ │ ├── 4 │ │ │ ├── 18.png │ │ │ └── 36.png │ │ │ ├── 5 │ │ │ ├── 18.png │ │ │ └── 36.png │ │ │ ├── 18.png │ │ │ ├── 19.png │ │ │ ├── 36.png │ │ │ ├── 38.png │ │ │ └── plus │ │ │ ├── 18.png │ │ │ └── 36.png │ ├── log │ │ ├── index.html │ │ └── index.js │ └── popup │ │ ├── firefox │ │ └── firefox.js │ │ ├── fontello.css │ │ ├── fontello.woff │ │ ├── index.css │ │ ├── index.html │ │ └── index.js │ ├── lib │ ├── common.js │ ├── config.js │ ├── firefox │ │ └── firefox.js │ ├── monitor.js │ └── tbExtra.js │ └── package.json ├── v2 ├── chrome │ ├── LICENSE │ ├── _locales │ ├── common.js │ ├── data │ ├── manifest.json │ └── schema.json └── firefox │ ├── LICENSE │ ├── _locales │ ├── en │ │ └── messages.json │ └── nl │ │ └── messages.json │ ├── common.js │ ├── data │ ├── icons │ │ ├── 128.png │ │ ├── 16.png │ │ ├── 24.png │ │ ├── 256.png │ │ ├── 32.png │ │ ├── 48.png │ │ ├── 64.png │ │ └── icon.svg │ ├── log │ │ ├── index.html │ │ └── index.js │ ├── options │ │ ├── index.html │ │ └── index.js │ └── panel │ │ ├── assets │ │ ├── README │ │ └── animals.json │ │ ├── components │ │ ├── editor-view │ │ │ ├── README │ │ │ ├── ace-builds-1.4.12 │ │ │ │ └── src │ │ │ │ │ ├── ace.js │ │ │ │ │ ├── ext-language_tools.js │ │ │ │ │ ├── keybinding-sublime.js │ │ │ │ │ ├── mode-javascript.js │ │ │ │ │ └── snippets │ │ │ │ │ └── javascript.js │ │ │ ├── core.js │ │ │ └── example.html │ │ ├── manual-view-search.js │ │ ├── manual-view.js │ │ └── pac-view.js │ │ ├── firefox-proxy.js │ │ ├── images │ │ ├── arrow.svg │ │ ├── no.svg │ │ ├── ok.svg │ │ └── reload.svg │ │ ├── index.css │ │ ├── index.html │ │ ├── proxy.js │ │ ├── toolbar.js │ │ ├── ui.js │ │ └── utils.js │ ├── manifest.json │ └── schema.json └── v3 ├── LICENSE ├── _locales ├── en │ └── messages.json └── nl │ └── messages.json ├── badge.js ├── data ├── icons │ ├── 128.png │ ├── 16.png │ ├── 24.png │ ├── 256.png │ ├── 32.png │ ├── 48.png │ ├── 64.png │ └── icon.svg ├── log │ ├── index.html │ └── index.js ├── options │ ├── index.css │ ├── index.html │ └── index.js └── panel │ ├── assets │ ├── README │ └── animals.json │ ├── components │ ├── editor-view │ │ ├── README │ │ ├── ace-builds-1.4.12 │ │ │ └── src │ │ │ │ ├── ace.js │ │ │ │ ├── ext-language_tools.js │ │ │ │ ├── keybinding-sublime.js │ │ │ │ ├── mode-javascript.js │ │ │ │ └── snippets │ │ │ │ └── javascript.js │ │ ├── core.js │ │ └── example.html │ ├── manual-view-search.js │ ├── manual-view.js │ └── pac-view.js │ ├── images │ ├── arrow.svg │ ├── no.svg │ ├── ok.svg │ └── reload.svg │ ├── index.css │ ├── index.html │ ├── proxy.js │ ├── toolbar.js │ ├── ui.js │ └── utils.js ├── manifest.json ├── schema.json └── worker.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # proxy-switcher 2 | Proxy Switcher lets you change Firefox proxy settings (preferences) from a toolbar panel in a familiar UI. The panel allows you to access all proxy related settings and it also stores your configurations in different profiles for easy access. 3 | # Features 4 | * Access all proxy related settings in one place 5 | * Supports multiple profiles for easy proxy switching 6 | * UI is driven from Firefox's built-in proxy UI 7 | 8 | # Contribution 9 | Please feel free to clone this repo and open pull requests or report issues. 10 | -------------------------------------------------------------------------------- /v1/builds/0.1.4.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.4.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.4b1.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.4b1.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.4b2.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.4b2.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.5.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.5.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.6.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.6.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.7.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.7.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.8.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.8.xpi -------------------------------------------------------------------------------- /v1/builds/0.1.9.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/builds/0.1.9.xpi -------------------------------------------------------------------------------- /v1/src/data/flags/ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ad.png -------------------------------------------------------------------------------- /v1/src/data/flags/ae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ae.png -------------------------------------------------------------------------------- /v1/src/data/flags/af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/af.png -------------------------------------------------------------------------------- /v1/src/data/flags/ag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ag.png -------------------------------------------------------------------------------- /v1/src/data/flags/ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ai.png -------------------------------------------------------------------------------- /v1/src/data/flags/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/al.png -------------------------------------------------------------------------------- /v1/src/data/flags/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/am.png -------------------------------------------------------------------------------- /v1/src/data/flags/an.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/an.png -------------------------------------------------------------------------------- /v1/src/data/flags/ao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ao.png -------------------------------------------------------------------------------- /v1/src/data/flags/ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ar.png -------------------------------------------------------------------------------- /v1/src/data/flags/as.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/as.png -------------------------------------------------------------------------------- /v1/src/data/flags/at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/at.png -------------------------------------------------------------------------------- /v1/src/data/flags/au.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/au.png -------------------------------------------------------------------------------- /v1/src/data/flags/aw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/aw.png -------------------------------------------------------------------------------- /v1/src/data/flags/ax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ax.png -------------------------------------------------------------------------------- /v1/src/data/flags/az.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/az.png -------------------------------------------------------------------------------- /v1/src/data/flags/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ba.png -------------------------------------------------------------------------------- /v1/src/data/flags/bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bb.png -------------------------------------------------------------------------------- /v1/src/data/flags/bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bd.png -------------------------------------------------------------------------------- /v1/src/data/flags/be.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/be.png -------------------------------------------------------------------------------- /v1/src/data/flags/bf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bf.png -------------------------------------------------------------------------------- /v1/src/data/flags/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bg.png -------------------------------------------------------------------------------- /v1/src/data/flags/bh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bh.png -------------------------------------------------------------------------------- /v1/src/data/flags/bi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bi.png -------------------------------------------------------------------------------- /v1/src/data/flags/bj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bj.png -------------------------------------------------------------------------------- /v1/src/data/flags/bm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bm.png -------------------------------------------------------------------------------- /v1/src/data/flags/bn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bn.png -------------------------------------------------------------------------------- /v1/src/data/flags/bo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bo.png -------------------------------------------------------------------------------- /v1/src/data/flags/br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/br.png -------------------------------------------------------------------------------- /v1/src/data/flags/bs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bs.png -------------------------------------------------------------------------------- /v1/src/data/flags/bt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bt.png -------------------------------------------------------------------------------- /v1/src/data/flags/bv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bv.png -------------------------------------------------------------------------------- /v1/src/data/flags/bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bw.png -------------------------------------------------------------------------------- /v1/src/data/flags/by.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/by.png -------------------------------------------------------------------------------- /v1/src/data/flags/bz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/bz.png -------------------------------------------------------------------------------- /v1/src/data/flags/ca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ca.png -------------------------------------------------------------------------------- /v1/src/data/flags/catalonia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/catalonia.png -------------------------------------------------------------------------------- /v1/src/data/flags/cc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cc.png -------------------------------------------------------------------------------- /v1/src/data/flags/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cd.png -------------------------------------------------------------------------------- /v1/src/data/flags/cf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cf.png -------------------------------------------------------------------------------- /v1/src/data/flags/cg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cg.png -------------------------------------------------------------------------------- /v1/src/data/flags/ch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ch.png -------------------------------------------------------------------------------- /v1/src/data/flags/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ci.png -------------------------------------------------------------------------------- /v1/src/data/flags/ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ck.png -------------------------------------------------------------------------------- /v1/src/data/flags/cl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cl.png -------------------------------------------------------------------------------- /v1/src/data/flags/cm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cm.png -------------------------------------------------------------------------------- /v1/src/data/flags/cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cn.png -------------------------------------------------------------------------------- /v1/src/data/flags/co.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/co.png -------------------------------------------------------------------------------- /v1/src/data/flags/cr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cr.png -------------------------------------------------------------------------------- /v1/src/data/flags/cs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cs.png -------------------------------------------------------------------------------- /v1/src/data/flags/cu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cu.png -------------------------------------------------------------------------------- /v1/src/data/flags/cv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cv.png -------------------------------------------------------------------------------- /v1/src/data/flags/cx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cx.png -------------------------------------------------------------------------------- /v1/src/data/flags/cy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cy.png -------------------------------------------------------------------------------- /v1/src/data/flags/cz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/cz.png -------------------------------------------------------------------------------- /v1/src/data/flags/de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/de.png -------------------------------------------------------------------------------- /v1/src/data/flags/dj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/dj.png -------------------------------------------------------------------------------- /v1/src/data/flags/dk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/dk.png -------------------------------------------------------------------------------- /v1/src/data/flags/dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/dm.png -------------------------------------------------------------------------------- /v1/src/data/flags/do.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/do.png -------------------------------------------------------------------------------- /v1/src/data/flags/dz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/dz.png -------------------------------------------------------------------------------- /v1/src/data/flags/ec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ec.png -------------------------------------------------------------------------------- /v1/src/data/flags/ee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ee.png -------------------------------------------------------------------------------- /v1/src/data/flags/eg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/eg.png -------------------------------------------------------------------------------- /v1/src/data/flags/eh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/eh.png -------------------------------------------------------------------------------- /v1/src/data/flags/england.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/england.png -------------------------------------------------------------------------------- /v1/src/data/flags/er.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/er.png -------------------------------------------------------------------------------- /v1/src/data/flags/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/error.png -------------------------------------------------------------------------------- /v1/src/data/flags/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/es.png -------------------------------------------------------------------------------- /v1/src/data/flags/et.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/et.png -------------------------------------------------------------------------------- /v1/src/data/flags/europeanunion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/europeanunion.png -------------------------------------------------------------------------------- /v1/src/data/flags/fam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fam.png -------------------------------------------------------------------------------- /v1/src/data/flags/fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fi.png -------------------------------------------------------------------------------- /v1/src/data/flags/fj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fj.png -------------------------------------------------------------------------------- /v1/src/data/flags/fk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fk.png -------------------------------------------------------------------------------- /v1/src/data/flags/fm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fm.png -------------------------------------------------------------------------------- /v1/src/data/flags/fo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fo.png -------------------------------------------------------------------------------- /v1/src/data/flags/fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/fr.png -------------------------------------------------------------------------------- /v1/src/data/flags/ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ga.png -------------------------------------------------------------------------------- /v1/src/data/flags/gb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gb.png -------------------------------------------------------------------------------- /v1/src/data/flags/gd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gd.png -------------------------------------------------------------------------------- /v1/src/data/flags/ge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ge.png -------------------------------------------------------------------------------- /v1/src/data/flags/gf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gf.png -------------------------------------------------------------------------------- /v1/src/data/flags/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gh.png -------------------------------------------------------------------------------- /v1/src/data/flags/gi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gi.png -------------------------------------------------------------------------------- /v1/src/data/flags/gl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gl.png -------------------------------------------------------------------------------- /v1/src/data/flags/gm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gm.png -------------------------------------------------------------------------------- /v1/src/data/flags/gn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gn.png -------------------------------------------------------------------------------- /v1/src/data/flags/gp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gp.png -------------------------------------------------------------------------------- /v1/src/data/flags/gq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gq.png -------------------------------------------------------------------------------- /v1/src/data/flags/gr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gr.png -------------------------------------------------------------------------------- /v1/src/data/flags/gs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gs.png -------------------------------------------------------------------------------- /v1/src/data/flags/gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gt.png -------------------------------------------------------------------------------- /v1/src/data/flags/gu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gu.png -------------------------------------------------------------------------------- /v1/src/data/flags/gw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gw.png -------------------------------------------------------------------------------- /v1/src/data/flags/gy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/gy.png -------------------------------------------------------------------------------- /v1/src/data/flags/hk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/hk.png -------------------------------------------------------------------------------- /v1/src/data/flags/hm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/hm.png -------------------------------------------------------------------------------- /v1/src/data/flags/hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/hn.png -------------------------------------------------------------------------------- /v1/src/data/flags/hr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/hr.png -------------------------------------------------------------------------------- /v1/src/data/flags/ht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ht.png -------------------------------------------------------------------------------- /v1/src/data/flags/hu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/hu.png -------------------------------------------------------------------------------- /v1/src/data/flags/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/id.png -------------------------------------------------------------------------------- /v1/src/data/flags/ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ie.png -------------------------------------------------------------------------------- /v1/src/data/flags/il.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/il.png -------------------------------------------------------------------------------- /v1/src/data/flags/in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/in.png -------------------------------------------------------------------------------- /v1/src/data/flags/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/io.png -------------------------------------------------------------------------------- /v1/src/data/flags/iq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/iq.png -------------------------------------------------------------------------------- /v1/src/data/flags/ir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ir.png -------------------------------------------------------------------------------- /v1/src/data/flags/is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/is.png -------------------------------------------------------------------------------- /v1/src/data/flags/it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/it.png -------------------------------------------------------------------------------- /v1/src/data/flags/jm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/jm.png -------------------------------------------------------------------------------- /v1/src/data/flags/jo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/jo.png -------------------------------------------------------------------------------- /v1/src/data/flags/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/jp.png -------------------------------------------------------------------------------- /v1/src/data/flags/ke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ke.png -------------------------------------------------------------------------------- /v1/src/data/flags/kg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kg.png -------------------------------------------------------------------------------- /v1/src/data/flags/kh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kh.png -------------------------------------------------------------------------------- /v1/src/data/flags/ki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ki.png -------------------------------------------------------------------------------- /v1/src/data/flags/km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/km.png -------------------------------------------------------------------------------- /v1/src/data/flags/kn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kn.png -------------------------------------------------------------------------------- /v1/src/data/flags/kp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kp.png -------------------------------------------------------------------------------- /v1/src/data/flags/kr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kr.png -------------------------------------------------------------------------------- /v1/src/data/flags/kw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kw.png -------------------------------------------------------------------------------- /v1/src/data/flags/ky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ky.png -------------------------------------------------------------------------------- /v1/src/data/flags/kz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/kz.png -------------------------------------------------------------------------------- /v1/src/data/flags/la.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/la.png -------------------------------------------------------------------------------- /v1/src/data/flags/lb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lb.png -------------------------------------------------------------------------------- /v1/src/data/flags/lc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lc.png -------------------------------------------------------------------------------- /v1/src/data/flags/li.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/li.png -------------------------------------------------------------------------------- /v1/src/data/flags/lk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lk.png -------------------------------------------------------------------------------- /v1/src/data/flags/local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/local.png -------------------------------------------------------------------------------- /v1/src/data/flags/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lr.png -------------------------------------------------------------------------------- /v1/src/data/flags/ls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ls.png -------------------------------------------------------------------------------- /v1/src/data/flags/lt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lt.png -------------------------------------------------------------------------------- /v1/src/data/flags/lu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lu.png -------------------------------------------------------------------------------- /v1/src/data/flags/lv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/lv.png -------------------------------------------------------------------------------- /v1/src/data/flags/ly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ly.png -------------------------------------------------------------------------------- /v1/src/data/flags/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ma.png -------------------------------------------------------------------------------- /v1/src/data/flags/mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mc.png -------------------------------------------------------------------------------- /v1/src/data/flags/md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/md.png -------------------------------------------------------------------------------- /v1/src/data/flags/me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/me.png -------------------------------------------------------------------------------- /v1/src/data/flags/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mg.png -------------------------------------------------------------------------------- /v1/src/data/flags/mh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mh.png -------------------------------------------------------------------------------- /v1/src/data/flags/mk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mk.png -------------------------------------------------------------------------------- /v1/src/data/flags/ml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ml.png -------------------------------------------------------------------------------- /v1/src/data/flags/mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mm.png -------------------------------------------------------------------------------- /v1/src/data/flags/mn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mn.png -------------------------------------------------------------------------------- /v1/src/data/flags/mo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mo.png -------------------------------------------------------------------------------- /v1/src/data/flags/mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mp.png -------------------------------------------------------------------------------- /v1/src/data/flags/mq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mq.png -------------------------------------------------------------------------------- /v1/src/data/flags/mr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mr.png -------------------------------------------------------------------------------- /v1/src/data/flags/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ms.png -------------------------------------------------------------------------------- /v1/src/data/flags/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mt.png -------------------------------------------------------------------------------- /v1/src/data/flags/mu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mu.png -------------------------------------------------------------------------------- /v1/src/data/flags/mv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mv.png -------------------------------------------------------------------------------- /v1/src/data/flags/mw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mw.png -------------------------------------------------------------------------------- /v1/src/data/flags/mx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mx.png -------------------------------------------------------------------------------- /v1/src/data/flags/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/my.png -------------------------------------------------------------------------------- /v1/src/data/flags/mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/mz.png -------------------------------------------------------------------------------- /v1/src/data/flags/na.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/na.png -------------------------------------------------------------------------------- /v1/src/data/flags/nc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/nc.png -------------------------------------------------------------------------------- /v1/src/data/flags/ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ne.png -------------------------------------------------------------------------------- /v1/src/data/flags/nf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/nf.png -------------------------------------------------------------------------------- /v1/src/data/flags/ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ng.png -------------------------------------------------------------------------------- /v1/src/data/flags/ni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ni.png -------------------------------------------------------------------------------- /v1/src/data/flags/nl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/nl.png -------------------------------------------------------------------------------- /v1/src/data/flags/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/no.png -------------------------------------------------------------------------------- /v1/src/data/flags/np.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/np.png -------------------------------------------------------------------------------- /v1/src/data/flags/nr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/nr.png -------------------------------------------------------------------------------- /v1/src/data/flags/nu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/nu.png -------------------------------------------------------------------------------- /v1/src/data/flags/nz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/nz.png -------------------------------------------------------------------------------- /v1/src/data/flags/om.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/om.png -------------------------------------------------------------------------------- /v1/src/data/flags/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pa.png -------------------------------------------------------------------------------- /v1/src/data/flags/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pe.png -------------------------------------------------------------------------------- /v1/src/data/flags/pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pf.png -------------------------------------------------------------------------------- /v1/src/data/flags/pg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pg.png -------------------------------------------------------------------------------- /v1/src/data/flags/ph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ph.png -------------------------------------------------------------------------------- /v1/src/data/flags/pk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pk.png -------------------------------------------------------------------------------- /v1/src/data/flags/pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pl.png -------------------------------------------------------------------------------- /v1/src/data/flags/pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pm.png -------------------------------------------------------------------------------- /v1/src/data/flags/pn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pn.png -------------------------------------------------------------------------------- /v1/src/data/flags/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pr.png -------------------------------------------------------------------------------- /v1/src/data/flags/ps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ps.png -------------------------------------------------------------------------------- /v1/src/data/flags/pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pt.png -------------------------------------------------------------------------------- /v1/src/data/flags/pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/pw.png -------------------------------------------------------------------------------- /v1/src/data/flags/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/py.png -------------------------------------------------------------------------------- /v1/src/data/flags/qa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/qa.png -------------------------------------------------------------------------------- /v1/src/data/flags/re.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/re.png -------------------------------------------------------------------------------- /v1/src/data/flags/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ro.png -------------------------------------------------------------------------------- /v1/src/data/flags/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/rs.png -------------------------------------------------------------------------------- /v1/src/data/flags/ru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ru.png -------------------------------------------------------------------------------- /v1/src/data/flags/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/rw.png -------------------------------------------------------------------------------- /v1/src/data/flags/sa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sa.png -------------------------------------------------------------------------------- /v1/src/data/flags/sb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sb.png -------------------------------------------------------------------------------- /v1/src/data/flags/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sc.png -------------------------------------------------------------------------------- /v1/src/data/flags/scotland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/scotland.png -------------------------------------------------------------------------------- /v1/src/data/flags/sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sd.png -------------------------------------------------------------------------------- /v1/src/data/flags/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/se.png -------------------------------------------------------------------------------- /v1/src/data/flags/sg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sg.png -------------------------------------------------------------------------------- /v1/src/data/flags/sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sh.png -------------------------------------------------------------------------------- /v1/src/data/flags/si.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/si.png -------------------------------------------------------------------------------- /v1/src/data/flags/sj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sj.png -------------------------------------------------------------------------------- /v1/src/data/flags/sk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sk.png -------------------------------------------------------------------------------- /v1/src/data/flags/sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sl.png -------------------------------------------------------------------------------- /v1/src/data/flags/sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sm.png -------------------------------------------------------------------------------- /v1/src/data/flags/sn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sn.png -------------------------------------------------------------------------------- /v1/src/data/flags/so.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/so.png -------------------------------------------------------------------------------- /v1/src/data/flags/sr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sr.png -------------------------------------------------------------------------------- /v1/src/data/flags/st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/st.png -------------------------------------------------------------------------------- /v1/src/data/flags/sv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sv.png -------------------------------------------------------------------------------- /v1/src/data/flags/sy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sy.png -------------------------------------------------------------------------------- /v1/src/data/flags/sz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/sz.png -------------------------------------------------------------------------------- /v1/src/data/flags/tc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tc.png -------------------------------------------------------------------------------- /v1/src/data/flags/td.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/td.png -------------------------------------------------------------------------------- /v1/src/data/flags/tf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tf.png -------------------------------------------------------------------------------- /v1/src/data/flags/tg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tg.png -------------------------------------------------------------------------------- /v1/src/data/flags/th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/th.png -------------------------------------------------------------------------------- /v1/src/data/flags/tj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tj.png -------------------------------------------------------------------------------- /v1/src/data/flags/tk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tk.png -------------------------------------------------------------------------------- /v1/src/data/flags/tl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tl.png -------------------------------------------------------------------------------- /v1/src/data/flags/tm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tm.png -------------------------------------------------------------------------------- /v1/src/data/flags/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tn.png -------------------------------------------------------------------------------- /v1/src/data/flags/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/to.png -------------------------------------------------------------------------------- /v1/src/data/flags/tr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tr.png -------------------------------------------------------------------------------- /v1/src/data/flags/tt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tt.png -------------------------------------------------------------------------------- /v1/src/data/flags/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tv.png -------------------------------------------------------------------------------- /v1/src/data/flags/tw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tw.png -------------------------------------------------------------------------------- /v1/src/data/flags/tz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/tz.png -------------------------------------------------------------------------------- /v1/src/data/flags/ua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ua.png -------------------------------------------------------------------------------- /v1/src/data/flags/ug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ug.png -------------------------------------------------------------------------------- /v1/src/data/flags/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/um.png -------------------------------------------------------------------------------- /v1/src/data/flags/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/us.png -------------------------------------------------------------------------------- /v1/src/data/flags/uy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/uy.png -------------------------------------------------------------------------------- /v1/src/data/flags/uz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/uz.png -------------------------------------------------------------------------------- /v1/src/data/flags/va.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/va.png -------------------------------------------------------------------------------- /v1/src/data/flags/vc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/vc.png -------------------------------------------------------------------------------- /v1/src/data/flags/ve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ve.png -------------------------------------------------------------------------------- /v1/src/data/flags/vg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/vg.png -------------------------------------------------------------------------------- /v1/src/data/flags/vi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/vi.png -------------------------------------------------------------------------------- /v1/src/data/flags/vn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/vn.png -------------------------------------------------------------------------------- /v1/src/data/flags/vu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/vu.png -------------------------------------------------------------------------------- /v1/src/data/flags/wales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/wales.png -------------------------------------------------------------------------------- /v1/src/data/flags/wf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/wf.png -------------------------------------------------------------------------------- /v1/src/data/flags/ws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ws.png -------------------------------------------------------------------------------- /v1/src/data/flags/ye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/ye.png -------------------------------------------------------------------------------- /v1/src/data/flags/yt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/yt.png -------------------------------------------------------------------------------- /v1/src/data/flags/za.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/za.png -------------------------------------------------------------------------------- /v1/src/data/flags/zm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/zm.png -------------------------------------------------------------------------------- /v1/src/data/flags/zw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/flags/zw.png -------------------------------------------------------------------------------- /v1/src/data/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/128.png -------------------------------------------------------------------------------- /v1/src/data/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/16.png -------------------------------------------------------------------------------- /v1/src/data/icons/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/24.png -------------------------------------------------------------------------------- /v1/src/data/icons/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/256.png -------------------------------------------------------------------------------- /v1/src/data/icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/32.png -------------------------------------------------------------------------------- /v1/src/data/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/48.png -------------------------------------------------------------------------------- /v1/src/data/icons/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/64.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/blue/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/blue/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/blue/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/blue/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/blue/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/blue/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/blue/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/blue/38.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/gray/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/gray/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/gray/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/gray/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/gray/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/gray/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/gray/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/gray/38.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/green/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/green/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/green/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/green/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/green/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/green/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/green/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/green/38.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/orange/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/orange/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/orange/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/orange/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/orange/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/orange/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/orange/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/orange/38.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/0/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/0/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/0/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/0/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/1/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/1/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/1/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/1/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/19.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/2/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/2/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/2/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/2/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/3/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/3/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/3/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/3/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/38.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/4/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/4/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/4/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/4/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/5/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/5/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/5/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/5/36.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/plus/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/plus/18.png -------------------------------------------------------------------------------- /v1/src/data/icons/toolbar/red/plus/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/icons/toolbar/red/plus/36.png -------------------------------------------------------------------------------- /v1/src/data/log/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Error Logs :: Proxy Switcher 6 | 7 | 8 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
MethodURLStatus LineIP AddressType
58 | 59 | 60 | -------------------------------------------------------------------------------- /v1/src/data/log/index.js: -------------------------------------------------------------------------------- 1 | /* globals self */ 2 | 'use strict'; 3 | 4 | var tabId = document.location.search.split('id=')[1]; 5 | var tbody = document.querySelector('tbody'); 6 | 7 | if (tabId) { 8 | self.port.on('response', (response) => { 9 | (response || []).forEach (obj => { 10 | let tr = document.createElement('tr'); 11 | let method = document.createElement('td'); 12 | method.textContent = obj.method; 13 | let url = document.createElement('td'); 14 | let a = document.createElement('a'); 15 | a.href = a.title = a.textContent = obj.url; 16 | let statusLine = document.createElement('td'); 17 | statusLine.title = statusLine.textContent = obj.statusLine || obj.error; 18 | let ip = document.createElement('td'); 19 | ip.textContent = obj.ip; 20 | let type = document.createElement('td'); 21 | type.textContent = obj.type; 22 | 23 | tr.appendChild(method); 24 | url.appendChild(a); 25 | tr.appendChild(url); 26 | tr.appendChild(statusLine); 27 | tr.appendChild(ip); 28 | tr.appendChild(type); 29 | tbody.appendChild(tr); 30 | }); 31 | }); 32 | self.port.emit('fails', tabId); 33 | } 34 | -------------------------------------------------------------------------------- /v1/src/data/popup/firefox/firefox.js: -------------------------------------------------------------------------------- 1 | /* globals self */ 2 | 'use strict'; 3 | 4 | var background = { 5 | send: self.port.emit, 6 | receive: self.port.on 7 | }; 8 | 9 | var manifest = { 10 | base: self.options.base 11 | }; 12 | -------------------------------------------------------------------------------- /v1/src/data/popup/fontello.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'fontello'; 3 | src: url('fontello.woff') format('woff'); 4 | font-weight: normal; 5 | font-style: normal; 6 | } 7 | 8 | [class^="icon-"]:before, [class*=" icon-"]:before { 9 | font-family: "fontello"; 10 | font-style: normal; 11 | font-weight: normal; 12 | speak: none; 13 | 14 | display: inline-block; 15 | text-decoration: inherit; 16 | width: 1em; 17 | margin-right: .2em; 18 | text-align: center; 19 | /* opacity: .8; */ 20 | 21 | /* For safety - reset parent styles, that can break glyph codes*/ 22 | font-variant: normal; 23 | text-transform: none; 24 | 25 | /* fix buttons height, for twitter bootstrap */ 26 | line-height: 1em; 27 | 28 | /* Animation center compensation - margins should be symmetric */ 29 | /* remove if not needed */ 30 | margin-left: .2em; 31 | 32 | /* you can be more comfortable with increased icons size */ 33 | /* font-size: 120%; */ 34 | 35 | /* Font smoothing. That was taken from TWBS */ 36 | -webkit-font-smoothing: antialiased; 37 | -moz-osx-font-smoothing: grayscale; 38 | 39 | /* Uncomment for 3D effect */ 40 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 41 | } 42 | 43 | .icon-true:before { content: '\e803'; } /* '' */ 44 | .icon-false:before { content: '\e804'; } /* '' */ 45 | -------------------------------------------------------------------------------- /v1/src/data/popup/fontello.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v1/src/data/popup/fontello.woff -------------------------------------------------------------------------------- /v1/src/data/popup/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | } 5 | 6 | body { 7 | background-color: #fff; 8 | padding: 0; 9 | margin: 0; 10 | font: 12px arial,sans-serif; 11 | -moz-user-select: none; 12 | user-select: none; 13 | color: rgb(66, 78, 90); 14 | display: flex; 15 | flex-direction: column; 16 | } 17 | table { 18 | width: 100%; 19 | font-size: 100%; 20 | } 21 | 22 | body, 23 | table { 24 | color: rgb(66, 78, 90); 25 | } 26 | 27 | #socks, 28 | #no-settings-tab, 29 | #automatic-tab { 30 | flex: 1; 31 | display: none; 32 | flex-direction: column; 33 | align-items: flex-start; 34 | justify-content: center; 35 | padding: 0 10px; 36 | } 37 | #no-settings-tab { 38 | align-items: center; 39 | } 40 | #automatic-tab>div { 41 | display: flex; 42 | width: 100%; 43 | } 44 | 45 | input[type=text], 46 | input[type=number] { 47 | width: 100%; 48 | } 49 | input[type=button] { 50 | margin: 0 0 0 5px; 51 | cursor: pointer; 52 | } 53 | input[type=button]:active { 54 | border-color: #dddddd; 55 | } 56 | input[type=text], 57 | input[type=number], 58 | input[type=button], 59 | select { 60 | border: solid 1px #cccccc; 61 | height: 24px; 62 | } 63 | select { 64 | width: 200px; 65 | } 66 | 67 | #tabs { 68 | height: 50px; 69 | line-height: 50px; 70 | border-bottom: solid 4px #424f5a; 71 | } 72 | #tabs td { 73 | text-align: center; 74 | color: #aaa; 75 | } 76 | #tabs label, 77 | #socks label { 78 | cursor: pointer; 79 | white-space: nowrap; 80 | } 81 | #tabs label { 82 | display: inline-block; 83 | width: 100%; 84 | height: 100%; 85 | } 86 | #tabs label:hover { 87 | background-color: rgba(0, 0, 0, 0.1); 88 | } 89 | #tabs input[name=proxy], 90 | #socks input[name=profile] { 91 | display: none; 92 | } 93 | #tabs :checked + span { 94 | text-decoration: underline; 95 | text-decoration-style: dashed; 96 | color: #000; 97 | } 98 | #tabs span:before { 99 | content: '\e804'; 100 | } 101 | #tabs :checked + span:before { 102 | content: '\e803'; 103 | } 104 | 105 | body:not([data-type="3"])>#socks, 106 | body:not([data-type="3"])>#socks select, 107 | body:not([data-type="3"])>#socks input { 108 | color: #aaa; 109 | pointer-events: none; 110 | } 111 | 112 | #socks tr { 113 | height: 28px; 114 | white-space: nowrap; 115 | } 116 | #socks td:nth-child(1) { 117 | width: 80px; 118 | } 119 | #socks td:nth-child(3) { 120 | width: 40px; 121 | } 122 | #socks td:nth-child(4) { 123 | width: 70px; 124 | } 125 | #socks tr:nth-child(1) { 126 | height: 30px; 127 | color: #aaa; 128 | } 129 | #socks[data-type=global] tr:nth-child(4), 130 | #socks[data-type=global] tr:nth-child(4) input, 131 | #socks[data-type=global] tr:nth-child(5), 132 | #socks[data-type=global] tr:nth-child(5) input, 133 | #socks[data-type=global] tr:nth-child(6), 134 | #socks[data-type=global] tr:nth-child(6) input { 135 | color: #aaa; 136 | pointer-events: none; 137 | } 138 | 139 | #socks input[name=profile]:checked + span { 140 | font-weight: bold; 141 | } 142 | body[data-type="3"] #socks input[name=profile]:checked + span { 143 | color: #000; 144 | } 145 | body[data-type="0"] #no-settings-tab, 146 | body[data-type="1"] #no-settings-tab, 147 | body[data-type="2"] #no-settings-tab, 148 | body[data-type="3"] #socks, 149 | body[data-type="4"] #automatic-tab { 150 | display: flex; 151 | } 152 | 153 | #links { 154 | height: 50px; 155 | line-height: 50px; 156 | background-color: #424f5a; 157 | color: #fff; 158 | padding: 0 10px; 159 | } 160 | a { 161 | text-decoration: none; 162 | } 163 | #links a { 164 | color: #fff; 165 | } 166 | 167 | #ftp-host, 168 | #socks-host, 169 | #http-host, 170 | #ssl-host { 171 | background-image: url('../flags/local.png'); 172 | background-position: center right 5px; 173 | background-repeat: no-repeat; 174 | } 175 | -------------------------------------------------------------------------------- /v1/src/data/popup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 19 | 20 | 21 | 31 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 72 | 73 | 74 | 75 | 78 | 79 |
Profile: 22 | 30 | 32 | Edit - 33 | Import - 34 | Export 35 |
HTTP Proxy:Port:
45 | 46 |
SSL Proxy:Port:
FTP Proxy:Port:
SOCKS Host:Port:
68 | 69 | 70 | 71 |
No Proxy for: 76 | 77 |
80 |
81 |
82 | No extra settings 83 |
84 |
85 |

Automatic proxy configuration URL:

86 |
87 | PAC profile: 88 | 89 | 90 | 91 | 92 | 93 |
94 |
95 | 96 | 97 |
98 |

99 | Open Error Console to track PAC syntax errors. Read more on how to write a PAC script 100 |

101 |
102 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /v1/src/lib/config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var app = require('./firefox/firefox'); 4 | var config = exports; 5 | 6 | config.popup = { 7 | width: 550, 8 | height: 370 9 | }; 10 | 11 | config.proxy = { 12 | get attached () { 13 | return app.storage.read('attached') === 'false' ? false : true; 14 | }, 15 | set attached (val) { 16 | app.storage.write('attached', val); 17 | }, 18 | get profiles () { 19 | return app.storage.read('profiles') || 'Profile 1, Profile 2, Profile 3, Profile 4, Profile 5'; 20 | }, 21 | set profiles (val) { 22 | var tmp = val.split(/\s*\,\s*/).map(function (p) { 23 | return p.trim().substr(0, 10); 24 | }); 25 | 26 | let profiles = {}; 27 | let keys = config.proxy.profiles.split(', '); 28 | keys.forEach((name, i) => profiles[name] = app.storage.read('profile-' + i)); 29 | tmp.forEach(function (name, i) { 30 | console.error('profile-' + i, name, profiles[name] ,i, keys[i], profiles[keys[i]]); 31 | app.storage.write('profile-' + i, profiles[name] || profiles[keys[i]] || ''); 32 | }); 33 | 34 | app.storage.write('profiles', tmp.join(', ')); 35 | config.proxy.pIndex = Math.min(config.proxy.pIndex, tmp.length - 1); 36 | }, 37 | getProfile: function (i) { 38 | return app.storage.read('profile-' + i); 39 | }, 40 | setProfile: function (i, name, str) { 41 | app.storage.write('profile-' + i, str); 42 | let tmp = config.proxy.profiles.split(', '); 43 | tmp[i] = name; 44 | app.storage.write('profiles', tmp.join(', ')); 45 | }, 46 | get pIndex () { 47 | return parseInt(app.storage.read('profile-index') || '0'); 48 | }, 49 | set pIndex (val) { 50 | app.storage.write('profile-index', val); 51 | }, 52 | pac: { 53 | get index () { 54 | return parseInt(app.storage.read('pac-index') || '0'); 55 | }, 56 | set index (val) { 57 | app.storage.write('pac-index', val); 58 | }, 59 | value: function (index, val) { 60 | if (val !== null) { 61 | app.storage.write('pac-value-' + index, val); 62 | } 63 | else { 64 | let pac = app.storage.read('pac-value-' + index); 65 | if (!pac && index === 0) { 66 | val = app.proxy.get('network.proxy.autoconfig_url'); 67 | app.storage.write('pac-value-0', val); 68 | return val; 69 | } 70 | return pac || ''; 71 | } 72 | } 73 | } 74 | }; 75 | 76 | config.welcome = { 77 | get version () { 78 | return app.storage.read('version'); 79 | }, 80 | set version (val) { 81 | app.storage.write('version', val); 82 | }, 83 | timeout: 3, 84 | get show () { 85 | return app.storage.read('show') === 'false' ? false : true; // default is true 86 | }, 87 | set show (val) { 88 | app.storage.write('show', val); 89 | } 90 | }; 91 | 92 | config.links = { 93 | get faq () { 94 | return 'http://firefox.add0n.com/proxy-switcher.html'; 95 | }, 96 | get ip () { 97 | return app.storage.read('open-ip') || 'http://tools.add0n.com/what-is-my-ip.php'; 98 | }, 99 | get geo () { 100 | return app.storage.read('open-geo') || 'http://www.geoipview.com/'; 101 | }, 102 | get leak () { 103 | return app.storage.read('open-leak') || 'https://ipleak.net'; 104 | }, 105 | get pac () { 106 | return 'http://blog.add0n.com/2016/02/11/configure-proxy-settings-in-firefox.html'; 107 | }, 108 | get webex () { 109 | return 'https://addons.mozilla.org/firefox/addon/proxy-switcher-and-manager/'; 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /v1/src/lib/monitor.js: -------------------------------------------------------------------------------- 1 | /* globals require */ 2 | 'use strict'; 3 | 4 | var unload = require('sdk/system/unload'); 5 | var tabs = require('sdk/tabs'); 6 | var utils = require('sdk/tabs/utils'); 7 | var self = require('sdk/self'); 8 | var tabs = require('sdk/tabs'); 9 | var pageMod = require('sdk/page-mod'); 10 | var {WebRequest} = require('resource://gre/modules/WebRequest.jsm', {}); 11 | 12 | var button = require('./firefox/firefox').button._obj; 13 | var on = require('./firefox/firefox').on; 14 | var cache = {}; 15 | 16 | function update (id) { 17 | let tab = utils.getTabForId(cache[id].tabId); 18 | 19 | let num = cache[id].errors.length; 20 | button.state(tab, { 21 | badge: num || '' 22 | }); 23 | } 24 | 25 | function observe (d) { 26 | if (d.statusCode < 200 || d.statusCode >= 400) { 27 | if (d.statusCode === 101) { // https://github.com/rNeomy/proxy-switcher/issues/30#issuecomment-322780831 28 | return; 29 | } 30 | let windowId = d.browser._outerWindowID || (d.parentWindowId === -1 ? d.windowId : d.parentWindowId); 31 | if (cache[windowId]) { 32 | cache[windowId].errors.push({ 33 | method: d.method, 34 | url: d.url, 35 | statusLine: d.statusLine, 36 | ip: d.ip, 37 | type: d.type 38 | }); 39 | } 40 | else { 41 | let id = utils.getTabId(utils.getTabForBrowser(d.browser)); 42 | cache[windowId] = { 43 | errors: [{ 44 | method: d.method, 45 | url: d.url, 46 | statusLine: d.statusLine, 47 | ip: d.ip, 48 | type: d.type 49 | }], 50 | tabId: id 51 | }; 52 | } 53 | update(windowId); 54 | } 55 | } 56 | 57 | tabs.on('close', tab => { 58 | Object.keys(cache).forEach(id => { 59 | if (cache[id].tabId === tab.id) { 60 | delete cache[id]; 61 | } 62 | }); 63 | }); 64 | tabs.on('ready', tab => { 65 | Object.keys(cache).forEach(id => { 66 | if (cache[id].tabId === tab.id) { 67 | cache[id].errors = []; 68 | update(id); 69 | } 70 | }); 71 | }); 72 | 73 | WebRequest.onCompleted.addListener(observe); 74 | unload.when((e) => { 75 | WebRequest.onCompleted.removeListener(observe); 76 | if (e === 'shutdown') { 77 | return; 78 | } 79 | for (let tab of tabs) { 80 | if (tab && tab.url && tab.url.startsWith(self.data.url(''))) { 81 | tab.close(); 82 | } 83 | } 84 | }); 85 | 86 | on('open-log', () => { 87 | tabs.open(self.data.url('log/index.html?id=') + tabs.activeTab.id); 88 | }); 89 | 90 | // inject 91 | pageMod.PageMod({ 92 | include: self.data.url('log/index.html?id=*'), 93 | contentScriptFile: self.data.url('log/index.js'), 94 | onAttach: function (worker) { 95 | worker.port.on('fails', (id) => { 96 | Object.keys(cache).forEach(name => { 97 | if (cache[name].tabId === id) { 98 | worker.port.emit('response', cache[name].errors); 99 | } 100 | }); 101 | }); 102 | } 103 | }); 104 | -------------------------------------------------------------------------------- /v1/src/lib/tbExtra.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var {Cu} = require('chrome'), 4 | self = require('sdk/self'), 5 | unload = require('sdk/system/unload'); 6 | 7 | var onClick = function () {}; 8 | 9 | (function (listen) { 10 | let {CustomizableUI} = Cu.import('resource:///modules/CustomizableUI.jsm'); 11 | CustomizableUI.addListener(listen); 12 | unload.when(() => CustomizableUI.removeListener(listen)); 13 | })({ 14 | onWidgetBeforeDOMChange: function (tbb) { 15 | if (tbb.id.indexOf(self.name) === -1 || tbb.isOnContextInstalled) { 16 | return; 17 | } 18 | // Install onContext if it is not installed 19 | tbb.isOnContextInstalled = true; 20 | tbb.addEventListener('click', (e) => onClick(e), false); 21 | } 22 | }); 23 | 24 | exports.onClick = (c) => onClick = c; 25 | -------------------------------------------------------------------------------- /v1/src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Proxy Switcher", 3 | "name": "ipswitcher", 4 | "description": "Change Firefox's proxy settings right from toolbar panel", 5 | "id": "jid0-hjBdm7jJii7llLkqacvGnd3gHge@jetpack", 6 | "license": "MPLv2.0", 7 | "version": "0.2.0", 8 | "author": "Richard Neomy", 9 | "main": "lib/common.js", 10 | "icon": "./data/icons/48.png", 11 | "icon64": "./data/icons/64.png", 12 | "url": "http://add0n.com/proxy-switcher.html", 13 | "permissions": { 14 | "private-browsing": true, 15 | "multiprocess": true 16 | }, 17 | "preferences": [ 18 | { 19 | "description": "Display the number of failed resources for current tab in the toolbar badge. Disable and re-enable the extension for this change to take place.", 20 | "type": "bool", 21 | "name": "monitor", 22 | "value": true, 23 | "title": "Monitor and log failed resources" 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /v2/chrome/LICENSE: -------------------------------------------------------------------------------- 1 | ../../LICENSE -------------------------------------------------------------------------------- /v2/chrome/_locales: -------------------------------------------------------------------------------- 1 | ../firefox/_locales/ -------------------------------------------------------------------------------- /v2/chrome/common.js: -------------------------------------------------------------------------------- 1 | ../firefox/common.js -------------------------------------------------------------------------------- /v2/chrome/data: -------------------------------------------------------------------------------- 1 | ../firefox/data/ -------------------------------------------------------------------------------- /v2/chrome/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Proxy Switcher and Manager", 3 | "description": "Manage and switch between multiple proxy types (SOCKS, PAC, and Direct) with profile support", 4 | "version": "0.5.1", 5 | "manifest_version": 2, 6 | "default_locale": "en", 7 | "permissions": [ 8 | "storage", 9 | "notifications", 10 | "proxy" 11 | ], 12 | "optional_permissions": [ 13 | "*://*/*", 14 | "webRequest" 15 | ], 16 | "storage": { 17 | "managed_schema": "schema.json" 18 | }, 19 | "browser_action": { 20 | "default_popup": "data/panel/index.html" 21 | }, 22 | "background": { 23 | "scripts": [ 24 | "data/panel/utils.js", 25 | "common.js" 26 | ] 27 | }, 28 | "homepage_url": "https://add0n.com/proxy-switcher.html", 29 | "icons": { 30 | "16": "data/icons/16.png", 31 | "24": "data/icons/24.png", 32 | "32": "data/icons/32.png", 33 | "48": "data/icons/48.png", 34 | "64": "data/icons/64.png", 35 | "128": "data/icons/128.png", 36 | "256": "data/icons/256.png" 37 | }, 38 | "options_ui": { 39 | "page": "data/options/index.html", 40 | "chrome_style": true 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /v2/chrome/schema.json: -------------------------------------------------------------------------------- 1 | ../firefox/schema.json -------------------------------------------------------------------------------- /v2/firefox/LICENSE: -------------------------------------------------------------------------------- 1 | ../../LICENSE -------------------------------------------------------------------------------- /v2/firefox/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "modeDirectMSG": { 3 | "message": "Directly connect to network and bypass system proxy" 4 | }, 5 | "modeAutoMSG": { 6 | "message": "Automatically detect the proxy settings for your network" 7 | }, 8 | "modeSystemMSG": { 9 | "message": "Use system-wide proxy" 10 | }, 11 | "modePACMSG": { 12 | "message": "Proxy is determined from a PAC script" 13 | }, 14 | "modeFixedMSG": { 15 | "message": "Define proxy server for each protocol" 16 | }, 17 | "modeDirect": { 18 | "message": "No Proxy - directly connected to network which bypasses system proxy" 19 | }, 20 | "modeAuto": { 21 | "message": "Auto-Detect - automatically detect the proxy settings for your network" 22 | }, 23 | "modePACD": { 24 | "message": "PAC Script - inline-script mode" 25 | }, 26 | "modePACU": { 27 | "message": "PAC Script - " 28 | }, 29 | "modeFixed": { 30 | "message": "Manual Proxy - proxy server for each scheme (HTTP, HTTPS, and FTP) is defined in the settings page" 31 | }, 32 | "modeSystem": { 33 | "message": "System - use system-wide proxy" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /v2/firefox/_locales/nl/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "modeDirectMSG": { 3 | "message": "Direct verbinding maken met netwerk en systeemproxy negeren" 4 | }, 5 | "modeAutoMSG": { 6 | "message": "Proxy-instellingen van netwerk automatisch detecteren" 7 | }, 8 | "modeSystemMSG": { 9 | "message": "Systeemproxy gebruiken" 10 | }, 11 | "modePACMSG": { 12 | "message": "De proxy wordt bepaald op basis van een pac-script" 13 | }, 14 | "modeFixedMSG": { 15 | "message": "Proxyserver per protocol bepalen" 16 | }, 17 | "modeDirect": { 18 | "message": "Geen proxy - direct verbinding maken met netwerk en systeemproxy negeren" 19 | }, 20 | "modeAuto": { 21 | "message": "Automatisch - automatisch de proxy-instellingen detecteren" 22 | }, 23 | "modePACD": { 24 | "message": "PAC-script - ingebouwde scriptmodus" 25 | }, 26 | "modePACU": { 27 | "message": "PAC-script - " 28 | }, 29 | "modeFixed": { 30 | "message": "Handmatig - proxyserver per schema (http, https en ftp) zoals opgegeven in de instellingen" 31 | }, 32 | "modeSystem": { 33 | "message": "Systeem - systeemproxy gebruiken" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /v2/firefox/data/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/128.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/16.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/24.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/256.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/32.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/48.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v2/firefox/data/icons/64.png -------------------------------------------------------------------------------- /v2/firefox/data/icons/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /v2/firefox/data/log/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Error Logs :: Proxy Switcher 6 | 7 | 8 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
MethodURLStatus LineIP AddressType
58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /v2/firefox/data/log/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var tabId = document.location.search.split('id=')[1]; 4 | var tbody = document.querySelector('tbody'); 5 | 6 | if (tabId) { 7 | chrome.runtime.sendMessage({ 8 | cmd: 'fails', 9 | tabId 10 | }, (response) => { 11 | (response || []).forEach (obj => { 12 | let tr = document.createElement('tr'); 13 | let method = document.createElement('td'); 14 | method.textContent = obj.method; 15 | let url = document.createElement('td'); 16 | let a = document.createElement('a'); 17 | a.href = a.title = a.textContent = obj.url; 18 | let statusLine = document.createElement('td'); 19 | statusLine.title = statusLine.textContent = obj.statusLine || obj.error; 20 | let ip = document.createElement('td'); 21 | ip.textContent = obj.ip; 22 | let type = document.createElement('td'); 23 | type.textContent = obj.type; 24 | 25 | tr.appendChild(method); 26 | url.appendChild(a); 27 | tr.appendChild(url); 28 | tr.appendChild(statusLine); 29 | tr.appendChild(ip); 30 | tr.appendChild(type); 31 | tbody.appendChild(tr); 32 | }); 33 | }); 34 | } 35 | -------------------------------------------------------------------------------- /v2/firefox/data/options/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const toast = document.getElementById('toast'); 4 | 5 | function save() { 6 | const perform = () => chrome.storage.local.set({ 7 | 'text': document.getElementById('text').checked, 8 | 'counter': document.getElementById('counter').checked, 9 | 'color': document.getElementById('color').value, 10 | 'server': document.getElementById('server').value, 11 | 'validate-mode': document.getElementById('validate-mode').value, 12 | 'anonymity': document.getElementById('anonymity').value, 13 | 'allowsRefererHeader': document.getElementById('allowsRefererHeader').value, 14 | 'allowsUserAgentHeader': document.getElementById('allowsUserAgentHeader').value, 15 | 'allowsCustomHeaders': document.getElementById('allowsCustomHeaders').value, 16 | 'allowsCookies': document.getElementById('allowsCookies').value, 17 | 'country': document.getElementById('country').value, 18 | 'faqs': document.getElementById('faqs').checked, 19 | 'startup-proxy': document.getElementById('startup-proxy').value, 20 | 'color-auto_detect': document.getElementById('color-auto_detect').value, 21 | 'color-direct': document.getElementById('color-direct').value, 22 | 'color-fixed_servers': document.getElementById('color-fixed_servers').value, 23 | 'color-pac_script_url': document.getElementById('color-pac_script_url').value, 24 | 'color-pac_script_data': document.getElementById('color-pac_script_data').value, 25 | 'color-system': document.getElementById('color-system').value 26 | }, () => { 27 | toast.textContent = 'Options saved.'; 28 | chrome.runtime.getBackgroundPage(bg => bg.chrome.proxy.settings.get({}, bg.icon)); 29 | setTimeout(() => toast.textContent = '', 750); 30 | }); 31 | if (document.getElementById('counter').checked) { 32 | chrome.permissions.request({ 33 | permissions: ['webRequest'], 34 | origins: ['*://*/*'] 35 | }, granted => { 36 | if (granted) { 37 | perform(); 38 | } 39 | else { 40 | document.getElementById('counter').checked = false; 41 | perform(); 42 | } 43 | }); 44 | } 45 | else { 46 | perform(); 47 | } 48 | } 49 | 50 | const storage = prefs => new Promise(resolve => chrome.storage.managed.get(prefs, ps => { 51 | chrome.storage.local.get(chrome.runtime.lastError ? prefs : ps || prefs, resolve); 52 | })); 53 | 54 | 55 | function restore() { 56 | storage({ 57 | 'text': false, 58 | 'counter': false, 59 | 'color': '#666666', 60 | 'server': 'https://api.getproxylist.com/proxy', 61 | 'validate-mode': 'direct', 62 | 'anonymity': '', 63 | 'allowsRefererHeader': '', 64 | 'allowsUserAgentHeader': '', 65 | 'allowsCustomHeaders': '', 66 | 'allowsCookies': '', 67 | 'country': '', 68 | 'faqs': true, 69 | 'startup-proxy': 'no', 70 | 'color-auto_detect': '#2124fc', 71 | 'color-direct': '#000', 72 | 'color-fixed_servers': '#fd0e1c', 73 | 'color-pac_script_url': '#fb9426', 74 | 'color-pac_script_data': '#fb9426', 75 | 'color-system': '#31736b' 76 | }).then(prefs => { 77 | Object.entries(prefs).forEach(([key, value]) => { 78 | document.getElementById(key)[typeof value === 'boolean' ? 'checked' : 'value'] = value; 79 | }); 80 | }); 81 | } 82 | 83 | document.addEventListener('DOMContentLoaded', restore); 84 | document.getElementById('save').addEventListener('click', save); 85 | 86 | document.getElementById('export').addEventListener('click', () => { 87 | chrome.storage.local.get(null, prefs => { 88 | const text = JSON.stringify(prefs, null, '\t'); 89 | const blob = new Blob([text], {type: 'application/json'}); 90 | const objectURL = URL.createObjectURL(blob); 91 | Object.assign(document.createElement('a'), { 92 | href: objectURL, 93 | type: 'application/json', 94 | download: 'proxy-switcher-preferences.json' 95 | }).dispatchEvent(new MouseEvent('click')); 96 | setTimeout(() => URL.revokeObjectURL(objectURL)); 97 | }); 98 | }); 99 | document.getElementById('import').addEventListener('click', () => { 100 | const fileInput = document.createElement('input'); 101 | fileInput.style.display = 'none'; 102 | fileInput.type = 'file'; 103 | fileInput.accept = '.json'; 104 | fileInput.acceptCharset = 'utf-8'; 105 | 106 | document.body.appendChild(fileInput); 107 | fileInput.initialValue = fileInput.value; 108 | fileInput.onchange = readFile; 109 | fileInput.click(); 110 | 111 | function readFile() { 112 | if (fileInput.value !== fileInput.initialValue) { 113 | const file = fileInput.files[0]; 114 | if (file.size > 100e6) { 115 | console.warn('100MB backup? I don\'t believe you.'); 116 | return; 117 | } 118 | const fReader = new FileReader(); 119 | fReader.onloadend = event => { 120 | fileInput.remove(); 121 | const json = JSON.parse(event.target.result); 122 | chrome.storage.local.set(json, () => chrome.runtime.reload()); 123 | }; 124 | fReader.readAsText(file, 'utf-8'); 125 | } 126 | } 127 | }); 128 | 129 | // reset 130 | document.getElementById('reset').addEventListener('click', e => { 131 | if (e.detail === 1) { 132 | toast.textContent = 'Double-click to reset!'; 133 | window.setTimeout(() => toast.textContent = '', 750); 134 | } 135 | else { 136 | localStorage.clear(); 137 | chrome.storage.local.clear(() => { 138 | chrome.runtime.reload(); 139 | window.close(); 140 | }); 141 | } 142 | }); 143 | // support 144 | document.getElementById('support').addEventListener('click', () => chrome.tabs.create({ 145 | url: chrome.runtime.getManifest().homepage_url + '?rd=donate' 146 | })); 147 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/assets/README: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/adzialocha/random-animal-name-generator/master/animals.json 2 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/components/editor-view/README: -------------------------------------------------------------------------------- 1 | https://github.com/ajaxorg/ace-builds/releases/tag/v1.4.12 2 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/components/editor-view/ace-builds-1.4.12/src/snippets/javascript.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/javascript",["require","exports","module"], function(require, exports, module) { 2 | "use strict"; 3 | 4 | exports.snippetText = "# Prototype\n\ 5 | snippet proto\n\ 6 | ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n\ 7 | ${4:// body...}\n\ 8 | };\n\ 9 | # Function\n\ 10 | snippet fun\n\ 11 | function ${1?:function_name}(${2:argument}) {\n\ 12 | ${3:// body...}\n\ 13 | }\n\ 14 | # Anonymous Function\n\ 15 | regex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\n\ 16 | snippet f\n\ 17 | function${M1?: ${1:functionName}}($2) {\n\ 18 | ${0:$TM_SELECTED_TEXT}\n\ 19 | }${M2?;}${M3?,}${M4?)}\n\ 20 | # Immediate function\n\ 21 | trigger \\(?f\\(\n\ 22 | endTrigger \\)?\n\ 23 | snippet f(\n\ 24 | (function(${1}) {\n\ 25 | ${0:${TM_SELECTED_TEXT:/* code */}}\n\ 26 | }(${1}));\n\ 27 | # if\n\ 28 | snippet if\n\ 29 | if (${1:true}) {\n\ 30 | ${0}\n\ 31 | }\n\ 32 | # if ... else\n\ 33 | snippet ife\n\ 34 | if (${1:true}) {\n\ 35 | ${2}\n\ 36 | } else {\n\ 37 | ${0}\n\ 38 | }\n\ 39 | # tertiary conditional\n\ 40 | snippet ter\n\ 41 | ${1:/* condition */} ? ${2:a} : ${3:b}\n\ 42 | # switch\n\ 43 | snippet switch\n\ 44 | switch (${1:expression}) {\n\ 45 | case '${3:case}':\n\ 46 | ${4:// code}\n\ 47 | break;\n\ 48 | ${5}\n\ 49 | default:\n\ 50 | ${2:// code}\n\ 51 | }\n\ 52 | # case\n\ 53 | snippet case\n\ 54 | case '${1:case}':\n\ 55 | ${2:// code}\n\ 56 | break;\n\ 57 | ${3}\n\ 58 | \n\ 59 | # while (...) {...}\n\ 60 | snippet wh\n\ 61 | while (${1:/* condition */}) {\n\ 62 | ${0:/* code */}\n\ 63 | }\n\ 64 | # try\n\ 65 | snippet try\n\ 66 | try {\n\ 67 | ${0:/* code */}\n\ 68 | } catch (e) {}\n\ 69 | # do...while\n\ 70 | snippet do\n\ 71 | do {\n\ 72 | ${2:/* code */}\n\ 73 | } while (${1:/* condition */});\n\ 74 | # Object Method\n\ 75 | snippet :f\n\ 76 | regex /([,{[])|^\\s*/:f/\n\ 77 | ${1:method_name}: function(${2:attribute}) {\n\ 78 | ${0}\n\ 79 | }${3:,}\n\ 80 | # setTimeout function\n\ 81 | snippet setTimeout\n\ 82 | regex /\\b/st|timeout|setTimeo?u?t?/\n\ 83 | setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n\ 84 | # Get Elements\n\ 85 | snippet gett\n\ 86 | getElementsBy${1:TagName}('${2}')${3}\n\ 87 | # Get Element\n\ 88 | snippet get\n\ 89 | getElementBy${1:Id}('${2}')${3}\n\ 90 | # console.log (Firebug)\n\ 91 | snippet cl\n\ 92 | console.log(${1});\n\ 93 | # return\n\ 94 | snippet ret\n\ 95 | return ${1:result}\n\ 96 | # for (property in object ) { ... }\n\ 97 | snippet fori\n\ 98 | for (var ${1:prop} in ${2:Things}) {\n\ 99 | ${0:$2[$1]}\n\ 100 | }\n\ 101 | # hasOwnProperty\n\ 102 | snippet has\n\ 103 | hasOwnProperty(${1})\n\ 104 | # docstring\n\ 105 | snippet /**\n\ 106 | /**\n\ 107 | * ${1:description}\n\ 108 | *\n\ 109 | */\n\ 110 | snippet @par\n\ 111 | regex /^\\s*\\*\\s*/@(para?m?)?/\n\ 112 | @param {${1:type}} ${2:name} ${3:description}\n\ 113 | snippet @ret\n\ 114 | @return {${1:type}} ${2:description}\n\ 115 | # JSON.parse\n\ 116 | snippet jsonp\n\ 117 | JSON.parse(${1:jstr});\n\ 118 | # JSON.stringify\n\ 119 | snippet jsons\n\ 120 | JSON.stringify(${1:object});\n\ 121 | # self-defining function\n\ 122 | snippet sdf\n\ 123 | var ${1:function_name} = function(${2:argument}) {\n\ 124 | ${3:// initial code ...}\n\ 125 | \n\ 126 | $1 = function($2) {\n\ 127 | ${4:// main code}\n\ 128 | };\n\ 129 | }\n\ 130 | # singleton\n\ 131 | snippet sing\n\ 132 | function ${1:Singleton} (${2:argument}) {\n\ 133 | // the cached instance\n\ 134 | var instance;\n\ 135 | \n\ 136 | // rewrite the constructor\n\ 137 | $1 = function $1($2) {\n\ 138 | return instance;\n\ 139 | };\n\ 140 | \n\ 141 | // carry over the prototype properties\n\ 142 | $1.prototype = this;\n\ 143 | \n\ 144 | // the instance\n\ 145 | instance = new $1();\n\ 146 | \n\ 147 | // reset the constructor pointer\n\ 148 | instance.constructor = $1;\n\ 149 | \n\ 150 | ${3:// code ...}\n\ 151 | \n\ 152 | return instance;\n\ 153 | }\n\ 154 | # class\n\ 155 | snippet class\n\ 156 | regex /^\\s*/clas{0,2}/\n\ 157 | var ${1:class} = function(${20}) {\n\ 158 | $40$0\n\ 159 | };\n\ 160 | \n\ 161 | (function() {\n\ 162 | ${60:this.prop = \"\"}\n\ 163 | }).call(${1:class}.prototype);\n\ 164 | \n\ 165 | exports.${1:class} = ${1:class};\n\ 166 | # \n\ 167 | snippet for-\n\ 168 | for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n\ 169 | ${0:${2:Things}[${1:i}];}\n\ 170 | }\n\ 171 | # for (...) {...}\n\ 172 | snippet for\n\ 173 | for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n\ 174 | ${3:$2[$1]}$0\n\ 175 | }\n\ 176 | # for (...) {...} (Improved Native For-Loop)\n\ 177 | snippet forr\n\ 178 | for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n\ 179 | ${3:$2[$1]}$0\n\ 180 | }\n\ 181 | \n\ 182 | \n\ 183 | #modules\n\ 184 | snippet def\n\ 185 | define(function(require, exports, module) {\n\ 186 | \"use strict\";\n\ 187 | var ${1/.*\\///} = require(\"${1}\");\n\ 188 | \n\ 189 | $TM_SELECTED_TEXT\n\ 190 | });\n\ 191 | snippet req\n\ 192 | guard ^\\s*\n\ 193 | var ${1/.*\\///} = require(\"${1}\");\n\ 194 | $0\n\ 195 | snippet requ\n\ 196 | guard ^\\s*\n\ 197 | var ${1/.*\\/(.)/\\u$1/} = require(\"${1}\").${1/.*\\/(.)/\\u$1/};\n\ 198 | $0\n\ 199 | "; 200 | exports.scope = "javascript"; 201 | 202 | }); (function() { 203 | window.require(["ace/snippets/javascript"], function(m) { 204 | if (typeof module == "object" && typeof exports == "object" && module) { 205 | module.exports = m; 206 | } 207 | }); 208 | })(); 209 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/components/editor-view/core.js: -------------------------------------------------------------------------------- 1 | import './ace-builds-1.4.12/src/ace.js'; 2 | import './ace-builds-1.4.12/src/ext-language_tools.js'; 3 | 4 | class EditorView extends HTMLElement { 5 | constructor() { 6 | super(); 7 | 8 | const shadow = this.attachShadow({mode: 'open'}); 9 | shadow.innerHTML = ` 10 | 21 |
22 |
23 |
24 | `; 25 | 26 | ace.config.set('basePath', (new URL(import.meta.url + '/../ace-builds-1.4.12/src/')).href); 27 | ace.require('ace/ext/language_tools'); 28 | 29 | const editor = this.editor = ace.edit(shadow.getElementById('editor'), { 30 | mode: 'ace/mode/javascript', 31 | autoScrollEditorIntoView: true, 32 | highlightActiveLine: false, 33 | maxLines: 100, 34 | value: '\n', 35 | keyboardHandler: 'ace/keyboard/sublime', 36 | enableBasicAutocompletion: true, 37 | enableSnippets: true, 38 | enableLiveAutocompletion: false, 39 | useWorker: false 40 | }); 41 | editor.renderer.attachToShadowRoot(); 42 | let lastCursor = {}; 43 | this.addEventListener('keyup', e => { 44 | const cursor = this.cursor; 45 | if (cursor.row === lastCursor.row && cursor.column === lastCursor.column) { 46 | if (e.code === 'ArrowUp') { 47 | this.dispatchEvent(new Event('hit-start')); 48 | } 49 | else if (e.code === 'ArrowDown') { 50 | this.dispatchEvent(new Event('hit-end')); 51 | } 52 | } 53 | lastCursor = cursor; 54 | }); 55 | // auto complete 56 | editor.on('change', () => { 57 | const cursor = this.cursor; 58 | const token = editor.session.getTokenAt(cursor.row, cursor.column); 59 | if (token && token.value.length >= 2 && token.type === 'identifier') { 60 | editor.execCommand('startAutocomplete'); 61 | } 62 | }); 63 | } 64 | get value() { 65 | return this.editor.getValue(); 66 | } 67 | set value(v) { 68 | // move cursor to end 69 | this.editor.setValue(v, 1); 70 | } 71 | get cursor() { 72 | return this.editor.getCursorPosition(); 73 | } 74 | } 75 | window.customElements.define('editor-view', EditorView); 76 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/components/editor-view/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/components/manual-view-search.js: -------------------------------------------------------------------------------- 1 | /* globals app */ 2 | 3 | const search = {}; 4 | 5 | search.fetch = (base, args = {}) => { 6 | Object.assign(args, { 7 | allowsPost: true, // Supports POST requests 8 | allowsHttps: true // Supports HTTPS requests 9 | }); 10 | return fetch(base + '?' + Object.entries(args).map(([k, v]) => `${k}=${v}`).join('&')).then(r => r.json().then(j => { 11 | if (r.ok) { 12 | return j; 13 | } 14 | return Promise.reject(j.status_message || j.error || 'unknown error'); 15 | })); 16 | }; 17 | 18 | search.convert = json => { 19 | const {ip, port, protocol, country, anonymity, downloadSpeed} = json; 20 | const proxy = { 21 | host: ip, 22 | port: Number(port), 23 | scheme: protocol 24 | }; 25 | return { 26 | info: {ip, port, protocol, country, anonymity, downloadSpeed}, 27 | proxy: { 28 | value: { 29 | mode: 'fixed_servers', 30 | rules: { 31 | proxyForFtp: proxy, 32 | proxyForHttp: proxy, 33 | proxyForHttps: proxy 34 | } 35 | } 36 | } 37 | }; 38 | }; 39 | 40 | search.ping = href => new Promise((resolve, reject) => { 41 | const timer = setTimeout(reject, 5000, 'timeout'); 42 | fetch(href, { 43 | method: 'HEAD' 44 | }).then(resolve, reject).finally(() => clearTimeout(timer)); 45 | }); 46 | search.verify = proxy => new Promise((resolve, reject) => chrome.proxy.settings.set(proxy, () => { 47 | Promise.all([ 48 | search.ping('https://raw.githubusercontent.com/rNeomy/proxy-switcher/master/LICENSE').then(resolve, () => false), 49 | search.ping('https://raw.githubusercontent.com/rNeomy/proxy-switcher/master/README.md').then(resolve, () => false) 50 | ]).then(() => reject(Error('Ping failed'))); 51 | })); 52 | 53 | search.attach = (button, msg, done) => { 54 | const log = s => msg.textContent = (new Date()).toTimeString().split(' ')[0] + ': ' + s; 55 | 56 | button.addEventListener('click', () => { 57 | button.disabled = true; 58 | // store proxy setting 59 | const set = mode => { 60 | if (mode === 'fixed_servers') { 61 | return Promise.resolve(); 62 | } 63 | return new Promise(resolve => chrome.proxy.settings.set({ // clear proxy 64 | value: {mode} 65 | }, resolve)); 66 | }; 67 | 68 | chrome.proxy.settings.get({}, ({value}) => { 69 | app.storage({ 70 | // 'server': 'https://gimmeproxy.com/api/getProxy', 71 | 'server': 'https://api.getproxylist.com/proxy', 72 | 'validate-mode': 'direct', 73 | 'anonymity': '', 74 | 'allowsRefererHeader': '', 75 | 'allowsUserAgentHeader': '', 76 | 'allowsCustomHeaders': '', 77 | 'allowsCookies': '', 78 | 'country': '' 79 | }).then(prefs => { 80 | chrome.permissions.request({ 81 | origins: [prefs.server] 82 | }, async granted => { 83 | if (granted === false) { 84 | return log('Cannot connect to the server'); 85 | } 86 | await set(prefs['validate-mode']); 87 | Object.entries(prefs).forEach(([key, value]) => { 88 | if (!value) { 89 | delete prefs[key]; 90 | } 91 | }); 92 | try { 93 | log('Searching for a server ...'); 94 | const json = await search.fetch(prefs.server, prefs); 95 | const {proxy, info} = search.convert(json); 96 | log(`Validating ${info.ip}:${info.port}`); 97 | done(proxy, 'new proxy from ' + ({ 98 | BR: 'Brazil', 99 | US: 'United States', 100 | ID: 'Indonesia', 101 | CN: 'China', 102 | RU: 'Russia', 103 | BD: 'Bangladesh', 104 | IN: 'India', 105 | TH: 'Thailand', 106 | UA: 'Ukraine', 107 | SG: 'Singapore', 108 | ES: 'Spain' 109 | }[info.country] || info.country)); 110 | await search.verify(proxy).then(() => log('Looks good!'), () => log('Cannot verify this proxy!')); 111 | } 112 | catch (e) { 113 | log(e.message || e || 'Error!'); 114 | chrome.proxy.settings.set({value}); 115 | } 116 | button.disabled = false; 117 | }); 118 | }); 119 | }); 120 | }); 121 | } 122 | 123 | export {search}; 124 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/firefox-proxy.js: -------------------------------------------------------------------------------- 1 | /* globals browser */ 2 | 'use strict'; 3 | 4 | if (/Firefox/.test(navigator.userAgent)) { 5 | chrome.proxy = { 6 | callbacks: [], 7 | errors: [], 8 | settings: {} 9 | }; 10 | chrome.storage.onChanged.addListener(ps => { 11 | if (ps['ffcurent']) { 12 | if (JSON.stringify(ps['ffcurent'].newValue) !== JSON.stringify(ps['ffcurent'].oldValue)) { 13 | chrome.proxy.callbacks.forEach(c => c(ps['ffcurent'].newValue)); 14 | } 15 | } 16 | }); 17 | 18 | chrome.proxy.onProxyError = { 19 | addListener: c => chrome.proxy.errors.push(c) 20 | }; 21 | 22 | chrome.proxy.settings.onChange = { 23 | addListener: c => chrome.proxy.callbacks.push(c) 24 | }; 25 | 26 | chrome.proxy.convert = { 27 | toFF: ({value}) => { 28 | const mode = value.mode; 29 | const settings = { 30 | proxyType: { 31 | 'direct': 'none', 32 | 'system': 'system', 33 | 'auto_detect': 'autoDetect', 34 | 'fixed_servers': 'manual', 35 | 'pac_script': 'autoConfig' 36 | }[mode], 37 | autoConfigUrl: mode === 'pac_script' ? value.pacScript.url : '', 38 | socksVersion: 4, 39 | proxyDNS: value.remoteDNS, 40 | autoLogin: value.noPrompt, 41 | passthrough: mode === 'fixed_servers' && value.rules.bypassList && value.rules.bypassList.length ? value.rules.bypassList.join(', ') : '' 42 | }; 43 | 44 | if (mode === 'fixed_servers') { 45 | const rules = value.rules; 46 | const rule = rules.proxyForHttp || rules.proxyForHttps || rules.proxyForFtp || rules.fallbackProxy; 47 | if (rule.scheme === 'socks5') { 48 | settings.socksVersion = 5; 49 | } 50 | const url = ({host, port, scheme} = {}) => { 51 | if (host && port) { 52 | return (scheme === 'https' ? 'https://' : '') + (host.trim().replace(/.*:\/\//, '') + ':' + port); 53 | } 54 | else { 55 | return ''; 56 | } 57 | }; 58 | 59 | if (rule.scheme.startsWith('socks')) { 60 | settings.http = settings.ssl = settings.ftp = ''; 61 | settings.socks = url(rule); 62 | } 63 | else { 64 | settings.ftp = url(rules.proxyForFtp); 65 | settings.http = url(rules.proxyForHttp); 66 | settings.ssl = url(rules.proxyForHttps); 67 | } 68 | } 69 | return { 70 | value: settings 71 | }; 72 | }, 73 | fromFF: ({value}) => { 74 | const config = { 75 | value: { 76 | remoteDNS: value.proxyDNS, 77 | noPrompt: value.autoLogin 78 | } 79 | }; 80 | config.value.mode = { 81 | 'none': 'direct', 82 | 'system': 'system', 83 | 'autoDetect': 'auto_detect', 84 | 'manual': 'fixed_servers', 85 | 'autoConfig': 'pac_script' 86 | }[value.proxyType]; 87 | 88 | if (value.proxyType === 'autoConfig' || value.proxyType === 'manual') { 89 | config.value.rules = {}; 90 | } 91 | if (value.proxyType === 'autoConfig') { 92 | config.value.pacScript = { 93 | url: value.autoConfigUrl 94 | }; 95 | } 96 | else if (value.proxyType === 'manual') { 97 | config.value.rules.bypassList = value.passthrough ? value.passthrough.split(', ') : []; 98 | const type = url => { 99 | if (value.socks) { 100 | return 'socks' + value.socksVersion; 101 | } 102 | else { 103 | return url.startsWith('https://') ? 'https' : 'http'; 104 | } 105 | }; 106 | const parse = url => { 107 | const scheme = type(url); 108 | const [host, port] = url.split('://')[0].split(':'); 109 | return {scheme, host, port: Number(port)}; 110 | }; 111 | config.value.rules.proxyForFtp = parse(value.ftp || value.socks); 112 | config.value.rules.proxyForHttp = parse(value.http || value.socks); 113 | config.value.rules.proxyForHttps = parse(value.ssl || value.socks); 114 | } 115 | return config; 116 | } 117 | }; 118 | 119 | chrome.proxy.settings.get = (prop, callback) => browser.proxy.settings.get({}) 120 | .then(settings => callback(chrome.proxy.convert.fromFF(settings))); 121 | 122 | chrome.proxy.settings.set = async (config, callback = function() {}) => { 123 | const settings = chrome.proxy.convert.toFF(config); 124 | // console.log(settings); 125 | await browser.proxy.settings.clear({}); 126 | browser.proxy.settings.set(settings, () => { 127 | const lastError = chrome.runtime.lastError; 128 | if (chrome.runtime.lastError) { 129 | chrome.proxy.errors.forEach(c => c(lastError)); 130 | } 131 | }); 132 | 133 | await browser.storage.local.set({ 134 | 'ffcurent': { 135 | value: config.value 136 | } 137 | }); 138 | callback(); 139 | }; 140 | } 141 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/images/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/images/no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/images/ok.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/images/reload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font: 400 13px/24px Roboto,sans-serif; 3 | background-color: #eee; 4 | display: flex; 5 | flex-direction: column; 6 | padding: 0; 7 | margin: 0; 8 | font-size: 12px; 9 | width: 600px; 10 | } 11 | h1 { 12 | color: #4877cb; 13 | font-size: 28px; 14 | font-weight: normal; 15 | display: inline-block; 16 | padding-right: 10px; 17 | } 18 | a { 19 | outline: none; 20 | } 21 | #toolbar { 22 | margin: 0 10px; 23 | overflow: hidden; 24 | text-overflow: ellipsis; 25 | white-space: nowrap; 26 | } 27 | #toolbar span { 28 | color: #a0a0a0; 29 | text-shadow: 1px 1px #fcffff; 30 | float: right; 31 | } 32 | 33 | #tabs { 34 | list-style-type: none; 35 | margin: 0; 36 | padding: 0; 37 | position: relative; 38 | } 39 | #tabs li { 40 | display: inline-block; 41 | padding: 0 10px; 42 | text-align: center; 43 | background-color: #6e98e3; 44 | color: #fff; 45 | height: 36px; 46 | line-height: 32px; 47 | transform: translate(0, 4px); 48 | cursor: pointer; 49 | border-top: 3px solid transparent; 50 | min-width: 80px; 51 | } 52 | body[data-ready=true] #tabs li { 53 | transition: all ease 200ms; 54 | } 55 | 56 | #tabs li.no-proxy { 57 | border-top-color: #000; 58 | } 59 | #tabs li.auto-proxy { 60 | border-top-color: #2124fc; 61 | } 62 | #tabs li.system-proxy { 63 | border-top-color: #31736b; 64 | } 65 | #tabs li.manual-proxy { 66 | border-top-color: #fd0e1c; 67 | } 68 | #tabs li.pac-proxy { 69 | border-top-color: #fb9426; 70 | } 71 | #tabs input:checked ~ li { 72 | background-color: #fff; 73 | color: #000; 74 | box-shadow: 3px 3px 6px 0 rgba(0, 0, 0, .3); 75 | transform: translate(0, 0); 76 | } 77 | #tabs input[type=radio] { 78 | display: none; 79 | } 80 | #tabs li:hover { 81 | transform: translate(0, 0); 82 | } 83 | #tabs>div { 84 | position: absolute; 85 | right: 10px; 86 | top: 0; 87 | display: flex; 88 | height: 100%; 89 | display: flex; 90 | align-items: center; 91 | } 92 | #tabs>div input { 93 | border: none; 94 | background-color: #fd0f1b; 95 | color: #ffdcdc; 96 | text-indent: 0; 97 | cursor: pointer; 98 | padding: 3px 5px; 99 | font-size: 12px; 100 | } 101 | #tabs>div input:active { 102 | background-color: #b5b5b5; 103 | } 104 | 105 | #tools { 106 | height: 60px; 107 | display: flex; 108 | align-items: center; 109 | justify-content: center; 110 | } 111 | #tools a { 112 | margin: 0 5px; 113 | text-decoration: none; 114 | color: #000; 115 | } 116 | #others { 117 | display: flex; 118 | align-items: center; 119 | justify-content: center; 120 | } 121 | #notify { 122 | position: fixed; 123 | top: 10px; 124 | right: 10px; 125 | z-index: 3; 126 | max-width: 50vw; 127 | max-height: 30vh; 128 | overflow: hidden; 129 | } 130 | #notify>div { 131 | background-color: #fcf7df; 132 | border: solid 1px #f9e8c5; 133 | color: #7f6256; 134 | padding: 10px; 135 | margin: 2px 0; 136 | overflow: hidden; 137 | text-overflow: ellipsis; 138 | white-space: nowrap; 139 | } 140 | .body { 141 | background-color: #fff; 142 | width: calc(100% - 20px); 143 | flex: 1; 144 | z-index: 2; 145 | padding: 10px; 146 | min-height: 100px; 147 | } 148 | .modify input { 149 | display: inline-block; 150 | width: 40px; 151 | margin-left: -1px; 152 | background-position: center center; 153 | background-repeat: no-repeat; 154 | border-width: 1px; 155 | border-style: solid; 156 | color: #fff; 157 | cursor: pointer; 158 | } 159 | .modify input:hover { 160 | opacity: 0.9; 161 | } 162 | .modify input:first-of-type { 163 | background-image: url(no.svg); 164 | background-size: 22px; 165 | background-color: #eea345; 166 | border-color: #ec9730; 167 | } 168 | .modify input:last-of-type { 169 | background-size: 13px; 170 | background-image: url(ok.svg); 171 | background-color: #52af52; 172 | border-color: #43a443; 173 | } 174 | .flex { 175 | display: flex; 176 | } 177 | .vbox { 178 | flex-direction: column; 179 | } 180 | .nowrap { 181 | white-space: nowrap; 182 | } 183 | .wide { 184 | flex: 1; 185 | } 186 | .hide { 187 | display: none !important; 188 | } 189 | .disabled { 190 | opacity: 0.5; 191 | pointer-events: none; 192 | } 193 | [firefox] { 194 | display: none; 195 | } 196 | button:disabled, 197 | input[type=button]:disabled { 198 | background-color: #ddd; 199 | border-color: #c5c5c5; 200 | opacity: 1.0; 201 | } 202 | #private { 203 | background-color: rgba(0, 0, 0, 0.8); 204 | color: #fff; 205 | position: absolute; 206 | top: 0; 207 | left: 0; 208 | width: 100vw; 209 | height: 100vh; 210 | display: flex; 211 | align-items: center; 212 | justify-content: center; 213 | z-index: 100; 214 | padding: 30px; 215 | box-sizing: border-box; 216 | } 217 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |

Proxy Switcher

11 |
12 | 37 | 38 | 39 | 40 |
Nothing to Configure!
41 |
42 | Check IP ● 43 | FAQs Page ● 44 | Options Page 45 |
46 |
47 |
Enable the extension on private mode; "about:addons" -> Proxy Switcher and Manager -> Run in Private Windows
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/toolbar.js: -------------------------------------------------------------------------------- 1 | /* globals app */ 2 | 'use strict'; 3 | 4 | (function() { 5 | let tabId; 6 | 7 | document.addEventListener('click', ({target}) => { 8 | const cmd = target.dataset.cmd; 9 | if (cmd === 'open-failed-resources') { 10 | chrome.tabs.create({ 11 | url: chrome.runtime.getURL('data/log/index.html?id=' + tabId) 12 | }); 13 | } 14 | }); 15 | chrome.tabs.query({ 16 | active: true, 17 | currentWindow: true 18 | }, tabs => { 19 | if (tabs.length) { 20 | tabId = tabs[0].id; 21 | chrome.runtime.sendMessage({ 22 | cmd: 'fails', 23 | tabId 24 | }, a => { 25 | if (a && a.length) { 26 | document.querySelector('#tabs>div input').classList.remove('hide'); 27 | } 28 | }); 29 | } 30 | }); 31 | })(); 32 | 33 | app.on('update-description', desc => Object.assign(document.querySelector('#toolbar span'), { 34 | title: desc, 35 | textContent: desc 36 | })); 37 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/ui.js: -------------------------------------------------------------------------------- 1 | /* globals app */ 2 | 'use strict'; 3 | 4 | // colors 5 | app.storage({ 6 | 'color-auto_detect': '#2124fc', 7 | 'color-direct': '#000', 8 | 'color-fixed_servers': '#fd0e1c', 9 | 'color-pac_script_url': '#fb9426', 10 | 'color-pac_script_data': '#fb9426', 11 | 'color-system': '#31736b' 12 | }).then(prefs => { 13 | document.querySelector('#tabs li.no-proxy').style['border-top-color'] = prefs['color-direct']; 14 | document.querySelector('#tabs li.auto-proxy').style['border-top-color'] = prefs['color-auto_detect']; 15 | document.querySelector('#tabs li.system-proxy').style['border-top-color'] = prefs['color-system']; 16 | document.querySelector('#tabs li.manual-proxy').style['border-top-color'] = prefs['color-fixed_servers']; 17 | document.querySelector('#tabs li.pac-proxy').style['border-top-color'] = prefs['color-pac_script_url']; 18 | }); 19 | 20 | const click = ({target, isTrusted}) => { 21 | // select radio buttons on focus 22 | const id = target.getAttribute('for'); 23 | if (id) { 24 | const elem = document.getElementById(id); 25 | elem.checked = true; 26 | if (elem.dataset.mode) { 27 | app.emit('change-proxy', elem.dataset.mode); 28 | } 29 | } 30 | // change proxy type 31 | const mode = target.dataset.mode; 32 | if (mode && isTrusted) { 33 | app.emit('change-proxy', mode); 34 | } 35 | }; 36 | document.addEventListener('click', click); 37 | 38 | app.on('proxy-changed', mode => { 39 | const tab = document.querySelector(`#tabs [data-mode="${mode}"]`); 40 | const open = tab.dataset.open; 41 | 42 | if (open) { 43 | const body = document.getElementById(open); 44 | [...document.querySelectorAll('.body')].filter(b => b !== body) 45 | .forEach(b => b.classList.add('hide')); 46 | body.classList.remove('hide'); 47 | tab.click(); 48 | } 49 | }); 50 | 51 | app.on('notify', msg => { 52 | const n = document.getElementById('notify'); 53 | msg = msg.error || msg.message || msg; 54 | const div = document.createElement('div'); 55 | div.textContent = (new Date()).toTimeString().split(' ')[0] + ': ' + msg; 56 | n.textContent = ''; 57 | n.appendChild(div); 58 | div.scrollIntoView(); 59 | window.setTimeout(() => div.remove(), 5000); 60 | }); 61 | 62 | document.getElementById('options').onclick = () => chrome.runtime.openOptionsPage(); 63 | document.addEventListener('keydown', e => { 64 | const meta = e.ctrlKey || e.metaKey; 65 | if (meta) { 66 | if (e.code === 'Digit1' || e.code === 'Digit2' || e.code === 'Digit3' || e.code === 'Digit4' || e.code === 'Digit5') { 67 | e.preventDefault(); 68 | click({ 69 | target: document.querySelector(`#tabs label:nth-child(${e.key}) li`), 70 | isTrusted: true 71 | }); 72 | } 73 | } 74 | }); 75 | 76 | if (/Firefox/.test(navigator.userAgent)) { 77 | chrome.extension.isAllowedIncognitoAccess(result => { 78 | if (!result) { 79 | document.getElementById('private').classList.remove('hide'); 80 | } 81 | }); 82 | } 83 | -------------------------------------------------------------------------------- /v2/firefox/data/panel/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const isFirefox = /Firefox/.test(navigator.userAgent); 4 | const app = {}; 5 | 6 | app.storage = prefs => new Promise(resolve => chrome.storage.local.get(prefs, resolve)); 7 | 8 | app.callbacks = { 9 | on: {}, 10 | once: {} 11 | }; 12 | app.onces = {}; 13 | 14 | app.on = (id, callback) => { 15 | app.callbacks.on[id] = app.callbacks.on[id] || []; 16 | app.callbacks.on[id].push(callback); 17 | }; 18 | 19 | app.once = (id, callback) => { 20 | app.callbacks.once[id] = app.callbacks.once[id] || []; 21 | app.callbacks.once[id].push(callback); 22 | }; 23 | app.emit = (id, value) => { 24 | (app.callbacks.on[id] || []).forEach(c => c(value)); 25 | (app.callbacks.once[id] || []).forEach(c => c(value)); 26 | app.callbacks.once[id] = []; 27 | }; 28 | 29 | app.notify = (e, callback) => chrome.notifications.create({ 30 | type: 'basic', 31 | iconUrl: '/data/icons/48.png', 32 | title: chrome.runtime.getManifest().name, 33 | message: e.message || e 34 | }, callback); 35 | 36 | app.compare = (a, b) => { 37 | const ignore = ['remoteDNS', 'noPrompt', 'levelOfControl']; 38 | if (isFirefox) { 39 | ignore.push('fallbackProxy'); 40 | } 41 | let ka = Object.keys(a).filter(s => ignore.indexOf(s) === -1); 42 | let kb = Object.keys(b).filter(s => ignore.indexOf(s) === -1); 43 | 44 | // remove empty array; bypassList = [] 45 | ka = ka.filter(k => (Array.isArray(a[k]) ? a[k].length : true)); 46 | kb = kb.filter(k => (Array.isArray(b[k]) ? b[k].length : true)); 47 | 48 | // remove empty objects; see https://github.com/rNeomy/proxy-switcher/issues/70 49 | ka = ka.filter(k => { 50 | if (typeof a[k] === 'object' && 'host' in a[k] && 'port' in a[k]) { 51 | if (!a[k].host && !a[k].port) { 52 | return false; 53 | } 54 | } 55 | return true; 56 | }); 57 | kb = kb.filter(k => { 58 | if (typeof b[k] === 'object' && 'host' in b[k] && 'port' in b[k]) { 59 | if (!b[k].host && !b[k].port) { 60 | return false; 61 | } 62 | } 63 | return true; 64 | }); 65 | if (ka.length !== kb.length) { 66 | return false; 67 | } 68 | for (const key of ka) { 69 | if (typeof a[key] === 'string' || typeof a[key] === 'boolean' || typeof a[key] === 'number') { 70 | if (a[key] !== b[key]) { 71 | return false; 72 | } 73 | } 74 | else if (Array.isArray(a[key])) { 75 | if (a[key].some(s => b[key].indexOf(s) === -1)) { 76 | return false; 77 | } 78 | } 79 | else { 80 | return app.compare(a[key], b[key]); 81 | } 82 | } 83 | return true; 84 | }; 85 | -------------------------------------------------------------------------------- /v2/firefox/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Proxy Switcher and Manager", 3 | "description": "Manage and switch between multiple proxy types (SOCKS, PAC, and Direct) with profile support", 4 | "version": "0.5.2", 5 | "manifest_version": 2, 6 | "default_locale": "en", 7 | "permissions": [ 8 | "storage", 9 | "notifications", 10 | "proxy" 11 | ], 12 | "optional_permissions": [ 13 | "*://*/*", 14 | "webRequest" 15 | ], 16 | "storage": { 17 | "managed_schema": "schema.json" 18 | }, 19 | "browser_action": { 20 | "default_popup": "data/panel/index.html" 21 | }, 22 | "background": { 23 | "scripts": [ 24 | "data/panel/utils.js", 25 | "data/panel/firefox-proxy.js", 26 | "common.js" 27 | ] 28 | }, 29 | "homepage_url": "https://add0n.com/proxy-switcher.html", 30 | "icons": { 31 | "16": "data/icons/16.png", 32 | "24": "data/icons/24.png", 33 | "32": "data/icons/32.png", 34 | "48": "data/icons/48.png", 35 | "64": "data/icons/64.png", 36 | "128": "data/icons/128.png", 37 | "256": "data/icons/256.png" 38 | }, 39 | "options_ui": { 40 | "page": "data/options/index.html", 41 | "chrome_style": true 42 | }, 43 | "applications": { 44 | "gecko": { 45 | "id": "{e4a12b8a-ab12-449a-b70e-4f54ccaf235e}", 46 | "strict_min_version": "60.0" 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /v2/firefox/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "import-version": { 5 | "title": "The version of the imported index. It will be used to determine whether replacing local storage is required or not. Need to be a non-zero integer.", 6 | "type": "integer" 7 | }, 8 | "import-json": { 9 | "title": "This is the JSON string that overwrites defaults. A user can alter preferences later. Note that if a new version is imported, the user defined preferences will be overwritten.", 10 | "type": "string" 11 | }, 12 | "faqs": { 13 | "title": "Open FAQs page on updates", 14 | "type": "boolean" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /v3/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": { 3 | "message": "Manage and switch between multiple proxy types (SOCKS, PAC, and Direct) with profile support" 4 | }, 5 | "modeDirectMSG": { 6 | "message": "Directly connect to network and bypass system proxy" 7 | }, 8 | "modeAutoMSG": { 9 | "message": "Automatically detect the proxy settings for your network" 10 | }, 11 | "modeSystemMSG": { 12 | "message": "Use system-wide proxy" 13 | }, 14 | "modePACMSG": { 15 | "message": "Proxy is determined from a PAC script" 16 | }, 17 | "modeFixedMSG": { 18 | "message": "Define proxy server for each protocol" 19 | }, 20 | "modeDirect": { 21 | "message": "No Proxy - directly connected to network which bypasses system proxy" 22 | }, 23 | "modeAuto": { 24 | "message": "Auto-Detect - automatically detect the proxy settings for your network" 25 | }, 26 | "modePACD": { 27 | "message": "PAC Script - inline-script mode" 28 | }, 29 | "modePACU": { 30 | "message": "PAC Script - " 31 | }, 32 | "modeFixed": { 33 | "message": "Manual Proxy - proxy server for each scheme (HTTP, HTTPS, and FTP) is defined in the settings page" 34 | }, 35 | "modeSystem": { 36 | "message": "System - use system-wide proxy" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /v3/_locales/nl/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "modeDirectMSG": { 3 | "message": "Direct verbinding maken met netwerk en systeemproxy negeren" 4 | }, 5 | "modeAutoMSG": { 6 | "message": "Proxy-instellingen van netwerk automatisch detecteren" 7 | }, 8 | "modeSystemMSG": { 9 | "message": "Systeemproxy gebruiken" 10 | }, 11 | "modePACMSG": { 12 | "message": "De proxy wordt bepaald op basis van een pac-script" 13 | }, 14 | "modeFixedMSG": { 15 | "message": "Proxyserver per protocol bepalen" 16 | }, 17 | "modeDirect": { 18 | "message": "Geen proxy - direct verbinding maken met netwerk en systeemproxy negeren" 19 | }, 20 | "modeAuto": { 21 | "message": "Automatisch - automatisch de proxy-instellingen detecteren" 22 | }, 23 | "modePACD": { 24 | "message": "PAC-script - ingebouwde scriptmodus" 25 | }, 26 | "modePACU": { 27 | "message": "PAC-script - " 28 | }, 29 | "modeFixed": { 30 | "message": "Handmatig - proxyserver per schema (http, https en ftp) zoals opgegeven in de instellingen" 31 | }, 32 | "modeSystem": { 33 | "message": "Systeem - systeemproxy gebruiken" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /v3/badge.js: -------------------------------------------------------------------------------- 1 | /* badge */ 2 | 3 | const badge = d => { 4 | console.log(d); 5 | }; 6 | 7 | badge.install = () => { 8 | chrome.webRequest.onCompleted.addListener(badge.events.onCompleted, {urls: ['*://*/*']}); 9 | chrome.webRequest.onErrorOccurred.addListener(badge.events.onErrorOccurred, {urls: ['*://*/*']}); 10 | chrome.tabs.onRemoved.addListener(badge.events.onRemoved); 11 | }; 12 | badge.uninstall = () => { 13 | chrome.tabs.query({}, tabs => tabs.forEach(tab => chrome.action.setBadgeText({ 14 | tabId: tab.id, 15 | text: '' 16 | }))); 17 | chrome.tabs.onRemoved.removeListener(badge.events.onRemoved); 18 | if (chrome.webRequest) { 19 | chrome.webRequest.onCompleted.removeListener(badge.events.onCompleted); 20 | chrome.webRequest.onErrorOccurred.removeListener(badge.events.onErrorOccurred); 21 | } 22 | }; 23 | badge.events = { 24 | onCompleted: d => { 25 | const bol = (d.statusCode < 200 || d.statusCode >= 400) && d.statusCode !== 101; 26 | if (bol) { 27 | badge(d); 28 | } 29 | }, 30 | onErrorOccurred: d => { 31 | console.log(d); 32 | if ( 33 | d.error !== 'net::ERR_BLOCKED_BY_CLIENT' && 34 | d.error !== 'NS_ERROR_ABORT' 35 | ) { 36 | badge(d); 37 | } 38 | }, 39 | onRemoved: tabId => chrome.sessions.remove(tabId + '') 40 | }; 41 | 42 | // init 43 | { 44 | const startup = () => chrome.storage.local.get({ 45 | 'counter': false 46 | }, prefs => { 47 | if (prefs.counter) { 48 | badge.install(); 49 | } 50 | }); 51 | chrome.runtime.onInstalled.addListener(startup); 52 | chrome.runtime.onStartup.addListener(startup); 53 | } 54 | 55 | 56 | /* messaging */ 57 | chrome.runtime.onMessage.addListener((request, sender, response) => { 58 | if (request.cmd === 'fails') { 59 | console.log(request); 60 | } 61 | }); 62 | 63 | /* pref changes */ 64 | chrome.storage.onChanged.addListener(ps => { 65 | if (ps.counter) { 66 | badge.uninstall(); 67 | if (ps.counter.newValue) { 68 | badge.install(); 69 | } 70 | } 71 | }); 72 | -------------------------------------------------------------------------------- /v3/data/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/128.png -------------------------------------------------------------------------------- /v3/data/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/16.png -------------------------------------------------------------------------------- /v3/data/icons/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/24.png -------------------------------------------------------------------------------- /v3/data/icons/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/256.png -------------------------------------------------------------------------------- /v3/data/icons/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/32.png -------------------------------------------------------------------------------- /v3/data/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/48.png -------------------------------------------------------------------------------- /v3/data/icons/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rNeomy/proxy-switcher/eb8352838c30acbb44b7995017506538db372e49/v3/data/icons/64.png -------------------------------------------------------------------------------- /v3/data/icons/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /v3/data/log/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Error Logs :: Proxy Switcher 6 | 7 | 8 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
MethodURLStatus LineIP AddressType
58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /v3/data/log/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var tabId = document.location.search.split('id=')[1]; 4 | var tbody = document.querySelector('tbody'); 5 | 6 | if (tabId) { 7 | chrome.runtime.sendMessage({ 8 | cmd: 'fails', 9 | tabId 10 | }, (response) => { 11 | (response || []).forEach (obj => { 12 | let tr = document.createElement('tr'); 13 | let method = document.createElement('td'); 14 | method.textContent = obj.method; 15 | let url = document.createElement('td'); 16 | let a = document.createElement('a'); 17 | a.href = a.title = a.textContent = obj.url; 18 | let statusLine = document.createElement('td'); 19 | statusLine.title = statusLine.textContent = obj.statusLine || obj.error; 20 | let ip = document.createElement('td'); 21 | ip.textContent = obj.ip; 22 | let type = document.createElement('td'); 23 | type.textContent = obj.type; 24 | 25 | tr.appendChild(method); 26 | url.appendChild(a); 27 | tr.appendChild(url); 28 | tr.appendChild(statusLine); 29 | tr.appendChild(ip); 30 | tr.appendChild(type); 31 | tbody.appendChild(tr); 32 | }); 33 | }); 34 | } 35 | -------------------------------------------------------------------------------- /v3/data/options/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 13px; 3 | font-family: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif; 4 | background-color: #fff; 5 | color: #4d5156; 6 | width: min(100% - 2rem, 70rem); 7 | margin-inline: auto; 8 | } 9 | h1 { 10 | text-align: center; 11 | background-color: rgba(0, 0, 0, 0.05); 12 | padding: 10px; 13 | font-size: 100%; 14 | } 15 | select, 16 | button, 17 | input[type=submit], 18 | input[type=button] { 19 | padding: 5px; 20 | color: #444; 21 | background-image: linear-gradient(rgb(237, 237, 237), rgb(237, 237, 237) 38%, rgb(222, 222, 222)); 22 | box-shadow: rgba(0, 0, 0, 0.08) 0 1px 0, rgba(255, 255, 255, 0.75) 0 1px 2px inset; 23 | text-shadow: rgb(240, 240, 240) 0 1px 0; 24 | } 25 | select, 26 | button, 27 | textarea, 28 | input { 29 | border: solid 1px rgba(0, 0, 0, 0.25); 30 | } 31 | input[type=button]:disabled { 32 | opacity: 0.5; 33 | } 34 | textarea { 35 | width: 100%; 36 | box-sizing: border-box; 37 | display: block; 38 | } 39 | textarea, 40 | input[type=text], 41 | input[type=number] { 42 | padding: 5px; 43 | outline: none; 44 | } 45 | textarea:focus, 46 | input[type=text]:focus, 47 | input[type=number]:focus { 48 | background-color: #e5f8ff; 49 | } 50 | a, 51 | a:visited { 52 | color: #07c; 53 | } 54 | hr { 55 | border: none; 56 | border-top: dashed 1px #ccc; 57 | padding: 0; 58 | margin: 0; 59 | } 60 | td:first-child { 61 | text-align: left; 62 | } 63 | td:last-child { 64 | text-align: right; 65 | white-space: nowrap; 66 | } 67 | 68 | p { 69 | display: flex; 70 | gap: 5px; 71 | white-space: nowrap; 72 | flex-flow: wrap; 73 | align-items: center; 74 | } 75 | 76 | .notav { 77 | opacity: 0.5; 78 | pointer-events: none; 79 | } 80 | .two { 81 | display: grid; 82 | grid-template-columns: 1fr min-content; 83 | grid-gap: 10px; 84 | } 85 | .two :nth-child(even) { 86 | justify-self: end; 87 | } 88 | -------------------------------------------------------------------------------- /v3/data/options/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Options Page :: Proxy Switcher and Manager 6 | 7 | 8 | 9 |

Badge

10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |

Color Codes

19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 |

Find a Proxy Server

34 |
35 | 36 | 42 |
43 |

Misc

44 |
45 | 46 | 52 | 53 | 54 |
55 | 56 |

57 | 58 | 59 |

60 | 61 | 62 |

63 | 64 | 65 | 66 | 67 |

68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /v3/data/options/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const toast = document.getElementById('toast'); 4 | 5 | const storage = prefs => new Promise(resolve => chrome.storage.managed.get(prefs, ps => { 6 | chrome.storage.local.get(chrome.runtime.lastError ? prefs : ps || prefs, resolve); 7 | })); 8 | 9 | document.getElementById('save').addEventListener('click', () => { 10 | const perform = () => chrome.storage.local.set({ 11 | 'text': document.getElementById('text').checked, 12 | 'counter': document.getElementById('counter').checked, 13 | 'color': document.getElementById('color').value, 14 | 'validate-mode': document.getElementById('validate-mode').value, 15 | 'faqs': document.getElementById('faqs').checked, 16 | 'startup-proxy': document.getElementById('startup-proxy').value, 17 | 'color-auto_detect': document.getElementById('color-auto_detect').value, 18 | 'color-direct': document.getElementById('color-direct').value, 19 | 'color-fixed_servers': document.getElementById('color-fixed_servers').value, 20 | 'color-pac_script_url': document.getElementById('color-pac_script_url').value, 21 | 'color-pac_script_data': document.getElementById('color-pac_script_data').value, 22 | 'color-system': document.getElementById('color-system').value 23 | }, () => { 24 | toast.textContent = 'Options saved.'; 25 | chrome.runtime.getBackgroundPage(bg => bg.chrome.proxy.settings.get({}, bg.icon)); 26 | setTimeout(() => toast.textContent = '', 750); 27 | }); 28 | perform(); 29 | }); 30 | 31 | document.addEventListener('DOMContentLoaded', () => { 32 | storage({ 33 | 'text': false, 34 | 'counter': false, 35 | 'color': '#666666', 36 | 'validate-mode': 'direct', 37 | 'faqs': true, 38 | 'startup-proxy': 'no', 39 | 'color-auto_detect': '#2124fc', 40 | 'color-direct': '#000', 41 | 'color-fixed_servers': '#fd0e1c', 42 | 'color-pac_script_url': '#fb9426', 43 | 'color-pac_script_data': '#fb9426', 44 | 'color-system': '#31736b' 45 | }).then(prefs => { 46 | Object.entries(prefs).forEach(([key, value]) => { 47 | document.getElementById(key)[typeof value === 'boolean' ? 'checked' : 'value'] = value; 48 | }); 49 | }); 50 | }); 51 | 52 | // export 53 | document.getElementById('export').addEventListener('click', () => { 54 | chrome.storage.local.get(null, prefs => { 55 | const text = JSON.stringify(prefs, null, '\t'); 56 | const blob = new Blob([text], {type: 'application/json'}); 57 | const objectURL = URL.createObjectURL(blob); 58 | Object.assign(document.createElement('a'), { 59 | href: objectURL, 60 | type: 'application/json', 61 | download: 'proxy-switcher-preferences.json' 62 | }).dispatchEvent(new MouseEvent('click')); 63 | setTimeout(() => URL.revokeObjectURL(objectURL)); 64 | }); 65 | }); 66 | 67 | // import 68 | document.getElementById('import').addEventListener('click', () => { 69 | const fileInput = document.createElement('input'); 70 | fileInput.style.display = 'none'; 71 | fileInput.type = 'file'; 72 | fileInput.accept = '.json'; 73 | fileInput.acceptCharset = 'utf-8'; 74 | 75 | document.body.appendChild(fileInput); 76 | fileInput.initialValue = fileInput.value; 77 | fileInput.onchange = readFile; 78 | fileInput.click(); 79 | 80 | function readFile() { 81 | if (fileInput.value !== fileInput.initialValue) { 82 | const file = fileInput.files[0]; 83 | if (file.size > 100e6) { 84 | console.warn('100MB backup? I don\'t believe you.'); 85 | return; 86 | } 87 | const fReader = new FileReader(); 88 | fReader.onloadend = event => { 89 | fileInput.remove(); 90 | const json = JSON.parse(event.target.result); 91 | chrome.storage.local.set(json, () => chrome.runtime.reload()); 92 | }; 93 | fReader.readAsText(file, 'utf-8'); 94 | } 95 | } 96 | }); 97 | 98 | // reset 99 | document.getElementById('reset').addEventListener('click', e => { 100 | if (e.detail === 1) { 101 | toast.textContent = 'Double-click to reset!'; 102 | window.setTimeout(() => toast.textContent = '', 750); 103 | } 104 | else { 105 | localStorage.clear(); 106 | chrome.storage.local.clear(() => { 107 | chrome.runtime.reload(); 108 | window.close(); 109 | }); 110 | } 111 | }); 112 | 113 | // support 114 | document.getElementById('support').addEventListener('click', () => chrome.tabs.create({ 115 | url: chrome.runtime.getManifest().homepage_url + '?rd=donate' 116 | })); 117 | 118 | // links 119 | for (const a of document.querySelectorAll('[data-href]')) { 120 | if (a.hasAttribute('href') === false) { 121 | a.href = chrome.runtime.getManifest().homepage_url + '#' + a.dataset.href; 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /v3/data/panel/assets/README: -------------------------------------------------------------------------------- 1 | https://raw.githubusercontent.com/adzialocha/random-animal-name-generator/master/animals.json 2 | -------------------------------------------------------------------------------- /v3/data/panel/components/editor-view/README: -------------------------------------------------------------------------------- 1 | https://github.com/ajaxorg/ace-builds/releases/tag/v1.4.12 2 | -------------------------------------------------------------------------------- /v3/data/panel/components/editor-view/ace-builds-1.4.12/src/snippets/javascript.js: -------------------------------------------------------------------------------- 1 | define("ace/snippets/javascript",["require","exports","module"], function(require, exports, module) { 2 | "use strict"; 3 | 4 | exports.snippetText = "# Prototype\n\ 5 | snippet proto\n\ 6 | ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\n\ 7 | ${4:// body...}\n\ 8 | };\n\ 9 | # Function\n\ 10 | snippet fun\n\ 11 | function ${1?:function_name}(${2:argument}) {\n\ 12 | ${3:// body...}\n\ 13 | }\n\ 14 | # Anonymous Function\n\ 15 | regex /((=)\\s*|(:)\\s*|(\\()|\\b)/f/(\\))?/\n\ 16 | snippet f\n\ 17 | function${M1?: ${1:functionName}}($2) {\n\ 18 | ${0:$TM_SELECTED_TEXT}\n\ 19 | }${M2?;}${M3?,}${M4?)}\n\ 20 | # Immediate function\n\ 21 | trigger \\(?f\\(\n\ 22 | endTrigger \\)?\n\ 23 | snippet f(\n\ 24 | (function(${1}) {\n\ 25 | ${0:${TM_SELECTED_TEXT:/* code */}}\n\ 26 | }(${1}));\n\ 27 | # if\n\ 28 | snippet if\n\ 29 | if (${1:true}) {\n\ 30 | ${0}\n\ 31 | }\n\ 32 | # if ... else\n\ 33 | snippet ife\n\ 34 | if (${1:true}) {\n\ 35 | ${2}\n\ 36 | } else {\n\ 37 | ${0}\n\ 38 | }\n\ 39 | # tertiary conditional\n\ 40 | snippet ter\n\ 41 | ${1:/* condition */} ? ${2:a} : ${3:b}\n\ 42 | # switch\n\ 43 | snippet switch\n\ 44 | switch (${1:expression}) {\n\ 45 | case '${3:case}':\n\ 46 | ${4:// code}\n\ 47 | break;\n\ 48 | ${5}\n\ 49 | default:\n\ 50 | ${2:// code}\n\ 51 | }\n\ 52 | # case\n\ 53 | snippet case\n\ 54 | case '${1:case}':\n\ 55 | ${2:// code}\n\ 56 | break;\n\ 57 | ${3}\n\ 58 | \n\ 59 | # while (...) {...}\n\ 60 | snippet wh\n\ 61 | while (${1:/* condition */}) {\n\ 62 | ${0:/* code */}\n\ 63 | }\n\ 64 | # try\n\ 65 | snippet try\n\ 66 | try {\n\ 67 | ${0:/* code */}\n\ 68 | } catch (e) {}\n\ 69 | # do...while\n\ 70 | snippet do\n\ 71 | do {\n\ 72 | ${2:/* code */}\n\ 73 | } while (${1:/* condition */});\n\ 74 | # Object Method\n\ 75 | snippet :f\n\ 76 | regex /([,{[])|^\\s*/:f/\n\ 77 | ${1:method_name}: function(${2:attribute}) {\n\ 78 | ${0}\n\ 79 | }${3:,}\n\ 80 | # setTimeout function\n\ 81 | snippet setTimeout\n\ 82 | regex /\\b/st|timeout|setTimeo?u?t?/\n\ 83 | setTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\n\ 84 | # Get Elements\n\ 85 | snippet gett\n\ 86 | getElementsBy${1:TagName}('${2}')${3}\n\ 87 | # Get Element\n\ 88 | snippet get\n\ 89 | getElementBy${1:Id}('${2}')${3}\n\ 90 | # console.log (Firebug)\n\ 91 | snippet cl\n\ 92 | console.log(${1});\n\ 93 | # return\n\ 94 | snippet ret\n\ 95 | return ${1:result}\n\ 96 | # for (property in object ) { ... }\n\ 97 | snippet fori\n\ 98 | for (var ${1:prop} in ${2:Things}) {\n\ 99 | ${0:$2[$1]}\n\ 100 | }\n\ 101 | # hasOwnProperty\n\ 102 | snippet has\n\ 103 | hasOwnProperty(${1})\n\ 104 | # docstring\n\ 105 | snippet /**\n\ 106 | /**\n\ 107 | * ${1:description}\n\ 108 | *\n\ 109 | */\n\ 110 | snippet @par\n\ 111 | regex /^\\s*\\*\\s*/@(para?m?)?/\n\ 112 | @param {${1:type}} ${2:name} ${3:description}\n\ 113 | snippet @ret\n\ 114 | @return {${1:type}} ${2:description}\n\ 115 | # JSON.parse\n\ 116 | snippet jsonp\n\ 117 | JSON.parse(${1:jstr});\n\ 118 | # JSON.stringify\n\ 119 | snippet jsons\n\ 120 | JSON.stringify(${1:object});\n\ 121 | # self-defining function\n\ 122 | snippet sdf\n\ 123 | var ${1:function_name} = function(${2:argument}) {\n\ 124 | ${3:// initial code ...}\n\ 125 | \n\ 126 | $1 = function($2) {\n\ 127 | ${4:// main code}\n\ 128 | };\n\ 129 | }\n\ 130 | # singleton\n\ 131 | snippet sing\n\ 132 | function ${1:Singleton} (${2:argument}) {\n\ 133 | // the cached instance\n\ 134 | var instance;\n\ 135 | \n\ 136 | // rewrite the constructor\n\ 137 | $1 = function $1($2) {\n\ 138 | return instance;\n\ 139 | };\n\ 140 | \n\ 141 | // carry over the prototype properties\n\ 142 | $1.prototype = this;\n\ 143 | \n\ 144 | // the instance\n\ 145 | instance = new $1();\n\ 146 | \n\ 147 | // reset the constructor pointer\n\ 148 | instance.constructor = $1;\n\ 149 | \n\ 150 | ${3:// code ...}\n\ 151 | \n\ 152 | return instance;\n\ 153 | }\n\ 154 | # class\n\ 155 | snippet class\n\ 156 | regex /^\\s*/clas{0,2}/\n\ 157 | var ${1:class} = function(${20}) {\n\ 158 | $40$0\n\ 159 | };\n\ 160 | \n\ 161 | (function() {\n\ 162 | ${60:this.prop = \"\"}\n\ 163 | }).call(${1:class}.prototype);\n\ 164 | \n\ 165 | exports.${1:class} = ${1:class};\n\ 166 | # \n\ 167 | snippet for-\n\ 168 | for (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\n\ 169 | ${0:${2:Things}[${1:i}];}\n\ 170 | }\n\ 171 | # for (...) {...}\n\ 172 | snippet for\n\ 173 | for (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\n\ 174 | ${3:$2[$1]}$0\n\ 175 | }\n\ 176 | # for (...) {...} (Improved Native For-Loop)\n\ 177 | snippet forr\n\ 178 | for (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\n\ 179 | ${3:$2[$1]}$0\n\ 180 | }\n\ 181 | \n\ 182 | \n\ 183 | #modules\n\ 184 | snippet def\n\ 185 | define(function(require, exports, module) {\n\ 186 | \"use strict\";\n\ 187 | var ${1/.*\\///} = require(\"${1}\");\n\ 188 | \n\ 189 | $TM_SELECTED_TEXT\n\ 190 | });\n\ 191 | snippet req\n\ 192 | guard ^\\s*\n\ 193 | var ${1/.*\\///} = require(\"${1}\");\n\ 194 | $0\n\ 195 | snippet requ\n\ 196 | guard ^\\s*\n\ 197 | var ${1/.*\\/(.)/\\u$1/} = require(\"${1}\").${1/.*\\/(.)/\\u$1/};\n\ 198 | $0\n\ 199 | "; 200 | exports.scope = "javascript"; 201 | 202 | }); (function() { 203 | window.require(["ace/snippets/javascript"], function(m) { 204 | if (typeof module == "object" && typeof exports == "object" && module) { 205 | module.exports = m; 206 | } 207 | }); 208 | })(); 209 | -------------------------------------------------------------------------------- /v3/data/panel/components/editor-view/core.js: -------------------------------------------------------------------------------- 1 | import './ace-builds-1.4.12/src/ace.js'; 2 | import './ace-builds-1.4.12/src/ext-language_tools.js'; 3 | 4 | class EditorView extends HTMLElement { 5 | constructor() { 6 | super(); 7 | 8 | const shadow = this.attachShadow({mode: 'open'}); 9 | shadow.innerHTML = ` 10 | 21 |
22 |
23 |
24 | `; 25 | 26 | ace.config.set('basePath', (new URL(import.meta.url + '/../ace-builds-1.4.12/src/')).href); 27 | ace.require('ace/ext/language_tools'); 28 | 29 | const editor = this.editor = ace.edit(shadow.getElementById('editor'), { 30 | mode: 'ace/mode/javascript', 31 | autoScrollEditorIntoView: true, 32 | highlightActiveLine: false, 33 | maxLines: 100, 34 | value: '\n', 35 | keyboardHandler: 'ace/keyboard/sublime', 36 | enableBasicAutocompletion: true, 37 | enableSnippets: true, 38 | enableLiveAutocompletion: false, 39 | useWorker: false 40 | }); 41 | editor.renderer.attachToShadowRoot(); 42 | let lastCursor = {}; 43 | this.addEventListener('keyup', e => { 44 | const cursor = this.cursor; 45 | if (cursor.row === lastCursor.row && cursor.column === lastCursor.column) { 46 | if (e.code === 'ArrowUp') { 47 | this.dispatchEvent(new Event('hit-start')); 48 | } 49 | else if (e.code === 'ArrowDown') { 50 | this.dispatchEvent(new Event('hit-end')); 51 | } 52 | } 53 | lastCursor = cursor; 54 | }); 55 | // auto complete 56 | editor.on('change', () => { 57 | const cursor = this.cursor; 58 | const token = editor.session.getTokenAt(cursor.row, cursor.column); 59 | if (token && token.value.length >= 2 && token.type === 'identifier') { 60 | editor.execCommand('startAutocomplete'); 61 | } 62 | }); 63 | } 64 | get value() { 65 | return this.editor.getValue(); 66 | } 67 | set value(v) { 68 | // move cursor to end 69 | this.editor.setValue(v, 1); 70 | } 71 | get cursor() { 72 | return this.editor.getCursorPosition(); 73 | } 74 | } 75 | window.customElements.define('editor-view', EditorView); 76 | -------------------------------------------------------------------------------- /v3/data/panel/components/editor-view/example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /v3/data/panel/components/manual-view-search.js: -------------------------------------------------------------------------------- 1 | /* globals app */ 2 | 3 | const search = {}; 4 | 5 | search.fetch = (base, args = {}) => { 6 | Object.assign(args, { 7 | allowsPost: true, // Supports POST requests 8 | allowsHttps: true // Supports HTTPS requests 9 | }); 10 | return fetch(base + '?' + Object.entries(args).map(([k, v]) => `${k}=${v}`).join('&')).then(r => r.json().then(j => { 11 | if (r.ok) { 12 | const servers = j.socks5; 13 | const random = Math.floor(Math.random() * servers.length); 14 | j = servers[random]; 15 | 16 | return j; 17 | } 18 | return Promise.reject(j.status_message || j.error || 'unknown error'); 19 | })); 20 | }; 21 | 22 | search.convert = str => { 23 | const [host, port] = str.split(':'); 24 | 25 | const proxy = { 26 | host, 27 | port: Number(port), 28 | scheme: 'socks5' 29 | }; 30 | return { 31 | info: {host, port}, 32 | proxy: { 33 | value: { 34 | mode: 'fixed_servers', 35 | rules: { 36 | proxyForFtp: proxy, 37 | proxyForHttp: proxy, 38 | proxyForHttps: proxy 39 | } 40 | } 41 | } 42 | }; 43 | }; 44 | 45 | search.ping = href => new Promise((resolve, reject) => { 46 | const timer = setTimeout(reject, 5000, 'timeout'); 47 | fetch(href, { 48 | method: 'HEAD' 49 | }).then(resolve, reject).finally(() => clearTimeout(timer)); 50 | }); 51 | search.verify = proxy => new Promise((resolve, reject) => chrome.proxy.settings.set(proxy, () => { 52 | Promise.all([ 53 | search.ping('https://raw.githubusercontent.com/rNeomy/proxy-switcher/master/LICENSE').then(resolve, () => false), 54 | search.ping('https://raw.githubusercontent.com/rNeomy/proxy-switcher/master/README.md').then(resolve, () => false) 55 | ]).then(() => reject(Error('Ping failed'))); 56 | })); 57 | 58 | search.attach = (button, msg, done) => { 59 | const log = s => msg.textContent = (new Date()).toTimeString().split(' ')[0] + ': ' + s; 60 | 61 | button.addEventListener('click', () => { 62 | button.disabled = true; 63 | // store proxy setting 64 | const set = mode => { 65 | if (mode === 'fixed_servers') { 66 | return Promise.resolve(); 67 | } 68 | return new Promise(resolve => chrome.proxy.settings.set({ // clear proxy 69 | value: {mode} 70 | }, resolve)); 71 | }; 72 | 73 | chrome.proxy.settings.get({}, ({value}) => { 74 | app.storage({ 75 | 'validate-mode': 'direct' 76 | }).then(async prefs => { 77 | await set(prefs['validate-mode']); 78 | Object.entries(prefs).forEach(([key, value]) => { 79 | if (!value) { 80 | delete prefs[key]; 81 | } 82 | }); 83 | try { 84 | log('Searching for a server ...'); 85 | const json = await search.fetch('https://raw.githubusercontent.com/jetkai/proxy-list/main/online-proxies/json/proxies.json', prefs); 86 | const {proxy, info} = search.convert(json); 87 | log(`Validating ${info.host}:${info.port}`); 88 | done(proxy, 'My New Proxy'); 89 | await search.verify(proxy).then(() => log('Looks good!'), () => log('Cannot verify this proxy! Retry again')); 90 | } 91 | catch (e) { 92 | log(e.message || e || 'Error!'); 93 | chrome.proxy.settings.set({value}); 94 | } 95 | button.disabled = false; 96 | }); 97 | }); 98 | }); 99 | } 100 | 101 | export {search}; 102 | -------------------------------------------------------------------------------- /v3/data/panel/images/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /v3/data/panel/images/no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /v3/data/panel/images/ok.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /v3/data/panel/images/reload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /v3/data/panel/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font: 400 13px/24px Roboto,sans-serif; 3 | background-color: #eee; 4 | display: flex; 5 | flex-direction: column; 6 | padding: 0; 7 | margin: 0; 8 | font-size: 12px; 9 | width: 600px; 10 | } 11 | h1 { 12 | color: #4877cb; 13 | font-size: 28px; 14 | font-weight: normal; 15 | display: inline-block; 16 | padding-right: 10px; 17 | } 18 | a { 19 | outline: none; 20 | } 21 | #toolbar { 22 | margin: 0 10px; 23 | overflow: hidden; 24 | text-overflow: ellipsis; 25 | white-space: nowrap; 26 | } 27 | #toolbar span { 28 | color: #a0a0a0; 29 | text-shadow: 1px 1px #fcffff; 30 | float: right; 31 | } 32 | 33 | #tabs { 34 | list-style-type: none; 35 | margin: 0; 36 | padding: 0; 37 | position: relative; 38 | } 39 | #tabs li { 40 | display: inline-block; 41 | padding: 0 10px; 42 | text-align: center; 43 | background-color: #6e98e3; 44 | color: #fff; 45 | height: 36px; 46 | line-height: 32px; 47 | transform: translate(0, 4px); 48 | cursor: pointer; 49 | border-top: 3px solid transparent; 50 | min-width: 80px; 51 | } 52 | body[data-ready=true] #tabs li { 53 | transition: all ease 200ms; 54 | } 55 | 56 | #tabs li.no-proxy { 57 | border-top-color: #000; 58 | } 59 | #tabs li.auto-proxy { 60 | border-top-color: #2124fc; 61 | } 62 | #tabs li.system-proxy { 63 | border-top-color: #31736b; 64 | } 65 | #tabs li.manual-proxy { 66 | border-top-color: #fd0e1c; 67 | } 68 | #tabs li.pac-proxy { 69 | border-top-color: #fb9426; 70 | } 71 | #tabs input:checked ~ li { 72 | background-color: #fff; 73 | color: #000; 74 | box-shadow: 3px 3px 6px 0 rgba(0, 0, 0, .3); 75 | transform: translate(0, 0); 76 | } 77 | #tabs input[type=radio] { 78 | display: none; 79 | } 80 | #tabs li:hover { 81 | transform: translate(0, 0); 82 | } 83 | #tabs>div { 84 | position: absolute; 85 | right: 10px; 86 | top: 0; 87 | display: flex; 88 | height: 100%; 89 | display: flex; 90 | align-items: center; 91 | } 92 | #tabs>div input { 93 | border: none; 94 | background-color: #fd0f1b; 95 | color: #ffdcdc; 96 | text-indent: 0; 97 | cursor: pointer; 98 | padding: 3px 5px; 99 | font-size: 12px; 100 | } 101 | #tabs>div input:active { 102 | background-color: #b5b5b5; 103 | } 104 | 105 | #tools { 106 | height: 60px; 107 | display: flex; 108 | align-items: center; 109 | justify-content: center; 110 | } 111 | #tools a { 112 | margin: 0 5px; 113 | text-decoration: none; 114 | color: #000; 115 | } 116 | #others { 117 | display: flex; 118 | align-items: center; 119 | justify-content: center; 120 | } 121 | #notify { 122 | position: fixed; 123 | top: 10px; 124 | right: 10px; 125 | z-index: 3; 126 | max-width: 50vw; 127 | max-height: 30vh; 128 | overflow: hidden; 129 | } 130 | #notify>div { 131 | background-color: #fcf7df; 132 | border: solid 1px #f9e8c5; 133 | color: #7f6256; 134 | padding: 10px; 135 | margin: 2px 0; 136 | overflow: hidden; 137 | text-overflow: ellipsis; 138 | white-space: nowrap; 139 | } 140 | .body { 141 | background-color: #fff; 142 | width: calc(100% - 20px); 143 | flex: 1; 144 | z-index: 2; 145 | padding: 10px; 146 | min-height: 100px; 147 | } 148 | .modify input { 149 | display: inline-block; 150 | width: 40px; 151 | margin-left: -1px; 152 | background-position: center center; 153 | background-repeat: no-repeat; 154 | border-width: 1px; 155 | border-style: solid; 156 | color: #fff; 157 | cursor: pointer; 158 | } 159 | .modify input:hover { 160 | opacity: 0.9; 161 | } 162 | .modify input:first-of-type { 163 | background-image: url(no.svg); 164 | background-size: 22px; 165 | background-color: #eea345; 166 | border-color: #ec9730; 167 | } 168 | .modify input:last-of-type { 169 | background-size: 13px; 170 | background-image: url(ok.svg); 171 | background-color: #52af52; 172 | border-color: #43a443; 173 | } 174 | .flex { 175 | display: flex; 176 | } 177 | .vbox { 178 | flex-direction: column; 179 | } 180 | .nowrap { 181 | white-space: nowrap; 182 | } 183 | .wide { 184 | flex: 1; 185 | } 186 | .hide { 187 | display: none !important; 188 | } 189 | .disabled { 190 | opacity: 0.5; 191 | pointer-events: none; 192 | } 193 | [firefox] { 194 | display: none; 195 | } 196 | button:disabled, 197 | input[type=button]:disabled { 198 | background-color: #ddd; 199 | border-color: #c5c5c5; 200 | opacity: 1.0; 201 | } 202 | #private { 203 | background-color: rgba(0, 0, 0, 0.8); 204 | color: #fff; 205 | position: absolute; 206 | top: 0; 207 | left: 0; 208 | width: 100vw; 209 | height: 100vh; 210 | display: flex; 211 | align-items: center; 212 | justify-content: center; 213 | z-index: 100; 214 | padding: 30px; 215 | box-sizing: border-box; 216 | } 217 | -------------------------------------------------------------------------------- /v3/data/panel/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 |

Proxy Switcher

11 |
12 | 37 | 38 | 39 | 40 |
Nothing to Configure!
41 |
42 | Check IP ● 43 | FAQs Page ● 44 | Options Page 45 |
46 |
47 |
Enable the extension on private mode; "about:addons" -> Proxy Switcher and Manager -> Run in Private Windows
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /v3/data/panel/toolbar.js: -------------------------------------------------------------------------------- 1 | /* globals app */ 2 | 'use strict'; 3 | 4 | (function() { 5 | let tabId; 6 | 7 | document.addEventListener('click', ({target}) => { 8 | const cmd = target.dataset.cmd; 9 | if (cmd === 'open-failed-resources') { 10 | chrome.tabs.create({ 11 | url: chrome.runtime.getURL('data/log/index.html?id=' + tabId) 12 | }); 13 | } 14 | }); 15 | chrome.tabs.query({ 16 | active: true, 17 | currentWindow: true 18 | }, tabs => { 19 | if (tabs.length) { 20 | tabId = tabs[0].id; 21 | chrome.runtime.sendMessage({ 22 | cmd: 'fails', 23 | tabId 24 | }, a => { 25 | chrome.runtime.lastError; 26 | if (a && a.length) { 27 | document.querySelector('#tabs>div input').classList.remove('hide'); 28 | } 29 | }); 30 | } 31 | }); 32 | })(); 33 | 34 | app.on('update-description', desc => Object.assign(document.querySelector('#toolbar span'), { 35 | title: desc, 36 | textContent: desc 37 | })); 38 | -------------------------------------------------------------------------------- /v3/data/panel/ui.js: -------------------------------------------------------------------------------- 1 | /* globals app */ 2 | 'use strict'; 3 | 4 | // colors 5 | app.storage({ 6 | 'color-auto_detect': '#2124fc', 7 | 'color-direct': '#000', 8 | 'color-fixed_servers': '#fd0e1c', 9 | 'color-pac_script_url': '#fb9426', 10 | 'color-pac_script_data': '#fb9426', 11 | 'color-system': '#31736b' 12 | }).then(prefs => { 13 | document.querySelector('#tabs li.no-proxy').style['border-top-color'] = prefs['color-direct']; 14 | document.querySelector('#tabs li.auto-proxy').style['border-top-color'] = prefs['color-auto_detect']; 15 | document.querySelector('#tabs li.system-proxy').style['border-top-color'] = prefs['color-system']; 16 | document.querySelector('#tabs li.manual-proxy').style['border-top-color'] = prefs['color-fixed_servers']; 17 | document.querySelector('#tabs li.pac-proxy').style['border-top-color'] = prefs['color-pac_script_url']; 18 | }); 19 | 20 | const click = ({target, isTrusted}) => { 21 | // select radio buttons on focus 22 | const id = target.getAttribute('for'); 23 | if (id) { 24 | const elem = document.getElementById(id); 25 | elem.checked = true; 26 | if (elem.dataset.mode) { 27 | app.emit('change-proxy', elem.dataset.mode); 28 | } 29 | } 30 | // change proxy type 31 | const mode = target.dataset.mode; 32 | if (mode && isTrusted) { 33 | app.emit('change-proxy', mode); 34 | } 35 | }; 36 | document.addEventListener('click', click); 37 | 38 | app.on('proxy-changed', mode => { 39 | const tab = document.querySelector(`#tabs [data-mode="${mode}"]`); 40 | const open = tab.dataset.open; 41 | 42 | if (open) { 43 | const body = document.getElementById(open); 44 | [...document.querySelectorAll('.body')].filter(b => b !== body) 45 | .forEach(b => b.classList.add('hide')); 46 | body.classList.remove('hide'); 47 | tab.click(); 48 | } 49 | }); 50 | 51 | app.on('notify', msg => { 52 | const n = document.getElementById('notify'); 53 | msg = msg.error || msg.message || msg; 54 | const div = document.createElement('div'); 55 | div.textContent = (new Date()).toTimeString().split(' ')[0] + ': ' + msg; 56 | n.textContent = ''; 57 | n.appendChild(div); 58 | div.scrollIntoView(); 59 | window.setTimeout(() => div.remove(), 5000); 60 | }); 61 | 62 | document.getElementById('options').onclick = () => chrome.runtime.openOptionsPage(); 63 | document.addEventListener('keydown', e => { 64 | const meta = e.ctrlKey || e.metaKey; 65 | if (meta) { 66 | if (e.code === 'Digit1' || e.code === 'Digit2' || e.code === 'Digit3' || e.code === 'Digit4' || e.code === 'Digit5') { 67 | e.preventDefault(); 68 | click({ 69 | target: document.querySelector(`#tabs label:nth-child(${e.key}) li`), 70 | isTrusted: true 71 | }); 72 | } 73 | } 74 | }); 75 | 76 | if (/Firefox/.test(navigator.userAgent)) { 77 | chrome.extension.isAllowedIncognitoAccess(result => { 78 | if (!result) { 79 | document.getElementById('private').classList.remove('hide'); 80 | } 81 | }); 82 | } 83 | -------------------------------------------------------------------------------- /v3/data/panel/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const app = {}; 4 | 5 | app.storage = prefs => new Promise(resolve => chrome.storage.local.get(prefs, resolve)); 6 | 7 | app.callbacks = { 8 | on: {}, 9 | once: {} 10 | }; 11 | app.onces = {}; 12 | 13 | app.on = (id, callback) => { 14 | app.callbacks.on[id] = app.callbacks.on[id] || []; 15 | app.callbacks.on[id].push(callback); 16 | }; 17 | 18 | app.once = (id, callback) => { 19 | app.callbacks.once[id] = app.callbacks.once[id] || []; 20 | app.callbacks.once[id].push(callback); 21 | }; 22 | app.emit = (id, value) => { 23 | (app.callbacks.on[id] || []).forEach(c => c(value)); 24 | (app.callbacks.once[id] || []).forEach(c => c(value)); 25 | app.callbacks.once[id] = []; 26 | }; 27 | 28 | app.notify = (e, callback) => chrome.notifications.create({ 29 | type: 'basic', 30 | iconUrl: '/data/icons/48.png', 31 | title: chrome.runtime.getManifest().name, 32 | message: e.message || e 33 | }, callback); 34 | 35 | app.compare = (a, b) => { 36 | const ignore = ['remoteDNS', 'noPrompt', 'levelOfControl']; 37 | 38 | let ka = Object.keys(a).filter(s => ignore.indexOf(s) === -1); 39 | let kb = Object.keys(b).filter(s => ignore.indexOf(s) === -1); 40 | 41 | // remove empty array; bypassList = [] 42 | ka = ka.filter(k => (Array.isArray(a[k]) ? a[k].length : true)); 43 | kb = kb.filter(k => (Array.isArray(b[k]) ? b[k].length : true)); 44 | 45 | // remove empty objects; see https://github.com/rNeomy/proxy-switcher/issues/70 46 | ka = ka.filter(k => { 47 | if (typeof a[k] === 'object' && 'host' in a[k] && 'port' in a[k]) { 48 | if (!a[k].host && !a[k].port) { 49 | return false; 50 | } 51 | } 52 | return true; 53 | }); 54 | kb = kb.filter(k => { 55 | if (typeof b[k] === 'object' && 'host' in b[k] && 'port' in b[k]) { 56 | if (!b[k].host && !b[k].port) { 57 | return false; 58 | } 59 | } 60 | return true; 61 | }); 62 | if (ka.length !== kb.length) { 63 | return false; 64 | } 65 | for (const key of ka) { 66 | if (typeof a[key] === 'string' || typeof a[key] === 'boolean' || typeof a[key] === 'number') { 67 | if (a[key] !== b[key]) { 68 | return false; 69 | } 70 | } 71 | else if (Array.isArray(a[key])) { 72 | if (a[key].some(s => b[key].indexOf(s) === -1)) { 73 | return false; 74 | } 75 | } 76 | else { 77 | return app.compare(a[key], b[key]); 78 | } 79 | } 80 | return true; 81 | }; 82 | -------------------------------------------------------------------------------- /v3/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Proxy Switcher and Manager", 3 | "description": "__MSG_description__", 4 | "version": "0.6.3", 5 | "manifest_version": 3, 6 | "default_locale": "en", 7 | "permissions": [ 8 | "storage", 9 | "notifications", 10 | "proxy" 11 | ], 12 | "storage": { 13 | "managed_schema": "schema.json" 14 | }, 15 | "action": { 16 | "default_popup": "data/panel/index.html" 17 | }, 18 | "background": { 19 | "service_worker": "worker.js" 20 | }, 21 | "homepage_url": "https://add0n.com/proxy-switcher.html", 22 | "icons": { 23 | "16": "data/icons/16.png", 24 | "24": "data/icons/24.png", 25 | "32": "data/icons/32.png", 26 | "48": "data/icons/48.png", 27 | "64": "data/icons/64.png", 28 | "128": "data/icons/128.png", 29 | "256": "data/icons/256.png" 30 | }, 31 | "options_ui": { 32 | "page": "data/options/index.html", 33 | "open_in_tab": true 34 | }, 35 | "commands": { 36 | "_execute_action": {} 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /v3/schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "object", 3 | "properties": { 4 | "import-version": { 5 | "title": "The version of the imported index. It will be used to determine whether replacing local storage is required or not. Need to be a non-zero integer.", 6 | "type": "integer" 7 | }, 8 | "import-json": { 9 | "title": "This is the JSON string that overwrites defaults. A user can alter preferences later. Note that if a new version is imported, the user defined preferences will be overwritten.", 10 | "type": "string" 11 | }, 12 | "faqs": { 13 | "title": "Open FAQs page on updates", 14 | "type": "boolean" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /v3/worker.js: -------------------------------------------------------------------------------- 1 | /* global app */ 2 | 3 | self.importScripts('data/panel/utils.js'); 4 | // self.importScripts('badge.js'); 5 | 6 | const _ = chrome.i18n.getMessage; 7 | 8 | /* icon color */ 9 | const icon = (() => { 10 | const canvas = new OffscreenCanvas(48, 48); 11 | const ctx = canvas.getContext('2d'); 12 | ctx.fillStyle = '#777'; 13 | ctx.fill( 14 | new Path2D('M28.256,39.289v-1.26h-8.512v1.26c0,1.393-1.129,2.521-2.522,2.521h-2.079v2.523h17.713v-2.523h-2.078 C29.385,41.811,28.256,40.682,28.256,39.289z') 15 | ); 16 | ctx.fill( 17 | new Path2D('M45.396,3.667h-0.273H2.859H2.605H0.021V6.25v0.648v26.895v0.391v2.584h2.583h0.589h40.982h1.22h2.583 v-2.584v-0.883V6.846V6.25V3.667H45.396z M24,35.23c-0.696,0-1.261-0.564-1.261-1.262c0-0.695,0.565-1.26,1.261-1.26 c0.697,0,1.261,0.564,1.261,1.26C25.261,34.666,24.697,35.23,24,35.23z M45.435,6.846v0.919v23.644H2.565V7.765V6.898V6.009h0.293 h1.359h39.485h1.419h0.312V6.846z') 18 | ); 19 | 20 | return config => chrome.storage.local.get(null, prefs => { 21 | prefs = { 22 | 'color-auto_detect': '#2124fc', 23 | 'color-direct': '#000', 24 | 'color-fixed_servers': '#fd0e1c', 25 | 'color-pac_script_url': '#fb9426', 26 | 'color-pac_script_data': '#fb9426', 27 | 'color-system': '#31736b', 28 | 'text': false, // icon text, 29 | 'profiles': [], 30 | ...prefs 31 | }; 32 | 33 | let mode = config.value.mode; 34 | if (mode === 'pac_script') { 35 | mode = config.value.pacScript && config.value.pacScript.url ? 'pac_script_url' : 'pac_script_data'; 36 | } 37 | 38 | ctx.fillStyle = prefs['color-' + mode]; 39 | ctx.fillRect(5.04, 8.652, 37.83, 20.176); 40 | 41 | if (mode.startsWith('pac_script')) { 42 | ctx.fillStyle = mode === 'pac_script_url' ? prefs['color-system'] : prefs['color-fixed_servers']; 43 | ctx.fillRect(5.04, 8.652, 37.83 / 2, 20.176); 44 | } 45 | chrome.action.setBadgeText({ 46 | text: '' 47 | }); 48 | if (mode === 'fixed_servers' && prefs.text) { 49 | const profile = (prefs.profiles || []).filter(p => { 50 | const profile = prefs['profile.' + p]; 51 | return profile && app.compare(profile, config); 52 | }).shift(); 53 | if (profile) { 54 | chrome.action.setBadgeText({ 55 | text: profile[0] 56 | }); 57 | } 58 | } 59 | 60 | chrome.action.setIcon({ 61 | imageData: ctx.getImageData(0, 0, 48, 48) 62 | }); 63 | 64 | let title = 'Proxy Switcher\n\n'; 65 | title += ({ 66 | 'direct': _('modeDirect'), 67 | 'auto_detect': _('modeAuto'), 68 | get 'pac_script_url'() { 69 | return _('modePACU') + config.value.pacScript.url; 70 | }, 71 | 'pac_script_data': _('modePACD'), 72 | 'fixed_servers': _('modeFixed'), 73 | 'system': _('modeSystem') 74 | })[mode]; 75 | 76 | chrome.action.setTitle({title}, () => chrome.runtime.lastError); 77 | }); 78 | })(); 79 | chrome.proxy.settings.get({}, icon); 80 | chrome.proxy.settings.onChange.addListener(icon); 81 | 82 | // init 83 | const startup = () => chrome.storage.local.get({ 84 | 'color': '#848384', 85 | 'startup-proxy': 'no' 86 | }, prefs => { 87 | // badge color 88 | chrome.action.setBadgeBackgroundColor({ 89 | color: prefs.color 90 | }); 91 | // initial proxy 92 | if (prefs['startup-proxy'] === 'no') { 93 | chrome.proxy.settings.get({}, icon); 94 | } 95 | else { 96 | chrome.proxy.settings.set({ 97 | value: { 98 | mode: prefs['startup-proxy'] 99 | } 100 | }, icon); 101 | } 102 | }); 103 | chrome.runtime.onInstalled.addListener(startup); 104 | chrome.runtime.onStartup.addListener(startup); 105 | 106 | // dealing with managed storage 107 | chrome.storage.managed.get({ 108 | 'import-json': '', 109 | 'import-version': 0 110 | }, mps => { 111 | if (!chrome.runtime.lastError && mps && mps['import-json'] && mps['import-version'] > 0) { 112 | chrome.storage.local.get({ 113 | 'import-version': 0 114 | }, prefs => { 115 | if (prefs['import-version'] < mps['import-version']) { 116 | const json = JSON.parse(mps['import-json']); 117 | chrome.storage.local.set(Object.assign({ 118 | 'import-version': mps['import-version'] 119 | }, json), () => chrome.runtime.reload()); 120 | } 121 | else { 122 | console.log('recent managed storage. not updating'); 123 | } 124 | }); 125 | } 126 | }); 127 | // pref changes 128 | chrome.storage.onChanged.addListener(ps => { 129 | if (ps.color) { 130 | chrome.action.setBadgeBackgroundColor({ 131 | color: ps.color.newValue 132 | }); 133 | } 134 | if ( 135 | ps.profiles || ps.text || 136 | ps['color-auto_detect'] || ps['color-direct'] || ps['color-fixed_servers'] || 137 | ps['color-pac_script_data'] || ps['color-pac_script_url'] || ps['color-system'] 138 | ) { 139 | chrome.proxy.settings.get({}, icon); 140 | } 141 | }); 142 | 143 | /* FAQs & Feedback */ 144 | { 145 | const {management, runtime: {onInstalled, setUninstallURL, getManifest}, storage, tabs} = chrome; 146 | if (navigator.webdriver !== true) { 147 | const page = getManifest().homepage_url; 148 | const {name, version} = getManifest(); 149 | onInstalled.addListener(({reason, previousVersion}) => { 150 | management.getSelf(({installType}) => installType === 'normal' && storage.local.get({ 151 | 'faqs': true, 152 | 'last-update': 0 153 | }, prefs => { 154 | if (reason === 'install' || (prefs.faqs && reason === 'update')) { 155 | const doUpdate = (Date.now() - prefs['last-update']) / 1000 / 60 / 60 / 24 > 45; 156 | if (doUpdate && previousVersion !== version) { 157 | tabs.query({active: true, currentWindow: true}, tbs => tabs.create({ 158 | url: page + '?version=' + version + (previousVersion ? '&p=' + previousVersion : '') + '&type=' + reason, 159 | active: reason === 'install', 160 | ...(tbs && tbs.length && {index: tbs[0].index + 1}) 161 | })); 162 | storage.local.set({'last-update': Date.now()}); 163 | } 164 | } 165 | })); 166 | }); 167 | setUninstallURL(page + '?rd=feedback&name=' + encodeURIComponent(name) + '&version=' + version); 168 | } 169 | } 170 | --------------------------------------------------------------------------------