/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠPat rick ĠGold inger Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . pat rick gold . fl or is board . res Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġdev . pat rick gold . fl or is board . common . result Err Ċ import Ġdev . pat rick gold . fl or is board . common . result Err Str Ċ import Ġdev . pat rick gold . fl or is board . common . result Ok Ċ import Ġdev . pat rick gold . fl or is board . debug . Log Topic Ċ import Ġdev . pat rick gold . fl or is board . debug . f log Error Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Abstract Key Data Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Case Selector Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . K ana Selector Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Char Width Selector Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Key Data Ċ import Ġdev . pat rick gold . fl or is board . ime . keyboard . Variation Selector Ċ import Ġdev . pat rick gold . fl or is board . ime . media . emoji . Emoji Key Data Ċ import Ġdev . pat rick gold . fl or is board . ime . spell ing . Spell ing Config Ċ import Ġdev . pat rick gold . fl or is board . ime . text . comp osing . Appender Ċ import Ġdev . pat rick gold . fl or is board . ime . text . comp osing . Composer Ċ import Ġdev . pat rick gold . fl or is board . ime . text . comp osing . Hang ul Unicode Ċ import Ġdev . pat rick gold . fl or is board . ime . text . comp osing . K ana Unicode Ċ import Ġdev . pat rick gold . fl or is board . ime . text . comp osing . With Rules Ċ import Ġdev . pat rick gold . fl or is board . ime . text . keyboard . Auto Text Key Data Ċ import Ġdev . pat rick gold . fl or is board . ime . text . keyboard . Multi Text Key Data Ċ import Ġdev . pat rick gold . fl or is board . ime . text . keyboard . Text Key Data Ċ import Ġdev . pat rick gold . fl or is board . res . ext . Extension Ċ import Ġdev . pat rick gold . fl or is board . res . ext . Extension Config Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . modules . Serial izers Module Ċ import Ġkotlinx . serialization . modules . pol ymorphic Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . util .* Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip File Ċ import Ġjava . util . zip . Zip OutputStream Ċ import Ġkotlin . contracts . Invocation Kind Ċ import Ġkotlin . contracts . contract Ċ Ċ class ĠAsset Manager Ġprivate Ġconstructor ( val Ġapplication Context : ĠContext ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġjson Ġ= ĠJson Ġ{ ĊĠĠĠĠĠĠĠ Ġclass Discriminator Ġ= Ġ"$ " ĊĠĠĠĠĠĠĠ Ġencode Defaults Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġignore Unknown Keys Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Len ient Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġserializers Module Ġ= ĠSerial izers Module Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpol ymorphic ( Abstract Key Data :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Text Key Data :: class , ĠText Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Auto Text Key Data :: class , ĠAuto Text Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Multi Text Key Data :: class , ĠMulti Text Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Emoji Key Data :: class , ĠEmoji Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Case Selector :: class , ĠCase Selector . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Variation Selector :: class , ĠVari ation Selector . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Char Width Selector :: class , ĠChar Width Selector . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( K ana Selector :: class , ĠK ana Selector . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġ{ ĠText Key Data . serializer () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpol ymorphic ( Key Data :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Text Key Data :: class , ĠText Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Auto Text Key Data :: class , ĠAuto Text Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Multi Text Key Data :: class , ĠMulti Text Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Emoji Key Data :: class , ĠEmoji Key Data . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġ{ ĠText Key Data . serializer () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpol ymorphic ( Composer :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Appender :: class , ĠApp ender . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Hang ul Unicode :: class , ĠH ang ul Unicode . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( K ana Unicode :: class , ĠK ana Unicode . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( With Rules :: class , ĠWith Rules . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġ{ ĠApp ender . serializer () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpol ymorphic ( Spell ing Config . Import Format :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Spell ing Config . Import Format . Archive :: class , ĠSp elling Config . Import Format . Archive . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubclass ( Spell ing Config . Import Format . Raw :: class , ĠSp elling Config . Import Format . Raw . serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġdefault Instance : ĠAsset Manager ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġinit ( application Context : ĠContext ): ĠAsset Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠAsset Manager ( application Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Instance Ġ= Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdefault (): ĠAsset Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġdefault Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instance Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUn initialized Property AccessException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ this :: class . simple Name } Ġhas Ġnot Ġbeen Ġinitialized Ġpreviously . ĠMake Ġsure Ġto Ġcall Ġinit ( application Context ) Ġbefore Ġusing Ġdefault (). " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdefault OrNull (): ĠAsset Manager ? Ġ= Ġdefault Instance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjson Builder (): ĠJson Ġ= Ġjson ĊĊĠĠĠ Ġfun Ġdelete Asset ( ref : ĠFl or is Ref ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Cache Ġ|| Ġref . is Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ok Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Err Str Ġ{ Ġ" Could Ġnot Ġdelete Ġfile ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Err Ġ{ Ġe Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Err Str Ġ{ Ġ" Provided Ġreference Ġis Ġnot Ġa Ġfile ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Err Str Ġ{ Ġ" Can Ġnot Ġdelete Ġan Ġasset Ġin Ġsource Ġ'${ ref . scheme }'. " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Asset ( ref : ĠFl or is Ref ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Assets Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( ref . relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapplication Context . assets . list ( file . parent ?. toString () Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ?. contains ( file . name ) Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Cache Ġ|| Ġref . is Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . exists () Ġ&& Ġfile . isFile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġlist Assets ( ref : ĠFl or is Ref ): ĠResult < Map < Fl or is Ref , ĠT >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Map Ġ= Ġmutable Map Of < Fl or is Ref , ĠT >() ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Assets Ġ-> Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġapplication Context . assets . list ( ref . relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ref Ġ= Ġref . sub Ref ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset Result Ġ= Ġload Json Asset < T >( file Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Result . on Success Ġ{ Ġasset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Map [ file Ref ] Ġ= Ġasset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf log Error ( Log Topic . AS SET _ MANAGER ) Ġ{ Ġerror . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Map . toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Cache Ġ|| Ġref . is Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . list Files ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ref Ġ= Ġref . sub Ref ( file . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset Result Ġ= Ġload Json Asset < T >( file Ref ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset Result . on Success Ġ{ Ġasset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Map [ file Ref ] Ġ= Ġasset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf log Error ( Log Topic . AS SET _ MANAGER ) Ġ{ Ġerror . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ok Ġ{ Ġret Map . toMap () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Err Str Ġ{ Ġ" Unsupported ĠFl or is Ref Ġsource !" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġload Json Asset ( ref : ĠFl or is Ref ): ĠResult < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload Text Asset ( ref ). fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġrun Catch ing Ġ{ Ġjson Builder (). decode FromString ( it ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġload Json Asset ( file : ĠFile ): ĠResult < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġread Text File ( file ). fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġrun Catch ing Ġ{ Ġjson Builder (). decode FromString ( it ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġload Json Asset ( uri : ĠUri , ĠmaxSize : ĠInt ): ĠResult < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġload Text Asset ( uri , ĠmaxSize ). fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġrun Catch ing Ġ{ Ġjson Builder (). decode FromString ( it ) Ġ} Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġload Json Asset ( json Str : ĠString ): ĠResult < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ Ġjson Builder (). decode FromString ( json Str ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Text Asset ( ref : ĠFl or is Ref ): ĠResult < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Assets Ġ-> Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context . assets . open ( ref . relative Path ). buffered Reader (). use Ġ{ Ġit . read Text () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Cache Ġ|| Ġref . is Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontents Ġ= Ġread Text File ( file ). getOrElse Ġ{ Ġreturn Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contents . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Err Str Ġ{ Ġ" File Ġis Ġblank !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ok Ġ{ Ġcontents Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Err Str Ġ{ Ġ" Unsupported Ġasset Ġref !" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Text Asset ( uri : ĠUri , ĠmaxSize : ĠInt ): ĠResult < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠExternal Content Utils . read All Text From Uri ( application Context , Ġuri , ĠmaxSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġwrite Json Asset ( ref : ĠFl or is Ref , Ġasset : ĠT ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ Ġjson Builder (). encode ToString ( asset ) Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġwrite Text Asset ( ref , Ġit ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġwrite Json Asset ( file : ĠFile , Ġasset : ĠT ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ Ġjson Builder (). encode ToString ( asset ) Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġwrite Text File ( file , Ġit ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT > Ġwrite Json Asset ( uri : ĠUri , Ġasset : ĠT ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Catch ing Ġ{ Ġjson Builder (). encode ToString ( asset ) Ġ}. fold ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġwrite Text Asset ( uri , Ġit ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġresult Err Ġ{ Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Text Asset ( ref : ĠFl or is Ref , Ġtext : ĠString ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Cache Ġ|| Ġref . is Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text File ( file , Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Err Str Ġ{ Ġ" Can Ġnot Ġwrite Ġan Ġasset Ġin Ġsource Ġ'${ ref . scheme } '" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Text Asset ( uri : ĠUri , Ġtext : ĠString ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠExternal Content Utils . write All Text To Uri ( application Context , Ġuri , Ġtext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġa Ġgiven Ġ[ file ] Ġand Ġreturns Ġits Ġcontent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġfile Ġobject . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcontents Ġof Ġthe Ġfile Ġor Ġan Ġempty Ġstring , Ġif Ġthe Ġfile Ġdoes Ġnot Ġexist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġread Text File ( file : ĠFile ) Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . read Text ( Charsets . UTF _ 8 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrites Ġgiven Ġ[ text ] Ġto Ġgiven Ġ[ file ]. ĠIf Ġthe Ġfile Ġalready Ġexists , Ġits Ġcurrent Ġcontent ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġoverwritten . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġfile Ġobject . ĊĠĠĠĠ Ġ* Ġ@ param Ġtext ĠThe Ġtext Ġto Ġwrite Ġto Ġthe Ġfile . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcontents Ġof Ġthe Ġfile Ġor Ġan Ġempty Ġstring , Ġif Ġthe Ġfile Ġdoes Ġnot Ġexist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwrite Text File ( file : ĠFile , Ġtext : ĠString ) Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . parent File ?. mkdir s () ĊĠĠĠĠĠĠĠ Ġfile . write Text ( text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠC Ġ: ĠExtension Config > Ġlist Extensions ( ref : ĠFl or is Ref ): ĠResult < Map < Fl or is Ref , ĠC >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġret Map Ġ= Ġmutable Map Of < Fl or is Ref , ĠC >() ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . is Internal Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp ConfigFile Ġ= ĠFile . create TempFile ("__ config _ ext _ index ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġdir . list Files () Ġ?: ĠarrayOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile Ġ&& Ġfile . extension Ġ== ĠExtension Config . DEFAULT _ FILE _ EXTENSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflex File Ġ= ĠZip File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Entry Ġ= Ġflex File . getEntry ( Extension Config . DEFAULT _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Entry Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp ConfigFile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflex File . copy ( config Entry , Ġtemp ConfigFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Json Asset < C >( temp ConfigFile ). fold ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess Ġ= Ġ{ Ġconfig Ġ-> Ġret Map . put ( ref . sub Ref ( file . name ), Ġconfig ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ Ġerror Ġ-> Ġf log Error ( Log Topic . AS SET _ MANAGER ) Ġ{ Ġerror . toString () Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp ConfigFile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ok Ġ{ Ġret Map . toMap () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Err Str Ġ{ Ġ" Given Ġpath Ġdoes Ġnot Ġexist Ġor Ġis Ġa Ġfile !" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Err Str Ġ{ Ġ" Unsupported Ġasset Ġsource " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< X Ġ: ĠExtension < C >, Ġre ified ĠC Ġ: ĠExtension Config > Ġload Extension ( ĊĠĠĠĠĠĠĠ Ġflex Ref : ĠFl or is Ref , ĊĠĠĠĠĠĠĠ Ġloader : Ġ( config : ĠC , Ġworking Dir : ĠFile , Ġflex File : ĠFile ) Ġ-> ĠX ĊĠĠĠ Ġ): ĠResult < X > Ġ{ ĊĠĠĠĠĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalls In Place ( loader , ĠInvocation Kind . AT _ MO ST _ ON CE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! flex Ref . is Internal ) Ġreturn ĠResult . failure ( Exception (" Only Ġinternal Ġsource Ġsupported ! ")) ĊĠĠĠĠĠĠĠ Ġval Ġflex Handle Ġ= ĠFile ( flex Ref . absolute Path ( application Context )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! flex Handle . isFile ) Ġreturn ĠResult . failure ( Exception (" Given Ġref Ġ$ flex Ref Ġis Ġnot Ġa Ġfile ! ")) ĊĠĠĠĠĠĠĠ Ġval Ġtemp Dir Handle Ġ= ĠFile ( application Context . cacheDir , ĠUUID . randomUUID (). toString ()) ĊĠĠĠĠĠĠĠ Ġtemp Dir Handle . delete Re cursively () ĊĠĠĠĠĠĠĠ Ġtemp Dir Handle . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflex File Ġ= ĠZip File ( flex Handle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconfig : ĠC ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflex Entries Ġ= Ġflex File . entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( flex Entries . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflex Entry Ġ= Ġflex Entries . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile ( temp Dir Handle , Ġflex Entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflex File . copy ( flex Entry , Ġtemp File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flex Entry . name Ġ== ĠExtension Config . DEFAULT _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġconfig Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Json Asset < C >( temp File ). on Success Ġ{ Ġconfig Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflex File . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . failure ( Exception (" No Ġconfig Ġfile Ġfound Ġfor Ġextension Ġ'$ flex Ref '! ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success ( loader ( config !! , Ġtemp Dir Handle , Ġflex Handle )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< X : ĠExtension < C >, Ġre ified ĠC Ġ: ĠExtension Config > Ġwrite Extension ( extension : ĠX ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( extension . flex File Ġ== Ġnull ) Ġreturn ĠResult . failure ( Exception (" Flex Ġfile Ġhandle Ġis Ġnull ! ")) ĊĠĠĠĠĠĠĠ Ġextension . flex File . parent File ?. mkdir s () ĊĠĠĠĠĠĠĠ Ġextension . flex File . delete Re cursively () ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġextension Ġfile Ġto Ġworking Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Json Asset ( File ( extension . working Dir , ĠExtension Config . DEFAULT _ NAME ), Ġextension . config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Out Ġ= ĠFileOutputStream ( extension . flex File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Out Ġ= ĠZip OutputStream ( file Out ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( working File Ġin Ġextension . working Dir . list Files () Ġ?: ĠarrayOf ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . put Next Entry ( Zip Entry ( working File . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking File . inputStream (). use Ġ{ Ġit . copy To ( zip Out ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Out . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . success ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResult . failure ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Extension ( ref : ĠFl or is Ref ): ĠResult < Unit > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdelete Asset ( ref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠZip File . copy ( src Entry : ĠZip Entry , Ġdst File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdst File . output Stream (). use Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . getInputStream ( src Entry ). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . copy To ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ