package Ġcom . ba ul supp . ok url . services . github Ċ Ċ import Ġcom . ba ul supp . ok url . Main Ċ import Ġcom . ba ul supp . ok url . auth enticator . credentials Ċ import Ġcom . ba ul supp . ok url . completion . Api Comp leter Ċ import Ġcom . ba ul supp . ok url . completion . Url List Ċ import Ġcom . ba ul supp . ok url . credentials . Credentials Store Ċ import Ġcom . ba ul supp . ok url . credentials . Default Token Ċ import Ġcom . ba ul supp . ok url . credentials . Token Ċ import Ġcom . ba ul supp . ok url . kotlin . execute Ċ import Ġcom . ba ul supp . ok url . kotlin . list Adapter Ċ import Ġcom . ba ul supp . ok url . kotlin . query Ċ import Ġcom . ba ul supp . ok url . kotlin . query List Ċ import Ġcom . ba ul supp . ok url . kotlin . readString Ċ import Ġcom . ba ul supp . ok url . kotlin . request Ċ import Ġcom . ba ul supp . ok url . openapi . Open Api Comp leter Ċ import Ġcom . ba ul supp . ok url . services . github . model . Repository Ċ import Ġcom . ba ul supp . ok url . services . github . model . User Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Response Ċ Ċ class ĠGithub Api Comp leter ( ĊĠ Ġclient : ĠOk HttpClient , ĊĠ Ġval Ġinterceptor : ĠGithub Auth Interceptor , ĊĠ Ġval Ġcredentials Store : ĠCredentials Store Ċ ) Ġ: ĠApi Comp leter Ġ{ ĊĠ Ġval Ġclient Ġ= Ġclient . newBuilder () ĊĠĠĠ Ġ. add Network Interceptor Ġ{ ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġit . proceed ( it . request ()) ĊĠĠĠĠĠ Ġresponse . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. header (" Cache - Control ", Ġ" max - age = 3 6 0 0 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. build () ĊĊĠ Ġoverride Ġsuspend Ġfun Ġprefix Urls (): ĠUrl List Ġ{ ĊĠĠĠ Ġreturn ĠUrl List . hosts (" api . github . com ", Ġ" uploads . github . com ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġsite Urls ( ĊĠĠĠ Ġurl : ĠHttp Url , ĊĠĠĠ Ġtoken Set : ĠToken ĊĠ Ġ): ĠUrl List Ġ{ ĊĠĠĠ Ġval Ġcomp leter Ġ= ĠOpen Api Comp leter ( ĊĠĠĠĠĠ Ġ" https :// github . com / github / rest - api - description / blob / main / descriptions / api . github . com / api . github . com . yaml ? raw = true ". to Http Url (), ĊĠĠĠĠĠ Ġclient ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠ Ġval Ġrequest Details Ġ= Ġextract ( url ) ĊĊĠĠĠĠĠ Ġval Ġsite Urls Ġ= Ġasync Ġ{ Ġcomp leter . site Urls ( url , ĠDefault Token ) Ġ} ĊĊĠĠĠĠĠ Ġvar Ġurls Ġ= Ġsite Urls . await () ĊĊĠĠĠĠĠ Ġif Ġ( request Details . owner Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġurls Ġ= Ġurls . replace (" owner ", ĠlistOf ( request Details . owner ), Ġkeep Template Ġ= Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Details . repo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġurls Ġ= Ġurls . replace (" repo ", ĠlistOf ( request Details . repo ), Ġkeep Template Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġowner Repos Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Repo Page (" https :// api . github . com / users /${ request Details . owner }/ repos ") ĊĊĠĠĠĠĠĠĠĠĠ Ġurls Ġ= Ġurls . replace (" repo ", Ġowner Repos , Ġkeep Template Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcred Ġ= Ġcredentials ( token Set , Ġinterceptor , Ġcredentials Store ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cred Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġclient . query < User >(" https :// api . github . com / user ", Ġtoken Set Ġ= Ġtoken Set ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġowner Repos Ġ= Ġquery Repo Page (" https :// api . github . com / user / repos ") ĊĊĠĠĠĠĠĠĠĠĠ Ġurls Ġ= Ġurls . replace (" owner ", ĠlistOf ( owner . login ), Ġkeep Template Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠ Ġurls Ġ= Ġurls . replace (" repo ", Ġowner Repos , Ġkeep Template Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġurls ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġquery Repo Page ( url : ĠString ) Ġ= ĊĠĠĠ Ġclient . query Response Pages < Repository >( url ). map Ġ{ ĊĠĠĠĠĠ Ġit . name ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġextract ( url : ĠHttp Url ): ĠRequest Details Ġ{ ĊĠĠĠ Ġreturn ĠRequest Details . from Url ( url . toString ()) ĊĠ Ġ} Ċ } Ċ Ċ suspend Ġinline Ġfun Ġ< re ified ĠT > ĠOk HttpClient . query Response Pages ( ĊĠ Ġurl : ĠString , ĊĠ Ġtoken Set : ĠToken Ġ= ĠDefault Token Ċ ): ĠList < T > Ġ= Ġcoroutine Scope Ġ{ ĊĠ Ġval Ġpage 1 Ġ= Ġexecute ( request ( url , Ġtoken Set )) ĊĊĠ Ġval Ġpage 1 Results Ġ= Ġasync Ġ{ ĊĠĠĠ Ġval Ġstring Ġ= Ġpage 1 . body !!. readString () ĊĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ ĠMain . mos hi . list Adapter < T >(). fromJson ( string ) !! ĊĠ Ġ} ĊĊĠ Ġval Ġrest Ġ= Ġnext Pages ( page 1 ). map Ġ{ ĊĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠ Ġquery List < T >(" $ url ? page =$ it ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġpage 1 Results . await () Ġ+ Ġrest . await All (). flatten () Ċ } Ċ Ċ fun Ġnext Pages ( page 1 : ĠResponse ): ĠList < Int > Ġ{ ĊĠ Ġval Ġlink Ġ= Ġpage 1 . headers [" link "] ĊĊĠ Ġif Ġ( link Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġval Ġrefs Ġ= Ġlink . split (", \\ s +". to Regex ()) ĊĠĠĠ Ġval Ġlast Ġ= Ġrefs . find Ġ{ Ġit . endsWith ("; Ġrel =\" last \" ") Ġ} ĊĊĠĠĠ Ġif Ġ( last Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġval Ġlast Page Ġ= Ġ" page =( \\ d )+ ". to Regex (). find ( last ) ĊĠĠĠĠĠ Ġif Ġ( last Page Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( 2 .. last Page . group Values [ 1 ]. toInt ()). toList () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġreturn ĠlistOf () Ċ } Ċ