/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 - 2 0 1 9 ĠH az uki Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġjp . h az uki . y uz ub rowser . ad block . filter . ab p Ċ Ċ import Ġcom . google . re 2 j . Pattern Ċ import Ġjp . h az uki . y uz ub rowser . ad block .* Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified .* Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . element . Element Filter Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . element . Element Hide Filter Ċ import Ġjp . h az uki . y uz ub rowser . ad block . filter . unified . element . Exclude Element Filter Ċ import Ġjp . h az uki . y uz ub rowser . core . utility . extensions . forEach Line Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . Charset Ċ import Ġcom . google . re 2 j . Pattern Syntax Exception Ġas ĠRe 2 Pattern Syntax Exception Ċ import Ġjava . util . regex . Pattern Syntax Exception Ġas ĠJ vm Pattern Syntax Exception Ċ Ċ class ĠAb p Filter Decoder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcontent Regex Ġ= ĠPattern . compile ( CONTENT _ FILTER _ REGEX ) ĊĊĠĠĠ Ġfun Ġcheck Header ( reader : ĠBufferedReader , Ġcharset : ĠCharset ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreader . mark ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( charset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChar sets . UTF _ 8 , ĠChar sets . UTF _ 1 6 , ĠChar sets . UTF _ 1 6 LE , ĠChar sets . UTF _ 1 6 BE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reader . read () Ġ== Ġ 0 xfe ff ) Ġ{ Ġ// ĠSkip ĠB OM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . mark ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġreader . readLine () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( header . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( header [ 0 ] Ġ== Ġ' !') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader . startsWith ( HEADER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( On Redirect Exception :: class ) ĊĠĠĠ Ġfun Ġdecode ( reader : ĠBufferedReader , Ġurl : ĠString ?): ĠUn ified Filter Set Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠDecoder Info () ĊĠĠĠĠĠĠĠ Ġval Ġblack Ġ= Ġmutable ListOf < Unified Filter >() ĊĠĠĠĠĠĠĠ Ġval Ġwhite Ġ= Ġmutable ListOf < Unified Filter >() ĊĠĠĠĠĠĠĠ Ġval Ġwhite Page Ġ= Ġmutable ListOf < Unified Filter >() ĊĠĠĠĠĠĠĠ Ġval Ġelement Filter Ġ= Ġmutable ListOf < Element Filter >() ĊĠĠĠĠĠĠĠ Ġreader . forEach Line Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isEmpty ()) Ġreturn @ forEach Line ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrimmed Line Ġ= Ġline . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Line [ 0 ] Ġ== Ġ' !' Ġ-> Ġtrimmed Line . decode Comment ( url , Ġinfo )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOn Redirect Exception ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġcontent Regex . matcher ( trimmed Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Content Filter ( matcher . group ( 1 ), Ġmatcher . group ( 2 ), Ġmatcher . group ( 3 ), Ġelement Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrimmed Line . decode Filter ( black , Ġwhite , Ġwhite Page ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠUn ified Filter Set ( info , Ġblack , Ġwhite , Ġwhite Page , Ġelement Filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Content Filter ( ĊĠĠĠĠĠĠĠ Ġdomains : ĠString ?, ĊĠĠĠĠĠĠĠ Ġtype : ĠString ?, ĊĠĠĠĠĠĠĠ Ġbody : ĠString , ĊĠĠĠĠĠĠĠ Ġelement Filter List : ĠMutable List < Element Filter >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ"@ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domains Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain List Ġ= Ġdomains . split To Sequence (',') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . trim () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġit . startsWith (' ~ ') Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Filter List . add ( Exclude Element Filter ( body . trim (), Ġdomain List )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġnull Ġ&& Ġtype . isNotEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġelement Filter List . add ( Element Hide Filter ( body , Ġdomains ?. domains To Domain Map (',' ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . decode Filter ( black List : ĠMutable List < Unified Filter >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhite List : ĠMutable List < Unified Filter >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage White List : ĠMutable List < Unified Filter >) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠcontentType Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġignore Case Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġxml HttpRequest Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġdomain : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġthird Party Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġfilter Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġval Ġblocking Ġ= Ġif Ġ( filter . startsWith (" @@ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġsubstring ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoptions Index Ġ= Ġfilter . lastIndexOf ('$ ') ĊĠĠĠĠĠĠĠ Ġif Ġ( options Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . substring ( options Index Ġ+ Ġ 1 ). split (',' ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoption Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseparator Index Ġ= Ġoption . indexOf (' =') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( separator Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġoption . substring ( separator Index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption Ġ= Ġoption . substring ( 0 , Ġseparator Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option . isEmpty ()) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinverse Ġ= Ġoption [ 0 ] Ġ== Ġ'~ ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inverse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption Ġ= Ġoption . substring ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption Ġ= Ġoption . toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġoption . getOption Bit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== Ġ- 1 ) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġif Ġ( inverse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contentType Ġ== Ġ 0 ) ĠcontentType Ġ= Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġand Ġ( type . inv ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġor Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( option ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" match - case " Ġ-> Ġignore Case Ġ= Ġinverse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" domain " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" third - party " Ġ-> Ġthird Party Ġ= Ġif Ġ( inverse ) Ġ 0 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" site key " Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġfilter . substring ( 0 , Ġoptions Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdomains Ġ= Ġdomain ?. domains To Domain Map ('| ') ĊĠĠĠĠĠĠĠ Ġif Ġ( contentType Ġ== Ġ 0 ) ĠcontentType Ġ= Ġ 0 xffff ĊĊĠĠĠĠĠĠĠ Ġval Ġab p Filter Ġ= Ġif Ġ( filter . length Ġ>= Ġ 2 Ġ&& Ġfilter [ 0 ] Ġ== Ġ'/' Ġ&& Ġfilter [ filter . last Index ] Ġ== Ġ'/') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Regex Filter ( filter , ĠcontentType , Ġignore Case , Ġdomains , Ġthird Party ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis StartsWith Ġ= Ġfilter . startsWith (" || ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis End With Ġ= Ġfilter . endsWith (' ^ ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġfilter . substring ( if Ġ( is StartsWith ) Ġ 2 Ġelse Ġ 0 , Ġif Ġ( is End With ) Ġfilter . length Ġ- Ġ 1 Ġelse Ġfilter . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Literal Ġ= Ġcontent . is Literal Filter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis StartsWith Ġ&& Ġis End With Ġ-> ĠStart End Filter ( content , ĠcontentType , Ġignore Case , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis StartsWith Ġ-> ĠStart sWith Filter ( content , ĠcontentType , Ġignore Case , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis End With Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern Match Filter ( filter , ĠcontentType , Ġignore Case , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnd With Filter ( content , ĠcontentType , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignore Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern Match Filter ( filter , ĠcontentType , Ġignore Case , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContains Filter ( content , ĠcontentType , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern Match Filter ( filter , ĠcontentType , Ġignore Case , Ġdomains , Ġthird Party ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( blocking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblack List . add ( ab p Filter ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contentType . and ( AD _ BLOCK _ DOCUMENT ) Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage White List . add ( ab p Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhite List . add ( ab p Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . domains To Domain Map ( delimiter : ĠChar ): ĠDomain Map ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġsplit ( delimiter ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( items . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items [ 0 ][ 0 ] Ġ== Ġ'~ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle Domain Map ( false , Ġitems [ 0 ]. substring ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle Domain Map ( true , Ġitems [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomains Ġ= ĠArray Domain Map ( items . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ Ġdomain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domain . isEmpty ()) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domain [ 0 ] Ġ== Ġ'~ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomains [ domain . substring ( 1 )] Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomains [ domain ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomains . include Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomains ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . is Literal Filter (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ ĠforEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'*', Ġ'^ ', Ġ' |' Ġ-> Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . getOption Bit (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" other ", Ġ" x bl ", Ġ" dtd " Ġ-> ĠAD _ BLOCK _ OTHER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" script " Ġ-> ĠAD _ BLOCK _ SCRIPT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" image ", Ġ" background " Ġ-> ĠAD _ BLOCK _ IMAGE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" stylesheet " Ġ-> ĠAD _ BLOCK _ STYLE _ SHE ET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sub document " Ġ-> ĠAD _ BLOCK _ SUB _ DOCUMENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" document " Ġ-> ĠAD _ BLOCK _ DOCUMENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" websocket " Ġ-> ĠAD _ BLOCK _ WEB SOCKET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" media " Ġ-> ĠAD _ BLOCK _ MEDIA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" font " Ġ-> ĠAD _ BLOCK _ FONT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" popup " Ġ-> ĠAD _ BLOCK _ POP UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" xml http request " Ġ-> ĠAD _ BLOCK _ XML _ HTTP _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" object ", Ġ" webrtc ", Ġ" csp ", Ġ" ping ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" object - sub request ", Ġ" generic block ", Ġ" elem hide ", Ġ" gener ich ide " Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . decode Comment ( url : ĠString ?, Ġinfo : ĠDecoder Info ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomment Ġ= Ġsplit (': ') ĊĠĠĠĠĠĠĠ Ġif Ġ( comment . size Ġ< Ġ 2 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( comment [ 0 ]. substring ( 1 ). trim (). toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" title " Ġ-> Ġinfo . title Ġ= Ġcomment [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" homepage " Ġ-> Ġinfo . home Page Ġ= Ġcomment [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" last Ġupdated " Ġ-> Ġinfo . last Update Ġ= Ġcomment [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" expires " Ġ-> Ġinfo . expires Ġ= Ġcomment [ 1 ]. trim (). decode Expires () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" version " Ġ-> Ġinfo . version Ġ= Ġcomment [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" redirect " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġredirect Ġ= Ġcomment [ 1 ]. trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url Ġ!= Ġnull Ġ&& Ġurl Ġ!= Ġredirect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġurl ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . decode Expires (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhours Ġ= ĠindexOf (" hours ") ĊĠĠĠĠĠĠĠ Ġif Ġ( hours Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstring ( 0 , Ġhours ). trim (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdays Ġ= ĠindexOf (" days ") ĊĠĠĠĠĠĠĠ Ġif Ġ( days Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstring ( 0 , Ġdays ). trim (). toInt () Ġ* Ġ 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠOn Redirect Exception ( val Ġurl : ĠString ) Ġ: ĠIOException () ĊĊĠĠĠ Ġprivate Ġclass ĠDecoder Info Ġ: ĠUn ified Filter Info ( null , Ġnull , Ġnull , Ġnull , Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġexpires : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġhome Page : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġlast Update : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġtitle : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġvar Ġversion : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHEADER Ġ= Ġ"[ A db lock ĠPlus " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCONTENT _ FILTER _ REGEX Ġ= Ġ"^ ([^ /* |@ \" ! ]* ?) # ([ @ ?\ $ ]) ? # (. +)\ $" ĊĠĠĠ Ġ} Ċ } Ċ