/*! ĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠ ĠC + edition Ġfor ĠDesktop , ĠCommunity ĠEdition . ĊĠĠĠ ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠC pl use dition ĠLimited . Ġ ĠAll Ġrights Ġreserved . ĊĠĠĠĠĊĠĠĠ ĠThe Ġauthor Ġlicenses Ġthis Ġfile Ġto ĠYou Ġ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 Ġsf . and ri ans . c pl use dition . support Ċ Ċ import Ġcom . c pl use dition . an json . JSON Util . json Array OrNull Ċ import Ġcom . c pl use dition . an json . JSON Util . put OrFail Ċ import Ġcom . c pl use dition . an json . JSON Util . string OrNull Ċ import Ġcom . c pl use dition . bot . core . Base path Ċ import Ġcom . c pl use dition . bot . core . Fun 1 1 Ċ import Ġcom . c pl use dition . bot . core . I Log Ċ import Ġcom . c pl use dition . bot . core . Random Ut Ċ import Ġcom . c pl use dition . bot . core . Serial Ċ import Ġcom . c pl use dition . bot . core . Step Watch Ċ import Ġcom . c pl use dition . bot . core . Struct Ut Ċ import Ġcom . c pl use dition . bot . core . list OrEmpty Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ import Ġsf . and ri ans . an core util . util . struct . Iterable Wrapper Ċ import Ġsf . and ri ans . c pl use dition . R Ċ import Ġsf . and ri ans . c pl use dition . support . An . Session Preferences Key Ċ import Ġsf . and ri ans . c pl use dition . support . css . CSS Generator Ċ import Ġsf . and ri ans . c pl use dition . support . handler . I Res Util Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . Future Ċ import Ġjava . util . concurrent . TimeUnit . SECONDS Ċ import Ġjava . util . concurrent . locks . Lock Ċ import Ġjava . util . concurrent . locks . ReadWrite Lock Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . regex . Pattern Syntax Exception Ċ Ċ private Ġclass ĠRoot Attr ( ĊĠĠĠĠĠĠĠ Ġval Ġlocked : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġencrypted : ĠBoolean Ċ ) Ċ Ċ abstract Ġclass ĠStorage Base ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger : ĠI Log , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġr src : ĠI Res Util Ċ ) Ġ: ĠI Storage , ĠI Storage Accessor Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsearch Result Lock : ĠLock Ġ= ĠRe entrant Lock () ĊĠĠĠ Ġprivate Ġval Ġsearch Results : ĠMutable Map < Long , ĠArray < JSONObject > ?> Ġ= ĠTreeMap () ĊĊĠĠĠ Ġprotected Ġvar Ġpool Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġprotected Ġvar Ġtmp dir Thread Ġ= ĠExec utors . new Single Thread Executor () ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Cached ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġpool . shutdown Now () ĊĠĠĠĠĠĠĠ Ġtmp dir Thread . shutdown Now () ĊĠĠĠĠĠĠĠ Ġtmp dir Thread . await Termination ( 1 , ĠSE CON DS ) ĊĠĠĠĠĠĠĠ Ġpool . await Termination ( 1 , ĠSE CON DS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< R > Ġsubmit ( task : ĠFun 1 1 < I Storage Accessor , ĠR >): ĠFuture < R > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpool . submit < R > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfile Info At ( c path : ĠString ?): ĠPair < I FileInfo ?, ĠCollection < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= ĠTree Set < String >() ĊĠĠĠĠĠĠĠ Ġval Ġclean r path Ġ= ĠSupport . get clean r path Strict ( errors , Ġr src , Ġc path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( clean r path Ġ== Ġnull Ġ|| Ġclean r path . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( r src . get ( R . string . Invalid Path _, Ġ"$ c path ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( null , Ġerrors ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( fileInfo ( clean r path ), ĠlistOf ( r src . get ( R . string . Invalid Path , Ġ"$ c path "))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdocument FileInfo At ( c path : ĠString ?): ĠPair < I FileInfo ?, ĠCollection < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= ĠTree Set < String >() ĊĠĠĠĠĠĠĠ Ġval Ġclean r path Ġ= ĠSupport . get clean r path Strict ( errors , Ġr src , Ġc path ) ĊĠĠĠĠĠĠĠ Ġif Ġ( clean r path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( r src . get ( R . string . Invalid Path , Ġ"$ c path ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( null , Ġerrors ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( document FileInfo ( clean r path ), ĠlistOf ( r src . get ( R . string . Invalid Path , Ġ"$ c path "))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Bytes ( c path : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Info At ( c path ). first ?. content ()?. getInputStream ()?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Bytes () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIOException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Text ( c path : ĠString , Ġcharset : ĠCharset ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Info At ( c path ). first ?. content ()?. getInputStream ()?. reader ( charset )?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Text () ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠIOException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġis LoggedIn (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpost Search ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter ignore case : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile filter : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch ignore case : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch text : ĠString Ġ/* , Ġfinal Ġboolean Ġis regex */ ĊĠĠĠ Ġ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġserial . get () ĊĠĠĠĠĠĠĠ Ġpost Regex Search ( id , Ġfilter ignore case , Ġfile filter , Ġsearch ignore case , Ġsearch text ) ĊĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget SearchResult ( id : ĠLong Ġ/* , Ġfinal Ġboolean Ġis regex */ ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Regex SearchResult ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpost Regex Search ( id : ĠLong , Ġfilter ignore case : ĠBoolean , Ġfile filter : ĠString , Ġsearch ignore case : ĠBoolean , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroots Ġ= Ġmutable ListOf ( get Assets Root (), Ġget Home Root () Ġ/* Ġ, Ġget Private Root () Ġ*/) ĊĠĠĠĠĠĠĠ Ġvar Ġfile pat : ĠPattern ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( file filter . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile pat Ġ= ĠPattern . compile ( file filter , Ġif Ġ( filter ignore case ) ĠPattern . CASE _ INS ENS ITIVE Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPattern Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Errors ( id , Ġr src . get ( R . string . Invalid Regex _, Ġfile filter ), Ġe . message Ġ?: Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Errors ( id , Ġr src . get ( R . string . Invalid Regex _, Ġ"$ text ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpat : ĠPattern ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpat Ġ= ĠPattern . compile ( text , Ġif Ġ( search ignore case ) ĠPattern . CASE _ INS ENS ITIVE Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPattern Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Errors ( id , Ġr src . get ( R . string . Invalid Regex _, Ġtext ), Ġ"${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstorage : ĠI Storage Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġsearch Result Lock . lock () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results [ id ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( root Ġin Ġroots ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregex Search ( results , Ġstorage , Ġfile pat , Ġpat , Ġroot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . put OrFail ( An . Key . result , Ġresults ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Results . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results [ id ] Ġ= ĠarrayOf ( ret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). start () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġregex Search ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults : ĠJSONObject , Ġstorage : ĠI Storage , Ġfile pat : ĠPattern ?, Ġpat : ĠPattern , Ġdir : ĠI FileInfo ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( info Ġin Ġdir . read Dir ( ArrayList ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ġ= Ġinfo . stat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat Ġ== Ġnull Ġ|| Ġ! stat . readable ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stat . is Dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregex Search ( results , Ġstorage , Ġfile pat , Ġpat , Ġinfo ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Base path . lc Suffix ( info . name ) Ġ!= ĠAn . DEF . html Suffix ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa path Ġ= Ġinfo . ap ath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file pat Ġ== Ġnull Ġ|| Ġfile pat . matcher ( ap ath ). find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . content (). getInputStream (). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġit . reader (). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregex Search ( results , Ġpat , Ġa path , Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . w ( r src . get ( R . string . Error Reading _, Ġa path ), Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregex Search ( results : ĠJSONObject , Ġpat : ĠPattern , Ġa path : ĠString , Ġcontent : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġpat . matcher ( content ) ĊĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠJSONArray () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( m . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstat . put ( m . start ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( stat . length () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults . put OrFail ( ap ath , Ġstat ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Regex SearchResult ( id : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Result Lock . lock () ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! search Results . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr src . json Error ( R . string . Search Abort ed , Ġ": Ġ$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġsearch Results [ id ] Ġ?: Ġreturn ĠBUS Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results . remove ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret [ 0 ]. toString () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch Errors ( id : ĠLong , Ġvar arg Ġmsgs : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Result Lock . lock () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Results . containsKey ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msgs . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . put ( An . Key . errors , Ġmsgs [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . put ( An . Key . errors , ĠJSONArray ( msgs )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results [ id ] Ġ= ĠarrayOf ( ret ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . w ("# ĠASSERT : Ġshould Ġnot Ġhappen ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠA Ġtemp Ġfile Ġwith Ġthe Ġgiven Ġfilename Ġin Ġa Ġrandom Ġnamed Ġdirectory Ġin Ġthe Ġgiven Ġtmp dir . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġget temp ( tmpdir : ĠFile , Ġfilename : ĠString ?): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp dir Thread . submit < File > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile . create TempFile (" tmp ", Ġ"", Ġtmp dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . delete ()) Ġreturn @ submit Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . mkdir s ()) Ġreturn @ submit Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġif Ġ( filename Ġ== Ġnull ) Ġdir Ġelse ĠFile ( dir , Ġfilename ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ submit Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ submit Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġall Ġfile / directory Ġrecursively Ġdirectly Ġunder Ġthe Ġtmp dir Ġwith Ġname Ġthat Ġis Ġnot Ġexcluded Ġby Ġexclude s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġcle art emp ( tmpdir : ĠFile , Ġexclude s : ĠCollection < String ?> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtmp dir Thread . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tmpdir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( name Ġin Ġtmp dir . list OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exclude s Ġ!= Ġnull Ġ&& Ġexclude s . contains ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete _( File ( tmpdir , Ġname )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete Ġthe Ġfile / directory Ġrecursively Ġdirectly Ġunder Ġthe Ġtmp dir Ġwith Ġthe Ġgiven Ġname . ĊĠĠĠĠ Ġ* ĠDo Ġnothing Ġif Ġnot Ġexists . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġde let et emp ( tmpdir : ĠFile ?, Ġname : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( tmpdir , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete _( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġde let et emp ( tmp file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġtmp file . parent File Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġdelete _( dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete _( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtmp dir Thread . execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠAbstract Custom Resources Ġ{ ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġresources : ĠMutable Map < String , ĠByteArray > Ġ= ĠTreeMap () ĊĠĠĠĠĠĠĠ Ġprotected Ġval Ġresources Lock : ĠRead Write Lock Ġ= ĠRe entrant ReadWrite Lock () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhost css : ĠString Ġ= ĠAn . PATH . assets Css _ Ġ+ Ġ" host " Ġ+ ĠRandom Ut . getLong () Ġ+ Ġ". css " ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtimestamp : ĠLong Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġget Host Css (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhost css ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġget Timestamp (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtimestamp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġr path ĠContext Ġrelative Ġpath Ġwithout Ġleading Ġ/. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġas Bytes ( r path : ĠString ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources Lock . read Lock (). lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresources [ r path ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources Lock . read Lock (). unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġgenerate Css ( conf : ĠCSS Generator . I Conf , Ġfont scss : ĠByteArray , Ġsymbol scss : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// # IF ĠENABLE _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimer Ġ= ĠStep Watch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// # ENDIF ĠENABLE _ LOG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources Lock . write Lock (). lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Client Css ] Ġ= ĠStruct Ut . concat ( serialize ( CSS Generator . Client v 1 CSS ( conf ). build ()), Ġfont scss , Ġsymbol scss ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ getHost Css ()] Ġ= ĠStruct Ut . concat ( serialize ( CSS Generator . Host CSS ( conf ). build ()), Ġfont scss ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Image Css ] Ġ= Ġserialize ( CSS Generator . Image CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Audio Css ] Ġ= Ġserialize ( CSS Generator . Audio CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets PDF Css ] Ġ= Ġserialize ( CSS Generator . PDF CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Video Css ] Ġ= Ġserialize ( CSS Generator . Video CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets CS SE d itor Css ] Ġ= Ġserialize ( CSS Generator . CS SE d itor CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Game M inds Css ] Ġ= Ġserialize ( CSS Generator . Game M inds CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Game S udoku Css ] Ġ= Ġserialize ( CSS Generator . Game S udoku CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources [ An . PATH . assets Game M ines Css ] Ġ= Ġserialize ( CSS Generator . Game M ines CSS ( conf ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources Lock . write Lock (). unlock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġserialize ( stylesheet : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstylesheet . byte InputStream (). read Bytes () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠAbstract Fonts CSS Generator ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠBUS Y Ġ= Ġ"{ Ġ\"" Ġ+ ĠAn . Key . busy Ġ+ Ġ"\ ": Ġtrue Ġ}" ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġserial Ġ= ĠSerial () ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Existing Document Directory ( storage : ĠI Storage , Ġc path : ĠString ): ĠPair < I FileInfo ?, ĠString ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġstorage . document FileInfo At ( c path ). first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠPair ( null , Ġstorage . r src . get ( R . string . Source Must Be Under Document Directories )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ret . exists ) Ġreturn ĠPair ( null , Ġstorage . r src . get ( R . string . Destination Not Exists )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( ret , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Writable Document Directory ( storage : ĠI Storage , Ġc path : ĠString ): ĠPair < I FileInfo ?, ĠString ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġstorage . document FileInfo At ( c path ). first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠPair ( null , Ġstorage . r src . get ( R . string . Destination Must Be Under Document Directories )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Ġ= Ġret . stat () Ġ?: Ġreturn ĠPair ( null , Ġstorage . r src . get ( R . string . Destination Not Exists )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! stat . writable ) Ġreturn ĠPair ( null , Ġstorage . r src . get ( R . string . Destination Not Writable )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( ret , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġexisting FileInfo At ( storage : ĠI Storage , Ġc path : ĠString ): ĠPair < I FileInfo ?, ĠCollection < String > ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġstorage . fileInfo At ( c path ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first Ġ?: Ġreturn ĠPair ( null , Ġit . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ret . exists ) Ġreturn ĠPair ( null , ĠlistOf ( storage . r src . get ( R . string . File NotFound _, Ġc path ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( ret , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Session Preferences ( res : ĠI Res Util , Ġaccessor : ĠI Settings Store Accessor , Ġpreferences : ĠJSONObject , Ġupdate : ĠJSONObject ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin ĠIterable Wrapper . wrap ( update . keys ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . file Positions Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġupdate . json Array OrNull ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc path Ġ= Ġvalue . string OrNull ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġvalue . json Array OrNull ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c path Ġ!= Ġnull Ġ&& Ġposition Ġ!= Ġnull ) Ġaccessor . update File Position ( c path , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game M ines Save , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game S udoku Save , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game M inds Save , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . symbol Family ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġupdate . string OrNull ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . symbol Recent s Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġupdate . opt JSONArray ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . show Done Events Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġupdate . opt Boolean ( key , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . trash Auto Cleanup Timestamp Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġupdate . opt Long ( key , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ> Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game M ines Map Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game M ines Difficulty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game M inds Cells , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game M inds Digits , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game S udoku Difficulty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . game S udoku Ass ists , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . image Default Output Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Preferences Key . side panel Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġupdate . opt Int ( key , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . put ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġres . format ( R . string . invalid Name Value , Ġkey , Ġupdate . opt ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġres . get ( R . string . Error Updating Settings , Ġkey , Ġ"${ update . opt ( key )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerrors . add ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġerrors ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠAssets Root ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġasset json : ĠJSONObject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġprovider : ĠFun 1 1 < String , ĠInputStream > ĊĠĠĠ Ġ) Ġ: ĠReadOnly Root Base ( An . PATH . assets ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinfo Ġ= ĠAsset FileInfo ( this , Ġ"", Ġasset json , Ġcreate Asset File Infos ( this , Ġasset json , Ġ"")) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfile Info ( r path : ĠString ): ĠI FileInfo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinfo . fileInfo ( r path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠMutable Collection < I FileInfo >> Ġread Dir ( ret : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinfo . read Dir ( ret ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfind ( ret : ĠMutable Collection < String >, Ġr path x : ĠString , Ġpattern : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġfile Info ( r path x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir . stat ()?. is Dir Ġ!= Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl cp at Ġ= Ġpattern . toLowerCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileInfo Util . walk 2 ( dir ) Ġ{ Ġfile , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name . toLowerCase ( Locale . ROOT ). contains ( l cp at )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret . add ( file . ap ath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġget InputStream ( r path : ĠString ): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprovider ( Base path . join R path ( name , Ġr path )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠEMPTY ROOT Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( I FileInfo . Key . name , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( I FileInfo . Key . isdir , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( I FileInfo . Key . isfile , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( I FileInfo . Key . not writable , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġread Assets Json ( r src : ĠI Res Util , Ġasset json : ĠInputStream ): ĠJSONObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset json . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJSONObject ( it . reader (). read Text ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Asset File Infos ( root : ĠAssets Root , Ġjson : ĠJSONObject , Ġdir : ĠString ): ĠMap < String , ĠAsset FileInfo > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġjson . opt JSONArray ( I FileInfo . Key . files ) Ġ?: Ġreturn Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . remove ( I FileInfo . Key . files ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠTreeMap < String , ĠAsset FileInfo >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġa . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġa . opt JSONObject ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġinfo . string OrNull ( I FileInfo . Key . name ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr path Ġ= ĠBase path . join R path ( dir , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġcreate Asset File Infos ( root , Ġinfo , Ġr path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret [ name ] Ġ= ĠAsset FileInfo ( root , Ġr path , Ġinfo , Ġfiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( JSONException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġempty root info ( provider : ĠFun 1 1 < String , ĠInputStream >): ĠAssets Root Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAssets Root ( EMPTY ROOT , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFileInfo Ġfor Ġa Ġreadonly Ġasset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠAsset FileInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot : ĠAssets Root , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr path : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo : ĠJSONObject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles : ĠMap < String , ĠAsset FileInfo > ĊĠĠĠ Ġ) Ġ: ĠReadOnly JSONObject FI le Info ( root , Ġr path , Ġinfo , Ġfiles , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReadOnly Content ( info . opt Long ( I FileInfo . Key . length , Ġ 0 L )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . getInputStream ( r path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //// ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// ////// Ċ } ĊĊ