package Ġru . bre ffi . story id . profile . util Ċ Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Response Ċ import Ġru . bre ffi . story id . profile . model . internal . Api Result Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . locks . Lock Ċ Ċ internal Ġfun Ġ< T > ĠCall < T >. get (): ĠApi Result < T >? Ġ{ ĊĠĠĠ Ġval Ġresponse Ġ= Ġexecute () ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse . is Successful Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Result ( response . body ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresponse . code () Ġ== Ġ 4 0 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Result ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġnew Id (): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠUUID . randomUUID (). toString () Ċ } Ċ Ċ internal Ġfun Ġdata Is Up ToDate ( db Timestamp : ĠLong ?, Ġserver Timestamp : ĠLong ?): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġdb Timestamp Ġ!= Ġnull Ġ&& Ġserver Timestamp Ġ!= Ġnull Ġ&& Ġdb Timestamp Ġ== Ġserver Timestamp Ċ } Ċ Ċ internal Ġfun Ġ< T > Ġwith Locks ( var arg Ġlocks : ĠLock , Ġaction : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġlocks . forEach Ġ{ Ġit . lock () Ġ} ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġaction () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġlocks . reversed (). forEach Ġ{ Ġit . unlock () Ġ} ĊĠĠĠ Ġ} Ċ }