package Ġedu . corn ell . cs . apl . vi ad uct . cli Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . parameters . options . flag Ċ import Ġcom . github . aj alt . cli kt . parameters . options . option Ċ import Ġcom . github . aj alt . cli kt . parameters . types . file Ċ import Ġedu . corn ell . cs . apl . pretty printing . Pretty Print able Ċ import Ġedu . corn ell . cs . apl . vi ad uct . analysis . Information Flow Analysis Ċ import Ġedu . corn ell . cs . apl . vi ad uct . analysis . declaration Nodes Ċ import Ġedu . corn ell . cs . apl . vi ad uct . analysis . let Nodes Ċ import Ġedu . corn ell . cs . apl . vi ad uct . analysis . main Ċ import Ġedu . corn ell . cs . apl . vi ad uct . backend . aby . AB Y Mux Post processor Ċ import Ġedu . corn ell . cs . apl . vi ad uct . backend . zk p . ZK PM ux Post processor Ċ import Ġedu . corn ell . cs . apl . vi ad uct . passes . Program Post processor Registry Ċ import Ġedu . corn ell . cs . apl . vi ad uct . passes . annotate With Protocols Ċ import Ġedu . corn ell . cs . apl . vi ad uct . passes . check Ċ import Ġedu . corn ell . cs . apl . vi ad uct . passes . el abor ated Ċ import Ġedu . corn ell . cs . apl . vi ad uct . passes . special ize Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . Cost Mode Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . Simple Cost Estimator Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . Simple Cost Reg ime Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . Simple Protocol Composer Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . Simple Protocol Factory Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . select Protocol sWith Z 3 Ċ import Ġedu . corn ell . cs . apl . vi ad uct . selection . validate Protocol Assignment Ċ import Ġedu . corn ell . cs . apl . vi ad uct . syntax . FunctionName Ċ import Ġedu . corn ell . cs . apl . vi ad uct . syntax . Protocol Ċ import Ġedu . corn ell . cs . apl . vi ad uct . syntax . Variable Ċ import Ġedu . corn ell . cs . apl . vi ad uct . syntax . intermediate . Node Ċ import Ġedu . corn ell . cs . apl . vi ad uct . syntax . intermediate . Process Declaration Node Ċ import Ġedu . corn ell . cs . apl . vi ad uct . syntax . intermediate . Program Node Ċ import Ġg uru . n idi . graph viz . engine . Format Ċ import Ġg uru . n idi . graph viz . engine . Graph viz Ċ import Ġjava . io . File Ċ import Ġjava . io . String Writer Ċ import Ġjava . io . Writer Ċ import Ġkotlin . system . measure Time Millis Ċ import Ġmu . Kotlin Logging Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger (" Compile ") Ċ Ċ class ĠCompile Ġ: ĠCli kt Command ( help Ġ= Ġ" Compile Ġideal Ġprotocol Ġto Ġsecure Ġdistributed Ġprogram ") Ġ{ ĊĠĠĠ Ġval Ġinput : ĠFile ? Ġby Ġinput Program () ĊĊĠĠĠ Ġval Ġoutput : ĠFile ? Ġby ĠoutputFile () ĊĊĠĠĠ Ġ// ĠTODO : Ġoption Ġto Ġprint Ġinferred Ġlabel Ġfor Ġeach Ġvariable . ĊĠĠĠ Ġ// ĠTODO : Ġoption Ġto Ġprint Ġselected Ġprotocol Ġfor Ġeach Ġvariable . ĊĊĠĠĠ Ġval Ġconstraint Graph Output : ĠFile ? Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġ"- c ", ĊĠĠĠĠĠĠĠ Ġ"-- constraint - graph ", ĊĠĠĠĠĠĠĠ Ġmetavar Ġ= Ġ" FILE . EXT ", ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWrite Ġthe Ġgenerated Ġlabel Ġconstraint Ġgraph Ġto ĠFILE . EXT ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Ġextension Ġ( EXT ) Ġdetermines Ġthe Ġoutput Ġformat . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSupported Ġformats Ġare Ġthe Ġsame Ġas Ġthe Ġones Ġin ĠGraph viz . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMost Ġcommon Ġones Ġare Ġsvg , Ġpng , Ġdot , Ġand Ġjson . ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ Ġ). file ( can Be Dir Ġ= Ġfalse ) ĊĊĠĠĠ Ġval Ġlabel Output : ĠFile ? Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġ"- l ", ĊĠĠĠĠĠĠĠ Ġ"-- label ", ĊĠĠĠĠĠĠĠ Ġmetavar Ġ= Ġ" FILE . via ", ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Write Ġprogram Ġdecor ated Ġwith Ġminimal Ġauthority Ġlabels Ġto ĠFILE . via " ĊĠĠĠ Ġ). file ( can Be Dir Ġ= Ġfalse ) ĊĊĠĠĠ Ġval Ġprotocol Selection Output : ĠFile ? Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġ"- s ", ĊĠĠĠĠĠĠĠ Ġ"-- selection ", ĊĠĠĠĠĠĠĠ Ġmetavar Ġ= Ġ" FILE . via ", ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Write Ġprogram Ġdecor ated Ġwith Ġprotocol Ġselection Ġto ĠFILE . via " ĊĠĠĠ Ġ). file ( can Be Dir Ġ= Ġfalse ) ĊĊĠĠĠ Ġval Ġmax imize Cost : ĠBoolean Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġ"-- max cost ", ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Max imize Ġcost Ġduring Ġprotocol Ġselection Ġinstead Ġof Ġminimize " ĊĠĠĠ Ġ). flag ( default Ġ= Ġfalse ) ĊĊĠĠĠ Ġval Ġw an Cost : ĠBoolean Ġby Ġoption ( ĊĠĠĠĠĠĠĠ Ġ"-- wan cost ", ĊĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" Use ĠW AN Ġcost Ġmodel Ġinstead Ġof ĠL AN Ġcost Ġmodel " ĊĠĠĠ Ġ). flag ( default Ġ= Ġfalse ) ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" el abor ating Ġsource Ġprogram ..." Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġun special ized Program Ġ= Ġinput . parse (). el abor ated () ĊĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" special izing Ġfunctions ..." Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= Ġun special ized Program . special ize () ĊĊĠĠĠĠĠĠĠ Ġ// ĠPerform Ġstatic Ġchecks . ĊĠĠĠĠĠĠĠ Ġprogram . check () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDump Ġlabel Ġconstraint Ġgraph Ġto Ġa Ġfile Ġif Ġrequested . ĊĠĠĠĠĠĠĠ Ġval Ġif c Analysis Ġ= ĠInformation Flow Analysis . get ( program ) ĊĠĠĠĠĠĠĠ Ġdump Graph ( if c Analysis :: export Constraint Graph , Ġconstraint Graph Output ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( label Output Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Metadata : ĠMap < Node , ĠPretty Print able > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram . declaration Nodes (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġif c Analysis . label ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. plus ( program . let Nodes (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġif c Analysis . label ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). toMap () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdump Program Metadata ( program , Ġlabel Metadata , Ġlabel Output ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprotocol Factory Ġ= ĠSimple Protocol Factory ( program ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSelect Ġprotocols . ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" select ing Ġprotocols ..." Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprotocol Composer Ġ= ĠSimple Protocol Composer ĊĠĠĠĠĠĠĠ Ġval Ġcost Reg ime Ġ= Ġif Ġ( wan Cost ) ĠSimple Cost Reg ime . W AN Ġelse ĠSimple Cost Reg ime . LAN ĊĠĠĠĠĠĠĠ Ġval Ġcost Estimator Ġ= ĠSimple Cost Estimator ( Simple Protocol Composer , Ġcost Reg ime ) ĊĊĠĠĠĠĠĠĠ Ġval Ġprotocol Assignment : Ġ( FunctionName , ĠVariable ) Ġ-> ĠProtocol ĊĠĠĠĠĠĠĠ Ġval Ġprotocol Selection Duration Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Assignment Ġ= Ġselect Protocol sWith Z 3 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram . main , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Composer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcost Estimator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( max imize Cost ) ĠCost Mode . MAX IM IZE Ġelse ĠCost Mode . MIN IM IZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġmetadata Ġ-> Ġdump Program Metadata ( program , Ġmetadata , Ġprotocol Selection Output ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" finished Ġprotocol Ġselection , Ġran Ġfor Ġ${ protocol Selection Duration } ms " Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPerform Ġa Ġsanity Ġcheck Ġto Ġensure Ġthe Ġprotocol Assignment Ġis Ġvalid . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġeither Ġremove Ġthis Ġentirely Ġor Ġmake Ġit Ġopt - in Ġby Ġthe Ġcommand Ġline . ĊĠĠĠĠĠĠĠ Ġfor Ġ( process Decl Ġin Ġprogram . declarations . filter Is Instance < Process Declaration Node >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Protocol Assignment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogram , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Decl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Composer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcost Estimator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Assignment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" annot ating Ġprogram Ġwith Ġprotocols ..." Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġannotated Program Ġ= Ġprogram . annotate With Protocols ( protocol Assignment ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPost - process Ġprogram ĊĠĠĠĠĠĠĠ Ġval Ġpost processor Ġ= ĠProgram Post processor Registry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA BY Mux Post processor ( protocol Assignment ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZ K PM ux Post processor ( protocol Assignment ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġpost processed Program Ġ= Ġpost processor . post process ( annotated Program ) ĊĊĠĠĠĠĠĠĠ Ġoutput . println ( post processed Program ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠOutputs Ġthe Ġgraph Ġgenerated Ġby Ġ[ graph Writer ] Ġto Ġ[ file ] Ġif Ġ[ file ] Ġis Ġnot Ġ` null `. ĠDoes Ġnothing Ċ Ġ* Ġotherwise . ĠThe Ġoutput Ġformat Ġis Ġdetermined Ġautomatically Ġfrom Ġ[ file ]' s Ġextension . Ċ Ġ*/ Ċ private Ġfun Ġdump Graph ( graph Writer : Ġ( Writer ) Ġ-> ĠUnit , Ġfile : ĠFile ?) Ġ{ ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlogger . info Ġ{ Ġ" Writing Ġgraph Ġto Ġ$ file " Ġ} ĊĊĠĠĠ Ġwhen Ġ( val Ġformat Ġ= Ġformat FromFile Extension ( file )) Ġ{ ĊĠĠĠĠĠĠĠ ĠFormat . DOT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . buffered Writer (). use ( graph Writer ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠString Writer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Writer ( writer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGraph viz . fromString ( writer . toString ()). render ( format ). to File ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġdump Program Metadata ( ĊĠĠĠ Ġprogram : ĠProgram Node , ĊĠĠĠ Ġmetadata : ĠMap < Node , ĠPretty Print able >, ĊĠĠĠ Ġfile : ĠFile ? Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlogger . info Ġ{ Ġ" Writing Ġprogram Ġmetadata Ġto Ġ$ file " Ġ} ĊĠĠĠ Ġfile . println ( program . print Metadata ( metadata )) Ċ } Ċ Ċ /** ĠInf ers ĠGraph viz Ġoutput Ġformat Ġfrom Ġ[ file ]' s Ġextension . Ġ*/ Ċ private Ġfun Ġformat FromFile Extension ( file : ĠFile ): ĠFormat Ġ= ĊĠĠĠ Ġwhen Ġ( file . extension . lowercase ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" png " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . PNG ĊĠĠĠĠĠĠĠ Ġ" svg " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . SVG ĊĠĠĠĠĠĠĠ Ġ" dot " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . DOT ĊĠĠĠĠĠĠĠ Ġ" xd ot " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . X DOT ĊĠĠĠĠĠĠĠ Ġ" txt " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . PLAIN ĊĠĠĠĠĠĠĠ Ġ" ps " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . PS 2 ĊĠĠĠĠĠĠĠ Ġ" json " Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFormat . JSON 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnknown Graph viz Extension ( file ) ĊĠĠĠ Ġ} Ċ Ċ private Ġclass ĠUnknown Graph viz Extension ( file : ĠFile ) Ġ: ĊĠĠĠ ĠError (" Unknown ĠGraph viz Ġextension Ġ'${ file . extension }' Ġin Ġ$ file .") Ċ