package Ġcom . kp stv . y ts . vpn . db Ċ Ċ import Ġcom . kp stv . y ts . extensions . utils . Ret rofit Utils Ċ import Ġcom . kp stv . y ts . vpn . Vpn Configuration Ċ import Ġorg . js oup . J soup Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠVPN Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġv pn Dao : ĠVPN Dao , ĊĠĠĠ Ġprivate Ġval Ġretrofit Utils : ĠRet rofit Utils Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġip Regex Ġ= Ġ"\\ d { 1 , 3 }\\ .\\ d { 1 , 3 }\\ .\\ d { 1 , 3 }\\ .\\ d { 1 , 3 }". to Regex () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdate Formatter Ġ= ĠSimpleDateFormat (" yyyy MM dd HH mm ss ", ĠLocale . US ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġformat Expire Time ( expire Time : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Formatter . parse ( expire Time . toString ()) ?. to GMT String () Ġ?: Ġexpire Time . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unknown " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġfetch (): ĠList < Vpn Configuration > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Ġ= Ġfetch From Local () ĊĠĠĠĠĠĠĠ Ġval Ġoffset Date Ġ= Ġdate Formatter . format ( Calendar . getInstance (). time ). to Long () ĊĠĠĠĠĠĠĠ Ġif Ġ( local . isNotEmpty () Ġ&& Ġoffset Date Ġ< Ġlocal . first (). expire Time ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnetwork Ġ= Ġfetch From Network () ĊĠĠĠĠĠĠĠ Ġval Ġsorted Ġ= Ġnetwork . sorted By Descending Ġ{ Ġit . speed . replace (",", Ġ""). toFloat () Ġ}. sub List ( 0 , Ġmin Of ( 3 , Ġnetwork . size )). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( premium Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ}. union ( network ). distinct By Ġ{ Ġit . ip Ġ} ĊĠĠĠĠĠĠĠ Ġv pn Dao . insert All ( sorted ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsorted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch From Local (): ĠList < Vpn Configuration > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġv pn Dao . getAll () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch From Network (): ĠList < Vpn Configuration > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv pn Configurations Ġ= Ġarray ListOf < Vpn Configuration >() ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv pn Response Ġ= Ġretrofit Utils . make Http Call Async (" https :// www . v png ate . net / en "). get OrNull () Ġ?: Ġreturn Ġv pn Configurations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vpn Response . is Successful ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset DateTime Ġ= ĠCalendar . getInstance (). apply Ġ{ Ġadd ( Calendar . HOUR _ OF _ DAY , Ġ 7 ) Ġ}. time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpired Time Ġ= Ġdate Formatter . format ( offset DateTime ). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġv pn Response . body ?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv pn Response . close () Ġ// Ġclose ĠStream ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup . parse ( body ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġdoc . getElementById (" v png ate _ inner _ contents _ td "). children (). find Last Ġ{ Ġit . id () Ġ== Ġ" vg _ hosts _ table _ id " Ġ} ?. child ( 0 ) Ġ?: Ġreturn Ġv pn Configurations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv pn Configurations . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Iteration Ġ= Ġmin Of ( 7 , Ġtable . children Size ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġtable . children Size ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vpn Configurations . size Ġ>= Ġmax Iteration ) Ġreturn Ġv pn Configurations ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtr Ġ= Ġtable . child ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tr . getElementsBy Class (" vg _ table _ header "). size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageUrl Ġ= Ġtr . child ( 0 ). child ( 0 ). attr (" src "). replace ("../ ", Ġ" https :// www . v png ate . net /") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcountry Ġ= Ġtr . child ( 0 ). text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( country Ġ== Ġ" Reserved ") Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġmore Ġthan Ġ 3 Ġcountries .... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vpn Configurations . count Ġ{ Ġit . country Ġ== Ġcountry Ġ} Ġ== Ġ 3 ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip Ġ= Ġip Regex . find ( tr . child ( 1 ). html ()) ?. value Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsessions Ġ= Ġtr . child ( 2 ). child ( 0 ). child ( 0 ). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu ptime Ġ= Ġtr . child ( 2 ). child ( 2 ). text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspeed Ġ= Ġtr . child ( 3 ). child ( 0 ). child ( 0 ). text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( speed Ġ== Ġ" 0 . 0 0 ĠM bps ") Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo vpn Config Element Ġ= Ġtr . child ( 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ov pn Config Element . children Size () Ġ== Ġ 0 ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Ġ= Ġtr . child ( tr . children Size () Ġ- Ġ 1 ). child ( 0 ). child ( 0 ). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (", ","" ). to Long () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Url Ġ= Ġ" https :// www . v png ate . net / en /" Ġ+ Ġo vpn Config Element . child ( 0 ). attr (" href ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Response Ġ= Ġretrofit Utils . make Http Call Async ( config Url ). get OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Response ?. is Successful Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Body Ġ= Ġconfig Response . body ?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Response . close () Ġ// ĠAlways Ġclose Ġstream ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhref Elements Ġ= ĠJ soup . parse ( config Body ). getElementsBy Attribute (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo vpn Config Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhref Elements . find Ġ{ Ġit . attr (" href "). contains (". ov pn ") Ġ} ?. attr (" href ") Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Data Response Ġ= Ġretrofit Utils . make Http Call Async (" https :// www . v png ate . net /$ ov pn Config "). get OrNull () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Data Response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġconfig Data Response . body ?. string () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Data Response . close () Ġ// ĠAlways Ġclose Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv pn Config Ġ= ĠV pn Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Country ( country ), ĠimageUrl , Ġip , Ġsessions , Ġu ptime , Ġspeed . replace (" Mb ps ", Ġ""). trim (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata , Ġscore , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpired Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv pn Configurations . add ( vpn Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġv pn Configurations ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Country ( country : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġct Ġ= Ġcountry ĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ Ġct Ġ= Ġct . replace ( it , Ġ"") Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġct . trim () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlist Ġ= ĠlistOf (" Federation ", Ġ" Re public Ġof ") Ċ }