/** Ċ Ġ* Ġ< s late _ header > Ċ Ġ* Ġurl : Ġwww . s late kit . com Ċ Ġ* Ġgit : Ġwww . github . com / code - helix / s late kit Ċ Ġ* Ġorg : Ġwww . code helix . co Ċ Ġ* Ġauthor : ĠK ish ore ĠRed dy Ċ Ġ* Ġcopyright : Ġ 2 0 1 6 ĠCode Hel ix ĠSolutions ĠInc . Ċ Ġ* Ġlicense : Ġrefer Ġto Ġwebsite Ġand / or Ġgithub Ċ Ġ* Ġabout : ĠA Ġtool - kit , Ġutility Ġlibrary Ġand Ġserver - backend Ċ Ġ* Ġman tra : ĠSimp licity Ġabove Ġall Ġelse Ċ Ġ* Ġ</ s late _ header > Ċ Ġ*/ Ċ Ċ package Ġs late kit . apis . tools . docs Ċ Ċ import Ġjava . lang . Math . abs Ċ import Ġs late kit . apis . routes . Action Ċ import Ġs late kit . apis . routes . Api Ċ import Ġs late kit . apis . routes . Area Ċ import Ġs late kit . apis . routes . Lookup Ċ import Ġs late kit . utils . writer . Console Writer Ċ import Ġs late kit . utils . writer . Text Settings Ċ import Ġs late kit . utils . writer . Writer Ċ import Ġkotlin . reflect . K Class Ċ Ċ abstract Ġclass ĠDoc Ġ Ġ{ ĊĊĠĠĠ Ġprotected Ġopen Ġval Ġwriter : ĠWriter Ġ= ĠConsole Writer ( Text Settings ()) ĊĠĠĠ Ġopen Ġval Ġdoc Settings Ġ= ĠDoc Settings () ĊĠĠĠ Ġopen Ġval Ġpath Separator Ġ= Ġ"." ĊĠĠĠ Ġopen Ġval Ġhelp Suffix Ġ= Ġ" ?" ĊĠĠĠ Ġopen Ġval Ġhelp Separator Ġ= Ġ" Ġ" ĊĠĠĠ Ġopen Ġval Ġheader Del imeter Ġ= Ġ"-" ĊĠĠĠ Ġopen Ġval Ġheader Del imeter Length Ġ= Ġ 4 0 ĊĊĠĠĠ Ġfun Ġline Break () Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . text (" ------------------------------------------------ --------------- ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġerror ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . failure ( msg ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbegin (){ ĊĠĠĠĠĠĠĠ Ġwriter . line () ĊĠĠĠĠĠĠĠ Ġwriter . text ( header Del imeter . repeat ( header Del imeter Length ), Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġend () Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . line () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsection ( call : () Ġ-> ĠUnit Ġ){ ĊĠĠĠĠĠĠĠ Ġbegin () ĊĠĠĠĠĠĠĠ Ġcall () ĊĠĠĠĠĠĠĠ Ġend () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe Ġlist Ġof Ġareas : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠARE AS ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . Ġarea A ĊĠĠĠĠ Ġ* Ġ 2 . Ġarea B ĊĠĠĠĠ Ġ* Ġ 3 . Ġarea C ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġuse Ġ Ġ{ area } Ġ? Ġto Ġlist Ġall ĠAPIs Ġin Ġan Ġarea ĊĠĠĠĠ Ġ* Ġe . g . Ġarea A Ġ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġareas ( areas : ĠLookup < Area >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . title (" ARE AS ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġareas . items . forEach Indexed Ġ{ Ġn dx , Ġarea Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . tab () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . highlight (( nd x Ġ+ Ġ 1 ). toString () Ġ+ Ġ"." Ġ+ Ġarea . name , Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . text (" use Ġ{ area }$ help Separator $ help Suffix Ġto Ġlist Ġall Ġap is Ġin Ġthe Ġarea . Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . url (" e . g . Ġ${ areas . items . first (). name } Ġ?", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Break () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe Ġlist Ġof Ġareas : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠARE A ĊĠĠĠĠ Ġ* Ġarea A ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAPIs ĊĠĠĠĠ Ġ* Ġapi A Ġ: Ġdescription Ġof ĠAPI ĊĠĠĠĠ Ġ* Ġapi B Ġ: Ġdescription Ġof ĠAPI ĊĠĠĠĠ Ġ* Ġapi C Ġ: Ġdescription Ġof ĠAPI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġuse Ġ Ġ{ area } Ġ{ api }? Ġto Ġlist Ġall ĠActions Ġin Ġan ĠAPI ĊĠĠĠĠ Ġ* Ġe . g . Ġarea A Ġapi A Ġ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġarea ( area : ĠArea ){ ĊĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . title (" AREA ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . tab () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . highlight ( area . name , Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAPI Ss ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . sub Title (" API s ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarea . apis . items . sorted By Ġ{ Ġit . name Ġ}. forEach Ġ{ Ġbuild Api ( it , Ġdetails Ġ= Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . text (" use Ġ{ area }$ help Separator { api }$ help Suffix Ġto Ġlist Ġall ĠActions Ġin Ġan ĠAPI . Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . url (" e . g . Ġ${ area . name }$ help Separator ${ area . apis . items . first (). name } ?", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe Ġlist Ġof Ġareas : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠARE A ĊĠĠĠĠ Ġ* Ġarea A ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAPIs ĊĠĠĠĠ Ġ* Ġapi A Ġ: Ġdescription Ġof ĠAPI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠACTIONS ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġaction 1 : Ġdescription Ġof ĠACTION ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġaction 2 : Ġdescription Ġof ĠACTION ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġaction 3 : Ġdescription Ġof ĠACTION ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġuse Ġ Ġ{ area } Ġ{ api } Ġ{ action }? Ġto Ġlist ĠAction Ġdetails ĊĠĠĠĠ Ġ* Ġe . g . Ġarea A Ġapi A Ġaction 1 Ġ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġapi ( area : ĠArea , Ġapi : ĠApi ){ ĊĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . title (" API ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Api ( api , Ġdetails Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠActions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . sub Title (" ACTION S ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxLength Ġ= Ġapi . actions . items . max By Ġ{ Ġit . name . length Ġ} ?. name ?. length Ġ?: Ġ 1 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi . actions . items . sorted By Ġ{ Ġit . name Ġ}. forEach { Ġbuild Action ( api , Ġit , ĠmaxLength , false )} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . text (" use Ġ{ area }$ help Separator { api }$ help Separator { action }$ help Suffix Ġto Ġlist ĠAction Ġdetails . Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . url (" e . g . Ġ${ area . name }$ help Separator ${ api . name }$ help Separator ${ api . actions . items . first (). name } ?", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġthe Ġlist Ġof Ġareas : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠARE A ĊĠĠĠĠ Ġ* Ġarea A ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAPIs ĊĠĠĠĠ Ġ* Ġapi A Ġ: Ġdescription Ġof ĠAPI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠACTIONS ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġaction 1 : Ġdescription Ġof ĠACTION ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġaction 2 : Ġdescription Ġof ĠACTION ĊĠĠĠĠ Ġ* ĠĠĠĠĠ Ġaction 3 : Ġdescription Ġof ĠACTION ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġuse Ġ Ġ{ area } Ġ{ api } Ġ{ action }? Ġto Ġlist ĠAction Ġdetails ĊĠĠĠĠ Ġ* Ġe . g . Ġarea A Ġapi A Ġaction 1 Ġ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġaction ( area : ĠArea , Ġapi : ĠApi , Ġaction : ĠAction ){ ĊĠĠĠĠĠĠĠ Ġsection Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . title (" ACTION ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . text ( action . verb . name Ġ+ Ġ" Ġ", Ġend Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . url ("$ path Separator ${ area . name }$ path Separator ${ api . name }$ path Separator ${ action . name }", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAPI Ss ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . sub Title (" API ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Api ( api , Ġdetails Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠActions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . sub Title (" ACTION ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Action ( api , Ġaction , 3 0 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . text (" use Ġ{ area }$ help Separator { api }$ help Separator { action }$ help Suffix Ġto Ġlist ĠAction Ġdetails . Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . url (" e . g . Ġ${ area . name }$ help Separator ${ api . name }$ help Separator ${ api . actions . items . first (). name } ?", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġget Formatted Text ( text : ĠString , Ġmax : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( text . length Ġ== Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremainder Ġ= Ġ Ġwriter . SPACE . repeat ( abs ( max Ġ- Ġtext . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ+ Ġremainder ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Api ( api : ĠApi , Ġdetails : Boolean Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . tab () ĊĠĠĠĠĠĠĠ Ġwriter . highlight ( get Formatted Text ( api . name , Ġ( doc Settings . maxLength Api Ġ) Ġ+ Ġ 3 ), Ġend Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġwriter . text (" :", Ġend Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġwriter . text ( api . desc , Ġend Line Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġif ( details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( writer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" route ", Ġ"${ api . area }$ path Separator ${ api . name }", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" area Ġ", Ġapi . area , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" name Ġ", Ġapi . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" verb Ġ", Ġapi . verb . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" auth Ġ", Ġapi . auth . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" roles ", Ġapi . roles . all . join ToString ("," ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" proto ", Ġapi . sources . all . join ToString (",") Ġ{ Ġit . id Ġ}, Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Action ( api : ĠApi , Ġaction : ĠAction , ĠmaxLength : Int , Ġdetails : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . tab () ĊĠĠĠĠĠĠĠ Ġwriter . highlight ( get Formatted Text ( action . name , ĠmaxLength ), Ġend Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġwriter . text (" :", Ġend Line Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġwriter . text ( action . desc , Ġend Line Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġif ( details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( writer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" name Ġ", Ġaction . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" verb Ġ", Ġaction . verb . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" auth Ġ", Ġaction . auth . name , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" roles ", Ġaction . roles . all . join ToString ("," ), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab (); Ġkey Value (" proto ", Ġaction . sources . all . join ToString (",") Ġ{ Ġit . id Ġ}, Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . sub Title (" INPUT S ", Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . params User . forEach Indexed Ġ{ Ġn dx , Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . tab () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . highlight ( Ġ( nd x Ġ+ Ġ 1 ). toString () Ġ+ Ġ". Ġ" Ġ+ Ġinput . name !! , Ġend Line Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcls Ġ= Ġinput . type . classifier Ġas ĠK Class < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġwhen ( input . type . arguments . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġcls . simple Name !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġinput . type . arguments . join ToString Ġ{ Ġ( it . type ?. classifier Ġas ĠK Class < *> ). simple Name !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . tab (); Ġwriter . key Value (" type ĠĠĠ Ġ", Ġtype , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . tab (); Ġwriter . key Value (" required ", Ġ(! input . is Optional ). toString (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġbuild Path ( action : ĠAction , Ġsep : ĠString ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Path ("", Ġ"", Ġaction . name , Ġsep ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġbuild Path ( area : ĠString , Ġapi : ĠString , Ġaction : ĠString , Ġsep : ĠString ? Ġ= Ġnull ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= Ġsep Ġ?: Ġpath Separator ĊĠĠĠĠĠĠĠ Ġreturn Ġarea Ġ+ Ġseparator Ġ+ Ġapi Ġ+ Ġseparator Ġ+ Ġaction ĊĠĠĠ Ġ} Ċ } Ċ