package Ġnet . earth computer . mult icon nect . compiler . gen Ċ Ċ import Ġnet . earth computer . mult icon nect . compiler . File Locations Ċ import Ġnet . earth computer . mult icon nect . compiler . Mc Type Ċ import Ġnet . earth computer . mult icon nect . compiler . MessageInfo Ċ import Ġnet . earth computer . mult icon nect . compiler . Message Variant Info Ċ import Ġnet . earth computer . mult icon nect . compiler . Packet Type Ċ import Ġnet . earth computer . mult icon nect . compiler . deep ComponentType Ċ import Ġnet . earth computer . mult icon nect . compiler . getClass Info OrNull Ċ import Ġnet . earth computer . mult icon nect . compiler . getMessage Variant Info Ċ import Ġnet . earth computer . mult icon nect . compiler . groups Ċ import Ġnet . earth computer . mult icon nect . compiler . pol ymorphic Children Ċ import Ġnet . earth computer . mult icon nect . compiler . protocols Ċ import Ġnet . earth computer . mult icon nect . compiler . read Csv Ċ Ċ fun Ġcheck Messages () Ġ{ ĊĠĠĠ Ġval Ġused By Protocol Ġ= Ġmutable Map Of < Int , ĠSet < String >>() ĊĠĠĠ Ġfor Ġ( protocol Ġin Ġprotocols ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġused Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġfun Ġprocess Used ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( used . add ( message )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠgetMessage Variant Info ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( info . min Version Ġ!= Ġnull Ġ&& Ġprotocol . id Ġ< Ġinfo . min Version ) Ġ|| Ġ( info . max Version Ġ!= Ġnull Ġ&& Ġprotocol . id Ġ> Ġinfo . max Version )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Protocol Ġ$ protocol Ġuses Ġmessage Ġvariant Ġ$ message , Ġbut Ġis Ġnot Ġsupported Ġby Ġthat Ġmessage Ġvariant ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( field Ġin Ġinfo . fields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġfield . type . real Type . deep ComponentType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġis ĠMc Type . Declared Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġclass Info Ġ= ĠgetClass Info OrNull ( type . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage Info Ġ-> Ġclass Info . get Variant ( protocol . id )?. let Ġ{ Ġprocess Used ( it . className ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMessage Variant Info Ġ-> Ġprocess Used ( type . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . pol ymorphic Ġ!= Ġnull Ġ&& Ġinfo . pol ymorphic Parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġpol ymorphic Children [ message ] !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Used ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( packet Ġin Ġread Csv < Packet Type >( File Locations . data Dir . resolve ( protocol . name ). resolve (" cp ackets . csv "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getClass Info OrNull ( packet . clazz ) Ġ! is ĠMessage Variant Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Packet Ġclass Ġ${ packet . clazz } Ġis Ġnot Ġa Ġmessage Ġvariant ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Used ( packet . clazz ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( packet Ġin Ġread Csv < Packet Type >( File Locations . data Dir . resolve ( protocol . name ). resolve (" sp ackets . csv "))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getClass Info OrNull ( packet . clazz ) Ġ! is ĠMessage Variant Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Packet Ġclass Ġ${ packet . clazz } Ġis Ġnot Ġa Ġmessage Ġvariant ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Used ( packet . clazz ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġused By Protocol [ protocol . id ] Ġ= Ġused ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( group Ġin Ġgroups . values ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Max Version : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ(( message Index , Ġmessage ) Ġin Ġgroup . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠgetMessage Variant Info ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Index Ġ!= Ġ 0 Ġ&& Ġ( last Max Version Ġ== Ġnull Ġ|| Ġinfo . min Version Ġ== Ġnull Ġ|| Ġinfo . min Version Ġ<= Ġlast Max Version )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Message Ġ$ message Ġhas Ġa Ġlower Ġmin Ġversion Ġthan Ġthe Ġmax Ġversion Ġof Ġthe Ġprevious Ġmessage Ġin Ġthe Ġvariant Ġgroup ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġif Ġ( info . min Version Ġ== Ġnull ) Ġprotocols . last Index Ġelse Ġprotocols . binary Search Ġ{ Ġinfo . min Version . compareTo ( it . id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Message Ġ$ message Ġhas Ġa Ġmin Ġversion Ġthat Ġis Ġnot Ġin Ġthe Ġprotocol Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . max Version Ġ!= Ġnull Ġ&& Ġprotocols . binary Search Ġ{ Ġinfo . max Version . compareTo ( it . id ) Ġ} Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Message Ġ$ message Ġhas Ġa Ġmax Ġversion Ġthat Ġis Ġnot Ġin Ġthe Ġprotocol Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Index Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( index Ġ!= Ġprotocols . last Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( protocols [ index Ġ+ Ġ 1 ]. id Ġ!= Ġlast Max Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Message Ġ$ message Ġhas Ġa Ġgap Ġin Ġthe Ġprotocol Ġversions Ġbefore Ġit ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Max Version Ġ= Ġinfo . max Version ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . min Version Ġ!= Ġnull Ġ|| Ġinfo . max Version Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprotocol Ġ= Ġprotocols [ i ]. id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthat Ġthis Ġmessage Ġis Ġused Ġsomewhere Ġin Ġthis Ġprotocol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( used By Protocol [ protocol ]?. contains ( message ) Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Message Ġvariant Ġ$ message Ġis Ġnot Ġused Ġin Ġprotocol Ġ$ protocol Ġwhich Ġit Ġsupports ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( protocol Ġ== Ġinfo . max Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ