package Ġorg . ste ven low es . tools . gps database . server Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . ste ven low es . tools . random sp ice generator . database . utils . fire Van Editor Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . logging . Log Manager Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ ĠSystem . setProperty (" org . slf 4 j . simple Logger . default LogLevel ", Ġ" trace ") ĊĊĠĠĠ Ġval Ġlog Ġ= ĠLog Manager . getLog Manager (). getLogger ("") ĊĠĠĠ Ġfor Ġ( h Ġin Ġlog . handlers ) Ġ{ ĊĠĠĠĠĠĠĠ Ġh . level Ġ= ĠLevel . ALL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠLOGGER Ġ= ĠLoggerFactory . getLogger (" Main ") ĊĊĠĠĠ ĠDatabase . connect () ĊĊĠĠĠ Ġvar Ġip : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġin Port : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġout Port : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġapp Port : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġname : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġmins : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġpass : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar ĠapiKey : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġexternal Ip : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġiterator Ġ= Ġargs . iterator () ĊĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- h " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Help () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- v " Ġ-> Ġfire Van Editor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- i " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" IP : Ġ$ ip ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- i Ġmust Ġbe Ġfollowed Ġby Ġthe Ġlocal Ġlocal Ip Ġfor Ġthe Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- p " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Port Ġ= Ġiterator . next (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" INPUT ĠPORT : Ġ$ in Port ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Port Ġ= Ġiterator . next (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" OUTPUT ĠPORT : Ġ$ out Port ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Port Ġ= Ġiterator . next (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" APP ĠSERVER ĠPORT : Ġ$ app Port ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- p Ġmust Ġbe Ġfollowed Ġby Ġthree Ġparameters , Ġthe Ġport Ġfor Ġthe Ġinput Ġserver , Ġthen Ġthe Ġport Ġfor Ġthe Ġoutput Ġserver , Ġthen Ġthe Ġport Ġfor Ġthe Ġapp Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- p Ġmust Ġbe Ġfollowed Ġby Ġthree Ġparameters , Ġthe Ġport Ġfor Ġthe Ġinput Ġserver , Ġthen Ġthe Ġport Ġfor Ġthe Ġoutput Ġserver , Ġthen Ġthe Ġport Ġfor Ġthe Ġapp Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- p Ġmust Ġbe Ġfollowed Ġby Ġthree Ġparameters , Ġthe Ġport Ġfor Ġthe Ġinput Ġserver , Ġthen Ġthe Ġport Ġfor Ġthe Ġoutput Ġserver , Ġthen Ġthe Ġport Ġfor Ġthe Ġapp Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- n " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" NAME : Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- n Ġmust Ġbe Ġfollowed Ġby Ġthe Ġname Ġfor Ġthe Ġgps Ġdisplay ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- m " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmins Ġ= Ġiterator . next (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" MIN S : Ġ$ mins ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- m Ġmust Ġbe Ġfollowed Ġby Ġthe Ġdefault Ġnumber Ġof Ġminutes Ġof Ġdata Ġto Ġshow Ġon Ġthe Ġoutput ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- pw " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" PASS : Ġ$ pass ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- pw Ġmust Ġbe Ġfollowed Ġby Ġthe Ġpassword Ġfor Ġthe Ġoutput Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- a " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠapiKey Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" API ĠKEY : Ġ$ apiKey ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- a Ġmust Ġbe Ġfollowed Ġby Ġthe Ġgoogle Ġmaps Ġjavascript Ġapi Ġkey ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- e " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Ip Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" EXTERNAL ĠIP : Ġ$ external Ip ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- e Ġmust Ġbe Ġfollowed Ġby Ġthe Ġexternal Ġip Ġaddress ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( ip Ġ== Ġnull Ġ|| Ġin Port Ġ== Ġnull Ġ|| Ġout Port Ġ== Ġnull Ġ|| Ġapp Port Ġ== Ġnull Ġ|| Ġpass Ġ== Ġnull Ġ|| ĠapiKey Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("- i , Ġ- p , Ġ- a , Ġand Ġ- pw Ġare Ġmandatory Ġparameters . ĠAdd Ġ- h Ġto Ġview Ġhelp ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinput Server Ġ= ĠInput Server ( ip , Ġin Port ) ĊĠĠĠ Ġval Ġoutput Server Ġ= ĠOutput Server ( ip , Ġout Port , Ġapp Port , Ġpass , ĠapiKey , Ġmins , Ġname , Ġexternal Ip ) ĊĠĠĠ Ġval Ġapp Server Ġ= ĠApp Server ( ip , Ġapp Port ) ĊĊĠĠĠ ĠLOGGER . info (" Output ĠServer ĠLink : Ġhttp ://${ output Server . external Ip }: $ out Port ") ĊĠĠĠ ĠLOGGER . info (" Output ĠServer ĠLink Ġ( pass - free ): Ġhttp ://${ output Server . external Ip }: $ out Port /? password =$ pass ") ĊĊĊĠĠĠ ĠRuntime . get Runtime (). add Shutdown Hook ( object Ġ: ĠThread () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Server . close All Connections () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Server . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Server . close All Connections () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Server . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Server . close All Connections () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Server . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) Ċ } Ċ Ċ fun Ġprint Help () Ġ{ ĊĠĠĠ Ġprintln (" Help :") ĊĠĠĠ Ġprintln ("- i Ġ< local Ip > Ġ: ĠThe ĠLocal ĠIP Ġaddress Ġof Ġthe Ġserver ") ĊĠĠĠ Ġprintln ("- p Ġ< port > Ġ< port > ĠThe Ġports Ġfor Ġthe Ġinput Ġand Ġoutput Ġservers Ġrespectively ") ĊĠĠĠ Ġprintln ("- pw Ġ< password > Ġ: ĠThe Ġpassword Ġfor Ġthe Ġoutput Ġserver ") ĊĠĠĠ Ġprintln ("- a Ġ< apiKey > Ġ: ĠThe Ġgoogle Ġmaps Ġjavascript Ġapi Ġkey ") ĊĠĠĠ Ġprintln ("- h Ġ: ĠShow Ġthis Ġmessage ") ĊĠĠĠ Ġprintln ("- v Ġ: ĠAdd Ġnames Ġto Ġv ans ") ĊĠĠĠ Ġprintln ("- n Ġ< name > Ġ: ĠThe Ġname Ġto Ġshow Ġon Ġthe Ġoutput Ġserver ") ĊĠĠĠ Ġprintln ("- m Ġ< mins > Ġ: ĠThe Ġnumber Ġof Ġminutes Ġof Ġhistory Ġto Ġshow ") Ċ } Ċ