! Zephium's own filter rules, reviewed and shipped with the app and compiled
! after the downloaded lists wherever requests carry their page; see
! docs/adblock.md. This list never adds a block: it holds exceptions, and
! calls to Zephium's own scriptlets, which no downloaded list can make.

! Ad recovery. These sites probe AdSense's loader, as a script and with fetch;
! when it is blocked they start a recovery that re-serves the same ads through
! rotating proxy hosts (html-load.com, content-loader.com, magicalblouse.com),
! and blocking the recovery replaces the page with an "allow ads" wall. Letting
! this one file load keeps the recovery idle, while the ads it would request
! stay blocked. EasyList carries the same exception for other sites. Evidence:
! requests to the recovery hosts in 45 s of one article in WebKit with the
! bundled lists, without and with the exception (protection off: 2 or 3).

! allrecipes.com, 2026-11-03: 710 recovery requests, 2 with the exception.
@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$domain=allrecipes.com
! bild.de, 2026-11-03: 47 recovery requests, 2 with the exception.
@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$domain=bild.de
! mirror.co.uk, 2026-11-03: 40 recovery requests, 2 with the exception.
@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$domain=mirror.co.uk
! people.com, 2026-11-03: 305 recovery requests, 2 with the exception.
@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$domain=people.com
! simplyrecipes.com, 2026-11-03: 391 recovery requests, 3 with the exception.
@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$domain=simplyrecipes.com
! tomsguide.com, 2026-11-03: 59 recovery requests, 2 with the exception.
@@||pagead2.googlesyndication.com/pagead/js/adsbygoogle.js^$domain=tomsguide.com

! Ad-Shield, on mirror and tomsguide, also fetches criteo's prebid tag beside
! the loader, and EasyPrivacy blocks it as third party; that starts the same
! recovery. Letting the fetch through, never the tag as a script, keeps it idle.
! Evidence: recovery-host requests in 16 s of the home page in Zephium on
! Windows with the bundled lists, without and with the exception.

! mirror.co.uk, 2026-11-04: 47 and 36 recovery requests, 2 with the exception.
@@||static.criteo.net/js/ld/publishertag.prebid.js^$xmlhttprequest,domain=mirror.co.uk
! tomsguide.com, 2026-11-04: 48 and 58 recovery requests, 3 with the exception.
@@||static.criteo.net/js/ld/publishertag.prebid.js^$xmlhttprequest,domain=tomsguide.com

! YouTube holds a video with no buffer before it starts when its ads are
! blocked, unless the player's client carries one of the markers uBlock
! Origin's quick fixes key their player-request edits on; those edits come
! from the quick fixes themselves. Markers in order; the hold as the player's
! stats show it, unless a server-inserted ad is playing; how long a hold lasts
! before the next marker; a Premium page, which is never marked; and the text
! of the playability error YouTube shows a blocker; and the tag the quick
! fixes' referer edit leaves in the response's tracking URL, without which a
! hold is on data no marker reached and is retried once with the same marker;
! and the player event that announces a hold, which ends the wait at once.
! A marker no admitted quick fix edits on and strips is left out when compiling.
! Evidence, 2026-11-06, 5 videos x 5 runs, macOS: Brave marked 18/18 not held,
! unmarked 7/7 held; Zephium unmarked 25/25 held, stall median 8.5 s. On a
! direct load the first quick-fix marker, channel, was held in every run and
! lactmilli never (Brave 28/28 runs ended on lactmilli), so lactmilli comes
! first. The player raised onSnackbarMessage at every hold the listener was on
! in time (7 of 9 loads, the other 2 before it attached), about 1.5 s before
! the poll acted, and never on a load that played.
www.youtube.com##+js(zephium-player-marker, lactmilli channel yahi inline, buffer_health_seconds=0.00 s|resolution=0x0, debug_info^=SSAP\, AD, 1000, ytInitialData.topbar.desktopTopbarRenderer.logo.topbarLogoRenderer.iconImage.iconType=YOUTUBE_PREMIUM_LOGO, support.google.com/youtube/answer/3037019, playbackTracking.videostatsPlaybackUrl.baseUrl*=reloadxhr, onSnackbarMessage)
