import Ġkotlinx . c interop .* Ċ import Ġplatform . windows .* Ċ import Ġplatform . posix .* Ċ import Ġkotlin . math . max Ċ Ċ type alias ĠW STR Ġ= ĠC Pointer < U Short Var > Ċ Ċ private Ġfun ĠW STR . to K String (): ĠString Ġ= Ġmem Scoped Ġ{ ĊĠĠĠ Ġ// ĠFigure Ġout Ġhow Ġmuch Ġmemory Ġwe Ġneed Ġafter ĠUTF - 8 Ġconversion . ĊĠĠĠ Ġval Ġsz Ġ= ĠWide Char To Multi Byte ( CP _ UTF 8 , ĠWC _ ERR _ INVALID _ CHARS , Ġthis @ to K String , Ġ- 1 , Ġnull , Ġ 0 , Ġnull , Ġnull ) ĊĠĠĠ Ġ// ĠNow Ġconvert Ġto ĠUTF - 8 Ġand Ġfrom Ġthere , Ġa ĠString . ĊĠĠĠ Ġval Ġutf 8 Ġ= Ġalloc Array < Byte Var >( sz ) ĊĠĠĠ Ġval Ġr Ġ= ĠWide Char To Multi Byte ( CP _ UTF 8 , ĠWC _ ERR _ INVALID _ CHARS , Ġthis @ to K String , Ġ- 1 , Ġutf 8 , Ġsz , Ġnull , Ġnull ) ĊĠĠĠ Ġif Ġ( r Ġ== Ġ 0 ) Ġthrow ĠRuntimeException (" Could Ġnot Ġconvert Ġto ĠUTF - 8 ") ĊĠĠĠ Ġutf 8 . to K String () Ċ } Ċ Ċ private Ġval Ġfull Binary Path : ĠString Ġby Ġlazy Ġ{ ĊĠĠĠ Ġ// ĠGet Ġthe Ġpath Ġto Ġthe ĠEX E . ĊĠĠĠ Ġval Ġh module Ġ= ĠGet Module Handle W ( null ) ĊĠĠĠ Ġval Ġw str : ĠW STR Ġ= Ġnative Heap . alloc Array < U Short Var >( MAX _ PATH ) ĊĠĠĠ ĠGet Module FileName W ( h module , Ġw str , ĠMAX _ PATH ) ĊĠĠĠ Ġ// ĠStrip Ġthe Ġfilename Ġleaving Ġjust Ġthe Ġdirectory . ĊĠĠĠ ĠPath Remove File Spec W ( w str ) ĊĠĠĠ Ġw str . to K String () Ċ } Ċ Ċ fun Ġerror ( message : ĠString ) Ġ{ ĊĠĠĠ ĠMessageBox W ( null , Ġmessage , Ġ" Error ", ĠMB _ OK . to UInt () Ġor ĠMB _ ICON EXCL AM ATION . to UInt ()) ĊĠĠĠ Ġthrow ĠRuntimeException ( message ) Ċ } Ċ Ċ fun Ġfind Highest Version (): ĠInt Ġ= Ġmem Scoped Ġ{ ĊĠĠĠ Ġval Ġpath Ġ= Ġ"$ full Binary Path \\ *" ĊĠĠĠ Ġval Ġfind Data Ġ= Ġalloc <_ WIN 3 2 _ FIND _ DATA W >() ĊĠĠĠ Ġvar Ġh Find Ġ= ĠFind First File W ( path , Ġfind Data . ptr ) ĊĠĠĠ Ġif Ġ( h Find . raw Value . to Long () Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" Could Ġnot Ġlist Ġcontents Ġof Ġdirectory Ġ$ path ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġhighest Version Ġ= Ġ 0 ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Name Ġ= Ġfind Data . c FileName . to K String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Name . any Ġ{ Ġ! it . is Digit () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum : ĠInt Ġ= Ġentry Name . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Version Ġ= Ġmax ( highest Version , Ġnum ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( Find Next File W ( h Find , Ġfind Data . ptr ) Ġ!= Ġ 0 ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ ĠFind Close ( h Find ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġhighest Version Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhighest Version Found Ġ= Ġfind Highest Version () ĊĠĠĠĠĠĠĠ Ġval Ġexec Dir Ġ= Ġ"$ full Binary Path \\ $ highest Version Found " ĊĠĠĠĠĠĠĠ Ġval Ġexec Path Ġ= Ġ"$ exec Dir \\ Gr av iton Browser . exe " ĊĠĠĠĠĠĠĠ Ġput env (" GR AV IT ON _ PATH =$ full Binary Path ") ĊĠĠĠĠĠĠĠ Ġput env (" GR AV IT ON _ EXE =$ exec Path ") ĊĠĠĠĠĠĠĠ Ġput env (" GR AV IT ON _ VERSION =$ highest Version Found ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnable ĠVT - 1 0 0 ĠANSI Ġescape Ġsequence Ġhandling Ġon ĠWindows Ġ 1 0 . ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġenables Ġcolo ured Ġterminal Ġoutput Ġfor Ġall Ġapps . ĊĠĠĠĠĠĠĠ Ġval Ġstdout Ġ= ĠGet Std Handle ((- 1 1 ). to UInt ()) ĊĠĠĠĠĠĠĠ Ġvar Ġdw Mode Ġ= Ġalloc < UInt Var >() ĊĠĠĠĠĠĠĠ ĠGet Console Mode ( stdout , Ġdw Mode . ptr ) ĊĠĠĠĠĠĠĠ ĠSet Console Mode ( stdout , Ġdw Mode . value Ġor Ġ 0 x 0 0 0 4 u Ġor Ġ 0 x 0 0 0 8 u ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġup Ġthe Ġversion ed Ġbinary . ĊĠĠĠĠĠĠĠ Ġval Ġstartup Info Ġ= Ġalloc <_ START UP INFO W >() ĊĠĠĠĠĠĠĠ Ġstartup Info . cb Ġ= Ġsize Of <_ START UP INFO W >(). to UInt () ĊĠĠĠĠĠĠĠ Ġval Ġprocess Info Ġ= Ġalloc <_ PROCESS _ INFORMATION >() ĊĠĠĠĠĠĠĠ Ġval Ġarg Str Ġ= Ġ"\" $ exec Path \" Ġ" Ġ+ Ġargs . join ToString (" Ġ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠCreate Process W ( null , Ġarg Str . wc str . ptr , Ġnull , Ġnull , Ġ 1 , Ġ 0 , Ġnull , Ġnull , Ġstartup Info . ptr , Ġprocess Info . ptr ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Error Ġ= ĠGetLastError () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Create Process Ġreturned Ġ$ last Error ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġmay Ġwant Ġto Ġwait Ġfor Ġit , Ġif Ġthere 's Ġan Ġattached Ġconsole . ĠOtherwise Ġwe Ġshould ĊĠĠĠĠĠĠĠ Ġ// Ġquit Ġto Ġensure Ġthis Ġbinary Ġcan Ġbe Ġupdated Ġin - place Ġby Ġa Ġbackground Ġupdate . ĠThere 's ĊĠĠĠĠĠĠĠ Ġ// Ġno Ġpoint Ġin Ġwaiting Ġif Ġthere 's Ġno Ġcmd . com Ġto Ġkeep Ġh anging Ġaround . ĊĠĠĠĠĠĠĠ Ġif Ġ( Get Console Window () Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWaitFor Single Object ( process Info . h Process , ĠIN FIN ITE ) ĊĠĠĠ Ġ} Ċ }