package Ġtab ool ib . module . lang Ċ Ċ import Ġtab ool ib . common . platform . function . release Resource File Ċ import Ġtab ool ib . common . platform . function . submit Ċ import Ġtab ool ib . common . platform . function . warning Ċ import Ġtab ool ib . common 5 . File Watcher Ċ import Ġtab ool ib . library . configuration . Configuration Section Ċ import Ġtab ool ib . module . configuration . Sec ured File Ċ import Ġjava . io . File Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* ĠTab oo Lib Ċ Ġ* Ġtab ool ib . module . lang . Resource Reader Ċ Ġ* Ċ Ġ* Ġ@ author Ġsky Ċ Ġ* Ġ@ since Ġ 2 0 2 1 / 6 / 2 1 Ġ 1 1 : 4 8 Ġä¸ĭåįĪ Ċ Ġ*/ Ċ class ĠResource Reader ( val Ġclazz : ĠClass <* >, Ġval Ġmigrate : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĊĠĠĠ Ġval Ġfiles Ġ= ĠHashMap < String , ĠLanguage File >() ĊĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat (" yyyy / MM / dd ĠHH : mm ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLanguage . language Code . forEach Ġ{ Ġcode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresource AsStream Ġ= Ġclazz . class Loader . getResource AsStream (" lang /$ code . yml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resource AsStream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= ĠHashMap < String , ĠType >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġresource AsStream . read Bytes (). toString ( StandardCharsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource File Ġ= ĠSec ured File . load Configuration ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĬłè½½ åĨħåŃĺ ä¸ŃçļĦ åİŁ ä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Nodes ( source File , Ġnodes , Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĩĬæĶ¾ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġrelease Resource File (" lang /$ code . yml ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ç§»éĻ¤ æĸĩä»¶ çĽĳåĲ¬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isFile Watcher Hook ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Watcher . INSTANCE . remove Listener ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexists Ġ= ĠHashMap < String , ĠType >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĬłè½½ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Nodes ( Sec ured File . load Configuration ( file ), Ġexists , Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ£Ģ æŁ¥ ç¼º å¤± ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmissing Keys Ġ= Ġnodes . keys . filter Ġ{ Ġ! exists . containsKey ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( missing Keys . isNotEmpty () Ġ&& Ġmigrate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmigrate File ( missing Keys , Ġsource File , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes Ġ+= Ġexists ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles [ code ] Ġ= ĠLanguage File ( file , Ġnodes ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles [ code ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæĸĩä»¶ åıĺ åĬ¨ çĽĳåĲ¬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isFile Watcher Hook ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Watcher . INSTANCE . add Simple Listener ( file ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . nodes . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Nodes ( source File , Ġit . nodes , Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Nodes ( Sec ured File . load Configuration ( file ), Ġit . nodes , Ġcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Simpl ifiable Call Chain ") ĊĠĠĠ Ġfun Ġload Nodes ( file : ĠSec ured File , Ġnodes Map : ĠHashMap < String , ĠType >, Ġcode : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmigrate Legacy Version ( file ) ĊĠĠĠĠĠĠĠ Ġfile . get Keys ( false ). forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġobj Ġ= Ġfile . get ( node )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes Map [ node ] Ġ= ĠType Text ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes Map [ node ] Ġ= ĠType List ( obj . map NotNull Ġ{ Ġsub Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub Ġis ĠMap < *, Ġ* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Node ( sub . map Ġ{ Ġit . key . toString () Ġto Ġit . value !! Ġ}. toMap (), Ġcode , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Text ( sub . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConfiguration Section Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġload Node ( obj . getValues ( false ). map Ġ{ Ġit . key Ġto Ġit . value !! Ġ}. toMap (), Ġcode , Ġnode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes Map [ node ] Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarning (" Unsupported Ġlanguage Ġnode : Ġ$ node Ġ($ code )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Node ( map : ĠMap < String , ĠAny >, Ġcode : ĠString , Ġnode : ĠString ?): ĠType ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( map . containsKey (" type ") Ġ|| Ġmap . containsKey (" ==" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġ( map [" type "] Ġ?: Ġmap [" ==" ]). toString (). lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Instance Ġ= ĠLanguage . language Type [ type ]?. getDeclared Constructor ()?. newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Instance Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Instance . init ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarning (" Unsupported Ġlanguage Ġtype : Ġ$ node Ġ> Ġ$ type Ġ($ code )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Instance ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwarning (" Missing Ġlanguage Ġtype : Ġ$ map Ġ($ code )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate File ( missing : ĠList < String >, Ġsource : ĠSec ured File , Ġfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsubmit ( async Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġappend Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ+= Ġ"# Ġ---------------- --------- Ġ# " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ+= Ġ"# Ġ ĠUPDATE Ġ${ date Format . format ( System . currentTimeMillis ()) } Ġ Ġ# " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ+= Ġ"# Ġ---------------- --------- Ġ# " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ+= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmissing . forEach Ġ{ Ġkey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġsource [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Ġ+= ĠSec ured File . dump All ( key , Ġobj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . append Text ("\ n ${ append . join ToString ("\ n ") }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmigrate Legacy Version ( file : ĠSec ured File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġfixed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġfile . getValues ( HashMap (), Ġ""). to Sorted Map () ĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . key . contains ('. ')) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfixed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set ( it . key . substring Before ('. '), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set ( it . key . replace ('.', Ġ'- '), Ġwhen Ġ( val Ġobj Ġ= Ġit . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConfiguration Section Ġ-> Ġmigrate Legacy Json Type ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠList < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . map Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġmigrate Legacy Json Type ( element . map Keys Ġ{ Ġentry Ġ-> Ġentry . key . toString () Ġ}. to Section ( Sec ured File ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġelement . if Empty Ġ{ Ġ"& r " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġobj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( fixed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . save ToFile () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå¯¹ èĢģ çīĪæľ¬ çļĦ ĠJson Ġ åĨĻ æ³ķ è¿Ľè¡Į è¿ ģ ç§» æĽ´æĸ° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmigrate Legacy Json Type ( section : ĠConfiguration Section ): ĠConfiguration Section Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġsection . getString (" ==", Ġsection . getString (" type ")) Ġ?: Ġreturn Ġsection ĊĠĠĠĠĠĠĠ Ġif Ġ( type . lowercase () Ġ!= Ġ" json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsection ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġsection . getString (" text ") Ġ?: Ġreturn Ġsection ĊĠĠĠĠĠĠĠ Ġval Ġarg Section Ġ= Ġsection . getConfiguration Section (" args ") Ġ?: Ġreturn Ġsection ĊĠĠĠĠĠĠĠ Ġ// Ġå¯¹ å·² æľīçļĦ åıĺéĩı è¿Ľè¡Į è½¬ ä¹ī ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext . replace ("[ ", Ġ"\\ [" ). replace (" ]", Ġ"\\ ]") ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġarg Section . get Keys ( false ). map NotNull Ġ{ Ġarg Section . getConfiguration Section ( it ) Ġ}. associate Ġ{ Ġit . name Ġto Ġit . getValues ( false ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Args Ġ= ĠArrayList < Map < String , ĠAny ? >>() ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġlegacy Args Regex . matcher ( text ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Ġ= Ġmatcher . group ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġmatcher . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġmatcher . group ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġargs [ node ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext . replace ( full , Ġdisplay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtext . replace ( full , Ġ" [$ display ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Args Ġ+= Ġbody ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsection [" text "] Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġsection [" args "] Ġ= Ġnew Args ĊĠĠĠĠĠĠĠ Ġreturn Ġsection ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æīĢæľī éĶ® åĢ¼ å¯¹ ï¼Į åĲĮ Ġget Values Ġæĸ¹æ³ķ ãĢĤ ĊĠĠĠĠ Ġ* Ġåľ¨ ç»ı è¿ĩ Ġ== ĠæĪĸ æĺ¯ Ġtype ĠæĹ¶ åģľæŃ¢ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠConfiguration Section . getValues ( collect : ĠHashMap < String , ĠAny ? >, Ġnode : ĠString ): ĠHashMap < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġif Ġ( node . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ+= Ġ"." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkey Ġ+= Ġname ĊĠĠĠĠĠĠĠ Ġif Ġ( contains (" ==" ) Ġ|| Ġcontains (" type ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect [ key ] Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Keys ( false ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġobj Ġ= Ġget ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConfiguration Section Ġ-> Ġobj . getValues ( collect , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Key Ġ= Ġkey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ+= Ġ"." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Key Ġ+= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect [ next Key ] Ġ= Ġobj ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcollect ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMap < *, Ġ* >. to Section ( root : ĠConfiguration Section ): ĠConfiguration Section Ġ{ ĊĠĠĠĠĠĠĠ ĠforEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMap < *, Ġ*> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot [ key . toString ()] Ġ= Ġvalue . to Section ( root . create Section ( key . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot [ key . toString ()] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlegacy Args Regex Ġ= ĠPattern . compile ("< (. +) @ (. + )> ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġis File Watcher Hook Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Watcher . INSTANCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNo Class Def Found Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }