/* Ċ Ġ* Ġ Ġ************************************************************************* ***** Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* ĠThis Ġprogram Ġand Ġthe Ġaccompanying Ġmaterials Ġare Ġmade Ġavailable Ġunder Ġthe Ċ Ġ* Ġ Ġ* Ġterms Ġof Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġwhich Ġis Ġavailable Ġat Ċ Ġ* Ġ Ġ* Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 . Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ċ Ġ* Ġ Ġ* Ġ Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* Ġ Ġ* Ġ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 . Ċ Ġ* Ġ Ġ* Ċ Ġ* Ġ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ* Ġ Ġ************************************************************************* **** Ċ Ġ*/ Ċ package Ġorg . nd 4 j . same diff . framework import . tensorflow . ir Ċ Ċ import Ġorg . nd 4 j . common . primitives . Counter Ċ import Ġorg . nd 4 j . ir . Op Namespace Ċ import Ġorg . nd 4 j . linalg . api . ndarray . IND Array Ċ import Ġorg . nd 4 j . same diff . framework import . context . Mapping Context Ċ import Ġorg . nd 4 j . same diff . framework import . ir . IR DataType Ċ import Ġorg . nd 4 j . same diff . framework import . ir . IR Graph Ċ import Ġorg . nd 4 j . same diff . framework import . ir . IR Node Ċ import Ġorg . nd 4 j . same diff . framework import . ir . import Info ForEach Node In Graph Ċ import Ġorg . nd 4 j . same diff . framework import . op defs . Op Descriptor Loader Holder Ċ import Ġorg . nd 4 j . same diff . framework import . registry . Op Mapping Registry Ċ import Ġorg . nd 4 j . same diff . framework import . tensorflow . Attribute Ċ import Ġorg . nd 4 j . same diff . framework import . tensorflow . Node Def Ċ import Ġorg . nd 4 j . same diff . framework import . tensorflow . context . Tensor flow Mapping Context Ċ import Ġorg . nd 4 j . same diff . framework import . tensorflow . convert ND Array To Tensor flow Tensor Ċ import Ġorg . nd 4 j . same diff . framework import . tensorflow . node ByName Ċ import Ġorg . nd 4 j . tensorflow . conversion . Tensor flow Conversion Ċ import Ġorg . tensorflow . framework .* Ċ Ċ class ĠTensor flow IR Graph ( graph Def : ĠGraph Def , Ġop Def : ĠOp List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, tensorflow Op Mapping Registry : ĠOp Mapping Registry < Graph Def , Node Def , Op Def , Tensor Proto , DataType , Op Def . Attr Def , Attr Value >): ĠIR Graph < ĊĠĠĠĠĠĠĠ ĠGraph Def , ĊĠĠĠĠĠĠĠ ĠNode Def , ĊĠĠĠĠĠĠĠ ĠOp Def , ĊĠĠĠĠĠĠĠ ĠTensor Proto , ĊĠĠĠĠĠĠĠ ĠOp Def . Attr Def , ĊĠĠĠĠĠĠĠ ĠAttr Value , ĊĠĠĠĠĠĠĠ ĠDataType > Ġ{ ĊĊĠĠĠ Ġvar Ġgraph Def Ġ= Ġgraph Def ĊĠĠĠ Ġval Ġop Def Ġ= Ġop Def ĊĠĠĠ Ġval Ġtensorflow Op Registry Ġ= Ġtensorflow Op Mapping Registry ĊĠĠĠ Ġvar Ġinputs Ġ= ĠArrayList < String >() ĊĠĠĠ Ġvar Ġoutputs Ġ= ĠArrayList < String >() ĊĠĠĠ Ġval Ġcached NodeList Ġ: ĠList < IR Node < Node Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType >> ĊĠĠĠ Ġval Ġnode Names : ĠSet < String > ĊĠĠĠ Ġval Ġinputs Outputs Ġ= ĠHashSet < String >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgraph Input To Ġ= ĠCounter < String >() ĊĠĠĠĠĠĠĠ Ġcached NodeList Ġ= Ġnode List () ĊĠĠĠĠĠĠĠ Ġnode Names Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġcached NodeList . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . inputs (). forEach Ġ{ Ġinput Name Ġ-> Ġgraph Input To . increment Count ( input Name , 1 . 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . inputs (). forEach Ġ{ Ġinput Ġ-> Ġinputs Outputs . add ( input ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . outputs (). forEach Ġ{ Ġoutput Ġ-> Ġinputs Outputs . add ( output ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// all Ġplaceholders Ġare Ġconsidered Ġinputs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . op Name (). contains (" Placeholder ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinputs . add ( it . nodeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// node Ġnot Ġinput Ġin Ġto Ġanything ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( graph Input To . getCount ( it . nodeName ()) Ġ< Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs . add ( it . nodeName ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode Names . add ( it . nodeName ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnode ByName ( input : ĠString ): ĠNode Def Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgraph Def . node ByName ( input ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġnode List (): ĠList < IR Node < Node Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgraph Def . node List . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTensor flow IR Node ( input Node , ĠOp Descriptor Loader Holder . list For Framework < Op Def >(" tensorflow "). values . first Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . name Ġ== Ġ Ġinput Node . op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, tensorflow Op Registry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinternal Value (): ĠGraph Def Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgraph Def ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġcreate Mapping Context ( ĊĠĠĠĠĠĠĠ Ġop Def : ĠOp Def , ĊĠĠĠĠĠĠĠ Ġnode : ĠNode Def , ĊĠĠĠĠĠĠĠ Ġdynamic Variables : ĠMutable Map < String , ĠTensor Proto > ĊĠĠĠ Ġ): ĠMapping Context < Graph Def , ĠNode Def , ĠOp Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTensor flow Mapping Context ( op Def Ġ= Ġop Def , Ġgraph Ġ= Ġthis , Ġnode Ġ= Ġnode , Ġdynamic Variables Ġ= Ġdynamic Variables ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġframework Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" tensorflow " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnd 4 j Name For Internal Op Name ( name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtensorflow Op Registry . lookup Op Mapping Process ( name ). op Name () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Constant Op Name ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname Ġ== Ġ" Const " Ġ|| Ġname Ġ== Ġ" Placeholder " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Constant ( op Name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġop Name Ġ== Ġ" Const " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Place Holder ( op Name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġop Name Ġ== Ġ" Placeholder " Ġ|| Ġop Name Ġ== Ġ" Placeholder WithDefault " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshape Of Input ( varName : ĠString ): ĠLong Array ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattr Map Ġ= Ġnode ByName ( varName ). attr Map ĊĠĠĠĠĠĠĠ Ġval Ġshape Available Ġ= Ġattr Map . containsKey (" shape ") ĊĠĠĠĠĠĠĠ Ġvar Ġshape : ĠLong Array ? ĊĠĠĠĠĠĠĠ Ġshape Ġ= Ġif Ġ( shape Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattr Map [" shape "] !!. list . i List . to Long Array () ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Some Ġplaceholders Ġdon 't Ġhave Ġany Ġshape Ġrestrictions Ġ- Ġi . e ., Ġaccept Ġanything ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġshape ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠdataType For Variable ( varName : ĠString ): ĠIR DataType < DataType > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode ByName ( varName ) ĊĠĠĠĠĠĠĠ Ġval Ġattr Map Ġ= Ġnode . attr Map ĊĠĠĠĠĠĠĠ Ġif (! attr Map . containsKey (" dtype ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Set Ġ= Ġ Ġattr Map . values . filter Ġ{ Ġattr Value Ġ-> Ġattr Value . type Ġ!= ĠDataType . DT _ INVALID Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( ret Set . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR DataType ( DataType . DT _ INVALID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR DataType ( attr Map . values . filter Ġ{ Ġattr Value Ġ-> Ġattr Value . type Ġ!= ĠDataType . DT _ INVALID Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first (). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( attr Map . containsKey (" dtype ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR DataType ( attr Map [" dtype "] !!. type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR DataType ( DataType . DT _ INVALID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġimport Info ForEach Node ( dynamic Variables : ĠMutable Map < String , ĠTensor Proto >): ĠMap < String , ĠPair < Mapping Context < Graph Def , ĠNode Def , ĠOp Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType >, ĠOp Namespace . Op Descriptor >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimport Info ForEach Node In Graph ( graph Ġ= Ġthis , dynamic Variables Ġ= Ġdynamic Variables ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnode Is Place Holder ( nodeName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Place Holder ( node ByName ( nodeName ). op ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġop Mapping Registry (): ĠOp Mapping Registry < Graph Def , ĠNode Def , ĠOp Def , ĠTensor Proto , ĠDataType , ĠOp Def . Attr Def , ĠAttr Value > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtensorflow Op Registry ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Constant Node ( nodeName : ĠString , Ġvalue : ĠIND Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgraph Builder Ġ= Ġgraph Def . to Builder () ĊĠĠĠĠĠĠĠ Ġval Ġconverted Tensor Ġ= Ġconvert ND Array To Tensor flow Tensor ( value ) ĊĠĠĠĠĠĠĠ Ġval Ġconstant Ġ= ĠNode Def Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠnodeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġop Ġ= Ġ" Const " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAttribute (" value ", Ġorg . nd 4 j . same diff . framework import . tensorflow . Attr Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtensor Ġ= Ġconverted Tensor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgraph Builder . add Node ( constant ) ĊĠĠĠĠĠĠĠ Ġthis . graph Def Ġ= Ġgraph Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Node ( node : ĠIR Node < Node Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode ByName Ġ= Ġnode ByName ( node . nodeName ()) ĊĠĠĠĠĠĠĠ Ġval Ġinternal Graph Def Builder Ġ= Ġgraph Def . to Builder () ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Node Ġ= Ġinternal Graph Def Builder . node List . indexOf ( node ByName ) ĊĠĠĠĠĠĠĠ Ġinternal Graph Def Builder . set Node ( indexOf Node , node . internal Value ()) ĊĠĠĠĠĠĠĠ Ġthis . graph Def Ġ= Ġinternal Graph Def Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgraph Outputs (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoutputs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġoutput At ( index : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġoutputs [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgraph Inputs (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinputs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Outputs ( outputs : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . outputs Ġ= Ġoutputs Ġas ĠArrayList < String > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinput At ( index : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinputs [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Inputs ( inputs : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . inputs Ġ= Ġinputs Ġas ĠArrayList < String > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Variable ( nodeName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Variable Op Name ( node ByName ( nodeName ). op ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Variable Op Name ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġname Ġ== Ġ" Variable " Ġ|| Ġname Ġ== Ġ" Variable V 2 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Constant Array For Name ( name : ĠString ): ĠIND Array Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode ByName ( name ) ĊĠĠĠĠĠĠĠ Ġif (! node . op . contains (" Const ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Illegal Ġop Ġfound Ġ${ node . op } Ġfor Ġname Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR Tensor ( node . get Attr OrThrow (" value "). tensor ). to Nd 4 j ND Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Constant Initializer ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode ByName ( name ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnode Ġ!= Ġnull Ġ&& Ġnode . op Ġ== Ġ" Const " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠindexOf Node ( input : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcached NodeList . map Ġ{ Ġinput Ġ-> Ġinput . nodeName () Ġ}. indexOf ( input ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnodes With Input ( name : ĠString ): ĠList < IR Node < Node Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcached NodeList . filter Ġ{ Ġinput Ġ-> Ġinput . inputs (). contains ( name ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġir Node ByName ( input : ĠString ): ĠIR Node < Node Def , ĠTensor Proto , ĠOp Def . Attr Def , ĠAttr Value , ĠDataType > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode ByName ( input ) ĊĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR Node ( node , tensorflow Op Registry . lookup Input Framework Op Def ( node . op ), op Mapping Registry ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Node ( nodeName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnode Names . contains ( nodeName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Graph Outputs As Processing Nodes (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠconvertTo ND Array ( tensor Type Input : ĠTensor Proto ): ĠIND Array Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTensor flow IR Tensor ( tensor Type Input ). to Nd 4 j ND Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Input Or Output ( name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinputs Outputs . contains ( name ) ĊĠĠĠ Ġ} ĊĊ Ċ }