package Ġcc . xia ob aic z . safe . model Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Cancellation Signal Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcc . xia ob aic z . safe . R Ċ import Ġcc . xia ob aic z . safe . db . entity . Account Ċ import Ġcc . xia ob aic z . safe . util . Account Helper Ċ import Ġcc . xia ob aic z . safe . util . Cipher Helper Ċ import Ġcc . xia ob aic z . safe . util . G SON Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġorg . apache . commons . csv . CSV Format Ċ import Ġorg . apache . commons . csv . CSV Printer Ċ import Ġjava . io .* Ċ import Ġkotlin . coroutines . resume Ċ Ċ class ĠBackup ViewModel Ġ: ĠBase Observable ViewModel () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯Ĩçłģ åĪĿå§ĭåĮĸ æĹ¶ éľĢè¦ģ èµĭåĢ¼ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġpassword Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯Ĩçłģ æĸĩä»¶ å¯¼åħ¥ æĹ¶çļĦ å¯Ĩçłģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfile Password Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġåı¯ çĶ¨ çĬ¶æĢģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbusy Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Boolean >( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// åı¯çĶ¨ çĬ¶æĢģ ĊĠĠĠ Ġval Ġis Busy Ġget () Ġ= Ġbusy . value Ġ?: Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åħ¥ ç»ĵæŀľ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġimport Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Exception ?> () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åĩº ç»ĵæŀľ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġexport Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Exception ?> () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åħ¥ CSV ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġimport CSV ( context : ĠContext , Ġdata : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¹ ģ å¿ Ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġget FD ( context , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è§£æŀĲ CSV ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccounts Ġ= Ġanalyze CSV ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¿ĿåŃĺ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave ( context , Ġaccounts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport . post Value ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç©º éĹ ² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åħ¥ PW ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġimport PW ( context : ĠContext , Ġdata : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¹ ģ å¿ Ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġget FD ( context , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¯»åıĸ æĸĩä»¶ åĨħå®¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġread All ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è§£æŀĲ å¯Ĩ æĸĩ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccounts Ġ= Ġanalyze PW ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĢļè¿ĩ æĸĩä»¶ å¯Ĩçłģ è§£ å¯Ĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccounts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġ 0 Ġ// éĩį ç½® id Ġ éĺ² æŃ¢ åĨ² çªģ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . domain Ġ= ĠCipher Helper . aes De cipher ( it . domain , Ġfile Password ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . account Ġ= ĠCipher Helper . aes De cipher ( it . account , Ġfile Password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . password Ġ= ĠCipher Helper . aes De cipher ( it . password , Ġfile Password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è§£ å¯Ĩ å¼Ĥå¸¸ ï¼Į å¯Ĩçłģ éĶĻè¯¯ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport . post Value ( File Password Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¿ĿåŃĺ æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave ( context , Ġaccounts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport . post Value ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç©º éĹ ² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è¯»åıĸ æĸĩä»¶ åħ¨éĥ¨ åĨħå®¹ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġread All ( fd : ĠFile Descriptor ) Ġ= Ġsuspend C ancellable Coroutine < String > Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Buff Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= ĠByteArray ( 1 0 2 4 ) Ġ// ç¼ĵ åĨ² åĮº ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize : ĠInt Ġ// ç¼ĵ åĨ² åĮº åı¯çĶ¨ å¤§å°ı ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( fd ). use Ġ{ Ġfin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered InputStream ( fin ). use Ġ{ Ġbin Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġbin . read ( buff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Buff . write ( buff , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġbin . read ( buff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( byte Buff . toString ( Charsets . UTF _ 8 . name ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æł¡éªĮ è¾ĵåħ¥ ĊĠĠĠ Ġprivate Ġfun Ġcheck ( uri : ĠUri ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// èİ·åıĸ æĸĩä»¶ æııè¿° ç¬¦ Ġé»ĺè®¤ åıª è¯» æ¨¡å¼ı ĊĠĠĠ Ġprivate Ġfun Ġget FD ( context : ĠContext , Ġuri : ĠUri ?, Ġmode : ĠString Ġ= Ġ" rw "): ĠFile Descriptor Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! check ( uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException ( context . getString ( R . string . exception _ file _ not _ found )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . content Resolver . open FileDescriptor ( uri !! , Ġmode , ĠC ancellation Signal ()) ?. file Descriptor Ġ?: Ġthrow ĠFileNotFoundException ( context . getString ( R . string . exception _ file _ open _ fail d )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// CSV æŀĲ æŀĦ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġanalyze CSV ( fd : ĠFile Descriptor ) Ġ= Ġsuspend C ancellable Coroutine < List < Account >> Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccounts Ġ= ĠArrayList < Account >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileReader ( fd ). use Ġ{ Ġf read Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCSV Format . EX CEL . parse ( f read ). use Ġ{ Ġcsv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcsv . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . count () Ġ!= Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCSV FormatException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= ĠAccount ( v [ 0 ], Ġv [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . password Ġ= Ġv [ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccounts . add ( account ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĸĩä»¶ æł¼å¼ı éĶĻè¯¯ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport . post Value ( CSV FormatException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( accounts ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// PW æŀĲ æŀĦ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġanalyze PW ( content : ĠString ) Ġ= Ġsuspend C ancellable Coroutine < List < Account >> Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . resume ( G SON . fromJson ( content , Ġobject Ġ: ĠType Token < List < Account >>() {}. type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æī¹éĩı ä¿ĿåŃĺ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsave ( context : ĠContext , Ġaccounts : ĠList < Account >) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccounts . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¿ĿåŃĺ åīį åħĪ åĬłå¯Ĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . password Ġ= ĠCipher Helper . aes En cipher ( it . password , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Helper . save Account ( accounts ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( context . getString ( R . string . exception _ save _ fail d )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åĩº CSV ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexport CSV Doc ( context : ĠContext , Ġdata : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¹ ģ å¿ Ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġget FD ( context , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Writer ( fd ). use Ġ{ Ġfile Writer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCSV Printer ( file Writer , ĠCSV Format . EX CEL ). use Ġ{ Ġprint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Helper . selectAll (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint . print Record ( it . domain , Ġit . account , ĠCipher Helper . aes De cipher ( it . password , Ġpassword )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport . post Value ( Exception (" å¯¼åĩº å¤±è´¥ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç©º éĹ ² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åĩº PW ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexport PW Doc ( context : ĠContext , Ġdata : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¹ ģ å¿ Ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åħ¨ åŃĹæ®µ åĬłå¯Ĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccounts Ġ= ĠAccount Helper . selectAll (). apply Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . domain Ġ= ĠCipher Helper . aes En cipher ( it . domain , Ġpassword ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . account Ġ= ĠCipher Helper . aes En cipher ( it . account , Ġpassword ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠG SON . toJson ( accounts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġget FD ( context , Ġdata ) Ġ// Ġ çİ°åľ¨ åľ¨ è¿ĻéĩĮ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Writer ( fd ). use Ġ{ Ġfile Writer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Writer . write ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport . post Value ( Exception (" å¯¼åĩº å¤±è´¥ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç©º éĹ ² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åĩº CSV ĠApple ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexport CSV Doc Apple ( context : ĠContext , Ġdata : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç¹ ģ å¿ Ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfd Ġ= Ġget FD ( context , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Writer ( fd ). use Ġ{ Ġfile Writer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCSV Printer ( file Writer , ĠCSV Format . EX CEL ). use Ġ{ Ġprint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint . print Record (" Title ", Ġ" Url ", Ġ" Username ", Ġ" Password ", Ġ" OTP Auth ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Helper . selectAll (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint . print Record ( it . domain , Ġ" https :// 1 2 7 . 0 . 0 . 1 /", Ġ"${ it . domain }: Ġ${ it . account }", ĠCipher Helper . aes De cipher ( it . password , Ġpassword )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport . post Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport . post Value ( Exception (" å¯¼åĩº å¤±è´¥ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç©º éĹ ² ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// çĶŁæĪĲ è¾ĵåĩº æĸĩä»¶ ĊĠĠĠ Ġprivate Ġfun Ġcreate File ( path : ĠFile , Ġname : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! path . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path , Ġname ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æł¡éªĮ å¯Ĩçłģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Password ( text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtext . length Ġ>= Ġ 6 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCSV æł¼å¼ı éĶĻè¯¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠCSV FormatException ( msg : ĠString Ġ= Ġ" CSV Ġ æł¼å¼ı éĶĻè¯¯ ") Ġ: ĠException ( msg ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĸĩä»¶ å¯Ĩçłģ éĶĻè¯¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠFile Password Exception ( msg : ĠString Ġ= Ġ" æĸĩä»¶ å¯Ĩçłģ éĶĻè¯¯ ") Ġ: ĠException ( msg ) Ċ Ċ }