package Ġcom . e ug ene . cm cc lient . data . logo . repository Ċ Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Log Ċ import Ġcom . e ug ene . cm cc lient . R Ċ import Ġcom . e ug ene . cm cc lient . data . Backend Logo CSS Ċ import Ġcom . e ug ene . cm cc lient . data . tick ers . model . String Id Ċ import Ġcom . e ug ene . cm cc lient . di . Injector Ċ import Ġcom . go j uno . k optional . None Ċ import Ġcom . go j uno . k optional . Optional Ċ import Ġcom . go j uno . k optional . rx java 2 . filter Some Ċ import Ġcom . go j uno . k optional . to Optional Ċ import Ġcom . os b cp . cs spar ser . CSS Parser Ċ import Ġcom . os b cp . cs spar ser . PropertyValue Ċ import Ġcom . os b cp . cs spar ser . Rule Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable On Subscribe Ċ import Ġio . reactivex . functions . Bi Function Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġorg . jetbrains . ank o . display Metrics Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern ĊĊ Ċ /** Ċ Ġ* ĠTakes Ġsingle Ġbitmap Ġwith Ġlogo Ġsprites , Ġsplits Ġit Ġand Ġsaves Ġto Ġseparate Ġfiles Ġon Ġdisk . Ċ Ġ* Ċ Ġ* ĠProvides Ġmap Ġwith Ġcurrency Ġnames Ġand Ġpaths Ġto Ġlog os . Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠE ug ene Ġon Ġ 1 3 . 0 1 . 2 0 1 8 . Ċ Ġ*/ Ċ class ĠRepository Logo Sprites ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog os Backend : ĠBackend Logo CSS , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpic asso : ĠPic asso Ċ ) Ġ: ĠRepository Logo Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmap : ĠMap < String Id , ĠBitmap >? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP ATTERN _ STY LEN AME Ġ= ĠPattern . compile ("\\ . s - s -( \\ w + )") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP ATTERN _ POSITION Ġ= ĠPattern . compile (" (- ? \\ d + )( px )? Ġ(- ? \\ d + )( px )? ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP ATTERN _ WIDTH _ HEIGHT Ġ= ĠPattern . compile ("( \\ d +) px ") ĊĠĠĠĠĠĠĠ Ġval ĠBIT MAP _ SCALE _ FACTOR : ĠFloat Ġ= ĠInject or . component App . get AppContext (). display Metrics . density ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠLogo In Bitmap ( val Ġticker Id : ĠString Id , Ġval Ġposition : ĠPoint , Ġval Ġwidth : ĠInt , Ġval Ġheight : ĠInt ) ĊĠĠĠ Ġprivate Ġdata Ġclass ĠT icker Id With Bitmap ( val Ġticker Id : ĠString Id , Ġval Ġlogo : ĠBitmap ) Ċ Ċ // ĠĠĠ Ġoverride Ġfun Ġget Logo Map (): ĠObservable < Map < Name , ĠURI >> Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠObservable . just ( map Of < Name , ĠURI >()) Ċ // ĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġsingle Bitmap : ĠBitmap ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget Logo Map (): ĠObservable < Map < String Id , ĠBitmap >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( map Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Loading Ġ= Ġif Ġ( single Bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . create ( Observable On Subscribe < Bitmap > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbmp : ĠBitmap ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbmp Ġ= Ġpic asso . load ( Data Constants . PATH _ LOG O _ SINGLE _ BITMAP ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbmp Ġ= Ġpic asso . load ( R . drawable . currencies ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( RuntimeException (" Failed Ġto Ġload Ġsingle Ġbitmap Ġwith Ġlog os ", Ġe )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Observable On Subscribe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bmp Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onError ( NullPointerException (" Failed Ġto Ġload Ġsingle Ġbitmap Ġwith Ġlog os ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Bitmap Ġ= Ġbmp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onNext ( bmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just < Bitmap >( single Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcss Rules Loading Ġ= Ġlog os Backend . getLog os CSS () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf < Rule >() Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCSS Parser . parse ( it . string ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Iterable Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġrule : ĠRule Ġ-> Ġrule . selectors . size Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrule : ĠRule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠP ATTERN _ STY LEN AME . matcher ( rule . selectors [ 0 ]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair < List < PropertyValue >, ĠMatcher >( rule . property Values , Ġmatcher ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second . matches () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġpair : ĠPair < List < PropertyValue >, ĠMatcher > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompute Logo In Bitmap ( pair . first , Ġpair . second ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Some () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next { ĠLog . d (" DATA ", Ġ" Logo Info : Ġ$ it ")} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObservable . combine Latest ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcss Rules Loading , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBi Function Ġ{ Ġbitmap : ĠBitmap , Ġlogo Info : ĠLogo In Bitmap Ġ-> ĠPair ( bitmap , Ġlogo Info ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto Ticker Id With Bitmap ( it . first , Ġit . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Some () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġnames : ĠList < Ticker Id With Bitmap > Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp : ĠMutable Map < String Id , ĠBitmap > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnames . forEach Ġ{ Ġtmp [ it . ticker Id ] Ġ= Ġit . logo Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠMap < String Id , ĠBitmap > Ġ= ĠHashMap ( tmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success { Ġmap Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( Observable . just ( map Of ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠObservable . just ( map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto Ticker Id With Bitmap ( bitmap : ĠBitmap , Ġlogo Info : ĠLogo In Bitmap ): ĠOptional < Ticker Id With Bitmap > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Bitmap : ĠBitmap Ġ= ĠBitmap . create Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( logo Info . width Ġ* ĠBIT MAP _ SCALE _ FACTOR ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( logo Info . height Ġ* ĠBIT MAP _ SCALE _ FACTOR ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( result Bitmap ) ĊĠĠĠĠĠĠĠ Ġval Ġsrc Rect Ġ= ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Info . position . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Info . position . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Info . position . x Ġ+ Ġlogo Info . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Info . position . y Ġ+ Ġlogo Info . height ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Rect , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRect F ( 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Info . width Ġ* ĠBIT MAP _ SCALE _ FACTOR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogo Info . height Ġ* ĠBIT MAP _ SCALE _ FACTOR ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠT icker Id With Bitmap ( logo Info . ticker Id , Ġresult Bitmap ). to Optional () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Logo In Bitmap ( first : ĠList < PropertyValue >, Ġsecond : ĠMatcher ): ĠOptional < Logo In Bitmap > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠString Id ( second . group ( 1 )) ĊĠĠĠĠĠĠĠ Ġvar Ġposition : ĠPoint ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġwidth : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġheight : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( property Value Ġin Ġfirst ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( property Value . property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" background - position " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠP ATTERN _ POSITION . matcher ( property Value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġmultiply Ġwidth Ġand Ġheight Ġby Ġ(- 1 ), Ġwe Ġget Ġposition Ġof Ġleft - top Ġcorner Ġof Ġicon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhere Ġ( 0 , 0 ) Ġis Ġleft - top Ġcorner Ġof Ġthe Ġwhole Ġimage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw : ĠInt Ġ= Ġ- 1 Ġ* Ġmatcher . group ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh : ĠInt Ġ= Ġ- 1 Ġ* Ġmatcher . group ( 3 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= ĠPoint ( w , Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" width " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠP ATTERN _ WIDTH _ HEIGHT . matcher ( property Value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġmatcher . group ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" height " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= ĠP ATTERN _ WIDTH _ HEIGHT . matcher ( property Value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġmatcher . group ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġwe Ġfail Ġto Ġregexp Ġsomething , Ġwe Ġjust Ġwon 't Ġfill Ġsome Ġof Ġposition , Ġwidth , Ġheight Ġwith Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġwill Ġprobably Ġhave Ġfewer Ġlog os Ġin Ġour Ġresulting Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( position Ġ== Ġnull Ġ|| Ġwidth Ġ== Ġnull Ġ|| Ġheight Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNone ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogo In Bitmap ( id , Ġposition , Ġwidth , Ġheight ). to Optional () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }