# Resources to be used as redirect destinations.
#
# - Each distinct resource entry is separated by an empty line.
# - The first line in a resource entry is: token mime-type[;encoding]
# - All following lines are the data. An empty line signals the end of the
#   data.
#
# If the encoding is absent, the data will be converted to base64, and the
# encoding will be set to `;base64`.


# http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
1x1-transparent.gif image/gif;base64
R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==


2x2-transparent.png image/png;base64
iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAC0lEQVQI12NgQAcAABIAAe+JVKQAAAAA
SUVORK5CYII=


32x32-transparent.png image/png;base64
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGklEQVRYw+3BAQEAAACCIP+vbkhAAQAA
AO8GECAAAZf3V9cAAAAASUVORK5CYII=


noopcss text/css


noopjs application/javascript
(function() {
    ;
})();


noopframe text/html
<!DOCTYPE html>
<html>
    <head><title></title></head>
    <body></body>
</html>


hd-main.js application/javascript
var L = (function(){
    var l = {};
    var noopfn = function() {
        ;
    };
    var props = [
        "pf", "ed", "Qe", "fd", "xh", "Uc", "ef", "zd", "Ad", "Qc", "Ri", "Wc",
        "Vc", "Xc", "Wg", "rd", "qd", "sd", "Pe", "Id", "Hd", "Jd", "fg", "Fd",
        "Ed", "Gd", "ek", "Cd", "Bd", "Dd", "Nj", "Sc", "Rc", "Tc", "wg", "xd",
        "wd", "yd", "fh", "ld", "md", "nd", "Re", "cd", "Pc", "ke", "Yc", "Xg",
        "jd", "kd", "oh", "ad", "bd", "mi", "gd", "hd", "ae", "dd", "fk", "ij",
        "ud", "td", "vd", "ig", "od", "pd", "Yd", "$j", "Oc", "bf"
    ];
    for (var i = 0; i < props.length; i++) {
        l[props[i]] = noopfn;
    }
    return l;
})();


# fuckadblock defuser
fuckadblock.js-3.2.0 application/javascript
(function() {
    var noopfn = function() {
        ;
    };
    //
    var Fab = function() {};
    Fab.prototype.check = noopfn;
    Fab.prototype.clearEvent = noopfn;
    Fab.prototype.emitEvent = noopfn;
    Fab.prototype.on = function(a, b) {
        if ( !a ) { b(); }
        return this;
    };
    Fab.prototype.onDetected = function() {
        return this;
    };
    Fab.prototype.onNotDetected = function(a) {
        a();
        return this;
    };
    Fab.prototype.setOption = noopfn;
    window.FuckAdBlock = Fab;
    //
    window.fuckAdBlock = new Fab();
})();


antiAdBlock.js application/javascript
(function() {
    window.antiAdBlock = {
        onDetected: function() {
            ;
        },
        onNotDetected: function(a) {
            a();
        }
    };
})();


# To neutralize GA scripts. The goal is to provide the minimal API
# expected by clients of these scripts so that the end users are able
# to wholly block GA while minimizing risks of page breakage.
# Test cases (need way more):
# - https://github.com/chrisaljoudi/uBlock/issues/119

google-analytics.com/ga.js application/javascript
(function() {
    var noopfn = function() {
        ;
    };
    //
    var Gaq = function() {
        ;
    };
    Gaq.prototype.Na = noopfn;
    Gaq.prototype.O = noopfn;
    Gaq.prototype.Sa = noopfn;
    Gaq.prototype.Ta = noopfn;
    Gaq.prototype.Va = noopfn;
    Gaq.prototype._createAsyncTracker = noopfn;
    Gaq.prototype._getAsyncTracker = noopfn;
    Gaq.prototype._getPlugin = noopfn;
    Gaq.prototype.push = function(a) {
        if ( typeof a === 'function' ) {
            a();
        }
    };
    //
    var tracker = function() {};
    tracker._getLinkerUrl = function(a) {
        return a;
    };
    //
    var tracker = {
        _initData: noopfn,
        _trackPageview: noopfn
    };
    //
    var Gat = function() {
        ;
    };
    Gat.prototype._anonymizeIP = noopfn;
    Gat.prototype._createTracker = noopfn;
    Gat.prototype._forceSSL = noopfn;
    Gat.prototype._getPlugin = noopfn;
    Gat.prototype._getTracker = function() {
        return tracker;
    };
    Gat.prototype._getTrackerByName = function() {
        return tracker;
    };
    Gat.prototype._getTrackers = noopfn;
    Gat.prototype.aa = noopfn;
    Gat.prototype.ab = noopfn;
    Gat.prototype.hb = noopfn;
    Gat.prototype.la = noopfn;
    Gat.prototype.oa = noopfn;
    Gat.prototype.pa = noopfn;
    Gat.prototype.u = noopfn;
    var gat = new Gat();
    window._gat = gat;
    //
    var gaq = new Gaq();
    (function() {
        var aa = window._gaq || [];
        if ( Array.isArray(aa) ) {
            while ( aa[0] ) {
                gaq.push(aa.shift());
            }
        }
    })();
    window._gaq = gaq.qf = gaq;
})();

google-analytics.com/analytics.js application/javascript
(function() {
    // https://developers.google.com/analytics/devguides/collection/analyticsjs/
    var noopfn = function() {
        ;
    };
    var noopnullfn = function() {
        return null;
    };
    //
    var Tracker = function() {
        ;
    };
    var p = Tracker.prototype;
    p.get = noopfn;
    p.set = noopfn;
    p.send = noopfn;
    //
    var gaName = window.GoogleAnalyticsObject || 'ga';
    var ga = function() {
        var len = arguments.length;
        if ( len === 0 ) {
            return;
        }
        var f = arguments[len-1];
        if ( typeof f !== 'object' || f === null || typeof f.hitCallback !== 'function' ) {
            return;
        }
        try {
            f.hitCallback();
        } catch (ex) {
        }
    };
    ga.create = function() {
        return new Tracker();
    };
    ga.getByName = noopnullfn;
    ga.getAll = function() {
        return [];
    };
    ga.remove = noopfn;
    window[gaName] = ga;
})();


# Ubiquitous googletagservices.com: not blocked by EasyPrivacy.
# "Tags are tiny bits of website code that let you measure traffic and
# "visitor behavior"
googletagservices.com/gpt.js application/javascript
(function() {
    var p;
    // https://developers.google.com/doubleclick-gpt/reference
    var noopfn = function() {
        ;
    };
    var noopthisfn = function() {
        return this;
    };
    var noopnullfn = function() {
        return null;
    };
    var nooparrayfn = function() {
        return [];
    };
    var noopstrfn = function() {
        return '';
    };
    //
    var companionAdsService = {
        addEventListener: noopthisfn,
        enableSyncLoading: noopfn,
        setRefreshUnfilledSlots: noopfn
    };
    var contentService = {
        addEventListener: noopthisfn,
        setContent: noopfn
    };
    var PassbackSlot = function() {
        ;
    };
    p = PassbackSlot.prototype;
    p.display = noopfn;
    p.get = noopnullfn;
    p.set = noopthisfn;
    p.setClickUrl = noopthisfn;
    p.setTagForChildDirectedTreatment = noopthisfn;
    p.setTargeting = noopthisfn;
    p.updateTargetingFromMap = noopthisfn;
    var pubAdsService = {
        addEventListener: noopthisfn,
        clear: noopfn,
        clearCategoryExclusions: noopthisfn,
        clearTagForChildDirectedTreatment: noopthisfn,
        clearTargeting: noopthisfn,
        collapseEmptyDivs: noopfn,
        defineOutOfPagePassback: function() { return new PassbackSlot(); },
        definePassback: function() { return new PassbackSlot(); },
        disableInitialLoad: noopfn,
        display: noopfn,
        enableAsyncRendering: noopfn,
        enableSingleRequest: noopfn,
        enableSyncRendering: noopfn,
        enableVideoAds: noopfn,
        get: noopnullfn,
        getAttributeKeys: nooparrayfn,
        refresh: noopfn,
        set: noopthisfn,
        setCategoryExclusion: noopthisfn,
        setCentering: noopfn,
        setCookieOptions: noopthisfn,
        setLocation: noopthisfn,
        setPublisherProvidedId: noopthisfn,
        setTagForChildDirectedTreatment: noopthisfn,
        setTargeting: noopthisfn,
        setVideoContent: noopthisfn,
        updateCorrelator: noopfn
    };
    var SizeMappingBuilder = function() {
        ;
    };
    p = SizeMappingBuilder.prototype;
    p.addSize = noopthisfn;
    p.build = noopnullfn;
    var Slot = function() {
        ;
    };
    p = Slot.prototype;
    p.addService = noopthisfn;
    p.clearCategoryExclusions = noopthisfn;
    p.clearTargeting = noopthisfn;
    p.defineSizeMapping = noopthisfn;
    p.get = noopnullfn;
    p.getAdUnitPath = nooparrayfn;
    p.getAttributeKeys = nooparrayfn;
    p.getCategoryExclusions = nooparrayfn;
    p.getDomId = noopstrfn;
    p.getSlotElementId = noopstrfn;
    p.getSlotId = noopthisfn;
    p.getTargeting = nooparrayfn;
    p.getTargetingKeys = nooparrayfn;
    p.set = noopthisfn;
    p.setCategoryExclusion = noopthisfn;
    p.setClickUrl = noopthisfn;
    p.setCollapseEmptyDiv = noopthisfn;
    p.setTargeting = noopthisfn;
    //
    var gpt = window.googletag || {};
    var cmd = gpt.cmd || [];
    gpt.apiReady = true;
    gpt.cmd = [];
    gpt.cmd.push = function(a) {
        try {
            a();
        } catch (ex) {
        }
        return 1;
    };
    gpt.companionAds = function() { return companionAdsService; };
    gpt.content = function() { return contentService; };
    gpt.defineOutOfPageSlot = function() { return new Slot(); };
    gpt.defineSlot = function() { return new Slot(); };
    gpt.disablePublisherConsole = noopfn;
    gpt.display = noopfn;
    gpt.enableServices = noopfn;
    gpt.getVersion = noopstrfn;
    gpt.pubads = function() { return pubAdsService; };
    gpt.pubadsReady = true;
    gpt.sizeMapping = function() { return new SizeMappingBuilder(); };
    window.googletag = gpt;
    while ( cmd.length !== 0 ) {
        gpt.cmd.push(cmd.shift());
    }
})();


# https://forums.lanik.us/viewtopic.php?f=91&t=27188
i.ligatus.com/*/angular-tag.js application/javascript
(function() {
    self.adProtect = true;
})();


# Yavli ads. These are blocked using an inline script tag filter, but this
# works only on Firefox. So we side-load the following script for sites
# suffering Yavli's click-bait ads.
yavli-defuser.js application/javascript
(function() {
    var descriptor = {
        set: function() {
            ;
        },
        get: function() {
            return '';
        }
    };
    try {
        Object.defineProperty(window, '__durl', descriptor);
        Object.defineProperty(window, '__lsurl', descriptor);
        Object.defineProperty(window, '__lturl', descriptor);
    } catch (ex) {
    }
})();


# Addefend defuser
uabinject-defuser.js application/javascript
(function() {
    window.uabpdl = window.uabInject = window.uabDetect = true;
})();


# https://github.com/gorhill/uBlock/issues/1094
pornhub-popup-defuser.js application/javascript
(function() {
    var w = window;
    var count = Math.ceil(8+Math.random()*4);
    var tomorrow = new Date(Date.now() + 86400);
    var expire = tomorrow.toString();
    document.cookie = 'FastPopSessionRequestNumber=' + count + '; expires=' + expire;
    var db;
    if ( (db = w.localStorage) ) {
        db.setItem('InfNumFastPops', count);
        db.setItem('InfNumFastPopsExpire', expire);
    }
    if ( (db = w.sessionStorage) ) {
        db.setItem('InfNumFastPops', count);
        db.setItem('InfNumFastPopsExpire', expire);
    }
})();


# https://news.ycombinator.com/item?id=10814913
forbes-defuser.js application/javascript
(function() {
    if ( !window.location.pathname.startsWith('/forbes/welcome/') ) {
        return;
    }
    if ( typeof window.fbs_settings === 'object' ) {
        window.fbs_settings.classes = 'W10=';
        window.fbs_settings.mobile = 'true';
        return;
    }
    Object.defineProperty(window, 'fbs_settings', {
        value: {
            classes: 'W10=',
            data: {
                title: ''
            },
            mobile: 'true'
        }
    });
})();


# https://forums.lanik.us/viewtopic.php?f=62&t=25212
impspcabe-defuser.js application/javascript
(function(){
    window._impspcabe = false;
})();
