GithubHelp home page GithubHelp logo

brave-experiments / ad-block Goto Github PK

View Code? Open in Web Editor NEW
239.0 31.0 95.0 15.13 MB

Ad block engine used in the Brave browser for ABP filter syntax based lists like EasyList.

Home Page: https://www.brave.com

License: Mozilla Public License 2.0

C++ 42.96% Makefile 0.18% Python 2.28% C 40.23% JavaScript 14.35%

ad-block's Introduction

Deprecated and no longer maintained, use https://github.com/brave/adblock-rust instead!

Build Status

Brave Ad Block

Native node module, and C++ library for Adblock Plus filter parsing for lists like EasyList.

It uses a bloom filter and Rabin-Karp algorithm to be super fast.

Compatibility

This project supports almost all of the EasyList rule formats. It also supports some rule formats specific to other projects, like uBlock and AdGuard. For more details on what rule formats are supported, please see compatibility wiki page.

To include brave/ad-block in your project:

npm install --save ad-block

JS Sample

const { AdBlockClient, FilterOptions } = require('ad-block')
const client = new AdBlockClient()
client.parse('/public/ad/*$domain=slashdot.org')
client.parse('/public/ad3/*$script')
var b1 = client.matches('http://www.brianbondy.com/public/ad/some-ad', FilterOptions.script, 'slashdot.org')
var b2 = client.matches('http://www.brianbondy.com/public/ad/some-ad', FilterOptions.script, 'digg.com')
console.log('public/ad/* should match b1.  Actual: ', b1)
console.log('public/ad/* should not match b2.  Actual: ', b2)

C++ Sample

#include "ad_block_client.h"
#include <algorithm>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

string getFileContents(const char *filename)
{
  ifstream in(filename, ios::in);
  if (in) {
    ostringstream contents;
    contents << in.rdbuf();
    in.close();
    return(contents.str());
  }
  throw(errno);
}

void writeFile(const char *filename, const char *buffer, int length)
{
  ofstream outFile(filename, ios::out | ios::binary);
  if (outFile) {
    outFile.write(buffer, length);
    outFile.close();
    return;
  }
  throw(errno);
}


int main(int argc, char**argv) {
  std::string &&easyListTxt = getFileContents("./test/data/easylist.txt");
  const char *urlsToCheck[] = {
    // ||pagead2.googlesyndication.com^$~object-subrequest
    "http://pagead2.googlesyndication.com/pagead/show_ads.js",
    // Should be blocked by: ||googlesyndication.com/safeframe/$third-party
    "http://tpc.googlesyndication.com/safeframe/1-0-2/html/container.html",
    // Should be blocked by: ||googletagservices.com/tag/js/gpt_$third-party
    "http://www.googletagservices.com/tag/js/gpt_mobile.js",
    // Shouldn't be blocked
    "http://www.brianbondy.com"
  };

  // This is the site who's URLs are being checked, not the domain of the URL being checked.
  const char *currentPageDomain = "slashdot.org";

  // Parse easylist
  AdBlockClient client;
  client.parse(easyListTxt.c_str());

  // Do the checks
  std::for_each(urlsToCheck, urlsToCheck + sizeof(urlsToCheck) / sizeof(urlsToCheck[0]), [&client, currentPageDomain](std::string const &urlToCheck) {
    if (client.matches(urlToCheck.c_str(), FONoFilterOption, currentPageDomain)) {
      cout << urlToCheck << ": You should block this URL!" << endl;
    } else {
      cout << urlToCheck << ": You should NOT block this URL!" << endl;
    }
  });

  int size;
  // This buffer is allocate on the heap, you must call delete[] when you're done using it.
  char *buffer = client.serialize(&size);
  writeFile("./ABPFilterParserData.dat", buffer, size);

  AdBlockClient client2;
  // Deserialize uses the buffer directly for subsequent matches, do not free until all matches are done.
  client2.deserialize(buffer);
  // Prints the same as client.matches would
  std::for_each(urlsToCheck, urlsToCheck + sizeof(urlsToCheck) / sizeof(urlsToCheck[0]), [&client2, currentPageDomain](std::string const &urlToCheck) {
    if (client2.matches(urlToCheck.c_str(), FONoFilterOption, currentPageDomain)) {
      cout << urlToCheck << ": You should block this URL!" << endl;
    } else {
      cout << urlToCheck << ": You should NOT block this URL!" << endl;
    }
  });
  delete[] buffer;
  return 0;
}

Util for checking URLs

  • Basic checking a URL: node scripts/check.js --host www.cnet.com --location https://s0.2mdn.net/instream/html5/ima3.js
  • Checking a URL with discovery: node scripts/check.js --host www.cnet.com --location "https://slashdot.org?t=1&ad_box_=2" --discover
  • Checking a URL against a particular adblock list: node scripts/check.js --uuid 03F91310-9244-40FA-BCF6-DA31B832F34D --host slashdot.org --location https://s.yimg.jp/images/ds/ult/toppage/rapidjp-1.0.0.js
  • Checking a URL from a loaded DAT file: node scripts/check.js --dat ./out/SafeBrowsingData.dat --host excellentmovies.net --location https://excellentmovies.net
  • Checking a list of URLs: node scripts/check.js --host www.cnet.com --list ./test/data/sitelist.txt
  • Checking a list of URLS with discovery: node scripts/check.js --host www.cnet.com --list ./test/data/sitelist.txt --discover

Developing brave/ad-block

  1. Clone the git repository from GitHub:

    git clone --recursive https://github.com/brave/ad-block

  2. Open the working directory:

    cd ad-block

  3. Install the Node (v5+) dependencies:

    npm install

  4. Install ninja:

    MAC
      brew install ninja
    
    WINDOWS

    Go to the releases page of the Ninja build tool, and download a suitable binary for Windows. Place ninja.exe in a suitable spot. For example, C:\Ninja. Now make sure that CMake can find ninja.exe by adding C:\Ninja to your %PATH%.

Make the node module

make

Running sample (which also generates a .dat file for deserializing)

make sample

Running tests

make test

Clearing build files

make clean

ad-block's People

Contributors

01abhay avatar ali-idrizi avatar bbondy avatar bridiver avatar bsclifton avatar darkdh avatar dependabot[bot] avatar diracdeltas avatar emerick avatar farrokhi avatar fczuardi avatar fmarier avatar garvankeeley avatar hferreiro avatar iefremov avatar jacalz avatar jumde avatar khady avatar lukemulks avatar mihaiplesa avatar pes10k avatar rht avatar samartnik avatar sentialx avatar sergeyzhukovsky avatar snyderp avatar srirambv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ad-block's Issues

Rules starting with * aren't handled properly

*/b/ss/*&aqe=$image,redirect=1x1-transparent.gif rule in the unbreak list is causing problems for some reason by wrongly detecting https://i.ytimg.com/vi/hxUAntt1z2c/hqdefault.jpg?custom=true&w=320&h=180&stc=true&jpg444=true&jpgq=90&sp=68&sigh=YNApXAOpSSoeEmCpXSLQwjnOdwY and other things. I think probably because of the starting *.

Trie might be a better choice to achieve domainList

I read the codes of domainList in filter(.h|.cpp), eg: example.com | ~ foo.example.com, domainList will store all domains, and takes O(n * m) time during matching. Based on the characteristics of the domain,
Trie might be a better choice to replace domainList,it can save a lot of memory and matching time.

PTAL, thanks.

time.com not loading content

This resource is getting block: see 2 urls below
The context domain is: http://www.time.com
The type of request is: set to FONoFilterOption
Expected: It doesn’t block the content on the page
Actual: It does block. If I whitelist s1.wp.com/_static then the site loads

https://s1.wp.com/_static/??-eJyVkEESwjAIRS9kxdqqK8ezZCqNZEjCFKr29qY3kA0L5r0P8+Ej3VSLYTGwF2ZUeJOAUcbzqR8hKTxJDaTyNhNzx3UKrFaXEPGY9AD/BvAaqahHWY2YbPMo+2IHZ4ouDbNwMHS9J2Exal24DsVvwx/53o+X4XYd2kw/w1iKoA==

https://s1.wp.com/_static/??-eJyV0NtOBCEMBuAXkql7UK+Mz1KHzk5JC0jBFZ/e3YneGLORm4aUfH/Twjm7OcVKsUJdScngnTNUVtrf744QDDxb3RrOL3kKdgcjxoQ92ZrOwxLzv6YJvxYsHTT5JpfPSijcFKqf3ff7d4w2l6WdOBrs3TUsbJkOI0qvPNuNuT9Q8LM7SeivOLw1Kn2yFLFMynF4V6GlFmQZhr5HVJ5XQk9lWK9JKeOJhuHCH3TrSn8rxe00L/q8Oz4cnh4Plxq+ALAt5+Y=

No element hiding support?

It seems that ad-blocking does not support element hiding but just allow/prevent from resources to be loaded. Is it correct? If yes are there any limitations preventing from implementing it (one need to evaluate javascript on page loaded for this)?

AdBlockClient::deserialize may return true on bad inputs, instead of false

Due to a bug in iOS when trying SafeBrowsing 2, this was passed in to deserialize(), which then returned true, indicating the rules were parsed.

(It is a very minor problem as iOS should have been checking for HTTP error code first)

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>4E30A0E337655BBD</RequestId><HostId>x9aF0xlegZCmBKh9sLjUQDyR9C07MaUBhFytutVsHaZQHNRFNVzJS3w5kCTMkC1CZ4coEIaZ3G0=</HostId></Error>\r\n0\r\n\r\n

Google search sponsored hit blocked

After a google search, the sponsored top hit won't load (which appears as the first result sporadically in a google search, not sure of why this only shows sometimes). In this case searching for 'nytimes'
This resource getting blocked: see urls below
The context domain is: www.google.com
The type of request is: set to FONoFilterOption
Expected: It doesn’t block the page loading
Actual: page loading is blocked

https://www.google.com/aclk?sa=l&ai=CCnghNL-qVu78CoWUpAOn34ngD9O0gqQIi-CHz7EBu9Tsyf0BCAAQASCz-P4YYP2gmYHoA6AB1bu10wPIAQGqBCRP0OIa5qwwJWPYIATnb57z5N0U0vDU6Qr3HAOoB1EcoQK0FtvYBgSAB5PEyiyIBwGQBwKoB6a-G9gHAQ&sig=AOD64_3BeRm7DcIoCeQItqMFDSg_RosM7Q&clui=0&q=&ved=0ahUKEwj6taSg7s3KAhXGvYMKHXvsBRoQ0QwIGg&adurl=http://5195.xg4ken.com/trk/v1%3Fprof%3D521%26camp%3D138461%26affcode%3Dkw503631%26kct%3Dgoogle%26kchid%3D7667080588%26cid%3D47590031387%26networkType%3Dsearch%26kdv%3Dt%26criteriaid%3Dkwd-68069042747%26adgroupid%3D9857598707%26campaignid%3D179261027%26locphy%3D9000968%26adpos%3D1t1%26url%3Dhttp://p1673.ic-live.com/redirect%3FcID%3D1673%26campID%3D26%26cdid%3D5263%26ic_key%3Dnytimes%2520international%26ko_key_id%3D521_503631%26ic_eid%3D3%26ic_euid%3D_kenshoo_clickid_%26ic_mid%3D_kenshoo_clickid_%26ic_url%3Dhttp://international.nytimes.com/subscriptions/inyt/lp87JWF.html%3FcampaignId%3D87JWF

easylist underperforming on brave browser.

I have noticed that brave uses Easylist as blocklist, just like Adblock on Chome does.
But when comparing Chrome and Brave using the same list, Brave does not block the same as Chrome. I have included screenshots as documentation.

This is the easylist blocklist on Google Chrome.
easylist-adblockplus-chrome

This is the easylist blocklist on Brave Browser
easylist-adblockplus-brave

the url's of the blocklists Chrome and Brave uses are not the same, but even tho the url's are different, the content seems to be fetched from the same place as the content is the same

Chrome: https://easylist-downloads.adblockplus.org/easylist.txt
Brave: https://easylist.to/easylist/easylist.txt

Both files have a line count of 61438 blocked links.

iOS - Some ad and tracking calls evading ad blocking & tracking protection shields

Moving the iOS blocking issues to this repro for further investigation as advised from the response to the issue filed yesterday. ( https://github.com/brave/browser-ios/issues/647 )

After running some benchmark testing across a handful of domains, we observed quite a few ad and tracking calls being made over network traffic in iOS, that should be covered by Brave ad blocking and tracking protection shields.

These instances only appeared to occur in iOS, as Android was blocking all the ad and tracking requests from the same domain.

Testing took place from an iPad 2 and iPhone 6, both using Brave v1.2.19
Comparisons in Android took place from Nexus 5 (phone) and Nexus 9 (tablet) devices, both running versions 1.0.7, 1.0.8 and 1.0.9 during different test phases.

To rule out anti-ad blockers, and to ensure that what was observed was not due to errors in recording and capturing the sessions, I put a lot of time in yesterday and Sunday night to meticulously perform the following checks:

Check 1: Shields Up & Down traffic comparison checks for iOS devices

-All iOS Shields Down and Shields Up session captures for iOS and Android were reviewed for benchmarking domains tested, to check and determine the degree of ad blocking and tracking protection taking place with shields up.
Result: It was determined that some blocking was taking place as expected, but not all. Ad/tracking events that were observed with shields up were pulled and noted from iPhone and iPad session captures.

Check 2: Safari Comparisons

-An additional check was performed against Safari traffic captured from iPad benchmark testing, and compared against Shields Up & Down captures from the iPad.
Result: iOS Shields Down captures aligned with Safari as expected. Blocking variances were observed in iPad Shields Up session captures as noted above.

Check 3: iOS Shields Up ad/tracking event list compared against Android Shields Up/Down captures from the same benchmark testing domains

-Every iOS ad/tracking event that was pulled and listed from the steps above was checked against both Shields Up and Down session captures for Android tablet and phone.

-There were two instances where two domains appeared to be using (weak) anti-ad blockers with varying levels of effectiveness in iOS and Android. Those ad/tracking events were removed from the list, and will be filed as a separate anti-ad blocking issue from this one.

What remains, is the list below of ad and tracking events that were observed from both the iPad and iPhone with Brave Shields up on the following domains:

I've included which blocking list the ad and tracking events that got past iOS blocking shields are listed on for easy reference:

  • scorecardresearch.com (disconnect.me)
  • imrworldwide.com (disconnect.me)
  • google-analytics.com (disconnect.me)
  • googletagservices.com (disconnect.me, easylist)
  • googlesyndication.com (disconnect.me, easylist)
  • quantserve.com (disconnect.me)
  • teads.tv (disconnect.me, easylist)
  • netshelter.net (disconnect.me, easylist)
  • viglink.com (disconnect.me, easylist)
  • bluekai.com (disconnect.me)
  • bkrtx.com (disconnect.me)
  • dynamicyield.com (easylist)
  • truste.com (disconnect.me, easylist)
  • tubemogul.com (disconnect.me, easylist)
  • sitescout.com (disconnect.me, easylist)
  • sharethrough.com (easylist)

I'm not sure why Android shields are blocking the above domains, but iOS shields are letting them get by. There is some blocking successfully taking place in iOS, but I don't know exactly why it's not matching Android.

Is there any chance that the update to move the blocking and tracking shields within the brave org acct could have caused what has been observed, if it took place between iOS app market release updates?

I can provide CSV exports from the traffic sessions captured if that would be helpful as well.

BloomFilter.h: No such file or directory

I am getting this error while I am trying to install the package from npm

make: Entering directory `/path/to/node/node_modules/abp-filter-parser-cpp/build'
CXX(target) Release/obj.target/abp-filter-parser-cpp/addon.o
In file included from ../ABPFilterParser.h:9:0,
from ../ABPFilterParserWrap.h:12,
from ../addon.cpp:7:
.././filter.h:12:25: fatal error: BloomFilter.h: No such file or directory
#include "BloomFilter.h"
^
compilation terminated.

Mobile website problem: http://m.espn.com/ncb/bracketology?src=desktop

We block that huge resource, probably we should allow to load espncdn.com domain in espn.com:

http://a.espncdn.com/combiner/c?v=1.0.2&css=m/reset.css,m/fonts.css,m/base.css,m/layout/body.css,m/layout/navigation.css,m/layout/footer.css,m/layout/hidepageshell.css,m/modules/forms.css,m/modules/filters.css,m/modules/tables.css,m/modules/images.css,m/modules/icons.css,m/modules/media.css,m/modules/legacy.css,m/modules/overlays.css,m/modules/expander.css,m/modules/module.css,m/modules/subsection.css,m/modules/pagination.css,m/modules/ads.css,m/modules/ads.popup.css,m/modules/sponsored.css,m/modules/myespnPanel.css,m/modules/inline-nav.css,m/modules/zebra-links.css,m/modules/mem.css,m/modules/handset-button-controls.css,m/modules/p13n.css,m/modules/featured-columnist.css,m/modules/date-picker.css,m/modules/photogallery.css,m/modules/playersform.css,m/modules/poll.css,m/modules/rankings.css,m/modules/scoreboard-carousel.css,m/modules/sportsnation.css,m/modules/paginatedModule.css,m/modules/standings.css,m/modules/stats-table.css,m/modules/story.css,m/modules/storypage.css,m/modules/insider.css,m/modules/video.css,m/modules/watchespn.css,m/modules/btn-toggle-tablet.css,m/modules/add2home.r2.css,m/modules/foresee.css,m/modules/tabs.css,m/modules/share.css,m/modules/facts.css,m/modules/bites.css,m/modules/weekendwatch.css,m/modules/pickcenter.css,m/themes/sports.css,m/themes/games.css,m/themes/local.css,m/sprite.css,m/layout/device.css,m/page/deportes/redirect.css,m/modules/conversations.css,m/modules/accordion.css,m/page/video/videoPlayer.css,m/modules/nflnation.css,m/modules/teams.r9.css,m/page/embed/embed.css,m/modules/freshmanfocus.css,m/modules/tidbits_module.css,m/modules/d_image_module.css,m/page/jquery.smartbanner.css

failed to build on arm (Samsung Chromebook, Arch Linux)

I am trying to install the Brave browser on a Samsung Chromebook ARM machinne running Arch Linux.

I am using [email protected] and [email protected] as per Brave's documentation, and the installation fails with an error because of abp-filter-parser-cpp, below is the output of me trying to npm install this on an empty folder:

[fcz@alarm test]$ npm install abp-filter-parser-cpp
npm WARN deprecated [email protected]: This package has been renamed. Use lodash.padend@^4.0.0.

> [email protected] preinstall /home/fcz/test/node_modules/.staging/abp-filter-parser-cpp-a411e4a9
> npm install bloom-filter-cpp && npm install hashset-cpp

npm WARN deprecated [email protected]: This package has been renamed. Use lodash.padend@^4.0.0.
npm ERR! Linux 3.8.11-3-ARCH
npm ERR! argv "/home/fcz/.nvm/versions/node/v5.6.0/bin/node" "/home/fcz/.nvm/versions/node/v5.6.0/bin/npm" "install" "bloom-filter-cpp"
npm ERR! node v5.6.0
npm ERR! npm  v3.6.0

npm ERR! Cannot read property 'target' of null
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /home/fcz/test/node_modules/.staging/abp-filter-parser-cpp-a411e4a9/npm-debug.log
/home/fcz/test
`-- (empty)

npm WARN enoent ENOENT: no such file or directory, open '/home/fcz/test/package.json'
npm WARN test No description
npm WARN test No repository field.
npm WARN test No README data
npm WARN test No license field.
npm ERR! Linux 3.8.11-3-ARCH
npm ERR! argv "/home/fcz/.nvm/versions/node/v5.6.0/bin/node" "/home/fcz/.nvm/versions/node/v5.6.0/bin/npm" "install" "abp-filter-parser-cpp"
npm ERR! node v5.6.0
npm ERR! npm  v3.6.0
npm ERR! code ELIFECYCLE

npm ERR! [email protected] preinstall: `npm install bloom-filter-cpp && npm install hashset-cpp`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] preinstall script 'npm install bloom-filter-cpp && npm install hashset-cpp'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the abp-filter-parser-cpp package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     npm install bloom-filter-cpp && npm install hashset-cpp
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs abp-filter-parser-cpp
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls abp-filter-parser-cpp
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/fcz/test/npm-debug.log
npm ERR! code 1

Installation fails

On Lubuntu 15.10 with node -v 5.5.0 and nodejs -v 5.11.0, npm install fails.

make: Entering directory '/home/test/browser-laptop/node_modules/abp-filter-parser-cpp/build'
  CXX(target) Release/obj.target/abp-filter-parser-cpp/addon.o
In file included from ../ABPFilterParser.h:9:0,
                 from ../ABPFilterParserWrap.h:12,
                 from ../addon.cpp:7:
.././filter.h:12:25: fatal error: BloomFilter.h: : No such file or directory
compilation terminated.
abp-filter-parser-cpp.target.mk:102: recipe for target 'Release/obj.target/abp-filter-parser-cpp/addon.o' failed
make: *** [Release/obj.target/abp-filter-parser-cpp/addon.o] Error 1

It says BloomFilter.h is missing, and this error seems to block building Brave.

Clickbait: Assess & Update

To help keep pace with clickbait aggregators, we need to double check the blocklists for known vendors, and update the lists with re-branded vendors.

This will help with auto-exclusions for the ledger.

There are a couple that have been casually observed which appear to be Outbrain or Taboola, under a different brand name.

  • Will furnish a list of current aggregators.
  • Cross reference against Easylist
  • Update as needed
  • Make a sweep of destination URLs that may not be blocked
  • Cross reference against Easylist
  • Update as needed

Don't block js load aggregator, filter out specific url arguments

ca.yahoo.com uses https://s.yimg.com/zz/combo
as a js load aggregator. Some of the arguments are ok (and required for page function) and some are ad loading js and should be blocked. We currently block the entire URL, as APB doesn't have filtering logic to remove bad parts of URLs such as this.

The full url has ~20 arguments each is a js script. We need to split the arguments, determine which should be blocked, and then return the sanitized URL.

( Followup for https://github.com/brave/browser-ios/issues/89 )

Here is the full URL:

https://s.yimg.com/zz/combo?os/mit/td/td-applet-livevent-0.1.158/td-livevent-mainview/td-livevent-mainview-min.js&os/mit/td/td-applet-livevent-0.1.158/td-applet-livevent-templates-main/td-applet-livevent-templates-main-min.js&os/mit/td/stencil-3.1.0/stencil-gallery/stencil-gallery-min.js&os/mit/td/ape-af-0.0.326/ape-af-lang-strings_en-ca/ape-af-lang-strings_en-ca-min.js&os/mit/td/ape-location-1.0.9/ape-location-lang-strings_en-ca/ape-location-lang-strings_en-ca-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-ads-model/td-ads-model-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-viewer-ads/td-viewer-ads-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-viewer-slideshow/td-viewer-slideshow-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-fallback/td-applet-viewer-templates-fallback-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-footer/td-applet-viewer-templates-footer-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-debug/td-applet-viewer-templates-debug-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-cards/td-applet-viewer-templates-cards-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-carousel/td-applet-viewer-templates-carousel-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-lightbox/td-applet-viewer-templates-lightbox-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-main/td-applet-viewer-templates-main-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-share_btns_mega/td-applet-viewer-templates-share_btns_mega-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-header/td-applet-viewer-templates-header-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-ads_story/td-applet-viewer-templates-ads_story-min.js&os/mit/td/td-applet-viewer-0.1.2082/td-applet-viewer-templates-mag_slideshow/td-applet-viewer-templates-mag_slideshow-min.js```

Not works with current nodejs version

Uncaught Exception:
Error: The module '/.../ad-block/build/Release/ad-block.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 51. This version of Node.js requires
NODE_MODULE_VERSION 53. Please try re-compiling or re-installing

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.