+
+; *** Buttons
+ButtonBack=< Na&zaj
+ButtonNext=&Naprej >
+ButtonInstall=&Namesti
+ButtonOK=V redu
+ButtonCancel=Preklii
+ButtonYes=&Da
+ButtonYesToAll=Da za &vse
+ButtonNo=&Ne
+ButtonNoToAll=N&e za vse
+ButtonFinish=&Konaj
+ButtonBrowse=Pre&brskaj...
+ButtonWizardBrowse=Pre&brskaj...
+ButtonNewFolder=&Ustvari novo mapo
+
+; *** "Select Language" dialog messages
+SelectLanguageTitle=Izbira jezika namestitve
+SelectLanguageLabel=Izberite jezik, ki ga elite uporabljati med namestitvijo.
+
+; *** Common wizard text
+ClickNext=Kliknite Naprej za nadaljevanje namestitve ali Preklii za prekinitev namestitve.
+BeveledLabel=
+BrowseDialogTitle=Izbira mape
+BrowseDialogLabel=Izberite mapo s spiska, nato kliknite V redu.
+NewFolderName=Nova mapa
+
+; *** "Welcome" wizard page
+WelcomeLabel1=Dobrodoli v namestitev programa [name].
+WelcomeLabel2=V raunalnik boste namestili program [name/ver].%n%nPriporoljivo je, da pred zaetkom namestitve zaprete vse odprte programe.
+
+; *** "Password" wizard page
+WizardPassword=Geslo
+PasswordLabel1=Namestitev je zaitena z geslom.
+PasswordLabel3=Vnesite geslo, nato kliknite Naprej za nadaljevanje. Pri vnaanju pazite na male in velike rke.
+PasswordEditLabel=&Geslo:
+IncorrectPassword=Vneseno geslo ni pravilno. Poizkusite ponovno.
+
+; *** "License Agreement" wizard page
+WizardLicense=Licenna pogodba
+LicenseLabel=Pred nadaljevanjem preberite licenno pogodbo za uporabo programa.
+LicenseLabel3=Preberite licenno pogodbo za uporabo programa. Program lahko namestite le, e se s pogodbo v celoti strinjate.
+LicenseAccepted=&Da, sprejemam vse pogoje licenne pogodbe
+LicenseNotAccepted=N&e, pogojev licenne pogodbe ne sprejmem
+
+; *** "Information" wizard pages
+WizardInfoBefore=Informacije
+InfoBeforeLabel=Pred nadaljevanjem preberite naslednje pomembne informacije.
+InfoBeforeClickLabel=Ko boste pripravljeni na nadaljevanje namestitve, kliknite Naprej.
+WizardInfoAfter=Informacije
+InfoAfterLabel=Pred nadaljevanjem preberite naslednje pomembne informacije.
+InfoAfterClickLabel=Ko boste pripravljeni na nadaljevanje namestitve, kliknite Naprej.
+
+; *** "User Information" wizard page
+WizardUserInfo=Podatki o uporabniku
+UserInfoDesc=Vnesite svoje podatke.
+UserInfoName=&Ime:
+UserInfoOrg=&Podjetje:
+UserInfoSerial=&Serijska tevilka:
+UserInfoNameRequired=Vnos imena je obvezen.
+
+; *** "Select Destination Location" wizard page
+WizardSelectDir=Izbira ciljnega mesta
+SelectDirDesc=Kam elite namestiti program [name]?
+SelectDirLabel3=Program [name] bo nameen v naslednjo mapo.
+SelectDirBrowseLabel=Za nadaljevanje kliknite Naprej. e elite izbrati drugo mapo, kliknite Prebrskaj.
+DiskSpaceGBLabel=Na disku mora biti vsaj [gb] GB prostora.
+DiskSpaceMBLabel=Na disku mora biti vsaj [mb] MB prostora.
+CannotInstallToNetworkDrive=Programa ni mogoe namestiti na mreni pogon.
+CannotInstallToUNCPath=Programa ni mogoe namestiti v UNC pot.
+InvalidPath=Vpisati morate polno pot vkljuno z oznako pogona. Primer:%n%nC:\PROGRAM%n%nali UNC pot v obliki:%n%n\\strenik\mapa_skupne_rabe
+InvalidDrive=Izbrani pogon ali omreno sredstvo UNC ne obstaja ali ni dostopno. Izberite drugega.
+DiskSpaceWarningTitle=Na disku ni dovolj prostora
+DiskSpaceWarning=Namestitev potrebuje vsaj %1 KB prostora, toda na izbranem pogonu je na voljo le %2 KB.%n%nelite kljub temu nadaljevati?
+DirNameTooLong=Ime mape ali poti je predolgo.
+InvalidDirName=Ime mape ni veljavno.
+BadDirName32=Ime mape ne sme vsebovati naslednjih znakov:%n%n%1
+DirExistsTitle=Mapa e obstaja
+DirExists=Mapa%n%n%1%n%ne obstaja. elite program vseeno namestiti v to mapo?
+DirDoesntExistTitle=Mapa ne obstaja
+DirDoesntExist=Mapa %n%n%1%n%nne obstaja. Ali jo elite ustvariti?
+
+; *** "Select Components" wizard page
+WizardSelectComponents=Izbira komponent
+SelectComponentsDesc=Katere komponente elite namestiti?
+SelectComponentsLabel2=Oznaite komponente, ki jih elite namestiti; odznaite komponente, ki jih ne elite namestiti. Kliknite Naprej, ko boste pripravljeni za nadaljevanje.
+FullInstallation=Popolna namestitev
+; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
+CompactInstallation=Osnovna namestitev
+CustomInstallation=Namestitev po meri
+NoUninstallWarningTitle=Komponente e obstajajo
+NoUninstallWarning=Namestitveni program je ugotovil, da so naslednje komponente e nameene v raunalniku:%n%n%1%n%nNamestitveni program teh e nameenih komponent ne bo odstranil.%n%nelite vseeno nadaljevati?
+ComponentSize1=%1 KB
+ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=Za izbrano namestitev potrebujete vsaj [gb] GB prostora na disku.
+ComponentsDiskSpaceMBLabel=Za izbrano namestitev potrebujete vsaj [mb] MB prostora na disku.
+
+; *** "Select Additional Tasks" wizard page
+WizardSelectTasks=Izbira dodatnih opravil
+SelectTasksDesc=Katera dodatna opravila elite izvesti?
+SelectTasksLabel2=Izberite dodatna opravila, ki jih bo namestitveni program opravil med namestitvijo programa [name], nato kliknite Naprej.
+
+; *** "Select Start Menu Folder" wizard page
+WizardSelectProgramGroup=Izbira mape v meniju Zaetek
+SelectStartMenuFolderDesc=Kje naj namestitveni program ustvari blinjice?
+SelectStartMenuFolderLabel3=Namestitveni program bo ustvaril blinjice v naslednji mapi v meniju Start.
+SelectStartMenuFolderBrowseLabel=Za nadaljevanje kliknite Naprej. e elite izbrati drugo mapo, kliknite Prebrskaj.
+MustEnterGroupName=Ime skupine mora biti vpisano.
+GroupNameTooLong=Ime mape ali poti je predolgo.
+InvalidGroupName=Ime mape ni veljavno.
+BadGroupName=Ime skupine ne sme vsebovati naslednjih znakov:%n%n%1
+NoProgramGroupCheck2=&Ne ustvari mape v meniju Start
+
+; *** "Ready to Install" wizard page
+WizardReady=Pripravljen za namestitev
+ReadyLabel1=Namestitveni program je pripravljen za namestitev programa [name] v va raunalnik.
+ReadyLabel2a=Kliknite Namesti za zaetek nameanja. Kliknite Nazaj, e elite pregledati ali spremeniti katerokoli nastavitev.
+ReadyLabel2b=Kliknite Namesti za zaetek nameanja.
+ReadyMemoUserInfo=Podatki o uporabniku:
+ReadyMemoDir=Ciljno mesto:
+ReadyMemoType=Vrsta namestitve:
+ReadyMemoComponents=Izbrane komponente:
+ReadyMemoGroup=Mapa v meniju Zaetek:
+ReadyMemoTasks=Dodatna opravila:
+
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Prenaam dodatne datoteke...
+ButtonStopDownload=Prekini preno&s
+StopDownload=Ali res elite prekiniti prenos?
+ErrorDownloadAborted=Prenos prekinjen
+ErrorDownloadFailed=Prenos ni uspel: %1 %2
+ErrorDownloadSizeFailed=Pridobivanje velikosti ni uspelo: %1 %2
+ErrorFileHash1=Pridobivanje zgoene vrednosti ni uspelo: %1
+ErrorFileHash2=Neveljavna zgoena vrednost: priakovana %1, dobljena %2
+ErrorProgress=Neveljaven potek: %1 od %2
+ErrorFileSize=Neveljavna velikost datoteke: priakovana %1, dobljena %2
+
+; *** "Preparing to Install" wizard page
+WizardPreparing=Pripravljam za namestitev
+PreparingDesc=Namestitveni program je pripravljen za namestitev programa [name] v va raunalnik.
+PreviousInstallNotCompleted=Namestitev ali odstranitev prejnjega programa ni bila konana. Da bi jo dokonali, morate raunalnik znova zagnati.%n%nPo ponovnem zagonu raunalnika znova zaenite namestitveni program, da boste konali namestitev programa [name].
+CannotContinue=Namestitveni program ne more nadaljevati. Pritisnite Preklii za izhod.
+
+; *** "Installing" wizard page
+ApplicationsFound=Naslednji programi uporabljajo datoteke, ki jih mora namestitveni program posodobiti. Priporoljivo je, da namestitvenemu programu dovolite, da te programe kona.
+ApplicationsFound2=Naslednji programi uporabljajo datoteke, ki jih mora namestitveni program posodobiti. Priporoljivo je, da namestitvenemu programu dovolite, da te programe kona. Po koncu namestitve bo namestitveni program poizkusil znova zagnati te programe.
+CloseApplications=S&amodejno zapri programe
+DontCloseApplications=&Ne zapri programov
+ErrorCloseApplications=Namestitvenemu programu ni uspelo samodejno zapreti vseh programov. Priporoljivo je, da pred nadaljevanjem zaprete vse programe, ki uporabljajo datoteke, katere mora namestitev posodobiti.
+PrepareToInstallNeedsRestart=Namestitveni program mora znova zagnati va raunalnik. Za dokonanje namestitve programa [name], po ponovnem zagonu znova zaenite namestitveni program.%n%nAli elite zdaj znova zagnati raunalnik?
+
+WizardInstalling=Nameanje
+InstallingLabel=Poakajte, da bo program [name] nameen v va raunalnik.
+
+; *** "Setup Completed" wizard page
+FinishedHeadingLabel=Zakljuek namestitve programa [name]
+FinishedLabelNoIcons=Program [name] je nameen v va raunalnik.
+FinishedLabel=Program [name] je nameen v va raunalnik. Program zaenete tako, da odprete pravkar ustvarjene programske ikone.
+ClickFinish=Kliknite tipko Konaj za zakljuek namestitve.
+FinishedRestartLabel=Za dokonanje namestitve programa [name] morate raunalnik znova zagnati. Ali ga elite znova zagnati zdaj?
+FinishedRestartMessage=Za dokonanje namestitve programa [name] morate raunalnik znova zagnati. %n%nAli ga elite znova zagnati zdaj?
+ShowReadmeCheck=elim prebrati datoteko BERIME
+YesRadio=&Da, raunalnik znova zaeni zdaj
+NoRadio=&Ne, raunalnik bom znova zagnal pozneje
+
+; used for example as 'Run MyProg.exe'
+RunEntryExec=Zaeni %1
+; used for example as 'View Readme.txt'
+RunEntryShellExec=Preglej %1
+
+; *** "Setup Needs the Next Disk" stuff
+ChangeDiskTitle=Namestitveni program potrebuje naslednji disk
+SelectDiskLabel2=Vstavite disk %1 in kliknite V redu.%n%ne se datoteke s tega diska nahajajo v drugi mapi kot je navedena spodaj, vnesite pravilno pot ali kliknite Prebrskaj.
+PathLabel=&Pot:
+FileNotInDir2=Datoteke %1 ni v mapi %2. Vstavite pravilni disk ali izberite drugo mapo.
+SelectDirectoryLabel=Vnesite mesto naslednjega diska.
+
+; *** Installation phase messages
+SetupAborted=Namestitev ni bila konana.%n%nOdpravite teavo in znova odprite namestitveni program.
+AbortRetryIgnoreSelectAction=Izberite dejanje
+AbortRetryIgnoreRetry=Poizkusi &znova
+AbortRetryIgnoreIgnore=&Prezri napako in nadaljuj
+AbortRetryIgnoreCancel=Preklii namestitev
+
+; *** Installation status messages
+StatusClosingApplications=Zapiranje programov...
+StatusCreateDirs=Ustvarjanje map...
+StatusExtractFiles=Razirjanje datotek...
+StatusCreateIcons=Ustvarjanje blinjic...
+StatusCreateIniEntries=Vpisovanje v INI datoteke...
+StatusCreateRegistryEntries=Ustvarjanje vnosov v register...
+StatusRegisterFiles=Registriranje datotek...
+StatusSavingUninstall=Zapisovanje podatkov za odstranitev...
+StatusRunProgram=Zakljuevanje namestitve...
+StatusRestartingApplications=Zaganjanje programov...
+StatusRollback=Obnavljanje prvotnega stanja...
+
+; *** Misc. errors
+ErrorInternal2=Interna napaka: %1
+ErrorFunctionFailedNoCode=%1 ni uspel(a)
+ErrorFunctionFailed=%1 ni uspel(a); koda %2
+ErrorFunctionFailedWithMessage=%1 ni uspela; koda %2.%n%3
+ErrorExecutingProgram=Ne morem zagnati programa:%n%1
+
+; *** Registry errors
+ErrorRegOpenKey=Napaka pri odpiranju kljua v registru:%n%1\%2
+ErrorRegCreateKey=Napaka pri ustvarjanju kljua v registru:%n%1\%2
+ErrorRegWriteKey=Napaka pri pisanju kljua v registru:%n%1\%2
+
+; *** INI errors
+ErrorIniEntry=Napaka pri vpisu v INI datoteko %1.
+
+; *** File copying errors
+FileAbortRetryIgnoreSkipNotRecommended=Pre&skoi to datoteko (ni priporoeno)
+FileAbortRetryIgnoreIgnoreNotRecommended=Prezr&i napako in nadaljuj (ni priporoeno)
+SourceIsCorrupted=Izvorna datoteka je okvarjena
+SourceDoesntExist=Izvorna datoteka %1 ne obstaja
+ExistingFileReadOnly2=Obstojee datoteke ni mogoe nadomestiti, ker ima oznako samo za branje.
+ExistingFileReadOnlyRetry=Odst&rani oznako samo za branje in poizkusi ponovno
+ExistingFileReadOnlyKeepExisting=&Ohrani obstojeo datoteko
+ErrorReadingExistingDest=Pri branju obstojee datoteke je prilo do napake:
+FileExistsSelectAction=Izberite dejanje
+FileExists2=Datoteka e obstaja.
+FileExistsOverwriteExisting=&Prepii obstojeo datoteko
+FileExistsKeepExisting=&Ohrani trenutno datoteko
+FileExistsOverwriteOrKeepAll=&To naredite za preostale spore
+ExistingFileNewerSelectAction=Izberite dejanje
+ExistingFileNewer2=Obstojea datoteka je noveja, kot datoteka, ki se namea.
+ExistingFileNewerOverwriteExisting=&Prepii obstojeo datoteko
+ExistingFileNewerKeepExisting=&Ohrani trenutno datoteko (priporoeno)
+ExistingFileNewerOverwriteOrKeepAll=&To naredite za preostale spore
+ErrorChangingAttr=Pri poskusu spremembe lastnosti datoteke je prilo do napake:
+ErrorCreatingTemp=Pri ustvarjanju datoteke v ciljni mapi je prilo do napake:
+ErrorReadingSource=Pri branju izvorne datoteke je prilo do napake:
+ErrorCopying=Pri kopiranju datoteke je prilo do napake:
+ErrorReplacingExistingFile=Pri poskusu zamenjave obstojee datoteke je prilo do napake:
+ErrorRestartReplace=Napaka RestartReplace:
+ErrorRenamingTemp=Pri poskusu preimenovanja datoteke v ciljni mapi je prilo do napake:
+ErrorRegisterServer=Registracija DLL/OCX ni uspela: %1
+ErrorRegSvr32Failed=RegSvr32 ni uspel s kodo napake %1
+ErrorRegisterTypeLib=Registracija TypeLib ni uspela: %1
+
+; *** Uninstall display name markings
+UninstallDisplayNameMark=%1 (%2)
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32-bitno
+UninstallDisplayNameMark64Bit=64-bitno
+UninstallDisplayNameMarkAllUsers=vsi uporabniki
+UninstallDisplayNameMarkCurrentUser=trenutni uporabnik
+
+; *** Post-installation errors
+ErrorOpeningReadme=Pri odpiranju datoteke BERIME je prilo do napake.
+ErrorRestartingComputer=Namestitvenemu programu ni uspelo znova zagnati raunalnika. Sami znova zaenite raunalnik.
+
+; *** Uninstaller messages
+UninstallNotFound=Datoteka %1 ne obstaja. Odstranitev ni mogoa.
+UninstallOpenError=Datoteke %1 ne morem odpreti. Ne morem odstraniti
+UninstallUnsupportedVer=Dnevnika datoteka %1 je v obliki, ki je ta razliica odstranitvenega programa ne razume. Programa ni mogoe odstraniti
+UninstallUnknownEntry=V dnevniki datoteki je bil najden neznani vpis (%1)
+ConfirmUninstall=Ste prepriani, da elite v celoti odstraniti program %1 in pripadajoe komponente?
+UninstallOnlyOnWin64=To namestitev je mogoe odstraniti le v 64-bitni razliici sistema Windows.
+OnlyAdminCanUninstall=Za odstranitev tega programa morate imeti skrbnike pravice.
+UninstallStatusLabel=Poakajte, da se program %1 odstrani iz vaega raunalnika.
+UninstalledAll=Program %1 je bil uspeno odstranjen iz vaega raunalnika.
+UninstalledMost=Odstranjevanje programa %1 je konano.%n%nNekatere datoteke niso bile odstranjene in jih lahko odstranite rono.
+UninstalledAndNeedsRestart=Za dokonanje odstranitve programa %1 morate raunalnik znova zagnati.%n%nAli ga elite znova zagnati zdaj?
+UninstallDataCorrupted=Datoteka %1 je okvarjena. Odstranitev ni mona
+
+; *** Uninstallation phase messages
+ConfirmDeleteSharedFileTitle=elite odstraniti datoteko v skupni rabi?
+ConfirmDeleteSharedFile2=Spodaj izpisane datoteke v skupni rabi ne uporablja ve noben program. elite odstraniti to datoteko?%n%ne jo uporablja katerikoli program in jo boste odstranili, ta program verjetno ne bo ve deloval pravilno. e niste prepriani, kliknite Ne. e boste datoteko ohranili v raunalniku, ne bo ni narobe.
+SharedFileNameLabel=Ime datoteke:
+SharedFileLocationLabel=Mesto:
+WizardUninstalling=Odstranjevanje programa
+StatusUninstalling=Odstranjujem %1...
+
+ShutdownBlockReasonInstallingApp=Nameam %1.
+ShutdownBlockReasonUninstallingApp=Odstranjujem %1.
+
+[CustomMessages]
+
+NameAndVersion=%1 razliica %2
+AdditionalIcons=Dodatne ikone:
+CreateDesktopIcon=Ustvari ikono na &namizju
+CreateQuickLaunchIcon=Ustvari ikono za &hitri zagon
+ProgramOnTheWeb=%1 na spletu
+UninstallProgram=Odstrani %1
+LaunchProgram=Odpri %1
+AssocFileExtension=&Povei %1 s pripono %2
+AssocingFileExtension=Povezujem %1 s pripono %2...
+AutoStartProgramGroupDescription=Zagon:
+AutoStartProgram=Samodejno zaeni %1
+AddonHostProgramNotFound=Programa %1 ni bilo mogoe najti v izbrani mapi.%n%nAli elite vseeno nadaljevati?
diff --git a/Dependencies/Inno/Languages/Spanish.isl b/Dependencies/Inno/Languages/Spanish.isl
new file mode 100644
index 00000000..0bd5df2f
--- /dev/null
+++ b/Dependencies/Inno/Languages/Spanish.isl
@@ -0,0 +1,383 @@
+; *** Inno Setup version 6.1.0+ Spanish messages ***
+;
+; Maintained by Jorge Andres Brugger (jbrugger@ideaworks.com.ar)
+; Spanish.isl version 1.5 (20200727)
+; Default.isl version 6.1.0
+;
+; Thanks to Germn Giraldo, Jordi Latorre, Ximo Tamarit, Emiliano Llano,
+; Ramn Verduzco, Graciela Garca, Carles Millan and Rafael Barranco-Droege
+
+[LangOptions]
+; The following three entries are very important. Be sure to read and
+; understand the '[LangOptions] section' topic in the help file.
+LanguageName=Espa<00F1>ol
+LanguageID=$0c0a
+LanguageCodePage=1252
+; If the language you are translating to requires special font faces or
+; sizes, uncomment any of the following entries and change them accordingly.
+;DialogFontName=
+;DialogFontSize=8
+;WelcomeFontName=Verdana
+;WelcomeFontSize=12
+;TitleFontName=Arial
+;TitleFontSize=29
+;CopyrightFontName=Arial
+;CopyrightFontSize=8
+
+[Messages]
+
+; *** Application titles
+SetupAppTitle=Instalar
+SetupWindowTitle=Instalar - %1
+UninstallAppTitle=Desinstalar
+UninstallAppFullTitle=Desinstalar - %1
+
+; *** Misc. common
+InformationTitle=Informacin
+ConfirmTitle=Confirmar
+ErrorTitle=Error
+
+; *** SetupLdr messages
+SetupLdrStartupMessage=Este programa instalar %1. Desea continuar?
+LdrCannotCreateTemp=Imposible crear archivo temporal. Instalacin interrumpida
+LdrCannotExecTemp=Imposible ejecutar archivo en la carpeta temporal. Instalacin interrumpida
+HelpTextNote=
+
+; *** Startup error messages
+LastErrorMessage=%1.%n%nError %2: %3
+SetupFileMissing=El archivo %1 no se encuentra en la carpeta de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa.
+SetupFileCorrupt=Los archivos de instalacin estn daados. Por favor, obtenga una copia nueva del programa.
+SetupFileCorruptOrWrongVer=Los archivos de instalacin estn daados o son incompatibles con esta versin del programa de instalacin. Por favor, solucione el problema u obtenga una copia nueva del programa.
+InvalidParameter=Se ha utilizado un parmetro no vlido en la lnea de comandos:%n%n%1
+SetupAlreadyRunning=El programa de instalacin an est ejecutndose.
+WindowsVersionNotSupported=Este programa no es compatible con la versin de Windows de su equipo.
+WindowsServicePackRequired=Este programa requiere %1 Service Pack %2 o posterior.
+NotOnThisPlatform=Este programa no se ejecutar en %1.
+OnlyOnThisPlatform=Este programa debe ejecutarse en %1.
+OnlyOnTheseArchitectures=Este programa slo puede instalarse en versiones de Windows diseadas para las siguientes arquitecturas de procesadores:%n%n%1
+WinVersionTooLowError=Este programa requiere %1 versin %2 o posterior.
+WinVersionTooHighError=Este programa no puede instalarse en %1 versin %2 o posterior.
+AdminPrivilegesRequired=Debe iniciar la sesin como administrador para instalar este programa.
+PowerUserPrivilegesRequired=Debe iniciar la sesin como administrador o como miembro del grupo de Usuarios Avanzados para instalar este programa.
+SetupAppRunningError=El programa de instalacin ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir.
+UninstallAppRunningError=El desinstalador ha detectado que %1 est ejecutndose.%n%nPor favor, cirrelo ahora, luego haga clic en Aceptar para continuar o en Cancelar para salir.
+
+; *** Startup questions
+PrivilegesRequiredOverrideTitle=Seleccin del Modo de Instalacin
+PrivilegesRequiredOverrideInstruction=Seleccione el modo de instalacin
+PrivilegesRequiredOverrideText1=%1 puede ser instalado para todos los usuarios (requiere privilegios administrativos), o solo para Ud.
+PrivilegesRequiredOverrideText2=%1 puede ser instalado solo para Ud, o para todos los usuarios (requiere privilegios administrativos).
+PrivilegesRequiredOverrideAllUsers=Instalar para &todos los usuarios
+PrivilegesRequiredOverrideAllUsersRecommended=Instalar para &todos los usuarios (recomendado)
+PrivilegesRequiredOverrideCurrentUser=Instalar para &m solamente
+PrivilegesRequiredOverrideCurrentUserRecommended=Instalar para &m solamente (recomendado)
+
+; *** Misc. errors
+ErrorCreatingDir=El programa de instalacin no pudo crear la carpeta "%1"
+ErrorTooManyFilesInDir=Imposible crear un archivo en la carpeta "%1" porque contiene demasiados archivos
+
+; *** Setup common messages
+ExitSetupTitle=Salir de la Instalacin
+ExitSetupMessage=La instalacin no se ha completado an. Si cancela ahora, el programa no se instalar.%n%nPuede ejecutar nuevamente el programa de instalacin en otra ocasin para completarla.%n%nSalir de la instalacin?
+AboutSetupMenuItem=&Acerca de Instalar...
+AboutSetupTitle=Acerca de Instalar
+AboutSetupMessage=%1 versin %2%n%3%n%n%1 sitio Web:%n%4
+AboutSetupNote=
+TranslatorNote=Spanish translation maintained by Jorge Andres Brugger (jbrugger@gmx.net)
+
+; *** Buttons
+ButtonBack=< &Atrs
+ButtonNext=&Siguiente >
+ButtonInstall=&Instalar
+ButtonOK=Aceptar
+ButtonCancel=Cancelar
+ButtonYes=&S
+ButtonYesToAll=S a &Todo
+ButtonNo=&No
+ButtonNoToAll=N&o a Todo
+ButtonFinish=&Finalizar
+ButtonBrowse=&Examinar...
+ButtonWizardBrowse=&Examinar...
+ButtonNewFolder=&Crear Nueva Carpeta
+
+; *** "Select Language" dialog messages
+SelectLanguageTitle=Seleccione el Idioma de la Instalacin
+SelectLanguageLabel=Seleccione el idioma a utilizar durante la instalacin.
+
+; *** Common wizard text
+ClickNext=Haga clic en Siguiente para continuar o en Cancelar para salir de la instalacin.
+BeveledLabel=
+BrowseDialogTitle=Buscar Carpeta
+BrowseDialogLabel=Seleccione una carpeta y luego haga clic en Aceptar.
+NewFolderName=Nueva Carpeta
+
+; *** "Welcome" wizard page
+WelcomeLabel1=Bienvenido al asistente de instalacin de [name]
+WelcomeLabel2=Este programa instalar [name/ver] en su sistema.%n%nSe recomienda cerrar todas las dems aplicaciones antes de continuar.
+
+; *** "Password" wizard page
+WizardPassword=Contrasea
+PasswordLabel1=Esta instalacin est protegida por contrasea.
+PasswordLabel3=Por favor, introduzca la contrasea y haga clic en Siguiente para continuar. En las contraseas se hace diferencia entre maysculas y minsculas.
+PasswordEditLabel=&Contrasea:
+IncorrectPassword=La contrasea introducida no es correcta. Por favor, intntelo nuevamente.
+
+; *** "License Agreement" wizard page
+WizardLicense=Acuerdo de Licencia
+LicenseLabel=Es importante que lea la siguiente informacin antes de continuar.
+LicenseLabel3=Por favor, lea el siguiente acuerdo de licencia. Debe aceptar las clusulas de este acuerdo antes de continuar con la instalacin.
+LicenseAccepted=A&cepto el acuerdo
+LicenseNotAccepted=&No acepto el acuerdo
+
+; *** "Information" wizard pages
+WizardInfoBefore=Informacin
+InfoBeforeLabel=Es importante que lea la siguiente informacin antes de continuar.
+InfoBeforeClickLabel=Cuando est listo para continuar con la instalacin, haga clic en Siguiente.
+WizardInfoAfter=Informacin
+InfoAfterLabel=Es importante que lea la siguiente informacin antes de continuar.
+InfoAfterClickLabel=Cuando est listo para continuar, haga clic en Siguiente.
+
+; *** "User Information" wizard page
+WizardUserInfo=Informacin de Usuario
+UserInfoDesc=Por favor, introduzca sus datos.
+UserInfoName=Nombre de &Usuario:
+UserInfoOrg=&Organizacin:
+UserInfoSerial=Nmero de &Serie:
+UserInfoNameRequired=Debe introducir un nombre.
+
+; *** "Select Destination Location" wizard page
+WizardSelectDir=Seleccione la Carpeta de Destino
+SelectDirDesc=Dnde debe instalarse [name]?
+SelectDirLabel3=El programa instalar [name] en la siguiente carpeta.
+SelectDirBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta diferente, haga clic en Examinar.
+DiskSpaceGBLabel=Se requieren al menos [gb] GB de espacio libre en el disco.
+DiskSpaceMBLabel=Se requieren al menos [mb] MB de espacio libre en el disco.
+CannotInstallToNetworkDrive=El programa de instalacin no puede realizar la instalacin en una unidad de red.
+CannotInstallToUNCPath=El programa de instalacin no puede realizar la instalacin en una ruta de acceso UNC.
+InvalidPath=Debe introducir una ruta completa con la letra de la unidad; por ejemplo:%n%nC:\APP%n%no una ruta de acceso UNC de la siguiente forma:%n%n\\servidor\compartido
+InvalidDrive=La unidad o ruta de acceso UNC que seleccion no existe o no es accesible. Por favor, seleccione otra.
+DiskSpaceWarningTitle=Espacio Insuficiente en Disco
+DiskSpaceWarning=La instalacin requiere al menos %1 KB de espacio libre, pero la unidad seleccionada slo cuenta con %2 KB disponibles.%n%nDesea continuar de todas formas?
+DirNameTooLong=El nombre de la carpeta o la ruta son demasiado largos.
+InvalidDirName=El nombre de la carpeta no es vlido.
+BadDirName32=Los nombres de carpetas no pueden incluir los siguientes caracteres:%n%n%1
+DirExistsTitle=La Carpeta Ya Existe
+DirExists=La carpeta:%n%n%1%n%nya existe. Desea realizar la instalacin en esa carpeta de todas formas?
+DirDoesntExistTitle=La Carpeta No Existe
+DirDoesntExist=La carpeta:%n%n%1%n%nno existe. Desea crear esa carpeta?
+
+; *** "Select Components" wizard page
+WizardSelectComponents=Seleccione los Componentes
+SelectComponentsDesc=Qu componentes deben instalarse?
+SelectComponentsLabel2=Seleccione los componentes que desea instalar y desmarque los componentes que no desea instalar. Haga clic en Siguiente cuando est listo para continuar.
+FullInstallation=Instalacin Completa
+; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
+CompactInstallation=Instalacin Compacta
+CustomInstallation=Instalacin Personalizada
+NoUninstallWarningTitle=Componentes Encontrados
+NoUninstallWarning=El programa de instalacin ha detectado que los siguientes componentes ya estn instalados en su sistema:%n%n%1%n%nDesmarcar estos componentes no los desinstalar.%n%nDesea continuar de todos modos?
+ComponentSize1=%1 KB
+ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=La seleccin actual requiere al menos [gb] GB de espacio en disco.
+ComponentsDiskSpaceMBLabel=La seleccin actual requiere al menos [mb] MB de espacio en disco.
+
+; *** "Select Additional Tasks" wizard page
+WizardSelectTasks=Seleccione las Tareas Adicionales
+SelectTasksDesc=Qu tareas adicionales deben realizarse?
+SelectTasksLabel2=Seleccione las tareas adicionales que desea que se realicen durante la instalacin de [name] y haga clic en Siguiente.
+
+; *** "Select Start Menu Folder" wizard page
+WizardSelectProgramGroup=Seleccione la Carpeta del Men Inicio
+SelectStartMenuFolderDesc=Dnde deben colocarse los accesos directos del programa?
+SelectStartMenuFolderLabel3=El programa de instalacin crear los accesos directos del programa en la siguiente carpeta del Men Inicio.
+SelectStartMenuFolderBrowseLabel=Para continuar, haga clic en Siguiente. Si desea seleccionar una carpeta distinta, haga clic en Examinar.
+MustEnterGroupName=Debe proporcionar un nombre de carpeta.
+GroupNameTooLong=El nombre de la carpeta o la ruta son demasiado largos.
+InvalidGroupName=El nombre de la carpeta no es vlido.
+BadGroupName=El nombre de la carpeta no puede incluir ninguno de los siguientes caracteres:%n%n%1
+NoProgramGroupCheck2=&No crear una carpeta en el Men Inicio
+
+; *** "Ready to Install" wizard page
+WizardReady=Listo para Instalar
+ReadyLabel1=Ahora el programa est listo para iniciar la instalacin de [name] en su sistema.
+ReadyLabel2a=Haga clic en Instalar para continuar con el proceso o haga clic en Atrs si desea revisar o cambiar alguna configuracin.
+ReadyLabel2b=Haga clic en Instalar para continuar con el proceso.
+ReadyMemoUserInfo=Informacin del usuario:
+ReadyMemoDir=Carpeta de Destino:
+ReadyMemoType=Tipo de Instalacin:
+ReadyMemoComponents=Componentes Seleccionados:
+ReadyMemoGroup=Carpeta del Men Inicio:
+ReadyMemoTasks=Tareas Adicionales:
+
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Descargando archivos adicionales...
+ButtonStopDownload=&Detener descarga
+StopDownload=Est seguiro que desea detener la descarga?
+ErrorDownloadAborted=Descarga cancelada
+ErrorDownloadFailed=Fall descarga: %1 %2
+ErrorDownloadSizeFailed=Fall obtencin de tamao: %1 %2
+ErrorFileHash1=Fall hash del archivo: %1
+ErrorFileHash2=Hash de archivo no vlido: esperado %1, encontrado %2
+ErrorProgress=Progreso no vlido: %1 de %2
+ErrorFileSize=Tamao de archivo no vlido: esperado %1, encontrado %2
+
+; *** "Preparing to Install" wizard page
+WizardPreparing=Preparndose para Instalar
+PreparingDesc=El programa de instalacin est preparndose para instalar [name] en su sistema.
+PreviousInstallNotCompleted=La instalacin/desinstalacin previa de un programa no se complet. Deber reiniciar el sistema para completar esa instalacin.%n%nUna vez reiniciado el sistema, ejecute el programa de instalacin nuevamente para completar la instalacin de [name].
+CannotContinue=El programa de instalacin no puede continuar. Por favor, presione Cancelar para salir.
+ApplicationsFound=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones.
+ApplicationsFound2=Las siguientes aplicaciones estn usando archivos que necesitan ser actualizados por el programa de instalacin. Se recomienda que permita al programa de instalacin cerrar automticamente estas aplicaciones. Al completarse la instalacin, el programa de instalacin intentar reiniciar las aplicaciones.
+CloseApplications=&Cerrar automticamente las aplicaciones
+DontCloseApplications=&No cerrar las aplicaciones
+ErrorCloseApplications=El programa de instalacin no pudo cerrar de forma automtica todas las aplicaciones. Se recomienda que, antes de continuar, cierre todas las aplicaciones que utilicen archivos que necesitan ser actualizados por el programa de instalacin.
+PrepareToInstallNeedsRestart=El programa de instalacin necesita reiniciar el sistema. Una vez que se haya reiniciado ejecute nuevamente el programa de instalacin para completar la instalacin de [name].%n%nDesea reiniciar el sistema ahora?
+
+; *** "Installing" wizard page
+WizardInstalling=Instalando
+InstallingLabel=Por favor, espere mientras se instala [name] en su sistema.
+
+; *** "Setup Completed" wizard page
+FinishedHeadingLabel=Completando la instalacin de [name]
+FinishedLabelNoIcons=El programa complet la instalacin de [name] en su sistema.
+FinishedLabel=El programa complet la instalacin de [name] en su sistema. Puede ejecutar la aplicacin utilizando los accesos directos creados.
+ClickFinish=Haga clic en Finalizar para salir del programa de instalacin.
+FinishedRestartLabel=Para completar la instalacin de [name], su sistema debe reiniciarse. Desea reiniciarlo ahora?
+FinishedRestartMessage=Para completar la instalacin de [name], su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora?
+ShowReadmeCheck=S, deseo ver el archivo LAME
+YesRadio=&S, deseo reiniciar el sistema ahora
+NoRadio=&No, reiniciar el sistema ms tarde
+; used for example as 'Run MyProg.exe'
+RunEntryExec=Ejecutar %1
+; used for example as 'View Readme.txt'
+RunEntryShellExec=Ver %1
+
+; *** "Setup Needs the Next Disk" stuff
+ChangeDiskTitle=El Programa de Instalacin Necesita el Siguiente Disco
+SelectDiskLabel2=Por favor, inserte el Disco %1 y haga clic en Aceptar.%n%nSi los archivos pueden ser hallados en una carpeta diferente a la indicada abajo, introduzca la ruta correcta o haga clic en Examinar.
+PathLabel=&Ruta:
+FileNotInDir2=El archivo "%1" no se ha podido hallar en "%2". Por favor, inserte el disco correcto o seleccione otra carpeta.
+SelectDirectoryLabel=Por favor, especifique la ubicacin del siguiente disco.
+
+; *** Installation phase messages
+SetupAborted=La instalacin no se ha completado.%n%nPor favor solucione el problema y ejecute nuevamente el programa de instalacin.
+AbortRetryIgnoreSelectAction=Seleccione accin
+AbortRetryIgnoreRetry=&Reintentar
+AbortRetryIgnoreIgnore=&Ignorar el error y continuar
+AbortRetryIgnoreCancel=Cancelar instalacin
+
+; *** Installation status messages
+StatusClosingApplications=Cerrando aplicaciones...
+StatusCreateDirs=Creando carpetas...
+StatusExtractFiles=Extrayendo archivos...
+StatusCreateIcons=Creando accesos directos...
+StatusCreateIniEntries=Creando entradas INI...
+StatusCreateRegistryEntries=Creando entradas de registro...
+StatusRegisterFiles=Registrando archivos...
+StatusSavingUninstall=Guardando informacin para desinstalar...
+StatusRunProgram=Terminando la instalacin...
+StatusRestartingApplications=Reiniciando aplicaciones...
+StatusRollback=Deshaciendo cambios...
+
+; *** Misc. errors
+ErrorInternal2=Error interno: %1
+ErrorFunctionFailedNoCode=%1 fall
+ErrorFunctionFailed=%1 fall; cdigo %2
+ErrorFunctionFailedWithMessage=%1 fall; cdigo %2.%n%3
+ErrorExecutingProgram=Imposible ejecutar el archivo:%n%1
+
+; *** Registry errors
+ErrorRegOpenKey=Error al abrir la clave del registro:%n%1\%2
+ErrorRegCreateKey=Error al crear la clave del registro:%n%1\%2
+ErrorRegWriteKey=Error al escribir la clave del registro:%n%1\%2
+
+; *** INI errors
+ErrorIniEntry=Error al crear entrada INI en el archivo "%1".
+
+; *** File copying errors
+FileAbortRetryIgnoreSkipNotRecommended=&Omitir este archivo (no recomendado)
+FileAbortRetryIgnoreIgnoreNotRecommended=&Ignorar el error y continuar (no recomendado)
+SourceIsCorrupted=El archivo de origen est daado
+SourceDoesntExist=El archivo de origen "%1" no existe
+ExistingFileReadOnly2=El archivo existente no puede ser reemplazado debido a que est marcado como slo-lectura.
+ExistingFileReadOnlyRetry=&Elimine el atributo de slo-lectura y reintente
+ExistingFileReadOnlyKeepExisting=&Mantener el archivo existente
+ErrorReadingExistingDest=Ocurri un error mientras se intentaba leer el archivo:
+FileExistsSelectAction=Seleccione accin
+FileExists2=El archivo ya existe.
+FileExistsOverwriteExisting=&Sobreescribir el archivo existente
+FileExistsKeepExisting=&Mantener el archivo existente
+FileExistsOverwriteOrKeepAll=&Hacer lo mimso para lo siguientes conflictos
+ExistingFileNewerSelectAction=Seleccione accin
+ExistingFileNewer2=El archivo existente es ms reciente que el que se est tratando de instalar.
+ExistingFileNewerOverwriteExisting=&Sobreescribir el archivo existente
+ExistingFileNewerKeepExisting=&Mantener el archivo existente (recomendado)
+ExistingFileNewerOverwriteOrKeepAll=&Hacer lo mimso para lo siguientes conflictos
+ErrorChangingAttr=Ocurri un error al intentar cambiar los atributos del archivo:
+ErrorCreatingTemp=Ocurri un error al intentar crear un archivo en la carpeta de destino:
+ErrorReadingSource=Ocurri un error al intentar leer el archivo de origen:
+ErrorCopying=Ocurri un error al intentar copiar el archivo:
+ErrorReplacingExistingFile=Ocurri un error al intentar reemplazar el archivo existente:
+ErrorRestartReplace=Fall reintento de reemplazar:
+ErrorRenamingTemp=Ocurri un error al intentar renombrar un archivo en la carpeta de destino:
+ErrorRegisterServer=Imposible registrar el DLL/OCX: %1
+ErrorRegSvr32Failed=RegSvr32 fall con el cdigo de salida %1
+ErrorRegisterTypeLib=Imposible registrar la librera de tipos: %1
+
+; *** Uninstall display name markings
+; used for example as 'My Program (32-bit)'
+UninstallDisplayNameMark=%1 (%2)
+; used for example as 'My Program (32-bit, All users)'
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32-bit
+UninstallDisplayNameMark64Bit=64-bit
+UninstallDisplayNameMarkAllUsers=Todos los usuarios
+UninstallDisplayNameMarkCurrentUser=Usuario actual
+
+; *** Post-installation errors
+ErrorOpeningReadme=Ocurri un error al intentar abrir el archivo LAME.
+ErrorRestartingComputer=El programa de instalacin no pudo reiniciar el equipo. Por favor, hgalo manualmente.
+
+; *** Uninstaller messages
+UninstallNotFound=El archivo "%1" no existe. Imposible desinstalar.
+UninstallOpenError=El archivo "%1" no pudo ser abierto. Imposible desinstalar
+UninstallUnsupportedVer=El archivo de registro para desinstalar "%1" est en un formato no reconocido por esta versin del desinstalador. Imposible desinstalar
+UninstallUnknownEntry=Se encontr una entrada desconocida (%1) en el registro de desinstalacin
+ConfirmUninstall=Est seguro que desea desinstalar completamente %1 y todos sus componentes?
+UninstallOnlyOnWin64=Este programa slo puede ser desinstalado en Windows de 64-bits.
+OnlyAdminCanUninstall=Este programa slo puede ser desinstalado por un usuario con privilegios administrativos.
+UninstallStatusLabel=Por favor, espere mientras %1 es desinstalado de su sistema.
+UninstalledAll=%1 se desinstal satisfactoriamente de su sistema.
+UninstalledMost=La desinstalacin de %1 ha sido completada.%n%nAlgunos elementos no pudieron eliminarse, pero podr eliminarlos manualmente si lo desea.
+UninstalledAndNeedsRestart=Para completar la desinstalacin de %1, su sistema debe reiniciarse.%n%nDesea reiniciarlo ahora?
+UninstallDataCorrupted=El archivo "%1" est daado. No puede desinstalarse
+
+; *** Uninstallation phase messages
+ConfirmDeleteSharedFileTitle=Eliminar Archivo Compartido?
+ConfirmDeleteSharedFile2=El sistema indica que el siguiente archivo compartido no es utilizado por ningn otro programa. Desea eliminar este archivo compartido?%n%nSi elimina el archivo y hay programas que lo utilizan, esos programas podran dejar de funcionar correctamente. Si no est seguro, elija No. Dejar el archivo en su sistema no producir ningn dao.
+SharedFileNameLabel=Archivo:
+SharedFileLocationLabel=Ubicacin:
+WizardUninstalling=Estado de la Desinstalacin
+StatusUninstalling=Desinstalando %1...
+
+; *** Shutdown block reasons
+ShutdownBlockReasonInstallingApp=Instalando %1.
+ShutdownBlockReasonUninstallingApp=Desinstalando %1.
+
+; The custom messages below aren't used by Setup itself, but if you make
+; use of them in your scripts, you'll want to translate them.
+
+[CustomMessages]
+
+NameAndVersion=%1 versin %2
+AdditionalIcons=Accesos directos adicionales:
+CreateDesktopIcon=Crear un acceso directo en el &escritorio
+CreateQuickLaunchIcon=Crear un acceso directo en &Inicio Rpido
+ProgramOnTheWeb=%1 en la Web
+UninstallProgram=Desinstalar %1
+LaunchProgram=Ejecutar %1
+AssocFileExtension=&Asociar %1 con la extensin de archivo %2
+AssocingFileExtension=Asociando %1 con la extensin de archivo %2...
+AutoStartProgramGroupDescription=Inicio:
+AutoStartProgram=Iniciar automticamente %1
+AddonHostProgramNotFound=%1 no pudo ser localizado en la carpeta seleccionada.%n%nDesea continuar de todas formas?
diff --git a/Dependencies/Inno/Languages/Turkish.isl b/Dependencies/Inno/Languages/Turkish.isl
new file mode 100644
index 00000000..932c705b
--- /dev/null
+++ b/Dependencies/Inno/Languages/Turkish.isl
@@ -0,0 +1,384 @@
+; *** Inno Setup version 6.1.0+ Turkish messages ***
+; Language "Turkce" Turkish Translate by "Ceviren" Kaya Zeren translator@zeron.net
+; To download user-contributed translations of this file, go to:
+; https://www.jrsoftware.org/files/istrans/
+;
+; Note: When translating this text, do not add periods (.) to the end of
+; messages that didn't have them already, because on those messages Inno
+; Setup adds the periods automatically (appending a period would result in
+; two periods being displayed).
+
+[LangOptions]
+; The following three entries are very important. Be sure to read and
+; understand the '[LangOptions] section' topic in the help file.
+LanguageName=T<00FC>rk<00E7>e
+LanguageID=$041f
+LanguageCodePage=1254
+; If the language you are translating to requires special font faces or
+; sizes, uncomment any of the following entries and change them accordingly.
+;DialogFontName=
+;DialogFontSize=8
+;WelcomeFontName=Verdana
+;WelcomeFontSize=12
+;TitleFontName=Arial
+;TitleFontSize=29
+;CopyrightFontName=Arial
+;CopyrightFontSize=8
+
+[Messages]
+
+; *** Uygulama balklar
+SetupAppTitle=Kurulum Yardmcs
+SetupWindowTitle=%1 - Kurulum Yardmcs
+UninstallAppTitle=Kaldrma Yardmcs
+UninstallAppFullTitle=%1 Kaldrma Yardmcs
+
+; *** eitli ortak metinler
+InformationTitle=Bilgi
+ConfirmTitle=Onay
+ErrorTitle=Hata
+
+; *** Kurulum ykleyici iletileri
+SetupLdrStartupMessage=%1 uygulamas kurulacak. Devam etmek istiyor musunuz?
+LdrCannotCreateTemp=Geici dosya oluturulamadndan kurulum iptal edildi
+LdrCannotExecTemp=Geici klasrdeki dosya altrlamadndan kurulum iptal edildi
+HelpTextNote=
+
+; *** Balang hata iletileri
+LastErrorMessage=%1.%n%nHata %2: %3
+SetupFileMissing=Kurulum klasrnde %1 dosyas eksik. Ltfen sorunu zn ya da uygulamann yeni bir kopyasyla yeniden deneyin.
+SetupFileCorrupt=Kurulum dosyalar bozulmu. Ltfen uygulamann yeni bir kopyasyla yeniden kurmay deneyin.
+SetupFileCorruptOrWrongVer=Kurulum dosyalar bozulmu ya da bu kurulum yardmcs srm ile uyumlu deil. Ltfen sorunu zn ya da uygulamann yeni bir kopyasyla yeniden kurmay deneyin.
+InvalidParameter=Komut satrnda geersiz bir parametre yazlm:%n%n%1
+SetupAlreadyRunning=Kurulum yardmcs zaten alyor.
+WindowsVersionNotSupported=Bu uygulama, bilgisayarnzda ykl olan Windows srm ile uyumlu deil.
+WindowsServicePackRequired=Bu uygulama, %1 Hizmet Paketi %2 ve zerindeki srmler ile alr.
+NotOnThisPlatform=Bu uygulama, %1 zerinde almaz.
+OnlyOnThisPlatform=Bu uygulama, %1 zerinde altrlmaldr.
+OnlyOnTheseArchitectures=Bu uygulama, yalnz u ilemci mimarileri iin tasarlanm Windows srmleriyle alr:%n%n%1
+WinVersionTooLowError=Bu uygulama iin %1 srm %2 ya da zeri gereklidir.
+WinVersionTooHighError=Bu uygulama, '%1' srm '%2' ya da zerine kurulamaz.
+AdminPrivilegesRequired=Bu uygulamay kurmak iin Ynetici olarak oturum alm olmas gereklidir.
+PowerUserPrivilegesRequired=Bu uygulamay kurarken, Ynetici ya da Gl Kullanclar grubunun bir yesi olarak oturum alm olmas gereklidir.
+SetupAppRunningError=Kurulum yardmcs %1 uygulamasnn almakta olduunu alglad.%n%nLtfen uygulamann alan tm kopyalarn kapatp, devam etmek iin Tamam, kurulum yardmcsndan kmak iin ptal zerine tklayn.
+UninstallAppRunningError=Kaldrma yardmcs, %1 uygulamasnn almakta olduunu alglad.%n%nLtfen uygulamann alan tm kopyalarn kapatp, devam etmek iin Tamam ya da kaldrma yardmcsndan kmak iin ptal zerine tklayn.
+
+; *** Balang sorular
+PrivilegesRequiredOverrideTitle=Kurulum Kipini Sein
+PrivilegesRequiredOverrideInstruction=Kurulum kipini sein
+PrivilegesRequiredOverrideText1=%1 tm kullanclar iin (ynetici izinleri gerekir) ya da yalnz sizin hesabnz iin kurulabilir.
+PrivilegesRequiredOverrideText2=%1 yalnz sizin hesabnz iin ya da tm kullanclar iin (ynetici izinleri gerekir) kurulabilir.
+PrivilegesRequiredOverrideAllUsers=&Tm kullanclar iin kurulsun
+PrivilegesRequiredOverrideAllUsersRecommended=&Tm kullanclar iin kurulsun (nerilir)
+PrivilegesRequiredOverrideCurrentUser=&Yalnz benim kullancm iin kurulsun
+PrivilegesRequiredOverrideCurrentUserRecommended=&Yalnz benim kullancm iin kurulsun (nerilir)
+
+; *** eitli hata metinleri
+ErrorCreatingDir=Kurulum yardmcs "%1" klasrn oluturamad.
+ErrorTooManyFilesInDir="%1" klasr iinde ok sayda dosya olduundan bir dosya oluturulamad
+
+; *** Ortak kurulum iletileri
+ExitSetupTitle=Kurulum Yardmcsndan k
+ExitSetupMessage=Kurulum tamamlanmad. imdi karsanz, uygulama kurulmayacak.%n%nKurulumu tamamlamak iin istediiniz zaman kurulum yardmcsn yeniden altrabilirsiniz.%n%nKurulum yardmcsndan klsn m?
+AboutSetupMenuItem=Kurulum H&akknda...
+AboutSetupTitle=Kurulum Hakknda
+AboutSetupMessage=%1 %2 srm%n%3%n%n%1 ana sayfa:%n%4
+AboutSetupNote=
+TranslatorNote=
+
+; *** Dmeler
+ButtonBack=< &nceki
+ButtonNext=&Sonraki >
+ButtonInstall=&Kur
+ButtonOK=Tamam
+ButtonCancel=ptal
+ButtonYes=E&vet
+ButtonYesToAll=&Tmne Evet
+ButtonNo=&Hayr
+ButtonNoToAll=Tmne Ha&yr
+ButtonFinish=&Bitti
+ButtonBrowse=&Gzat...
+ButtonWizardBrowse=Gza&t...
+ButtonNewFolder=Ye&ni Klasr Olutur
+
+; *** "Kurulum Dilini Sein" sayfas iletileri
+SelectLanguageTitle=Kurulum Yardmcs Dilini Sein
+SelectLanguageLabel=Kurulum sresince kullanlacak dili sein.
+
+; *** Ortak metinler
+ClickNext=Devam etmek iin Sonraki, kmak iin ptal zerine tklayn.
+BeveledLabel=
+BrowseDialogTitle=Klasre Gzat
+BrowseDialogLabel=Aadaki listeden bir klasr seip, Tamam zerine tklayn.
+NewFolderName=Yeni Klasr
+
+; *** "Ho geldiniz" sayfas
+WelcomeLabel1=[name] Kurulum Yardmcsna Hogeldiniz.
+WelcomeLabel2=Bilgisayarnza [name/ver] uygulamas kurulacak.%n%nDevam etmeden nce alan dier tm uygulamalar kapatmanz nerilir.
+
+; *** "Parola" sayfas
+WizardPassword=Parola
+PasswordLabel1=Bu kurulum parola korumaldr.
+PasswordLabel3=Ltfen parolay yazn ve devam etmek iin Sonraki zerine tklayn. Parolalar byk kk harflere duyarldr.
+PasswordEditLabel=&Parola:
+IncorrectPassword=Yazdnz parola doru deil. Ltfen yeniden deneyin.
+
+; *** "Lisans Anlamas" sayfas
+WizardLicense=Lisans Anlamas
+LicenseLabel=Ltfen devam etmeden nce aadaki nemli bilgileri okuyun.
+LicenseLabel3=Ltfen Aadaki Lisans Anlamasn okuyun. Kuruluma devam edebilmek iin bu anlamay kabul etmelisiniz.
+LicenseAccepted=Anlamay kabul &ediyorum.
+LicenseNotAccepted=Anlamay kabul et&miyorum.
+
+; *** "Bilgiler" sayfas
+WizardInfoBefore=Bilgiler
+InfoBeforeLabel=Ltfen devam etmeden nce aadaki nemli bilgileri okuyun.
+InfoBeforeClickLabel=Kuruluma devam etmeye hazr olduunuzda Sonraki zerine tklayn.
+WizardInfoAfter=Bilgiler
+InfoAfterLabel=Ltfen devam etmeden nce aadaki nemli bilgileri okuyun.
+InfoAfterClickLabel=Kuruluma devam etmeye hazr olduunuzda Sonraki zerine tklayn.
+
+; *** "Kullanc Bilgileri" sayfas
+WizardUserInfo=Kullanc Bilgileri
+UserInfoDesc=Ltfen bilgilerinizi yazn.
+UserInfoName=K&ullanc Ad:
+UserInfoOrg=Ku&rum:
+UserInfoSerial=&Seri Numaras:
+UserInfoNameRequired=Bir ad yazmalsnz.
+
+; *** "Hedef Konumunu Sein" sayfas
+WizardSelectDir=Hedef Konumunu Sein
+SelectDirDesc=[name] nereye kurulsun?
+SelectDirLabel3=[name] uygulamas u klasre kurulacak.
+SelectDirBrowseLabel=Devam etmek icin Sonraki zerine tklayn. Farkl bir klasr semek iin Gzat zerine tklayn.
+DiskSpaceGBLabel=En az [gb] GB bo disk alan gereklidir.
+DiskSpaceMBLabel=En az [mb] MB bo disk alan gereklidir.
+CannotInstallToNetworkDrive=Uygulama bir a srcs zerine kurulamaz.
+CannotInstallToUNCPath=Uygulama bir UNC yolu zerine (\\yol gibi) kurulamaz.
+InvalidPath=Src ad ile tam yolu yazmalsnz; rnein: %n%nC:\APP%n%n ya da u ekilde bir UNC yolu:%n%n\\sunucu\paylam
+InvalidDrive=Src ya da UNC paylam yok ya da eriilemiyor. Ltfen baka bir tane sein.
+DiskSpaceWarningTitle=Yeterli Bo Disk Alan Yok
+DiskSpaceWarning=Kurulum iin %1 KB bo alan gerekli, ancak seilmi srcde yalnz %2 KB bo alan var.%n%nGene de devam etmek istiyor musunuz?
+DirNameTooLong=Klasr ad ya da yol ok uzun.
+InvalidDirName=Klasr ad geersiz.
+BadDirName32=Klasr adlarnda u karakterler bulunamaz:%n%n%1
+DirExistsTitle=Klasr Zaten Var"
+DirExists=Klasr:%n%n%1%n%zaten var. Kurulum iin bu klasr kullanmak ister misiniz?
+DirDoesntExistTitle=Klasr Bulunamad
+DirDoesntExist=Klasr:%n%n%1%n%nbulunamad.Klasrn oluturmasn ister misiniz?
+
+; *** "Bileenleri Sein" sayfas
+WizardSelectComponents=Bileenleri Sein
+SelectComponentsDesc=Hangi bileenler kurulacak?
+SelectComponentsLabel2=Kurmak istediiniz bileenleri sein; kurmak istemediiniz bileenlerin iaretini kaldrn. Devam etmeye hazr olduunuzda Sonraki zerine tklayn.
+FullInstallation=Tam Kurulum
+; Mmknse 'Compact' ifadesini kendi dilinizde 'Minimal' anlamnda evirmeyin
+CompactInstallation=Normal kurulum
+CustomInstallation=zel kurulum
+NoUninstallWarningTitle=Bileenler Zaten Var
+NoUninstallWarning=u bileenlerin bilgisayarnzda zaten kurulu olduu algland:%n%n%1%n%n Bu bileenlerin iaretlerinin kaldrlmas bileenleri kaldrmaz.%n%nGene de devam etmek istiyor musunuz?
+ComponentSize1=%1 KB
+ComponentSize2=%1 MB
+ComponentsDiskSpaceGBLabel=Seili bileenler iin diskte en az [gb] GB bo alan bulunmas gerekli.
+ComponentsDiskSpaceMBLabel=Seili bileenler iin diskte en az [mb] MB bo alan bulunmas gerekli.
+
+; *** "Ek lemleri Sein" sayfas
+WizardSelectTasks=Ek lemleri Sein
+SelectTasksDesc=Baka hangi ilemler yaplsn?
+SelectTasksLabel2=[name] kurulumu srasnda yaplmasn istediiniz ek ileri sein ve Sonraki zerine tklayn.
+
+; *** "Balat Mens Klasrn Sein" sayfas
+WizardSelectProgramGroup=Balat Mens Klasrn Sein
+SelectStartMenuFolderDesc=Uygulamann ksayollar nereye eklensin?
+SelectStartMenuFolderLabel3=Kurulum yardmcs uygulama ksayollarn aadaki Balat Mens klasrne ekleyecek.
+SelectStartMenuFolderBrowseLabel=Devam etmek iin Sonraki zerine tklayn. Farkl bir klasr semek iin Gzat zerine tklayn.
+MustEnterGroupName=Bir klasr ad yazmalsnz.
+GroupNameTooLong=Klasr ad ya da yol ok uzun.
+InvalidGroupName=Klasr ad geersiz.
+BadGroupName=Klasr adnda u karakterler bulunamaz:%n%n%1
+NoProgramGroupCheck2=Balat Mens klasr &oluturulmasn
+
+; *** "Kurulmaya Hazr" sayfas
+WizardReady=Kurulmaya Hazr
+ReadyLabel1=[name] bilgisayarnza kurulmaya hazr.
+ReadyLabel2a=Kuruluma devam etmek iin Sonraki zerine, ayarlar gzden geirip deitirmek iin nceki zerine tklayn.
+ReadyLabel2b=Kuruluma devam etmek iin Sonraki zerine tklayn.
+ReadyMemoUserInfo=Kullanc bilgileri:
+ReadyMemoDir=Hedef konumu:
+ReadyMemoType=Kurulum tr:
+ReadyMemoComponents=Seilmi bileenler:
+ReadyMemoGroup=Balat Mens klasr:
+ReadyMemoTasks=Ek ilemler:
+
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel=Ek dosyalar indiriliyor...
+ButtonStopDownload=ndirmeyi &durdur
+StopDownload=ndirmeyi durdurmak istediinize emin misiniz?
+ErrorDownloadAborted=ndirme durduruldu
+ErrorDownloadFailed=ndirilemedi: %1 %2
+ErrorDownloadSizeFailed=Boyut alnamad: %1 %2
+ErrorFileHash1=Dosya karmas dorulanamad: %1
+ErrorFileHash2=Dosya karmas geersiz: %1 olmas gerekirken %2
+ErrorProgress=Adm geersiz: %1 / %2
+ErrorFileSize=Dosya boyutu geersiz: %1 olmas gerekirken %2
+
+; *** "Kuruluma Hazrlanlyor" sayfas
+WizardPreparing=Kuruluma Hazrlanlyor
+PreparingDesc=[name] bilgisayarnza kurulmaya hazrlanyor.
+PreviousInstallNotCompleted=nceki uygulama kurulumu ya da kaldrlmas tamamlanmam. Bu kurulumun tamamlanmas iin bilgisayarnz yeniden balatmalsnz.%n%nBilgisayarnz yeniden balattktan sonra ilemi tamamlamak iin [name] kurulum yardmcsn yeniden altrn.
+CannotContinue=Kuruluma devam edilemiyor. kmak iin ptal zerine tklayn.
+ApplicationsFound=Kurulum yardmcs tarafndan gncellenmesi gereken dosyalar, u uygulamalar tarafndan kullanyor. Kurulum yardmcsnn bu uygulamalar otomatik olarak kapatmasna izin vermeniz nerilir.
+ApplicationsFound2=Kurulum yardmcs tarafndan gncellenmesi gereken dosyalar, u uygulamalar tarafndan kullanyor. Kurulum yardmcsnn bu uygulamalar otomatik olarak kapatmasna izin vermeniz nerilir. Kurulum tamamlandktan sonra, uygulamalar yeniden balatlmaya allacak.
+CloseApplications=&Uygulamalar kapatlsn
+DontCloseApplications=Uygulamalar &kapatlmasn
+ErrorCloseApplications=Kurulum yardmcs uygulamalar kapatamad. Kurulum yardmcs tarafndan gncellenmesi gereken dosyalar kullanan uygulamalar el ile kapatmanz nerilir.
+PrepareToInstallNeedsRestart=Kurulum iin bilgisayarn yeniden balatlmas gerekiyor. Bilgisayar yeniden balattktan sonra [name] kurulumunu tamamlamak iin kurulum yardmcsn yeniden altrn.%n%nBilgisayar imdi yeniden balatmak ister misiniz?
+
+; *** "Kuruluyor" sayfas
+WizardInstalling=Kuruluyor
+InstallingLabel=Ltfen [name] bilgisayarnza kurulurken bekleyin.
+
+; *** "Kurulum Tamamland" sayfas
+FinishedHeadingLabel=[name] kurulum yardmcs tamamlanyor
+FinishedLabelNoIcons=Bilgisayarnza [name] kurulumu tamamland.
+FinishedLabel=Bilgisayarnza [name] kurulumu tamamland. Simgeleri yklemeyi setiyseniz, simgelere tklayarak uygulamay balatabilirsiniz.
+ClickFinish=Kurulum yardmcsndan kmak iin Bitti zerine tklayn.
+FinishedRestartLabel=[name] kurulumunun tamamlanmas iin, bilgisayarnz yeniden balatlmal. imdi yeniden balatmak ister misiniz?
+FinishedRestartMessage=[name] kurulumunun tamamlanmas iin, bilgisayarnz yeniden balatlmal.%n%nimdi yeniden balatmak ister misiniz?
+ShowReadmeCheck=Evet README dosyas grntlensin
+YesRadio=&Evet, bilgisayar imdi yeniden balatlsn
+NoRadio=&Hayr, bilgisayar daha sonra yeniden balatacam
+; used for example as 'Run MyProg.exe'
+RunEntryExec=%1 altrlsn
+; used for example as 'View Readme.txt'
+RunEntryShellExec=%1 grntlensin
+
+; *** "Kurulum iin Sradaki Disk Gerekli" iletileri
+ChangeDiskTitle=Kurulum Yardmcs Sradaki Diske Gerek Duyuyor
+SelectDiskLabel2=Ltfen %1 numaral diski takp Tamam zerine tklayn.%n%nDiskteki dosyalar aadakinden farkl bir klasrde bulunuyorsa, doru yolu yazn ya da Gzat zerine tklayarak doru klasr sein.
+PathLabel=&Yol:
+FileNotInDir2="%1" dosyas "%2" iinde bulunamad. Ltfen doru diski takn ya da baka bir klasr sein.
+SelectDirectoryLabel=Ltfen sonraki diskin konumunu belirtin.
+
+; *** Kurulum aamas iletileri
+SetupAborted=Kurulum tamamlanamad.%n%nLtfen sorunu dzelterek kurulum yardmcsn yeniden altrn.
+AbortRetryIgnoreSelectAction=Yaplacak ilemi sein
+AbortRetryIgnoreRetry=&Yeniden denensin
+AbortRetryIgnoreIgnore=&Sorun yok saylp devam edilsin
+AbortRetryIgnoreCancel=Kurulum iptal edilsin
+
+; *** Kurulum durumu iletileri
+StatusClosingApplications=Uygulamalar kapatlyor...
+StatusCreateDirs=Klasrler oluturuluyor...
+StatusExtractFiles=Dosyalar ayklanyor...
+StatusCreateIcons=Ksayollar oluturuluyor...
+StatusCreateIniEntries=INI kaytlar oluturuluyor...
+StatusCreateRegistryEntries=Kayt Defteri kaytlar oluturuluyor...
+StatusRegisterFiles=Dosyalar kaydediliyor...
+StatusSavingUninstall=Kaldrma bilgileri kaydediliyor...
+StatusRunProgram=Kurulum tamamlanyor...
+StatusRestartingApplications=Uygulamalar yeniden balatlyor...
+StatusRollback=Deiiklikler geri alnyor...
+
+; *** eitli hata iletileri
+ErrorInternal2= hata: %1
+ErrorFunctionFailedNoCode=%1 tamamlanamad.
+ErrorFunctionFailed=%1 tamamlanamad; kod %2
+ErrorFunctionFailedWithMessage=%1 tamamlanamad; kod %2.%n%3
+ErrorExecutingProgram=u dosya yrtlemedi:%n%1
+
+; *** Kayt defteri hatalar
+ErrorRegOpenKey=Kayt defteri anahtar alrken bir sorun kt:%n%1%2
+ErrorRegCreateKey=Kayt defteri anahtar eklenirken bir sorun kt:%n%1%2
+ErrorRegWriteKey=Kayt defteri anahtar yazlrken bir sorun kt:%n%1%2
+
+; *** INI hatalar
+ErrorIniEntry="%1" dosyasna INI kayd eklenirken bir sorun kt.
+
+; *** Dosya kopyalama hatalar
+FileAbortRetryIgnoreSkipNotRecommended=&Bu dosya atlansn (nerilmez)
+FileAbortRetryIgnoreIgnoreNotRecommended=&Sorun yok saylp devam edilsin (nerilmez)
+SourceIsCorrupted=Kaynak dosya bozulmu
+SourceDoesntExist="%1" kaynak dosyas bulunamad
+ExistingFileReadOnly2=Var olan dosya salt okunabilir olarak iaretlenmi olduundan zerine yazlamad.
+ExistingFileReadOnlyRetry=&Salt okunur iareti kaldrlp yeniden denensin
+ExistingFileReadOnlyKeepExisting=&Var olan dosya korunsun
+ErrorReadingExistingDest=Var olan dosya okunmaya allrken bir sorun kt.
+FileExistsSelectAction=Yaplacak ilemi sein
+FileExists2=Dosya zaten var.
+FileExistsOverwriteExisting=&Var olan dosyann zerine yazlsn
+FileExistsKeepExisting=Var &olan dosya korunsun
+FileExistsOverwriteOrKeepAll=&Sonraki akmalarda da bu ilem yaplsn
+ExistingFileNewerSelectAction=Yaplacak ilemi sein
+ExistingFileNewer2=Var olan dosya, kurulum yardmcs tarafndan yazlmaya allandan daha yeni.
+ExistingFileNewerOverwriteExisting=&Var olan dosyann zerine yazlsn
+ExistingFileNewerKeepExisting=Var &olan dosya korunsun (nerilir)
+ExistingFileNewerOverwriteOrKeepAll=&Sonraki akmalarda bu ilem yaplsn
+ErrorChangingAttr=Var olan dosyann znitelikleri deitirilirken bir sorun kt:
+ErrorCreatingTemp=Hedef klasrde bir dosya oluturulurken bir sorun kt:
+ErrorReadingSource=Kaynak dosya okunurken bir sorun kt:
+ErrorCopying=Dosya kopyalanrken bir sorun kt:
+ErrorReplacingExistingFile=Var olan dosya deitirilirken bir sorun kt:
+ErrorRestartReplace=Yeniden balatmada zerine yazlamad:
+ErrorRenamingTemp=Hedef klasrdeki bir dosyann ad deitirilirken sorun kt:
+ErrorRegisterServer=DLL/OCX kayt edilemedi: %1
+ErrorRegSvr32Failed=RegSvr32 ilemi u kod ile tamamlanamad: %1
+ErrorRegisterTypeLib=Tr kitapl kayt defterine eklenemedi: %1
+
+; *** Kaldrma srasnda grntlenecek ad iaretleri
+; used for example as 'My Program (32-bit)'
+UninstallDisplayNameMark=%1 (%2)
+; used for example as 'My Program (32-bit, All users)'
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32 bit
+UninstallDisplayNameMark64Bit=64 bit
+UninstallDisplayNameMarkAllUsers=Tm kullanclar
+UninstallDisplayNameMarkCurrentUser=Geerli kullanc
+
+; *** Kurulum sonras hatalar
+ErrorOpeningReadme=README dosyas alrken bir sorun kt.
+ErrorRestartingComputer=Kurulum yardmcs bilgisayarnz yeniden balatamyor. Ltfen bilgisayarnz yeniden balatn.
+
+; *** Kaldrma yardmcs iletileri
+UninstallNotFound="%1" dosyas bulunamad. Uygulama kaldrlamyor.
+UninstallOpenError="%1" dosyas alamad. Uygulama kaldrlamyor.
+UninstallUnsupportedVer="%1" uygulama kaldrma gnlk dosyasnn biimi, bu kaldrma yardmcs srm tarafndan anlalamad. Uygulama kaldrlamyor.
+UninstallUnknownEntry=Kaldrma gnlnde bilinmeyen bir kayt (%1) bulundu.
+ConfirmUninstall=%1 uygulamasn tm bileenleri ile birlikte tamamen kaldrmak istediinize emin misiniz?
+UninstallOnlyOnWin64=Bu kurulum yalnz 64 bit Windows zerinden kaldrlabilir.
+OnlyAdminCanUninstall=Bu kurulum yalnz ynetici haklarna sahip bir kullanc tarafndan kaldrlabilir.
+UninstallStatusLabel=Ltfen %1 uygulamas bilgisayarnzdan kaldrlrken bekleyin.
+UninstalledAll=%1 uygulamas bilgisayarnzdan kaldrld.
+UninstalledMost=%1 uygulamas kaldrld.%n%nBaz bileenler kaldrlamad. Bunlar el ile silebilirsiniz.
+UninstalledAndNeedsRestart=%1 kaldrma ileminin tamamlanmas iin bilgisayarnzn yeniden balatlmas gerekli.%n%nimdi yeniden balatmak ister misiniz?
+UninstallDataCorrupted="%1" dosyas bozulmu. Kaldrlamyor.
+
+; *** Kaldrma aamas iletileri
+ConfirmDeleteSharedFileTitle=Paylalan Dosya Silinsin mi?
+ConfirmDeleteSharedFile2=Sisteme gre, paylalan u dosya baka bir uygulama tarafndan kullanlmyor ve kaldrlabilir. Bu paylalm dosyay silmek ister misiniz?%n%nBu dosya, baka herhangi bir uygulama tarafndan kullanlyor ise, silindiinde dier uygulama dzgn almayabilir. Emin deilseniz Hayr zerine tklayn. Dosyay sisteminizde brakmann bir zarar olmaz.
+SharedFileNameLabel=Dosya ad:
+SharedFileLocationLabel=Konum:
+WizardUninstalling=Kaldrma Durumu
+StatusUninstalling=%1 kaldrlyor...
+
+; *** Kapatmay engelleme nedenleri
+ShutdownBlockReasonInstallingApp=%1 kuruluyor.
+ShutdownBlockReasonUninstallingApp=%1 kaldrlyor.
+
+; The custom messages below aren't used by Setup itself, but if you make
+; use of them in your scripts, you'll want to translate them.
+
+[CustomMessages]
+
+NameAndVersion=%1 %2 srm
+AdditionalIcons=Ek simgeler:
+CreateDesktopIcon=Masast simg&esi oluturulsun
+CreateQuickLaunchIcon=Hzl Balat simgesi &oluturulsun
+ProgramOnTheWeb=%1 Web Sitesi
+UninstallProgram=%1 Uygulamasn Kaldr
+LaunchProgram=%1 Uygulamasn altr
+AssocFileExtension=%1 &uygulamas ile %2 dosya uzants ilikilendirilsin
+AssocingFileExtension=%1 uygulamas ile %2 dosya uzants ilikilendiriliyor...
+AutoStartProgramGroupDescription=Balang:
+AutoStartProgram=%1 otomatik olarak balatlsn
+AddonHostProgramNotFound=%1 setiiniz klasrde bulunamad.%n%nYine de devam etmek istiyor musunuz?
\ No newline at end of file
diff --git a/Dependencies/Inno/Languages/Ukrainian.isl b/Dependencies/Inno/Languages/Ukrainian.isl
new file mode 100644
index 00000000..c12c6ebf
--- /dev/null
+++ b/Dependencies/Inno/Languages/Ukrainian.isl
@@ -0,0 +1,385 @@
+; *** Inno Setup version 6.1.0+ Ukrainian messages ***
+; Author: Dmytro Onyshchuk
+; E-Mail: mrlols3@gmail.com
+; Please report all spelling/grammar errors, and observations.
+; Version 2020.08.04
+
+; *** Inno Setup 6.1.0 ***
+; :
+; E-Mail: mrlols3@gmail.com
+; , .
+; 2020.08.04
+
+[LangOptions]
+; The following three entries are very important. Be sure to read and
+; understand the '[LangOptions] section' topic in the help file.
+LanguageName=<0423><043A><0440><0430><0457><043D><0441><044C><043A><0430>
+LanguageID=$0422
+LanguageCodePage=1251
+; If the language you are translating to requires special font faces or
+; sizes, uncomment any of the following entries and change them accordingly.
+;DialogFontName=
+;DialogFontSize=8
+;WelcomeFontName=Verdana
+;WelcomeFontSize=12
+;TitleFontName=Arial
+;TitleFontSize=29
+;CopyrightFontName=Arial
+;CopyrightFontSize=8
+
+[Messages]
+
+; ***
+SetupAppTitle=
+SetupWindowTitle= %1
+UninstallAppTitle=
+UninstallAppFullTitle= %1
+
+; *** Misc. common
+InformationTitle=
+ConfirmTitle=ϳ
+ErrorTitle=
+
+; *** SetupLdr messages
+SetupLdrStartupMessage= %1 ', ?
+LdrCannotCreateTemp= .
+LdrCannotExecTemp= .
+HelpTextNote=
+
+; *** Startup error messages
+LastErrorMessage=%1.%n%n %2: %3
+SetupFileMissing= %1 . , .
+SetupFileCorrupt= . , .
+SetupFileCorruptOrWrongVer= . , .
+InvalidParameter= :%n%n%1
+SetupAlreadyRunning= .
+WindowsVersionNotSupported= Windows, '.
+WindowsServicePackRequired= %1 Service Pack %2 .
+NotOnThisPlatform= %1.
+OnlyOnThisPlatform= %1.
+OnlyOnTheseArchitectures= ' Windows :%n%n%1
+WinVersionTooLowError= %1 %2 .
+WinVersionTooHighError= %1 %2 .
+AdminPrivilegesRequired= .
+PowerUserPrivilegesRequired= .
+SetupAppRunningError=, %1 .%n%n , ﳿ OK , .
+UninstallAppRunningError=, %1 .%n%n , ﳿ OK , .
+
+; *** Startup questions
+PrivilegesRequiredOverrideTitle=
+PrivilegesRequiredOverrideInstruction=
+PrivilegesRequiredOverrideText1=%1 ( ), .
+PrivilegesRequiredOverrideText2=%1 , ( ).
+PrivilegesRequiredOverrideAllUsers= &
+PrivilegesRequiredOverrideAllUsersRecommended= & ()
+PrivilegesRequiredOverrideCurrentUser=
+PrivilegesRequiredOverrideCurrentUserRecommended= & ()
+
+; *** г
+ErrorCreatingDir= "%1"
+ErrorTooManyFilesInDir= "%1",
+
+; ***
+ExitSetupTitle=
+ExitSetupMessage= . , .%n%n .%n%n ?
+AboutSetupMenuItem=& ...
+AboutSetupTitle=
+AboutSetupMessage=%1 %2%n%3%n%n%1 :%n%4
+AboutSetupNote=
+TranslatorNote=Ukrainian translation by Dmytro Onyshchuk
+
+; ***
+ButtonBack=< &
+ButtonNext=& >
+ButtonInstall=&
+ButtonOK=OK
+ButtonCancel=
+ButtonYes=&
+ButtonYesToAll= &
+ButtonNo=&ͳ
+ButtonNoToAll=&
+ButtonFinish=&
+ButtonBrowse=&...
+ButtonWizardBrowse=&...
+ButtonNewFolder=&
+
+; *** ij " "
+SelectLanguageTitle=
+SelectLanguageLabel= , .
+
+; ***
+ClickNext= 볻, , .
+BeveledLabel=
+BrowseDialogTitle=
+BrowseDialogLabel= ʻ.
+NewFolderName=
+
+; *** ""
+WelcomeLabel1= [name].
+WelcomeLabel2= [name/ver] .%n%n .
+
+; *** ""
+WizardPassword=
+PasswordLabel1= .
+PasswordLabel3= , 볻, . .
+PasswordEditLabel=&:
+IncorrectPassword= . , .
+
+; *** "˳ "
+WizardLicense=˳
+LicenseLabel= , .
+LicenseLabel3= , . , .
+LicenseAccepted= &
+LicenseNotAccepted= &
+
+; *** ""
+WizardInfoBefore=
+InfoBeforeLabel= , , .
+InfoBeforeClickLabel= , 볻.
+WizardInfoAfter=
+InfoAfterLabel= , , .
+InfoAfterClickLabel= , 볻.
+
+; *** " "
+WizardUserInfo=
+UserInfoDesc= , .
+UserInfoName=& :
+UserInfoOrg=&:
+UserInfoSerial=& :
+UserInfoNameRequired= '.
+
+; *** " "
+WizardSelectDir=
+SelectDirDesc= [name]?
+SelectDirLabel3= [name] .
+SelectDirBrowseLabel= 볻, . , .
+DiskSpaceGBLabel= [gb] .
+DiskSpaceMBLabel= [mb] M .
+CannotInstallToNetworkDrive= .
+CannotInstallToUNCPath= .
+InvalidPath= , :%n%nC:\APP%n%n UNC:%n%n\\\
+InvalidDrive= , . , .
+DiskSpaceWarningTitle=
+DiskSpaceWarning= %1 , %2 .%n%n ?
+DirNameTooLong=' .
+InvalidDirName= .
+BadDirName32=' :%n%n%1
+DirExistsTitle=
+DirExists=:%n%n%1%n%n . ?
+DirDoesntExistTitle=
+DirDoesntExist=:%n%n%1%n%n . ?
+
+; *** " "
+WizardSelectComponents=
+SelectComponentsDesc= ?
+SelectComponentsLabel2= ; . 볻, .
+FullInstallation=
+; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)
+CompactInstallation=
+CustomInstallation=
+NoUninstallWarningTitle=
+NoUninstallWarning=, :%n%n%1%n%n³ .%n%n ?
+ComponentSize1=%1 K
+ComponentSize2=%1 M
+ComponentsDiskSpaceGBLabel= [gb] .
+ComponentsDiskSpaceMBLabel= [mb] M .
+
+; *** " "
+WizardSelectTasks=
+SelectTasksDesc= ?
+SelectTasksLabel2= [name] , 볻.
+
+; *** " "
+WizardSelectProgramGroup=
+SelectStartMenuFolderDesc= ?
+SelectStartMenuFolderLabel3= .
+SelectStartMenuFolderBrowseLabel= 볻, . , .
+MustEnterGroupName= ' .
+GroupNameTooLong= .
+InvalidGroupName= .
+BadGroupName=' :%n%n%1
+NoProgramGroupCheck2=&
+
+; *** " "
+WizardReady=
+ReadyLabel1= [name] .
+ReadyLabel2a= , , .
+ReadyLabel2b= .
+ReadyMemoUserInfo= :
+ReadyMemoDir= :
+ReadyMemoType= :
+ReadyMemoComponents= :
+ReadyMemoGroup= :
+ReadyMemoTasks= :
+
+; *** TDownloadWizardPage wizard page and DownloadTemporaryFile
+DownloadingLabel= ...
+ButtonStopDownload=&
+StopDownload= ?
+ErrorDownloadAborted=
+ErrorDownloadFailed= : %1 %2
+ErrorDownloadSizeFailed= : %1 %2
+ErrorFileHash1= : %1
+ErrorFileHash2= : %1, %2
+ErrorProgress= : %1 %2
+ErrorFileSize= : %1, %2
+
+; *** "ϳ "
+WizardPreparing=ϳ
+PreparingDesc= [name] .
+PreviousInstallNotCompleted= . .%n%nϳ , [name].
+CannotContinue= . , .
+ApplicationsFound= , . .
+ApplicationsFound2= , . . ϳ , .
+CloseApplications=&
+DontCloseApplications=&
+ErrorCloseApplications= . , , , .
+PrepareToInstallNeedsRestart= . ϳ , [name]%n%n ?
+
+; *** ""
+WizardInstalling=
+InstallingLabel= , , [name] '.
+
+; *** " "
+FinishedHeadingLabel= [name]
+FinishedLabelNoIcons= [name] .
+FinishedLabel= [name] . .
+ClickFinish= .
+FinishedRestartLabel= [name] . ?
+FinishedRestartMessage= [name] .%n%n ?
+ShowReadmeCheck=, README
+YesRadio=&,
+NoRadio=&ͳ,
+; used for example as 'Run MyProg.exe'
+RunEntryExec=³ %1
+; used for example as 'View Readme.txt'
+RunEntryShellExec= %1
+
+; *** "Setup Needs the Next Disk" stuff
+ChangeDiskTitle=
+SelectDiskLabel2= , %1 OK.%n%n , , .
+PathLabel=&:
+FileNotInDir2= "%1" "%2". , .
+SelectDirectoryLabel= , .
+
+; *** Installation phase messages
+SetupAborted= .%n%n , .
+AbortRetryIgnoreSelectAction=
+AbortRetryIgnoreRetry=&
+AbortRetryIgnoreIgnore=&
+AbortRetryIgnoreCancel=³
+
+; ***
+StatusClosingApplications= ...
+StatusCreateDirs= ...
+StatusExtractFiles= ...
+StatusCreateIcons= ...
+StatusCreateIniEntries= INI ...
+StatusCreateRegistryEntries= ...
+StatusRegisterFiles= ...
+StatusSavingUninstall= ...
+StatusRunProgram= ...
+StatusRestartingApplications= ...
+StatusRollback= ...
+
+; *** г
+ErrorInternal2= : %1
+ErrorFunctionFailedNoCode=%1
+ErrorFunctionFailed=%1 ; %2
+ErrorFunctionFailedWithMessage=%1 ; %2.%n%3
+ErrorExecutingProgram= :%n%1
+
+; ***
+ErrorRegOpenKey= :%n%1\%2
+ErrorRegCreateKey= :%n%1\%2
+ErrorRegWriteKey= :%n%1\%2
+
+; *** INI
+ErrorIniEntry= INI- "%1".
+
+; ***
+FileAbortRetryIgnoreSkipNotRecommended=& ( )
+FileAbortRetryIgnoreIgnoreNotRecommended=& ( )
+SourceIsCorrupted=
+SourceDoesntExist= "%1"
+ExistingFileReadOnly2= , .
+ExistingFileReadOnlyRetry=& " "
+ExistingFileReadOnlyKeepExisting=&
+ErrorReadingExistingDest= :
+FileExistsSelectAction=
+FileExists2= .
+FileExistsOverwriteExisting=&
+FileExistsKeepExisting=&
+FileExistsOverwriteOrKeepAll=&
+ExistingFileNewerSelectAction=
+ExistingFileNewer2= , .
+ExistingFileNewerOverwriteExisting=&
+ExistingFileNewerKeepExisting=& ()
+ExistingFileNewerOverwriteOrKeepAll=&
+ErrorChangingAttr= :
+ErrorCreatingTemp= :
+ErrorReadingSource= :
+ErrorCopying= :
+ErrorReplacingExistingFile= :
+ErrorRestartReplace= RestartReplace:
+ErrorRenamingTemp= :
+ErrorRegisterServer= DLL/OCX: %1
+ErrorRegSvr32Failed= RegSvr32, %1
+ErrorRegisterTypeLib= : %1
+
+; *** Uninstall display name markings
+UninstallDisplayNameMark=%1 (%2)
+UninstallDisplayNameMarks=%1 (%2, %3)
+UninstallDisplayNameMark32Bit=32-
+UninstallDisplayNameMark64Bit=64-
+UninstallDisplayNameMarkAllUsers=
+UninstallDisplayNameMarkCurrentUser=
+
+; *** Post-installation errors
+ErrorOpeningReadme= README.
+ErrorRestartingComputer= '. , .
+
+; ***
+UninstallNotFound= "%1" , .
+UninstallOpenError= "%1".
+UninstallUnsupportedVer= "%1" .
+UninstallUnknownEntry= (%1)
+ConfirmUninstall= , %1 ?
+UninstallOnlyOnWin64= 64- Windows.
+OnlyAdminCanUninstall= .
+UninstallStatusLabel= , , %1 '.
+UninstalledAll=%1 '.
+UninstalledMost= %1 .%n%n . .
+UninstalledAndNeedsRestart= %1 .%n%n ?
+UninstallDataCorrupted= "%1" .
+
+; *** Uninstallation phase messages
+ConfirmDeleteSharedFileTitle= ?
+ConfirmDeleteSharedFile2= , . ?%n%n , . , ͳ. .
+SharedFileNameLabel=' :
+SharedFileLocationLabel=:
+WizardUninstalling=
+StatusUninstalling= %1...
+
+
+; ***
+ShutdownBlockReasonInstallingApp= %1.
+ShutdownBlockReasonUninstallingApp= %1.
+
+; The custom messages below aren't used by Setup itself, but if you make
+; use of them in your scripts, you'll want to translate them.
+
+[CustomMessages]
+
+NameAndVersion=%1, %2
+AdditionalIcons= :
+CreateDesktopIcon= &
+CreateQuickLaunchIcon= &
+ProgramOnTheWeb= %1
+UninstallProgram= %1
+LaunchProgram=³ %1
+AssocFileExtension=& %1 %2
+AssocingFileExtension= %1 %2...
+AutoStartProgramGroupDescription=:
+AutoStartProgram= %1
+AddonHostProgramNotFound=%1 %n%n ?
diff --git a/Dependencies/Inno/Setup.e32 b/Dependencies/Inno/Setup.e32
new file mode 100644
index 00000000..7fcf47cd
Binary files /dev/null and b/Dependencies/Inno/Setup.e32 differ
diff --git a/Dependencies/Inno/SetupLdr.e32 b/Dependencies/Inno/SetupLdr.e32
new file mode 100644
index 00000000..9bf36bab
Binary files /dev/null and b/Dependencies/Inno/SetupLdr.e32 differ
diff --git a/Dependencies/Inno/WizModernImage-IS.bmp b/Dependencies/Inno/WizModernImage-IS.bmp
new file mode 100644
index 00000000..cf844e09
Binary files /dev/null and b/Dependencies/Inno/WizModernImage-IS.bmp differ
diff --git a/Dependencies/Inno/WizModernImage.bmp b/Dependencies/Inno/WizModernImage.bmp
new file mode 100644
index 00000000..cb05a063
Binary files /dev/null and b/Dependencies/Inno/WizModernImage.bmp differ
diff --git a/Dependencies/Inno/WizModernSmallImage-IS.bmp b/Dependencies/Inno/WizModernSmallImage-IS.bmp
new file mode 100644
index 00000000..1e8e4979
Binary files /dev/null and b/Dependencies/Inno/WizModernSmallImage-IS.bmp differ
diff --git a/Dependencies/Inno/WizModernSmallImage.bmp b/Dependencies/Inno/WizModernSmallImage.bmp
new file mode 100644
index 00000000..63f42104
Binary files /dev/null and b/Dependencies/Inno/WizModernSmallImage.bmp differ
diff --git a/Dependencies/Inno/isbunzip.dll b/Dependencies/Inno/isbunzip.dll
new file mode 100644
index 00000000..814e8680
Binary files /dev/null and b/Dependencies/Inno/isbunzip.dll differ
diff --git a/Dependencies/Inno/isbzip.dll b/Dependencies/Inno/isbzip.dll
new file mode 100644
index 00000000..1afeefd5
Binary files /dev/null and b/Dependencies/Inno/isbzip.dll differ
diff --git a/Dependencies/Inno/isfaq.url b/Dependencies/Inno/isfaq.url
new file mode 100644
index 00000000..91054550
--- /dev/null
+++ b/Dependencies/Inno/isfaq.url
@@ -0,0 +1,2 @@
+[InternetShortcut]
+URL=https://jrsoftware.org/isfaq.php
diff --git a/Dependencies/Inno/islzma.dll b/Dependencies/Inno/islzma.dll
new file mode 100644
index 00000000..81fd05ac
Binary files /dev/null and b/Dependencies/Inno/islzma.dll differ
diff --git a/Dependencies/Inno/islzma32.exe b/Dependencies/Inno/islzma32.exe
new file mode 100644
index 00000000..7562645e
Binary files /dev/null and b/Dependencies/Inno/islzma32.exe differ
diff --git a/Dependencies/Inno/islzma64.exe b/Dependencies/Inno/islzma64.exe
new file mode 100644
index 00000000..fd58a59e
Binary files /dev/null and b/Dependencies/Inno/islzma64.exe differ
diff --git a/Dependencies/Inno/isscint.dll b/Dependencies/Inno/isscint.dll
new file mode 100644
index 00000000..5f8ef49b
Binary files /dev/null and b/Dependencies/Inno/isscint.dll differ
diff --git a/Dependencies/Inno/isunzlib.dll b/Dependencies/Inno/isunzlib.dll
new file mode 100644
index 00000000..8c4ed510
Binary files /dev/null and b/Dependencies/Inno/isunzlib.dll differ
diff --git a/Dependencies/Inno/iszlib.dll b/Dependencies/Inno/iszlib.dll
new file mode 100644
index 00000000..b326e3a7
Binary files /dev/null and b/Dependencies/Inno/iszlib.dll differ
diff --git a/Dependencies/Inno/license.txt b/Dependencies/Inno/license.txt
new file mode 100644
index 00000000..17b2e1b7
--- /dev/null
+++ b/Dependencies/Inno/license.txt
@@ -0,0 +1,32 @@
+Inno Setup License
+==================
+
+Except where otherwise noted, all of the documentation and software included in the Inno Setup
+package is copyrighted by Jordan Russell.
+
+Copyright (C) 1997-2020 Jordan Russell. All rights reserved.
+Portions Copyright (C) 2000-2020 Martijn Laan. All rights reserved.
+
+This software is provided "as-is," without any express or implied warranty. In no event shall the
+author be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial
+applications, and to alter and redistribute it, provided that the following conditions are met:
+
+1. All redistributions of source code files must retain all copyright notices that are currently in
+ place, and this list of conditions without modification.
+
+2. All redistributions in binary form must retain all occurrences of the above copyright notice and
+ web site addresses that are currently in place (for example, in the About boxes).
+
+3. The origin of this software must not be misrepresented; you must not claim that you wrote the
+ original software. If you use this software to distribute a product, an acknowledgment in the
+ product documentation would be appreciated but is not required.
+
+4. Modified versions in source or binary form must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+
+Jordan Russell
+jr-2020 AT jrsoftware.org
+https://jrsoftware.org/
\ No newline at end of file
diff --git a/Dependencies/Inno/unins000.dat b/Dependencies/Inno/unins000.dat
new file mode 100644
index 00000000..409a1aa0
Binary files /dev/null and b/Dependencies/Inno/unins000.dat differ
diff --git a/Dependencies/Inno/unins000.exe b/Dependencies/Inno/unins000.exe
new file mode 100644
index 00000000..b8b4f910
Binary files /dev/null and b/Dependencies/Inno/unins000.exe differ
diff --git a/Dependencies/Inno/unins000.msg b/Dependencies/Inno/unins000.msg
new file mode 100644
index 00000000..24de8ec9
Binary files /dev/null and b/Dependencies/Inno/unins000.msg differ
diff --git a/Dependencies/Inno/whatsnew.htm b/Dependencies/Inno/whatsnew.htm
new file mode 100644
index 00000000..9add84e1
--- /dev/null
+++ b/Dependencies/Inno/whatsnew.htm
@@ -0,0 +1,172 @@
+
+
+
+Inno Setup 6 Revision History
+
+
+
+
+
+Inno Setup 6
Revision History
+
+Copyright © 1997-2020 Jordan Russell. All rights reserved.
+Portions Copyright © 2000-2020 Martijn Laan. All rights reserved.
+For conditions of distribution and use, see LICENSE.TXT.
+
+
+Want to be notified by e-mail of new Inno Setup releases? Subscribe to the Inno Setup Mailing List!
+
+6.1.2 (2020-11-15)
+
+ - Compiler IDE change: Added new Print... (Ctrl+P) menu item to the File menu.
+ - Minor tweaks.
+
+
+6.1.1-beta (2020-10-29)
+Compiler IDE updates
+Various improvements have been made to the Compiler IDE:
+
+Other changes
+
+ - The /PORTABLE=1 command line parameter accepted by Inno Setup's own installers has been improved to allow side-by-side installations. For example, to quickly install a new version to the current user's desktop without affecting already installed versions use the following command line parameters: /portable=1 /silent /currentuser.
+ - Setup's and Uninstall's Back and Next buttons no longer display outdated "<" and ">" markers.
+ - Added new topic to the help file listing the additional Compiler IDE keyboard commands which are not listed in the menus. Added new Keyboard Commands menu item to the Compiler IDE's Help menu to open this topic.
+ - ISPP change: Added new SaveStringToFile support function.
+ - Fix: Calling DLL functions which return a 64-bit integer now gives correct result values.
+ - Minor tweaks.
+
+
+All official translations have now been updated for the changes in the previous version. Thanks to the maintainers for their time.
+
+
6.1.0-beta (2020-09-13)
+Per-user fonts
+Per-user fonts are now supported if Setup is running on Windows 10 Version 1803 and later:
+
+ - [Files] section parameter FontInstall can now be used in non administrative installs. Requires Windows 10 Version 1803 or later to successfully install a font.
+ - The {fonts} constant has been renamed to {commonfonts}. The old name is still supported, but it is recommended to update your scripts to the new names and the compiler will issue a warning if you don't.
+
- Added new {userfonts} constant. Only Windows 10 Version 1803 and later supports {userfonts}. Same directory as {localappdata}\Microsoft\Windows\Fonts.
+ - Added new {autofonts} constant which automatically maps to {commonfonts} unless the installation is running in non administrative install mode, in which case it maps to {userfonts}. It is recommended to update your scripts to use {autofonts} as much as possible to avoid mistakes.
+ - Updated all examples to use {autofonts} instead of {fonts}.
+ - Pascal Scripting change: The UnregisterFont support function now has an extra parameter.
+
+Compiler IDE updates
+Various improvements have been made to the Compiler IDE:
+
+ - If the script uses Inno Setup Preprocessor (ISPP) functionality, the Compiler IDE now automatically shows the preprocessor output in a tab so you can check it. This can be turned off in the options.
+ - The Compiler IDE now automatically opens (up to 10) #include files in tabs which allow you to edit and debug these files from within the Compiler IDE. The list of #include files is updated after opening a new main file and after each compilation. This can be turned off in the options. If the option is not turned off, a new Save All menu item is added to the File menu.
+ - If #include files are modified since last compile, the script is now automatically re-compiled before running it. This works even if the option to automatically open #include files is turned off.
+ - Added new Next Tab and Previous Tab menu items to the View menu.
+ - Added new topic to the help file explaining the various integrated debugger menu items in the Run menu which can be used to debug your [Code] section.
+ - Improved highlighting for the [CustomMessages] and [Messages] sections.
+ - Added new MessageBox Designer menu item to the Tools menu to design and insert MsgBox or TaskDialogMsgBox calls for the [Code] section.
+ - Added new Step Out menu item to the Run menu to unpause Setup until it reaches the end of the current function, then pause it on the next line.
+ - Added buttons to the Welcome dialog to Donate to support Inno Setup (Thank you!) and to Subscribe to the Inno Setup Mailing List to be notified by e-mail of new Inno Setup releases.
+ - The Run Parameters dialog now shows a list of most recently used parameters.
+
+Built-in download support for [Code]
+Pascal Scripting now supports downloading files and checking SHA-256 hashes:
+
+ - Added new DownloadTemporaryFile support function to download files without using a third-party tool:
+
+ - Supports HTTPS (but not expired or self-signed certificates) and HTTP.
+ - Redirects are automatically followed and proxy settings are automatically used.
+ - Safe to use from services unlike existing third-party tools.
+ - Supports SHA-256 hash checking of the downloaded file.
+ - Supports basic authentication.
+
+
+ - Added new CreateDownloadPage support function to easily show the download progress to the user. See the new CodeDownloadFiles.iss example script for an example.
+ - Added new DownloadTemporaryFileSize support function to get the size of a file without downloading it.
+ - Added new GetSHA256OfFile, GetSHA256OfString, and GetSHA256OfUnicodeString support functions to calculate SHA-256 hashes.
+ - Change in default behavior: Setup no longer disables itself entirely while PrepareToInstall is running. Instead only the Cancel button is disabled.
+
+Inno Setup Preprocessor (ISPP) updates
+ISPP now uses 64-bit integers and has new functions to more easily compare version numbers:
+
+ - ISPP's int type is now a signed 64-bit integer type.
+
- Support function FileSize now supports 64-bit file sizes.
+ - Added new GetPackedVersion, PackVersionNumbers, PackVersionComponents, ComparePackedVersion, SamePackedVersion, UnpackVersionNumbers, UnpackVersionComponents, and VersionToStr support functions.
+ - Support function GetFileVersion and ParseVersion have been renamed to GetVersionNumbersString and GetVersionComponents respectively. The old names are still supported, but it is recommended to update your scripts to the new names and the compiler will issue a warning if you don't.
+
+Similar Pascal Scripting changes have been done for [Code]:
+
+ - Added new FileSize64 support function.
+ - Added new GetPackedVersion, PackVersionNumbers, PackVersionComponents, ComparePackedVersion, SamePackedVersion, UnpackVersionNumbers, UnpackVersionComponents, GetVersionComponents, and VersionToStr support functions. This makes ISPP and [Code] support the same list of version related functions.
+
+Other changes
+
+ - Fix: Inno Setup 6.0.5 no longer supported Windows Vista.
+ - Change in default behavior: [Setup] section directive MinVersion now defaults to 6.1sp1, so by default Setup will not run on Windows Vista or on versions of Windows 7 and Windows Server 2008 R2 which have not been updated. Setting MinVersion to 6.0 to allow Setup to run on Windows Vista is supported but not recommended: Windows Vista doesn't support some of Setup's security measures against potential DLL preloading attacks so these have to be removed by the compiler if MinVersion is below 6.1 making your installer less secure on all versions of Windows.
+ - Inno Setup's version number doesn't display "(u)" at the end anymore since the Unicode version has been the only version for quite some time now.
+ - Added new [Run] and [UninstallRun] sections flag: dontlogparameters. If this flag is specified, the command line parameters for the program will not be included in the log file.
+ - If there are [UninstallRun] section entries without a RunOnceId parameter the compiler will now warn you about this. By assigning a string to RunOnceId, you can ensure that a particular [UninstallRun] entry will only be executed once during uninstallation. The warning can be disabled using new [Setup] section directive MissingRunOnceIdsWarning.
+ - Added new [Icons] section parameter: AppUserModelToastActivatorCLSID. Specifies the Windows 10 Application User Model Toast Activator CLSID for the shortcut. Ignored on earlier Windows versions.
+ - Setup's prompts to overwrite or keep existing files have been made more user friendly:
+
+
+ - Console-mode compiler (ISCC) change: Warnings and errors are now colorized.
+ - Pascal Scripting changes:
+
+ - Added new CalculateButtonWidth function to the TSetupForm support class.
+ - The ACaption and ADescription parameters of the various Create...Page support functions may now specify Setup messages containing shorthands like [name].
+ - Fix: Support function WizardSelectComponents now also updates component sizes and the current selection's required disk space.
+
+
+ - ISPP changes:
+
+ - Using #pragma verboselevel now automatically turns on verbose mode.
+ - Added new Message, Warning, and Error support functions.
+ - ISPP's output is now cleaner and warnings are colorized.
+
+ - Various documentation improvements.
+ - Minor tweaks.
+
+
+Contributions via GitHub: Thanks to Gavin Lambert and Sergii Leonov for their contributions.
+
+Some messages have been added and changed in this version: (View differences in Default.isl).
+
+ - New messages:
+
+ - DownloadingLabel, ButtonStopDownload, StopDownload, ErrorDownloadAborted, ErrorDownloadFailed, ErrorDownloadSizeFailed, ErrorFileHash1, ErrorFileHash2, ErrorProgress, ErrorFileSize.
+ - ExistingFileNewerSelectAction, ExistingFileNewer2, ExistingFileNewerOverwriteExisting, ExistingFileNewerKeepExisting, ExistingFileNewerOverwriteOrKeepAll.
+ - FileExistsSelectAction, FileExists2, FileExistsOverwriteExisting, FileExistsKeepExisting, FileExistsOverwriteOrKeepAll.
+
+
+ - Previously optional messages which must now always be set:
+
+ - ComponentsDiskSpaceGBLabel, DiskSpaceGBLabel, PrepareToInstallNeedsRestart.
+
+ - Removed messages:
+
+ - ExistingFileNewer, FileExists.
+
+
+
+
+Note: Not all official translations have been updated for these changes at this moment.
+
+
Inno Setup 6.0 Revision History
+
+
+
diff --git a/Dependencies/Oculus.Newtonsoft.Json.dll b/Dependencies/Oculus.Newtonsoft.Json.dll
new file mode 100644
index 00000000..30976612
Binary files /dev/null and b/Dependencies/Oculus.Newtonsoft.Json.dll differ
diff --git a/Dependencies/SN.EXP/Newtonsoft.Json.dll b/Dependencies/SN.EXP/Newtonsoft.Json.dll
new file mode 100644
index 00000000..66300631
Binary files /dev/null and b/Dependencies/SN.EXP/Newtonsoft.Json.dll differ
diff --git a/Dependencies/SN.EXP/README.md b/Dependencies/SN.EXP/README.md
new file mode 100644
index 00000000..041f5892
--- /dev/null
+++ b/Dependencies/SN.EXP/README.md
@@ -0,0 +1,15 @@
+| Dependency | Link | Redistributed? | License |
+|:-:|:-:|:-:|:-:|
+| `Assembly-CSharp.dll`
`Assembly-CSharp-firstpass.dll` | [@unknownworlds](https://github.com/unknownworlds) | ☐
Game file | Intellectual property of Unknown Worlds
_**Not included on GitHub**_ |
+| [`AssetsTools.NET.dll`](./AssetsTools.NET.dll) | [nesrak1/AssetsTools.NET](https://github.com/nesrak1/AssetsTools.NET) | ☑ | [MIT](https://github.com/nesrak1/AssetsTools.NET/blob/master/LICENSE) |
+| [`BepInEx/winhttp.dll`](./BepInEx/winhttp.dll) | [NeighTools/UnityDoorstop](https://github.com/NeighTools/UnityDoorstop) | ☑ | [CC0-1.0](https://github.com/NeighTools/UnityDoorstop/blob/master/LICENSE) |
+| [`BepInEx/BepInEx/core/0Harmony.dll`](./BepInEx/BepInEx/core/0Harmony.dll) | [BepInEx/HarmonyX](https://github.com/BepInEx/HarmonyX) | ☑ | [MIT](https://github.com/BepInEx/HarmonyX/blob/master/LICENSE) |
+| [`BepInEx/BepInEx/core/BepInEx.dll`](./BepInEx/BepInEx/core/BepInEx.dll)
[`BepInEx/BepInEx/core/BepInEx.Preloader.dll`](./BepInEx/BepInEx/core/BepInEx.Preloader.dll) | [BepInEx/BepInEx](https://github.com/BepInEx/BepInEx) | ☑ | [MIT](https://github.com/BepInEx/BepInEx/blob/master/LICENSE) |
+| [`BepInEx/BepInEx/core/BepInEx.Harmony.dll`](./BepInEx/BepInEx/core/BepInEx.Harmony.dll) | [BepInEx/BepInEx.Harmony](https://github.com/BepInEx/BepInEx.Harmony) | ☑ | [MIT](https://github.com/BepInEx/BepInEx.Harmony/master/LICENSE) |
+| [`BepInEx/BepInEx/core/Mono.Cecil.dll`](./BepInEx/BepInEx/core/Mono.Cecil.dll)
[`BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll)
[`BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll)
[`BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll) | [jbevain/cecil](https://github.com/jbevain/cecil) | ☑ | [MIT](https://github.com/jbevain/cecil/blob/master/LICENSE.txt) |
+| [`BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll`](./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll)
[`BepInEx/BepInEx/core/MonoMod.Utils.dll`](./BepInEx/BepInEx/core/MonoMod.Utils.dll) | [MonoMod/MonoMod](https://github.com/MonoMod/MonoMod) | ☑ | [MIT](https://github.com/MonoMod/MonoMod/blob/master/LICENSE) |
+| [`Carbon.vsf`](./Carbon.vsf)
[`VclStylesinno.dll`](./VclStylesinno.dll) | [RRUZ/vcl-styles-plugins](https://github.com/RRUZ/vcl-styles-plugins) | ☐
Bundled with the installer | No license |
+| [`cldb.dat`](./cldb.dat) | [DerPopo/UABE](https://github.com/DerPopo/UABE) | ☑ | Free use |
+| [`Newtonsoft.Json.dll`](./Newtonsoft.Json.dll) | [JamesNK/Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) | ☐
Game file | [MIT](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) |
+| [`RGiesecke.DllExport.Metadata.dll`](./RGiesecke.DllExport.Metadata.dll) | [nuget.org/UnmanagedExports](https://www.nuget.org/packages/UnmanagedExports) | ☐ | [MIT](https://opensource.org/licenses/mit-license.php) |
+| [`UnityEngine.dll`](./UnityEngine.dll)
[`UnityEngine.AssetBundleModule.dll`](./UnityEngine.AssetBundleModule.dll)
[`UnityEngine.CoreModule.dll`](./UnityEngine.CoreModule.dll)
[`UnityEngine.IMGUIModule.dll`](./UnityEngine.IMGUIModule.dll)
[`UnityEngine.InputLegacyModule.dll`](./UnityEngine.InputLegacyModule.dll)
[`UnityEngine.InputModule.dll`](./UnityEngine.InputModule.dll)
[`UnityEngine.UI.dll`](./UnityEngine.UI.dll) | [Unity-Technologies/UnityCsReference](https://github.com/Unity-Technologies/UnityCsReference) | ☐
Game file | [Unity Reference-Only License](https://unity3d.com/legal/licenses/Unity_Reference_Only_License) |
diff --git a/Dependencies/SN.EXP/UnityEngine.AssetBundleModule.dll b/Dependencies/SN.EXP/UnityEngine.AssetBundleModule.dll
new file mode 100644
index 00000000..3eb582e2
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.AssetBundleModule.dll differ
diff --git a/Dependencies/SN.EXP/UnityEngine.CoreModule.dll b/Dependencies/SN.EXP/UnityEngine.CoreModule.dll
new file mode 100644
index 00000000..b08f4fbd
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.CoreModule.dll differ
diff --git a/Dependencies/SN.EXP/UnityEngine.IMGUIModule.dll b/Dependencies/SN.EXP/UnityEngine.IMGUIModule.dll
new file mode 100644
index 00000000..1018fd12
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.IMGUIModule.dll differ
diff --git a/Dependencies/SN.EXP/UnityEngine.InputLegacyModule.dll b/Dependencies/SN.EXP/UnityEngine.InputLegacyModule.dll
new file mode 100644
index 00000000..f5b9c00a
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.InputLegacyModule.dll differ
diff --git a/Dependencies/SN.EXP/UnityEngine.InputModule.dll b/Dependencies/SN.EXP/UnityEngine.InputModule.dll
new file mode 100644
index 00000000..a7a35d15
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.InputModule.dll differ
diff --git a/Dependencies/SN.EXP/UnityEngine.UI.dll b/Dependencies/SN.EXP/UnityEngine.UI.dll
new file mode 100644
index 00000000..584a0e7d
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.UI.dll differ
diff --git a/Dependencies/SN.EXP/UnityEngine.dll b/Dependencies/SN.EXP/UnityEngine.dll
new file mode 100644
index 00000000..87a2f2eb
Binary files /dev/null and b/Dependencies/SN.EXP/UnityEngine.dll differ
diff --git a/Dependencies/SN.EXP/table-data.tgn b/Dependencies/SN.EXP/table-data.tgn
new file mode 100644
index 00000000..f7059da7
--- /dev/null
+++ b/Dependencies/SN.EXP/table-data.tgn
@@ -0,0 +1 @@
+{"rows_views":[[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}]],"model":{"rows":[[{"value":"Dependency","cspan":1,"rspan":1,"markup":[1,10]},{"value":"Link","cspan":1,"rspan":1,"markup":[0,4]},{"value":"Redistributed?","cspan":1,"rspan":1,"markup":[0,14]},{"value":"License","cspan":1,"rspan":1,"markup":[1,7]}],[{"value":"`Assembly-CSharp.dll`\n`Assembly-CSharp-firstpass.dll`","cspan":1,"rspan":1,"markup":[2,21,1,1,2,31]},{"value":"[@unknownworlds](https://github.com/unknownworlds)","cspan":1,"rspan":1,"markup":[98,50]},{"value":"☐\nGame file","cspan":1,"rspan":1,"markup":[1,17]},{"value":"Intellectual property of Unknown Worlds\n_**Not included on GitHub**_","cspan":1,"rspan":1,"markup":[1,40,35,1,33,26,35,1]}],[{"value":"[`AssetsTools.NET.dll`](./AssetsTools.NET.dll)","cspan":1,"rspan":1,"markup":[49,1,47,21,49,24]},{"value":"[nesrak1/AssetsTools.NET](https://github.com/nesrak1/AssetsTools.NET)","cspan":1,"rspan":1,"markup":[10,69]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/nesrak1/AssetsTools.NET/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[15,69]}],[{"value":"[`BepInEx/winhttp.dll`](./BepInEx/winhttp.dll)","cspan":1,"rspan":1,"markup":[51,1,50,21,51,24]},{"value":"[NeighTools/UnityDoorstop](https://github.com/NeighTools/UnityDoorstop)","cspan":1,"rspan":1,"markup":[36,71]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[CC0-1.0](https://github.com/NeighTools/UnityDoorstop/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[32,74]}],[{"value":"[`BepInEx/BepInEx/core/0Harmony.dll`](./BepInEx/BepInEx/core/0Harmony.dll)","cspan":1,"rspan":1,"markup":[46,1,43,35,46,38]},{"value":"[BepInEx/HarmonyX](https://github.com/BepInEx/HarmonyX)","cspan":1,"rspan":1,"markup":[22,55]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/BepInEx/HarmonyX/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[26,62]}],[{"value":"[`BepInEx/BepInEx/core/BepInEx.dll`](./BepInEx/BepInEx/core/BepInEx.dll)\n[`BepInEx/BepInEx/core/BepInEx.Preloader.dll`](./BepInEx/BepInEx/core/BepInEx.Preloader.dll)","cspan":1,"rspan":1,"markup":[42,1,39,34,42,37,1,1,38,1,37,44,38,47]},{"value":"[BepInEx/BepInEx](https://github.com/BepInEx/BepInEx)","cspan":1,"rspan":1,"markup":[48,53]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/BepInEx/BepInEx/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[45,61]}],[{"value":"[`BepInEx/BepInEx/core/BepInEx.Harmony.dll`](./BepInEx/BepInEx/core/BepInEx.Harmony.dll)","cspan":1,"rspan":1,"markup":[30,1,28,42,30,45]},{"value":"[BepInEx/BepInEx.Harmony](https://github.com/BepInEx/BepInEx.Harmony)","cspan":1,"rspan":1,"markup":[29,69]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/BepInEx/BepInEx.Harmony/master/LICENSE)","cspan":1,"rspan":1,"markup":[34,64]}],[{"value":"[`BepInEx/BepInEx/core/Mono.Cecil.dll`](./BepInEx/BepInEx/core/Mono.Cecil.dll)\n[`BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll)\n[`BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll)\n[`BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll)","cspan":1,"rspan":1,"markup":[6,1,4,37,6,40,1,1,52,1,53,41,52,44,1,1,54,1,55,41,54,44,1,1,56,1,57,43,56,46]},{"value":"[jbevain/cecil](https://github.com/jbevain/cecil)","cspan":1,"rspan":1,"markup":[44,49]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/jbevain/cecil/blob/master/LICENSE.txt)","cspan":1,"rspan":1,"markup":[41,63]}],[{"value":"[`BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll`](./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll)\n[`BepInEx/BepInEx/core/MonoMod.Utils.dll`](./BepInEx/BepInEx/core/MonoMod.Utils.dll)","cspan":1,"rspan":1,"markup":[58,1,59,48,58,51,1,1,60,1,61,40,60,43]},{"value":"[MonoMod/MonoMod](https://github.com/MonoMod/MonoMod)","cspan":1,"rspan":1,"markup":[31,53]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/MonoMod/MonoMod/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[40,61]}],[{"value":"[`Carbon.vsf`](./Carbon.vsf)\n[`VclStylesinno.dll`](./VclStylesinno.dll)","cspan":1,"rspan":1,"markup":[19,1,14,12,19,15,1,1,11,1,9,19,11,22]},{"value":"[RRUZ/vcl-styles-plugins](https://github.com/RRUZ/vcl-styles-plugins)","cspan":1,"rspan":1,"markup":[5,69]},{"value":"☐\nBundled with the installer","cspan":1,"rspan":1,"markup":[1,34]},{"value":"No license","cspan":1,"rspan":1,"markup":[1,10]}],[{"value":"[`cldb.dat`](./cldb.dat)","cspan":1,"rspan":1,"markup":[27,1,25,10,27,13]},{"value":"[DerPopo/UABE](https://github.com/DerPopo/UABE)","cspan":1,"rspan":1,"markup":[96,47]},{"value":"☑","cspan":1,"rspan":1,"markup":[0,7]},{"value":"Free use","cspan":1,"rspan":1,"markup":[1,8]}],[{"value":"[`Newtonsoft.Json.dll`](./Newtonsoft.Json.dll)","cspan":1,"rspan":1,"markup":[24,1,23,21,24,24]},{"value":"[JamesNK/Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)","cspan":1,"rspan":1,"markup":[3,69]},{"value":"☐\nGame file","cspan":1,"rspan":1,"markup":[1,17]},{"value":"[MIT](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md)","cspan":1,"rspan":1,"markup":[16,72]}],[{"value":"[`RGiesecke.DllExport.Metadata.dll`](./RGiesecke.DllExport.Metadata.dll)","cspan":1,"rspan":1,"markup":[21,1,20,34,21,37]},{"value":"[nuget.org/UnmanagedExports](https://www.nuget.org/packages/UnmanagedExports)","cspan":1,"rspan":1,"markup":[12,77]},{"value":"☐","cspan":1,"rspan":1,"markup":[0,7]},{"value":"[MIT](https://opensource.org/licenses/mit-license.php)","cspan":1,"rspan":1,"markup":[17,54]}],[{"value":"[`UnityEngine.dll`](./UnityEngine.dll)\n[`UnityEngine.AssetBundleModule.dll`](./UnityEngine.AssetBundleModule.dll)\n[`UnityEngine.CoreModule.dll`](./UnityEngine.CoreModule.dll)\n[`UnityEngine.IMGUIModule.dll`](./UnityEngine.IMGUIModule.dll)\n[`UnityEngine.InputLegacyModule.dll`](./UnityEngine.InputLegacyModule.dll)\n[`UnityEngine.InputModule.dll`](./UnityEngine.InputModule.dll)\n[`UnityEngine.UI.dll`](./UnityEngine.UI.dll)","cspan":1,"rspan":1,"markup":[62,1,63,17,62,20,1,1,64,1,65,35,64,38,1,1,66,1,67,28,66,31,1,1,68,1,69,29,68,32,1,1,70,1,71,35,70,38,1,1,72,1,73,29,72,32,1,1,74,1,75,20,74,23]},{"value":"[Unity-Technologies/UnityCsReference](https://github.com/Unity-Technologies/UnityCsReference)","cspan":1,"rspan":1,"markup":[13,93]},{"value":"☐\nGame file","cspan":1,"rspan":1,"markup":[1,17]},{"value":"[Unity Reference-Only License](https://unity3d.com/legal/licenses/Unity_Reference_Only_License)","cspan":1,"rspan":1,"markup":[18,95]}]]},"theme":{"ColorTheme":"Default","BorderTheme":"All borders"},"fixed_layout":false,"markup":{"instances":[{},{"style":{}},{"style":{"color":"#905","backgroundColor":"#ddd"}},{"style":{"color":"#905"},"link_href":"https://github.com/JamesNK/Newtonsoft.Json","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/RRUZ/vcl-styles-plugins","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.dll","link_open_in_new_tab":true},null,null,{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./VclStylesinno.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/nesrak1/AssetsTools.NET","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./VclStylesinno.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://www.nuget.org/packages/UnmanagedExports","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/Unity-Technologies/UnityCsReference","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./Carbon.vsf","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/nesrak1/AssetsTools.NET/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://opensource.org/licenses/mit-license.php","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://unity3d.com/legal/licenses/Unity_Reference_Only_License","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./Carbon.vsf","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./RGiesecke.DllExport.Metadata.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./RGiesecke.DllExport.Metadata.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/HarmonyX","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./Newtonsoft.Json.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./Newtonsoft.Json.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./cldb.dat","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/HarmonyX/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./cldb.dat","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx.Harmony","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/MonoMod/MonoMod","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/NeighTools/UnityDoorstop/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"fontStyle":"italic","fontWeight":"bold"}},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx.Harmony/master/LICENSE","link_open_in_new_tab":true},{"style":{"fontStyle":"italic"}},{"style":{"color":"#905"},"link_href":"https://github.com/NeighTools/UnityDoorstop","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Preloader.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Preloader.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/BepInEx.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/MonoMod/MonoMod/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/jbevain/cecil/blob/master/LICENSE.txt","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/BepInEx.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/0Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/jbevain/cecil","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/0Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./AssetsTools.NET.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./AssetsTools.NET.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/winhttp.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/winhttp.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/MonoMod.Utils.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/MonoMod.Utils.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.AssetBundleModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.AssetBundleModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.CoreModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.CoreModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.IMGUIModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.IMGUIModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.InputLegacyModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.InputLegacyModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.InputModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.InputModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.UI.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.UI.dll","link_open_in_new_tab":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,{"style":{"color":"#905"},"link_href":"https://github.com/DerPopo/UABE","link_open_in_new_tab":true},null,{"style":{"color":"#905"},"link_href":"https://github.com/unknownworlds","link_open_in_new_tab":true}]},"options":{}}
diff --git a/Dependencies/Newtonsoft.Json.dll b/Dependencies/SN.STABLE/Newtonsoft.Json.dll
similarity index 100%
rename from Dependencies/Newtonsoft.Json.dll
rename to Dependencies/SN.STABLE/Newtonsoft.Json.dll
diff --git a/Dependencies/SN.STABLE/README.md b/Dependencies/SN.STABLE/README.md
new file mode 100644
index 00000000..041f5892
--- /dev/null
+++ b/Dependencies/SN.STABLE/README.md
@@ -0,0 +1,15 @@
+| Dependency | Link | Redistributed? | License |
+|:-:|:-:|:-:|:-:|
+| `Assembly-CSharp.dll`
`Assembly-CSharp-firstpass.dll` | [@unknownworlds](https://github.com/unknownworlds) | ☐
Game file | Intellectual property of Unknown Worlds
_**Not included on GitHub**_ |
+| [`AssetsTools.NET.dll`](./AssetsTools.NET.dll) | [nesrak1/AssetsTools.NET](https://github.com/nesrak1/AssetsTools.NET) | ☑ | [MIT](https://github.com/nesrak1/AssetsTools.NET/blob/master/LICENSE) |
+| [`BepInEx/winhttp.dll`](./BepInEx/winhttp.dll) | [NeighTools/UnityDoorstop](https://github.com/NeighTools/UnityDoorstop) | ☑ | [CC0-1.0](https://github.com/NeighTools/UnityDoorstop/blob/master/LICENSE) |
+| [`BepInEx/BepInEx/core/0Harmony.dll`](./BepInEx/BepInEx/core/0Harmony.dll) | [BepInEx/HarmonyX](https://github.com/BepInEx/HarmonyX) | ☑ | [MIT](https://github.com/BepInEx/HarmonyX/blob/master/LICENSE) |
+| [`BepInEx/BepInEx/core/BepInEx.dll`](./BepInEx/BepInEx/core/BepInEx.dll)
[`BepInEx/BepInEx/core/BepInEx.Preloader.dll`](./BepInEx/BepInEx/core/BepInEx.Preloader.dll) | [BepInEx/BepInEx](https://github.com/BepInEx/BepInEx) | ☑ | [MIT](https://github.com/BepInEx/BepInEx/blob/master/LICENSE) |
+| [`BepInEx/BepInEx/core/BepInEx.Harmony.dll`](./BepInEx/BepInEx/core/BepInEx.Harmony.dll) | [BepInEx/BepInEx.Harmony](https://github.com/BepInEx/BepInEx.Harmony) | ☑ | [MIT](https://github.com/BepInEx/BepInEx.Harmony/master/LICENSE) |
+| [`BepInEx/BepInEx/core/Mono.Cecil.dll`](./BepInEx/BepInEx/core/Mono.Cecil.dll)
[`BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll)
[`BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll)
[`BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll) | [jbevain/cecil](https://github.com/jbevain/cecil) | ☑ | [MIT](https://github.com/jbevain/cecil/blob/master/LICENSE.txt) |
+| [`BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll`](./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll)
[`BepInEx/BepInEx/core/MonoMod.Utils.dll`](./BepInEx/BepInEx/core/MonoMod.Utils.dll) | [MonoMod/MonoMod](https://github.com/MonoMod/MonoMod) | ☑ | [MIT](https://github.com/MonoMod/MonoMod/blob/master/LICENSE) |
+| [`Carbon.vsf`](./Carbon.vsf)
[`VclStylesinno.dll`](./VclStylesinno.dll) | [RRUZ/vcl-styles-plugins](https://github.com/RRUZ/vcl-styles-plugins) | ☐
Bundled with the installer | No license |
+| [`cldb.dat`](./cldb.dat) | [DerPopo/UABE](https://github.com/DerPopo/UABE) | ☑ | Free use |
+| [`Newtonsoft.Json.dll`](./Newtonsoft.Json.dll) | [JamesNK/Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) | ☐
Game file | [MIT](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) |
+| [`RGiesecke.DllExport.Metadata.dll`](./RGiesecke.DllExport.Metadata.dll) | [nuget.org/UnmanagedExports](https://www.nuget.org/packages/UnmanagedExports) | ☐ | [MIT](https://opensource.org/licenses/mit-license.php) |
+| [`UnityEngine.dll`](./UnityEngine.dll)
[`UnityEngine.AssetBundleModule.dll`](./UnityEngine.AssetBundleModule.dll)
[`UnityEngine.CoreModule.dll`](./UnityEngine.CoreModule.dll)
[`UnityEngine.IMGUIModule.dll`](./UnityEngine.IMGUIModule.dll)
[`UnityEngine.InputLegacyModule.dll`](./UnityEngine.InputLegacyModule.dll)
[`UnityEngine.InputModule.dll`](./UnityEngine.InputModule.dll)
[`UnityEngine.UI.dll`](./UnityEngine.UI.dll) | [Unity-Technologies/UnityCsReference](https://github.com/Unity-Technologies/UnityCsReference) | ☐
Game file | [Unity Reference-Only License](https://unity3d.com/legal/licenses/Unity_Reference_Only_License) |
diff --git a/Dependencies/UnityEngine.AssetBundleModule.dll b/Dependencies/SN.STABLE/UnityEngine.AssetBundleModule.dll
similarity index 100%
rename from Dependencies/UnityEngine.AssetBundleModule.dll
rename to Dependencies/SN.STABLE/UnityEngine.AssetBundleModule.dll
diff --git a/Dependencies/SN.STABLE/UnityEngine.CoreModule.dll b/Dependencies/SN.STABLE/UnityEngine.CoreModule.dll
new file mode 100644
index 00000000..0baea738
Binary files /dev/null and b/Dependencies/SN.STABLE/UnityEngine.CoreModule.dll differ
diff --git a/Dependencies/UnityEngine.IMGUIModule.dll b/Dependencies/SN.STABLE/UnityEngine.IMGUIModule.dll
similarity index 100%
rename from Dependencies/UnityEngine.IMGUIModule.dll
rename to Dependencies/SN.STABLE/UnityEngine.IMGUIModule.dll
diff --git a/Dependencies/UnityEngine.InputLegacyModule.dll b/Dependencies/SN.STABLE/UnityEngine.InputLegacyModule.dll
similarity index 100%
rename from Dependencies/UnityEngine.InputLegacyModule.dll
rename to Dependencies/SN.STABLE/UnityEngine.InputLegacyModule.dll
diff --git a/Dependencies/UnityEngine.InputModule.dll b/Dependencies/SN.STABLE/UnityEngine.InputModule.dll
similarity index 100%
rename from Dependencies/UnityEngine.InputModule.dll
rename to Dependencies/SN.STABLE/UnityEngine.InputModule.dll
diff --git a/Dependencies/SN.STABLE/UnityEngine.UI.dll b/Dependencies/SN.STABLE/UnityEngine.UI.dll
new file mode 100644
index 00000000..68935e7a
Binary files /dev/null and b/Dependencies/SN.STABLE/UnityEngine.UI.dll differ
diff --git a/Dependencies/UnityEngine.dll b/Dependencies/SN.STABLE/UnityEngine.dll
similarity index 100%
rename from Dependencies/UnityEngine.dll
rename to Dependencies/SN.STABLE/UnityEngine.dll
diff --git a/Dependencies/SN.STABLE/table-data.tgn b/Dependencies/SN.STABLE/table-data.tgn
new file mode 100644
index 00000000..f7059da7
--- /dev/null
+++ b/Dependencies/SN.STABLE/table-data.tgn
@@ -0,0 +1 @@
+{"rows_views":[[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}],[{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}},{"style":{"borders":"lrtb","font_style":{},"text_color":"","bg_color":"","halign":"center","valign":"top","padding":{"top":10,"right":5,"bottom":10,"left":5},"border_color":""}}]],"model":{"rows":[[{"value":"Dependency","cspan":1,"rspan":1,"markup":[1,10]},{"value":"Link","cspan":1,"rspan":1,"markup":[0,4]},{"value":"Redistributed?","cspan":1,"rspan":1,"markup":[0,14]},{"value":"License","cspan":1,"rspan":1,"markup":[1,7]}],[{"value":"`Assembly-CSharp.dll`\n`Assembly-CSharp-firstpass.dll`","cspan":1,"rspan":1,"markup":[2,21,1,1,2,31]},{"value":"[@unknownworlds](https://github.com/unknownworlds)","cspan":1,"rspan":1,"markup":[98,50]},{"value":"☐\nGame file","cspan":1,"rspan":1,"markup":[1,17]},{"value":"Intellectual property of Unknown Worlds\n_**Not included on GitHub**_","cspan":1,"rspan":1,"markup":[1,40,35,1,33,26,35,1]}],[{"value":"[`AssetsTools.NET.dll`](./AssetsTools.NET.dll)","cspan":1,"rspan":1,"markup":[49,1,47,21,49,24]},{"value":"[nesrak1/AssetsTools.NET](https://github.com/nesrak1/AssetsTools.NET)","cspan":1,"rspan":1,"markup":[10,69]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/nesrak1/AssetsTools.NET/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[15,69]}],[{"value":"[`BepInEx/winhttp.dll`](./BepInEx/winhttp.dll)","cspan":1,"rspan":1,"markup":[51,1,50,21,51,24]},{"value":"[NeighTools/UnityDoorstop](https://github.com/NeighTools/UnityDoorstop)","cspan":1,"rspan":1,"markup":[36,71]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[CC0-1.0](https://github.com/NeighTools/UnityDoorstop/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[32,74]}],[{"value":"[`BepInEx/BepInEx/core/0Harmony.dll`](./BepInEx/BepInEx/core/0Harmony.dll)","cspan":1,"rspan":1,"markup":[46,1,43,35,46,38]},{"value":"[BepInEx/HarmonyX](https://github.com/BepInEx/HarmonyX)","cspan":1,"rspan":1,"markup":[22,55]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/BepInEx/HarmonyX/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[26,62]}],[{"value":"[`BepInEx/BepInEx/core/BepInEx.dll`](./BepInEx/BepInEx/core/BepInEx.dll)\n[`BepInEx/BepInEx/core/BepInEx.Preloader.dll`](./BepInEx/BepInEx/core/BepInEx.Preloader.dll)","cspan":1,"rspan":1,"markup":[42,1,39,34,42,37,1,1,38,1,37,44,38,47]},{"value":"[BepInEx/BepInEx](https://github.com/BepInEx/BepInEx)","cspan":1,"rspan":1,"markup":[48,53]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/BepInEx/BepInEx/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[45,61]}],[{"value":"[`BepInEx/BepInEx/core/BepInEx.Harmony.dll`](./BepInEx/BepInEx/core/BepInEx.Harmony.dll)","cspan":1,"rspan":1,"markup":[30,1,28,42,30,45]},{"value":"[BepInEx/BepInEx.Harmony](https://github.com/BepInEx/BepInEx.Harmony)","cspan":1,"rspan":1,"markup":[29,69]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/BepInEx/BepInEx.Harmony/master/LICENSE)","cspan":1,"rspan":1,"markup":[34,64]}],[{"value":"[`BepInEx/BepInEx/core/Mono.Cecil.dll`](./BepInEx/BepInEx/core/Mono.Cecil.dll)\n[`BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll)\n[`BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll)\n[`BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll`](./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll)","cspan":1,"rspan":1,"markup":[6,1,4,37,6,40,1,1,52,1,53,41,52,44,1,1,54,1,55,41,54,44,1,1,56,1,57,43,56,46]},{"value":"[jbevain/cecil](https://github.com/jbevain/cecil)","cspan":1,"rspan":1,"markup":[44,49]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/jbevain/cecil/blob/master/LICENSE.txt)","cspan":1,"rspan":1,"markup":[41,63]}],[{"value":"[`BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll`](./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll)\n[`BepInEx/BepInEx/core/MonoMod.Utils.dll`](./BepInEx/BepInEx/core/MonoMod.Utils.dll)","cspan":1,"rspan":1,"markup":[58,1,59,48,58,51,1,1,60,1,61,40,60,43]},{"value":"[MonoMod/MonoMod](https://github.com/MonoMod/MonoMod)","cspan":1,"rspan":1,"markup":[31,53]},{"value":"☑","cspan":1,"rspan":1,"markup":[1,7]},{"value":"[MIT](https://github.com/MonoMod/MonoMod/blob/master/LICENSE)","cspan":1,"rspan":1,"markup":[40,61]}],[{"value":"[`Carbon.vsf`](./Carbon.vsf)\n[`VclStylesinno.dll`](./VclStylesinno.dll)","cspan":1,"rspan":1,"markup":[19,1,14,12,19,15,1,1,11,1,9,19,11,22]},{"value":"[RRUZ/vcl-styles-plugins](https://github.com/RRUZ/vcl-styles-plugins)","cspan":1,"rspan":1,"markup":[5,69]},{"value":"☐\nBundled with the installer","cspan":1,"rspan":1,"markup":[1,34]},{"value":"No license","cspan":1,"rspan":1,"markup":[1,10]}],[{"value":"[`cldb.dat`](./cldb.dat)","cspan":1,"rspan":1,"markup":[27,1,25,10,27,13]},{"value":"[DerPopo/UABE](https://github.com/DerPopo/UABE)","cspan":1,"rspan":1,"markup":[96,47]},{"value":"☑","cspan":1,"rspan":1,"markup":[0,7]},{"value":"Free use","cspan":1,"rspan":1,"markup":[1,8]}],[{"value":"[`Newtonsoft.Json.dll`](./Newtonsoft.Json.dll)","cspan":1,"rspan":1,"markup":[24,1,23,21,24,24]},{"value":"[JamesNK/Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json)","cspan":1,"rspan":1,"markup":[3,69]},{"value":"☐\nGame file","cspan":1,"rspan":1,"markup":[1,17]},{"value":"[MIT](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md)","cspan":1,"rspan":1,"markup":[16,72]}],[{"value":"[`RGiesecke.DllExport.Metadata.dll`](./RGiesecke.DllExport.Metadata.dll)","cspan":1,"rspan":1,"markup":[21,1,20,34,21,37]},{"value":"[nuget.org/UnmanagedExports](https://www.nuget.org/packages/UnmanagedExports)","cspan":1,"rspan":1,"markup":[12,77]},{"value":"☐","cspan":1,"rspan":1,"markup":[0,7]},{"value":"[MIT](https://opensource.org/licenses/mit-license.php)","cspan":1,"rspan":1,"markup":[17,54]}],[{"value":"[`UnityEngine.dll`](./UnityEngine.dll)\n[`UnityEngine.AssetBundleModule.dll`](./UnityEngine.AssetBundleModule.dll)\n[`UnityEngine.CoreModule.dll`](./UnityEngine.CoreModule.dll)\n[`UnityEngine.IMGUIModule.dll`](./UnityEngine.IMGUIModule.dll)\n[`UnityEngine.InputLegacyModule.dll`](./UnityEngine.InputLegacyModule.dll)\n[`UnityEngine.InputModule.dll`](./UnityEngine.InputModule.dll)\n[`UnityEngine.UI.dll`](./UnityEngine.UI.dll)","cspan":1,"rspan":1,"markup":[62,1,63,17,62,20,1,1,64,1,65,35,64,38,1,1,66,1,67,28,66,31,1,1,68,1,69,29,68,32,1,1,70,1,71,35,70,38,1,1,72,1,73,29,72,32,1,1,74,1,75,20,74,23]},{"value":"[Unity-Technologies/UnityCsReference](https://github.com/Unity-Technologies/UnityCsReference)","cspan":1,"rspan":1,"markup":[13,93]},{"value":"☐\nGame file","cspan":1,"rspan":1,"markup":[1,17]},{"value":"[Unity Reference-Only License](https://unity3d.com/legal/licenses/Unity_Reference_Only_License)","cspan":1,"rspan":1,"markup":[18,95]}]]},"theme":{"ColorTheme":"Default","BorderTheme":"All borders"},"fixed_layout":false,"markup":{"instances":[{},{"style":{}},{"style":{"color":"#905","backgroundColor":"#ddd"}},{"style":{"color":"#905"},"link_href":"https://github.com/JamesNK/Newtonsoft.Json","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/RRUZ/vcl-styles-plugins","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.dll","link_open_in_new_tab":true},null,null,{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./VclStylesinno.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/nesrak1/AssetsTools.NET","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./VclStylesinno.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://www.nuget.org/packages/UnmanagedExports","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/Unity-Technologies/UnityCsReference","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./Carbon.vsf","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/nesrak1/AssetsTools.NET/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://opensource.org/licenses/mit-license.php","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://unity3d.com/legal/licenses/Unity_Reference_Only_License","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./Carbon.vsf","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./RGiesecke.DllExport.Metadata.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./RGiesecke.DllExport.Metadata.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/HarmonyX","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./Newtonsoft.Json.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./Newtonsoft.Json.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./cldb.dat","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/HarmonyX/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./cldb.dat","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx.Harmony","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/MonoMod/MonoMod","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/NeighTools/UnityDoorstop/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"fontStyle":"italic","fontWeight":"bold"}},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx.Harmony/master/LICENSE","link_open_in_new_tab":true},{"style":{"fontStyle":"italic"}},{"style":{"color":"#905"},"link_href":"https://github.com/NeighTools/UnityDoorstop","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Preloader.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/BepInEx.Preloader.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/BepInEx.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/MonoMod/MonoMod/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/jbevain/cecil/blob/master/LICENSE.txt","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/BepInEx.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/0Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/jbevain/cecil","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx/blob/master/LICENSE","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/0Harmony.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./AssetsTools.NET.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"https://github.com/BepInEx/BepInEx","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./AssetsTools.NET.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/winhttp.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/winhttp.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Mdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Pdb.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/Mono.Cecil.Rocks.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/MonoMod.RuntimeDetour.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./BepInEx/BepInEx/core/MonoMod.Utils.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./BepInEx/BepInEx/core/MonoMod.Utils.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.AssetBundleModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.AssetBundleModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.CoreModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.CoreModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.IMGUIModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.IMGUIModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.InputLegacyModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.InputLegacyModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.InputModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.InputModule.dll","link_open_in_new_tab":true},{"style":{"color":"#905"},"link_href":"./UnityEngine.UI.dll","link_open_in_new_tab":true},{"style":{"color":"#905","backgroundColor":"#ddd"},"link_href":"./UnityEngine.UI.dll","link_open_in_new_tab":true},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,{"style":{"color":"#905"},"link_href":"https://github.com/DerPopo/UABE","link_open_in_new_tab":true},null,{"style":{"color":"#905"},"link_href":"https://github.com/unknownworlds","link_open_in_new_tab":true}]},"options":{}}
diff --git a/Dependencies/UnityEngine.CoreModule.dll b/Dependencies/UnityEngine.CoreModule.dll
deleted file mode 100644
index 2854efed..00000000
Binary files a/Dependencies/UnityEngine.CoreModule.dll and /dev/null differ
diff --git a/Dependencies/UnityEngine.UI.dll b/Dependencies/UnityEngine.UI.dll
deleted file mode 100644
index ad5ab570..00000000
Binary files a/Dependencies/UnityEngine.UI.dll and /dev/null differ
diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj
index b9fa2072..a630a8bd 100644
--- a/Examples/Examples.csproj
+++ b/Examples/Examples.csproj
@@ -9,34 +9,53 @@
Properties
QModManager.Examples
Examples
- v4.0
+ v4.7.2
512
true
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
+
+ ..\Build\$(Configuration)\
+ TRACE
+ true
+ pdbonly
+ AnyCPU
+ 7.3
prompt
- 4
-
+
+ ..\Build\$(Configuration)\
+ TRACE
+ true
pdbonly
+ AnyCPU
+ 7.3
+ prompt
+
+
+ ..\Build\$(Configuration)\
+ TRACE
true
- bin\Release\
+ pdbonly
+ AnyCPU
+ 7.3
+ prompt
+
+
+ ..\Build\$(Configuration)\
TRACE
+ true
+ pdbonly
+ AnyCPU
+ 7.3
prompt
- 4
- ..\Dependencies\Assembly-CSharp.dll
+ ..\Dependencies\$(Configuration)\Assembly-CSharp.dll
- ..\Dependencies\Assembly-CSharp-firstpass.dll
+ ..\Dependencies\$(Configuration)\Assembly-CSharp-firstpass.dll
@@ -45,7 +64,7 @@
- ..\Dependencies\UnityEngine.CoreModule.dll
+ ..\Dependencies\$(Configuration)\UnityEngine.CoreModule.dll
diff --git a/Executable/Executable.csproj b/Executable/Executable.csproj
index c3cbc293..3d133575 100644
--- a/Executable/Executable.csproj
+++ b/Executable/Executable.csproj
@@ -8,89 +8,60 @@
Exe
QModManager
QModManager
- v4.0
+ v4.7.2
512
{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
4
true
-
+
+ ..\Build\$(Configuration)\
+ SUBNAUTICA;SUBNAUTICA_STABLE
+ true
+ pdbonly
AnyCPU
- true
- full
- false
- ..\Build\
- DEBUG;TRACE
+ 7.3
prompt
- 4
- false
- latest
-
- AnyCPU
- pdbonly
+
+ ..\Build\$(Configuration)\
+ SUBNAUTICA;SUBNAUTICA_EXP
true
- ..\Build\
- TRACE
- prompt
- 4
- false
-
-
- QModManager.Executable
-
-
- icon.ico
-
-
- true
- ..\Build\
- DEBUG;TRACE
- full
- x64
+ pdbonly
+ AnyCPU
7.3
prompt
- MinimumRecommendedRules.ruleset
-
- ..\Build\
- TRACE
+
+ ..\Build\$(Configuration)\
+ BELOWZERO;BELOWZERO_STABLE
true
pdbonly
- x64
- prompt
- MinimumRecommendedRules.ruleset
-
-
- true
- ..\Build\
- DEBUG;TRACE
- full
- x86
+ AnyCPU
7.3
prompt
- MinimumRecommendedRules.ruleset
-
- ..\Build\
- TRACE
+
+ ..\Build\$(Configuration)\
+ BELOWZERO;BELOWZERO_EXP
true
pdbonly
- x86
+ AnyCPU
+ 7.3
prompt
- MinimumRecommendedRules.ruleset
+
+
+ QModManager.Executable
+
+
+ icon.ico
..\Dependencies\BepInEx\BepInEx\core\Mono.Cecil.dll
False
-
- False
- ..\Build\QModManager.UnityAudioFixer.dll
- False
-
@@ -104,6 +75,12 @@
+
+
+ {ca99f076-7459-4682-a41d-2850aee28566}
+ QModManager.UnityAudioFixer
+
+
diff --git a/Executable/Properties/AssemblyInfo.cs b/Executable/Properties/AssemblyInfo.cs
index 6aaebc1d..353511da 100644
--- a/Executable/Properties/AssemblyInfo.cs
+++ b/Executable/Properties/AssemblyInfo.cs
@@ -12,5 +12,5 @@
[assembly: ComVisible(false)]
-[assembly: AssemblyVersion("4.0.2.6")]
-[assembly: AssemblyFileVersion("4.0.2.6")]
+[assembly: AssemblyVersion("4.1.2")]
+[assembly: AssemblyFileVersion("4.1.2")]
diff --git a/Executable/app.config b/Executable/app.config
index fcd0c937..312bb3f2 100644
--- a/Executable/app.config
+++ b/Executable/app.config
@@ -1,3 +1,3 @@
-
+
diff --git a/Installer/QModsInstallerScript.iss b/Installer/BZ.EXP.iss
similarity index 71%
rename from Installer/QModsInstallerScript.iss
rename to Installer/BZ.EXP.iss
index 29c0a406..ca3f817e 100644
--- a/Installer/QModsInstallerScript.iss
+++ b/Installer/BZ.EXP.iss
@@ -5,7 +5,7 @@
#endif
#define Name "QModManager" ; The name of the game will be added after it
-#define Version "4.0.2.6"
+#define Version "4.1.2"
#define Author "QModManager"
#define URL "https://github.com/QModManager/QModManager"
#define SupportURL "https://discord.gg/UpWuWwq"
@@ -31,17 +31,17 @@ DisableDirPage=no
DisableProgramGroupPage=yes
DisableWelcomePage=no
EnableDirDoesntExistWarning=yes
-OutputBaseFilename=QModManager_Setup
-OutputDir=..\Build
+OutputBaseFilename=QModManager_{#Version}_BelowZero_Experimental_Setup
+OutputDir=.\
PrivilegesRequired=admin
-SetupIconFile=..\Assets\Icon.ico
+SetupIconFile=..\..\Assets\Icon.ico
SolidCompression=yes
UninstallDisplayIcon={app}\BepInEx\patchers\QModManager\QModManager.exe
UninstallDisplayName={code:GetName}
UsePreviousAppDir=no
UsePreviousLanguage=no
-WizardImageFile=..\Assets\InstallerImage.bmp
-WizardSmallImageFile=..\Assets\InstallerSmallImage.bmp
+WizardImageFile=..\..\Assets\InstallerImage.bmp
+WizardSmallImageFile=..\..\Assets\InstallerSmallImage.bmp
UsePreviousSetupType=False
UsePreviousTasks=False
CloseApplications=False
@@ -52,23 +52,30 @@ Name: "english"; MessagesFile: "compiler:Default.isl"
[Files]
; Files used by the installer but not required by QModManager itself
; Installer theme
-Source: "..\Dependencies\VclStylesinno.dll"; Flags: DontCopy
-Source: "..\Dependencies\Carbon.vsf"; Flags: DontCopy
+Source: "..\..\Dependencies\VclStylesinno.dll"; Flags: DontCopy
+Source: "..\..\Dependencies\Carbon.vsf"; Flags: DontCopy
; Installer extensions
-Source: "..\Build\InstallerExtensions.dll"; Flags: DontCopy
+Source: "InstallerExtensions.dll"; Flags: DontCopy
+
; Files required by QModManager itself
-Source: "..\Build\QModInstaller.dll"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModInstaller.xml"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModManager.QMMLoader.dll"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModManager.QMMLoader.xml"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModManager.QModPluginGenerator.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModManager.UnityAudioFixer.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModManager.UnityAudioFixer.xml"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
-Source: "..\packages\AssetsTools.NET.2.0.3\lib\net35\AssetsTools.NET.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
-Source: "..\Dependencies\cldb.dat"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
-Source: "..\Build\QModManager.exe"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+; Dependencies
+Source: "..\..\packages\AssetsTools.NET.2.0.3\lib\net35\AssetsTools.NET.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\cldb.dat"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\Oculus.Newtonsoft.Json.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; QMM
+Source: "QModInstaller.dll"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModInstaller.xml"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModManager.exe"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx patchers
+Source: "QModManager.OculusNewtonsoftRedirect.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.QModPluginGenerator.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.xml"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
; BepInEx
-Source: "..\Dependencies\BepInEx\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs replacesameversion sharedfile uninsnosharedfileprompt;
+Source: "..\..\Dependencies\BepInEx\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs replacesameversion sharedfile uninsnosharedfileprompt;
[Dirs]
Name: "{app}\QMods"
@@ -96,7 +103,6 @@ Name: "select"; Description: "QModManager"; Flags: IsCustom;
[Components]
Name: "qmm"; Description: "QModManager"; Flags: fixed; Types: select;
-Name: "qmm\sn"; Description: "Install for Subnautica"; Flags: exclusive fixed;
Name: "qmm\bz"; Description: "Install for Below Zero"; Flags: exclusive fixed;
[Tasks]
@@ -106,24 +112,6 @@ Name: "cleanup"; Description: "(Recommended) Clean up after previous Nitrox and
// Import stuff from InstallerExtensions.dll
function PathsEqual(pathone, pathtwo: WideString): Boolean; external 'PathsEqual@files:InstallerExtensions.dll stdcall setuponly delayload';
-function IsSubnautica(path: String): Boolean;
-begin
- if (FileExists(path + '\Subnautica.exe')) and (FileExists(path + '\Subnautica_Data\Managed\Assembly-CSharp.dll')) then
- begin
- Result := true
- Exit
- end
- else
- begin
- Result := false
- Exit
- end
-end;
-function IsSubnauticaApp(): Boolean;
-begin
- Result := IsSubnautica(ExpandConstant('{app}'));
-end;
-
function IsBelowZero(path: String): Boolean;
begin
if (FileExists(path + '\SubnauticaZero.exe')) and (FileExists(path + '\SubnauticaZero_Data\Managed\Assembly-CSharp.dll')) then
@@ -144,11 +132,7 @@ end;
function GetName(def: string): String;
begin
- if (IsSubnauticaApp()) then
- begin
- Result := '{#Name} (Subnautica)'
- end
- else if (IsBelowZeroApp()) then
+ if (IsBelowZeroApp()) then
begin
Result := '{#Name} (Below Zero)'
end
@@ -160,11 +144,7 @@ end;
function GetURL(def: string): String;
begin
- if (IsSubnauticaApp()) then
- begin
- Result := '{#UpdatesURL}/subnautica/mods/201'
- end
- else if (IsBelowZeroApp()) then
+ if (IsBelowZeroApp()) then
begin
Result := '{#UpdatesURL}/subnauticabelowzero/mods/1'
end
@@ -186,25 +166,11 @@ begin
except
app := 'null'
end;
- if IsSubnautica(app) and IsBelowZero(app) then
- begin
- WizardForm.SelectComponentsLabel.Caption := 'Multiple games detected in the same folder, cannot install'
- Exit
- end;
- if not IsSubnautica(app) and not IsBelowZero(app) then
+ if not IsBelowZero(app) then
begin
WizardForm.SelectComponentsLabel.Caption := 'No game detected in this folder, cannot install'
Exit
end;
- Index := WizardForm.ComponentsList.Items.IndexOf('Install for Subnautica')
- if Index <> -1 then
- begin
- if IsSubnautica(app) then
- begin
- WizardForm.ComponentsList.Checked[Index] := true
- WizardForm.SelectComponentsLabel.Caption := 'Install QModManager for Subnautica'
- end
- end;
Index := WizardForm.ComponentsList.Items.IndexOf('Install for Below Zero')
if Index <> -1 then
begin
@@ -244,7 +210,7 @@ begin
P := Pos('BaseInstallFolder_', FileLines[I])
if P > 0 then
begin
- steamInstallPath := Copy(FileLines[I], P + 23, Length(FileLines[i]) - P - 23)
+ steamInstallPath := Copy(FileLines[I], P + 23, 3) + Copy(FileLines[I], P + 27, Length(FileLines[I]) - P - 27);
if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then // If the folder is correct
begin
Result := steamInstallPath + '\steamapps\common\' + folder
@@ -260,15 +226,8 @@ begin
end;
var ACLabel: TLabel;
-var SubnauticaButton: TNewRadioButton;
var BelowZeroButton: TNewRadioButton;
-procedure SubnauticaButtonOnClick(Sender: TObject);
-begin
- WizardForm.DirEdit.Text := GetDir('Subnautica', 'Subnautica')
- SubnauticaButton.Checked := true
-end;
-
procedure BelowZeroButtonOnClick(Sender: TObject);
begin
WizardForm.DirEdit.Text := GetDir('SubnauticaZero', 'SubnauticaZero')
@@ -286,29 +245,17 @@ begin
Top := WizardForm.BackButton.Top - WizardForm.BackButton.Top / 90
end;
- SubnauticaButton := TNewRadioButton.Create(WizardForm)
- with SubnauticaButton do
+ BelowZeroButton := TNewRadioButton.Create(WizardForm)
+ with BelowZeroButton do
begin
Parent := WizardForm
- Caption := 'Subnautica'
- OnClick := @SubnauticaButtonOnClick
+ Caption := 'Below Zero'
+ OnClick := @BelowZeroButtonOnClick
Left := WizardForm.SelectDirLabel.Left + WizardForm.SelectDirLabel.Left / 30
Top := WizardForm.BackButton.Top + 10
Height := WizardForm.BackButton.Height
Enabled := True
end;
-
- BelowZeroButton := TNewRadioButton.Create(WizardForm)
- with BelowZeroButton do
- begin
- //Parent := WizardForm
- //Caption := 'Below Zero'
- //OnClick := @BelowZeroButtonOnClick
- //Left := SubnauticaButton.Left * 3
- //Top := WizardForm.BackButton.Top + 10
- //Height := WizardForm.BackButton.Height
- Enabled := False
- end;
end;
function CurPageChanged_AddButtons(CurPageID: Integer): Boolean;
@@ -316,27 +263,17 @@ begin
if CurPageID = wpSelectDir then
begin
WizardForm.DirEdit.Text := ''
- if GetDir('Subnautica', 'Subnautica') = 'none' then
- begin
- SubnauticaButton.Enabled := false
- end;
if GetDir('SubnauticaZero', 'SubnauticaZero') = 'none' then
begin
BelowZeroButton.Enabled := false
end;
- if SubnauticaButton.Enabled and not BelowZeroButton.Enabled then
- begin
- WizardForm.DirEdit.Text := GetDir('Subnautica', 'Subnautica')
- SubnauticaButton.Checked := true
- end
- else if BelowZeroButton.Enabled and not SubnauticaButton.Enabled then
+ if BelowZeroButton.Enabled then
begin
WizardForm.DirEdit.Text := GetDir('SubnauticaZero', 'SubnauticaZero')
BelowZeroButton.Checked := true
end;
end;
- SubnauticaButton.Visible := CurPageID = wpSelectDir
BelowZeroButton.Visible := CurPageID = wpSelectDir
ACLabel.Visible := CurPageID = wpSelectDir
end;
@@ -347,21 +284,7 @@ procedure DirEditOnChange(Sender: TObject);
var
S: String;
begin
- if Pos('subnautica', LowerCase(WizardForm.DirEdit.Text)) <> 0 then
- begin
- if PathsEqual(WizardForm.DirEdit.Text, GetDir('Subnautica', 'Subnautica')) then
- begin
- SubnauticaButton.Checked := true
- end
- else
- begin
- SubnauticaButton.Checked := false;
- end
- end
- else
- begin
- SubnauticaButton.Checked := false;
- if Pos('subnauticazero', LowerCase(WizardForm.DirEdit.Text)) <> 0 then
+ if Pos('subnauticazero', LowerCase(WizardForm.DirEdit.Text)) <> 0 then
begin
if PathsEqual(WizardForm.DirEdit.Text, GetDir('SubnauticaZero', 'SubnauticaZero')) then
begin
@@ -372,11 +295,10 @@ begin
BelowZeroButton.Checked := false;
end
end
- else
+ else
begin
BelowZeroButton.Checked := false;
- end
- end;
+ end;
if (Pos('://', WizardForm.DirEdit.Text) <> 0) or (Pos(':\\', WizardForm.DirEdit.Text) <> 0) then
begin
@@ -402,11 +324,6 @@ begin
Result := ''
Exit
end;
- if IsSubnautica(ExpandConstant('{app}')) then
- begin
- Result := '{52CC87AA-645D-40FB-8411-510142191678}'
- Exit
- end;
if IsBelowZero(ExpandConstant('{app}')) then
begin
Result := '{A535470D-3403-46A2-8D44-28AD4B90C9A3}'
@@ -530,9 +447,9 @@ begin
Exit
end;
appIsSet := false
- if IsAppRunning('Subnautica.exe') or IsAppRunning('SubnauticaZero.exe') then
+ if IsAppRunning('SubnauticaZero.exe') then
begin
- MsgBox('You need to close Subnautica and Subnautica: Below Zero before installing QModManager.' + #13#10 + 'If none of these games are running, please reboot your computer.', mbError, MB_OK);
+ MsgBox('You need to close Below Zero before installing QModManager.' + #13#10 + 'If the game is not running, please reboot your computer.', mbError, MB_OK);
Result := false
end
else
@@ -544,7 +461,7 @@ begin
end
end;
-function IsPreviousVersionInstalled: Boolean; // Returns true for previus versions < 4.0 (prior to the change to BepInEx)
+function IsPreviousVersionInstalled: Boolean;
var
uninstallRegKey: String;
previousVersion: String;
@@ -578,51 +495,28 @@ var
resultCode: Integer;
begin
if CurPageID = wpSelectComponents then
- begin
- appIsSet := true
+ appIsSet := true;
+
+ Result := true;
+end;
+
+function PrepareToInstall(var NeedsRestart: boolean): string;
+var
+ uninstallString: string;
+ resultCode: integer;
+begin
+ NeedsRestart := false;
+ if IsPreviousVersionInstalled() then
+ begin
+ uninstallString := RemoveQuotes(GetUninstallString());
+ if FileExists(uninstallString) then
begin
+ Exec(uninstallString, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, resultCode);
if IsPreviousVersionInstalled() then
- begin
- if IsUpgrade() and FileExists(RemoveQuotes(GetUninstallString())) then
- begin
- if MsgBox('A previous installation of QModManager was detected. To update, it must be uninstalled.' + #13#10 + 'Do you want to uninstall it now?', mbInformation, MB_YESNO) = IDYES then
- begin
- uninstallString := RemoveQuotes(GetUninstallString());
- Exec(ExpandConstant(uninstallString), '', '', SW_SHOW, ewWaitUntilTerminated, resultCode);
- if IsPreviousVersionInstalled() then
- begin
- MsgBox('Previous installation of QModManager must be uninstalled to continue.', mbError, MB_OK);
- Result := false;
- Exit;
- end
- else
- Result := true;
- end
- else
- begin
- MsgBox('Previous installation of QModManager must be uninstalled to continue.', mbError, MB_OK);
- Result := false;
- Exit;
- end;
- end
- else
- begin
- if MsgBox('A previous installation of QModManager was detected, but the uninstaller could not be found.' + #13#10 + 'Improper uninstallation of QModManager can result in needing to verify your game files or reinstall the game.' + #13#10 + #13#10 + 'Install anyway?', mbError, MB_YESNO) = IDYES then
- begin
- Result := true;
- end
- else
- begin
- WizardForm.Close();
- Result := false;
- Exit;
- end;
- end;
- end;
+ Result := 'Previous installation must be uninstalled to continue.';
end;
end;
- Result := true;
end;
var TypesComboOnChangePrev: TNotifyEvent;
diff --git a/Installer/BZ.STABLE.iss b/Installer/BZ.STABLE.iss
new file mode 100644
index 00000000..b3d8b30e
--- /dev/null
+++ b/Installer/BZ.STABLE.iss
@@ -0,0 +1,605 @@
+; Throws an error if the version used to compile this script is not unicode
+; This ensures that the application is built correctly
+#if !Defined(UNICODE)
+ #error A unicode version of Inno Setup is required to compile this script
+#endif
+
+#define Name "QModManager" ; The name of the game will be added after it
+#define Version "4.1.2"
+#define Author "QModManager"
+#define URL "https://github.com/QModManager/QModManager"
+#define SupportURL "https://discord.gg/UpWuWwq"
+#define UpdatesURL "https://nexusmods.com" ; The link to the mod will be added after it
+
+[Setup]
+AllowNetworkDrive=no
+AllowUNCPath=no
+AlwaysShowDirOnReadyPage=yes
+AppendDefaultDirName=no
+AppId={code:GetGUID}
+AppName={#Name}
+AppPublisher={#Author}
+AppPublisherURL={#URL}
+AppSupportURL={#SupportURL}
+AppUpdatesURL={code:GetURL}
+AppVerName={#Name} {#Version}
+AppVersion={#Version}
+Compression=lzma
+DefaultDirName=.
+DirExistsWarning=no
+DisableDirPage=no
+DisableProgramGroupPage=yes
+DisableWelcomePage=no
+EnableDirDoesntExistWarning=yes
+OutputBaseFilename=QModManager_{#Version}_BelowZero_Setup
+OutputDir=.\
+PrivilegesRequired=admin
+SetupIconFile=..\..\Assets\Icon.ico
+SolidCompression=yes
+UninstallDisplayIcon={app}\BepInEx\patchers\QModManager\QModManager.exe
+UninstallDisplayName={code:GetName}
+UsePreviousAppDir=no
+UsePreviousLanguage=no
+WizardImageFile=..\..\Assets\InstallerImage.bmp
+WizardSmallImageFile=..\..\Assets\InstallerSmallImage.bmp
+UsePreviousSetupType=False
+UsePreviousTasks=False
+CloseApplications=False
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Files]
+; Files used by the installer but not required by QModManager itself
+; Installer theme
+Source: "..\..\Dependencies\VclStylesinno.dll"; Flags: DontCopy
+Source: "..\..\Dependencies\Carbon.vsf"; Flags: DontCopy
+; Installer extensions
+Source: "InstallerExtensions.dll"; Flags: DontCopy
+
+; Files required by QModManager itself
+; Dependencies
+Source: "..\..\packages\AssetsTools.NET.2.0.3\lib\net35\AssetsTools.NET.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\cldb.dat"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\Oculus.Newtonsoft.Json.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; QMM
+Source: "QModInstaller.dll"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModInstaller.xml"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModManager.exe"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx patchers
+Source: "QModManager.OculusNewtonsoftRedirect.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.QModPluginGenerator.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.xml"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx
+Source: "..\..\Dependencies\BepInEx\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs replacesameversion sharedfile uninsnosharedfileprompt;
+
+[Dirs]
+Name: "{app}\QMods"
+
+[Run]
+Filename: "{app}\BepInEx\patchers\QModManager\QModManager.exe"; Parameters: "-c"; Tasks: cleanup
+
+[UninstallRun]
+Filename: "{app}\BepInEx\patchers\QModManager\QModManager.exe"; Parameters: "-u";
+
+[Messages]
+; BeveledLabel={#Name} {#Version}
+WizardSelectDir=Select install location
+SelectDirLabel3=Please select the install folder of the game.
+SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.%nIf you have the game on steam, you can also use the buttons on the bottom left to auto-complete the install path for the chosen game.
+ReadyLabel2a=By installing, you agree to allow QModManager to send external web requests, most often to check for updates. You can disable this option at any time in the Mods tab of the Subnautica options menu.
+ExitSetupMessage=Setup is not complete. If you exit now, {#Name} will not be installed.%nExit Setup?
+WizardSelectComponents=Review Install
+SelectComponentsDesc=
+SelectComponentsLabel2=
+
+[Types]
+; Used to disable the three Full, Compact and Custom types
+Name: "select"; Description: "QModManager"; Flags: IsCustom;
+
+[Components]
+Name: "qmm"; Description: "QModManager"; Flags: fixed; Types: select;
+Name: "qmm\bz"; Description: "Install for Below Zero"; Flags: exclusive fixed;
+
+[Tasks]
+Name: "cleanup"; Description: "(Recommended) Clean up after previous Nitrox and QMM installs";
+
+[Code]
+// Import stuff from InstallerExtensions.dll
+function PathsEqual(pathone, pathtwo: WideString): Boolean; external 'PathsEqual@files:InstallerExtensions.dll stdcall setuponly delayload';
+
+function IsBelowZero(path: String): Boolean;
+begin
+ if (FileExists(path + '\SubnauticaZero.exe')) and (FileExists(path + '\SubnauticaZero_Data\Managed\Assembly-CSharp.dll')) then
+ begin
+ Result := true
+ Exit
+ end
+ else
+ begin
+ Result := false
+ Exit
+ end
+end;
+function IsBelowZeroApp(): Boolean;
+begin
+ Result := IsBelowZero(ExpandConstant('{app}'));
+end;
+
+function GetName(def: string): String;
+begin
+ if (IsBelowZeroApp()) then
+ begin
+ Result := '{#Name} (Below Zero)'
+ end
+ else
+ begin
+ Result := ExpandConstant('{app}')
+ end
+end;
+
+function GetURL(def: string): String;
+begin
+ if (IsBelowZeroApp()) then
+ begin
+ Result := '{#UpdatesURL}/subnauticabelowzero/mods/1'
+ end
+ else
+ begin
+ Result := '{#UpdatesURL}'
+ end
+end;
+
+function CurPageChanged_SelectComponents(CurPageID: Integer): Boolean;
+var
+ Index: Integer;
+ app: String;
+begin
+ if CurPageID = wpSelectComponents then
+ begin
+ try
+ app := ExpandConstant('{app}')
+ except
+ app := 'null'
+ end;
+ if not IsBelowZero(app) then
+ begin
+ WizardForm.SelectComponentsLabel.Caption := 'No game detected in this folder, cannot install'
+ Exit
+ end;
+ Index := WizardForm.ComponentsList.Items.IndexOf('Install for Below Zero')
+ if Index <> -1 then
+ begin
+ if IsBelowZero(app) then
+ begin
+ WizardForm.ComponentsList.Checked[Index] := true
+ WizardForm.SelectComponentsLabel.Caption := 'Install QModManager for Below Zero'
+ end
+ end
+ end
+end;
+
+function GetDir(folder: String; name: String): String;
+var
+I : Integer;
+P : Integer;
+steamInstallPath : String;
+configFile : String;
+fileLines: TArrayOfString;
+begin
+ steamInstallPath := ''
+ RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Valve\Steam', 'InstallPath', steamInstallPath)
+ if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then
+ begin
+ Result := steamInstallPath + '\steamapps\common\' + folder
+ Exit
+ end
+ else
+ begin
+ configFile := steamInstallPath + '\config\config.vdf'
+ if FileExists(configFile) then
+ begin
+ if LoadStringsFromFile(configFile, FileLines) then
+ begin
+ for I := 0 to GetArrayLength(FileLines) - 1 do
+ begin
+ P := Pos('BaseInstallFolder_', FileLines[I])
+ if P > 0 then
+ begin
+ steamInstallPath := Copy(FileLines[I], P + 23, 3) + Copy(FileLines[I], P + 27, Length(FileLines[I]) - P - 27);
+ if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then // If the folder is correct
+ begin
+ Result := steamInstallPath + '\steamapps\common\' + folder
+ Exit
+ end
+ end
+ end
+ end
+ end
+ end;
+ Result := 'none'
+ Exit
+end;
+
+var ACLabel: TLabel;
+var BelowZeroButton: TNewRadioButton;
+
+procedure BelowZeroButtonOnClick(Sender: TObject);
+begin
+ WizardForm.DirEdit.Text := GetDir('SubnauticaZero', 'SubnauticaZero')
+ BelowZeroButton.Checked := true
+end;
+
+function InitializeWizard_AddButtons(): Boolean;
+begin
+ ACLabel := TLabel.Create(WizardForm)
+ with ACLabel do
+ begin
+ Parent := WizardForm
+ Caption := 'Get path from Steam for:'
+ Left := WizardForm.SelectDirLabel.Left / 3
+ Top := WizardForm.BackButton.Top - WizardForm.BackButton.Top / 90
+ end;
+
+ BelowZeroButton := TNewRadioButton.Create(WizardForm)
+ with BelowZeroButton do
+ begin
+ Parent := WizardForm
+ Caption := 'Below Zero'
+ OnClick := @BelowZeroButtonOnClick
+ Left := WizardForm.SelectDirLabel.Left + WizardForm.SelectDirLabel.Left / 30
+ Top := WizardForm.BackButton.Top + 10
+ Height := WizardForm.BackButton.Height
+ Enabled := True
+ end;
+end;
+
+function CurPageChanged_AddButtons(CurPageID: Integer): Boolean;
+begin
+ if CurPageID = wpSelectDir then
+ begin
+ WizardForm.DirEdit.Text := ''
+ if GetDir('SubnauticaZero', 'SubnauticaZero') = 'none' then
+ begin
+ BelowZeroButton.Enabled := false
+ end;
+
+ if BelowZeroButton.Enabled then
+ begin
+ WizardForm.DirEdit.Text := GetDir('SubnauticaZero', 'SubnauticaZero')
+ BelowZeroButton.Checked := true
+ end;
+ end;
+ BelowZeroButton.Visible := CurPageID = wpSelectDir
+ ACLabel.Visible := CurPageID = wpSelectDir
+end;
+
+var DirEditOnChangePrev: TNotifyEvent;
+
+procedure DirEditOnChange(Sender: TObject);
+var
+ S: String;
+begin
+ if Pos('subnauticazero', LowerCase(WizardForm.DirEdit.Text)) <> 0 then
+ begin
+ if PathsEqual(WizardForm.DirEdit.Text, GetDir('SubnauticaZero', 'SubnauticaZero')) then
+ begin
+ BelowZeroButton.Checked := true
+ end
+ else
+ begin
+ BelowZeroButton.Checked := false;
+ end
+ end
+ else
+ begin
+ BelowZeroButton.Checked := false;
+ end;
+
+ if (Pos('://', WizardForm.DirEdit.Text) <> 0) or (Pos(':\\', WizardForm.DirEdit.Text) <> 0) then
+ begin
+ S := WizardForm.DirEdit.Text;
+ StringChangeEx(S, '://', ':/', true);
+ StringChangeEx(S, ':\\', ':\', true);
+ WizardForm.DirEdit.Text := S;
+ end
+end;
+
+function InitializeWizard_DirOnChange(): Boolean;
+begin
+ DirEditOnChangePrev := WizardForm.DirEdit.OnChange
+ WizardForm.DirEdit.OnChange := @DirEditOnChange
+end;
+
+var appIsSet: Boolean;
+
+function GetGUID(def: String): String;
+begin
+ if not appIsSet then // The installer tries to get the GUID at startup to use previous options such as install path or install settings. As QModManager's GUID is defined AFTER the path is selected, it doesn't need to provide a value
+ begin
+ Result := ''
+ Exit
+ end;
+ if IsBelowZero(ExpandConstant('{app}')) then
+ begin
+ Result := '{A535470D-3403-46A2-8D44-28AD4B90C9A3}'
+ Exit
+ end
+end;
+
+function IsAppRunning(const FileName : string): Boolean;
+var
+ FSWbemLocator: Variant;
+ FWMIService : Variant;
+ FWbemObjectSet: Variant;
+begin
+ Result := false;
+ FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
+ FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
+ FWbemObjectSet :=
+ FWMIService.ExecQuery(
+ Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
+ Result := (FWbemObjectSet.Count > 0);
+ FWbemObjectSet := Unassigned;
+ FWMIService := Unassigned;
+ FSWbemLocator := Unassigned;
+end;
+
+// Imports some stuff from VclStylesInno.dll
+procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
+procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';
+
+// Check for .NET version -- code from http://www.kynosarges.de/DotNetVersion.html
+function IsDotNetDetected(version: string; service: cardinal): boolean;
+// Indicates whether the specified version and service pack of the .NET Framework is installed.
+//
+// version -- Specify one of these strings for the required .NET Framework version:
+// 'v1.1' .NET Framework 1.1
+// 'v2.0' .NET Framework 2.0
+// 'v3.0' .NET Framework 3.0
+// 'v3.5' .NET Framework 3.5
+// 'v4\Client' .NET Framework 4.0 Client Profile
+// 'v4\Full' .NET Framework 4.0 Full Installation
+// 'v4.5' .NET Framework 4.5
+// 'v4.5.1' .NET Framework 4.5.1
+// 'v4.5.2' .NET Framework 4.5.2
+// 'v4.6' .NET Framework 4.6
+// 'v4.6.1' .NET Framework 4.6.1
+// 'v4.6.2' .NET Framework 4.6.2
+// 'v4.7' .NET Framework 4.7
+//
+// service -- Specify any non-negative integer for the required service pack level:
+// 0 No service packs required
+// 1, 2, etc. Service pack 1, 2, etc. required
+var
+ key, versionKey: string;
+ install, release, serviceCount, versionRelease: cardinal;
+ success: boolean;
+begin
+ versionKey := version;
+ versionRelease := 0;
+
+ // .NET 1.1 and 2.0 embed release number in version key
+ if version = 'v1.1' then begin
+ versionKey := 'v1.1.4322';
+ end else if version = 'v2.0' then begin
+ versionKey := 'v2.0.50727';
+ end
+
+ // .NET 4.5 and newer install as update to .NET 4.0 Full
+ else if Pos('v4.', version) = 1 then begin
+ versionKey := 'v4\Full';
+ case version of
+ 'v4.5': versionRelease := 378389;
+ 'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
+ 'v4.5.2': versionRelease := 379893;
+ 'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older
+ 'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update
+ 'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update
+ 'v4.7': versionRelease := 460798; // 460805 before Win10 Creators Update
+ end;
+ end;
+
+ // installation key group for all .NET versions
+ key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
+
+ // .NET 3.0 uses value InstallSuccess in subkey Setup
+ if Pos('v3.0', version) = 1 then begin
+ success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
+ end else begin
+ success := RegQueryDWordValue(HKLM, key, 'Install', install);
+ end;
+
+ // .NET 4.0 and newer use value Servicing instead of SP
+ if Pos('v4', version) = 1 then begin
+ success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
+ end else begin
+ success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
+ end;
+
+ // .NET 4.5 and newer use additional value Release
+ if versionRelease > 0 then begin
+ success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
+ success := success and (release >= versionRelease);
+ end;
+
+ result := success and (install = 1) and (serviceCount >= service);
+end;
+
+function InitializeSetup(): Boolean;
+var
+ ErrCode: Integer;
+begin
+ if not IsDotNetDetected('v4\Full', 0) then
+ begin
+ if MsgBox('QModManager requires Microsoft .NET Framework 4.0' + #13#10 + 'Would you like to install it now?', mbCriticalError, MB_YESNO) = IDYES then
+ begin
+ if not ShellExec('open', 'https://dotnet.microsoft.com/download/dotnet-framework/net40', '', '', SW_SHOW, ewNoWait, ErrCode) then
+ begin
+ SysErrorMessage(ErrCode);
+ end
+ end;
+ result := false;
+ Exit
+ end;
+ appIsSet := false
+ if IsAppRunning('SubnauticaZero.exe') then
+ begin
+ MsgBox('You need to close Below Zero before installing QModManager.' + #13#10 + 'If the game is not running, please reboot your computer.', mbError, MB_OK);
+ Result := false
+ end
+ else
+ begin
+ // Load skin
+ ExtractTemporaryFile('Carbon.vsf');
+ LoadVCLStyle(ExpandConstant('{tmp}\Carbon.vsf'));
+ Result := true
+ end
+end;
+
+function IsPreviousVersionInstalled: Boolean;
+var
+ uninstallRegKey: String;
+ previousVersion: String;
+begin
+ uninstallRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetGuid('') + '_is1';
+ previousVersion := '';
+ Result := (RegKeyExists(HKLM, uninstallRegKey) or RegKeyExists(HKCU, uninstallRegKey));
+end;
+
+function GetUninstallString: string;
+var
+ uninstallRegKey: String;
+ uninstallString: String;
+begin
+ Result := '';
+ uninstallRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetGuid('') + '_is1';
+ uninstallString := '';
+ if not RegQueryStringValue(HKLM, uninstallRegKey, 'UninstallString', uninstallString) then
+ RegQueryStringValue(HKCU, uninstallRegKey, 'UninstallString', uninstallString);
+ Result := uninstallString;
+end;
+
+function IsUpgrade: Boolean;
+begin
+ Result := (GetUninstallString() <> '');
+end;
+
+function NextButtonClick(CurPageID: Integer): Boolean;
+var
+ uninstallString: String;
+ resultCode: Integer;
+begin
+ if CurPageID = wpSelectComponents then
+ appIsSet := true;
+
+ Result := true;
+end;
+
+function PrepareToInstall(var NeedsRestart: boolean): string;
+var
+ uninstallString: string;
+ resultCode: integer;
+begin
+ NeedsRestart := false;
+
+ if IsPreviousVersionInstalled() then
+ begin
+ uninstallString := RemoveQuotes(GetUninstallString());
+ if FileExists(uninstallString) then
+ begin
+ Exec(uninstallString, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, resultCode);
+ if IsPreviousVersionInstalled() then
+ Result := 'Previous installation must be uninstalled to continue.';
+ end;
+ end;
+end;
+
+var TypesComboOnChangePrev: TNotifyEvent;
+
+procedure ComponentsListCheckChanges;
+begin
+ WizardForm.NextButton.Enabled := (WizardSelectedComponents(false) <> '')
+end;
+
+procedure ComponentsListClickCheck(Sender: TObject);
+begin
+ ComponentsListCheckChanges
+end;
+
+procedure TypesComboOnChange(Sender: TObject);
+begin
+ TypesComboOnChangePrev(Sender)
+ ComponentsListCheckChanges
+end;
+
+procedure CurPageChanged(CurPageID: Integer);
+begin
+ CurPageChanged_SelectComponents(CurPageID)
+ CurPageChanged_AddButtons(CurPageID)
+ if CurPageID = wpSelectComponents then
+ begin
+ ComponentsListCheckChanges;
+ end
+end;
+
+procedure InitializeWizard();
+begin
+ WizardForm.ComponentsList.OnClickCheck := @ComponentsListClickCheck
+ TypesComboOnChangePrev := WizardForm.TypesCombo.OnChange
+ WizardForm.TypesCombo.OnChange := @TypesComboOnChange
+ InitializeWizard_AddButtons
+ InitializeWizard_DirOnChange
+end;
+
+procedure UnloadInstallerExtensions();
+ var
+ FilePath: string;
+ BatchPath: string;
+ S: TArrayOfString;
+ ResultCode: Integer;
+begin
+ FilePath := ExpandConstant('{tmp}\InstallerExtensions.dll');
+ if not FileExists(FilePath) then
+ begin
+ Log(Format('File %s does not exist', [FilePath]));
+ end
+ else
+ begin
+ BatchPath :=
+ ExpandConstant('{%TEMP}\') +
+ 'delete_' + ExtractFileName(ExpandConstant('{tmp}')) + '.bat';
+ SetArrayLength(S, 7);
+ S[0] := ':loop';
+ S[1] := 'del "' + FilePath + '"';
+ S[2] := 'if not exist "' + FilePath + '" goto end';
+ S[3] := 'goto loop';
+ S[4] := ':end';
+ S[5] := 'rd "' + ExpandConstant('{tmp}') + '"';
+ S[6] := 'del "' + BatchPath + '"';
+ if not SaveStringsToFile(BatchPath, S, False) then
+ begin
+ Log(Format('Error creating batch file %s to delete %s', [BatchPath, FilePath]));
+ end
+ else
+ if not Exec(BatchPath, '', '', SW_HIDE, ewNoWait, ResultCode) then
+ begin
+ Log(Format('Error executing batch file %s to delete %s', [BatchPath, FilePath]));
+ end
+ else
+ begin
+ Log(Format('Executed batch file %s to delete %s', [BatchPath, FilePath]));
+ end;
+ end;
+end;
+
+procedure DeinitializeSetup();
+begin
+ // Unload skin
+ UnLoadVCLStyles;
+ UnloadInstallerExtensions;
+end;
diff --git a/Installer/InstallerExtensions.csproj b/Installer/InstallerExtensions.csproj
index c978af03..5042885a 100644
--- a/Installer/InstallerExtensions.csproj
+++ b/Installer/InstallerExtensions.csproj
@@ -13,61 +13,41 @@
512
true
-
- true
- full
- false
- ..\Build\
- DEBUG;TRACE
- prompt
- 4
- x86
-
-
- pdbonly
+
+ ..\Build\$(Configuration)\
+ SUBNAUTICA;SUBNAUTICA_STABLE
true
- ..\Build\
- TRACE
- prompt
- 4
- x86
-
-
- true
- ..\Build\
- DEBUG;TRACE
- full
+ none
x86
+ 7.3
prompt
- MinimumRecommendedRules.ruleset
-
- ..\Build\
- TRACE
+
+ ..\Build\$(Configuration)\
+ SUBNAUTICA;SUBNAUTICA_EXP
true
- pdbonly
+ none
x86
+ 7.3
prompt
- MinimumRecommendedRules.ruleset
-
- true
- ..\Build\
- DEBUG;TRACE
- full
+
+ ..\Build\$(Configuration)\
+ BELOWZERO;BELOWZERO_STABLE
+ true
+ none
x86
+ 7.3
prompt
- MinimumRecommendedRules.ruleset
- latest
-
- ..\Build\
- TRACE
+
+ ..\Build\$(Configuration)\
+ BELOWZERO;BELOWZERO_EXP
true
- pdbonly
+ none
x86
+ 7.3
prompt
- MinimumRecommendedRules.ruleset
@@ -83,6 +63,16 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Installer/Properties/AssemblyInfo.cs b/Installer/Properties/AssemblyInfo.cs
index 5016fb20..f7cc9bfd 100644
--- a/Installer/Properties/AssemblyInfo.cs
+++ b/Installer/Properties/AssemblyInfo.cs
@@ -14,5 +14,5 @@
[assembly: Guid("8c6c9a0b-80c4-43d2-89f2-749e6f09fdda")]
-[assembly: AssemblyVersion("4.0.2.6")]
-[assembly: AssemblyFileVersion("4.0.2.6")]
+[assembly: AssemblyVersion("4.1.2")]
+[assembly: AssemblyFileVersion("4.1.2")]
diff --git a/Installer/SN.EXP.iss b/Installer/SN.EXP.iss
new file mode 100644
index 00000000..511307c6
--- /dev/null
+++ b/Installer/SN.EXP.iss
@@ -0,0 +1,607 @@
+; Throws an error if the version used to compile this script is not unicode
+; This ensures that the application is built correctly
+#if !Defined(UNICODE)
+ #error A unicode version of Inno Setup is required to compile this script
+#endif
+
+#define Name "QModManager" ; The name of the game will be added after it
+#define Version "4.1.2"
+#define Author "QModManager"
+#define URL "https://github.com/QModManager/QModManager"
+#define SupportURL "https://discord.gg/UpWuWwq"
+#define UpdatesURL "https://nexusmods.com" ; The link to the mod will be added after it
+
+[Setup]
+AllowNetworkDrive=no
+AllowUNCPath=no
+AlwaysShowDirOnReadyPage=yes
+AppendDefaultDirName=no
+AppId={code:GetGUID}
+AppName={#Name}
+AppPublisher={#Author}
+AppPublisherURL={#URL}
+AppSupportURL={#SupportURL}
+AppUpdatesURL={code:GetURL}
+AppVerName={#Name} {#Version}
+AppVersion={#Version}
+Compression=lzma
+DefaultDirName=.
+DirExistsWarning=no
+DisableDirPage=no
+DisableProgramGroupPage=yes
+DisableWelcomePage=no
+EnableDirDoesntExistWarning=yes
+OutputBaseFilename=QModManager_{#Version}_Subnautica_Experimental_Setup
+OutputDir=.\
+PrivilegesRequired=admin
+SetupIconFile=..\..\Assets\Icon.ico
+SolidCompression=yes
+UninstallDisplayIcon={app}\BepInEx\patchers\QModManager\QModManager.exe
+UninstallDisplayName={code:GetName}
+UsePreviousAppDir=no
+UsePreviousLanguage=no
+WizardImageFile=..\..\Assets\InstallerImage.bmp
+WizardSmallImageFile=..\..\Assets\InstallerSmallImage.bmp
+UsePreviousSetupType=False
+UsePreviousTasks=False
+CloseApplications=False
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Files]
+; Files used by the installer but not required by QModManager itself
+; Installer theme
+Source: "..\..\Dependencies\VclStylesinno.dll"; Flags: DontCopy
+Source: "..\..\Dependencies\Carbon.vsf"; Flags: DontCopy
+; Installer extensions
+Source: "InstallerExtensions.dll"; Flags: DontCopy
+
+; Files required by QModManager itself
+; Dependencies
+Source: "..\..\packages\AssetsTools.NET.2.0.3\lib\net35\AssetsTools.NET.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\cldb.dat"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\Oculus.Newtonsoft.Json.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; QMM
+Source: "QModInstaller.dll"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModInstaller.xml"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModManager.exe"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx patchers
+Source: "QModManager.OculusNewtonsoftRedirect.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.QModPluginGenerator.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.xml"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx
+Source: "..\..\Dependencies\BepInEx\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs replacesameversion sharedfile uninsnosharedfileprompt;
+
+[Dirs]
+Name: "{app}\QMods"
+
+[Run]
+Filename: "{app}\BepInEx\patchers\QModManager\QModManager.exe"; Parameters: "-c"; Tasks: cleanup
+
+[UninstallRun]
+Filename: "{app}\BepInEx\patchers\QModManager\QModManager.exe"; Parameters: "-u";
+
+[Messages]
+; BeveledLabel={#Name} {#Version}
+WizardSelectDir=Select install location
+SelectDirLabel3=Please select the install folder of the game.
+SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.%nIf you have the game on steam, you can also use the buttons on the bottom left to auto-complete the install path for the chosen game.
+ReadyLabel2a=By installing, you agree to allow QModManager to send external web requests, most often to check for updates. You can disable this option at any time in the Mods tab of the Subnautica options menu.
+ExitSetupMessage=Setup is not complete. If you exit now, {#Name} will not be installed.%nExit Setup?
+WizardSelectComponents=Review Install
+SelectComponentsDesc=
+SelectComponentsLabel2=
+
+[Types]
+; Used to disable the three Full, Compact and Custom types
+Name: "select"; Description: "QModManager"; Flags: IsCustom;
+
+[Components]
+Name: "qmm"; Description: "QModManager"; Flags: fixed; Types: select;
+Name: "qmm\sn"; Description: "Install for Subnautica"; Flags: exclusive fixed;
+
+[Tasks]
+Name: "cleanup"; Description: "(Recommended) Clean up after previous Nitrox and QMM installs";
+
+[Code]
+// Import stuff from InstallerExtensions.dll
+function PathsEqual(pathone, pathtwo: WideString): Boolean; external 'PathsEqual@files:InstallerExtensions.dll stdcall setuponly delayload';
+
+function IsSubnautica(path: String): Boolean;
+begin
+ if (FileExists(path + '\Subnautica.exe')) and (FileExists(path + '\Subnautica_Data\Managed\Assembly-CSharp.dll')) then
+ begin
+ Result := true
+ Exit
+ end
+ else
+ begin
+ Result := false
+ Exit
+ end
+end;
+function IsSubnauticaApp(): Boolean;
+begin
+ Result := IsSubnautica(ExpandConstant('{app}'));
+end;
+
+function GetName(def: string): String;
+begin
+ if (IsSubnauticaApp()) then
+ begin
+ Result := '{#Name} (Subnautica)'
+ end
+ else
+ begin
+ Result := ExpandConstant('{app}')
+ end
+end;
+
+function GetURL(def: string): String;
+begin
+ if (IsSubnauticaApp()) then
+ begin
+ Result := '{#UpdatesURL}/subnautica/mods/201'
+ end
+ else
+ begin
+ Result := '{#UpdatesURL}'
+ end
+end;
+
+function CurPageChanged_SelectComponents(CurPageID: Integer): Boolean;
+var
+ Index: Integer;
+ app: String;
+begin
+ if CurPageID = wpSelectComponents then
+ begin
+ try
+ app := ExpandConstant('{app}')
+ except
+ app := 'null'
+ end;
+ if not IsSubnautica(app) then
+ begin
+ WizardForm.SelectComponentsLabel.Caption := 'Game not detected in this folder, cannot install'
+ Exit
+ end;
+ Index := WizardForm.ComponentsList.Items.IndexOf('Install for Subnautica')
+ if Index <> -1 then
+ begin
+ if IsSubnautica(app) then
+ begin
+ WizardForm.ComponentsList.Checked[Index] := true
+ WizardForm.SelectComponentsLabel.Caption := 'Install QModManager for Subnautica'
+ end
+ end;
+ end
+end;
+
+function GetDir(folder: String; name: String): String;
+var
+I : Integer;
+P : Integer;
+steamInstallPath : String;
+configFile : String;
+fileLines: TArrayOfString;
+begin
+ steamInstallPath := ''
+ RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Valve\Steam', 'InstallPath', steamInstallPath)
+ if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then
+ begin
+ Result := steamInstallPath + '\steamapps\common\' + folder
+ Exit
+ end
+ else
+ begin
+ configFile := steamInstallPath + '\config\config.vdf'
+ if FileExists(configFile) then
+ begin
+ if LoadStringsFromFile(configFile, FileLines) then
+ begin
+ for I := 0 to GetArrayLength(FileLines) - 1 do
+ begin
+ P := Pos('BaseInstallFolder_', FileLines[I])
+ if P > 0 then
+ begin
+ steamInstallPath := Copy(FileLines[I], P + 23, 3) + Copy(FileLines[I], P + 27, Length(FileLines[I]) - P - 27);
+ if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then // If the folder is correct
+ begin
+ Result := steamInstallPath + '\steamapps\common\' + folder
+ Exit
+ end
+ end
+ end
+ end
+ end
+ end;
+ Result := 'none'
+ Exit
+end;
+
+var ACLabel: TLabel;
+var SubnauticaButton: TNewRadioButton;
+
+procedure SubnauticaButtonOnClick(Sender: TObject);
+begin
+ WizardForm.DirEdit.Text := GetDir('Subnautica', 'Subnautica')
+ SubnauticaButton.Checked := true
+end;
+
+function InitializeWizard_AddButtons(): Boolean;
+begin
+ ACLabel := TLabel.Create(WizardForm)
+ with ACLabel do
+ begin
+ Parent := WizardForm
+ Caption := 'Get path from Steam for:'
+ Left := WizardForm.SelectDirLabel.Left / 3
+ Top := WizardForm.BackButton.Top - WizardForm.BackButton.Top / 90
+ end;
+
+ SubnauticaButton := TNewRadioButton.Create(WizardForm)
+ with SubnauticaButton do
+ begin
+ Parent := WizardForm
+ Caption := 'Subnautica'
+ OnClick := @SubnauticaButtonOnClick
+ Left := WizardForm.SelectDirLabel.Left + WizardForm.SelectDirLabel.Left / 30
+ Top := WizardForm.BackButton.Top + 10
+ Height := WizardForm.BackButton.Height
+ Enabled := True
+ end;
+
+end;
+
+function CurPageChanged_AddButtons(CurPageID: Integer): Boolean;
+begin
+ if CurPageID = wpSelectDir then
+ begin
+ WizardForm.DirEdit.Text := ''
+ if GetDir('Subnautica', 'Subnautica') = 'none' then
+ begin
+ SubnauticaButton.Enabled := false
+ end;
+
+ if SubnauticaButton.Enabled then
+ begin
+ WizardForm.DirEdit.Text := GetDir('Subnautica', 'Subnautica')
+ SubnauticaButton.Checked := true
+ end
+
+ end;
+ SubnauticaButton.Visible := CurPageID = wpSelectDir
+ ACLabel.Visible := CurPageID = wpSelectDir
+end;
+
+var DirEditOnChangePrev: TNotifyEvent;
+
+procedure DirEditOnChange(Sender: TObject);
+var
+ S: String;
+begin
+ if Pos('subnautica', LowerCase(WizardForm.DirEdit.Text)) <> 0 then
+ begin
+ if PathsEqual(WizardForm.DirEdit.Text, GetDir('Subnautica', 'Subnautica')) then
+ begin
+ SubnauticaButton.Checked := true
+ end
+ else
+ begin
+ SubnauticaButton.Checked := false;
+ end
+ end
+ else
+ begin
+ SubnauticaButton.Checked := false;
+ end;
+
+ if (Pos('://', WizardForm.DirEdit.Text) <> 0) or (Pos(':\\', WizardForm.DirEdit.Text) <> 0) then
+ begin
+ S := WizardForm.DirEdit.Text;
+ StringChangeEx(S, '://', ':/', true);
+ StringChangeEx(S, ':\\', ':\', true);
+ WizardForm.DirEdit.Text := S;
+ end
+end;
+
+function InitializeWizard_DirOnChange(): Boolean;
+begin
+ DirEditOnChangePrev := WizardForm.DirEdit.OnChange
+ WizardForm.DirEdit.OnChange := @DirEditOnChange
+end;
+
+var appIsSet: Boolean;
+
+function GetGUID(def: String): String;
+begin
+ if not appIsSet then // The installer tries to get the GUID at startup to use previous options such as install path or install settings. As QModManager's GUID is defined AFTER the path is selected, it doesn't need to provide a value
+ begin
+ Result := ''
+ Exit
+ end;
+ if IsSubnautica(ExpandConstant('{app}')) then
+ begin
+ Result := '{52CC87AA-645D-40FB-8411-510142191678}'
+ Exit
+ end;
+end;
+
+function IsAppRunning(const FileName : string): Boolean;
+var
+ FSWbemLocator: Variant;
+ FWMIService : Variant;
+ FWbemObjectSet: Variant;
+begin
+ Result := false;
+ FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
+ FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
+ FWbemObjectSet :=
+ FWMIService.ExecQuery(
+ Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
+ Result := (FWbemObjectSet.Count > 0);
+ FWbemObjectSet := Unassigned;
+ FWMIService := Unassigned;
+ FSWbemLocator := Unassigned;
+end;
+
+// Imports some stuff from VclStylesInno.dll
+procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
+procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';
+
+// Check for .NET version -- code from http://www.kynosarges.de/DotNetVersion.html
+function IsDotNetDetected(version: string; service: cardinal): boolean;
+// Indicates whether the specified version and service pack of the .NET Framework is installed.
+//
+// version -- Specify one of these strings for the required .NET Framework version:
+// 'v1.1' .NET Framework 1.1
+// 'v2.0' .NET Framework 2.0
+// 'v3.0' .NET Framework 3.0
+// 'v3.5' .NET Framework 3.5
+// 'v4\Client' .NET Framework 4.0 Client Profile
+// 'v4\Full' .NET Framework 4.0 Full Installation
+// 'v4.5' .NET Framework 4.5
+// 'v4.5.1' .NET Framework 4.5.1
+// 'v4.5.2' .NET Framework 4.5.2
+// 'v4.6' .NET Framework 4.6
+// 'v4.6.1' .NET Framework 4.6.1
+// 'v4.6.2' .NET Framework 4.6.2
+// 'v4.7' .NET Framework 4.7
+//
+// service -- Specify any non-negative integer for the required service pack level:
+// 0 No service packs required
+// 1, 2, etc. Service pack 1, 2, etc. required
+var
+ key, versionKey: string;
+ install, release, serviceCount, versionRelease: cardinal;
+ success: boolean;
+begin
+ versionKey := version;
+ versionRelease := 0;
+
+ // .NET 1.1 and 2.0 embed release number in version key
+ if version = 'v1.1' then begin
+ versionKey := 'v1.1.4322';
+ end else if version = 'v2.0' then begin
+ versionKey := 'v2.0.50727';
+ end
+
+ // .NET 4.5 and newer install as update to .NET 4.0 Full
+ else if Pos('v4.', version) = 1 then begin
+ versionKey := 'v4\Full';
+ case version of
+ 'v4.5': versionRelease := 378389;
+ 'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
+ 'v4.5.2': versionRelease := 379893;
+ 'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older
+ 'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update
+ 'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update
+ 'v4.7': versionRelease := 460798; // 460805 before Win10 Creators Update
+ end;
+ end;
+
+ // installation key group for all .NET versions
+ key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
+
+ // .NET 3.0 uses value InstallSuccess in subkey Setup
+ if Pos('v3.0', version) = 1 then begin
+ success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
+ end else begin
+ success := RegQueryDWordValue(HKLM, key, 'Install', install);
+ end;
+
+ // .NET 4.0 and newer use value Servicing instead of SP
+ if Pos('v4', version) = 1 then begin
+ success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
+ end else begin
+ success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
+ end;
+
+ // .NET 4.5 and newer use additional value Release
+ if versionRelease > 0 then begin
+ success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
+ success := success and (release >= versionRelease);
+ end;
+
+ result := success and (install = 1) and (serviceCount >= service);
+end;
+
+function InitializeSetup(): Boolean;
+var
+ ErrCode: Integer;
+begin
+ if not IsDotNetDetected('v4\Full', 0) then
+ begin
+ if MsgBox('QModManager requires Microsoft .NET Framework 4.0' + #13#10 + 'Would you like to install it now?', mbCriticalError, MB_YESNO) = IDYES then
+ begin
+ if not ShellExec('open', 'https://dotnet.microsoft.com/download/dotnet-framework/net40', '', '', SW_SHOW, ewNoWait, ErrCode) then
+ begin
+ SysErrorMessage(ErrCode);
+ end
+ end;
+ result := false;
+ Exit
+ end;
+ appIsSet := false
+ if IsAppRunning('Subnautica.exe') then
+ begin
+ MsgBox('You need to close Subnautica before installing QModManager.' + #13#10 + 'If the game is not running, please reboot your computer.', mbError, MB_OK);
+ Result := false
+ end
+ else
+ begin
+ // Load skin
+ ExtractTemporaryFile('Carbon.vsf');
+ LoadVCLStyle(ExpandConstant('{tmp}\Carbon.vsf'));
+ Result := true
+ end
+end;
+
+function IsPreviousVersionInstalled: Boolean;
+var
+ uninstallRegKey: String;
+ previousVersion: String;
+begin
+ uninstallRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetGuid('') + '_is1';
+ previousVersion := '';
+ Result := (RegKeyExists(HKLM, uninstallRegKey) or RegKeyExists(HKCU, uninstallRegKey));
+end;
+
+function GetUninstallString: string;
+var
+ uninstallRegKey: String;
+ uninstallString: String;
+begin
+ Result := '';
+ uninstallRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetGuid('') + '_is1';
+ uninstallString := '';
+ if not RegQueryStringValue(HKLM, uninstallRegKey, 'UninstallString', uninstallString) then
+ RegQueryStringValue(HKCU, uninstallRegKey, 'UninstallString', uninstallString);
+ Result := uninstallString;
+end;
+
+function IsUpgrade: Boolean;
+begin
+ Result := (GetUninstallString() <> '');
+end;
+
+function NextButtonClick(CurPageID: Integer): Boolean;
+var
+ uninstallString: String;
+ resultCode: Integer;
+begin
+ if CurPageID = wpSelectComponents then
+ appIsSet := true;
+
+ Result := true;
+end;
+
+function PrepareToInstall(var NeedsRestart: boolean): string;
+var
+ uninstallString: string;
+ resultCode: integer;
+begin
+ NeedsRestart := false;
+
+ if IsPreviousVersionInstalled() then
+ begin
+ uninstallString := RemoveQuotes(GetUninstallString());
+ if FileExists(uninstallString) then
+ begin
+ Exec(uninstallString, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, resultCode);
+ if IsPreviousVersionInstalled() then
+ Result := 'Previous installation must be uninstalled to continue.';
+ end;
+ end;
+end;
+
+var TypesComboOnChangePrev: TNotifyEvent;
+
+procedure ComponentsListCheckChanges;
+begin
+ WizardForm.NextButton.Enabled := (WizardSelectedComponents(false) <> '')
+end;
+
+procedure ComponentsListClickCheck(Sender: TObject);
+begin
+ ComponentsListCheckChanges
+end;
+
+procedure TypesComboOnChange(Sender: TObject);
+begin
+ TypesComboOnChangePrev(Sender)
+ ComponentsListCheckChanges
+end;
+
+procedure CurPageChanged(CurPageID: Integer);
+begin
+ CurPageChanged_SelectComponents(CurPageID)
+ CurPageChanged_AddButtons(CurPageID)
+ if CurPageID = wpSelectComponents then
+ begin
+ ComponentsListCheckChanges;
+ end
+end;
+
+procedure InitializeWizard();
+begin
+ WizardForm.ComponentsList.OnClickCheck := @ComponentsListClickCheck
+ TypesComboOnChangePrev := WizardForm.TypesCombo.OnChange
+ WizardForm.TypesCombo.OnChange := @TypesComboOnChange
+ InitializeWizard_AddButtons
+ InitializeWizard_DirOnChange
+end;
+
+procedure UnloadInstallerExtensions();
+ var
+ FilePath: string;
+ BatchPath: string;
+ S: TArrayOfString;
+ ResultCode: Integer;
+begin
+ FilePath := ExpandConstant('{tmp}\InstallerExtensions.dll');
+ if not FileExists(FilePath) then
+ begin
+ Log(Format('File %s does not exist', [FilePath]));
+ end
+ else
+ begin
+ BatchPath :=
+ ExpandConstant('{%TEMP}\') +
+ 'delete_' + ExtractFileName(ExpandConstant('{tmp}')) + '.bat';
+ SetArrayLength(S, 7);
+ S[0] := ':loop';
+ S[1] := 'del "' + FilePath + '"';
+ S[2] := 'if not exist "' + FilePath + '" goto end';
+ S[3] := 'goto loop';
+ S[4] := ':end';
+ S[5] := 'rd "' + ExpandConstant('{tmp}') + '"';
+ S[6] := 'del "' + BatchPath + '"';
+ if not SaveStringsToFile(BatchPath, S, False) then
+ begin
+ Log(Format('Error creating batch file %s to delete %s', [BatchPath, FilePath]));
+ end
+ else
+ if not Exec(BatchPath, '', '', SW_HIDE, ewNoWait, ResultCode) then
+ begin
+ Log(Format('Error executing batch file %s to delete %s', [BatchPath, FilePath]));
+ end
+ else
+ begin
+ Log(Format('Executed batch file %s to delete %s', [BatchPath, FilePath]));
+ end;
+ end;
+end;
+
+procedure DeinitializeSetup();
+begin
+ // Unload skin
+ UnLoadVCLStyles;
+ UnloadInstallerExtensions;
+end;
diff --git a/Installer/SN.STABLE.iss b/Installer/SN.STABLE.iss
new file mode 100644
index 00000000..c4e33c83
--- /dev/null
+++ b/Installer/SN.STABLE.iss
@@ -0,0 +1,605 @@
+; Throws an error if the version used to compile this script is not unicode
+; This ensures that the application is built correctly
+#if !Defined(UNICODE)
+ #error A unicode version of Inno Setup is required to compile this script
+#endif
+
+#define Name "QModManager" ; The name of the game will be added after it
+#define Version "4.1.2"
+#define Author "QModManager"
+#define URL "https://github.com/QModManager/QModManager"
+#define SupportURL "https://discord.gg/UpWuWwq"
+#define UpdatesURL "https://nexusmods.com" ; The link to the mod will be added after it
+
+[Setup]
+AllowNetworkDrive=no
+AllowUNCPath=no
+AlwaysShowDirOnReadyPage=yes
+AppendDefaultDirName=no
+AppId={code:GetGUID}
+AppName={#Name}
+AppPublisher={#Author}
+AppPublisherURL={#URL}
+AppSupportURL={#SupportURL}
+AppUpdatesURL={code:GetURL}
+AppVerName={#Name} {#Version}
+AppVersion={#Version}
+Compression=lzma
+DefaultDirName=.
+DirExistsWarning=no
+DisableDirPage=no
+DisableProgramGroupPage=yes
+DisableWelcomePage=no
+EnableDirDoesntExistWarning=yes
+OutputBaseFilename=QModManager_{#Version}_Subnautica_Setup
+OutputDir=.\
+PrivilegesRequired=admin
+SetupIconFile=..\..\Assets\Icon.ico
+SolidCompression=yes
+UninstallDisplayIcon={app}\BepInEx\patchers\QModManager\QModManager.exe
+UninstallDisplayName={code:GetName}
+UsePreviousAppDir=no
+UsePreviousLanguage=no
+WizardImageFile=..\..\Assets\InstallerImage.bmp
+WizardSmallImageFile=..\..\Assets\InstallerSmallImage.bmp
+UsePreviousSetupType=False
+UsePreviousTasks=False
+CloseApplications=False
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Files]
+; Files used by the installer but not required by QModManager itself
+; Installer theme
+Source: "..\..\Dependencies\VclStylesinno.dll"; Flags: DontCopy
+Source: "..\..\Dependencies\Carbon.vsf"; Flags: DontCopy
+; Installer extensions
+Source: "InstallerExtensions.dll"; Flags: DontCopy
+
+; Files required by QModManager itself
+; Dependencies
+Source: "..\..\packages\AssetsTools.NET.2.0.3\lib\net35\AssetsTools.NET.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "..\..\Dependencies\cldb.dat"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; QMM
+Source: "QModInstaller.dll"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModInstaller.xml"; DestDir: "{app}\BepInEx\plugins\QModManager"; Flags: ignoreversion;
+Source: "QModManager.exe"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx patchers
+Source: "QModManager.QModPluginGenerator.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.dll"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+Source: "QModManager.UnityAudioFixer.xml"; DestDir: "{app}\BepInEx\patchers\QModManager"; Flags: ignoreversion;
+
+; BepInEx
+Source: "..\..\Dependencies\BepInEx\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs replacesameversion sharedfile uninsnosharedfileprompt;
+
+[Dirs]
+Name: "{app}\QMods"
+
+[Run]
+Filename: "{app}\BepInEx\patchers\QModManager\QModManager.exe"; Parameters: "-c"; Tasks: cleanup
+
+[UninstallRun]
+Filename: "{app}\BepInEx\patchers\QModManager\QModManager.exe"; Parameters: "-u";
+
+[Messages]
+; BeveledLabel={#Name} {#Version}
+WizardSelectDir=Select install location
+SelectDirLabel3=Please select the install folder of the game.
+SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.%nIf you have the game on steam, you can also use the buttons on the bottom left to auto-complete the install path for the chosen game.
+ReadyLabel2a=By installing, you agree to allow QModManager to send external web requests, most often to check for updates. You can disable this option at any time in the Mods tab of the Subnautica options menu.
+ExitSetupMessage=Setup is not complete. If you exit now, {#Name} will not be installed.%nExit Setup?
+WizardSelectComponents=Review Install
+SelectComponentsDesc=
+SelectComponentsLabel2=
+
+[Types]
+; Used to disable the three Full, Compact and Custom types
+Name: "select"; Description: "QModManager"; Flags: IsCustom;
+
+[Components]
+Name: "qmm"; Description: "QModManager"; Flags: fixed; Types: select;
+Name: "qmm\sn"; Description: "Install for Subnautica"; Flags: exclusive fixed;
+
+[Tasks]
+Name: "cleanup"; Description: "(Recommended) Clean up after previous Nitrox and QMM installs";
+
+[Code]
+// Import stuff from InstallerExtensions.dll
+function PathsEqual(pathone, pathtwo: WideString): Boolean; external 'PathsEqual@files:InstallerExtensions.dll stdcall setuponly delayload';
+
+function IsSubnautica(path: String): Boolean;
+begin
+ if (FileExists(path + '\Subnautica.exe')) and (FileExists(path + '\Subnautica_Data\Managed\Assembly-CSharp.dll')) then
+ begin
+ Result := true
+ Exit
+ end
+ else
+ begin
+ Result := false
+ Exit
+ end
+end;
+function IsSubnauticaApp(): Boolean;
+begin
+ Result := IsSubnautica(ExpandConstant('{app}'));
+end;
+
+function GetName(def: string): String;
+begin
+ if (IsSubnauticaApp()) then
+ begin
+ Result := '{#Name} (Subnautica)'
+ end
+ else
+ begin
+ Result := ExpandConstant('{app}')
+ end
+end;
+
+function GetURL(def: string): String;
+begin
+ if (IsSubnauticaApp()) then
+ begin
+ Result := '{#UpdatesURL}/subnautica/mods/201'
+ end
+ else
+ begin
+ Result := '{#UpdatesURL}'
+ end
+end;
+
+function CurPageChanged_SelectComponents(CurPageID: Integer): Boolean;
+var
+ Index: Integer;
+ app: String;
+begin
+ if CurPageID = wpSelectComponents then
+ begin
+ try
+ app := ExpandConstant('{app}')
+ except
+ app := 'null'
+ end;
+ if not IsSubnautica(app) then
+ begin
+ WizardForm.SelectComponentsLabel.Caption := 'Game not detected in this folder, cannot install'
+ Exit
+ end;
+ Index := WizardForm.ComponentsList.Items.IndexOf('Install for Subnautica')
+ if Index <> -1 then
+ begin
+ if IsSubnautica(app) then
+ begin
+ WizardForm.ComponentsList.Checked[Index] := true
+ WizardForm.SelectComponentsLabel.Caption := 'Install QModManager for Subnautica'
+ end
+ end;
+ end
+end;
+
+function GetDir(folder: String; name: String): String;
+var
+I : Integer;
+P : Integer;
+steamInstallPath : String;
+configFile : String;
+fileLines: TArrayOfString;
+begin
+ steamInstallPath := ''
+ RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Valve\Steam', 'InstallPath', steamInstallPath)
+ if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then
+ begin
+ Result := steamInstallPath + '\steamapps\common\' + folder
+ Exit
+ end
+ else
+ begin
+ configFile := steamInstallPath + '\config\config.vdf'
+ if FileExists(configFile) then
+ begin
+ if LoadStringsFromFile(configFile, FileLines) then
+ begin
+ for I := 0 to GetArrayLength(FileLines) - 1 do
+ begin
+ P := Pos('BaseInstallFolder_', FileLines[I])
+ if P > 0 then
+ begin
+ steamInstallPath := Copy(FileLines[I], P + 23, 3) + Copy(FileLines[I], P + 27, Length(FileLines[I]) - P - 27);
+ if (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '.exe')) and (FileExists(steamInstallPath + '\steamapps\common\' + folder + '\' + name + '_Data\Managed\Assembly-CSharp.dll')) then // If the folder is correct
+ begin
+ Result := steamInstallPath + '\steamapps\common\' + folder
+ Exit
+ end
+ end
+ end
+ end
+ end
+ end;
+ Result := 'none'
+ Exit
+end;
+
+var ACLabel: TLabel;
+var SubnauticaButton: TNewRadioButton;
+
+procedure SubnauticaButtonOnClick(Sender: TObject);
+begin
+ WizardForm.DirEdit.Text := GetDir('Subnautica', 'Subnautica')
+ SubnauticaButton.Checked := true
+end;
+
+function InitializeWizard_AddButtons(): Boolean;
+begin
+ ACLabel := TLabel.Create(WizardForm)
+ with ACLabel do
+ begin
+ Parent := WizardForm
+ Caption := 'Get path from Steam for:'
+ Left := WizardForm.SelectDirLabel.Left / 3
+ Top := WizardForm.BackButton.Top - WizardForm.BackButton.Top / 90
+ end;
+
+ SubnauticaButton := TNewRadioButton.Create(WizardForm)
+ with SubnauticaButton do
+ begin
+ Parent := WizardForm
+ Caption := 'Subnautica'
+ OnClick := @SubnauticaButtonOnClick
+ Left := WizardForm.SelectDirLabel.Left + WizardForm.SelectDirLabel.Left / 30
+ Top := WizardForm.BackButton.Top + 10
+ Height := WizardForm.BackButton.Height
+ Enabled := True
+ end;
+
+end;
+
+function CurPageChanged_AddButtons(CurPageID: Integer): Boolean;
+begin
+ if CurPageID = wpSelectDir then
+ begin
+ WizardForm.DirEdit.Text := ''
+ if GetDir('Subnautica', 'Subnautica') = 'none' then
+ begin
+ SubnauticaButton.Enabled := false
+ end;
+
+ if SubnauticaButton.Enabled then
+ begin
+ WizardForm.DirEdit.Text := GetDir('Subnautica', 'Subnautica')
+ SubnauticaButton.Checked := true
+ end
+
+ end;
+ SubnauticaButton.Visible := CurPageID = wpSelectDir
+ ACLabel.Visible := CurPageID = wpSelectDir
+end;
+
+var DirEditOnChangePrev: TNotifyEvent;
+
+procedure DirEditOnChange(Sender: TObject);
+var
+ S: String;
+begin
+ if Pos('subnautica', LowerCase(WizardForm.DirEdit.Text)) <> 0 then
+ begin
+ if PathsEqual(WizardForm.DirEdit.Text, GetDir('Subnautica', 'Subnautica')) then
+ begin
+ SubnauticaButton.Checked := true
+ end
+ else
+ begin
+ SubnauticaButton.Checked := false;
+ end
+ end
+ else
+ begin
+ SubnauticaButton.Checked := false;
+ end;
+
+ if (Pos('://', WizardForm.DirEdit.Text) <> 0) or (Pos(':\\', WizardForm.DirEdit.Text) <> 0) then
+ begin
+ S := WizardForm.DirEdit.Text;
+ StringChangeEx(S, '://', ':/', true);
+ StringChangeEx(S, ':\\', ':\', true);
+ WizardForm.DirEdit.Text := S;
+ end
+end;
+
+function InitializeWizard_DirOnChange(): Boolean;
+begin
+ DirEditOnChangePrev := WizardForm.DirEdit.OnChange
+ WizardForm.DirEdit.OnChange := @DirEditOnChange
+end;
+
+var appIsSet: Boolean;
+
+function GetGUID(def: String): String;
+begin
+ if not appIsSet then // The installer tries to get the GUID at startup to use previous options such as install path or install settings. As QModManager's GUID is defined AFTER the path is selected, it doesn't need to provide a value
+ begin
+ Result := ''
+ Exit
+ end;
+ if IsSubnautica(ExpandConstant('{app}')) then
+ begin
+ Result := '{52CC87AA-645D-40FB-8411-510142191678}'
+ Exit
+ end;
+end;
+
+function IsAppRunning(const FileName : string): Boolean;
+var
+ FSWbemLocator: Variant;
+ FWMIService : Variant;
+ FWbemObjectSet: Variant;
+begin
+ Result := false;
+ FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
+ FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
+ FWbemObjectSet :=
+ FWMIService.ExecQuery(
+ Format('SELECT Name FROM Win32_Process Where Name="%s"', [FileName]));
+ Result := (FWbemObjectSet.Count > 0);
+ FWbemObjectSet := Unassigned;
+ FWMIService := Unassigned;
+ FSWbemLocator := Unassigned;
+end;
+
+// Imports some stuff from VclStylesInno.dll
+procedure LoadVCLStyle(VClStyleFile: String); external 'LoadVCLStyleW@files:VclStylesInno.dll stdcall';
+procedure UnLoadVCLStyles; external 'UnLoadVCLStyles@files:VclStylesInno.dll stdcall';
+
+// Check for .NET version -- code from http://www.kynosarges.de/DotNetVersion.html
+function IsDotNetDetected(version: string; service: cardinal): boolean;
+// Indicates whether the specified version and service pack of the .NET Framework is installed.
+//
+// version -- Specify one of these strings for the required .NET Framework version:
+// 'v1.1' .NET Framework 1.1
+// 'v2.0' .NET Framework 2.0
+// 'v3.0' .NET Framework 3.0
+// 'v3.5' .NET Framework 3.5
+// 'v4\Client' .NET Framework 4.0 Client Profile
+// 'v4\Full' .NET Framework 4.0 Full Installation
+// 'v4.5' .NET Framework 4.5
+// 'v4.5.1' .NET Framework 4.5.1
+// 'v4.5.2' .NET Framework 4.5.2
+// 'v4.6' .NET Framework 4.6
+// 'v4.6.1' .NET Framework 4.6.1
+// 'v4.6.2' .NET Framework 4.6.2
+// 'v4.7' .NET Framework 4.7
+//
+// service -- Specify any non-negative integer for the required service pack level:
+// 0 No service packs required
+// 1, 2, etc. Service pack 1, 2, etc. required
+var
+ key, versionKey: string;
+ install, release, serviceCount, versionRelease: cardinal;
+ success: boolean;
+begin
+ versionKey := version;
+ versionRelease := 0;
+
+ // .NET 1.1 and 2.0 embed release number in version key
+ if version = 'v1.1' then begin
+ versionKey := 'v1.1.4322';
+ end else if version = 'v2.0' then begin
+ versionKey := 'v2.0.50727';
+ end
+
+ // .NET 4.5 and newer install as update to .NET 4.0 Full
+ else if Pos('v4.', version) = 1 then begin
+ versionKey := 'v4\Full';
+ case version of
+ 'v4.5': versionRelease := 378389;
+ 'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
+ 'v4.5.2': versionRelease := 379893;
+ 'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older
+ 'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update
+ 'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update
+ 'v4.7': versionRelease := 460798; // 460805 before Win10 Creators Update
+ end;
+ end;
+
+ // installation key group for all .NET versions
+ key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
+
+ // .NET 3.0 uses value InstallSuccess in subkey Setup
+ if Pos('v3.0', version) = 1 then begin
+ success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
+ end else begin
+ success := RegQueryDWordValue(HKLM, key, 'Install', install);
+ end;
+
+ // .NET 4.0 and newer use value Servicing instead of SP
+ if Pos('v4', version) = 1 then begin
+ success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
+ end else begin
+ success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
+ end;
+
+ // .NET 4.5 and newer use additional value Release
+ if versionRelease > 0 then begin
+ success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
+ success := success and (release >= versionRelease);
+ end;
+
+ result := success and (install = 1) and (serviceCount >= service);
+end;
+
+function InitializeSetup(): Boolean;
+var
+ ErrCode: Integer;
+begin
+ if not IsDotNetDetected('v4\Full', 0) then
+ begin
+ if MsgBox('QModManager requires Microsoft .NET Framework 4.0' + #13#10 + 'Would you like to install it now?', mbCriticalError, MB_YESNO) = IDYES then
+ begin
+ if not ShellExec('open', 'https://dotnet.microsoft.com/download/dotnet-framework/net40', '', '', SW_SHOW, ewNoWait, ErrCode) then
+ begin
+ SysErrorMessage(ErrCode);
+ end
+ end;
+ result := false;
+ Exit
+ end;
+ appIsSet := false
+ if IsAppRunning('Subnautica.exe') then
+ begin
+ MsgBox('You need to close Subnautica before installing QModManager.' + #13#10 + 'If the game is not running, please reboot your computer.', mbError, MB_OK);
+ Result := false
+ end
+ else
+ begin
+ // Load skin
+ ExtractTemporaryFile('Carbon.vsf');
+ LoadVCLStyle(ExpandConstant('{tmp}\Carbon.vsf'));
+ Result := true
+ end
+end;
+
+function IsPreviousVersionInstalled: Boolean;
+var
+ uninstallRegKey: String;
+ previousVersion: String;
+begin
+ uninstallRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetGuid('') + '_is1';
+ previousVersion := '';
+ Result := (RegKeyExists(HKLM, uninstallRegKey) or RegKeyExists(HKCU, uninstallRegKey));
+end;
+
+function GetUninstallString: string;
+var
+ uninstallRegKey: String;
+ uninstallString: String;
+begin
+ Result := '';
+ uninstallRegKey := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\' + GetGuid('') + '_is1';
+ uninstallString := '';
+ if not RegQueryStringValue(HKLM, uninstallRegKey, 'UninstallString', uninstallString) then
+ RegQueryStringValue(HKCU, uninstallRegKey, 'UninstallString', uninstallString);
+ Result := uninstallString;
+end;
+
+function IsUpgrade: Boolean;
+begin
+ Result := (GetUninstallString() <> '');
+end;
+
+function NextButtonClick(CurPageID: Integer): Boolean;
+var
+ uninstallString: String;
+ resultCode: Integer;
+begin
+ if CurPageID = wpSelectComponents then
+ appIsSet := true;
+
+ Result := true;
+end;
+
+function PrepareToInstall(var NeedsRestart: boolean): string;
+var
+ uninstallString: string;
+ resultCode: integer;
+begin
+ NeedsRestart := false;
+
+ if IsPreviousVersionInstalled() then
+ begin
+ uninstallString := RemoveQuotes(GetUninstallString());
+ if FileExists(uninstallString) then
+ begin
+ Exec(uninstallString, '/SILENT', '', SW_SHOW, ewWaitUntilTerminated, resultCode);
+ if IsPreviousVersionInstalled() then
+ Result := 'Previous installation must be uninstalled to continue.';
+ end;
+ end;
+end;
+
+var TypesComboOnChangePrev: TNotifyEvent;
+
+procedure ComponentsListCheckChanges;
+begin
+ WizardForm.NextButton.Enabled := (WizardSelectedComponents(false) <> '')
+end;
+
+procedure ComponentsListClickCheck(Sender: TObject);
+begin
+ ComponentsListCheckChanges
+end;
+
+procedure TypesComboOnChange(Sender: TObject);
+begin
+ TypesComboOnChangePrev(Sender)
+ ComponentsListCheckChanges
+end;
+
+procedure CurPageChanged(CurPageID: Integer);
+begin
+ CurPageChanged_SelectComponents(CurPageID)
+ CurPageChanged_AddButtons(CurPageID)
+ if CurPageID = wpSelectComponents then
+ begin
+ ComponentsListCheckChanges;
+ end
+end;
+
+procedure InitializeWizard();
+begin
+ WizardForm.ComponentsList.OnClickCheck := @ComponentsListClickCheck
+ TypesComboOnChangePrev := WizardForm.TypesCombo.OnChange
+ WizardForm.TypesCombo.OnChange := @TypesComboOnChange
+ InitializeWizard_AddButtons
+ InitializeWizard_DirOnChange
+end;
+
+procedure UnloadInstallerExtensions();
+ var
+ FilePath: string;
+ BatchPath: string;
+ S: TArrayOfString;
+ ResultCode: Integer;
+begin
+ FilePath := ExpandConstant('{tmp}\InstallerExtensions.dll');
+ if not FileExists(FilePath) then
+ begin
+ Log(Format('File %s does not exist', [FilePath]));
+ end
+ else
+ begin
+ BatchPath :=
+ ExpandConstant('{%TEMP}\') +
+ 'delete_' + ExtractFileName(ExpandConstant('{tmp}')) + '.bat';
+ SetArrayLength(S, 7);
+ S[0] := ':loop';
+ S[1] := 'del "' + FilePath + '"';
+ S[2] := 'if not exist "' + FilePath + '" goto end';
+ S[3] := 'goto loop';
+ S[4] := ':end';
+ S[5] := 'rd "' + ExpandConstant('{tmp}') + '"';
+ S[6] := 'del "' + BatchPath + '"';
+ if not SaveStringsToFile(BatchPath, S, False) then
+ begin
+ Log(Format('Error creating batch file %s to delete %s', [BatchPath, FilePath]));
+ end
+ else
+ if not Exec(BatchPath, '', '', SW_HIDE, ewNoWait, ResultCode) then
+ begin
+ Log(Format('Error executing batch file %s to delete %s', [BatchPath, FilePath]));
+ end
+ else
+ begin
+ Log(Format('Executed batch file %s to delete %s', [BatchPath, FilePath]));
+ end;
+ end;
+end;
+
+procedure DeinitializeSetup();
+begin
+ // Unload skin
+ UnLoadVCLStyles;
+ UnloadInstallerExtensions;
+end;
diff --git a/OculusNewtonsoftRedirect/OculusNewtonsoftRedirect.cs b/OculusNewtonsoftRedirect/OculusNewtonsoftRedirect.cs
new file mode 100644
index 00000000..23f40c18
--- /dev/null
+++ b/OculusNewtonsoftRedirect/OculusNewtonsoftRedirect.cs
@@ -0,0 +1,47 @@
+using BepInEx;
+using BepInEx.Logging;
+using Mono.Cecil;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace QModManager
+{
+ public static class OculusNewtonsoftRedirect
+ {
+ private static string OculusNewtonsoftJsonPath => Path.Combine(
+ Paths.BepInExRootPath, "patchers", "QModManager", "Oculus.Newtonsoft.Json.dll");
+
+ private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("OculusNewtonsoftRedirect");
+
+ public static IEnumerable TargetDLLs { get; } = new[] { "Newtonsoft.Json.dll" };
+
+ public static void Patch(AssemblyDefinition newtonsoftAssemblyDef)
+ {
+ if (newtonsoftAssemblyDef.MainModule.Types.Any(t => t.Namespace.StartsWith("Oculus")))
+ {
+ Logger.LogInfo("Newtonsoft.Json.dll already uses Oculus.Newtonsoft.Json namespace, skipping shim.");
+ return;
+ }
+
+ var oculusNewtonsoftAssemblyDef = AssemblyDefinition.ReadAssembly(OculusNewtonsoftJsonPath);
+
+ var oculusAssemblyNameRef = new AssemblyNameReference(
+ oculusNewtonsoftAssemblyDef.Name.Name, oculusNewtonsoftAssemblyDef.Name.Version);
+
+ newtonsoftAssemblyDef.MainModule.AssemblyReferences.Add(oculusAssemblyNameRef);
+
+ foreach (var type in oculusNewtonsoftAssemblyDef.MainModule.Types)
+ {
+ if (!type.IsPublic)
+ continue;
+
+ var exportedType = new ExportedType(
+ type.Namespace, type.Name,
+ newtonsoftAssemblyDef.MainModule, oculusAssemblyNameRef);
+
+ newtonsoftAssemblyDef.MainModule.ExportedTypes.Add(exportedType);
+ }
+ }
+ }
+}
diff --git a/QMMLoader/Properties/AssemblyInfo.cs b/OculusNewtonsoftRedirect/Properties/AssemblyInfo.cs
similarity index 77%
rename from QMMLoader/Properties/AssemblyInfo.cs
rename to OculusNewtonsoftRedirect/Properties/AssemblyInfo.cs
index 803817ad..0946c77c 100644
--- a/QMMLoader/Properties/AssemblyInfo.cs
+++ b/OculusNewtonsoftRedirect/Properties/AssemblyInfo.cs
@@ -1,16 +1,15 @@
-using System.Resources;
-using System.Reflection;
+using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("QModManager.QMMLoader")]
+[assembly: AssemblyTitle("QModManager.OculusNewtonsoftRedirect")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Subnautica Modding")]
-[assembly: AssemblyProduct("QModManager.QMMLoader")]
+[assembly: AssemblyProduct("QModManager.OculusNewtonsoftRedirect")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -21,7 +20,7 @@
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("21d282e0-6b3e-4776-ac86-3089f0655893")]
+[assembly: Guid("25558450-ff33-4fdf-91c7-0c5c00a94a57")]
// Version information for an assembly consists of the following four values:
//
@@ -33,6 +32,5 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("4.0.2.6")]
-[assembly: AssemblyFileVersion("4.0.2.6")]
-[assembly: NeutralResourcesLanguage("en")]
+[assembly: AssemblyVersion("4.1.2")]
+[assembly: AssemblyFileVersion("4.1.2")]
diff --git a/OculusNewtonsoftRedirect/QModManager.OculusNewtonsoftRedirect.csproj b/OculusNewtonsoftRedirect/QModManager.OculusNewtonsoftRedirect.csproj
new file mode 100644
index 00000000..a8e9ff54
--- /dev/null
+++ b/OculusNewtonsoftRedirect/QModManager.OculusNewtonsoftRedirect.csproj
@@ -0,0 +1,70 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}
+ Library
+ Properties
+ QModManager
+ QModManager.OculusNewtonsoftRedirect
+ v4.7.2
+ 512
+ true
+
+
+
+ ..\Build\$(Configuration)\
+ SUBNAUTICA;SUBNAUTICA_STABLE
+ true
+ pdbonly
+ AnyCPU
+ 7.3
+ prompt
+
+
+ ..\Build\$(Configuration)\
+ SUBNAUTICA;SUBNAUTICA_EXP
+ true
+ pdbonly
+ AnyCPU
+ 7.3
+ prompt
+
+
+ ..\Build\$(Configuration)\
+ BELOWZERO;BELOWZERO_STABLE
+ true
+ pdbonly
+ AnyCPU
+ 7.3
+ prompt
+
+
+ ..\Build\$(Configuration)\
+ BELOWZERO;BELOWZERO_EXP
+ true
+ pdbonly
+ AnyCPU
+ 7.3
+ prompt
+
+
+
+ ..\Dependencies\BepInEx\BepInEx\core\BepInEx.dll
+ False
+
+
+ ..\Dependencies\BepInEx\BepInEx\core\Mono.Cecil.dll
+ False
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/QMMLoader/QMMLoader.cs b/QMMLoader/QMMLoader.cs
deleted file mode 100644
index 521849c0..00000000
--- a/QMMLoader/QMMLoader.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using BepInEx;
-using BepInEx.Logging;
-using HarmonyLib;
-using QModManager.API.ModLoading;
-using QModManager.Utility;
-using System.Linq;
-using System.Reflection;
-
-namespace QModManager
-{
- ///
- /// QMMLoader - simply fires up the QModManager entry point.
- ///
- [BepInPlugin(PluginGuid, PluginName, PluginVersion)]
- [BepInProcess(SubnauticaProcessName)]
- [BepInProcess(SubnauticaZeroProcessName)]
- public class QMMLoader : BaseUnityPlugin
- {
- internal const string PluginGuid = "QModManager.QMMLoader";
- internal const string PluginName = "QMMLoader";
- internal const string PluginVersion = "1.0";
-
- internal const string SubnauticaProcessName = "Subnautica";
- internal const string SubnauticaZeroProcessName = "SubnauticaZero";
-
- ///
- /// Static singleton instance of QMMLoader
- ///
- public static QMMLoader Main;
-
- internal new ManualLogSource Logger => base.Logger;
-
- private void Awake()
- {
- if (Main == null && this != null)
- {
- Main = this;
- Initialize();
- }
- else
- {
- DestroyImmediate(this);
- }
- }
-
- private static Harmony harmony;
- private static MethodInfo entryPointTarget = AccessTools.Method(typeof(PlatformUtils), nameof(PlatformUtils.PlatformInitAsync));
- private static MethodInfo entryPointPatch = AccessTools.Method(typeof(QMMLoader), nameof(QMMLoader.InitializeQModManager));
- private void Initialize()
- {
- if (harmony == null && Main != null && Main == this)
- {
- harmony = new Harmony("QModManager.QMMLoader");
- harmony.Patch(entryPointTarget, postfix: new HarmonyMethod(entryPointPatch));
- }
- }
-
- private static void InitializeQModManager()
- {
- Patching.Patcher.Patch(); // Run QModManager patch
- InitializeQMods();
- harmony.Unpatch(entryPointTarget, entryPointPatch); // kill this Harmony patch just to be sure it never happens twice
- }
-
- private static void InitializeQMods()
- {
- var modsToLoad = QModPluginGenerator.QModsToLoad.ToList();
-
- var initializer = new Initializer(Patching.Patcher.CurrentlyRunningGame);
- initializer.InitializeMods(modsToLoad);
-
- SummaryLogger.ReportIssues(modsToLoad);
-
- SummaryLogger.LogSummaries(modsToLoad);
- }
- }
-}
diff --git a/QMMLoader/QModManager.QMMLoader.csproj b/QMMLoader/QModManager.QMMLoader.csproj
deleted file mode 100644
index c00b6f54..00000000
--- a/QMMLoader/QModManager.QMMLoader.csproj
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}
- Library
- Properties
- QModManager.QMMLoader
- QModManager.QMMLoader
- v4.0
- 512
- true
-
-
-
- true
- full
- false
- ..\Build\
- DEBUG;TRACE
- prompt
- 4
- false
- false
- ..\Build\QModManager.QMMLoader.xml
-
-
- pdbonly
- true
- ..\Build\
- TRACE
- prompt
- 4
- false
- ..\Build\QModManager.QMMLoader.xml
- false
-
-
- OnBuildSuccess
-
-
-
- ..\Dependencies\BepInEx\BepInEx\core\0Harmony.dll
- False
-
-
- ..\Dependencies\Assembly-CSharp_publicized.dll
- False
-
-
- ..\Dependencies\BepInEx\BepInEx\core\BepInEx.dll
- False
-
-
- ..\Build\QModInstaller.dll
- False
-
-
- False
- ..\Build\QModManager.QModPluginGenerator.dll
- False
-
-
-
- ..\Dependencies\UnityEngine.dll
- False
-
-
- ..\Dependencies\UnityEngine.CoreModule.dll
- False
-
-
-
-
-
-
-
-
-
-
-rmdir "$(SolutionDir)VortexBuild" /q /s
-xcopy "$(SolutionDir)Dependencies\BepInEx" "$(SolutionDir)VortexBuild" /E /H /I /Q /Y
-xcopy "$(SolutionDir)Dependencies\cldb.dat" "$(SolutionDir)VortexBuild\BepInEx\patchers\QModManager\" /I /Q /Y
-
-xcopy "$(SolutionDir)packages\AssetsTools.NET.2.0.3\lib\net35\AssetsTools.NET.dll" "$(SolutionDir)VortexBuild\BepInEx\patchers\QModManager\" /I /Q /Y
-
-
-xcopy "$(TargetDir)QModManager.exe" "$(SolutionDir)VortexBuild\BepInEx\patchers\QModManager\" /I /Q /Y
-xcopy "$(TargetDir)QModManager.QModPluginGenerator.dll" "$(SolutionDir)VortexBuild\BepInEx\patchers\QModManager\" /I /Q /Y
-xcopy "$(TargetDir)QModManager.UnityAudioFixer.dll" "$(SolutionDir)VortexBuild\BepInEx\patchers\QModManager\" /I /Q /Y
-xcopy "$(TargetDir)QModManager.UnityAudioFixer.xml" "$(SolutionDir)VortexBuild\BepInEx\patchers\QModManager\" /I /Q /Y
-
-
-xcopy "$(TargetDir)QModInstaller.dll" "$(SolutionDir)VortexBuild\BepInEx\plugins\QModManager\" /I /Q /Y
-xcopy "$(TargetDir)QModInstaller.xml" "$(SolutionDir)VortexBuild\BepInEx\plugins\QModManager\" /I /Q /Y
-xcopy "$(TargetDir)QModManager.QMMLoader.dll" "$(SolutionDir)VortexBuild\BepInEx\plugins\QModManager\" /I /Q /Y
-xcopy "$(TargetDir)QModManager.QMMLoader.xml" "$(SolutionDir)VortexBuild\BepInEx\plugins\QModManager\" /I /Q /Y
-
-
-
\ No newline at end of file
diff --git a/QModManager.sln b/QModManager.sln
index f5b63e0d..d4623aec 100644
--- a/QModManager.sln
+++ b/QModManager.sln
@@ -10,7 +10,6 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5A8D179E-C749-4346-AD81-05F11C082A1C}"
ProjectSection(SolutionItems) = preProject
Data\latest-version.txt = Data\latest-version.txt
- Installer\QModsInstallerScript.iss = Installer\QModsInstallerScript.iss
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InstallerExtensions", "Installer\InstallerExtensions.csproj", "{92726127-A08F-4843-BF96-4989CE1BF422}"
@@ -20,11 +19,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Executable", "Executable\Ex
{CA99F076-7459-4682-A41D-2850AEE28566} = {CA99F076-7459-4682-A41D-2850AEE28566}
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QModManager.QMMLoader", "QMMLoader\QModManager.QMMLoader.csproj", "{21D282E0-6B3E-4776-AC86-3089F0655893}"
- ProjectSection(ProjectDependencies) = postProject
- {EA496DDF-D775-4E17-9EAE-C570C5F50701} = {EA496DDF-D775-4E17-9EAE-C570C5F50701}
- EndProjectSection
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QModManager.UnityAudioFixer", "UnityAudioFixer\QModManager.UnityAudioFixer.csproj", "{CA99F076-7459-4682-A41D-2850AEE28566}"
ProjectSection(ProjectDependencies) = postProject
{DA63F59D-4676-4726-AFEC-BD9D3682733F} = {DA63F59D-4676-4726-AFEC-BD9D3682733F}
@@ -32,99 +26,200 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QModManager.UnityAudioFixer
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QModManager.QModPluginGenerator", "QModPluginEmulator\QModManager.QModPluginGenerator.csproj", "{EA496DDF-D775-4E17-9EAE-C570C5F50701}"
ProjectSection(ProjectDependencies) = postProject
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E} = {D433A819-73DB-4E6C-AE73-D3DED793BD4E}
+ {92726127-A08F-4843-BF96-4989CE1BF422} = {92726127-A08F-4843-BF96-4989CE1BF422}
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57} = {25558450-FF33-4FDF-91C7-0C5C00A94A57}
+ {CA99F076-7459-4682-A41D-2850AEE28566} = {CA99F076-7459-4682-A41D-2850AEE28566}
{DA63F59D-4676-4726-AFEC-BD9D3682733F} = {DA63F59D-4676-4726-AFEC-BD9D3682733F}
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14} = {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}
EndProjectSection
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QModManager.OculusNewtonsoftRedirect", "OculusNewtonsoftRedirect\QModManager.OculusNewtonsoftRedirect.csproj", "{25558450-FF33-4FDF-91C7-0C5C00A94A57}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
+ BZ.EXP|Any CPU = BZ.EXP|Any CPU
+ BZ.EXP|x64 = BZ.EXP|x64
+ BZ.EXP|x86 = BZ.EXP|x86
+ BZ.STABLE|Any CPU = BZ.STABLE|Any CPU
+ BZ.STABLE|x64 = BZ.STABLE|x64
+ BZ.STABLE|x86 = BZ.STABLE|x86
+ SN.EXP|Any CPU = SN.EXP|Any CPU
+ SN.EXP|x64 = SN.EXP|x64
+ SN.EXP|x86 = SN.EXP|x86
+ SN.STABLE|Any CPU = SN.STABLE|Any CPU
+ SN.STABLE|x64 = SN.STABLE|x64
+ SN.STABLE|x86 = SN.STABLE|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Debug|x64.ActiveCfg = Debug|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Debug|x64.Build.0 = Debug|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Debug|x86.Build.0 = Debug|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Release|Any CPU.Build.0 = Release|Any CPU
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Release|x64.ActiveCfg = Release|x64
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Release|x64.Build.0 = Release|x64
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Release|x86.ActiveCfg = Release|x86
- {DA63F59D-4676-4726-AFEC-BD9D3682733F}.Release|x86.Build.0 = Release|x86
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Release|Any CPU.Build.0 = Release|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Release|x64.ActiveCfg = Release|Any CPU
- {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.Release|x86.ActiveCfg = Release|Any CPU
- {92726127-A08F-4843-BF96-4989CE1BF422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {92726127-A08F-4843-BF96-4989CE1BF422}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {92726127-A08F-4843-BF96-4989CE1BF422}.Debug|x64.ActiveCfg = Debug|x64
- {92726127-A08F-4843-BF96-4989CE1BF422}.Debug|x64.Build.0 = Debug|x64
- {92726127-A08F-4843-BF96-4989CE1BF422}.Debug|x86.ActiveCfg = Debug|x86
- {92726127-A08F-4843-BF96-4989CE1BF422}.Debug|x86.Build.0 = Debug|x86
- {92726127-A08F-4843-BF96-4989CE1BF422}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {92726127-A08F-4843-BF96-4989CE1BF422}.Release|Any CPU.Build.0 = Release|Any CPU
- {92726127-A08F-4843-BF96-4989CE1BF422}.Release|x64.ActiveCfg = Release|x64
- {92726127-A08F-4843-BF96-4989CE1BF422}.Release|x64.Build.0 = Release|x64
- {92726127-A08F-4843-BF96-4989CE1BF422}.Release|x86.ActiveCfg = Release|x86
- {92726127-A08F-4843-BF96-4989CE1BF422}.Release|x86.Build.0 = Release|x86
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Debug|x64.ActiveCfg = Debug|x64
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Debug|x64.Build.0 = Debug|x64
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Debug|x86.ActiveCfg = Debug|x86
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Debug|x86.Build.0 = Debug|x86
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Release|Any CPU.Build.0 = Release|Any CPU
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Release|x64.ActiveCfg = Release|x64
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Release|x64.Build.0 = Release|x64
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Release|x86.ActiveCfg = Release|x86
- {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.Release|x86.Build.0 = Release|x86
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Debug|x64.ActiveCfg = Debug|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Debug|x64.Build.0 = Debug|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Debug|x86.ActiveCfg = Debug|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Debug|x86.Build.0 = Debug|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Release|Any CPU.Build.0 = Release|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Release|x64.ActiveCfg = Release|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Release|x64.Build.0 = Release|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Release|x86.ActiveCfg = Release|Any CPU
- {21D282E0-6B3E-4776-AC86-3089F0655893}.Release|x86.Build.0 = Release|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Debug|x64.ActiveCfg = Debug|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Debug|x64.Build.0 = Debug|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Debug|x86.ActiveCfg = Debug|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Debug|x86.Build.0 = Debug|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Release|Any CPU.Build.0 = Release|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Release|x64.ActiveCfg = Release|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Release|x64.Build.0 = Release|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Release|x86.ActiveCfg = Release|Any CPU
- {CA99F076-7459-4682-A41D-2850AEE28566}.Release|x86.Build.0 = Release|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Debug|x64.ActiveCfg = Debug|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Debug|x64.Build.0 = Debug|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Debug|x86.ActiveCfg = Debug|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Debug|x86.Build.0 = Debug|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Release|Any CPU.Build.0 = Release|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Release|x64.ActiveCfg = Release|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Release|x64.Build.0 = Release|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Release|x86.ActiveCfg = Release|Any CPU
- {EA496DDF-D775-4E17-9EAE-C570C5F50701}.Release|x86.Build.0 = Release|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {DA63F59D-4676-4726-AFEC-BD9D3682733F}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {D433A819-73DB-4E6C-AE73-D3DED793BD4E}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {92726127-A08F-4843-BF96-4989CE1BF422}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {E00B7FE8-0F1D-4AE6-9E47-4BFD81537F14}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {CA99F076-7459-4682-A41D-2850AEE28566}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {EA496DDF-D775-4E17-9EAE-C570C5F50701}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.EXP|Any CPU.ActiveCfg = BZ.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.EXP|Any CPU.Build.0 = BZ.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.EXP|x64.ActiveCfg = BZ.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.EXP|x64.Build.0 = BZ.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.EXP|x86.ActiveCfg = BZ.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.EXP|x86.Build.0 = BZ.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.STABLE|Any CPU.ActiveCfg = BZ.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.STABLE|Any CPU.Build.0 = BZ.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.STABLE|x64.ActiveCfg = BZ.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.STABLE|x64.Build.0 = BZ.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.STABLE|x86.ActiveCfg = BZ.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.BZ.STABLE|x86.Build.0 = BZ.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.EXP|Any CPU.ActiveCfg = SN.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.EXP|Any CPU.Build.0 = SN.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.EXP|x64.ActiveCfg = SN.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.EXP|x64.Build.0 = SN.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.EXP|x86.ActiveCfg = SN.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.EXP|x86.Build.0 = SN.EXP|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.STABLE|Any CPU.ActiveCfg = SN.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.STABLE|Any CPU.Build.0 = SN.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.STABLE|x64.ActiveCfg = SN.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.STABLE|x64.Build.0 = SN.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.STABLE|x86.ActiveCfg = SN.STABLE|Any CPU
+ {25558450-FF33-4FDF-91C7-0C5C00A94A57}.SN.STABLE|x86.Build.0 = SN.STABLE|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/QModManager/Checks/PirateCheck.cs b/QModManager/Checks/PirateCheck.cs
index 830e2604..c73e2158 100644
--- a/QModManager/Checks/PirateCheck.cs
+++ b/QModManager/Checks/PirateCheck.cs
@@ -17,9 +17,14 @@ internal static void PirateDetected()
"steam_api64.ini",
"steam_emu.ini",
"valve.ini",
+ "SmartSteamEmu.ini",
"Subnautica_Data/Plugins/steam_api64.cdx",
"Subnautica_Data/Plugins/steam_api64.ini",
"Subnautica_Data/Plugins/steam_emu.ini",
+ "Profile/SteamUserID.cfg",
+ "Profile/Stats/Achievements.Bin",
+ "launcher.bat",
+ "chuj.cdx",
};
internal static void IsPirate(string folder)
diff --git a/QModManager/EntryPoint.cs b/QModManager/EntryPoint.cs
deleted file mode 100644
index 5da31de6..00000000
--- a/QModManager/EntryPoint.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace QModInstaller
-{
- using System;
- using QModManager.Patching;
-
- ///
- /// Container class for the entry point
- ///
- [Obsolete("Should not be used!", true)]
- public class QModPatcher
- {
- ///
- /// QModManager entry point
- ///
- [Obsolete("Should not be used!", true)]
- public static void Patch() => Patcher.Patch();
- }
-}
\ No newline at end of file
diff --git a/QModManager/HarmonyPatches/DisableDevErrorReporting.cs b/QModManager/HarmonyPatches/DisableDevErrorReporting.cs
index 37e95ab9..bcb6c925 100644
--- a/QModManager/HarmonyPatches/DisableDevErrorReporting.cs
+++ b/QModManager/HarmonyPatches/DisableDevErrorReporting.cs
@@ -3,13 +3,14 @@
using HarmonyLib;
using UnityEngine;
- [HarmonyPatch(typeof(SentrySdk), nameof(SentrySdk.Start))]
+ [HarmonyPatch]
internal static class SentrySdk_Start_Patch
{
// This patch destroys any SentrySdk object
// The SentrySdk class is the class that sends errors logged with Debug.LogError or Debug.LogException to the Subnautica developers
[HarmonyPrefix]
+ [HarmonyPatch(typeof(SentrySdk), nameof(SentrySdk.Start))]
internal static bool Prefix(SentrySdk __instance)
{
GameObject.Destroy(__instance);
diff --git a/QModManager/HarmonyPatches/EnableConsoleSetting.cs b/QModManager/HarmonyPatches/EnableConsoleSetting.cs
index 7215dd8f..9d5a3a8e 100644
--- a/QModManager/HarmonyPatches/EnableConsoleSetting.cs
+++ b/QModManager/HarmonyPatches/EnableConsoleSetting.cs
@@ -12,8 +12,11 @@ internal static class DevConsole_Awake_Patch
[HarmonyPostfix]
internal static void Postfix()
{
- DevConsole.disableConsole = !Config.EnableConsole;
- PlayerPrefs.SetInt("UWE.DisableConsole", Config.EnableConsole ? 0 : 1);
+ if(DevConsole.disableConsole != !Config.EnableConsole)
+ {
+ DevConsole.disableConsole = !Config.EnableConsole;
+ PlayerPrefs.SetInt("UWE.DisableConsole", Config.EnableConsole ? 0 : 1);
+ }
}
}
diff --git a/QModManager/OptionsManager.cs b/QModManager/OptionsManager.cs
index eb8ccd89..feb75bfb 100644
--- a/QModManager/OptionsManager.cs
+++ b/QModManager/OptionsManager.cs
@@ -3,7 +3,6 @@
using HarmonyLib;
using QModManager.Utility;
using UnityEngine.Events;
- using UnityEngine.UI;
internal static class OptionsManager
{
diff --git a/QModManager/Patching/GameDetector.cs b/QModManager/Patching/GameDetector.cs
index eaa25779..c2d75a13 100644
--- a/QModManager/Patching/GameDetector.cs
+++ b/QModManager/Patching/GameDetector.cs
@@ -18,13 +18,20 @@ internal class GameDetector
///