/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . uch uh imo . kon f Ċ Ċ import Ġcom . uch uh imo . kon f . source . Source Ċ import Ġjava . util . Array Deque Ċ import Ġjava . util . Deque Ċ import Ġkotlin . properties . ReadWrite Property Ċ Ċ /** Ċ Ġ* ĠConfig Ġthat Ġmerge Ġ[ fallback ] Ġand Ġ[ facade ]. Ċ Ġ* Ċ Ġ* ĠAll Ġoperations Ġwill Ġbe Ġapplied Ġto Ġ[ facade ] Ġfirst , Ġand Ġthen Ġfall Ġback Ġto Ġ[ facade ] Ġwhen Ġnecessary . Ċ Ġ*/ Ċ class ĠMerged Config ( val Ġfallback : ĠConfig , Ġval Ġfac ade : ĠConfig ) Ġ: ĊĠĠĠ ĠBase Config (" merged ( facade =${ facade . name }, Ġfallback =${ fallback . name }) ") Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġraw Set ( item : ĠItem <* >, Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . raw Set ( item , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . raw Set ( item , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġset ( item : ĠItem < T >, Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade [ item ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback [ item ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġset ( name : ĠString , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade [ name ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback [ name ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġlazy Set ( item : ĠItem < T >, Ġth unk : Ġ( config : ĠItem Container ) Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . lazy Set ( item , Ġth unk ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . lazy Set ( item , Ġth unk ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġlazy Set ( name : ĠString , Ġth unk : Ġ( config : ĠItem Container ) Ġ-> ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . lazy Set ( name , Ġth unk ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . lazy Set ( name , Ġth unk ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunset ( item : ĠItem <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . unset ( item ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . unset ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunset ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . unset ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . unset ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġfac ade . clear () ĊĠĠĠĠĠĠĠ Ġfallback . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġspecs : ĠList < Spec > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfac ade . specs Ġ+ Ġfallback . specs ĊĊĠĠĠ Ġoverride Ġval Ġsources : ĠDe que < Source > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠArray Deque ( facade . sources ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( source Ġin Ġfallback . sources ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Last ( source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Item ( item : ĠItem <* >, Ġprefix : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġprefix . to Path () Ġ+ Ġitem . name . to Path () ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġpath . name ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġ! in Ġfallback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġin Ġfallback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠName Conflict Exception (" item Ġ$ name Ġcannot Ġbe Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRe peated Item Exception ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfac ade . addItem ( item , Ġprefix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Spec ( spec : ĠSpec ) Ġ{ ĊĠĠĠĠĠĠĠ Ġspec . items . forEach Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġspec . qual ify ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Ġ! in Ġfallback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġname . to Path () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġin Ġfallback ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠName Conflict Exception (" item Ġ$ name Ġcannot Ġbe Ġadded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRe peated Item Exception ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfac ade . add Spec ( spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Source ( source : ĠSource ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfac ade . add Source ( source ) ĊĠĠĠĠĠĠĠ Ġfallback . add Source ( source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġlock ( action : Ġ() Ġ-> ĠT ): ĠT Ġ= Ġfac ade . lock Ġ{ Ġfallback . lock ( action ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Map (): ĠMap < String , ĠAny > Ġ= Ġfallback . toMap () Ġ+ Ġfac ade . toMap () ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġget ( item : ĠItem < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade [ item ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback [ item ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġget ( name : ĠString ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( name Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade [ name ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback [ name ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġget OrNull ( item : ĠItem < T >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . get OrNull ( item ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . get OrNull ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġget OrNull ( name : ĠString ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( name Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . get OrNull ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . get OrNull ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠIterator < Item <* >> Ġ= ĊĠĠĠĠĠĠĠ Ġ( facade . iterator (). as Sequence () Ġ+ Ġfallback . iterator (). as Sequence ()). iterator () ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( item : ĠItem < *> ): ĠBoolean Ġ= Ġitem Ġin Ġfac ade Ġ|| Ġitem Ġin Ġfallback ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( name : ĠString ): ĠBoolean Ġ= Ġname Ġin Ġfac ade Ġ|| Ġname Ġin Ġfallback ĊĊĠĠĠ Ġoverride Ġfun Ġname Of ( item : ĠItem < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . name Of ( item ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . name Of ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġitem With Names : ĠList < Pair < Item <* >, ĠString >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfac ade . item With Names Ġ+ Ġfallback . item With Names ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġproperty ( item : ĠItem < T >): ĠRead Write Property < Any ?, ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( item Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . property ( item ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . property ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġproperty ( name : ĠString ): ĠRead Write Property < Any ?, ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( name Ġin Ġfac ade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfac ade . property ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfallback . property ( name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ