From 406c969beee58c1d29d163161a21163f63002599 Mon Sep 17 00:00:00 2001 From: Ryan Volz Date: Thu, 27 Jul 2023 18:55:32 -0400 Subject: [PATCH] Move NSIS patching to rerender and build from locked environment. --- .github/workflows/build_radioconda.yml | 9 +- build_installer.py | 13 - buildenv.yaml | 4 + constructor/nsis/main.nsi.tmpl | 1386 +++++ constructor/nsis/main.nsi.tmpl.orig | 1357 +++++ installer_specs/buildenv.conda-lock.yml | 5051 +++++++++++++++++ .../radioconda-win-64/main.nsi.tmpl | 1386 +++++ rerender.py | 94 + ...tomize-Windows-NSIS-installer-script.patch | 80 - 9 files changed, 9283 insertions(+), 97 deletions(-) create mode 100644 constructor/nsis/main.nsi.tmpl create mode 100644 constructor/nsis/main.nsi.tmpl.orig create mode 100644 installer_specs/buildenv.conda-lock.yml create mode 100644 installer_specs/radioconda-win-64/main.nsi.tmpl delete mode 100644 static/0001-Customize-Windows-NSIS-installer-script.patch diff --git a/.github/workflows/build_radioconda.yml b/.github/workflows/build_radioconda.yml index f841030..99d2085 100644 --- a/.github/workflows/build_radioconda.yml +++ b/.github/workflows/build_radioconda.yml @@ -53,16 +53,17 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install coreutils for macOS if: runner.os == 'macOS' run: brew install coreutils - name: Install python environment - uses: mamba-org/provision-with-micromamba@main + uses: mamba-org/setup-micromamba@v1 with: - environment-file: buildenv.yaml + environment-file: installer_specs/buildenv.conda-lock.yml + environment-name: buildenv - name: Build installer shell: bash -l {0} @@ -183,7 +184,7 @@ jobs: - name: Upload to Github artifact if: ${{ (success() || failure()) && !startsWith(github.ref, 'refs/tags/') }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: path: dist/* name: ${{ matrix.OS_NAME }}-${{ matrix.ARCH }} diff --git a/build_installer.py b/build_installer.py index 4f46954..be489be 100755 --- a/build_installer.py +++ b/build_installer.py @@ -110,19 +110,6 @@ if __name__ == "__main__": platform = spec_dir_extract_platform(args.installer_spec_dir) - if platform.startswith("win"): - # patch constructor's nsis template - import patch_ng - - pset = patch_ng.fromfile( - "static/0001-Customize-Windows-NSIS-installer-script.patch" - ) - pset.write_hunks( - pathlib.Path(constructor_main.__file__).parent / "nsis" / "main.nsi.tmpl", - args.installer_spec_dir / "main.nsi.tmpl", - pset.items[0].hunks, - ) - args.output_dir.mkdir(parents=True, exist_ok=True) if not platform.startswith("win"): diff --git a/buildenv.yaml b/buildenv.yaml index 2d22ec2..e88cf8d 100644 --- a/buildenv.yaml +++ b/buildenv.yaml @@ -1,6 +1,10 @@ name: buildenv channels: - conda-forge +platforms: + - linux-64 + - osx-64 + - win-64 dependencies: - anaconda-client - conda-build diff --git a/constructor/nsis/main.nsi.tmpl b/constructor/nsis/main.nsi.tmpl new file mode 100644 index 0000000..2e84269 --- /dev/null +++ b/constructor/nsis/main.nsi.tmpl @@ -0,0 +1,1386 @@ +# Installer template file for creating a Windows installer using NSIS. + +# Dependencies: +# NSIS >=3.08 conda install "nsis>=3.08" (includes extra unicode plugins) + +Unicode "true" + +#if enable_debugging is True +# Special logging build needed for ENABLE_LOGGING +# See https://nsis.sourceforge.io/Special_Builds +!define ENABLE_LOGGING +#endif + +# Comes from https://nsis.sourceforge.io/Logging:Enable_Logs_Quickly +!define LogSet "!insertmacro LogSetMacro" +!macro LogSetMacro SETTING + !ifdef ENABLE_LOGGING + LogSet ${SETTING} + !endif +!macroend + +!define LogText "!insertmacro LogTextMacro" +!macro LogTextMacro INPUT_TEXT + !ifdef ENABLE_LOGGING + LogText ${INPUT_TEXT} + !endif +!macroend + +!include "WinMessages.nsh" +!include "WordFunc.nsh" +!include "LogicLib.nsh" +!include "WinVer.nsh" +!include "MUI2.nsh" +!include "x64.nsh" + +!include "FileFunc.nsh" +!insertmacro GetParameters +!insertmacro GetOptions + +!include "UAC.nsh" +!include "nsDialogs.nsh" + +!include "Utils.nsh" + +!define NAME __NAME__ +!define VERSION __VERSION__ +!define COMPANY __COMPANY__ +!define ARCH __ARCH__ +!define PLATFORM __PLATFORM__ +!define CONSTRUCTOR_VERSION __CONSTRUCTOR_VERSION__ +!define PY_VER __PY_VER__ +!define PYVERSION_JUSTDIGITS __PYVERSION_JUSTDIGITS__ +!define PYVERSION __PYVERSION__ +!define PYVERSION_MAJOR __PYVERSION_MAJOR__ +!define DEFAULT_PREFIX __DEFAULT_PREFIX__ +!define DEFAULT_PREFIX_DOMAIN_USER __DEFAULT_PREFIX_DOMAIN_USER__ +!define DEFAULT_PREFIX_ALL_USERS __DEFAULT_PREFIX_ALL_USERS__ +!define PRE_INSTALL_DESC __PRE_INSTALL_DESC__ +!define POST_INSTALL_DESC __POST_INSTALL_DESC__ +!define MENU_PKGS "@MENU_PKGS@" +!define SHOW_REGISTER_PYTHON __SHOW_REGISTER_PYTHON__ +!define SHOW_ADD_TO_PATH __SHOW_ADD_TO_PATH__ +!define PRODUCT_NAME "${NAME} ${VERSION} (${ARCH})" +!define UNINSTALL_NAME "@UNINSTALL_NAME@" +!define UNINSTREG "SOFTWARE\Microsoft\Windows\CurrentVersion\ + \Uninstall\${UNINSTALL_NAME}" + +var /global INSTDIR_JUSTME +var /global INSTALLER_VERSION +var /global INSTALLER_NAME_FULL + +# UAC shield overlay +!ifndef BCM_SETSHIELD + !define BCM_SETSHIELD 0x0000160C +!endif + +var /global ARGV +var /global ARGV_Help +var /global ARGV_InstallationType +var /global ARGV_AddToPath +var /global ARGV_KeepPkgCache +var /global ARGV_RegisterPython +var /global ARGV_NoRegistry +var /global ARGV_NoScripts +var /global ARGV_NoShortcuts +var /global ARGV_CheckPathLength + +var /global IsDomainUser +var /global CheckPathLength +var /global LongPathsEnabled +var /global InstDirLen + +var /global InstModePage_RadioButton_JustMe +var /global InstModePage_RadioButton_AllUsers + +var /global InstMode # 0 = Just Me, 1 = All Users. +!define JUST_ME 0 +!define ALL_USERS 1 + +# Include this one after our defines +!include "OptionsDialog.nsh" + +CRCCheck On + +# Basic options +Name "${PRODUCT_NAME}" +OutFile __OUTFILE__ +ShowInstDetails "hide" +ShowUninstDetails "hide" +# This installer contains tar.bz2 files, which are already compressed +SetCompress "off" + +# Start off with the lowest permissions and work our way up. +RequestExecutionLevel user + +# Version information & branding text +VIAddVersionKey "ProductName" "${PRODUCT_NAME}" +VIAddVersionKey "FileVersion" "${VERSION}" +VIAddVersionKey "ProductVersion" "${VERSION}" +VIAddVersionKey "CompanyName" "${COMPANY}" +VIAddVersionKey "LegalCopyright" "(c) ${COMPANY}" +VIAddVersionKey "FileDescription" "${NAME} Installer" +VIAddVersionKey "Comments" "Created by constructor ${CONSTRUCTOR_VERSION}" +VIProductVersion __VIPV__ +BrandingText /TRIMLEFT "${COMPANY}" + +# Interface configuration +!define MUI_ICON __ICONFILE__ +!define MUI_UNICON __ICONFILE__ +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP __HEADERIMAGE__ +!define MUI_HEADERIMAGE_UNBITMAP __HEADERIMAGE__ +!define MUI_ABORTWARNING +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_UNFINISHPAGE_NOAUTOCLOSE +!define MUI_WELCOMEFINISHPAGE_BITMAP __WELCOMEIMAGE__ +!define MUI_UNWELCOMEFINISHPAGE_BITMAP __WELCOMEIMAGE__ +#!define MUI_CUSTOMFUNCTION_GUIINIT GuiInit + +# Pages +#!define MUI_PAGE_CUSTOMFUNCTION_SHOW OnStartup +#if custom_welcome +# Custom welcome file(s) +@CUSTOM_WELCOME_FILE@ +#else +!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageIfUACInnerInstance +!insertmacro MUI_PAGE_WELCOME +#endif +!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageIfUACInnerInstance +!insertmacro MUI_PAGE_LICENSE __LICENSEFILE__ +Page Custom InstModePage_Create InstModePage_Leave +!define MUI_PAGE_CUSTOMFUNCTION_PRE DisableBackButtonIfUACInnerInstance +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE OnDirectoryLeave +!insertmacro MUI_PAGE_DIRECTORY +# Custom options now differ depending on installation mode. +#Page Custom mui_AnaCustomOptions_Show +!insertmacro MUI_PAGE_INSTFILES +#if with_conclusion_text is True +!define MUI_FINISHPAGE_TITLE __CONCLUSION_TITLE__ +!define MUI_FINISHPAGE_TITLE_3LINES +!define MUI_FINISHPAGE_TEXT __CONCLUSION_TEXT__ +#endif + +# Custom conclusion file(s) +@CUSTOM_CONCLUSION_FILE@ + +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_WELCOME +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.OnDirectoryLeave +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +# Language +!insertmacro MUI_LANGUAGE "English" + +Function SkipPageIfUACInnerInstance + ${LogSet} on + ${If} ${UAC_IsInnerInstance} + Abort + ${EndIf} +FunctionEnd + +!macro DoElevation + GetDlgItem $1 $HWNDParent 1 + System::Call user32::GetFocus()i.s + # Disable 'Next' button. + EnableWindow $1 0 + !insertmacro UAC_PageElevation_RunElevated + EnableWindow $1 1 + System::call user32::SetFocus(is) + ${If} $2 = 0x666 + MessageBox MB_ICONEXCLAMATION \ + "You need to log in with an administrative account \ + in order to perform an 'All Users' installation." + Abort + ${ElseIf} $0 = 1223 + # UAC canceled by user. + Abort + ${Else} + ${If} $0 <> 0 + ${If} $0 = 1062 + MessageBox MB_ICONSTOP \ + "Elevation failed; Secondary Logon service is \ + not running." + ${Else} + MessageBox MB_ICONSTOP \ + "Elevation failed; error code: $0." + ${EndIf} + Abort + ${EndIf} + ${EndIf} + # UAC worked, we're the outer installer, so we can quit. + Quit +!macroend + + +!macro ParseCommandLineArgs + ClearErrors + ${GetParameters} $ARGV + ${GetOptions} $ARGV "/?" $ARGV_Help + ${IfNot} ${Errors} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Usage: $EXEFILE [options]$\n\ + Options:$\n$\n\ + /InstallationType=AllUsers [default: JustMe]$\n$\n\ + /AddToPath=[0|1] [default: 0]$\n$\n\ +#if keep_pkgs is True + /KeepPkgCache=[0|1] [default: 1]$\n$\n\ +#endif +#if keep_pkgs is False + /KeepPkgCache=[0|1] [default: 0]$\n$\n\ +#endif + /RegisterPython=[0|1] [default: AllUsers: 1, JustMe: 0]$\n$\n\ + /NoRegistry=[0|1] [default: AllUsers: 0, JustMe: 0]$\n$\n\ + /NoScripts=[0|1] [default: 0]$\n$\n\ + /NoShortcuts=[0|1] [default: 0]$\n$\n\ + /CheckPathLength=[0|1] [default: 1]$\n$\n\ + Examples:$\n\ + Install for all users, but don't add to PATH env var:$\n\ + $EXEFILE /InstallationType=AllUsers$\n$\n\ + Install for just me, add to PATH and register as system Python:$\n\ + $EXEFILE /RegisterPython=1 /AddToPath=1$\n$\n\ + Install for just me, with no registry modification (for CI):$\n\ + $EXEFILE /NoRegistry=1$\n$\n\ + NOTE: If you install for AllUsers, then the option to AddToPath$\n\ + is disabled (i.e. if ./InstallationType=AllUsers, then$\n\ + /AddToPath=1 will be ignored).$\n" \ + /SD IDOK + Abort + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/InstallationType=" $ARGV_InstallationType + ${IfNot} ${Errors} + ${If} $ARGV_InstallationType == "AllUsers" + StrCpy $InstMode ${ALL_USERS} + ${Else} + StrCpy $InstMode ${JUST_ME} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/RegisterPython=" $ARGV_RegisterPython + ${IfNot} ${Errors} + ${If} $ARGV_RegisterPython = "1" + StrCpy $Ana_RegisterSystemPython_State ${BST_CHECKED} + ${ElseIf} $ARGV_RegisterPython = "0" + StrCpy $Ana_RegisterSystemPython_State ${BST_UNCHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/KeepPkgCache=" $ARGV_KeepPkgCache + ${If} ${Errors} + StrCpy $ARGV_KeepPkgCache "@KEEP_PKGS@" + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoRegistry=" $ARGV_NoRegistry + ${If} ${Errors} + StrCpy $ARGV_NoRegistry "0" + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoScripts=" $ARGV_NoScripts + ${IfNot} ${Errors} + ${If} $ARGV_NoScripts = "1" + StrCpy $Ana_PostInstall_State ${BST_UNCHECKED} + ${ElseIf} $ARGV_NoScripts = "0" + StrCpy $Ana_PostInstall_State ${BST_CHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoShortcuts=" $ARGV_NoShortcuts + ${IfNot} ${Errors} + ${If} $ARGV_NoShortcuts = "1" + StrCpy $Ana_CreateShortcuts_State ${BST_UNCHECKED} + ${ElseIf} $ARGV_NoShortcuts = "0" + StrCpy $Ana_CreateShortcuts_State ${BST_CHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/CheckPathLength=" $ARGV_CheckPathLength + ${IfNot} ${Errors} + ${If} $ARGV_CheckPathLength = "0" + StrCpy $CheckPathLength "0" + ${ElseIf} $ARGV_CheckPathLength = "1" + StrCpy $CheckPathLength "1" + ${EndIf} + ${EndIf} + +!macroend + +Function OnInit_Release + ${LogSet} on + !insertmacro ParseCommandLineArgs + + # Parsing the AddToPath option here (and not in ParseCommandLineArgs) to prevent the MessageBox from showing twice. + # For more context, see https://github.com/conda/constructor/pull/584#issuecomment-1347688020 + ClearErrors + ${GetOptions} $ARGV "/AddToPath=" $ARGV_AddToPath + ${IfNot} ${Errors} + ${If} $ARGV_AddToPath = "1" + ${If} $InstMode == ${ALL_USERS} + # To address CVE-2022-26526. + # In AllUsers install mode, do not allow AddToPath as an option. + MessageBox MB_OK|MB_ICONEXCLAMATION "/AddToPath=1 is disabled and ignored in 'All Users' installations" /SD IDOK + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} + ${Else} + StrCpy $Ana_AddToPath_State ${BST_CHECKED} + ${EndIf} + ${ElseIf} $ARGV_AddToPath = "0" + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} + ${EndIf} + ${EndIf} +FunctionEnd + +Function InstModePage_RadioButton_OnClick + ${LogSet} on + Exch $0 + Push $1 + Push $2 + + nsDialogs::GetUserData $0 + Pop $1 + GetDlgItem $2 $HWNDParent 1 + SendMessage $2 ${BCM_SETSHIELD} 0 $1 + + Pop $2 + Pop $1 + Exch $0 +FunctionEnd + +Function InstModePage_Create + ${LogSet} on + Push $0 + Push $1 + Push $2 + Push $3 + + ${If} ${UAC_IsInnerInstance} + Abort + ${EndIf} + + !insertmacro MUI_HEADER_TEXT_PAGE \ + "Select Installation Type" \ + "Please select the type of installation you would like to perform \ + for ${PRODUCT_NAME}." + + GetFunctionAddress $0 InstModePage_RadioButton_OnClick + nsDialogs::Create /NOUNLOAD 1018 + Pop $1 + ${NSD_OnBack} RemoveNextBtnShield + ${NSD_CreateLabel} 0 20u 75% 20u "Install for:" + ${NSD_CreateRadioButton} 0 40u 75% 15u "Just Me (recommended)" + Pop $2 + #MessageBox MB_OK "OnClick 2! 0: $0, 1: $1, 2: $2" + StrCpy $InstModePage_RadioButton_JustMe $2 + + nsDialogs::OnClick $2 $0 + nsDialogs::SetUserData $2 0 + SendMessage $2 ${BM_CLICK} 0 0 + + ${NSD_CreateRadioButton} 0 60u 75% 15u \ + "All Users (requires admin privileges)" + #MessageBox MB_OK "OnClick 3! 0: $0, 1: $1, 2: $2, 3: $3" + Pop $3 + StrCpy $InstModePage_RadioButton_AllUsers $3 + nsDialogs::OnClick $3 $0 + nsDialogs::SetUserData $3 1 + ${IfThen} $InstMode <> ${JUST_ME} ${|} SendMessage $3 ${BM_CLICK} 0 0 ${|} + Push $3 + nsDialogs::Show + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function DisableBackButtonIfUACInnerInstance + ${LogSet} on + Push $0 + ${If} ${UAC_IsInnerInstance} + GetDlgItem $0 $HWNDParent 3 + EnableWindow $0 0 + ${EndIf} + Pop $0 +FunctionEnd + +Function RemoveNextBtnShield + ${LogSet} on + Push $0 + GetDlgItem $0 $HWNDParent 1 + SendMessage $0 ${BCM_SETSHIELD} 0 0 + Pop $0 +FunctionEnd + +Function InstModeChanged + ${LogSet} on + # When using the installer with /S (silent mode), the /D option sets $INSTDIR, + # and it is therefore important not to overwrite $INSTDIR here, but it is also + # important that we do call SetShellVarContext with the appropriate value. + Push $0 + ${If} $InstMode = ${JUST_ME} + SetShellVarContext Current + # If we're on Vista+, the installation directory will + # have a nice, no-space name like: + # C:\Users\Trent\AppData\Local\Continuum\Anaconda. + # On 2003/XP, it will be in C:\Documents and Settings, + # with a space. We're allowing spaces now. + ${IfNot} ${Silent} + StrCpy $INSTDIR $INSTDIR_JUSTME + ${EndIf} + ${Else} + SetShellVarContext All + ${IfNot} ${Silent} + ExpandEnvStrings $0 ${DEFAULT_PREFIX_ALL_USERS} + StrCpy $INSTDIR $0 + ${Endif} + ${EndIf} + Pop $0 +FunctionEnd + +!macro SetInstMode mode + StrCpy $InstMode ${mode} + Call InstModeChanged +!macroend + +Function InstModePage_Leave + ${LogSet} on + Push $0 + Push $1 + Push $2 + + ${NSD_GetState} $InstModePage_RadioButton_AllUsers $0 + ${If} $0 = 0 + !insertmacro SetInstMode ${JUST_ME} + ${Else} + !insertmacro SetInstMode ${ALL_USERS} + ${IfNot} ${UAC_IsAdmin} + !insertmacro DoElevation + ${EndIf} + ${EndIf} + + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function .onInit + ${LogSet} on + Push $0 + Push $1 + Push $2 + Push $R1 + Push $R2 + + InitPluginsDir + @TEMP_EXTRA_FILES@ + !insertmacro ParseCommandLineArgs + + # Select the correct registry to look at, depending + # on whether it's a 32-bit or 64-bit installer + SetRegView @BITS@ +#if win64 + # If we're a 64-bit installer, make sure it's 64-bit Windows + ${IfNot} ${RunningX64} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "This installer is for a 64-bit version for ${NAME}$\n\ + but your system is 32-bit. Please use the 32-bit Windows$\n\ + ${NAME} installer." \ + /SD IDOK + Abort + ${EndIf} +#endif + + !insertmacro UAC_PageElevation_OnInit + ${If} ${UAC_IsInnerInstance} + ${AndIfNot} ${UAC_IsAdmin} + SetErrorLevel 0x666 + Quit + ${EndIf} + + # Look for a number of signs that indicate the user is a domain user and + # alter the default installation directory for 'Just Me' accordingly. We + # want to ensure that if we're a user domain account, we always install to + # %LOCALAPPDATA% (i.e. C:\Users\Trent\AppData\Local\Continuum\Anaconda), + # as this is the only place guaranteed to not be backed by a network share + # or included in a user's roaming profile. However, if we're a normal user + # account, then C:\Users\Trent\Anaconda is fine. + ReadEnvStr $0 USERDNSDOMAIN + ${If} $0 != "" + # If not null, USERDNSDOMAIN is an unambiguous indication that we're + # logged into a domain account. + StrCpy $IsDomainUser 1 + ${Else} + # If it's not set, apply some simple heuristics to discern whether or + # not we're logged in as a domain user. + ReadEnvStr $0 LOGONSERVER + ${If} $0 == "" + # This should never be unset; but if it is, we're definitely not + # a domain user. + StrCpy $IsDomainUser 0 + ${Else} + StrCpy $1 $0 "" 2 # lop-off the leading \\. + ${StrFilter} $1 "+" "" "" $2 # convert to uppercase, store in $2 + ${If} $2 == "MICROSOFTACCOUNT" + # The new Windows 8.x live accounts have \\MicrosoftAccount + # set as LOGONSERVER; interpret this as being a non-domain + # user. + StrCpy $IsDomainUser 0 + ${Else} + ReadEnvStr $R1 COMPUTERNAME + ${If} $R1 == "" + # This should never be unset either; if it is, assume + # we're not a domain user. + StrCpy $IsDomainUser 0 + ${Else} + # We've got a value for both LOGONSERVER and COMPUTERNAME + # environment variables (which should always be the case). + # Proceed to compare LOGONSERVER[-2:] to COMPUTERNAME; if + # they match, assume we're not a domain user account. + + ${StrFilter} $R1 "+" "" "" $R2 # convert to uppercase + ${If} $2 != $R2 + # COMPUTERNAME doesn't match LOGONSERVER; assume we're + # logged in via a domain account. + StrCpy $IsDomainUser 1 + ${Else} + # COMPUTERNAME matches LOGONSERVER; safe to assume + # we're logged in as a user account. (I guess there's + # the remote possibility a domain user has logged onto + # a server that has the same NetBIOS name as the Active + # Directory name... if that's the case, potentially + # installing Anaconda into an area that gets picked up + # by a roaming profile is the very least of your + # problems.) + StrCpy $IsDomainUser 0 + + ${EndIf} # LOGONSERVER[-2:] != COMPUTERNAME + + ${EndIf} # COMPUTERNAME != "" + + ${EndIf} # LOGONSERVER != "\\MicrosoftAccount" + + ${EndIf} # LOGONSERVER != "" + + ${EndIf} # USERDNSDOMAIN != "" + + ${If} $IsDomainUser = 0 + ExpandEnvStrings $0 ${DEFAULT_PREFIX} + StrCpy $INSTDIR_JUSTME $0 + ${ElseIf} $IsDomainUser = 1 + ExpandEnvStrings $0 ${DEFAULT_PREFIX_DOMAIN_USER} + StrCpy $INSTDIR_JUSTME $0 + ${Else} + # Should never happen; indicates a logic error above. + MessageBox MB_OK "Internal error: IsUserDomain not set properly!" \ + /SD IDOK + Abort + ${EndIf} + + ${If} $InstMode == "" + StrCpy $InstMode ${JUST_ME} + ${IfThen} ${UAC_IsAdmin} ${|} StrCpy $InstMode ${ALL_USERS} ${|} + # If running as 'SYSTEM' then JustMe is not appropriate; note that + # we should advise against this. SCCM has an option to run as user + System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2" + ${IfThen} $0 == "SYSTEM" ${|} StrCpy $InstMode ${ALL_USERS} ${|} + ${EndIf} + call InstModeChanged + + ${If} ${Silent} + ${If} $InstMode == ${ALL_USERS} + ${IfNot} ${UAC_IsAdmin} + MessageBox MB_ICONSTOP "Installation for all users requires an elevated prompt." + Abort + ${EndIF} + ${EndIF} + ${EndIF} + + ; /D was not used, add default based on install type + ${If} $InstDir == "" + ${If} $InstMode == ${ALL_USERS} + ExpandEnvStrings $0 ${DEFAULT_PREFIX_ALL_USERS} + StrCpy $INSTDIR $0 + ${Else} + strcpy $INSTDIR $INSTDIR_JUSTME + ${EndIf} + ${EndIf} + + ; Set default value + ${If} $CheckPathLength == "" + StrCpy $CheckPathLength "1" + ${EndIf} + + # Initialize the default settings for the anaconda custom options + Call mui_AnaCustomOptions_InitDefaults + # Override custom options with explicitly given values from contruct.yaml. + # If initialize_by_default (register_python_default) is None, do nothing. +#if initialize_conda is True and initialize_by_default is True + ${If} $InstMode == ${JUST_ME} + StrCpy $Ana_AddToPath_State ${BST_CHECKED} + ${EndIF} +#endif +#if initialize_conda is True and initialize_by_default is False + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} +#endif +#if register_python is True and register_python_default is True + StrCpy $Ana_RegisterSystemPython_State ${BST_CHECKED} +#endif +#if register_python is True and register_python_default is False + StrCpy $Ana_RegisterSystemPython_State ${BST_UNCHECKED} +#endif +#if check_path_length is True + StrCpy $CheckPathLength "1" +#endif +#if check_path_length is False + StrCpy $CheckPathLength "0" +#endif +#if keep_pkgs is True + StrCpy $Ana_ClearPkgCache_State ${BST_UNCHECKED} +#endif +#if keep_pkgs is False + StrCpy $Ana_ClearPkgCache_State ${BST_CHECKED} +#endif +#if pre_install_exists is True + StrCpy $Ana_PreInstall_State ${BST_CHECKED} +#endif +#if pre_install_exists is False + StrCpy $Ana_PreInstall_State ${BST_UNCHECKED} +#endif +#if post_install_exists is True + StrCpy $Ana_PostInstall_State ${BST_CHECKED} +#endif +#if post_install_exists is False + StrCpy $Ana_PostInstall_State ${BST_UNCHECKED} +#endif + + Call OnInit_Release + + Pop $R2 + Pop $R1 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function un.onInit + Push $0 + Push $1 + Push $2 + Push $3 + + # Resolve INSTDIR + GetFullPathName $0 $INSTDIR + # If the directory does not exist or cannot be resolved, $0 will be empty + StrCmp $0 "" invalid_dir + StrCpy $INSTDIR $0 + + # Never run the uninstaller when $INSTDIR points at system-critical directories + + StrLen $InstDirLen $INSTDIR + # INSTDIR is a full path and has no trailing backslash, + # so if its length is 2, it is pointed at a system root + StrCmp $InstdirLen 2 invalid_dir + + # Never delete anything inside Windows + StrCpy $0 $INSTDIR 7 3 + StrCmp $0 "Windows" invalid_dir + + StrCpy $0 "ALLUSERSPROFILE APPDATA LOCALAPPDATA PROGRAMDATA PROGRAMFILES PROGRAMFILES(x86) PUBLIC SYSTEMDRIVE SYSTEMROOT USERPROFILE" + StrCpy $1 1 + loop_critical: + ${WordFind} $0 " " "E+$1" $2 + IfErrors endloop_critical + ReadEnvStr $3 $2 + StrCmp $3 $INSTDIR invalid_dir + IntOp $1 $1 + 1 + goto loop_critical + endloop_critical: + + # Primitive check to see that $INSTDIR points to a conda directory + StrCpy $0 "_conda.exe conda-meta\history" + StrCpy $1 1 + loop_conda: + ${WordFind} $0 " " "E+$1" $2 + IfErrors endloop_conda + IfFileExists $INSTDIR\$2 0 invalid_dir + IntOp $1 $1 + 1 + goto loop_conda + endloop_conda: + + # All checks have passed + goto valid_dir + + invalid_dir: + MessageBox MB_OK|MB_ICONSTOP \ + "Error: $INSTDIR is not a valid conda directory. Please run the uninstaller from a conda directory." \ + /SD IDABORT + abort + valid_dir: + + # Select the correct registry to look at, depending + # on whether it's a 32-bit or 64-bit installer + SetRegView @BITS@ + + # Since the switch to a dual-mode installer (All Users/Just Me), the + # uninstaller will inherit the requested execution level of the main + # installer -- which we now have to set to 'user'. Thus, Windows will + # not automatically elevate the uninstaller for us -- we need to do it + # ourselves if we're not a 'Just Me' installation. + !insertmacro UAC_PageElevation_OnInit + ${IfNot} ${FileExists} "$INSTDIR\.nonadmin" + ${AndIfNot} ${UAC_IsAdmin} + !insertmacro DoElevation + ${EndIf} + + ${If} ${FileExists} "$INSTDIR\.nonadmin" + SetShellVarContext Current + ${Else} + SetShellVarContext All + ${EndIf} + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +# http://nsis.sourceforge.net/Check_for_spaces_in_a_directory_path +Function CheckForSpaces + ${LogSet} on + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + StrCpy $R1 -1 + StrCpy $R3 $R0 + StrCpy $R0 0 + loop: + StrCpy $R2 $R3 1 $R1 + IntOp $R1 $R1 - 1 + StrCmp $R2 "" done + StrCmp $R2 " " 0 loop + IntOp $R0 $R0 + 1 + Goto loop + done: + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +# http://nsis.sourceforge.net/StrCSpn,_StrCSpnReverse:_Scan_strings_for_characters +Function StrCSpn + ${LogSet} on + Exch $R0 ; string to check + Exch + Exch $R1 ; string of chars + Push $R2 ; current char + Push $R3 ; current char + Push $R4 ; char loop + Push $R5 ; char loop + + StrCpy $R4 -1 + + NextChar: + StrCpy $R2 $R1 1 $R4 + IntOp $R4 $R4 - 1 + StrCmp $R2 "" StrOK + + StrCpy $R5 -1 + + NextCharCheck: + StrCpy $R3 $R0 1 $R5 + IntOp $R5 $R5 - 1 + StrCmp $R3 "" NextChar + StrCmp $R3 $R2 0 NextCharCheck + StrCpy $R0 $R2 + Goto Done + + StrOK: + StrCpy $R0 "" + + Done: + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +# http://stackoverflow.com/a/29569614/1170370 +!macro _IsNonEmptyDirectory _a _b _t _f +!insertmacro _LOGICLIB_TEMP +!insertmacro _IncreaseCounter +Push $0 +FindFirst $0 $_LOGICLIB_TEMP "${_b}\*" +_IsNonEmptyDirectory_loop${LOGICLIB_COUNTER}: + StrCmp "" $_LOGICLIB_TEMP _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} + StrCmp "." $_LOGICLIB_TEMP +2 + StrCmp ".." $_LOGICLIB_TEMP 0 _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} + FindNext $0 $_LOGICLIB_TEMP + Goto _IsNonEmptyDirectory_loop${LOGICLIB_COUNTER} +_IsNonEmptyDirectory_done${LOGICLIB_COUNTER}: +FindClose $0 +Pop $0 +!insertmacro _!= "" $_LOGICLIB_TEMP `${_t}` `${_f}` +!macroend +!define IsNonEmptyDirectory `"" IsNonEmptyDirectory` + + +Function OnDirectoryLeave + ${LogSet} on + ${If} ${IsNonEmptyDirectory} "$InstDir" + DetailPrint "::error:: Directory '$INSTDIR' is not empty, please choose a different location." + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Directory '$INSTDIR' is not empty,$\n\ + please choose a different location." \ + /SD IDOK + Abort + ${EndIf} + + ReadRegStr $LongPathsEnabled HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" + StrLen $InstDirLen "$InstDir" + + ${If} $CheckPathLength == "1" + ${AndIf} $LongPathsEnabled == "0" + ${AndIf} $InstDirLen > 46 + ; With windows 10, we can enable support for long path, for earlier + ; version, suggest user to use shorter installation path + ${If} ${AtLeastWin10} + ${AndIfNot} $ARGV_NoRegistry = "1" + ; If we have admin right, we enable long path on windows + ${If} ${UAC_IsAdmin} + WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1 + ; If we don't have admin right, we suggest a shorter path or suggest to run with admin right + ${Else} + DetailPrint "::error:: The installation path should be shorter than 46 characters or \ + the installation requires administrator rights to enable long \ + path on Windows." + MessageBox MB_OK|MB_ICONSTOP "The installation path should be shorter than 46 characters or \ + the installation requires administrator rights to enable long \ + path on Windows." \ + /SD IDOK + Abort + ${EndIf} + ; If we don't have admin right, we suggest a shorter path or suggest to run with admin right + ${Else} + DetailPrint "::error:: The installation path should be shorter than 46 characters. \ + Please choose another location." + MessageBox MB_OK|MB_ICONSTOP "The installation path should be shorter than 46 characters. \ + Please choose another location." \ + /SD IDOK + Abort + ${EndIf} + ${EndIf} + + # Call the CheckForSpaces function. + Push $INSTDIR # Input string (install path). + Call CheckForSpaces + Pop $R0 # The function returns the number of spaces found in the input string. + + Push $R7 + Push $R8 + Push $R9 + # Check if any spaces exist in $INSTDIR. + StrCmp $R0 0 NoSpaces + + # Plural if more than 1 space in $INSTDIR. + StrCmp $R0 1 0 +3 + StrCpy $R1 "" + Goto +2 + StrCpy $R1 "s" + + ${If} ${Silent} + StrCpy $R7 " " + ${Else} + StrCpy $R7 "$\n" + ${EndIf} + StrCpy $R8 "'Destination Folder' contains $R0 space$R1.$R7This can cause problems with several conda packages.$R7" +#if check_path_spaces is True + StrCpy $R8 "$R8Please remove the space$R1 from the destination folder." + StrCpy $R9 "Error" +#else + StrCpy $R8 "$R8Please consider removing the space$R1." + StrCpy $R9 "Warning" +#endif + # Show message box then take the user back to the Directory page. + ${If} ${Silent} + DetailPrint "::$R9:: $R8" + ${Else} + MessageBox MB_OK|MB_ICONINFORMATION "$R9: $R8" /SD IDOK + ${EndIf} +#if check_path_spaces is True + abort +#endif + NoSpaces: + Pop $R7 + Pop $R8 + Pop $R9 + + # List of characters not allowed anywhere in $INSTDIR + Push "^%!=," + Push $INSTDIR + Call StrCSpn + Pop $R0 + + StrCmp $R0 "" NoInvalidCharaceters + DetailPrint "::error:: 'Destination Folder' contains the following invalid character: $R0" + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: 'Destination Folder' contains the following invalid character: $R0" \ + /SD IDOK + abort + NoInvalidCharaceters: + + UnicodePathTest::SpecialCharPathTest $INSTDIR + Pop $R1 + StrCmp $R1 "nothingspecial" nothing_special_path + DetailPrint "::error:: 'Destination Folder' contains the following invalid character$R1" + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: 'Destination Folder' contains the following invalid character$R1" \ + /SD IDOK + abort + nothing_special_path: + + ; test if path contains unicode characters + UnicodePathTest::UnicodePathTest $INSTDIR + Pop $R1 + + # Python 3 can be installed in a CP_ACP path until MKL is Unicode capable. + # (mkl_rt.dll calls LoadLibraryA() to load mkl_intel_thread.dll) + # Python 2 can only be installed to an ASCII path. + StrCmp $R1 "ascii" valid_path + StrCmp ${PY_VER} "2.7" not_cp_acp_capable + StrCmp $R1 "ascii_cp_acp" valid_path + not_cp_acp_capable: + DetailPrint "::error:: Due to incompatibility with several \ + Python libraries, 'Destination Folder' cannot contain non-ascii characters \ + (special characters or diacritics). Please choose another location." + MessageBox MB_OK|MB_ICONEXCLAMATION "Error: Due to incompatibility with several \ + Python libraries, 'Destination Folder' cannot contain non-ascii characters \ + (special characters or diacritics). Please choose another location." \ + /SD IDOK + abort + + valid_path: + + Push $R1 + ${IsWritable} $INSTDIR $R1 + IntCmp $R1 0 pathgood + Pop $R1 + DetailPrint "::error: Path $INSTDIR is not writable. Please check permissions or \ + try respawning the installer with elevated privileges." + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: Path $INSTDIR is not writable. Please check permissions or \ + try respawning the installer with elevated privileges." \ + /SD IDOK + Abort + + pathgood: + Pop $R1 + +FunctionEnd + +Function .onVerifyInstDir + ${LogSet} on + StrLen $0 $Desktop + StrCpy $0 $INSTDIR $0 + StrCmp $0 $Desktop 0 PathGood + Abort + PathGood: +FunctionEnd + +Function un.OnDirectoryLeave + MessageBox MB_YESNO \ + "Are you sure you want to remove '$INSTDIR' and all of its contents?" \ + /SD IDYES \ + IDYES confirmed_yes IDNO confirmed_no + confirmed_no: + MessageBox MB_OK|MB_ICONSTOP "Uninstallation aborted by user." /SD IDOK + Quit + confirmed_yes: +FunctionEnd + +# Make function available for both installer and uninstaller +# Uninstaller functions need an `un.` prefix, so we use a macro to do both +# see https://nsis.sourceforge.io/Sharing_functions_between_Installer_and_Uninstaller +!macro AbortRetryNSExecWaitMacro un + Function ${un}AbortRetryNSExecWait + # This function expects three arguments in the stack + # $1: 'WithLog' or 'NoLog': Use ExecToLog or just Exec, respectively + # $2: The message to show if an error occurred + # $3: The command to run, quoted + # Note that the args need to be pushed to the stack in reverse order! + # Search 'AbortRetryNSExecWait' in this script to see examples + ${LogSet} on + Pop $1 + Pop $2 + Pop $3 + ${Do} + ${If} $1 == "WithLog" + nsExec::ExecToLog $3 + ${ElseIf} $1 == "NoLog" + nsExec::Exec $3 + ${Else} + DetailPrint "::error:: AbortRetryNSExecWait: 1st argument must be 'WithLog' or 'NoLog'. You used: $1" + Abort + ${EndIf} + pop $0 + ${If} $0 != "0" + DetailPrint "::error:: $2" + MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION|MB_DEFBUTTON3 \ + $2 /SD IDIGNORE IDABORT abort IDRETRY retry + ; IDIGNORE: Continue anyway + StrCpy $0 "0" + goto retry + abort: + ; Abort installation + Abort + retry: + ; Retry the nsExec command + ${EndIf} + ${LoopWhile} $0 != "0" + FunctionEnd +!macroend +!insertmacro AbortRetryNSExecWaitMacro "" +!insertmacro AbortRetryNSExecWaitMacro "un." + +# Installer sections +Section "Install" + ${LogSet} on + + ${If} ${Silent} + call OnDirectoryLeave + ${EndIf} + + SetOutPath "$INSTDIR\Lib" + File "@NSIS_DIR@\_nsis.py" + File "@NSIS_DIR@\_system_path.py" + + # Resolve INSTDIR so that paths and registry keys do not contain '..' or similar strings. + # $0 is empty if the directory doesn't exist, but the File commands should have created it already. + GetFullPathName $0 $INSTDIR + ${If} $0 == "" + MessageBox MB_ICONSTOP "Error resolving installation directory." /SD IDABORT + Quit + ${EndIf} + StrCpy $INSTDIR $0 + + ReadEnvStr $0 SystemRoot + # set PATH for the installer process, so that MSVC runtimes get found OK + # This is also isolating PATH to be just us and Windows core stuff, which hopefully avoids + # clashes with other stuff on PATH + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PATH", \ + "$INSTDIR;$INSTDIR\Library\mingw-w64\bin;$INSTDIR\Library\usr\bin;$INSTDIR\Library\bin;$INSTDIR\Scripts;$INSTDIR\bin;$0;$0\system32;$0\system32\Wbem").r0' + + # A conda-meta\history file is required for a valid conda prefix + SetOutPath "$INSTDIR\conda-meta" + File __CONDA_HISTORY__ + + SetOutPath "$INSTDIR" + File __CONDA_EXE__ + File __PRE_UNINSTALL__ + + # Copy extra files (code generated on winexe.py) + @EXTRA_FILES@ + + ${If} $InstMode = ${JUST_ME} + SetOutPath "$INSTDIR" + FileOpen $0 ".nonadmin" w + FileClose $0 + ${EndIf} + + SetOutPath "$INSTDIR\pkgs" + File __URLS_FILE__ + File __URLS_TXT_FILE__ +#if pre_install_exists is True + File __PRE_INSTALL__ +#endif + File __POST_INSTALL__ + File /nonfatal /r __INDEX_CACHE__ + File /r __REPODATA_RECORD__ + + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_SAFETY_CHECKS", "disabled").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_EXTRA_SAFETY_CHECKS", "no").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_PKGS_DIRS", "$INSTDIR\pkgs")".r0' + # Extra info for pre and post install scripts + # NOTE: If more vars are added, make sure to update the examples/scripts tests too + # There's a similar block for the pre_uninstall script, further down this file. + # Update that one as well! + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "${VERSION}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' + + @PKG_COMMANDS@ + + SetDetailsPrint TextOnly + DetailPrint "Setting up the package cache..." + push '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --extract-conda-pkgs' + push 'Failed to extract packages' + push 'NoLog' + # We use NoLog here because TQDM progress bars are parsed as a single line in NSIS 3.08 + # These can crash the installer if they get too long (a few packages is enough!) + call AbortRetryNSExecWait + SetDetailsPrint both + + IfFileExists "$INSTDIR\pkgs\pre_install.bat" 0 NoPreInstall + DetailPrint "Running pre_install scripts..." + ReadEnvStr $5 SystemRoot + ReadEnvStr $6 windir + # This 'FileExists' also returns True for directories + ${If} ${FileExists} "$5" + push '"$5\System32\cmd.exe" /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${ElseIf} ${FileExists} "$6" + push '"$6\System32\cmd.exe" /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${Else} + # Cross our fingers CMD is in PATH + push 'cmd.exe /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${EndIf} + push "Failed to run pre_install" + push 'WithLog' + call AbortRetryNSExecWait + NoPreInstall: + + @SETUP_ENVS@ + + @WRITE_CONDARC@ + + AddSize @SIZE@ + + ${If} $Ana_CreateShortcuts_State = ${BST_CHECKED} + DetailPrint "Creating @NAME@ menus..." + push '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --make-menus @MENU_PKGS@' + push 'Failed to create menus' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + +#if has_conda is True + DetailPrint "Initializing conda directories..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" mkdirs' + push 'Failed to initialize conda directories' + push 'WithLog' + call AbortRetryNSExecWait +#endif + + ${If} $Ana_PostInstall_State = ${BST_CHECKED} + DetailPrint "Running post install..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" post_install' + push 'Failed to run post install script' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + ${If} $Ana_ClearPkgCache_State = ${BST_CHECKED} + DetailPrint "Clearing package cache..." + push '"$INSTDIR\_conda.exe" clean --all --yes' + push 'Failed to clear package cache' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + ${If} $Ana_AddToPath_State = ${BST_CHECKED} + DetailPrint "Adding to PATH..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" addpath ${PYVERSION} ${NAME} ${VERSION} ${ARCH}' + push 'Failed to add @NAME@ to the system PATH' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + # Create registry entries saying this is the system Python + # (for this version) + !define PYREG "Software\Python\PythonCore\${PY_VER}" + ${If} $Ana_RegisterSystemPython_State == ${BST_CHECKED} + WriteRegStr SHCTX "${PYREG}\Help\Main Python Documentation" \ + "Main Python Documentation" \ + "$INSTDIR\Doc\python${PYVERSION_JUSTDIGITS}.chm" + + WriteRegStr SHCTX "${PYREG}\InstallPath" "" "$INSTDIR" + + WriteRegStr SHCTX "${PYREG}\InstallPath\InstallGroup" \ + "" "Python ${PY_VER}" + + WriteRegStr SHCTX "${PYREG}\Modules" "" "" + WriteRegStr SHCTX "${PYREG}\PythonPath" \ + "" "$INSTDIR\Lib;$INSTDIR\DLLs" + ${EndIf} + + ${If} $ARGV_NoRegistry == "0" + # Delete registry entries for environment variables set by PothosSDR + # With admin rights, we can delete them + ${If} ${UAC_IsAdmin} + DetailPrint "Deleting PothosSDR registry environment variables..." + !define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + DeleteRegValue ${env_hklm} "GR_PREFIX" + DeleteRegValue ${env_hklm} "GRC_BLOCKS_PATH" + DeleteRegValue ${env_hklm} "UHD_PKG_PATH" + DeleteRegValue ${env_hklm} "VOLK_PREFIX" + # Without admin rights, we have to shadow them with empty values set for the user + ${Else} + DetailPrint "Overriding PothosSDR registry environment variables for user..." + !define env_hkcu 'HKCU "Environment"' + WriteRegExpandStr ${env_hkcu} "GR_PREFIX" "" + WriteRegExpandStr ${env_hkcu} "GRC_BLOCKS_PATH" "" + WriteRegExpandStr ${env_hkcu} "UHD_PKG_PATH" "" + WriteRegExpandStr ${env_hkcu} "VOLK_PREFIX" "" + ${EndIf} + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + # Registry uninstall info + WriteRegStr SHCTX "${UNINSTREG}" "DisplayName" "${UNINSTALL_NAME}" + WriteRegStr SHCTX "${UNINSTREG}" "DisplayVersion" "${VERSION}" + WriteRegStr SHCTX "${UNINSTREG}" "Publisher" "${COMPANY}" + WriteRegStr SHCTX "${UNINSTREG}" "UninstallString" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\"" + WriteRegStr SHCTX "${UNINSTREG}" "QuietUninstallString" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\" /S" + WriteRegStr SHCTX "${UNINSTREG}" "DisplayIcon" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\"" + + WriteRegDWORD SHCTX "${UNINSTREG}" "NoModify" 1 + WriteRegDWORD SHCTX "${UNINSTREG}" "NoRepair" 1 + ${EndIf} + + WriteUninstaller "$INSTDIR\Uninstall-${NAME}.exe" + + # To address CVE-2022-26526. + # Revoke the write permission on directory "$INSTDIR" for Users if this is + # being run with administrative privileges. Users are: + # AU - authenticated users + # BU - built-in (local) users + # DU - domain users + ${If} ${UAC_IsAdmin} + DetailPrint "Setting installation directory permissions..." + AccessControl::DisableFileInheritance "$INSTDIR" + AccessControl::RevokeOnFile "$INSTDIR" "(AU)" "GenericWrite" + AccessControl::RevokeOnFile "$INSTDIR" "(DU)" "GenericWrite" + AccessControl::RevokeOnFile "$INSTDIR" "(BU)" "GenericWrite" + AccessControl::SetOnFile "$INSTDIR" "(BU)" "GenericRead + GenericExecute" + AccessControl::SetOnFile "$INSTDIR" "(DU)" "GenericRead + GenericExecute" + ${EndIf} +SectionEnd + +!macro AbortRetryNSExecWaitLibNsisCmd cmd + SetDetailsPrint both + DetailPrint "Running ${cmd} scripts..." + SetDetailsPrint listonly + ${If} ${Silent} + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" ${cmd}' + ${Else} + push '"$INSTDIR\python.exe" -E -s "$INSTDIR\Lib\_nsis.py" ${cmd}' + ${EndIf} + push "Failed to run ${cmd}" + push 'WithLog' + call un.AbortRetryNSExecWait + SetDetailsPrint both +!macroend + +Section "Uninstall" + # Remove menu items, path entries + + DetailPrint "Deleting @NAME@ menus..." + nsExec::ExecToLog '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --rm-menus' + + # ensure that MSVC runtime DLLs are on PATH during uninstallation + ReadEnvStr $0 PATH + # set PATH for the installer process, so that MSVC runtimes get found OK + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PATH", \ + "$INSTDIR;$INSTDIR\Library\mingw-w64\bin;$INSTDIR\Library\usr\bin;$INSTDIR\Library\bin;$INSTDIR\Scripts;$INSTDIR\bin;$0;$0\system32;$0\system32\Wbem").r0' + + # our newest Python builds have a patch that allows us to control the PATH search stuff much more + # carefully. More info at https://docs.conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#solution + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_DLL_SEARCH_MODIFICATION_ENABLE", "1").r0' + + # Read variables the uninstaller needs from the registry + StrCpy $R0 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + StrLen $R1 "Uninstall-${NAME}.exe" + IntOp $R1 $R1 + 3 + StrCpy $0 0 + loop_path: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_path + StrCpy $2 "$R0\$1" + ReadRegStr $4 SHCTX $2 "UninstallString" + StrLen $5 $4 + IntOp $5 $5 - $R1 + StrCpy $4 $4 $5 1 + ${If} $4 == $INSTDIR + StrCpy $INSTALLER_NAME_FULL $1 + ReadRegStr $INSTALLER_VERSION SHCTX $2 "DisplayVersion" + goto endloop_path + ${EndIf} + IntOp $0 $0 + 1 + goto loop_path + endloop_path: + + # Extra info for pre_uninstall scripts + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' + StrCpy $0 ${VERSION} + ${If} $INSTALLER_VERSION != "" + StrCpy $0 $INSTALLER_VERSION + ${EndIf} + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "$0").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' + + !insertmacro AbortRetryNSExecWaitLibNsisCmd "pre_uninstall" + !insertmacro AbortRetryNSExecWaitLibNsisCmd "rmpath" + !insertmacro AbortRetryNSExecWaitLibNsisCmd "rmreg" + + DetailPrint "Removing files and folders..." + nsExec::Exec 'cmd.exe /D /C RMDIR /Q /S "$INSTDIR"' + + # In case the last command fails, run the slow method to remove leftover + RMDir /r /REBOOTOK "$INSTDIR" + + # Delete user environment variables that we set during installation + ${IfNot} ${UAC_IsAdmin} + DeleteRegValue ${env_hkcu} "GR_PREFIX" + DeleteRegValue ${env_hkcu} "GRC_BLOCKS_PATH" + DeleteRegValue ${env_hkcu} "UHD_PKG_PATH" + DeleteRegValue ${env_hkcu} "VOLK_PREFIX" + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + ${EndIf} + + ${If} $INSTALLER_NAME_FULL != "" + DeleteRegKey SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTALLER_NAME_FULL" + ${EndIf} + + # If Anaconda was registered as the official Python for this version, + # remove it from the registry + StrCpy $R0 "SOFTWARE\Python\PythonCore" + StrCpy $0 0 + loop_py: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_py + ReadRegStr $2 SHCTX "$R0\$1\InstallPath" "" + ${If} $2 == $INSTDIR + StrCpy $R1 $1 + DeleteRegKey SHCTX "$R0\$1" + goto endloop_py + ${EndIf} + IntOp $0 $0 + 1 + goto loop_py + endloop_py: +SectionEnd + +!if '@SIGNTOOL_COMMAND@' != '' + # Signing for installer and uninstaller; nsis 3.08 required for uninstfinalize! + # "= 0" comparison required to prevent both tasks running in parallel, which would cause signtool to fail + # %1 is replaced by the installer and uninstaller paths, respectively + !finalize '@SIGNTOOL_COMMAND@ "%1"' = 0 + !uninstfinalize '@SIGNTOOL_COMMAND@ "%1"' = 0 +!endif diff --git a/constructor/nsis/main.nsi.tmpl.orig b/constructor/nsis/main.nsi.tmpl.orig new file mode 100644 index 0000000..865ebb3 --- /dev/null +++ b/constructor/nsis/main.nsi.tmpl.orig @@ -0,0 +1,1357 @@ +# Installer template file for creating a Windows installer using NSIS. + +# Dependencies: +# NSIS >=3.08 conda install "nsis>=3.08" (includes extra unicode plugins) + +Unicode "true" + +#if enable_debugging is True +# Special logging build needed for ENABLE_LOGGING +# See https://nsis.sourceforge.io/Special_Builds +!define ENABLE_LOGGING +#endif + +# Comes from https://nsis.sourceforge.io/Logging:Enable_Logs_Quickly +!define LogSet "!insertmacro LogSetMacro" +!macro LogSetMacro SETTING + !ifdef ENABLE_LOGGING + LogSet ${SETTING} + !endif +!macroend + +!define LogText "!insertmacro LogTextMacro" +!macro LogTextMacro INPUT_TEXT + !ifdef ENABLE_LOGGING + LogText ${INPUT_TEXT} + !endif +!macroend + +!include "WinMessages.nsh" +!include "WordFunc.nsh" +!include "LogicLib.nsh" +!include "WinVer.nsh" +!include "MUI2.nsh" +!include "x64.nsh" + +!include "FileFunc.nsh" +!insertmacro GetParameters +!insertmacro GetOptions + +!include "UAC.nsh" +!include "nsDialogs.nsh" + +!include "Utils.nsh" + +!define NAME __NAME__ +!define VERSION __VERSION__ +!define COMPANY __COMPANY__ +!define ARCH __ARCH__ +!define PLATFORM __PLATFORM__ +!define CONSTRUCTOR_VERSION __CONSTRUCTOR_VERSION__ +!define PY_VER __PY_VER__ +!define PYVERSION_JUSTDIGITS __PYVERSION_JUSTDIGITS__ +!define PYVERSION __PYVERSION__ +!define PYVERSION_MAJOR __PYVERSION_MAJOR__ +!define DEFAULT_PREFIX __DEFAULT_PREFIX__ +!define DEFAULT_PREFIX_DOMAIN_USER __DEFAULT_PREFIX_DOMAIN_USER__ +!define DEFAULT_PREFIX_ALL_USERS __DEFAULT_PREFIX_ALL_USERS__ +!define PRE_INSTALL_DESC __PRE_INSTALL_DESC__ +!define POST_INSTALL_DESC __POST_INSTALL_DESC__ +!define MENU_PKGS "@MENU_PKGS@" +!define SHOW_REGISTER_PYTHON __SHOW_REGISTER_PYTHON__ +!define SHOW_ADD_TO_PATH __SHOW_ADD_TO_PATH__ +!define PRODUCT_NAME "${NAME} ${VERSION} (${ARCH})" +!define UNINSTALL_NAME "@UNINSTALL_NAME@" +!define UNINSTREG "SOFTWARE\Microsoft\Windows\CurrentVersion\ + \Uninstall\${UNINSTALL_NAME}" + +var /global INSTDIR_JUSTME +var /global INSTALLER_VERSION +var /global INSTALLER_NAME_FULL + +# UAC shield overlay +!ifndef BCM_SETSHIELD + !define BCM_SETSHIELD 0x0000160C +!endif + +var /global ARGV +var /global ARGV_Help +var /global ARGV_InstallationType +var /global ARGV_AddToPath +var /global ARGV_KeepPkgCache +var /global ARGV_RegisterPython +var /global ARGV_NoRegistry +var /global ARGV_NoScripts +var /global ARGV_NoShortcuts +var /global ARGV_CheckPathLength + +var /global IsDomainUser +var /global CheckPathLength +var /global LongPathsEnabled +var /global InstDirLen + +var /global InstModePage_RadioButton_JustMe +var /global InstModePage_RadioButton_AllUsers + +var /global InstMode # 0 = Just Me, 1 = All Users. +!define JUST_ME 0 +!define ALL_USERS 1 + +# Include this one after our defines +!include "OptionsDialog.nsh" + +CRCCheck On + +# Basic options +Name "${PRODUCT_NAME}" +OutFile __OUTFILE__ +ShowInstDetails "hide" +ShowUninstDetails "hide" +# This installer contains tar.bz2 files, which are already compressed +SetCompress "off" + +# Start off with the lowest permissions and work our way up. +RequestExecutionLevel user + +# Version information & branding text +VIAddVersionKey "ProductName" "${PRODUCT_NAME}" +VIAddVersionKey "FileVersion" "${VERSION}" +VIAddVersionKey "ProductVersion" "${VERSION}" +VIAddVersionKey "CompanyName" "${COMPANY}" +VIAddVersionKey "LegalCopyright" "(c) ${COMPANY}" +VIAddVersionKey "FileDescription" "${NAME} Installer" +VIAddVersionKey "Comments" "Created by constructor ${CONSTRUCTOR_VERSION}" +VIProductVersion __VIPV__ +BrandingText /TRIMLEFT "${COMPANY}" + +# Interface configuration +!define MUI_ICON __ICONFILE__ +!define MUI_UNICON __ICONFILE__ +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP __HEADERIMAGE__ +!define MUI_HEADERIMAGE_UNBITMAP __HEADERIMAGE__ +!define MUI_ABORTWARNING +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_UNFINISHPAGE_NOAUTOCLOSE +!define MUI_WELCOMEFINISHPAGE_BITMAP __WELCOMEIMAGE__ +!define MUI_UNWELCOMEFINISHPAGE_BITMAP __WELCOMEIMAGE__ +#!define MUI_CUSTOMFUNCTION_GUIINIT GuiInit + +# Pages +#!define MUI_PAGE_CUSTOMFUNCTION_SHOW OnStartup +#if custom_welcome +# Custom welcome file(s) +@CUSTOM_WELCOME_FILE@ +#else +!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageIfUACInnerInstance +!insertmacro MUI_PAGE_WELCOME +#endif +!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageIfUACInnerInstance +!insertmacro MUI_PAGE_LICENSE __LICENSEFILE__ +Page Custom InstModePage_Create InstModePage_Leave +!define MUI_PAGE_CUSTOMFUNCTION_PRE DisableBackButtonIfUACInnerInstance +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE OnDirectoryLeave +!insertmacro MUI_PAGE_DIRECTORY +# Custom options now differ depending on installation mode. +Page Custom mui_AnaCustomOptions_Show +!insertmacro MUI_PAGE_INSTFILES +#if with_conclusion_text is True +!define MUI_FINISHPAGE_TITLE __CONCLUSION_TITLE__ +!define MUI_FINISHPAGE_TITLE_3LINES +!define MUI_FINISHPAGE_TEXT __CONCLUSION_TEXT__ +#endif + +# Custom conclusion file(s) +@CUSTOM_CONCLUSION_FILE@ + +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_WELCOME +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.OnDirectoryLeave +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +# Language +!insertmacro MUI_LANGUAGE "English" + +Function SkipPageIfUACInnerInstance + ${LogSet} on + ${If} ${UAC_IsInnerInstance} + Abort + ${EndIf} +FunctionEnd + +!macro DoElevation + GetDlgItem $1 $HWNDParent 1 + System::Call user32::GetFocus()i.s + # Disable 'Next' button. + EnableWindow $1 0 + !insertmacro UAC_PageElevation_RunElevated + EnableWindow $1 1 + System::call user32::SetFocus(is) + ${If} $2 = 0x666 + MessageBox MB_ICONEXCLAMATION \ + "You need to log in with an administrative account \ + in order to perform an 'All Users' installation." + Abort + ${ElseIf} $0 = 1223 + # UAC canceled by user. + Abort + ${Else} + ${If} $0 <> 0 + ${If} $0 = 1062 + MessageBox MB_ICONSTOP \ + "Elevation failed; Secondary Logon service is \ + not running." + ${Else} + MessageBox MB_ICONSTOP \ + "Elevation failed; error code: $0." + ${EndIf} + Abort + ${EndIf} + ${EndIf} + # UAC worked, we're the outer installer, so we can quit. + Quit +!macroend + + +!macro ParseCommandLineArgs + ClearErrors + ${GetParameters} $ARGV + ${GetOptions} $ARGV "/?" $ARGV_Help + ${IfNot} ${Errors} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Usage: $EXEFILE [options]$\n\ + Options:$\n$\n\ + /InstallationType=AllUsers [default: JustMe]$\n$\n\ + /AddToPath=[0|1] [default: 0]$\n$\n\ +#if keep_pkgs is True + /KeepPkgCache=[0|1] [default: 1]$\n$\n\ +#endif +#if keep_pkgs is False + /KeepPkgCache=[0|1] [default: 0]$\n$\n\ +#endif + /RegisterPython=[0|1] [default: AllUsers: 1, JustMe: 0]$\n$\n\ + /NoRegistry=[0|1] [default: AllUsers: 0, JustMe: 0]$\n$\n\ + /NoScripts=[0|1] [default: 0]$\n$\n\ + /NoShortcuts=[0|1] [default: 0]$\n$\n\ + /CheckPathLength=[0|1] [default: 1]$\n$\n\ + Examples:$\n\ + Install for all users, but don't add to PATH env var:$\n\ + $EXEFILE /InstallationType=AllUsers$\n$\n\ + Install for just me, add to PATH and register as system Python:$\n\ + $EXEFILE /RegisterPython=1 /AddToPath=1$\n$\n\ + Install for just me, with no registry modification (for CI):$\n\ + $EXEFILE /NoRegistry=1$\n$\n\ + NOTE: If you install for AllUsers, then the option to AddToPath$\n\ + is disabled (i.e. if ./InstallationType=AllUsers, then$\n\ + /AddToPath=1 will be ignored).$\n" \ + /SD IDOK + Abort + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/InstallationType=" $ARGV_InstallationType + ${IfNot} ${Errors} + ${If} $ARGV_InstallationType == "AllUsers" + StrCpy $InstMode ${ALL_USERS} + ${Else} + StrCpy $InstMode ${JUST_ME} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/RegisterPython=" $ARGV_RegisterPython + ${IfNot} ${Errors} + ${If} $ARGV_RegisterPython = "1" + StrCpy $Ana_RegisterSystemPython_State ${BST_CHECKED} + ${ElseIf} $ARGV_RegisterPython = "0" + StrCpy $Ana_RegisterSystemPython_State ${BST_UNCHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/KeepPkgCache=" $ARGV_KeepPkgCache + ${If} ${Errors} + StrCpy $ARGV_KeepPkgCache "@KEEP_PKGS@" + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoRegistry=" $ARGV_NoRegistry + ${If} ${Errors} + StrCpy $ARGV_NoRegistry "0" + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoScripts=" $ARGV_NoScripts + ${IfNot} ${Errors} + ${If} $ARGV_NoScripts = "1" + StrCpy $Ana_PostInstall_State ${BST_UNCHECKED} + ${ElseIf} $ARGV_NoScripts = "0" + StrCpy $Ana_PostInstall_State ${BST_CHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoShortcuts=" $ARGV_NoShortcuts + ${IfNot} ${Errors} + ${If} $ARGV_NoShortcuts = "1" + StrCpy $Ana_CreateShortcuts_State ${BST_UNCHECKED} + ${ElseIf} $ARGV_NoShortcuts = "0" + StrCpy $Ana_CreateShortcuts_State ${BST_CHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/CheckPathLength=" $ARGV_CheckPathLength + ${IfNot} ${Errors} + ${If} $ARGV_CheckPathLength = "0" + StrCpy $CheckPathLength "0" + ${ElseIf} $ARGV_CheckPathLength = "1" + StrCpy $CheckPathLength "1" + ${EndIf} + ${EndIf} + +!macroend + +Function OnInit_Release + ${LogSet} on + !insertmacro ParseCommandLineArgs + + # Parsing the AddToPath option here (and not in ParseCommandLineArgs) to prevent the MessageBox from showing twice. + # For more context, see https://github.com/conda/constructor/pull/584#issuecomment-1347688020 + ClearErrors + ${GetOptions} $ARGV "/AddToPath=" $ARGV_AddToPath + ${IfNot} ${Errors} + ${If} $ARGV_AddToPath = "1" + ${If} $InstMode == ${ALL_USERS} + # To address CVE-2022-26526. + # In AllUsers install mode, do not allow AddToPath as an option. + MessageBox MB_OK|MB_ICONEXCLAMATION "/AddToPath=1 is disabled and ignored in 'All Users' installations" /SD IDOK + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} + ${Else} + StrCpy $Ana_AddToPath_State ${BST_CHECKED} + ${EndIf} + ${ElseIf} $ARGV_AddToPath = "0" + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} + ${EndIf} + ${EndIf} +FunctionEnd + +Function InstModePage_RadioButton_OnClick + ${LogSet} on + Exch $0 + Push $1 + Push $2 + + nsDialogs::GetUserData $0 + Pop $1 + GetDlgItem $2 $HWNDParent 1 + SendMessage $2 ${BCM_SETSHIELD} 0 $1 + + Pop $2 + Pop $1 + Exch $0 +FunctionEnd + +Function InstModePage_Create + ${LogSet} on + Push $0 + Push $1 + Push $2 + Push $3 + + ${If} ${UAC_IsInnerInstance} + Abort + ${EndIf} + + !insertmacro MUI_HEADER_TEXT_PAGE \ + "Select Installation Type" \ + "Please select the type of installation you would like to perform \ + for ${PRODUCT_NAME}." + + GetFunctionAddress $0 InstModePage_RadioButton_OnClick + nsDialogs::Create /NOUNLOAD 1018 + Pop $1 + ${NSD_OnBack} RemoveNextBtnShield + ${NSD_CreateLabel} 0 20u 75% 20u "Install for:" + ${NSD_CreateRadioButton} 0 40u 75% 15u "Just Me (recommended)" + Pop $2 + #MessageBox MB_OK "OnClick 2! 0: $0, 1: $1, 2: $2" + StrCpy $InstModePage_RadioButton_JustMe $2 + + nsDialogs::OnClick $2 $0 + nsDialogs::SetUserData $2 0 + SendMessage $2 ${BM_CLICK} 0 0 + + ${NSD_CreateRadioButton} 0 60u 75% 15u \ + "All Users (requires admin privileges)" + #MessageBox MB_OK "OnClick 3! 0: $0, 1: $1, 2: $2, 3: $3" + Pop $3 + StrCpy $InstModePage_RadioButton_AllUsers $3 + nsDialogs::OnClick $3 $0 + nsDialogs::SetUserData $3 1 + ${IfThen} $InstMode <> ${JUST_ME} ${|} SendMessage $3 ${BM_CLICK} 0 0 ${|} + Push $3 + nsDialogs::Show + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function DisableBackButtonIfUACInnerInstance + ${LogSet} on + Push $0 + ${If} ${UAC_IsInnerInstance} + GetDlgItem $0 $HWNDParent 3 + EnableWindow $0 0 + ${EndIf} + Pop $0 +FunctionEnd + +Function RemoveNextBtnShield + ${LogSet} on + Push $0 + GetDlgItem $0 $HWNDParent 1 + SendMessage $0 ${BCM_SETSHIELD} 0 0 + Pop $0 +FunctionEnd + +Function InstModeChanged + ${LogSet} on + # When using the installer with /S (silent mode), the /D option sets $INSTDIR, + # and it is therefore important not to overwrite $INSTDIR here, but it is also + # important that we do call SetShellVarContext with the appropriate value. + Push $0 + ${If} $InstMode = ${JUST_ME} + SetShellVarContext Current + # If we're on Vista+, the installation directory will + # have a nice, no-space name like: + # C:\Users\Trent\AppData\Local\Continuum\Anaconda. + # On 2003/XP, it will be in C:\Documents and Settings, + # with a space. We're allowing spaces now. + ${IfNot} ${Silent} + StrCpy $INSTDIR $INSTDIR_JUSTME + ${EndIf} + ${Else} + SetShellVarContext All + ${IfNot} ${Silent} + ExpandEnvStrings $0 ${DEFAULT_PREFIX_ALL_USERS} + StrCpy $INSTDIR $0 + ${Endif} + ${EndIf} + Pop $0 +FunctionEnd + +!macro SetInstMode mode + StrCpy $InstMode ${mode} + Call InstModeChanged +!macroend + +Function InstModePage_Leave + ${LogSet} on + Push $0 + Push $1 + Push $2 + + ${NSD_GetState} $InstModePage_RadioButton_AllUsers $0 + ${If} $0 = 0 + !insertmacro SetInstMode ${JUST_ME} + ${Else} + !insertmacro SetInstMode ${ALL_USERS} + ${IfNot} ${UAC_IsAdmin} + !insertmacro DoElevation + ${EndIf} + ${EndIf} + + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function .onInit + ${LogSet} on + Push $0 + Push $1 + Push $2 + Push $R1 + Push $R2 + + InitPluginsDir + @TEMP_EXTRA_FILES@ + !insertmacro ParseCommandLineArgs + + # Select the correct registry to look at, depending + # on whether it's a 32-bit or 64-bit installer + SetRegView @BITS@ +#if win64 + # If we're a 64-bit installer, make sure it's 64-bit Windows + ${IfNot} ${RunningX64} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "This installer is for a 64-bit version for ${NAME}$\n\ + but your system is 32-bit. Please use the 32-bit Windows$\n\ + ${NAME} installer." \ + /SD IDOK + Abort + ${EndIf} +#endif + + !insertmacro UAC_PageElevation_OnInit + ${If} ${UAC_IsInnerInstance} + ${AndIfNot} ${UAC_IsAdmin} + SetErrorLevel 0x666 + Quit + ${EndIf} + + # Look for a number of signs that indicate the user is a domain user and + # alter the default installation directory for 'Just Me' accordingly. We + # want to ensure that if we're a user domain account, we always install to + # %LOCALAPPDATA% (i.e. C:\Users\Trent\AppData\Local\Continuum\Anaconda), + # as this is the only place guaranteed to not be backed by a network share + # or included in a user's roaming profile. However, if we're a normal user + # account, then C:\Users\Trent\Anaconda is fine. + ReadEnvStr $0 USERDNSDOMAIN + ${If} $0 != "" + # If not null, USERDNSDOMAIN is an unambiguous indication that we're + # logged into a domain account. + StrCpy $IsDomainUser 1 + ${Else} + # If it's not set, apply some simple heuristics to discern whether or + # not we're logged in as a domain user. + ReadEnvStr $0 LOGONSERVER + ${If} $0 == "" + # This should never be unset; but if it is, we're definitely not + # a domain user. + StrCpy $IsDomainUser 0 + ${Else} + StrCpy $1 $0 "" 2 # lop-off the leading \\. + ${StrFilter} $1 "+" "" "" $2 # convert to uppercase, store in $2 + ${If} $2 == "MICROSOFTACCOUNT" + # The new Windows 8.x live accounts have \\MicrosoftAccount + # set as LOGONSERVER; interpret this as being a non-domain + # user. + StrCpy $IsDomainUser 0 + ${Else} + ReadEnvStr $R1 COMPUTERNAME + ${If} $R1 == "" + # This should never be unset either; if it is, assume + # we're not a domain user. + StrCpy $IsDomainUser 0 + ${Else} + # We've got a value for both LOGONSERVER and COMPUTERNAME + # environment variables (which should always be the case). + # Proceed to compare LOGONSERVER[-2:] to COMPUTERNAME; if + # they match, assume we're not a domain user account. + + ${StrFilter} $R1 "+" "" "" $R2 # convert to uppercase + ${If} $2 != $R2 + # COMPUTERNAME doesn't match LOGONSERVER; assume we're + # logged in via a domain account. + StrCpy $IsDomainUser 1 + ${Else} + # COMPUTERNAME matches LOGONSERVER; safe to assume + # we're logged in as a user account. (I guess there's + # the remote possibility a domain user has logged onto + # a server that has the same NetBIOS name as the Active + # Directory name... if that's the case, potentially + # installing Anaconda into an area that gets picked up + # by a roaming profile is the very least of your + # problems.) + StrCpy $IsDomainUser 0 + + ${EndIf} # LOGONSERVER[-2:] != COMPUTERNAME + + ${EndIf} # COMPUTERNAME != "" + + ${EndIf} # LOGONSERVER != "\\MicrosoftAccount" + + ${EndIf} # LOGONSERVER != "" + + ${EndIf} # USERDNSDOMAIN != "" + + ${If} $IsDomainUser = 0 + ExpandEnvStrings $0 ${DEFAULT_PREFIX} + StrCpy $INSTDIR_JUSTME $0 + ${ElseIf} $IsDomainUser = 1 + ExpandEnvStrings $0 ${DEFAULT_PREFIX_DOMAIN_USER} + StrCpy $INSTDIR_JUSTME $0 + ${Else} + # Should never happen; indicates a logic error above. + MessageBox MB_OK "Internal error: IsUserDomain not set properly!" \ + /SD IDOK + Abort + ${EndIf} + + ${If} $InstMode == "" + StrCpy $InstMode ${JUST_ME} + ${IfThen} ${UAC_IsAdmin} ${|} StrCpy $InstMode ${ALL_USERS} ${|} + # If running as 'SYSTEM' then JustMe is not appropriate; note that + # we should advise against this. SCCM has an option to run as user + System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2" + ${IfThen} $0 == "SYSTEM" ${|} StrCpy $InstMode ${ALL_USERS} ${|} + ${EndIf} + call InstModeChanged + + ${If} ${Silent} + ${If} $InstMode == ${ALL_USERS} + ${IfNot} ${UAC_IsAdmin} + MessageBox MB_ICONSTOP "Installation for all users requires an elevated prompt." + Abort + ${EndIF} + ${EndIF} + ${EndIF} + + ; /D was not used, add default based on install type + ${If} $InstDir == "" + ${If} $InstMode == ${ALL_USERS} + ExpandEnvStrings $0 ${DEFAULT_PREFIX_ALL_USERS} + StrCpy $INSTDIR $0 + ${Else} + strcpy $INSTDIR $INSTDIR_JUSTME + ${EndIf} + ${EndIf} + + ; Set default value + ${If} $CheckPathLength == "" + StrCpy $CheckPathLength "1" + ${EndIf} + + # Initialize the default settings for the anaconda custom options + Call mui_AnaCustomOptions_InitDefaults + # Override custom options with explicitly given values from contruct.yaml. + # If initialize_by_default (register_python_default) is None, do nothing. +#if initialize_conda is True and initialize_by_default is True + ${If} $InstMode == ${JUST_ME} + StrCpy $Ana_AddToPath_State ${BST_CHECKED} + ${EndIF} +#endif +#if initialize_conda is True and initialize_by_default is False + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} +#endif +#if register_python is True and register_python_default is True + StrCpy $Ana_RegisterSystemPython_State ${BST_CHECKED} +#endif +#if register_python is True and register_python_default is False + StrCpy $Ana_RegisterSystemPython_State ${BST_UNCHECKED} +#endif +#if check_path_length is True + StrCpy $CheckPathLength "1" +#endif +#if check_path_length is False + StrCpy $CheckPathLength "0" +#endif +#if keep_pkgs is True + StrCpy $Ana_ClearPkgCache_State ${BST_UNCHECKED} +#endif +#if keep_pkgs is False + StrCpy $Ana_ClearPkgCache_State ${BST_CHECKED} +#endif +#if pre_install_exists is True + StrCpy $Ana_PreInstall_State ${BST_CHECKED} +#endif +#if pre_install_exists is False + StrCpy $Ana_PreInstall_State ${BST_UNCHECKED} +#endif +#if post_install_exists is True + StrCpy $Ana_PostInstall_State ${BST_CHECKED} +#endif +#if post_install_exists is False + StrCpy $Ana_PostInstall_State ${BST_UNCHECKED} +#endif + + Call OnInit_Release + + Pop $R2 + Pop $R1 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function un.onInit + Push $0 + Push $1 + Push $2 + Push $3 + + # Resolve INSTDIR + GetFullPathName $0 $INSTDIR + # If the directory does not exist or cannot be resolved, $0 will be empty + StrCmp $0 "" invalid_dir + StrCpy $INSTDIR $0 + + # Never run the uninstaller when $INSTDIR points at system-critical directories + + StrLen $InstDirLen $INSTDIR + # INSTDIR is a full path and has no trailing backslash, + # so if its length is 2, it is pointed at a system root + StrCmp $InstdirLen 2 invalid_dir + + # Never delete anything inside Windows + StrCpy $0 $INSTDIR 7 3 + StrCmp $0 "Windows" invalid_dir + + StrCpy $0 "ALLUSERSPROFILE APPDATA LOCALAPPDATA PROGRAMDATA PROGRAMFILES PROGRAMFILES(x86) PUBLIC SYSTEMDRIVE SYSTEMROOT USERPROFILE" + StrCpy $1 1 + loop_critical: + ${WordFind} $0 " " "E+$1" $2 + IfErrors endloop_critical + ReadEnvStr $3 $2 + StrCmp $3 $INSTDIR invalid_dir + IntOp $1 $1 + 1 + goto loop_critical + endloop_critical: + + # Primitive check to see that $INSTDIR points to a conda directory + StrCpy $0 "_conda.exe conda-meta\history" + StrCpy $1 1 + loop_conda: + ${WordFind} $0 " " "E+$1" $2 + IfErrors endloop_conda + IfFileExists $INSTDIR\$2 0 invalid_dir + IntOp $1 $1 + 1 + goto loop_conda + endloop_conda: + + # All checks have passed + goto valid_dir + + invalid_dir: + MessageBox MB_OK|MB_ICONSTOP \ + "Error: $INSTDIR is not a valid conda directory. Please run the uninstaller from a conda directory." \ + /SD IDABORT + abort + valid_dir: + + # Select the correct registry to look at, depending + # on whether it's a 32-bit or 64-bit installer + SetRegView @BITS@ + + # Since the switch to a dual-mode installer (All Users/Just Me), the + # uninstaller will inherit the requested execution level of the main + # installer -- which we now have to set to 'user'. Thus, Windows will + # not automatically elevate the uninstaller for us -- we need to do it + # ourselves if we're not a 'Just Me' installation. + !insertmacro UAC_PageElevation_OnInit + ${IfNot} ${FileExists} "$INSTDIR\.nonadmin" + ${AndIfNot} ${UAC_IsAdmin} + !insertmacro DoElevation + ${EndIf} + + ${If} ${FileExists} "$INSTDIR\.nonadmin" + SetShellVarContext Current + ${Else} + SetShellVarContext All + ${EndIf} + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +# http://nsis.sourceforge.net/Check_for_spaces_in_a_directory_path +Function CheckForSpaces + ${LogSet} on + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + StrCpy $R1 -1 + StrCpy $R3 $R0 + StrCpy $R0 0 + loop: + StrCpy $R2 $R3 1 $R1 + IntOp $R1 $R1 - 1 + StrCmp $R2 "" done + StrCmp $R2 " " 0 loop + IntOp $R0 $R0 + 1 + Goto loop + done: + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +# http://nsis.sourceforge.net/StrCSpn,_StrCSpnReverse:_Scan_strings_for_characters +Function StrCSpn + ${LogSet} on + Exch $R0 ; string to check + Exch + Exch $R1 ; string of chars + Push $R2 ; current char + Push $R3 ; current char + Push $R4 ; char loop + Push $R5 ; char loop + + StrCpy $R4 -1 + + NextChar: + StrCpy $R2 $R1 1 $R4 + IntOp $R4 $R4 - 1 + StrCmp $R2 "" StrOK + + StrCpy $R5 -1 + + NextCharCheck: + StrCpy $R3 $R0 1 $R5 + IntOp $R5 $R5 - 1 + StrCmp $R3 "" NextChar + StrCmp $R3 $R2 0 NextCharCheck + StrCpy $R0 $R2 + Goto Done + + StrOK: + StrCpy $R0 "" + + Done: + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +# http://stackoverflow.com/a/29569614/1170370 +!macro _IsNonEmptyDirectory _a _b _t _f +!insertmacro _LOGICLIB_TEMP +!insertmacro _IncreaseCounter +Push $0 +FindFirst $0 $_LOGICLIB_TEMP "${_b}\*" +_IsNonEmptyDirectory_loop${LOGICLIB_COUNTER}: + StrCmp "" $_LOGICLIB_TEMP _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} + StrCmp "." $_LOGICLIB_TEMP +2 + StrCmp ".." $_LOGICLIB_TEMP 0 _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} + FindNext $0 $_LOGICLIB_TEMP + Goto _IsNonEmptyDirectory_loop${LOGICLIB_COUNTER} +_IsNonEmptyDirectory_done${LOGICLIB_COUNTER}: +FindClose $0 +Pop $0 +!insertmacro _!= "" $_LOGICLIB_TEMP `${_t}` `${_f}` +!macroend +!define IsNonEmptyDirectory `"" IsNonEmptyDirectory` + + +Function OnDirectoryLeave + ${LogSet} on + ${If} ${IsNonEmptyDirectory} "$InstDir" + DetailPrint "::error:: Directory '$INSTDIR' is not empty, please choose a different location." + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Directory '$INSTDIR' is not empty,$\n\ + please choose a different location." \ + /SD IDOK + Abort + ${EndIf} + + ReadRegStr $LongPathsEnabled HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" + StrLen $InstDirLen "$InstDir" + + ${If} $CheckPathLength == "1" + ${AndIf} $LongPathsEnabled == "0" + ${AndIf} $InstDirLen > 46 + ; With windows 10, we can enable support for long path, for earlier + ; version, suggest user to use shorter installation path + ${If} ${AtLeastWin10} + ${AndIfNot} $ARGV_NoRegistry = "1" + ; If we have admin right, we enable long path on windows + ${If} ${UAC_IsAdmin} + WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1 + ; If we don't have admin right, we suggest a shorter path or suggest to run with admin right + ${Else} + DetailPrint "::error:: The installation path should be shorter than 46 characters or \ + the installation requires administrator rights to enable long \ + path on Windows." + MessageBox MB_OK|MB_ICONSTOP "The installation path should be shorter than 46 characters or \ + the installation requires administrator rights to enable long \ + path on Windows." \ + /SD IDOK + Abort + ${EndIf} + ; If we don't have admin right, we suggest a shorter path or suggest to run with admin right + ${Else} + DetailPrint "::error:: The installation path should be shorter than 46 characters. \ + Please choose another location." + MessageBox MB_OK|MB_ICONSTOP "The installation path should be shorter than 46 characters. \ + Please choose another location." \ + /SD IDOK + Abort + ${EndIf} + ${EndIf} + + # Call the CheckForSpaces function. + Push $INSTDIR # Input string (install path). + Call CheckForSpaces + Pop $R0 # The function returns the number of spaces found in the input string. + + Push $R7 + Push $R8 + Push $R9 + # Check if any spaces exist in $INSTDIR. + StrCmp $R0 0 NoSpaces + + # Plural if more than 1 space in $INSTDIR. + StrCmp $R0 1 0 +3 + StrCpy $R1 "" + Goto +2 + StrCpy $R1 "s" + + ${If} ${Silent} + StrCpy $R7 " " + ${Else} + StrCpy $R7 "$\n" + ${EndIf} + StrCpy $R8 "'Destination Folder' contains $R0 space$R1.$R7This can cause problems with several conda packages.$R7" +#if check_path_spaces is True + StrCpy $R8 "$R8Please remove the space$R1 from the destination folder." + StrCpy $R9 "Error" +#else + StrCpy $R8 "$R8Please consider removing the space$R1." + StrCpy $R9 "Warning" +#endif + # Show message box then take the user back to the Directory page. + ${If} ${Silent} + DetailPrint "::$R9:: $R8" + ${Else} + MessageBox MB_OK|MB_ICONINFORMATION "$R9: $R8" /SD IDOK + ${EndIf} +#if check_path_spaces is True + abort +#endif + NoSpaces: + Pop $R7 + Pop $R8 + Pop $R9 + + # List of characters not allowed anywhere in $INSTDIR + Push "^%!=," + Push $INSTDIR + Call StrCSpn + Pop $R0 + + StrCmp $R0 "" NoInvalidCharaceters + DetailPrint "::error:: 'Destination Folder' contains the following invalid character: $R0" + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: 'Destination Folder' contains the following invalid character: $R0" \ + /SD IDOK + abort + NoInvalidCharaceters: + + UnicodePathTest::SpecialCharPathTest $INSTDIR + Pop $R1 + StrCmp $R1 "nothingspecial" nothing_special_path + DetailPrint "::error:: 'Destination Folder' contains the following invalid character$R1" + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: 'Destination Folder' contains the following invalid character$R1" \ + /SD IDOK + abort + nothing_special_path: + + ; test if path contains unicode characters + UnicodePathTest::UnicodePathTest $INSTDIR + Pop $R1 + + # Python 3 can be installed in a CP_ACP path until MKL is Unicode capable. + # (mkl_rt.dll calls LoadLibraryA() to load mkl_intel_thread.dll) + # Python 2 can only be installed to an ASCII path. + StrCmp $R1 "ascii" valid_path + StrCmp ${PY_VER} "2.7" not_cp_acp_capable + StrCmp $R1 "ascii_cp_acp" valid_path + not_cp_acp_capable: + DetailPrint "::error:: Due to incompatibility with several \ + Python libraries, 'Destination Folder' cannot contain non-ascii characters \ + (special characters or diacritics). Please choose another location." + MessageBox MB_OK|MB_ICONEXCLAMATION "Error: Due to incompatibility with several \ + Python libraries, 'Destination Folder' cannot contain non-ascii characters \ + (special characters or diacritics). Please choose another location." \ + /SD IDOK + abort + + valid_path: + + Push $R1 + ${IsWritable} $INSTDIR $R1 + IntCmp $R1 0 pathgood + Pop $R1 + DetailPrint "::error: Path $INSTDIR is not writable. Please check permissions or \ + try respawning the installer with elevated privileges." + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: Path $INSTDIR is not writable. Please check permissions or \ + try respawning the installer with elevated privileges." \ + /SD IDOK + Abort + + pathgood: + Pop $R1 + +FunctionEnd + +Function .onVerifyInstDir + ${LogSet} on + StrLen $0 $Desktop + StrCpy $0 $INSTDIR $0 + StrCmp $0 $Desktop 0 PathGood + Abort + PathGood: +FunctionEnd + +Function un.OnDirectoryLeave + MessageBox MB_YESNO \ + "Are you sure you want to remove '$INSTDIR' and all of its contents?" \ + /SD IDYES \ + IDYES confirmed_yes IDNO confirmed_no + confirmed_no: + MessageBox MB_OK|MB_ICONSTOP "Uninstallation aborted by user." /SD IDOK + Quit + confirmed_yes: +FunctionEnd + +# Make function available for both installer and uninstaller +# Uninstaller functions need an `un.` prefix, so we use a macro to do both +# see https://nsis.sourceforge.io/Sharing_functions_between_Installer_and_Uninstaller +!macro AbortRetryNSExecWaitMacro un + Function ${un}AbortRetryNSExecWait + # This function expects three arguments in the stack + # $1: 'WithLog' or 'NoLog': Use ExecToLog or just Exec, respectively + # $2: The message to show if an error occurred + # $3: The command to run, quoted + # Note that the args need to be pushed to the stack in reverse order! + # Search 'AbortRetryNSExecWait' in this script to see examples + ${LogSet} on + Pop $1 + Pop $2 + Pop $3 + ${Do} + ${If} $1 == "WithLog" + nsExec::ExecToLog $3 + ${ElseIf} $1 == "NoLog" + nsExec::Exec $3 + ${Else} + DetailPrint "::error:: AbortRetryNSExecWait: 1st argument must be 'WithLog' or 'NoLog'. You used: $1" + Abort + ${EndIf} + pop $0 + ${If} $0 != "0" + DetailPrint "::error:: $2" + MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION|MB_DEFBUTTON3 \ + $2 /SD IDIGNORE IDABORT abort IDRETRY retry + ; IDIGNORE: Continue anyway + StrCpy $0 "0" + goto retry + abort: + ; Abort installation + Abort + retry: + ; Retry the nsExec command + ${EndIf} + ${LoopWhile} $0 != "0" + FunctionEnd +!macroend +!insertmacro AbortRetryNSExecWaitMacro "" +!insertmacro AbortRetryNSExecWaitMacro "un." + +# Installer sections +Section "Install" + ${LogSet} on + + ${If} ${Silent} + call OnDirectoryLeave + ${EndIf} + + SetOutPath "$INSTDIR\Lib" + File "@NSIS_DIR@\_nsis.py" + File "@NSIS_DIR@\_system_path.py" + + # Resolve INSTDIR so that paths and registry keys do not contain '..' or similar strings. + # $0 is empty if the directory doesn't exist, but the File commands should have created it already. + GetFullPathName $0 $INSTDIR + ${If} $0 == "" + MessageBox MB_ICONSTOP "Error resolving installation directory." /SD IDABORT + Quit + ${EndIf} + StrCpy $INSTDIR $0 + + ReadEnvStr $0 SystemRoot + # set PATH for the installer process, so that MSVC runtimes get found OK + # This is also isolating PATH to be just us and Windows core stuff, which hopefully avoids + # clashes with other stuff on PATH + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PATH", \ + "$INSTDIR;$INSTDIR\Library\mingw-w64\bin;$INSTDIR\Library\usr\bin;$INSTDIR\Library\bin;$INSTDIR\Scripts;$INSTDIR\bin;$0;$0\system32;$0\system32\Wbem").r0' + + # A conda-meta\history file is required for a valid conda prefix + SetOutPath "$INSTDIR\conda-meta" + File __CONDA_HISTORY__ + + SetOutPath "$INSTDIR" + File __CONDA_EXE__ + File __PRE_UNINSTALL__ + + # Copy extra files (code generated on winexe.py) + @EXTRA_FILES@ + + ${If} $InstMode = ${JUST_ME} + SetOutPath "$INSTDIR" + FileOpen $0 ".nonadmin" w + FileClose $0 + ${EndIf} + + SetOutPath "$INSTDIR\pkgs" + File __URLS_FILE__ + File __URLS_TXT_FILE__ +#if pre_install_exists is True + File __PRE_INSTALL__ +#endif + File __POST_INSTALL__ + File /nonfatal /r __INDEX_CACHE__ + File /r __REPODATA_RECORD__ + + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_SAFETY_CHECKS", "disabled").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_EXTRA_SAFETY_CHECKS", "no").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_PKGS_DIRS", "$INSTDIR\pkgs")".r0' + # Extra info for pre and post install scripts + # NOTE: If more vars are added, make sure to update the examples/scripts tests too + # There's a similar block for the pre_uninstall script, further down this file. + # Update that one as well! + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "${VERSION}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' + + @PKG_COMMANDS@ + + SetDetailsPrint TextOnly + DetailPrint "Setting up the package cache..." + push '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --extract-conda-pkgs' + push 'Failed to extract packages' + push 'NoLog' + # We use NoLog here because TQDM progress bars are parsed as a single line in NSIS 3.08 + # These can crash the installer if they get too long (a few packages is enough!) + call AbortRetryNSExecWait + SetDetailsPrint both + + IfFileExists "$INSTDIR\pkgs\pre_install.bat" 0 NoPreInstall + DetailPrint "Running pre_install scripts..." + ReadEnvStr $5 SystemRoot + ReadEnvStr $6 windir + # This 'FileExists' also returns True for directories + ${If} ${FileExists} "$5" + push '"$5\System32\cmd.exe" /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${ElseIf} ${FileExists} "$6" + push '"$6\System32\cmd.exe" /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${Else} + # Cross our fingers CMD is in PATH + push 'cmd.exe /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${EndIf} + push "Failed to run pre_install" + push 'WithLog' + call AbortRetryNSExecWait + NoPreInstall: + + @SETUP_ENVS@ + + @WRITE_CONDARC@ + + AddSize @SIZE@ + + ${If} $Ana_CreateShortcuts_State = ${BST_CHECKED} + DetailPrint "Creating @NAME@ menus..." + push '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --make-menus @MENU_PKGS@' + push 'Failed to create menus' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + +#if has_conda is True + DetailPrint "Initializing conda directories..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" mkdirs' + push 'Failed to initialize conda directories' + push 'WithLog' + call AbortRetryNSExecWait +#endif + + ${If} $Ana_PostInstall_State = ${BST_CHECKED} + DetailPrint "Running post install..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" post_install' + push 'Failed to run post install script' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + ${If} $Ana_ClearPkgCache_State = ${BST_CHECKED} + DetailPrint "Clearing package cache..." + push '"$INSTDIR\_conda.exe" clean --all --force-pkgs-dirs --yes' + push 'Failed to clear package cache' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + ${If} $Ana_AddToPath_State = ${BST_CHECKED} + DetailPrint "Adding to PATH..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" addpath ${PYVERSION} ${NAME} ${VERSION} ${ARCH}' + push 'Failed to add @NAME@ to the system PATH' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + # Create registry entries saying this is the system Python + # (for this version) + !define PYREG "Software\Python\PythonCore\${PY_VER}" + ${If} $Ana_RegisterSystemPython_State == ${BST_CHECKED} + WriteRegStr SHCTX "${PYREG}\Help\Main Python Documentation" \ + "Main Python Documentation" \ + "$INSTDIR\Doc\python${PYVERSION_JUSTDIGITS}.chm" + + WriteRegStr SHCTX "${PYREG}\InstallPath" "" "$INSTDIR" + + WriteRegStr SHCTX "${PYREG}\InstallPath\InstallGroup" \ + "" "Python ${PY_VER}" + + WriteRegStr SHCTX "${PYREG}\Modules" "" "" + WriteRegStr SHCTX "${PYREG}\PythonPath" \ + "" "$INSTDIR\Lib;$INSTDIR\DLLs" + ${EndIf} + + ${If} $ARGV_NoRegistry == "0" + # Registry uninstall info + WriteRegStr SHCTX "${UNINSTREG}" "DisplayName" "${UNINSTALL_NAME}" + WriteRegStr SHCTX "${UNINSTREG}" "DisplayVersion" "${VERSION}" + WriteRegStr SHCTX "${UNINSTREG}" "Publisher" "${COMPANY}" + WriteRegStr SHCTX "${UNINSTREG}" "UninstallString" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\"" + WriteRegStr SHCTX "${UNINSTREG}" "QuietUninstallString" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\" /S" + WriteRegStr SHCTX "${UNINSTREG}" "DisplayIcon" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\"" + + WriteRegDWORD SHCTX "${UNINSTREG}" "NoModify" 1 + WriteRegDWORD SHCTX "${UNINSTREG}" "NoRepair" 1 + ${EndIf} + + WriteUninstaller "$INSTDIR\Uninstall-${NAME}.exe" + + # To address CVE-2022-26526. + # Revoke the write permission on directory "$INSTDIR" for Users if this is + # being run with administrative privileges. Users are: + # AU - authenticated users + # BU - built-in (local) users + # DU - domain users + ${If} ${UAC_IsAdmin} + DetailPrint "Setting installation directory permissions..." + AccessControl::DisableFileInheritance "$INSTDIR" + AccessControl::RevokeOnFile "$INSTDIR" "(AU)" "GenericWrite" + AccessControl::RevokeOnFile "$INSTDIR" "(DU)" "GenericWrite" + AccessControl::RevokeOnFile "$INSTDIR" "(BU)" "GenericWrite" + AccessControl::SetOnFile "$INSTDIR" "(BU)" "GenericRead + GenericExecute" + AccessControl::SetOnFile "$INSTDIR" "(DU)" "GenericRead + GenericExecute" + ${EndIf} +SectionEnd + +!macro AbortRetryNSExecWaitLibNsisCmd cmd + SetDetailsPrint both + DetailPrint "Running ${cmd} scripts..." + SetDetailsPrint listonly + ${If} ${Silent} + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" ${cmd}' + ${Else} + push '"$INSTDIR\python.exe" -E -s "$INSTDIR\Lib\_nsis.py" ${cmd}' + ${EndIf} + push "Failed to run ${cmd}" + push 'WithLog' + call un.AbortRetryNSExecWait + SetDetailsPrint both +!macroend + +Section "Uninstall" + # Remove menu items, path entries + + DetailPrint "Deleting @NAME@ menus..." + nsExec::ExecToLog '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --rm-menus' + + # ensure that MSVC runtime DLLs are on PATH during uninstallation + ReadEnvStr $0 PATH + # set PATH for the installer process, so that MSVC runtimes get found OK + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PATH", \ + "$INSTDIR;$INSTDIR\Library\mingw-w64\bin;$INSTDIR\Library\usr\bin;$INSTDIR\Library\bin;$INSTDIR\Scripts;$INSTDIR\bin;$0;$0\system32;$0\system32\Wbem").r0' + + # our newest Python builds have a patch that allows us to control the PATH search stuff much more + # carefully. More info at https://docs.conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#solution + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_DLL_SEARCH_MODIFICATION_ENABLE", "1").r0' + + # Read variables the uninstaller needs from the registry + StrCpy $R0 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + StrLen $R1 "Uninstall-${NAME}.exe" + IntOp $R1 $R1 + 3 + StrCpy $0 0 + loop_path: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_path + StrCpy $2 "$R0\$1" + ReadRegStr $4 SHCTX $2 "UninstallString" + StrLen $5 $4 + IntOp $5 $5 - $R1 + StrCpy $4 $4 $5 1 + ${If} $4 == $INSTDIR + StrCpy $INSTALLER_NAME_FULL $1 + ReadRegStr $INSTALLER_VERSION SHCTX $2 "DisplayVersion" + goto endloop_path + ${EndIf} + IntOp $0 $0 + 1 + goto loop_path + endloop_path: + + # Extra info for pre_uninstall scripts + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' + StrCpy $0 ${VERSION} + ${If} $INSTALLER_VERSION != "" + StrCpy $0 $INSTALLER_VERSION + ${EndIf} + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "$0").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' + + !insertmacro AbortRetryNSExecWaitLibNsisCmd "pre_uninstall" + !insertmacro AbortRetryNSExecWaitLibNsisCmd "rmpath" + !insertmacro AbortRetryNSExecWaitLibNsisCmd "rmreg" + + DetailPrint "Removing files and folders..." + nsExec::Exec 'cmd.exe /D /C RMDIR /Q /S "$INSTDIR"' + + # In case the last command fails, run the slow method to remove leftover + RMDir /r /REBOOTOK "$INSTDIR" + + ${If} $INSTALLER_NAME_FULL != "" + DeleteRegKey SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTALLER_NAME_FULL" + ${EndIf} + + # If Anaconda was registered as the official Python for this version, + # remove it from the registry + StrCpy $R0 "SOFTWARE\Python\PythonCore" + StrCpy $0 0 + loop_py: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_py + ReadRegStr $2 SHCTX "$R0\$1\InstallPath" "" + ${If} $2 == $INSTDIR + StrCpy $R1 $1 + DeleteRegKey SHCTX "$R0\$1" + goto endloop_py + ${EndIf} + IntOp $0 $0 + 1 + goto loop_py + endloop_py: +SectionEnd + +!if '@SIGNTOOL_COMMAND@' != '' + # Signing for installer and uninstaller; nsis 3.08 required for uninstfinalize! + # "= 0" comparison required to prevent both tasks running in parallel, which would cause signtool to fail + # %1 is replaced by the installer and uninstaller paths, respectively + !finalize '@SIGNTOOL_COMMAND@ "%1"' = 0 + !uninstfinalize '@SIGNTOOL_COMMAND@ "%1"' = 0 +!endif diff --git a/installer_specs/buildenv.conda-lock.yml b/installer_specs/buildenv.conda-lock.yml new file mode 100644 index 0000000..9303bc1 --- /dev/null +++ b/installer_specs/buildenv.conda-lock.yml @@ -0,0 +1,5051 @@ +# This lock file was generated by conda-lock (https://github.com/conda-incubator/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV --file buildenv.conda-lock.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile buildenv.conda-lock.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f /home/rvolz/repos/radioconda/buildenv.yaml --lockfile buildenv.conda-lock.yml +metadata: + channels: + - url: conda-forge + used_env_vars: [] + content_hash: + linux-64: cf28c5c716ae43f9173a0ffa6bfeabcd3082fe9f3df7841e00fa63e9682c21dd + osx-64: 36f40db49f5845eee8baca3e7595cbbc280b1bc9fd29bed72b8b40d5918e9014 + win-64: 807b2f6e6f95e9be4b06e79cb0dc110c544394e8b6c7fc15e628b83e36593104 + platforms: + - linux-64 + - osx-64 + - win-64 + sources: + - /home/rvolz/repos/radioconda/buildenv.yaml +package: +- category: main + dependencies: {} + hash: + md5: d7c89558ba9fa0495403155b64376d81 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + manager: conda + name: _libgcc_mutex + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + version: '0.1' +- category: main + dependencies: {} + hash: + md5: a73ecd2988327ad4c8f2c331482917f2 + sha256: 525b7b6b5135b952ec1808de84e5eca57c7c7ff144e29ef3e96ae4040ff432c1 + manager: conda + name: ca-certificates + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda + version: 2023.7.22 +- category: main + dependencies: {} + hash: + md5: dbc503dcc77ca9b81ba956d21c3a2ea4 + sha256: cbe3c2391106204ad7ee10eafae72ea70744a32339846f637131be486099338e + manager: conda + name: conda-standalone + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/conda-standalone-22.11.1-ha770c72_0.conda + version: 22.11.1 +- category: main + dependencies: {} + hash: + md5: 7aca3059a1729aa76c597603f10b0dd3 + sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd + manager: conda + name: ld_impl_linux-64 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + version: '2.40' +- category: main + dependencies: {} + hash: + md5: 067bcc23164642f4c226da631f2a2e1d + sha256: 6f9eb2d7a96687938c0001166a3b308460a8eb02b10e9d0dd9e251f0219ea05c + manager: conda + name: libstdcxx-ng + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.1.0-hfd8a6a1_0.conda + version: 13.1.0 +- category: main + dependencies: {} + hash: + md5: c2e2630ddb68cf52eec74dc7dfab20b5 + sha256: 2966a87dcb0b11fad28f9fe8216bfa4071115776b47ffc7547492fed176e1a1f + manager: conda + name: python_abi + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda + version: '3.11' +- category: main + dependencies: {} + hash: + md5: 939e3e74d8be4dac89ce83b20de2492a + sha256: 0449138224adfa125b220154408419ec37c06b0b49f63c5954724325903ecf55 + manager: conda + name: tzdata + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda + version: 2023c +- category: main + dependencies: + _libgcc_mutex: 0.1 conda_forge + hash: + md5: 56ca14d57ac29a75d23a39eb3ee0ddeb + sha256: 5d441d80b57f857ad305a65169a6b915d4fd6735cdc9e9bded35d493c91ef16d + manager: conda + name: libgomp + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.1.0-he5830b7_0.conda + version: 13.1.0 +- category: main + dependencies: + _libgcc_mutex: 0.1 conda_forge + libgomp: '>=7.5.0' + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + manager: conda + name: _openmp_mutex + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + version: '4.5' +- category: main + dependencies: + _libgcc_mutex: 0.1 conda_forge + _openmp_mutex: '>=4.5' + hash: + md5: cd93f779ff018dd85c7544c015c9db3c + sha256: fba897a02f35b2b5e6edc43a746d1fa6970a77b422f258246316110af8966911 + manager: conda + name: libgcc-ng + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.1.0-he5830b7_0.conda + version: 13.1.0 +- category: main + dependencies: + libgcc-ng: '>=9.3.0' + hash: + md5: a1fd65c7ccbf10880423d82bca54eb54 + sha256: cb521319804640ff2ad6a9f118d972ed76d86bea44e5626c09a13d38f562e1fa + manager: conda + name: bzip2 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2 + version: 1.0.8 +- category: main + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + hash: + md5: 7c8d20d847bb45f56bd941578fcfa146 + sha256: e44cc00eec068e7f7a6dd117ba17bf5d57658729b7b841945546f82505138292 + manager: conda + name: icu + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/icu-72.1-hcb278e6_0.conda + version: '72.1' +- category: main + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + hash: + md5: 76bbff344f0134279f225174e9064c8f + sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12 + manager: conda + name: lerc + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2 + version: 4.0.0 +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 6aa9c9de5542ecb07fdda9ca626252d8 + sha256: 949d84ceea543802c1e085b2aa58f1d6cb5dd8cec5a9abaaf4e8ac65d6094b3a + manager: conda + name: libdeflate + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.18-h0b41bf4_0.conda + version: '1.18' +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 6305a3dd2752c76335295da4e581f2fd + sha256: 74c98a563777ae2ad71f1f74d458a8ab043cee4a513467c159ccf159d0e461f3 + manager: conda + name: libexpat + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda + version: 2.5.0 +- category: main + dependencies: + libgcc-ng: '>=9.4.0' + hash: + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + manager: conda + name: libffi + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + version: 3.4.2 +- category: main + dependencies: + libgcc-ng: '>=10.3.0' + hash: + md5: b62b52da46c39ee2bc3c162ac7f1804d + sha256: 6a81ebac9f1aacdf2b4f945c87ad62b972f0f69c8e0981d68e111739e6720fd7 + manager: conda + name: libiconv + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2 + version: '1.17' +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 1edd9e67bdb90d78cea97733ff6b54e6 + sha256: b19de7bda34eac4fa931be11fa8d7640cdf1441dfd51c91786586a4a4c64c92f + manager: conda + name: libjpeg-turbo + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-h0b41bf4_0.conda + version: 2.1.5.1 +- category: main + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + hash: + md5: 2ed926c822a091c21d467429d1eaa92c + sha256: d7e5b39bcbc144463ca938c8cdb1dc73d2d204fb78c5aea200c07037517aebba + manager: conda + name: liblief + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/liblief-0.12.3-h27087fc_0.tar.bz2 + version: 0.12.3 +- category: main + dependencies: + libgcc-ng: '>=9.4.0' + hash: + md5: 39b1328babf85c7c3a61636d9cd50206 + sha256: 32f4fb94d99946b0dabfbbfd442b25852baf909637f2eed1ffe3baea15d02aad + manager: conda + name: libnsl + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2 + version: 2.0.0 +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + manager: conda + name: libuuid + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + version: 2.38.1 +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 82bf6f63eb15ef719b556b63feec3a77 + sha256: 66658d5cdcf89169e284488d280b6ce693c98c0319d7eabebcedac0929140a73 + manager: conda + name: libwebp-base + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.1-hd590300_0.conda + version: 1.3.1 +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: f36c115f1ee199da648e0597ec2047ad + sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + manager: conda + name: libzlib + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + version: 1.2.13 +- category: main + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + hash: + md5: 318b08df404f9c9be5712aaa5a6f0bb0 + sha256: 1b4c105a887f9b2041219d57036f72c4739ab9e9fe5a1486f094e58c76b31f5f + manager: conda + name: lz4-c + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + version: 1.9.4 +- category: main + dependencies: + libgcc-ng: '>=7.5.0' + hash: + md5: bb14fcb13341b81d5eb386423b9d2bac + sha256: 25d16e6aaa3d0b450e61d0c4fadd7c9fd17f16e2fef09b34507209342d63c9f6 + manager: conda + name: lzo + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2 + version: '2.10' +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 681105bccc2a3f7f1a837d47d39c9179 + sha256: ccf61e61d58a8a7b2d66822d5568e2dc9387883dd9b2da61e1d787ece4c4979a + manager: conda + name: ncurses + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda + version: '6.4' +- category: main + dependencies: + ca-certificates: '' + libgcc-ng: '>=12' + hash: + md5: 2e1d7b458ac8f1e3ca4e18b77add6277 + sha256: 407d655643389bdb49266842a816815c981ae98f3513a6a2059b908b3abb380a + manager: conda + name: openssl + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.1-hd590300_1.conda + version: 3.1.1 +- category: main + dependencies: + libgcc-ng: '>=9.3.0' + hash: + md5: 4c1bbbec45149a186b915c67d086ed3b + sha256: fc30d1b643c35d82abd294cde6b34f7b9e952856c0386f4f069c3a2b7feb28dd + manager: conda + name: patch + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/patch-2.7.6-h7f98852_1002.tar.bz2 + version: 2.7.6 +- category: main + dependencies: + libgcc-ng: '>=7.5.0' + libstdcxx-ng: '>=7.5.0' + hash: + md5: ba76a6a448819560b5f8b08a9c74f415 + sha256: eb355ac225be2f698e19dba4dcab7cb0748225677a9799e9cc8e4cadc3cb738f + manager: conda + name: patchelf + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/patchelf-0.17.2-h58526e2_0.conda + version: 0.17.2 +- category: main + dependencies: + libgcc-ng: '>=7.5.0' + hash: + md5: 22dad4df6e8630e8dff2428f6f6a7036 + sha256: 67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff + manager: conda + name: pthread-stubs + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 + version: '0.4' +- category: main + dependencies: + libgcc-ng: '>=10.3.0' + hash: + md5: 15a0bf4a1260b0a08198eb683eb272fb + sha256: d98b4816de502658080e62014b1ccaa296e54c3a161418e344c52aebf9044c79 + manager: conda + name: ripgrep + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ripgrep-13.0.0-h2f28480_2.tar.bz2 + version: 13.0.0 +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 2c80dc38fface310c9bd81b17037fee5 + sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4 + manager: conda + name: xorg-libxau + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda + version: 1.0.11 +- category: main + dependencies: + libgcc-ng: '>=9.3.0' + hash: + md5: be93aabceefa2fac576e971aef407908 + sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77 + manager: conda + name: xorg-libxdmcp + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + version: 1.1.3 +- category: main + dependencies: + libgcc-ng: '>=12' + hash: + md5: 2161070d867d1b1204ea749c8eec4ef0 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + manager: conda + name: xz + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + version: 5.2.6 +- category: main + dependencies: + libgcc-ng: '>=9.4.0' + hash: + md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae + sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535 + manager: conda + name: yaml + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2 + version: 0.2.5 +- category: main + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: e1c890aebdebbfbf87e2c917187b4416 + sha256: a32b36d34e4f2490b99bddbc77d01a674d304f667f0e62c89e02c961addef462 + manager: conda + name: libpng + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda + version: 1.6.39 +- category: main + dependencies: + libgcc-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: fdaae20a1cf7cd62130a0973190a31b7 + sha256: 72e958870f49174ebc0ddcd4129e9a9f48de815f20aa3b553f136b514f29bb3a + manager: conda + name: libsqlite + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.42.0-h2797004_0.conda + version: 3.42.0 +- category: main + dependencies: + libgcc-ng: '>=12' + pthread-stubs: '' + xorg-libxau: '' + xorg-libxdmcp: '' + hash: + md5: 33277193f5b92bad9fdd230eb700929c + sha256: a670902f0a3173a466c058d2ac22ca1dd0df0453d3a80e0212815c20a16b0485 + manager: conda + name: libxcb + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda + version: '1.15' +- category: main + dependencies: + icu: '>=72.1,<73.0a0' + libgcc-ng: '>=12' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + hash: + md5: e46fad17d5fb57316b956f88dca765e4 + sha256: bc7fa8590c15ffdea5101075ce02de09441c9f378ac1d05e26510d12d25d7099 + manager: conda + name: libxml2 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.4-h0d562d8_0.conda + version: 2.11.4 +- category: main + dependencies: + libgcc-ng: '>=12' + ncurses: '>=6.3,<7.0a0' + hash: + md5: 47d31b792659ce70f470b5c82fdfb7a4 + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + manager: conda + name: readline + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + version: '8.2' +- category: main + dependencies: + libgcc-ng: '>=9.4.0' + libzlib: '>=1.2.11,<1.3.0a0' + hash: + md5: 5b8c42eb62e9fc961af70bdd6a26e168 + sha256: 032fd769aad9d4cad40ba261ab222675acb7ec951a8832455fce18ef33fa8df0 + manager: conda + name: tk + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2 + version: 8.6.12 +- category: main + dependencies: + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: 32ae18eb2a687912fc9e92a501c0a11b + sha256: a7f7e765dfb7af5265a38080e46f18cb07cfeecf81fe28fad23c4538e7d521c3 + manager: conda + name: zstd + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-hfc55251_7.conda + version: 1.5.2 +- category: main + dependencies: + libgcc-ng: '>=12' + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: e1232042de76d24539a436d37597eb06 + sha256: 1eb913727b54e9aa63c6d9a1177db4e2894cee97c5f26910a2b61899d5ac904f + manager: conda + name: freetype + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda + version: 2.12.1 +- category: main + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libgcc-ng: '>=12' + libxml2: '>=2.11.3,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.1.0,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 29cf970521d30d113f3425b84cb250f6 + sha256: 146ef424805d8319543b6680b4af90f89d136fb90155f95ba44b14d90245e36d + manager: conda + name: libarchive + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.6.2-h039dbb9_1.conda + version: 3.6.2 +- category: main + dependencies: + lerc: '>=4.0.0,<5.0a0' + libdeflate: '>=1.18,<1.19.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libstdcxx-ng: '>=12' + libwebp-base: '>=1.3.0,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 8ad377fb60abab446a9f02c62b3c2190 + sha256: 920943ad46869938bd070ccd4c0117594e07538bc6b27b75462594c67b6f215d + manager: conda + name: libtiff + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.1-h8b53f26_0.conda + version: 4.5.1 +- category: main + dependencies: + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.5.0,<3.0a0' + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + libnsl: '>=2.0.0,<2.1.0a0' + libsqlite: '>=3.42.0,<4.0a0' + libuuid: '>=2.38.1,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + openssl: '>=3.1.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.12,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + hash: + md5: 1c628861a2a126b9fc9363ca1b7d014e + sha256: 04422f10d5bcb251fd254d6a9b0659dcde55e900d48cca159cb1fef637b0050c + manager: conda + name: python + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.4-hab00c5b_0_cpython.conda + version: 3.11.4 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 3edfead7cedd1ab4400a6c588f3e75f8 + sha256: 063639cd568f5c7a557b0fb1cc27f098598c0d8ff869088bfeb82934674f8821 + manager: conda + name: attrs + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda + version: 23.1.0 +- category: main + dependencies: + python: 2.7.*|>=3.7 + hash: + md5: 033eb25fffd222aceeca6d58cd953680 + sha256: 4ff828cceb8f55cb26d23b1a4c174d22c7cd92350221724bcaf2d6632e33fdee + manager: conda + name: boltons + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda + version: 23.0.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 7f3dbc9179b4dde7da98dfb151d0ad22 + sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + manager: conda + name: certifi + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + version: 2023.7.22 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 9ad842c86331f98301ac1d3e4af26843 + sha256: c494ec49608df59fd197cb3f954b0d1a8c53487c3067801b264dfe55fe4c9540 + manager: conda + name: chardet + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/chardet-5.1.0-py311h38be061_0.conda + version: 5.1.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 313516e9a4b08b12dfb1e1cd390a96e3 + sha256: 0666a95fbbd2299008162e2126c009191e5953d1cad1878bf9f4d8d634af1dd4 + manager: conda + name: charset-normalizer + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda + version: 3.2.0 +- category: main + dependencies: + __unix: '' + python: '>=3.8' + hash: + md5: 64dbb3b205546691a61204d1cfb208e3 + sha256: 73392cf4851bf7c89e99518effea01d531360a4894c4218e768d5e03e89d7943 + manager: conda + name: click + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda + version: 8.1.6 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + manager: conda + name: colorama + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + version: 0.4.6 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 961b3a227b437d82ad7054484cfa71b2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + manager: conda + name: defusedxml + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + version: 0.7.1 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 53522ec72e6adae42bd373ef58357230 + sha256: 1cbae9f05860f2e566e2977f14dfcd5494beb22c028b0a853ade4ec381d9de71 + manager: conda + name: filelock + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda + version: 3.12.2 +- category: main + dependencies: + python: '' + hash: + md5: 1f3a88e65e61216e1d475135922dbf6a + sha256: d8ae39a37fb99489525846f77c4ae85cb6b42360d34936bb0393025db5f0508d + manager: conda + name: glob2 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/glob2-0.7-py_0.tar.bz2 + version: '0.7' +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 34272b248891bddccc64479f9a7fffed + sha256: 9887c35c374ec1847f167292d3fde023cb4c994a4ceeec283072b95440131f09 + manager: conda + name: idna + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2 + version: '3.4' +- category: main + dependencies: + python: '' + hash: + md5: 07d85c22a3beb102a48cd123df84c2a6 + sha256: da279af2285d8f575a7f5652e83bf7f36155c4c63154e385a9d171efcc607bc1 + manager: conda + name: jsonpointer + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2 + version: '2.0' +- category: main + dependencies: + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.5.0,<4.6.0a0' + hash: + md5: 980d8aca0bc23ca73fa8caa3e7c84c28 + sha256: 0d88e0e7f8dbf8f01788e21dd63dd49b89433ce7dfd10f53839441396f6481cd + manager: conda + name: lcms2 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-haa2dc70_1.conda + version: '2.15' +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 9904dc4adb5d547cb21e136f98cb24b0 + sha256: 747b00706156b61d48565710f38cdb382e22f7db03e5b429532a2d5d5917c313 + manager: conda + name: markupsafe + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_0.conda + version: 2.1.3 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: db9968cb68b536d6c538f48f351a997b + sha256: 7cf415aaf1dce7db8a7887ab29ed8b57b2a68e1c70d4306bbafc23daf8872d75 + manager: conda + name: more-itertools + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.0.0-pyhd8ed1ab_0.conda + version: 10.0.0 +- category: main + dependencies: + libgcc-ng: '>=12' + libpng: '>=1.6.39,<1.7.0a0' + libstdcxx-ng: '>=12' + libtiff: '>=4.5.0,<4.6.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: 5ce6a42505c6e9e6151c54c3ec8d68ea + sha256: 3cbfb1fe9bb492dcb672f98f0ddc7b4e029f51f77101d9c301caa3acaea8cba2 + manager: conda + name: openjpeg + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda + version: 2.5.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 91cda59e66e1e4afe9476f8ef98f5c30 + sha256: ded536a96a00d45a693dbc2971bb688248324dadd129eddda2100e177583d768 + manager: conda + name: packaging + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda + version: '23.1' +- category: main + dependencies: + python: '' + hash: + md5: a8f6c4fa2e2edf7ee65714910a9a760f + sha256: 5b4a23ae7ed47707b76856dfc33c169988fc8dee421b6b75eea18d2e13505129 + manager: conda + name: patch-ng + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/patch-ng-1.17.4-pyh9f0ad1d_0.tar.bz2 + version: 1.17.4 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: be1e9f1c65a1ed0f2ae9352fec99db64 + sha256: 7ea5a5af62a15376d9f4f9f3c134874d0b0710f39be719e849b7fa9ca8870502 + manager: conda + name: pkginfo + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.9.6-pyhd8ed1ab_0.conda + version: 1.9.6 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 89e3c7cdde7d3aaa2aee933b604dd07f + sha256: 7d055ffc8a02bf781a89d069db3454b453605cdaff300b82cedcc7133283e47e + manager: conda + name: pkgutil-resolve-name + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2 + version: 1.3.10 +- category: main + dependencies: + python: '>=3.8' + hash: + md5: 7263924c642d22e311d9e59b839f1b33 + sha256: ff1f70e0bd50693be7e2bad0efb2539f5dcc5ec4d638e787e703f28098e72de4 + manager: conda + name: pluggy + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda + version: 1.2.0 +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: a90f8e278c1cd7064b2713e6b7db87e6 + sha256: aa5b377f1555a09ba702d9ac9d0d0585d74cbaf8897e45e5cfa4c464732a6493 + manager: conda + name: psutil + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h2582759_0.conda + version: 5.9.5 +- category: main + dependencies: + libgcc-ng: '>=12' + liblief: 0.12.3 h27087fc_0 + libstdcxx-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: adbe6a080737fa9fa60fd655bd3afb39 + sha256: 27ce92dd38df41394fa23a48c5e9f16a2e598de2a0803b6154e3efa8bb2af1a1 + manager: conda + name: py-lief + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/py-lief-0.12.3-py311ha362b79_0.tar.bz2 + version: 0.12.3 +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 17399f8b68b4592f098ab18d4fdb0ac4 + sha256: f3c78ec53d5386004c980adb8a744eb26f1cba6c99d4b7598c5ce0775396f348 + manager: conda + name: pycosat + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pycosat-0.6.4-py311hd4cff14_1.tar.bz2 + version: 0.6.4 +- category: main + dependencies: + python: 2.7.*|>=3.4 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + manager: conda + name: pycparser + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + version: '2.21' +- category: main + dependencies: + __unix: '' + python: '>=3.8' + hash: + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + manager: conda + name: pysocks + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + version: 1.7.1 +- category: main + dependencies: + python: '>=3.3' + hash: + md5: 3be9466311564f80f8056c0851fc5bb7 + sha256: 73985a9a2dd7ccf77b7428a12148e1b381c8635e9195e47a652397e9a56284ce + manager: conda + name: python-fastjsonschema + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.0-pyhd8ed1ab_0.conda + version: 2.18.0 +- category: main + dependencies: + libarchive: '' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 7ca450aa38981b17fd08c16f03660147 + sha256: b75c4eb3889e1dabac85a2b5aebb35d7b3c7f0584b39d882452538ee3c0aa021 + manager: conda + name: python-libarchive-c + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-libarchive-c-5.0-py311h38be061_1.conda + version: '5.0' +- category: main + dependencies: + python: '>=3.6' + hash: + md5: d3076b483092a435832603243567bc31 + sha256: e4999484f21763ca4b8f92c95b22cb6d1edc1b61d0a2bb073ee2bd11f39401b9 + manager: conda + name: pytz + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda + version: '2023.3' +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + yaml: '>=0.2.5,<0.3.0a0' + hash: + md5: da8769492e423103c59f469f4f17f8d9 + sha256: 47b22be55c6f60f0e93b5e6887e02b98025bb13eeb390d84c68102f63f22413d + manager: conda + name: pyyaml + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2 + version: '6.0' +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: bcf66b5abaec47198b42cdd0bb968540 + sha256: ed9e6eb42ec6f5167ba9912d9260f4b8977441907ec520b3635e10f5241b04ba + manager: conda + name: rpds-py + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.9.2-py311h46250e7_0.conda + version: 0.9.2 +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 5e997292429a22ad50c11af0a2cb0f08 + sha256: 0d5f4dd130796304eab2b48b51d08729acc7d40313e7d8124070490b3a53392c + manager: conda + name: ruamel.yaml.clib + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h2582759_1.conda + version: 0.2.7 +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + yaml: '>=0.2.5,<0.3.0a0' + hash: + md5: cfc7aa9d4e13c267fb6531d4788f2ede + sha256: 58ffb8d4635455fbce8f9136b4bf1c4666b3c2d3a115c6924972a66a0fa7c538 + manager: conda + name: ruamel_yaml + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel_yaml-0.15.80-py311hd4cff14_1008.tar.bz2 + version: 0.15.80 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 5a7739d0f57ee64133c9d32e6507c46d + sha256: 083a0913f5b56644051f31ac40b4eeea762a88c00aa12437817191b85a753cec + manager: conda + name: setuptools + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda + version: 68.0.0 +- category: main + dependencies: + python: '' + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + manager: conda + name: six + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + version: 1.16.0 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 146f4541d643d48fc8a75cacf69f03ae + sha256: 72d80dda41c3902c2619e8ab49d4f5b2a894d13375e1f9ed16fc00074ddd2307 + manager: conda + name: soupsieve + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2 + version: 2.3.2.post1 +- category: main + dependencies: + python: '>=3.5' + hash: + md5: 92facfec94bc02d6ccf42e7173831a36 + sha256: 90229da7665175b0185183ab7b53f50af487c7f9b0f47cf09c184cbc139fd24b + manager: conda + name: toolz + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2 + version: 0.12.0 +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 12b1c374ee90a1aa11ea921858394dc8 + sha256: 962ba2e8eb49e38c4f8a31ca2b4e0fbf342b30bb514b4bfe12727d7a396051c2 + manager: conda + name: tornado + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.2-py311h459d7ec_0.conda + version: 6.3.2 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: d0b4f5c87cd35ac3fb3d47b223263a64 + sha256: 343610bce6dbe8a5090500dd2e9d1706057960b3f3120ebfe0abb4a8ecbada4d + manager: conda + name: traitlets + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + version: 5.9.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: c39d6a09fe819de4951c2642629d9115 + sha256: 6edd6d5be690be492712cb747b6d62707f0d0c34ef56eefc796d91e5a03187d1 + manager: conda + name: typing_extensions + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda + version: 4.7.1 +- category: main + dependencies: + python: '>=3.8' + hash: + md5: 2da0451b54c4563c32490cb1b7cf68a1 + sha256: 16d72127e150a3d5cbdc0b82c4069ef5be135c64bc99e71e7928507910669b41 + manager: conda + name: zipp + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda + version: 3.16.2 +- category: main + dependencies: + python: '>=3.6' + soupsieve: '>=1.2' + hash: + md5: a362ff7d976217f8fa78c0f1c4f59717 + sha256: 52d3e6bcd442537e22699cd227d8fdcfd54b708eeb8ee5b4c671a6a9b9cd74da + manager: conda + name: beautifulsoup4 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda + version: 4.12.2 +- category: main + dependencies: + libffi: '>=3.4,<4.0a0' + libgcc-ng: '>=12' + pycparser: '' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 9025d0786dbbe4bc91fd8e85502decce + sha256: 7161bcdf1a304f76e88a05ed435c03ee92864ee5e8f4c938e35b089b3861b5a7 + manager: conda + name: cffi + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda + version: 1.15.1 +- category: main + dependencies: + python: '' + setuptools: '' + hash: + md5: b9ee3fdf59f49883497741509ea364b6 + sha256: 2521c43e0e481ad543baa0bb9289aff2bb242d5304eed11f17ca45943300ae62 + manager: conda + name: clyent + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/clyent-1.2.2-py_1.tar.bz2 + version: 1.2.2 +- category: main + dependencies: + python: '>=3.6' + setuptools: '' + hash: + md5: 84b284cebf2a158306653f9a6961d589 + sha256: 922fa7f915b490daf5c74bc204b369fd1c1b1d08f50638a7134ab412f90df984 + manager: conda + name: conda-pack + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-pack-0.7.0-pyh6c4a22f_0.tar.bz2 + version: 0.7.0 +- category: main + dependencies: + python: '>=3.8' + zipp: '>=3.1.0' + hash: + md5: a08b6be5bf18b9d2a927d3457750f82e + sha256: 94c1b2831c0f908ae56212d9aeb9c9173051d307682b4fedfd88fef774b0b8f7 + manager: conda + name: importlib_resources + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda + version: 6.0.0 +- category: main + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + hash: + md5: c8490ed5c70966d232fdd389d0dbed37 + sha256: b045faba7130ab263db6a8fdc96b1a3de5fcf85c4a607c5f11a49e76851500b5 + manager: conda + name: jinja2 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2 + version: 3.1.2 +- category: main + dependencies: + jsonpointer: '>=1.9' + python: '>=3.6' + hash: + md5: 09150b51b0528a31a0f6500b96fdde82 + sha256: d87fd8da2d3327744821b6b1d1e5b76e4077224fb626ce02d6623a1bc6ee2563 + manager: conda + name: jsonpatch + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2 + version: '1.32' +- category: main + dependencies: + freetype: '>=2.12.1,<3.0a0' + lcms2: '>=2.15,<3.0a0' + libgcc-ng: '>=12' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.5.1,<4.6.0a0' + libwebp-base: '>=1.3.1,<2.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openjpeg: '>=2.5.0,<3.0a0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + tk: '>=8.6.12,<8.7.0a0' + hash: + md5: 4b24acdc1fbbae9da03147e7d2cf8c8a + sha256: 20b0a2fcdc5fee405fe3ef8d18f737863c58a5209ebf0211dec1f820c2c640c2 + manager: conda + name: pillow + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.0-py311h0b84326_0.conda + version: 10.0.0 +- category: main + dependencies: + python: '>=3.6' + six: '>=1.5' + hash: + md5: dd999d1cc9f79e67dbb855c8924c7984 + sha256: 54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da + manager: conda + name: python-dateutil + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2 + version: 2.8.2 +- category: main + dependencies: + attrs: '>=22.2.0' + python: '>=3.8' + rpds-py: '>=0.7.0' + hash: + md5: 13bf095e3ecd18999d65b4d3ac5b15d5 + sha256: 870e8bdb4a14ad831e3fa5656827bfc6a129433ba9c7ab537f0aedb95064dbcd + manager: conda + name: referencing + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.0-pyhd8ed1ab_0.conda + version: 0.30.0 +- category: main + dependencies: + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ruamel.yaml.clib: '>=0.1.2' + setuptools: '' + hash: + md5: 628868dc17f9bd39a2eb77846e35980c + sha256: 5439baf06577b6de47047282343b5fc45324f84f3bf0517784f405e0a011a466 + manager: conda + name: ruamel.yaml + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.17.32-py311h459d7ec_0.conda + version: 0.17.32 +- category: main + dependencies: + colorama: '' + python: '>=3.7' + hash: + md5: ed792aff3acb977d09c7013358097f83 + sha256: b35f185a678109940d34f68ac5781c3cbda9b118b8d9886b8f68ab5be6afd4fc + manager: conda + name: tqdm + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda + version: 4.65.0 +- category: main + dependencies: + typing_extensions: 4.7.1 pyha770c72_0 + hash: + md5: f96688577f1faa58096d06a45136afa2 + sha256: d5d19b8f5b275240c19616a46d67ec57250b3720ba88200da8c732c3fcbfc21d + manager: conda + name: typing-extensions + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda + version: 4.7.1 +- category: main + dependencies: + cffi: '>=1.0.0' + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 9bdac7084ecfc08338bae1b976535724 + sha256: 9bd71030fe4b03a28453c678bfc805993b7c6c6d6bdf910edef7040acf3091d6 + manager: conda + name: brotlipy + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py311hd4cff14_1005.tar.bz2 + version: 0.7.0 +- category: main + dependencies: + cffi: '>=1.12' + libgcc-ng: '>=12' + openssl: '>=3.1.1,<4.0a0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 90e9e96dd807c2613a163c197192da6c + sha256: bb6dd1cf13023b311c9a740f5d77ede6d121d56c0754ca581bcf4a63089f0dcb + manager: conda + name: cryptography + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.2-py311h63ff55d_0.conda + version: 41.0.2 +- category: main + dependencies: + importlib_resources: '>=1.4.0' + python: '>=3.8' + referencing: '>=0.25.0' + hash: + md5: 7c27ea1bdbe520bb830dcadd59f55cbf + sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + manager: conda + name: jsonschema-specifications + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + version: 2023.7.1 +- category: main + dependencies: + python: '>=3.7' + typing-extensions: '>=4.6.3' + hash: + md5: 044e7a1e0ad42c4e67110bd078150a63 + sha256: 885611bd528abaf3e31bc0bfaad3a619cfe89db61d886b53c2a9ec9ff50edebe + manager: conda + name: platformdirs + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda + version: 3.9.1 +- category: main + dependencies: + cffi: '>=1.11' + libgcc-ng: '>=12' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 10b11630d87e0a1d4abce705bc4e0b55 + sha256: 8ca197ba2e360b479eef4d7e1d2789ddd4899d0555953ac06a8d5eb5d6db16c7 + manager: conda + name: zstandard + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.19.0-py311haa97af0_2.conda + version: 0.19.0 +- category: main + dependencies: + python: '>=3.7' + zstandard: '>=0.15' + hash: + md5: ebe3230a4c1e135954eee4fb6ef8cded + sha256: a437007aa798f6d1c9f079f4dbb2a38685ac306d5a5ce3d1ee797c2de9f7d6e9 + manager: conda + name: conda-package-streaming + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda + version: 0.8.0 +- category: main + dependencies: + attrs: '>=22.2.0' + importlib_resources: '>=1.4.0' + jsonschema-specifications: '>=2023.03.6' + pkgutil-resolve-name: '>=1.3.10' + python: '>=3.8' + referencing: '>=0.28.4' + rpds-py: '>=0.7.1' + hash: + md5: 7356151a32ebd9a20158d2f26d224bfa + sha256: 09e339fc7895af45c3e183f51944f7fadf4ae3f837f6c85f6397023993336a3b + manager: conda + name: jsonschema + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.18.4-pyhd8ed1ab_0.conda + version: 4.18.4 +- category: main + dependencies: + platformdirs: '>=2.5' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + traitlets: '>=5.3' + hash: + md5: 0cf8259b01ede82c76007996f73f89ed + sha256: d8d4d662b5a645d7937fb1fbbac3820ea82097acf26fd57f5990a5ced17aad54 + manager: conda + name: jupyter_core + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.3.1-py311h38be061_0.conda + version: 5.3.1 +- category: main + dependencies: + cryptography: '>=38.0.0,<42,!=40.0.0,!=40.0.1' + python: '>=3.6' + hash: + md5: 34f7d568bf59d18e3fef8c405cbece21 + sha256: 4daea3dc896987cc1334956fccfc0ed738663a84ad0c1d3f576a7a7936091534 + manager: conda + name: pyopenssl + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda + version: 23.2.0 +- category: main + dependencies: + conda-package-streaming: '>=0.7.0' + python: '>=3.7' + hash: + md5: 44800e9bd13143292097c65e57323038 + sha256: c453b2a648e7a059f26326d476069cf81627c9a3fa12da4ab22eb39e7bfdc095 + manager: conda + name: conda-package-handling + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda + version: 2.0.2 +- category: main + dependencies: + jsonschema: '>=2.6' + jupyter_core: '' + python: '>=3.8' + python-fastjsonschema: '' + traitlets: '>=5.1' + hash: + md5: 3ec35d84fc1775215061517eb4660693 + sha256: d8b1ad3c219b39e5e325785606853ff1cd334769228490ac977b85aa95e94ba0 + manager: conda + name: nbformat + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.1-pyhd8ed1ab_0.conda + version: 5.9.1 +- category: main + dependencies: + brotlipy: '>=0.6.0' + certifi: '' + cryptography: '>=1.3.4' + idna: '>=2.0.0' + pyopenssl: '>=0.14' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: <4.0 + hash: + md5: 27db656619a55d727eaf5a6ece3d2fd6 + sha256: 213bdf6c3a5d721fa83b45d527d3ecd340f9547c0d6bbd0b8d9d746ec9a1fb4b + manager: conda + name: urllib3 + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda + version: 1.26.15 +- category: main + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + manager: conda + name: requests + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + version: 2.31.0 +- category: main + dependencies: + boltons: '>=23.0.0' + conda-package-handling: '>=1.3.0' + jsonpatch: '>=1.32' + packaging: '>=23.0' + pluggy: '>=1.0.0' + pycosat: '>=0.6.3' + pyopenssl: '>=16.2.0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + requests: '>=2.20.1,<3' + ruamel.yaml: '>=0.11.14,<0.18' + setuptools: '>=60.0.0' + toolz: '>=0.8.1' + tqdm: '>=4' + hash: + md5: 8d103578691ba23fc60fef277470a618 + sha256: 247cbdfa884a5384c1181b5b2c04a373ba9272df4560354f30b74e8ff6de6adb + manager: conda + name: conda + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/conda-23.7.1-py311h38be061_0.conda + version: 23.7.1 +- category: main + dependencies: + python: '>=3.6' + requests: '>=2.0.1,<3.0.0' + hash: + md5: 99c98318c8646b08cc764f90ce98906e + sha256: 20eaefc5dba74ff6c31e537533dde59b5b20f69e74df49dff19d43be59785fa3 + manager: conda + name: requests-toolbelt + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + version: 1.0.0 +- category: main + dependencies: + click: '>=8' + conda: '>=4.12.0' + conda-package-streaming: '' + filelock: '' + jinja2: '' + more-itertools: '' + python: '>=3.7' + pyyaml: '>=6' + hash: + md5: 962d9bb20afaa4b839912bb4cd9869a2 + sha256: 1562176f33affec7b2af35eefa60da11cf7a5299edb1b664832f6d39c73ae0f1 + manager: conda + name: conda-index + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-index-0.2.3-pyhd8ed1ab_0.conda + version: 0.2.3 +- category: main + dependencies: + __unix: '' + conda: '>=4.6' + conda-standalone: '' + pillow: '>=3.1' + python: '>=3.7' + ruamel.yaml: '>=0.11.14,<0.18' + hash: + md5: 6935bda357fb4052a82a8c3ce17b176a + sha256: 7cdc83ef761fa4e8dff316e49f7b2c839a5a87cd3516762de2a36c4082af5109 + manager: conda + name: constructor + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/constructor-3.4.4-pyh55f8243_0.conda + version: 3.4.4 +- category: main + dependencies: + beautifulsoup4: '' + chardet: '' + conda: '>=4.13' + conda-index: '' + conda-package-handling: '>=1.3' + filelock: '' + glob2: '>=0.6' + jinja2: '' + packaging: '' + patch: '>=2.6' + patchelf: '' + pkginfo: '' + psutil: '' + py-lief: '' + python: '>=3.11,<3.12.0a0' + python-libarchive-c: '' + python_abi: 3.11.* *_cp311 + pytz: '' + pyyaml: '' + requests: '' + ripgrep: '' + six: '' + tqdm: '' + hash: + md5: 34366f19e483bd38d28432734c8cb827 + sha256: 1bb884ca6f727bd193fa1a1b0e1a2beb6d0b7545814a32bc7bbad7925ee75fdd + manager: conda + name: conda-build + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/conda-build-3.26.0-py311h38be061_1.conda + version: 3.26.0 +- category: main + dependencies: + anaconda-project: '>=0.9.1' + clyent: '>=1.2.0' + conda-package-handling: '>=1.7.3' + defusedxml: '>=0.7.1' + nbformat: '>=4.4.0' + pillow: '>=8.2' + python: '>=3.6' + python-dateutil: '>=2.6.1' + pytz: '>=2021.3' + pyyaml: '>=3.12' + requests: '>=2.20.0' + requests-toolbelt: '>=0.9.1' + setuptools: '>=58.0.4' + six: '>=1.15.0' + tqdm: '>=4.56.0' + urllib3: '>=1.26.4,<2.0.0a0' + hash: + md5: 0bc9d7f17f6f946c66f896bda5c7ee6b + sha256: 5cfacf9053b46dd7f44825d0023e1f5359e05c3b0cc985f0789e944e8b62701c + manager: conda + name: anaconda-client + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.12.0-pyhd8ed1ab_0.conda + version: 1.12.0 +- category: main + dependencies: + anaconda-client: '' + conda-pack: '' + jinja2: '' + python: '>=3.6' + requests: '' + ruamel_yaml: '' + tornado: '>=4.2' + tqdm: '' + hash: + md5: 85406089db6aa63ee45da8e9f0b966b6 + sha256: 5025ff5066e4a8765ca35bb4f6145f188b249634090236c8beb25f3fb5ed4874 + manager: conda + name: anaconda-project + optional: false + platform: linux-64 + url: https://conda.anaconda.org/conda-forge/noarch/anaconda-project-0.11.1-pyhd8ed1ab_0.tar.bz2 + version: 0.11.1 +- category: main + dependencies: {} + hash: + md5: 37edc4e6304ca87316e160f5ca0bd1b5 + sha256: 60ba4c64f5d0afca0d283c7addba577d3e2efc0db86002808dadb0498661b2f2 + manager: conda + name: bzip2 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h0d85af4_4.tar.bz2 + version: 1.0.8 +- category: main + dependencies: {} + hash: + md5: bf2c54c18997bf3542af074c10191771 + sha256: 27de15e18a12117e83ac1eb8a8e52eb65731cc7f0b607a7922206a15e2460c7b + manager: conda + name: ca-certificates + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.7.22-h8857fd0_0.conda + version: 2023.7.22 +- category: main + dependencies: {} + hash: + md5: ab9c8eda5baa38c9bb709d8f4c5f2458 + sha256: 3f90b4b0a1c100ff1f16856ada46c05c4698f52620777a2ab1b509112c3e83d4 + manager: conda + name: conda-standalone + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/conda-standalone-22.11.1-h694c41f_0.conda + version: 22.11.1 +- category: main + dependencies: {} + hash: + md5: c9689510a50a4bb2ae978421671a125e + sha256: 3813b724fa741c63bf15698a716a9b9f4243a469cb658cdd47a1a9a602aa579e + manager: conda + name: icu + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/icu-72.1-h7336db1_0.conda + version: '72.1' +- category: main + dependencies: {} + hash: + md5: 7d6972792161077908b62971802f289a + sha256: 9063271847cf05f3a6cc6cae3e7f0ced032ab5f3a3c9d3f943f876f39c5c2549 + manager: conda + name: libcxx + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda + version: 16.0.6 +- category: main + dependencies: {} + hash: + md5: 3d131584456b277ce0871e6481fde49b + sha256: b985178bc45f83259c99026d988448277e17171801945769396e2577ce59778c + manager: conda + name: libdeflate + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.18-hac1461d_0.conda + version: '1.18' +- category: main + dependencies: {} + hash: + md5: 6c81cb022780ee33435cca0127dd43c9 + sha256: 80024bd9f44d096c4cc07fb2bac76b5f1f7553390112dab3ad6acb16a05f0b96 + manager: conda + name: libexpat + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.5.0-hf0c8a7f_1.conda + version: 2.5.0 +- category: main + dependencies: {} + hash: + md5: ccb34fb14960ad8b125962d3d79b31a9 + sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f + manager: conda + name: libffi + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 + version: 3.4.2 +- category: main + dependencies: {} + hash: + md5: 691d103d11180486154af49c037b7ed9 + sha256: 4a3294037d595754f7da7c11a41f3922f995aaa333f3cb66f02d8afa032a7bc2 + manager: conda + name: libiconv + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.17-hac89ed1_0.tar.bz2 + version: '1.17' +- category: main + dependencies: {} + hash: + md5: d7309a152b9b79799063b8bb47e34a3a + sha256: 38288e83201639983d3e158a1e8f638334298a0ca3a59dbb188651c874fd6077 + manager: conda + name: libjpeg-turbo + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-2.1.5.1-hb7f2c08_0.conda + version: 2.1.5.1 +- category: main + dependencies: {} + hash: + md5: a25a41b5be3fed4b671a58b998dcf89b + sha256: ff0fb385d85dae7c4ba61d28990c32f2f2686b14e503dfb956a0c076e30d59e6 + manager: conda + name: libwebp-base + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.3.1-h0dc2134_0.conda + version: 1.3.1 +- category: main + dependencies: {} + hash: + md5: 4a3ad23f6e16f99c04e166767193d700 + sha256: fc58ad7f47ffea10df1f2165369978fba0a1cc32594aad778f5eec725f334867 + manager: conda + name: libzlib + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda + version: 1.2.13 +- category: main + dependencies: {} + hash: + md5: 0b6bca372a95d6c602c7a922e928ce79 + sha256: c8a9401eff2efbbcc6da03d0066ee85d72402f7658c240e7968c64052a0d0493 + manager: conda + name: lzo + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-haf1e3a3_1000.tar.bz2 + version: '2.10' +- category: main + dependencies: {} + hash: + md5: c3dbae2411164d9b02c69090a9a91857 + sha256: 7841b1fce1ffb0bfb038f9687b92f04d64acab1f7cb96431972386ea98c7b2fd + manager: conda + name: ncurses + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-hf0c8a7f_0.conda + version: '6.4' +- category: main + dependencies: {} + hash: + md5: 6b43381b7baa13d12f7f8c1c5f815902 + sha256: 786044706396b82f4017e0c9d19b50fad5043de120c164b4f24f9b727a59d4db + manager: conda + name: patch + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/patch-2.7.6-hbcf498f_1002.tar.bz2 + version: 2.7.6 +- category: main + dependencies: {} + hash: + md5: addd19059de62181cd11ae8f4ef26084 + sha256: 6e3900bb241bcdec513d4e7180fe9a19186c1a38f0b4080ed619d26014222c53 + manager: conda + name: pthread-stubs + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-hc929b4f_1001.tar.bz2 + version: '0.4' +- category: main + dependencies: {} + hash: + md5: 5e0a069a585445333868d2c6651c3b3f + sha256: 145edb385d464227aca8ce963b9e22f5f36cacac9085eb38f574961ebc69684e + manager: conda + name: python_abi + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-3_cp311.conda + version: '3.11' +- category: main + dependencies: {} + hash: + md5: 5ae3834efaaf5a666d45609fd51f85c5 + sha256: 715b1c212c20e39f933280f662ac7b953e4791fbb787384f21e006b5e3151ccd + manager: conda + name: ripgrep + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ripgrep-13.0.0-hbbacdb1_2.tar.bz2 + version: 13.0.0 +- category: main + dependencies: {} + hash: + md5: 939e3e74d8be4dac89ce83b20de2492a + sha256: 0449138224adfa125b220154408419ec37c06b0b49f63c5954724325903ecf55 + manager: conda + name: tzdata + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda + version: 2023c +- category: main + dependencies: {} + hash: + md5: 9566b4c29274125b0266d0177b5eb97b + sha256: 8a2e398c4f06f10c64e69f56bcf3ddfa30b432201446a0893505e735b346619a + manager: conda + name: xorg-libxau + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.11-h0dc2134_0.conda + version: 1.0.11 +- category: main + dependencies: {} + hash: + md5: 86ac76d6bf1cbb9621943eb3bd9ae36e + sha256: 485421c16f03a01b8ed09984e0b2ababdbb3527e1abf354ff7646f8329be905f + manager: conda + name: xorg-libxdmcp + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.3-h35c211d_0.tar.bz2 + version: 1.1.3 +- category: main + dependencies: {} + hash: + md5: a72f9d4ea13d55d745ff1ed594747f10 + sha256: eb09823f34cc2dd663c0ec4ab13f246f45dcd52e5b8c47b9864361de5204a1c8 + manager: conda + name: xz + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 + version: 5.2.6 +- category: main + dependencies: {} + hash: + md5: d7e08fcf8259d742156188e8762b4d20 + sha256: 5301417e2c8dea45b401ffee8df3957d2447d4ce80c83c5ff151fc6bfe1c4148 + manager: conda + name: yaml + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h0d85af4_2.tar.bz2 + version: 0.2.5 +- category: main + dependencies: + libcxx: '>=13.0.1' + hash: + md5: f9d6a4c82889d5ecedec1d90eb673c55 + sha256: e41790fc0f4089726369b3c7f813117bbc14b533e0ed8b94cf75aba252e82497 + manager: conda + name: lerc + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hb486fe8_0.tar.bz2 + version: 4.0.0 +- category: main + dependencies: + libcxx: '>=14.0.4' + hash: + md5: 82ccbb9725d912138cda0fa890146c55 + sha256: 709ab8458cacfe3d55e20632e22465f4e47d587cc278ea7c2defbfccdfca25b0 + manager: conda + name: liblief + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/liblief-0.12.3-hf0c8a7f_0.tar.bz2 + version: 0.12.3 +- category: main + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: 35e4928794c5391aec14ffdf1deaaee5 + sha256: 5ad9f5e96e6770bfc8b0a826f48835e7f337c2d2e9512d76027a62f9c120b2a3 + manager: conda + name: libpng + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.39-ha978bb4_0.conda + version: 1.6.39 +- category: main + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: a7d3b44b7b0c9901ac7813b7a0462893 + sha256: 182689f4b1a5ed638cd615c7774e1a9974842bc127c59173f1d25e31a8795eef + manager: conda + name: libsqlite + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.42.0-h58db7d2_0.conda + version: 3.42.0 +- category: main + dependencies: + pthread-stubs: '' + xorg-libxau: '' + xorg-libxdmcp: '' + hash: + md5: 5513f57e0238c87c12dffedbcc9c1a4a + sha256: f41904f466acc8b3197f37f2dd3a08da75720c7f7464d9267635debc4ac1902b + manager: conda + name: libxcb + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda + version: '1.15' +- category: main + dependencies: + icu: '>=72.1,<73.0a0' + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + hash: + md5: 681f8dda25e73a830d774a37b9839c85 + sha256: d113eeafcbbb4ee5086b31b45adac5818394dc9759e3e1d9fb95114a852ef535 + manager: conda + name: libxml2 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.11.4-hd95e348_0.conda + version: 2.11.4 +- category: main + dependencies: + libcxx: '>=14.0.6' + hash: + md5: aa04f7143228308662696ac24023f991 + sha256: 39aa0c01696e4e202bf5e337413de09dfeec061d89acd5f28e9968b4e93c3f48 + manager: conda + name: lz4-c + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.9.4-hf0c8a7f_0.conda + version: 1.9.4 +- category: main + dependencies: + ca-certificates: '' + hash: + md5: c7822d6ee74e34af1fd74365cfd18983 + sha256: 67855f92bf50f24cbbc44879864d7a040b1f351e95b599cfcf4cc49b2cc3fd08 + manager: conda + name: openssl + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.1.1-h8a1eda9_1.conda + version: 3.1.1 +- category: main + dependencies: + ncurses: '>=6.3,<7.0a0' + hash: + md5: f17f77f2acf4d344734bda76829ce14e + sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 + manager: conda + name: readline + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + version: '8.2' +- category: main + dependencies: + libcxx: '>=10.0.0.a0' + hash: + md5: f9ff42ccf809a21ba6f8607f8de36108 + sha256: 34b18ce8d1518b67e333ca1d3af733c3976ecbdf3a36b727f9b4dedddcc588fa + manager: conda + name: tapi + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tapi-1100.0.11-h9ce4665_0.tar.bz2 + version: 1100.0.11 +- category: main + dependencies: + libzlib: '>=1.2.11,<1.3.0a0' + hash: + md5: 8e9480d9c47061db2ed1b4ecce519a7f + sha256: 331aa1137a264fd9cc905f04f09a161c801fe504b93da08b4e6697bd7c9ae6a6 + manager: conda + name: tk + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.12-h5dbffcc_0.tar.bz2 + version: 8.6.12 +- category: main + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: b274ec4dbf15a6e20900e397610567a0 + sha256: 8d6768da7c3170693c0649188e7575474046f8610d8074903cf84e403e3411e8 + manager: conda + name: zstd + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.2-h829000d_7.conda + version: 1.5.2 +- category: main + dependencies: + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: 852224ea3e8991a8342228eab274840e + sha256: 0aea2b93d0da8bf022501857de93f2fc0e362fabcd83c4579be8d8f5bc3e17cb + manager: conda + name: freetype + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.12.1-h3f81eb7_1.conda + version: 2.12.1 +- category: main + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libiconv: '>=1.17,<2.0a0' + libxml2: '>=2.11.3,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.1.0,<4.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 578c79bc28b8d1fa995e7cc0d3c7e965 + sha256: 078a407b6a8a7b9debd7fbb7c8696c371e2a309ef9392788c3a7742292bdf910 + manager: conda + name: libarchive + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.6.2-h0b5dc4a_1.conda + version: 3.6.2 +- category: main + dependencies: + libcxx: '>=15' + libxml2: '>=2.11.4,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 50a984abb67e0aa0a3c2c7d999755f9a + sha256: 1c33636365c942abe224436b1b73d3eebc8d7419505c0aee363c36691744f7c7 + manager: conda + name: libllvm16 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-he4b1e75_1.conda + version: 16.0.6 +- category: main + dependencies: + lerc: '>=4.0.0,<5.0a0' + libcxx: '>=15.0.7' + libdeflate: '>=1.18,<1.19.0a0' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libwebp-base: '>=1.3.0,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 56523ed556e3a44c0fd55bcf17045892 + sha256: 0526690c890b53419e6bbbe17dfc456789897ce9d7d79db3c4ea6568848bf6d0 + manager: conda + name: libtiff + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.5.1-hf955e92_0.conda + version: 4.5.1 +- category: main + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libexpat: '>=2.5.0,<3.0a0' + libffi: '>=3.4,<4.0a0' + libsqlite: '>=3.42.0,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ncurses: '>=6.4,<7.0a0' + openssl: '>=3.1.1,<4.0a0' + readline: '>=8.2,<9.0a0' + tk: '>=8.6.12,<8.7.0a0' + tzdata: '' + xz: '>=5.2.6,<6.0a0' + hash: + md5: e40b3075f85db0184d5f61d17c580ef7 + sha256: d2c00c7b1a616ad309afd864db6a7be33935710a68a7572509526495346655dc + manager: conda + name: python + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python-3.11.4-h30d4d87_0_cpython.conda + version: 3.11.4 +- category: main + dependencies: + openssl: '>=3.0.0,<4.0a0' + hash: + md5: fbfb84b9de9a6939cb165c02c69b1865 + sha256: 46fdeadf8f8d725819c4306838cdfd1099cd8fe3e17bd78862a5dfdcd6de61cf + manager: conda + name: sigtool + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 + version: 0.1.3 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 3edfead7cedd1ab4400a6c588f3e75f8 + sha256: 063639cd568f5c7a557b0fb1cc27f098598c0d8ff869088bfeb82934674f8821 + manager: conda + name: attrs + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda + version: 23.1.0 +- category: main + dependencies: + python: 2.7.*|>=3.7 + hash: + md5: 033eb25fffd222aceeca6d58cd953680 + sha256: 4ff828cceb8f55cb26d23b1a4c174d22c7cd92350221724bcaf2d6632e33fdee + manager: conda + name: boltons + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda + version: 23.0.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 7f3dbc9179b4dde7da98dfb151d0ad22 + sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + manager: conda + name: certifi + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + version: 2023.7.22 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 49dc5dea3f4dee3fd861b5da9a3241ed + sha256: 1f688b3fa06b9f8627fae56d49c6768b696f8ac3ce083e35fe9dc1d5ce965e5e + manager: conda + name: chardet + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/chardet-5.1.0-py311h6eed73b_0.conda + version: 5.1.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 313516e9a4b08b12dfb1e1cd390a96e3 + sha256: 0666a95fbbd2299008162e2126c009191e5953d1cad1878bf9f4d8d634af1dd4 + manager: conda + name: charset-normalizer + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda + version: 3.2.0 +- category: main + dependencies: + __unix: '' + python: '>=3.8' + hash: + md5: 64dbb3b205546691a61204d1cfb208e3 + sha256: 73392cf4851bf7c89e99518effea01d531360a4894c4218e768d5e03e89d7943 + manager: conda + name: click + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-unix_pyh707e725_0.conda + version: 8.1.6 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + manager: conda + name: colorama + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + version: 0.4.6 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 961b3a227b437d82ad7054484cfa71b2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + manager: conda + name: defusedxml + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + version: 0.7.1 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 53522ec72e6adae42bd373ef58357230 + sha256: 1cbae9f05860f2e566e2977f14dfcd5494beb22c028b0a853ade4ec381d9de71 + manager: conda + name: filelock + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda + version: 3.12.2 +- category: main + dependencies: + python: '' + hash: + md5: 1f3a88e65e61216e1d475135922dbf6a + sha256: d8ae39a37fb99489525846f77c4ae85cb6b42360d34936bb0393025db5f0508d + manager: conda + name: glob2 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/glob2-0.7-py_0.tar.bz2 + version: '0.7' +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 34272b248891bddccc64479f9a7fffed + sha256: 9887c35c374ec1847f167292d3fde023cb4c994a4ceeec283072b95440131f09 + manager: conda + name: idna + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2 + version: '3.4' +- category: main + dependencies: + python: '' + hash: + md5: 07d85c22a3beb102a48cd123df84c2a6 + sha256: da279af2285d8f575a7f5652e83bf7f36155c4c63154e385a9d171efcc607bc1 + manager: conda + name: jsonpointer + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2 + version: '2.0' +- category: main + dependencies: + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.5.0,<4.6.0a0' + hash: + md5: f1df9b0c2d9fbe985e62f4b24773a9e4 + sha256: 5154e12ea600a0008ddb76a02e3f6edb373bf8c3eef47f7dd052d66b8d2fc35a + manager: conda + name: lcms2 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.15-h2dcdeff_1.conda + version: '2.15' +- category: main + dependencies: + libcxx: '' + libllvm16: '>=16.0.0,<16.1.0a0' + sigtool: '' + tapi: '>=1100.0.11,<1101.0a0' + hash: + md5: db5b18302e29e823656f2a7a69df7bd9 + sha256: 00af5aa37f054da85b633e7dbdc49d950e65531ea77e63adb918412c2c967887 + manager: conda + name: ld64_osx-64 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-609-hbfe4790_13.conda + version: '609' +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 65b70928fcc2a81891ad1a8a6a7b085a + sha256: 93dbcca2a1a1c0ee1dbd60b578a66b650da2b166845ccf9ec54eed948ae42e47 + manager: conda + name: markupsafe + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/markupsafe-2.1.3-py311h2725bcf_0.conda + version: 2.1.3 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: db9968cb68b536d6c538f48f351a997b + sha256: 7cf415aaf1dce7db8a7887ab29ed8b57b2a68e1c70d4306bbafc23daf8872d75 + manager: conda + name: more-itertools + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.0.0-pyhd8ed1ab_0.conda + version: 10.0.0 +- category: main + dependencies: + libcxx: '>=14.0.6' + libpng: '>=1.6.39,<1.7.0a0' + libtiff: '>=4.5.0,<4.6.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + hash: + md5: 299a29af9ac9f550ad459d655739280b + sha256: 2375eafbd5241d8249fb467e2a8e190646e8798c33059c72efa60f197cdf4944 + manager: conda + name: openjpeg + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.0-h13ac156_2.conda + version: 2.5.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 91cda59e66e1e4afe9476f8ef98f5c30 + sha256: ded536a96a00d45a693dbc2971bb688248324dadd129eddda2100e177583d768 + manager: conda + name: packaging + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda + version: '23.1' +- category: main + dependencies: + python: '' + hash: + md5: a8f6c4fa2e2edf7ee65714910a9a760f + sha256: 5b4a23ae7ed47707b76856dfc33c169988fc8dee421b6b75eea18d2e13505129 + manager: conda + name: patch-ng + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/patch-ng-1.17.4-pyh9f0ad1d_0.tar.bz2 + version: 1.17.4 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: be1e9f1c65a1ed0f2ae9352fec99db64 + sha256: 7ea5a5af62a15376d9f4f9f3c134874d0b0710f39be719e849b7fa9ca8870502 + manager: conda + name: pkginfo + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.9.6-pyhd8ed1ab_0.conda + version: 1.9.6 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 89e3c7cdde7d3aaa2aee933b604dd07f + sha256: 7d055ffc8a02bf781a89d069db3454b453605cdaff300b82cedcc7133283e47e + manager: conda + name: pkgutil-resolve-name + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2 + version: 1.3.10 +- category: main + dependencies: + python: '>=3.8' + hash: + md5: 7263924c642d22e311d9e59b839f1b33 + sha256: ff1f70e0bd50693be7e2bad0efb2539f5dcc5ec4d638e787e703f28098e72de4 + manager: conda + name: pluggy + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda + version: 1.2.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: d9b4565309f4f992b42bd99031044642 + sha256: 0c7a402b0b2085b9e77c741ae14a386318c24dea62e12d29385843a6e8ae00a9 + manager: conda + name: psutil + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/psutil-5.9.5-py311h5547dcb_0.conda + version: 5.9.5 +- category: main + dependencies: + libcxx: '>=14.0.4' + liblief: 0.12.3 hf0c8a7f_0 + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: cdd3df753cc25aebf41024db69bc585d + sha256: dd11708da83302fd5ef287dc33fe87637ccfba42b3135faefc8e1762a885c6ab + manager: conda + name: py-lief + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/py-lief-0.12.3-py311h814d153_0.tar.bz2 + version: 0.12.3 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 229e642050372d50ebdc24e2265ce8b2 + sha256: b585e98017e45cdec004e3b2bfabc8fd8dad2dd256abb4410994e643e1820838 + manager: conda + name: pycosat + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pycosat-0.6.4-py311h5547dcb_1.tar.bz2 + version: 0.6.4 +- category: main + dependencies: + python: 2.7.*|>=3.4 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + manager: conda + name: pycparser + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + version: '2.21' +- category: main + dependencies: + __unix: '' + python: '>=3.8' + hash: + md5: 2a7de29fb590ca14b5243c4c812c8025 + sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b + manager: conda + name: pysocks + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 + version: 1.7.1 +- category: main + dependencies: + python: '>=3.3' + hash: + md5: 3be9466311564f80f8056c0851fc5bb7 + sha256: 73985a9a2dd7ccf77b7428a12148e1b381c8635e9195e47a652397e9a56284ce + manager: conda + name: python-fastjsonschema + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.0-pyhd8ed1ab_0.conda + version: 2.18.0 +- category: main + dependencies: + libarchive: '' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 3f3c0f0660f94687c02613f0dd3c4fb6 + sha256: 9edbc6ecd74befe9b199c42124034a43bad2abc6ddbb8bef0c244366764d215f + manager: conda + name: python-libarchive-c + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/python-libarchive-c-5.0-py311h6eed73b_1.conda + version: '5.0' +- category: main + dependencies: + python: '>=3.6' + hash: + md5: d3076b483092a435832603243567bc31 + sha256: e4999484f21763ca4b8f92c95b22cb6d1edc1b61d0a2bb073ee2bd11f39401b9 + manager: conda + name: pytz + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda + version: '2023.3' +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + yaml: '>=0.2.5,<0.3.0a0' + hash: + md5: 8d1e456914ce961119b07f396187a564 + sha256: 1598d451064c39979ac61e821eab3997b03e53eaa61070c450ca05e3ebcc23da + manager: conda + name: pyyaml + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0-py311h5547dcb_5.tar.bz2 + version: '6.0' +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: bda1d1d8fce204234ed183b150dd51cc + sha256: 18a522598a2d3220a13cafd40ba29d3e66aa67b18354b440bae5b1d04a4364ba + manager: conda + name: rpds-py + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.9.2-py311h299eb51_0.conda + version: 0.9.2 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: fdae97fc41b9e4aa53d644cca8ba6c54 + sha256: 2f520ea162e5316a8b44b2450517ef0e70ce2fc1934d7c73cd2c703e7d268249 + manager: conda + name: ruamel.yaml.clib + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.7-py311h5547dcb_1.conda + version: 0.2.7 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + yaml: '>=0.2.5,<0.3.0a0' + hash: + md5: 42c63993b1aaba9dc3c69a36e368d11c + sha256: b2afbbd3039d2d19f4c1ab2bcae587710688131fd02a7f1251989c6444afa12f + manager: conda + name: ruamel_yaml + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel_yaml-0.15.80-py311h5547dcb_1008.tar.bz2 + version: 0.15.80 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 5a7739d0f57ee64133c9d32e6507c46d + sha256: 083a0913f5b56644051f31ac40b4eeea762a88c00aa12437817191b85a753cec + manager: conda + name: setuptools + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda + version: 68.0.0 +- category: main + dependencies: + python: '' + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + manager: conda + name: six + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + version: 1.16.0 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 146f4541d643d48fc8a75cacf69f03ae + sha256: 72d80dda41c3902c2619e8ab49d4f5b2a894d13375e1f9ed16fc00074ddd2307 + manager: conda + name: soupsieve + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2 + version: 2.3.2.post1 +- category: main + dependencies: + python: '>=3.5' + hash: + md5: 92facfec94bc02d6ccf42e7173831a36 + sha256: 90229da7665175b0185183ab7b53f50af487c7f9b0f47cf09c184cbc139fd24b + manager: conda + name: toolz + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2 + version: 0.12.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 276fe4341e39dcd9d9d33ca18140d2e7 + sha256: da54e182c99e46225348192b63fc8d0d02a7fc5d405f4548828cf627705b8bc3 + manager: conda + name: tornado + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.3.2-py311h2725bcf_0.conda + version: 6.3.2 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: d0b4f5c87cd35ac3fb3d47b223263a64 + sha256: 343610bce6dbe8a5090500dd2e9d1706057960b3f3120ebfe0abb4a8ecbada4d + manager: conda + name: traitlets + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + version: 5.9.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: c39d6a09fe819de4951c2642629d9115 + sha256: 6edd6d5be690be492712cb747b6d62707f0d0c34ef56eefc796d91e5a03187d1 + manager: conda + name: typing_extensions + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda + version: 4.7.1 +- category: main + dependencies: + python: '>=3.8' + hash: + md5: 2da0451b54c4563c32490cb1b7cf68a1 + sha256: 16d72127e150a3d5cbdc0b82c4069ef5be135c64bc99e71e7928507910669b41 + manager: conda + name: zipp + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda + version: 3.16.2 +- category: main + dependencies: + python: '>=3.6' + soupsieve: '>=1.2' + hash: + md5: a362ff7d976217f8fa78c0f1c4f59717 + sha256: 52d3e6bcd442537e22699cd227d8fdcfd54b708eeb8ee5b4c671a6a9b9cd74da + manager: conda + name: beautifulsoup4 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda + version: 4.12.2 +- category: main + dependencies: + ld64_osx-64: '>=609,<610.0a0' + libcxx: '' + libllvm16: '>=16.0.0,<16.1.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + sigtool: '' + hash: + md5: 86fa34ad281d649490b616b7026e8f7e + sha256: d4a58c5b6bfdc7aa32e0dc5e693f84408f6e7806c8bd04a623d122e53e5320ba + manager: conda + name: cctools_osx-64 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cctools_osx-64-973.0.1-h5676edf_13.conda + version: 973.0.1 +- category: main + dependencies: + libffi: '>=3.4,<4.0a0' + pycparser: '' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 5967be4da33261eada7cc79593f71088 + sha256: 436a99652d9b13ed4b945f05740b50c79447b581aa400f69607f56c4960b806d + manager: conda + name: cffi + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cffi-1.15.1-py311ha86e640_3.conda + version: 1.15.1 +- category: main + dependencies: + python: '' + setuptools: '' + hash: + md5: b9ee3fdf59f49883497741509ea364b6 + sha256: 2521c43e0e481ad543baa0bb9289aff2bb242d5304eed11f17ca45943300ae62 + manager: conda + name: clyent + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/clyent-1.2.2-py_1.tar.bz2 + version: 1.2.2 +- category: main + dependencies: + python: '>=3.6' + setuptools: '' + hash: + md5: 84b284cebf2a158306653f9a6961d589 + sha256: 922fa7f915b490daf5c74bc204b369fd1c1b1d08f50638a7134ab412f90df984 + manager: conda + name: conda-pack + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-pack-0.7.0-pyh6c4a22f_0.tar.bz2 + version: 0.7.0 +- category: main + dependencies: + python: '>=3.8' + zipp: '>=3.1.0' + hash: + md5: a08b6be5bf18b9d2a927d3457750f82e + sha256: 94c1b2831c0f908ae56212d9aeb9c9173051d307682b4fedfd88fef774b0b8f7 + manager: conda + name: importlib_resources + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda + version: 6.0.0 +- category: main + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + hash: + md5: c8490ed5c70966d232fdd389d0dbed37 + sha256: b045faba7130ab263db6a8fdc96b1a3de5fcf85c4a607c5f11a49e76851500b5 + manager: conda + name: jinja2 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2 + version: 3.1.2 +- category: main + dependencies: + jsonpointer: '>=1.9' + python: '>=3.6' + hash: + md5: 09150b51b0528a31a0f6500b96fdde82 + sha256: d87fd8da2d3327744821b6b1d1e5b76e4077224fb626ce02d6623a1bc6ee2563 + manager: conda + name: jsonpatch + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2 + version: '1.32' +- category: main + dependencies: + ld64_osx-64: 609 hbfe4790_13 + libllvm16: '>=16.0.0,<16.1.0a0' + hash: + md5: 019a988c615c39a44ebb92969fb2731f + sha256: 7f0800cc9e6267aa8cb363997d3ae77f587fc4586bfb0791891127d50ffea234 + manager: conda + name: ld64 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ld64-609-ha02d983_13.conda + version: '609' +- category: main + dependencies: + freetype: '>=2.12.1,<3.0a0' + lcms2: '>=2.15,<3.0a0' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.5.1,<4.6.0a0' + libwebp-base: '>=1.3.1,<2.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openjpeg: '>=2.5.0,<3.0a0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + tk: '>=8.6.12,<8.7.0a0' + hash: + md5: 042cee47581520be03136d16e8cc0969 + sha256: 9feff2b191925d441b6634340cce5b553522c7a381aafacd7928b9428314a55a + manager: conda + name: pillow + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/pillow-10.0.0-py311h7cb0e2d_0.conda + version: 10.0.0 +- category: main + dependencies: + python: '>=3.6' + six: '>=1.5' + hash: + md5: dd999d1cc9f79e67dbb855c8924c7984 + sha256: 54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da + manager: conda + name: python-dateutil + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2 + version: 2.8.2 +- category: main + dependencies: + attrs: '>=22.2.0' + python: '>=3.8' + rpds-py: '>=0.7.0' + hash: + md5: 13bf095e3ecd18999d65b4d3ac5b15d5 + sha256: 870e8bdb4a14ad831e3fa5656827bfc6a129433ba9c7ab537f0aedb95064dbcd + manager: conda + name: referencing + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.0-pyhd8ed1ab_0.conda + version: 0.30.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ruamel.yaml.clib: '>=0.1.2' + setuptools: '' + hash: + md5: c5c5f7cf4ca556cfdb605e05cfbc8bec + sha256: 32598264288373706a9b2b38066b74e23d82359b22e726e2341a3622d8eab73f + manager: conda + name: ruamel.yaml + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml-0.17.32-py311h2725bcf_0.conda + version: 0.17.32 +- category: main + dependencies: + colorama: '' + python: '>=3.7' + hash: + md5: ed792aff3acb977d09c7013358097f83 + sha256: b35f185a678109940d34f68ac5781c3cbda9b118b8d9886b8f68ab5be6afd4fc + manager: conda + name: tqdm + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda + version: 4.65.0 +- category: main + dependencies: + typing_extensions: 4.7.1 pyha770c72_0 + hash: + md5: f96688577f1faa58096d06a45136afa2 + sha256: d5d19b8f5b275240c19616a46d67ec57250b3720ba88200da8c732c3fcbfc21d + manager: conda + name: typing-extensions + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda + version: 4.7.1 +- category: main + dependencies: + cffi: '>=1.0.0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 5f97ac938a90d06eebea42c321abe0d7 + sha256: a203fc8595377e74ba47ef8e11d77346a8ad7ca9d92833002a8fd12d050f82e5 + manager: conda + name: brotlipy + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/brotlipy-0.7.0-py311h5547dcb_1005.tar.bz2 + version: 0.7.0 +- category: main + dependencies: + cctools_osx-64: 973.0.1 h5676edf_13 + ld64: 609 ha02d983_13 + libllvm16: '>=16.0.0,<16.1.0a0' + hash: + md5: 846229d9e82b6db32fc37313f1306430 + sha256: a0412aa4f0e4f238742739523156ba01e88a1671f5fa64698e1a8ad28b9a2bd6 + manager: conda + name: cctools + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cctools-973.0.1-h40f6528_13.conda + version: 973.0.1 +- category: main + dependencies: + cffi: '>=1.12' + openssl: '>=3.1.1,<4.0a0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: f3975c6d2c0406f204760ac434e3b785 + sha256: 3fa286690f39b0dc3f17f673f8cffa039ec36f8397e6b6e19183a085314e8669 + manager: conda + name: cryptography + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cryptography-41.0.2-py311h892b619_0.conda + version: 41.0.2 +- category: main + dependencies: + importlib_resources: '>=1.4.0' + python: '>=3.8' + referencing: '>=0.25.0' + hash: + md5: 7c27ea1bdbe520bb830dcadd59f55cbf + sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + manager: conda + name: jsonschema-specifications + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + version: 2023.7.1 +- category: main + dependencies: + python: '>=3.7' + typing-extensions: '>=4.6.3' + hash: + md5: 044e7a1e0ad42c4e67110bd078150a63 + sha256: 885611bd528abaf3e31bc0bfaad3a619cfe89db61d886b53c2a9ec9ff50edebe + manager: conda + name: platformdirs + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda + version: 3.9.1 +- category: main + dependencies: + cffi: '>=1.11' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 864dbcdc4f7a00fee5a84d4655bc4799 + sha256: ba1b9e3ce9f0269df293d64d3d2e5d64f8043603e3ecb08f2397fc1d9dedd0d1 + manager: conda + name: zstandard + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/zstandard-0.19.0-py311h26cfcfc_2.conda + version: 0.19.0 +- category: main + dependencies: + python: '>=3.7' + zstandard: '>=0.15' + hash: + md5: ebe3230a4c1e135954eee4fb6ef8cded + sha256: a437007aa798f6d1c9f079f4dbb2a38685ac306d5a5ce3d1ee797c2de9f7d6e9 + manager: conda + name: conda-package-streaming + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda + version: 0.8.0 +- category: main + dependencies: + attrs: '>=22.2.0' + importlib_resources: '>=1.4.0' + jsonschema-specifications: '>=2023.03.6' + pkgutil-resolve-name: '>=1.3.10' + python: '>=3.8' + referencing: '>=0.28.4' + rpds-py: '>=0.7.1' + hash: + md5: 7356151a32ebd9a20158d2f26d224bfa + sha256: 09e339fc7895af45c3e183f51944f7fadf4ae3f837f6c85f6397023993336a3b + manager: conda + name: jsonschema + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.18.4-pyhd8ed1ab_0.conda + version: 4.18.4 +- category: main + dependencies: + platformdirs: '>=2.5' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + traitlets: '>=5.3' + hash: + md5: 2d45628b123595054093ff65996b98ae + sha256: 90045f63ca46c1cd66c55e7a3fce41f9719c82ec30cedc608d368fbde67b9265 + manager: conda + name: jupyter_core + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/jupyter_core-5.3.1-py311h6eed73b_0.conda + version: 5.3.1 +- category: main + dependencies: + cryptography: '>=38.0.0,<42,!=40.0.0,!=40.0.1' + python: '>=3.6' + hash: + md5: 34f7d568bf59d18e3fef8c405cbece21 + sha256: 4daea3dc896987cc1334956fccfc0ed738663a84ad0c1d3f576a7a7936091534 + manager: conda + name: pyopenssl + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda + version: 23.2.0 +- category: main + dependencies: + conda-package-streaming: '>=0.7.0' + python: '>=3.7' + hash: + md5: 44800e9bd13143292097c65e57323038 + sha256: c453b2a648e7a059f26326d476069cf81627c9a3fa12da4ab22eb39e7bfdc095 + manager: conda + name: conda-package-handling + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda + version: 2.0.2 +- category: main + dependencies: + jsonschema: '>=2.6' + jupyter_core: '' + python: '>=3.8' + python-fastjsonschema: '' + traitlets: '>=5.1' + hash: + md5: 3ec35d84fc1775215061517eb4660693 + sha256: d8b1ad3c219b39e5e325785606853ff1cd334769228490ac977b85aa95e94ba0 + manager: conda + name: nbformat + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.1-pyhd8ed1ab_0.conda + version: 5.9.1 +- category: main + dependencies: + brotlipy: '>=0.6.0' + certifi: '' + cryptography: '>=1.3.4' + idna: '>=2.0.0' + pyopenssl: '>=0.14' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: <4.0 + hash: + md5: 27db656619a55d727eaf5a6ece3d2fd6 + sha256: 213bdf6c3a5d721fa83b45d527d3ecd340f9547c0d6bbd0b8d9d746ec9a1fb4b + manager: conda + name: urllib3 + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda + version: 1.26.15 +- category: main + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + manager: conda + name: requests + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + version: 2.31.0 +- category: main + dependencies: + boltons: '>=23.0.0' + conda-package-handling: '>=1.3.0' + jsonpatch: '>=1.32' + packaging: '>=23.0' + pluggy: '>=1.0.0' + pycosat: '>=0.6.3' + pyopenssl: '>=16.2.0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + requests: '>=2.20.1,<3' + ruamel.yaml: '>=0.11.14,<0.18' + setuptools: '>=60.0.0' + toolz: '>=0.8.1' + tqdm: '>=4' + hash: + md5: fda4d380f6a892e800657621c0450237 + sha256: 7065dbeb0b54087981f3868d88625003989f661f24456ea555bd7299d448a623 + manager: conda + name: conda + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/conda-23.7.1-py311h6eed73b_0.conda + version: 23.7.1 +- category: main + dependencies: + python: '>=3.6' + requests: '>=2.0.1,<3.0.0' + hash: + md5: 99c98318c8646b08cc764f90ce98906e + sha256: 20eaefc5dba74ff6c31e537533dde59b5b20f69e74df49dff19d43be59785fa3 + manager: conda + name: requests-toolbelt + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + version: 1.0.0 +- category: main + dependencies: + click: '>=8' + conda: '>=4.12.0' + conda-package-streaming: '' + filelock: '' + jinja2: '' + more-itertools: '' + python: '>=3.7' + pyyaml: '>=6' + hash: + md5: 962d9bb20afaa4b839912bb4cd9869a2 + sha256: 1562176f33affec7b2af35eefa60da11cf7a5299edb1b664832f6d39c73ae0f1 + manager: conda + name: conda-index + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-index-0.2.3-pyhd8ed1ab_0.conda + version: 0.2.3 +- category: main + dependencies: + __unix: '' + conda: '>=4.6' + conda-standalone: '' + pillow: '>=3.1' + python: '>=3.7' + ruamel.yaml: '>=0.11.14,<0.18' + hash: + md5: 6935bda357fb4052a82a8c3ce17b176a + sha256: 7cdc83ef761fa4e8dff316e49f7b2c839a5a87cd3516762de2a36c4082af5109 + manager: conda + name: constructor + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/constructor-3.4.4-pyh55f8243_0.conda + version: 3.4.4 +- category: main + dependencies: + beautifulsoup4: '' + cctools: '' + chardet: '' + conda: '>=4.13' + conda-index: '' + conda-package-handling: '>=1.3' + filelock: '' + glob2: '>=0.6' + jinja2: '' + packaging: '' + patch: '>=2.6' + pkginfo: '' + psutil: '' + py-lief: '' + python: '>=3.11,<3.12.0a0' + python-libarchive-c: '' + python_abi: 3.11.* *_cp311 + pytz: '' + pyyaml: '' + requests: '' + ripgrep: '' + six: '' + tqdm: '' + hash: + md5: a97b76fe3d661f1f30aedb0a24ca45fb + sha256: 1b18ede4175af0af639bc084b10d3126dca31297db067e7afc2decd8512622df + manager: conda + name: conda-build + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/conda-build-3.26.0-py311h6eed73b_1.conda + version: 3.26.0 +- category: main + dependencies: + anaconda-project: '>=0.9.1' + clyent: '>=1.2.0' + conda-package-handling: '>=1.7.3' + defusedxml: '>=0.7.1' + nbformat: '>=4.4.0' + pillow: '>=8.2' + python: '>=3.6' + python-dateutil: '>=2.6.1' + pytz: '>=2021.3' + pyyaml: '>=3.12' + requests: '>=2.20.0' + requests-toolbelt: '>=0.9.1' + setuptools: '>=58.0.4' + six: '>=1.15.0' + tqdm: '>=4.56.0' + urllib3: '>=1.26.4,<2.0.0a0' + hash: + md5: 0bc9d7f17f6f946c66f896bda5c7ee6b + sha256: 5cfacf9053b46dd7f44825d0023e1f5359e05c3b0cc985f0789e944e8b62701c + manager: conda + name: anaconda-client + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.12.0-pyhd8ed1ab_0.conda + version: 1.12.0 +- category: main + dependencies: + anaconda-client: '' + conda-pack: '' + jinja2: '' + python: '>=3.6' + requests: '' + ruamel_yaml: '' + tornado: '>=4.2' + tqdm: '' + hash: + md5: 85406089db6aa63ee45da8e9f0b966b6 + sha256: 5025ff5066e4a8765ca35bb4f6145f188b249634090236c8beb25f3fb5ed4874 + manager: conda + name: anaconda-project + optional: false + platform: osx-64 + url: https://conda.anaconda.org/conda-forge/noarch/anaconda-project-0.11.1-pyhd8ed1ab_0.tar.bz2 + version: 0.11.1 +- category: main + dependencies: {} + hash: + md5: b1c2327b36f1a25d96f2039b0d3e3739 + sha256: b85a6f307f8e1c803cb570bdfb9e4d811a361417873ecd2ecf687587405a72e0 + manager: conda + name: ca-certificates + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.7.22-h56e8100_0.conda + version: 2023.7.22 +- category: main + dependencies: {} + hash: + md5: 09f64a2fc5d235c943964f7894d240cb + sha256: 991e60b2b9f59f38ce57221e01c92bccbfbd306330172ad714d963476c06f4fa + manager: conda + name: conda-standalone + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/conda-standalone-22.11.1-h57928b3_0.conda + version: 22.11.1 +- category: main + dependencies: {} + hash: + md5: 636cc3cbbd2e28bcfd2f73b2044aac2c + sha256: 794b2a9be72f176a2767c299574d330ffb76b2ed75d7fd20bee3bbadce5886cf + manager: conda + name: libexpat + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.5.0-h63175ca_1.conda + version: 2.5.0 +- category: main + dependencies: {} + hash: + md5: b0309b72560df66f71a9d5e34a5efdfa + sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 + manager: conda + name: msys2-conda-epoch + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + version: '20160418' +- category: main + dependencies: {} + hash: + md5: 193e5a01f3bacbb4dc680416084b25e7 + sha256: 2010dee9ee4ead2e8bb1886b294379869d79a39b9213e04e43d30538c135853d + manager: conda + name: nsis + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/nsis-3.08-h2be35fd_2.conda + version: '3.08' +- category: main + dependencies: {} + hash: + md5: fd1634ba85cfea9376e1fc02d6f592e9 + sha256: e042841d13274354d651a69a4f2589e9b46fd23b416368c9821bf3c6676f19d7 + manager: conda + name: python_abi + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.11-3_cp311.conda + version: '3.11' +- category: main + dependencies: {} + hash: + md5: 939e3e74d8be4dac89ce83b20de2492a + sha256: 0449138224adfa125b220154408419ec37c06b0b49f63c5954724325903ecf55 + manager: conda + name: tzdata + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda + version: 2023c +- category: main + dependencies: {} + hash: + md5: 72608f6cd3e5898229c3ea16deb1ac43 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + manager: conda + name: ucrt + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + version: 10.0.22621.0 +- category: main + dependencies: + msys2-conda-epoch: '>=20160418' + hash: + md5: ce25c58bc90071bf71f3d472cb8dfbce + sha256: cd0273a1de68b61325d78eac304b997050ad90555cebcfdd0287cdc7476265d0 + manager: conda + name: m2-msys2-runtime + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2-msys2-runtime-2.5.0.17080.65c939c-3.tar.bz2 + version: 2.5.0.17080.65c939c +- category: main + dependencies: + msys2-conda-epoch: '>=20160418' + hash: + md5: 53a1c73e1e3d185516d7e3af177596d9 + sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 + manager: conda + name: m2w64-gmp + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + version: 6.1.0 +- category: main + dependencies: + msys2-conda-epoch: '>=20160418' + hash: + md5: 774130a326dee16f1ceb05cc687ee4f0 + sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 + manager: conda + name: m2w64-libwinpthread-git + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + version: 5.0.0.4634.697f757 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + hash: + md5: 91c1ecaf3996889532fc0456178b1058 + sha256: e76986c555647347a0185e646ef65625dabed60da255f6b30367df8bd6dc6cd8 + manager: conda + name: vc14_runtime + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.36.32532-hfdfe4a8_17.conda + version: 14.36.32532 +- category: main + dependencies: + m2-msys2-runtime: '' + msys2-conda-epoch: '>=20160418' + hash: + md5: f5159110837c3e221146e623f3c44f1c + sha256: 83418582d62ae8e50cb36d6318339779050d790ab2891baaa2fc86fea5208b5e + manager: conda + name: m2-patch + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2-patch-2.7.5-2.tar.bz2 + version: 2.7.5 +- category: main + dependencies: + m2w64-gmp: '' + m2w64-libwinpthread-git: '' + msys2-conda-epoch: '>=20160418' + hash: + md5: 4289d80fb4d272f1f3b56cfe87ac90bd + sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 + manager: conda + name: m2w64-gcc-libs-core + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + version: 5.3.0 +- category: main + dependencies: + vc14_runtime: '>=14.36.32532' + hash: + md5: 67ff6791f235bb606659bf2a5c169191 + sha256: 86ae94bf680980776aa761c2b0909a0ddbe1f817e7eeb8b16a1730f10f8891b6 + manager: conda + name: vc + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h64f974e_17.conda + version: '14.3' +- category: main + dependencies: + vc14_runtime: '>=14.36.32532' + hash: + md5: 4618046c39f7c81861e53ded842e738a + sha256: 5ecbd731dc7f13762d67be0eadc47eb7f14713005e430d9b5fc680e965ac0f81 + manager: conda + name: vs2015_runtime + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.36.32532-h05e6639_17.conda + version: 14.36.32532 +- category: main + dependencies: + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + hash: + md5: 7c03c66026944073040cb19a4f3ec3c9 + sha256: 5389dad4e73e4865bb485f460fc60b120bae74404003d457ecb1a62eb7abf0c1 + manager: conda + name: bzip2 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h8ffe710_4.tar.bz2 + version: 1.0.8 +- category: main + dependencies: + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30037' + hash: + md5: 1900cb3cab5055833cfddb0ba233b074 + sha256: f4f39d7f6a2f9b407f8fb567a6c25755270421731d70f0ff331f5de4fa367488 + manager: conda + name: lerc + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h63175ca_0.tar.bz2 + version: 4.0.0 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: 493acc14c556ef6f1d13ba00b099c679 + sha256: 9a9a1a6e47777c9bf6086d88f6567ed3fc32d4f849b3d42b51bbf0b9fa4727f7 + manager: conda + name: libdeflate + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.18-hcfcfb64_0.conda + version: '1.18' +- category: main + dependencies: + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + hash: + md5: 2c96d1b6915b408893f9472569dee135 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + manager: conda + name: libffi + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + version: 3.4.2 +- category: main + dependencies: + vc: '>=14.1,<15' + vs2015_runtime: '>=14.16.27033' + hash: + md5: 050119977a86e4856f0416e2edcf81bb + sha256: 657c2a992c896475021a25faebd9ccfaa149c5d70c7dc824d4069784b686cea1 + manager: conda + name: libiconv + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.17-h8ffe710_0.tar.bz2 + version: '1.17' +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: f2fad2ae9f1365e343e4329fdb1e9d63 + sha256: 42a874448d060b59f9b5c900b260c992df9543da55c2ac9537b442450d6e6497 + manager: conda + name: libjpeg-turbo + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-2.1.5.1-hcfcfb64_0.conda + version: 2.1.5.1 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: 37f670590cc40b69393894cca459e346 + sha256: 4cbdf696b1024cdfc138b64ed2ac23d01cb3f998c72bfecdce2760aa94f51eba + manager: conda + name: liblief + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/liblief-0.12.3-h63175ca_0.tar.bz2 + version: 0.12.3 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: 9a71d93deb99cc09d8939d5235b5909a + sha256: 70bc1fdb72de847807355c13144666d4f151894f9b141ee559f5d243bdf577e2 + manager: conda + name: libsqlite + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.42.0-hcfcfb64_0.conda + version: 3.42.0 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: f89e765213cac556a8ed72ba8c1b5071 + sha256: 1652438917a14bf67c1dc5a94a431f45fece7837c016a7144979a50924faa1b7 + manager: conda + name: libwebp-base + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.3.1-hcfcfb64_0.conda + version: 1.3.1 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 + manager: conda + name: libzlib + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda + version: 1.2.13 +- category: main + dependencies: + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: e34720eb20a33fc3bfb8451dd837ab7a + sha256: a0954b4b1590735ea5f3d0f4579c3883f8ac837387afd5b398b241fda85124ab + manager: conda + name: lz4-c + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.9.4-hcfcfb64_0.conda + version: 1.9.4 +- category: main + dependencies: + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + hash: + md5: d5cf4b7eaa52316f135eed9e8548ad57 + sha256: ff064e34d3cad829f1e31f2d26125b61d20ba8d3771f8f5337069027b8e3fab4 + manager: conda + name: lzo + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-he774522_1000.tar.bz2 + version: '2.10' +- category: main + dependencies: + m2w64-gcc-libs-core: '' + msys2-conda-epoch: '>=20160418' + hash: + md5: 066552ac6b907ec6d72c0ddab29050dc + sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 + manager: conda + name: m2w64-gcc-libgfortran + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + version: 5.3.0 +- category: main + dependencies: + ca-certificates: '' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: 1d913a5de46c6b2f7e4cfbd26b106b8b + sha256: 4424486fb9a2aeaba912a8dd8a5b5cdb6fcd65d7708fd854e3ea27449bb352a3 + manager: conda + name: openssl + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.1.1-hcfcfb64_1.conda + version: 3.1.1 +- category: main + dependencies: + vc: '>=14.1,<15' + vs2015_runtime: '>=14.16.27033' + hash: + md5: c69a5047cc9291ae40afd4a1ad6f0c0f + sha256: 087795090a99a1d397ef1ed80b4a01fabfb0122efb141562c168e3c0a76edba6 + manager: conda + name: tk + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.12-h8ffe710_0.tar.bz2 + version: 8.6.12 +- category: main + dependencies: + vc: '>=14.1,<15' + vs2015_runtime: '>=14.16.27033' + hash: + md5: 515d77642eaa3639413c6b1bc3f94219 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + manager: conda + name: xz + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + version: 5.2.6 +- category: main + dependencies: + vc: '>=14.1,<15.0a0' + vs2015_runtime: '>=14.16.27012' + hash: + md5: adbfb9f45d1004a26763652246a33764 + sha256: 4e2246383003acbad9682c7c63178e2e715ad0eb84f03a8df1fbfba455dfedc5 + manager: conda + name: yaml + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h8ffe710_2.tar.bz2 + version: 0.2.5 +- category: main + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: ab6febdb2dbd9c00803609079db4de71 + sha256: 1f139a72109366ba1da69f5bdc569b0e6783f887615807c02d7bfcc2c7575067 + manager: conda + name: libpng + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.39-h19919ed_0.conda + version: 1.6.39 +- category: main + dependencies: + libiconv: '>=1.17,<2.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: 586627982a63815637f871a6360fe3f9 + sha256: d9d2210436ac28d1a15de08468202a944135d17da3b37fd82c0e90a36ce8ef72 + manager: conda + name: libxml2 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.11.4-hc3477c8_0.conda + version: 2.11.4 +- category: main + dependencies: + m2w64-gcc-libgfortran: '' + m2w64-gcc-libs-core: '' + m2w64-gmp: '' + m2w64-libwinpthread-git: '' + msys2-conda-epoch: '>=20160418' + hash: + md5: fe759119b8b3bfa720b8762c6fdc35de + sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa + manager: conda + name: m2w64-gcc-libs + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + version: 5.3.0 +- category: main + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libexpat: '>=2.5.0,<3.0a0' + libffi: '>=3.4,<4.0a0' + libsqlite: '>=3.42.0,<4.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openssl: '>=3.1.1,<4.0a0' + tk: '>=8.6.12,<8.7.0a0' + tzdata: '' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + xz: '>=5.2.6,<6.0a0' + hash: + md5: 3187a32fba79e835f099ecea054026f4 + sha256: d43fa70a3549fea27d3993f79ba2584ec6d6fe2aaf6e5890847f974e89a744e0 + manager: conda + name: python + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.11.4-h2628c8c_0_cpython.conda + version: 3.11.4 +- category: main + dependencies: + libzlib: '>=1.2.13,<1.3.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: f3c3879d8cda1c5a6885435dd48a470e + sha256: 33e8fb73dee10740f00d4a450ad2d7f6d90692ca781480fa18fa70fd417d53ad + manager: conda + name: zstd + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.2-h12be248_7.conda + version: 1.5.2 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 3edfead7cedd1ab4400a6c588f3e75f8 + sha256: 063639cd568f5c7a557b0fb1cc27f098598c0d8ff869088bfeb82934674f8821 + manager: conda + name: attrs + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda + version: 23.1.0 +- category: main + dependencies: + python: 2.7.*|>=3.7 + hash: + md5: 033eb25fffd222aceeca6d58cd953680 + sha256: 4ff828cceb8f55cb26d23b1a4c174d22c7cd92350221724bcaf2d6632e33fdee + manager: conda + name: boltons + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/boltons-23.0.0-pyhd8ed1ab_0.conda + version: 23.0.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 7f3dbc9179b4dde7da98dfb151d0ad22 + sha256: db66e31866ff4250c190788769e3a8a1709237c3e9c38d7143aae95ab75fcb31 + manager: conda + name: certifi + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda + version: 2023.7.22 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: bb0899c06c1df8fc7802caab197b0963 + sha256: 16c766794dd7b5870d911aa91d63916fd65ce5f77a9d03f558cfe5b2e75f4729 + manager: conda + name: chardet + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/chardet-5.1.0-py311h1ea47a8_0.conda + version: 5.1.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 313516e9a4b08b12dfb1e1cd390a96e3 + sha256: 0666a95fbbd2299008162e2126c009191e5953d1cad1878bf9f4d8d634af1dd4 + manager: conda + name: charset-normalizer + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.2.0-pyhd8ed1ab_0.conda + version: 3.2.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 3faab06a954c2a04039983f2c4a50d99 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + manager: conda + name: colorama + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + version: 0.4.6 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 961b3a227b437d82ad7054484cfa71b2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + manager: conda + name: defusedxml + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + version: 0.7.1 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 53522ec72e6adae42bd373ef58357230 + sha256: 1cbae9f05860f2e566e2977f14dfcd5494beb22c028b0a853ade4ec381d9de71 + manager: conda + name: filelock + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.2-pyhd8ed1ab_0.conda + version: 3.12.2 +- category: main + dependencies: + libpng: '>=1.6.39,<1.7.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + vc: '>=14.1,<15' + vs2015_runtime: '>=14.16.27033' + hash: + md5: 1b513009cd012591f3fdc9e03a74ec0a + sha256: fe027235660d9dfe7889c350a51e96bc0134c3f408827a4c58c4b0557409984c + manager: conda + name: freetype + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/freetype-2.12.1-h546665d_1.conda + version: 2.12.1 +- category: main + dependencies: + python: '' + hash: + md5: 1f3a88e65e61216e1d475135922dbf6a + sha256: d8ae39a37fb99489525846f77c4ae85cb6b42360d34936bb0393025db5f0508d + manager: conda + name: glob2 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/glob2-0.7-py_0.tar.bz2 + version: '0.7' +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 34272b248891bddccc64479f9a7fffed + sha256: 9887c35c374ec1847f167292d3fde023cb4c994a4ceeec283072b95440131f09 + manager: conda + name: idna + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2 + version: '3.4' +- category: main + dependencies: + python: '' + hash: + md5: 07d85c22a3beb102a48cd123df84c2a6 + sha256: da279af2285d8f575a7f5652e83bf7f36155c4c63154e385a9d171efcc607bc1 + manager: conda + name: jsonpointer + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-2.0-py_0.tar.bz2 + version: '2.0' +- category: main + dependencies: + bzip2: '>=1.0.8,<2.0a0' + libxml2: '>=2.11.3,<2.12.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + lz4-c: '>=1.9.3,<1.10.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.1.0,<4.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 314124476882f64abc20b76148d2909b + sha256: 4699b9439453cea6a28c94eb6226929adcf4fbe3a9a635f7a7a229ed903c8987 + manager: conda + name: libarchive + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.6.2-h6f8411a_1.conda + version: 3.6.2 +- category: main + dependencies: + lerc: '>=4.0.0,<5.0a0' + libdeflate: '>=1.18,<1.19.0a0' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + xz: '>=5.2.6,<6.0a0' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: cc46fe88f82f9c98bd6858b3f6efb4e0 + sha256: 688e813d61e0d5dff284ef95c53b5c0acf950bbc1df97def4a4a33bbf1bb2fab + manager: conda + name: libtiff + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.5.1-h6c8260b_0.conda + version: 4.5.1 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: db2c2f72a83bdc5b70947964e1ddc8bb + sha256: 53093042d6223531559fab2096eed85abee39d9386df9d7d42f9398e40017f04 + manager: conda + name: markupsafe + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.3-py311ha68e1ae_0.conda + version: 2.1.3 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 8eb00075c8acb7dd264c4a8537b89549 + sha256: f23b6f89654c21ff994991a2c0e018311e2a9288a68796d1612d4fb953b75be2 + manager: conda + name: menuinst + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/menuinst-1.4.19-py311h1ea47a8_1.tar.bz2 + version: 1.4.19 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: db9968cb68b536d6c538f48f351a997b + sha256: 7cf415aaf1dce7db8a7887ab29ed8b57b2a68e1c70d4306bbafc23daf8872d75 + manager: conda + name: more-itertools + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.0.0-pyhd8ed1ab_0.conda + version: 10.0.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 91cda59e66e1e4afe9476f8ef98f5c30 + sha256: ded536a96a00d45a693dbc2971bb688248324dadd129eddda2100e177583d768 + manager: conda + name: packaging + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda + version: '23.1' +- category: main + dependencies: + python: '' + hash: + md5: a8f6c4fa2e2edf7ee65714910a9a760f + sha256: 5b4a23ae7ed47707b76856dfc33c169988fc8dee421b6b75eea18d2e13505129 + manager: conda + name: patch-ng + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/patch-ng-1.17.4-pyh9f0ad1d_0.tar.bz2 + version: 1.17.4 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: be1e9f1c65a1ed0f2ae9352fec99db64 + sha256: 7ea5a5af62a15376d9f4f9f3c134874d0b0710f39be719e849b7fa9ca8870502 + manager: conda + name: pkginfo + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.9.6-pyhd8ed1ab_0.conda + version: 1.9.6 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 89e3c7cdde7d3aaa2aee933b604dd07f + sha256: 7d055ffc8a02bf781a89d069db3454b453605cdaff300b82cedcc7133283e47e + manager: conda + name: pkgutil-resolve-name + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_0.tar.bz2 + version: 1.3.10 +- category: main + dependencies: + python: '>=3.8' + hash: + md5: 7263924c642d22e311d9e59b839f1b33 + sha256: ff1f70e0bd50693be7e2bad0efb2539f5dcc5ec4d638e787e703f28098e72de4 + manager: conda + name: pluggy + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.2.0-pyhd8ed1ab_0.conda + version: 1.2.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: f1a1eecd1bb4f431df5b9b6d8a152efd + sha256: b7c3ea83142689ffc6029bb745f6a4836818f1b1c1ba9e9f9ba3a9498f4a3cd4 + manager: conda + name: psutil + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.5-py311ha68e1ae_0.conda + version: 5.9.5 +- category: main + dependencies: + m2w64-gcc-libs: '' + hash: + md5: a1f820480193ea83582b13249a7e7bd9 + sha256: bb5a6ddf1a609a63addd6d7b488b0f58d05092ea84e9203283409bff539e202a + manager: conda + name: pthread-stubs + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-hcd874cb_1001.tar.bz2 + version: '0.4' +- category: main + dependencies: + liblief: 0.12.3 h63175ca_0 + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: e3bbee7381ef4ed51db5832641c26893 + sha256: 51430af4289db873abd0d7fd541e57a700a9b42ba5cf5f5a877320aeb180f399 + manager: conda + name: py-lief + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/py-lief-0.12.3-py311h12c1d0e_0.tar.bz2 + version: 0.12.3 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: c7af04cd8a66f6d782982751200239d0 + sha256: 8de24e33f221b3b5af45d40837f321b15e1b591ff60b9b6006e612c41d9d2121 + manager: conda + name: pycosat + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pycosat-0.6.4-py311ha68e1ae_1.tar.bz2 + version: 0.6.4 +- category: main + dependencies: + python: 2.7.*|>=3.4 + hash: + md5: 076becd9e05608f8dc72757d5f3a91ff + sha256: 74c63fd03f1f1ea2b54e8bc529fd1a600aaafb24027b738d0db87909ee3a33dc + manager: conda + name: pycparser + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2 + version: '2.21' +- category: main + dependencies: + python: '>=3.3' + hash: + md5: 3be9466311564f80f8056c0851fc5bb7 + sha256: 73985a9a2dd7ccf77b7428a12148e1b381c8635e9195e47a652397e9a56284ce + manager: conda + name: python-fastjsonschema + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.18.0-pyhd8ed1ab_0.conda + version: 2.18.0 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: d3076b483092a435832603243567bc31 + sha256: e4999484f21763ca4b8f92c95b22cb6d1edc1b61d0a2bb073ee2bd11f39401b9 + manager: conda + name: pytz + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda + version: '2023.3' +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: 20a2d8e73b0be8e27ca4096d4f3a7053 + sha256: cdefd0688f776940bcc74fd981328a5d45e734006538dca6d686f8d21051c753 + manager: conda + name: pywin32 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pywin32-304-py311h12c1d0e_2.tar.bz2 + version: '304' +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + yaml: '>=0.2.5,<0.3.0a0' + hash: + md5: 0c97d59d54eb52e170224b3de6ade906 + sha256: b97ad8513a22204707dc9ef506f7eca70dc9027cb09e26f559ca560d8b21ae14 + manager: conda + name: pyyaml + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0-py311ha68e1ae_5.tar.bz2 + version: '6.0' +- category: main + dependencies: + m2w64-gcc-libs: '' + hash: + md5: 8f37f34d42c5675df21caf041597e792 + sha256: 147578614a4d716f3a9a9ca162efddc8157b44ada88bf53243254ac3c5d21567 + manager: conda + name: ripgrep + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ripgrep-13.0.0-h7f3b576_2.tar.bz2 + version: 13.0.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: d2d75b1d27bcd4f7b6d049b32b2f7530 + sha256: d19cac6dd0a30525e3e5541a41152c7731c4236fb3b39a5ca010f5a9888504ba + manager: conda + name: rpds-py + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.9.2-py311hc37eb10_0.conda + version: 0.9.2 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: 654fbe603c79490699cd7447e4627aee + sha256: 407ea37bbf6da39261294624f6eb5a247bf8674a1c73fe8e89878331e233f431 + manager: conda + name: ruamel.yaml.clib + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml.clib-0.2.7-py311ha68e1ae_1.conda + version: 0.2.7 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + yaml: '>=0.2.5,<0.3.0a0' + hash: + md5: c1c3cca1078977cfa12d36f32eb58fbe + sha256: a1b939fcff48c5dd98e2cfbcafcd7c1e2ded1321cb018934972cf43861d501bd + manager: conda + name: ruamel_yaml + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ruamel_yaml-0.15.80-py311ha68e1ae_1008.tar.bz2 + version: 0.15.80 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: 5a7739d0f57ee64133c9d32e6507c46d + sha256: 083a0913f5b56644051f31ac40b4eeea762a88c00aa12437817191b85a753cec + manager: conda + name: setuptools + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.0.0-pyhd8ed1ab_0.conda + version: 68.0.0 +- category: main + dependencies: + python: '' + hash: + md5: e5f25f8dbc060e9a8d912e432202afc2 + sha256: a85c38227b446f42c5b90d9b642f2c0567880c15d72492d8da074a59c8f91dd6 + manager: conda + name: six + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2 + version: 1.16.0 +- category: main + dependencies: + python: '>=3.6' + hash: + md5: 146f4541d643d48fc8a75cacf69f03ae + sha256: 72d80dda41c3902c2619e8ab49d4f5b2a894d13375e1f9ed16fc00074ddd2307 + manager: conda + name: soupsieve + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2 + version: 2.3.2.post1 +- category: main + dependencies: + python: '>=3.5' + hash: + md5: 92facfec94bc02d6ccf42e7173831a36 + sha256: 90229da7665175b0185183ab7b53f50af487c7f9b0f47cf09c184cbc139fd24b + manager: conda + name: toolz + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2 + version: 0.12.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: e2a6c106c1cff7e884d93351cdee3c3e + sha256: 861842b01e24ec66b73909027cd081e47c567710f2ecb06402dcc387c22b24ef + manager: conda + name: tornado + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tornado-6.3.2-py311ha68e1ae_0.conda + version: 6.3.2 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: d0b4f5c87cd35ac3fb3d47b223263a64 + sha256: 343610bce6dbe8a5090500dd2e9d1706057960b3f3120ebfe0abb4a8ecbada4d + manager: conda + name: traitlets + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.9.0-pyhd8ed1ab_0.conda + version: 5.9.0 +- category: main + dependencies: + python: '>=3.7' + hash: + md5: c39d6a09fe819de4951c2642629d9115 + sha256: 6edd6d5be690be492712cb747b6d62707f0d0c34ef56eefc796d91e5a03187d1 + manager: conda + name: typing_extensions + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.7.1-pyha770c72_0.conda + version: 4.7.1 +- category: main + dependencies: + __win: '' + python: '>=3.6' + hash: + md5: 30878ecc4bd36e8deeea1e3c151b2e0b + sha256: a11ae693a0645bf6c7b8a47bac030be9c0967d0b1924537b9ff7458e832c0511 + manager: conda + name: win_inet_pton + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyhd8ed1ab_6.tar.bz2 + version: 1.1.0 +- category: main + dependencies: + m2w64-gcc-libs: '' + m2w64-gcc-libs-core: '' + hash: + md5: c46ba8712093cb0114404ae8a7582e1a + sha256: 8c5b976e3b36001bdefdb41fb70415f9c07eff631f1f0155f3225a7649320e77 + manager: conda + name: xorg-libxau + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.11-hcd874cb_0.conda + version: 1.0.11 +- category: main + dependencies: + m2w64-gcc-libs: '' + hash: + md5: 46878ebb6b9cbd8afcf8088d7ef00ece + sha256: f51205d33c07d744ec177243e5d9b874002910c731954f2c8da82459be462b93 + manager: conda + name: xorg-libxdmcp + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.3-hcd874cb_0.tar.bz2 + version: 1.1.3 +- category: main + dependencies: + python: '>=3.8' + hash: + md5: 2da0451b54c4563c32490cb1b7cf68a1 + sha256: 16d72127e150a3d5cbdc0b82c4069ef5be135c64bc99e71e7928507910669b41 + manager: conda + name: zipp + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.16.2-pyhd8ed1ab_0.conda + version: 3.16.2 +- category: main + dependencies: + python: '>=3.6' + soupsieve: '>=1.2' + hash: + md5: a362ff7d976217f8fa78c0f1c4f59717 + sha256: 52d3e6bcd442537e22699cd227d8fdcfd54b708eeb8ee5b4c671a6a9b9cd74da + manager: conda + name: beautifulsoup4 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda + version: 4.12.2 +- category: main + dependencies: + pycparser: '' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: a8524727eb956b4741e25a64af79edb8 + sha256: 49ce08187365f97c67476d504411de0a17e69b972ab6b80521d01dc80dd657e6 + manager: conda + name: cffi + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cffi-1.15.1-py311h7d9ee11_3.conda + version: 1.15.1 +- category: main + dependencies: + __win: '' + colorama: '' + python: '>=3.8' + hash: + md5: c1e57b6771510a3d2648ed6e76277391 + sha256: 6fa8a7c644073b88ef3f857bb56f51efcf7c3852777a009187360f9a6bd1c606 + manager: conda + name: click + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.6-win_pyh7428d3b_0.conda + version: 8.1.6 +- category: main + dependencies: + python: '' + setuptools: '' + hash: + md5: b9ee3fdf59f49883497741509ea364b6 + sha256: 2521c43e0e481ad543baa0bb9289aff2bb242d5304eed11f17ca45943300ae62 + manager: conda + name: clyent + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/clyent-1.2.2-py_1.tar.bz2 + version: 1.2.2 +- category: main + dependencies: + python: '>=3.6' + setuptools: '' + hash: + md5: 84b284cebf2a158306653f9a6961d589 + sha256: 922fa7f915b490daf5c74bc204b369fd1c1b1d08f50638a7134ab412f90df984 + manager: conda + name: conda-pack + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-pack-0.7.0-pyh6c4a22f_0.tar.bz2 + version: 0.7.0 +- category: main + dependencies: + python: '>=3.8' + zipp: '>=3.1.0' + hash: + md5: a08b6be5bf18b9d2a927d3457750f82e + sha256: 94c1b2831c0f908ae56212d9aeb9c9173051d307682b4fedfd88fef774b0b8f7 + manager: conda + name: importlib_resources + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.0.0-pyhd8ed1ab_1.conda + version: 6.0.0 +- category: main + dependencies: + markupsafe: '>=2.0' + python: '>=3.7' + hash: + md5: c8490ed5c70966d232fdd389d0dbed37 + sha256: b045faba7130ab263db6a8fdc96b1a3de5fcf85c4a607c5f11a49e76851500b5 + manager: conda + name: jinja2 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2 + version: 3.1.2 +- category: main + dependencies: + jsonpointer: '>=1.9' + python: '>=3.6' + hash: + md5: 09150b51b0528a31a0f6500b96fdde82 + sha256: d87fd8da2d3327744821b6b1d1e5b76e4077224fb626ce02d6623a1bc6ee2563 + manager: conda + name: jsonpatch + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonpatch-1.32-pyhd8ed1ab_0.tar.bz2 + version: '1.32' +- category: main + dependencies: + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.5.0,<4.6.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: a76c36ad1b4b87f038d67890122d08ec + sha256: 24179aae324bcfa65ec983a389c5e048bd6b174f63afedf4cdd654da78cf9558 + manager: conda + name: lcms2 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.15-h3e3b177_1.conda + version: '2.15' +- category: main + dependencies: + m2w64-gcc-libs: '' + m2w64-gcc-libs-core: '' + pthread-stubs: '' + xorg-libxau: '' + xorg-libxdmcp: '' + hash: + md5: 090d91b69396f14afef450c285f9758c + sha256: d01322c693580f53f8d07a7420cd6879289f5ddad5531b372c3efd1c37cac3bf + manager: conda + name: libxcb + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.15-hcd874cb_0.conda + version: '1.15' +- category: main + dependencies: + libpng: '>=1.6.39,<1.7.0a0' + libtiff: '>=4.5.0,<4.6.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: db0490689232e8e38c312281df6f31a2 + sha256: 1fb72db47e9b1cdb4980a1fd031e31fad2c6a4a632fc602e7d6fa74f4f491608 + manager: conda + name: openjpeg + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.0-ha2aaf27_2.conda + version: 2.5.0 +- category: main + dependencies: + __win: '' + python: '>=3.8' + win_inet_pton: '' + hash: + md5: 56cd9fe388baac0e90c7149cfac95b60 + sha256: b3a612bc887f3dd0fb7c4199ad8e342bd148cf69a9b74fd9468a18cf2bef07b7 + manager: conda + name: pysocks + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh0701188_6.tar.bz2 + version: 1.7.1 +- category: main + dependencies: + python: '>=3.6' + six: '>=1.5' + hash: + md5: dd999d1cc9f79e67dbb855c8924c7984 + sha256: 54d7785c7678166aa45adeaccfc1d2b8c3c799ca2dc05d4a82bb39b1968bd7da + manager: conda + name: python-dateutil + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2 + version: 2.8.2 +- category: main + dependencies: + libarchive: '' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + hash: + md5: 659bc6061b6dc9ef0436ee22d64e8ac2 + sha256: 6d56ac58b2e85163488de33b6586d1ba042e1a5bc058d478bc1487299ce13081 + manager: conda + name: python-libarchive-c + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-libarchive-c-5.0-py311h1ea47a8_1.conda + version: '5.0' +- category: main + dependencies: + attrs: '>=22.2.0' + python: '>=3.8' + rpds-py: '>=0.7.0' + hash: + md5: 13bf095e3ecd18999d65b4d3ac5b15d5 + sha256: 870e8bdb4a14ad831e3fa5656827bfc6a129433ba9c7ab537f0aedb95064dbcd + manager: conda + name: referencing + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.0-pyhd8ed1ab_0.conda + version: 0.30.0 +- category: main + dependencies: + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ruamel.yaml.clib: '>=0.1.2' + setuptools: '' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: 1a51f29331338bfde51127db204d7757 + sha256: b287388ea53da5437ceac8bd9ff9ee161d3a2433275a0f74b332c6b032d9ef50 + manager: conda + name: ruamel.yaml + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ruamel.yaml-0.17.32-py311ha68e1ae_0.conda + version: 0.17.32 +- category: main + dependencies: + colorama: '' + python: '>=3.7' + hash: + md5: ed792aff3acb977d09c7013358097f83 + sha256: b35f185a678109940d34f68ac5781c3cbda9b118b8d9886b8f68ab5be6afd4fc + manager: conda + name: tqdm + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.65.0-pyhd8ed1ab_1.conda + version: 4.65.0 +- category: main + dependencies: + typing_extensions: 4.7.1 pyha770c72_0 + hash: + md5: f96688577f1faa58096d06a45136afa2 + sha256: d5d19b8f5b275240c19616a46d67ec57250b3720ba88200da8c732c3fcbfc21d + manager: conda + name: typing-extensions + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.7.1-hd8ed1ab_0.conda + version: 4.7.1 +- category: main + dependencies: + cffi: '>=1.0.0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vs2015_runtime: '>=14.29.30139' + hash: + md5: dd9604ece454103e7210110c6d343e37 + sha256: 7165aa68df59f61e48a2a513374fa6551295bccd76cefaefd0b86665fd56601f + manager: conda + name: brotlipy + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/brotlipy-0.7.0-py311ha68e1ae_1005.tar.bz2 + version: 0.7.0 +- category: main + dependencies: + cffi: '>=1.12' + openssl: '>=3.1.1,<4.0a0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: ea9fc978bfef9ceeb950687f0063c460 + sha256: bf01795e9d5ddf58a8d18fcf44d72b8f520f813b76617f40c587a479ca910a83 + manager: conda + name: cryptography + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cryptography-41.0.2-py311h28e9c30_0.conda + version: 41.0.2 +- category: main + dependencies: + importlib_resources: '>=1.4.0' + python: '>=3.8' + referencing: '>=0.25.0' + hash: + md5: 7c27ea1bdbe520bb830dcadd59f55cbf + sha256: 7b0061e106674f27cc718f79a095e90a5667a3635ec6626dd23b3be0fd2bfbdc + manager: conda + name: jsonschema-specifications + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda + version: 2023.7.1 +- category: main + dependencies: + freetype: '>=2.12.1,<3.0a0' + lcms2: '>=2.15,<3.0a0' + libjpeg-turbo: '>=2.1.5.1,<3.0a0' + libtiff: '>=4.5.1,<4.6.0a0' + libwebp-base: '>=1.3.1,<2.0a0' + libxcb: '>=1.15,<1.16.0a0' + libzlib: '>=1.2.13,<1.3.0a0' + openjpeg: '>=2.5.0,<3.0a0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + tk: '>=8.6.12,<8.7.0a0' + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + hash: + md5: 217a6fc0df385c9a929144549f26b124 + sha256: 3771fa4cd26b5654dcb9e12a65a624be87836e002900a0d6b98c93870b75aa02 + manager: conda + name: pillow + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pillow-10.0.0-py311hde623f7_0.conda + version: 10.0.0 +- category: main + dependencies: + python: '>=3.7' + typing-extensions: '>=4.6.3' + hash: + md5: 044e7a1e0ad42c4e67110bd078150a63 + sha256: 885611bd528abaf3e31bc0bfaad3a619cfe89db61d886b53c2a9ec9ff50edebe + manager: conda + name: platformdirs + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.9.1-pyhd8ed1ab_0.conda + version: 3.9.1 +- category: main + dependencies: + cffi: '>=1.11' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + ucrt: '>=10.0.20348.0' + vc: '>=14.2,<15' + vc14_runtime: '>=14.29.30139' + zstd: '>=1.5.2,<1.6.0a0' + hash: + md5: 7ef609e9bfd58d18962d7b7c0c529638 + sha256: 5e1666e71c61f410232e631170a0b45363f4ba3b61a8e8c19f18bf2565dd5a68 + manager: conda + name: zstandard + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/zstandard-0.19.0-py311he5d195f_2.conda + version: 0.19.0 +- category: main + dependencies: + python: '>=3.7' + zstandard: '>=0.15' + hash: + md5: ebe3230a4c1e135954eee4fb6ef8cded + sha256: a437007aa798f6d1c9f079f4dbb2a38685ac306d5a5ce3d1ee797c2de9f7d6e9 + manager: conda + name: conda-package-streaming + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.8.0-pyhd8ed1ab_0.conda + version: 0.8.0 +- category: main + dependencies: + attrs: '>=22.2.0' + importlib_resources: '>=1.4.0' + jsonschema-specifications: '>=2023.03.6' + pkgutil-resolve-name: '>=1.3.10' + python: '>=3.8' + referencing: '>=0.28.4' + rpds-py: '>=0.7.1' + hash: + md5: 7356151a32ebd9a20158d2f26d224bfa + sha256: 09e339fc7895af45c3e183f51944f7fadf4ae3f837f6c85f6397023993336a3b + manager: conda + name: jsonschema + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.18.4-pyhd8ed1ab_0.conda + version: 4.18.4 +- category: main + dependencies: + platformdirs: '>=2.5' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + pywin32: '>=300' + traitlets: '>=5.3' + hash: + md5: 6754e6f5ead86225c8c78825ff0398c9 + sha256: 049eeb389e8caa3c61c26c1458d905335d4fc4d0af7a7af2cadcaeb537e8edce + manager: conda + name: jupyter_core + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/jupyter_core-5.3.1-py311h1ea47a8_0.conda + version: 5.3.1 +- category: main + dependencies: + cryptography: '>=38.0.0,<42,!=40.0.0,!=40.0.1' + python: '>=3.6' + hash: + md5: 34f7d568bf59d18e3fef8c405cbece21 + sha256: 4daea3dc896987cc1334956fccfc0ed738663a84ad0c1d3f576a7a7936091534 + manager: conda + name: pyopenssl + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda + version: 23.2.0 +- category: main + dependencies: + conda-package-streaming: '>=0.7.0' + python: '>=3.7' + hash: + md5: 44800e9bd13143292097c65e57323038 + sha256: c453b2a648e7a059f26326d476069cf81627c9a3fa12da4ab22eb39e7bfdc095 + manager: conda + name: conda-package-handling + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-package-handling-2.0.2-pyh38be061_0.conda + version: 2.0.2 +- category: main + dependencies: + jsonschema: '>=2.6' + jupyter_core: '' + python: '>=3.8' + python-fastjsonschema: '' + traitlets: '>=5.1' + hash: + md5: 3ec35d84fc1775215061517eb4660693 + sha256: d8b1ad3c219b39e5e325785606853ff1cd334769228490ac977b85aa95e94ba0 + manager: conda + name: nbformat + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.1-pyhd8ed1ab_0.conda + version: 5.9.1 +- category: main + dependencies: + brotlipy: '>=0.6.0' + certifi: '' + cryptography: '>=1.3.4' + idna: '>=2.0.0' + pyopenssl: '>=0.14' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: <4.0 + hash: + md5: 27db656619a55d727eaf5a6ece3d2fd6 + sha256: 213bdf6c3a5d721fa83b45d527d3ecd340f9547c0d6bbd0b8d9d746ec9a1fb4b + manager: conda + name: urllib3 + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda + version: 1.26.15 +- category: main + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.7' + urllib3: '>=1.21.1,<3' + hash: + md5: a30144e4156cdbb236f99ebb49828f8b + sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad + manager: conda + name: requests + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda + version: 2.31.0 +- category: main + dependencies: + boltons: '>=23.0.0' + conda-package-handling: '>=1.3.0' + jsonpatch: '>=1.32' + menuinst: '>=1.4.11,<2' + packaging: '>=23.0' + pluggy: '>=1.0.0' + pycosat: '>=0.6.3' + pyopenssl: '>=16.2.0' + python: '>=3.11,<3.12.0a0' + python_abi: 3.11.* *_cp311 + requests: '>=2.20.1,<3' + ruamel.yaml: '>=0.11.14,<0.18' + setuptools: '>=60.0.0' + toolz: '>=0.8.1' + tqdm: '>=4' + hash: + md5: 7b6d8ae5716b0db6f0651dec5fd23096 + sha256: a5cc8e1a3ab25c269f0342c2cf8b9988110e5d71112b1f83895d373e2a9b8c99 + manager: conda + name: conda + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/conda-23.7.1-py311h1ea47a8_0.conda + version: 23.7.1 +- category: main + dependencies: + python: '>=3.6' + requests: '>=2.0.1,<3.0.0' + hash: + md5: 99c98318c8646b08cc764f90ce98906e + sha256: 20eaefc5dba74ff6c31e537533dde59b5b20f69e74df49dff19d43be59785fa3 + manager: conda + name: requests-toolbelt + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_0.conda + version: 1.0.0 +- category: main + dependencies: + click: '>=8' + conda: '>=4.12.0' + conda-package-streaming: '' + filelock: '' + jinja2: '' + more-itertools: '' + python: '>=3.7' + pyyaml: '>=6' + hash: + md5: 962d9bb20afaa4b839912bb4cd9869a2 + sha256: 1562176f33affec7b2af35eefa60da11cf7a5299edb1b664832f6d39c73ae0f1 + manager: conda + name: conda-index + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/conda-index-0.2.3-pyhd8ed1ab_0.conda + version: 0.2.3 +- category: main + dependencies: + __win: '' + conda: '>=4.6' + conda-standalone: '' + nsis: '>=3.08' + pillow: '>=3.1' + python: '>=3.7' + ruamel.yaml: '>=0.11.14,<0.18' + hash: + md5: ada931829b32e231d8b2143d780c4ba6 + sha256: d4f72b7f43345b304975ee61a860d41de01037ce8038f62347b36fadba6a4f75 + manager: conda + name: constructor + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/constructor-3.4.4-pyh31a35d3_0.conda + version: 3.4.4 +- category: main + dependencies: + beautifulsoup4: '' + chardet: '' + conda: '>=4.13' + conda-index: '' + conda-package-handling: '>=1.3' + filelock: '' + glob2: '>=0.6' + jinja2: '' + m2-patch: '>=2.6' + packaging: '' + pkginfo: '' + psutil: '' + py-lief: '' + python: '>=3.11,<3.12.0a0' + python-libarchive-c: '' + python_abi: 3.11.* *_cp311 + pytz: '' + pyyaml: '' + requests: '' + ripgrep: '' + six: '' + tqdm: '' + hash: + md5: 28ff7d6c4e7801de194d586d7b155e9b + sha256: ed5b2c98e21710d6c84321a9943ca762bed3b3019a197044be114839e3dfb2ee + manager: conda + name: conda-build + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/conda-build-3.26.0-py311h1ea47a8_1.conda + version: 3.26.0 +- category: main + dependencies: + anaconda-project: '>=0.9.1' + clyent: '>=1.2.0' + conda-package-handling: '>=1.7.3' + defusedxml: '>=0.7.1' + nbformat: '>=4.4.0' + pillow: '>=8.2' + python: '>=3.6' + python-dateutil: '>=2.6.1' + pytz: '>=2021.3' + pyyaml: '>=3.12' + requests: '>=2.20.0' + requests-toolbelt: '>=0.9.1' + setuptools: '>=58.0.4' + six: '>=1.15.0' + tqdm: '>=4.56.0' + urllib3: '>=1.26.4,<2.0.0a0' + hash: + md5: 0bc9d7f17f6f946c66f896bda5c7ee6b + sha256: 5cfacf9053b46dd7f44825d0023e1f5359e05c3b0cc985f0789e944e8b62701c + manager: conda + name: anaconda-client + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/anaconda-client-1.12.0-pyhd8ed1ab_0.conda + version: 1.12.0 +- category: main + dependencies: + anaconda-client: '' + conda-pack: '' + jinja2: '' + python: '>=3.6' + requests: '' + ruamel_yaml: '' + tornado: '>=4.2' + tqdm: '' + hash: + md5: 85406089db6aa63ee45da8e9f0b966b6 + sha256: 5025ff5066e4a8765ca35bb4f6145f188b249634090236c8beb25f3fb5ed4874 + manager: conda + name: anaconda-project + optional: false + platform: win-64 + url: https://conda.anaconda.org/conda-forge/noarch/anaconda-project-0.11.1-pyhd8ed1ab_0.tar.bz2 + version: 0.11.1 +version: 1 diff --git a/installer_specs/radioconda-win-64/main.nsi.tmpl b/installer_specs/radioconda-win-64/main.nsi.tmpl new file mode 100644 index 0000000..2e84269 --- /dev/null +++ b/installer_specs/radioconda-win-64/main.nsi.tmpl @@ -0,0 +1,1386 @@ +# Installer template file for creating a Windows installer using NSIS. + +# Dependencies: +# NSIS >=3.08 conda install "nsis>=3.08" (includes extra unicode plugins) + +Unicode "true" + +#if enable_debugging is True +# Special logging build needed for ENABLE_LOGGING +# See https://nsis.sourceforge.io/Special_Builds +!define ENABLE_LOGGING +#endif + +# Comes from https://nsis.sourceforge.io/Logging:Enable_Logs_Quickly +!define LogSet "!insertmacro LogSetMacro" +!macro LogSetMacro SETTING + !ifdef ENABLE_LOGGING + LogSet ${SETTING} + !endif +!macroend + +!define LogText "!insertmacro LogTextMacro" +!macro LogTextMacro INPUT_TEXT + !ifdef ENABLE_LOGGING + LogText ${INPUT_TEXT} + !endif +!macroend + +!include "WinMessages.nsh" +!include "WordFunc.nsh" +!include "LogicLib.nsh" +!include "WinVer.nsh" +!include "MUI2.nsh" +!include "x64.nsh" + +!include "FileFunc.nsh" +!insertmacro GetParameters +!insertmacro GetOptions + +!include "UAC.nsh" +!include "nsDialogs.nsh" + +!include "Utils.nsh" + +!define NAME __NAME__ +!define VERSION __VERSION__ +!define COMPANY __COMPANY__ +!define ARCH __ARCH__ +!define PLATFORM __PLATFORM__ +!define CONSTRUCTOR_VERSION __CONSTRUCTOR_VERSION__ +!define PY_VER __PY_VER__ +!define PYVERSION_JUSTDIGITS __PYVERSION_JUSTDIGITS__ +!define PYVERSION __PYVERSION__ +!define PYVERSION_MAJOR __PYVERSION_MAJOR__ +!define DEFAULT_PREFIX __DEFAULT_PREFIX__ +!define DEFAULT_PREFIX_DOMAIN_USER __DEFAULT_PREFIX_DOMAIN_USER__ +!define DEFAULT_PREFIX_ALL_USERS __DEFAULT_PREFIX_ALL_USERS__ +!define PRE_INSTALL_DESC __PRE_INSTALL_DESC__ +!define POST_INSTALL_DESC __POST_INSTALL_DESC__ +!define MENU_PKGS "@MENU_PKGS@" +!define SHOW_REGISTER_PYTHON __SHOW_REGISTER_PYTHON__ +!define SHOW_ADD_TO_PATH __SHOW_ADD_TO_PATH__ +!define PRODUCT_NAME "${NAME} ${VERSION} (${ARCH})" +!define UNINSTALL_NAME "@UNINSTALL_NAME@" +!define UNINSTREG "SOFTWARE\Microsoft\Windows\CurrentVersion\ + \Uninstall\${UNINSTALL_NAME}" + +var /global INSTDIR_JUSTME +var /global INSTALLER_VERSION +var /global INSTALLER_NAME_FULL + +# UAC shield overlay +!ifndef BCM_SETSHIELD + !define BCM_SETSHIELD 0x0000160C +!endif + +var /global ARGV +var /global ARGV_Help +var /global ARGV_InstallationType +var /global ARGV_AddToPath +var /global ARGV_KeepPkgCache +var /global ARGV_RegisterPython +var /global ARGV_NoRegistry +var /global ARGV_NoScripts +var /global ARGV_NoShortcuts +var /global ARGV_CheckPathLength + +var /global IsDomainUser +var /global CheckPathLength +var /global LongPathsEnabled +var /global InstDirLen + +var /global InstModePage_RadioButton_JustMe +var /global InstModePage_RadioButton_AllUsers + +var /global InstMode # 0 = Just Me, 1 = All Users. +!define JUST_ME 0 +!define ALL_USERS 1 + +# Include this one after our defines +!include "OptionsDialog.nsh" + +CRCCheck On + +# Basic options +Name "${PRODUCT_NAME}" +OutFile __OUTFILE__ +ShowInstDetails "hide" +ShowUninstDetails "hide" +# This installer contains tar.bz2 files, which are already compressed +SetCompress "off" + +# Start off with the lowest permissions and work our way up. +RequestExecutionLevel user + +# Version information & branding text +VIAddVersionKey "ProductName" "${PRODUCT_NAME}" +VIAddVersionKey "FileVersion" "${VERSION}" +VIAddVersionKey "ProductVersion" "${VERSION}" +VIAddVersionKey "CompanyName" "${COMPANY}" +VIAddVersionKey "LegalCopyright" "(c) ${COMPANY}" +VIAddVersionKey "FileDescription" "${NAME} Installer" +VIAddVersionKey "Comments" "Created by constructor ${CONSTRUCTOR_VERSION}" +VIProductVersion __VIPV__ +BrandingText /TRIMLEFT "${COMPANY}" + +# Interface configuration +!define MUI_ICON __ICONFILE__ +!define MUI_UNICON __ICONFILE__ +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP __HEADERIMAGE__ +!define MUI_HEADERIMAGE_UNBITMAP __HEADERIMAGE__ +!define MUI_ABORTWARNING +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_UNFINISHPAGE_NOAUTOCLOSE +!define MUI_WELCOMEFINISHPAGE_BITMAP __WELCOMEIMAGE__ +!define MUI_UNWELCOMEFINISHPAGE_BITMAP __WELCOMEIMAGE__ +#!define MUI_CUSTOMFUNCTION_GUIINIT GuiInit + +# Pages +#!define MUI_PAGE_CUSTOMFUNCTION_SHOW OnStartup +#if custom_welcome +# Custom welcome file(s) +@CUSTOM_WELCOME_FILE@ +#else +!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageIfUACInnerInstance +!insertmacro MUI_PAGE_WELCOME +#endif +!define MUI_PAGE_CUSTOMFUNCTION_PRE SkipPageIfUACInnerInstance +!insertmacro MUI_PAGE_LICENSE __LICENSEFILE__ +Page Custom InstModePage_Create InstModePage_Leave +!define MUI_PAGE_CUSTOMFUNCTION_PRE DisableBackButtonIfUACInnerInstance +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE OnDirectoryLeave +!insertmacro MUI_PAGE_DIRECTORY +# Custom options now differ depending on installation mode. +#Page Custom mui_AnaCustomOptions_Show +!insertmacro MUI_PAGE_INSTFILES +#if with_conclusion_text is True +!define MUI_FINISHPAGE_TITLE __CONCLUSION_TITLE__ +!define MUI_FINISHPAGE_TITLE_3LINES +!define MUI_FINISHPAGE_TEXT __CONCLUSION_TEXT__ +#endif + +# Custom conclusion file(s) +@CUSTOM_CONCLUSION_FILE@ + +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_WELCOME +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE un.OnDirectoryLeave +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +# Language +!insertmacro MUI_LANGUAGE "English" + +Function SkipPageIfUACInnerInstance + ${LogSet} on + ${If} ${UAC_IsInnerInstance} + Abort + ${EndIf} +FunctionEnd + +!macro DoElevation + GetDlgItem $1 $HWNDParent 1 + System::Call user32::GetFocus()i.s + # Disable 'Next' button. + EnableWindow $1 0 + !insertmacro UAC_PageElevation_RunElevated + EnableWindow $1 1 + System::call user32::SetFocus(is) + ${If} $2 = 0x666 + MessageBox MB_ICONEXCLAMATION \ + "You need to log in with an administrative account \ + in order to perform an 'All Users' installation." + Abort + ${ElseIf} $0 = 1223 + # UAC canceled by user. + Abort + ${Else} + ${If} $0 <> 0 + ${If} $0 = 1062 + MessageBox MB_ICONSTOP \ + "Elevation failed; Secondary Logon service is \ + not running." + ${Else} + MessageBox MB_ICONSTOP \ + "Elevation failed; error code: $0." + ${EndIf} + Abort + ${EndIf} + ${EndIf} + # UAC worked, we're the outer installer, so we can quit. + Quit +!macroend + + +!macro ParseCommandLineArgs + ClearErrors + ${GetParameters} $ARGV + ${GetOptions} $ARGV "/?" $ARGV_Help + ${IfNot} ${Errors} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Usage: $EXEFILE [options]$\n\ + Options:$\n$\n\ + /InstallationType=AllUsers [default: JustMe]$\n$\n\ + /AddToPath=[0|1] [default: 0]$\n$\n\ +#if keep_pkgs is True + /KeepPkgCache=[0|1] [default: 1]$\n$\n\ +#endif +#if keep_pkgs is False + /KeepPkgCache=[0|1] [default: 0]$\n$\n\ +#endif + /RegisterPython=[0|1] [default: AllUsers: 1, JustMe: 0]$\n$\n\ + /NoRegistry=[0|1] [default: AllUsers: 0, JustMe: 0]$\n$\n\ + /NoScripts=[0|1] [default: 0]$\n$\n\ + /NoShortcuts=[0|1] [default: 0]$\n$\n\ + /CheckPathLength=[0|1] [default: 1]$\n$\n\ + Examples:$\n\ + Install for all users, but don't add to PATH env var:$\n\ + $EXEFILE /InstallationType=AllUsers$\n$\n\ + Install for just me, add to PATH and register as system Python:$\n\ + $EXEFILE /RegisterPython=1 /AddToPath=1$\n$\n\ + Install for just me, with no registry modification (for CI):$\n\ + $EXEFILE /NoRegistry=1$\n$\n\ + NOTE: If you install for AllUsers, then the option to AddToPath$\n\ + is disabled (i.e. if ./InstallationType=AllUsers, then$\n\ + /AddToPath=1 will be ignored).$\n" \ + /SD IDOK + Abort + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/InstallationType=" $ARGV_InstallationType + ${IfNot} ${Errors} + ${If} $ARGV_InstallationType == "AllUsers" + StrCpy $InstMode ${ALL_USERS} + ${Else} + StrCpy $InstMode ${JUST_ME} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/RegisterPython=" $ARGV_RegisterPython + ${IfNot} ${Errors} + ${If} $ARGV_RegisterPython = "1" + StrCpy $Ana_RegisterSystemPython_State ${BST_CHECKED} + ${ElseIf} $ARGV_RegisterPython = "0" + StrCpy $Ana_RegisterSystemPython_State ${BST_UNCHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/KeepPkgCache=" $ARGV_KeepPkgCache + ${If} ${Errors} + StrCpy $ARGV_KeepPkgCache "@KEEP_PKGS@" + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoRegistry=" $ARGV_NoRegistry + ${If} ${Errors} + StrCpy $ARGV_NoRegistry "0" + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoScripts=" $ARGV_NoScripts + ${IfNot} ${Errors} + ${If} $ARGV_NoScripts = "1" + StrCpy $Ana_PostInstall_State ${BST_UNCHECKED} + ${ElseIf} $ARGV_NoScripts = "0" + StrCpy $Ana_PostInstall_State ${BST_CHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/NoShortcuts=" $ARGV_NoShortcuts + ${IfNot} ${Errors} + ${If} $ARGV_NoShortcuts = "1" + StrCpy $Ana_CreateShortcuts_State ${BST_UNCHECKED} + ${ElseIf} $ARGV_NoShortcuts = "0" + StrCpy $Ana_CreateShortcuts_State ${BST_CHECKED} + ${EndIf} + ${EndIf} + + ClearErrors + ${GetOptions} $ARGV "/CheckPathLength=" $ARGV_CheckPathLength + ${IfNot} ${Errors} + ${If} $ARGV_CheckPathLength = "0" + StrCpy $CheckPathLength "0" + ${ElseIf} $ARGV_CheckPathLength = "1" + StrCpy $CheckPathLength "1" + ${EndIf} + ${EndIf} + +!macroend + +Function OnInit_Release + ${LogSet} on + !insertmacro ParseCommandLineArgs + + # Parsing the AddToPath option here (and not in ParseCommandLineArgs) to prevent the MessageBox from showing twice. + # For more context, see https://github.com/conda/constructor/pull/584#issuecomment-1347688020 + ClearErrors + ${GetOptions} $ARGV "/AddToPath=" $ARGV_AddToPath + ${IfNot} ${Errors} + ${If} $ARGV_AddToPath = "1" + ${If} $InstMode == ${ALL_USERS} + # To address CVE-2022-26526. + # In AllUsers install mode, do not allow AddToPath as an option. + MessageBox MB_OK|MB_ICONEXCLAMATION "/AddToPath=1 is disabled and ignored in 'All Users' installations" /SD IDOK + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} + ${Else} + StrCpy $Ana_AddToPath_State ${BST_CHECKED} + ${EndIf} + ${ElseIf} $ARGV_AddToPath = "0" + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} + ${EndIf} + ${EndIf} +FunctionEnd + +Function InstModePage_RadioButton_OnClick + ${LogSet} on + Exch $0 + Push $1 + Push $2 + + nsDialogs::GetUserData $0 + Pop $1 + GetDlgItem $2 $HWNDParent 1 + SendMessage $2 ${BCM_SETSHIELD} 0 $1 + + Pop $2 + Pop $1 + Exch $0 +FunctionEnd + +Function InstModePage_Create + ${LogSet} on + Push $0 + Push $1 + Push $2 + Push $3 + + ${If} ${UAC_IsInnerInstance} + Abort + ${EndIf} + + !insertmacro MUI_HEADER_TEXT_PAGE \ + "Select Installation Type" \ + "Please select the type of installation you would like to perform \ + for ${PRODUCT_NAME}." + + GetFunctionAddress $0 InstModePage_RadioButton_OnClick + nsDialogs::Create /NOUNLOAD 1018 + Pop $1 + ${NSD_OnBack} RemoveNextBtnShield + ${NSD_CreateLabel} 0 20u 75% 20u "Install for:" + ${NSD_CreateRadioButton} 0 40u 75% 15u "Just Me (recommended)" + Pop $2 + #MessageBox MB_OK "OnClick 2! 0: $0, 1: $1, 2: $2" + StrCpy $InstModePage_RadioButton_JustMe $2 + + nsDialogs::OnClick $2 $0 + nsDialogs::SetUserData $2 0 + SendMessage $2 ${BM_CLICK} 0 0 + + ${NSD_CreateRadioButton} 0 60u 75% 15u \ + "All Users (requires admin privileges)" + #MessageBox MB_OK "OnClick 3! 0: $0, 1: $1, 2: $2, 3: $3" + Pop $3 + StrCpy $InstModePage_RadioButton_AllUsers $3 + nsDialogs::OnClick $3 $0 + nsDialogs::SetUserData $3 1 + ${IfThen} $InstMode <> ${JUST_ME} ${|} SendMessage $3 ${BM_CLICK} 0 0 ${|} + Push $3 + nsDialogs::Show + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function DisableBackButtonIfUACInnerInstance + ${LogSet} on + Push $0 + ${If} ${UAC_IsInnerInstance} + GetDlgItem $0 $HWNDParent 3 + EnableWindow $0 0 + ${EndIf} + Pop $0 +FunctionEnd + +Function RemoveNextBtnShield + ${LogSet} on + Push $0 + GetDlgItem $0 $HWNDParent 1 + SendMessage $0 ${BCM_SETSHIELD} 0 0 + Pop $0 +FunctionEnd + +Function InstModeChanged + ${LogSet} on + # When using the installer with /S (silent mode), the /D option sets $INSTDIR, + # and it is therefore important not to overwrite $INSTDIR here, but it is also + # important that we do call SetShellVarContext with the appropriate value. + Push $0 + ${If} $InstMode = ${JUST_ME} + SetShellVarContext Current + # If we're on Vista+, the installation directory will + # have a nice, no-space name like: + # C:\Users\Trent\AppData\Local\Continuum\Anaconda. + # On 2003/XP, it will be in C:\Documents and Settings, + # with a space. We're allowing spaces now. + ${IfNot} ${Silent} + StrCpy $INSTDIR $INSTDIR_JUSTME + ${EndIf} + ${Else} + SetShellVarContext All + ${IfNot} ${Silent} + ExpandEnvStrings $0 ${DEFAULT_PREFIX_ALL_USERS} + StrCpy $INSTDIR $0 + ${Endif} + ${EndIf} + Pop $0 +FunctionEnd + +!macro SetInstMode mode + StrCpy $InstMode ${mode} + Call InstModeChanged +!macroend + +Function InstModePage_Leave + ${LogSet} on + Push $0 + Push $1 + Push $2 + + ${NSD_GetState} $InstModePage_RadioButton_AllUsers $0 + ${If} $0 = 0 + !insertmacro SetInstMode ${JUST_ME} + ${Else} + !insertmacro SetInstMode ${ALL_USERS} + ${IfNot} ${UAC_IsAdmin} + !insertmacro DoElevation + ${EndIf} + ${EndIf} + + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function .onInit + ${LogSet} on + Push $0 + Push $1 + Push $2 + Push $R1 + Push $R2 + + InitPluginsDir + @TEMP_EXTRA_FILES@ + !insertmacro ParseCommandLineArgs + + # Select the correct registry to look at, depending + # on whether it's a 32-bit or 64-bit installer + SetRegView @BITS@ +#if win64 + # If we're a 64-bit installer, make sure it's 64-bit Windows + ${IfNot} ${RunningX64} + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "This installer is for a 64-bit version for ${NAME}$\n\ + but your system is 32-bit. Please use the 32-bit Windows$\n\ + ${NAME} installer." \ + /SD IDOK + Abort + ${EndIf} +#endif + + !insertmacro UAC_PageElevation_OnInit + ${If} ${UAC_IsInnerInstance} + ${AndIfNot} ${UAC_IsAdmin} + SetErrorLevel 0x666 + Quit + ${EndIf} + + # Look for a number of signs that indicate the user is a domain user and + # alter the default installation directory for 'Just Me' accordingly. We + # want to ensure that if we're a user domain account, we always install to + # %LOCALAPPDATA% (i.e. C:\Users\Trent\AppData\Local\Continuum\Anaconda), + # as this is the only place guaranteed to not be backed by a network share + # or included in a user's roaming profile. However, if we're a normal user + # account, then C:\Users\Trent\Anaconda is fine. + ReadEnvStr $0 USERDNSDOMAIN + ${If} $0 != "" + # If not null, USERDNSDOMAIN is an unambiguous indication that we're + # logged into a domain account. + StrCpy $IsDomainUser 1 + ${Else} + # If it's not set, apply some simple heuristics to discern whether or + # not we're logged in as a domain user. + ReadEnvStr $0 LOGONSERVER + ${If} $0 == "" + # This should never be unset; but if it is, we're definitely not + # a domain user. + StrCpy $IsDomainUser 0 + ${Else} + StrCpy $1 $0 "" 2 # lop-off the leading \\. + ${StrFilter} $1 "+" "" "" $2 # convert to uppercase, store in $2 + ${If} $2 == "MICROSOFTACCOUNT" + # The new Windows 8.x live accounts have \\MicrosoftAccount + # set as LOGONSERVER; interpret this as being a non-domain + # user. + StrCpy $IsDomainUser 0 + ${Else} + ReadEnvStr $R1 COMPUTERNAME + ${If} $R1 == "" + # This should never be unset either; if it is, assume + # we're not a domain user. + StrCpy $IsDomainUser 0 + ${Else} + # We've got a value for both LOGONSERVER and COMPUTERNAME + # environment variables (which should always be the case). + # Proceed to compare LOGONSERVER[-2:] to COMPUTERNAME; if + # they match, assume we're not a domain user account. + + ${StrFilter} $R1 "+" "" "" $R2 # convert to uppercase + ${If} $2 != $R2 + # COMPUTERNAME doesn't match LOGONSERVER; assume we're + # logged in via a domain account. + StrCpy $IsDomainUser 1 + ${Else} + # COMPUTERNAME matches LOGONSERVER; safe to assume + # we're logged in as a user account. (I guess there's + # the remote possibility a domain user has logged onto + # a server that has the same NetBIOS name as the Active + # Directory name... if that's the case, potentially + # installing Anaconda into an area that gets picked up + # by a roaming profile is the very least of your + # problems.) + StrCpy $IsDomainUser 0 + + ${EndIf} # LOGONSERVER[-2:] != COMPUTERNAME + + ${EndIf} # COMPUTERNAME != "" + + ${EndIf} # LOGONSERVER != "\\MicrosoftAccount" + + ${EndIf} # LOGONSERVER != "" + + ${EndIf} # USERDNSDOMAIN != "" + + ${If} $IsDomainUser = 0 + ExpandEnvStrings $0 ${DEFAULT_PREFIX} + StrCpy $INSTDIR_JUSTME $0 + ${ElseIf} $IsDomainUser = 1 + ExpandEnvStrings $0 ${DEFAULT_PREFIX_DOMAIN_USER} + StrCpy $INSTDIR_JUSTME $0 + ${Else} + # Should never happen; indicates a logic error above. + MessageBox MB_OK "Internal error: IsUserDomain not set properly!" \ + /SD IDOK + Abort + ${EndIf} + + ${If} $InstMode == "" + StrCpy $InstMode ${JUST_ME} + ${IfThen} ${UAC_IsAdmin} ${|} StrCpy $InstMode ${ALL_USERS} ${|} + # If running as 'SYSTEM' then JustMe is not appropriate; note that + # we should advise against this. SCCM has an option to run as user + System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2" + ${IfThen} $0 == "SYSTEM" ${|} StrCpy $InstMode ${ALL_USERS} ${|} + ${EndIf} + call InstModeChanged + + ${If} ${Silent} + ${If} $InstMode == ${ALL_USERS} + ${IfNot} ${UAC_IsAdmin} + MessageBox MB_ICONSTOP "Installation for all users requires an elevated prompt." + Abort + ${EndIF} + ${EndIF} + ${EndIF} + + ; /D was not used, add default based on install type + ${If} $InstDir == "" + ${If} $InstMode == ${ALL_USERS} + ExpandEnvStrings $0 ${DEFAULT_PREFIX_ALL_USERS} + StrCpy $INSTDIR $0 + ${Else} + strcpy $INSTDIR $INSTDIR_JUSTME + ${EndIf} + ${EndIf} + + ; Set default value + ${If} $CheckPathLength == "" + StrCpy $CheckPathLength "1" + ${EndIf} + + # Initialize the default settings for the anaconda custom options + Call mui_AnaCustomOptions_InitDefaults + # Override custom options with explicitly given values from contruct.yaml. + # If initialize_by_default (register_python_default) is None, do nothing. +#if initialize_conda is True and initialize_by_default is True + ${If} $InstMode == ${JUST_ME} + StrCpy $Ana_AddToPath_State ${BST_CHECKED} + ${EndIF} +#endif +#if initialize_conda is True and initialize_by_default is False + StrCpy $Ana_AddToPath_State ${BST_UNCHECKED} +#endif +#if register_python is True and register_python_default is True + StrCpy $Ana_RegisterSystemPython_State ${BST_CHECKED} +#endif +#if register_python is True and register_python_default is False + StrCpy $Ana_RegisterSystemPython_State ${BST_UNCHECKED} +#endif +#if check_path_length is True + StrCpy $CheckPathLength "1" +#endif +#if check_path_length is False + StrCpy $CheckPathLength "0" +#endif +#if keep_pkgs is True + StrCpy $Ana_ClearPkgCache_State ${BST_UNCHECKED} +#endif +#if keep_pkgs is False + StrCpy $Ana_ClearPkgCache_State ${BST_CHECKED} +#endif +#if pre_install_exists is True + StrCpy $Ana_PreInstall_State ${BST_CHECKED} +#endif +#if pre_install_exists is False + StrCpy $Ana_PreInstall_State ${BST_UNCHECKED} +#endif +#if post_install_exists is True + StrCpy $Ana_PostInstall_State ${BST_CHECKED} +#endif +#if post_install_exists is False + StrCpy $Ana_PostInstall_State ${BST_UNCHECKED} +#endif + + Call OnInit_Release + + Pop $R2 + Pop $R1 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +Function un.onInit + Push $0 + Push $1 + Push $2 + Push $3 + + # Resolve INSTDIR + GetFullPathName $0 $INSTDIR + # If the directory does not exist or cannot be resolved, $0 will be empty + StrCmp $0 "" invalid_dir + StrCpy $INSTDIR $0 + + # Never run the uninstaller when $INSTDIR points at system-critical directories + + StrLen $InstDirLen $INSTDIR + # INSTDIR is a full path and has no trailing backslash, + # so if its length is 2, it is pointed at a system root + StrCmp $InstdirLen 2 invalid_dir + + # Never delete anything inside Windows + StrCpy $0 $INSTDIR 7 3 + StrCmp $0 "Windows" invalid_dir + + StrCpy $0 "ALLUSERSPROFILE APPDATA LOCALAPPDATA PROGRAMDATA PROGRAMFILES PROGRAMFILES(x86) PUBLIC SYSTEMDRIVE SYSTEMROOT USERPROFILE" + StrCpy $1 1 + loop_critical: + ${WordFind} $0 " " "E+$1" $2 + IfErrors endloop_critical + ReadEnvStr $3 $2 + StrCmp $3 $INSTDIR invalid_dir + IntOp $1 $1 + 1 + goto loop_critical + endloop_critical: + + # Primitive check to see that $INSTDIR points to a conda directory + StrCpy $0 "_conda.exe conda-meta\history" + StrCpy $1 1 + loop_conda: + ${WordFind} $0 " " "E+$1" $2 + IfErrors endloop_conda + IfFileExists $INSTDIR\$2 0 invalid_dir + IntOp $1 $1 + 1 + goto loop_conda + endloop_conda: + + # All checks have passed + goto valid_dir + + invalid_dir: + MessageBox MB_OK|MB_ICONSTOP \ + "Error: $INSTDIR is not a valid conda directory. Please run the uninstaller from a conda directory." \ + /SD IDABORT + abort + valid_dir: + + # Select the correct registry to look at, depending + # on whether it's a 32-bit or 64-bit installer + SetRegView @BITS@ + + # Since the switch to a dual-mode installer (All Users/Just Me), the + # uninstaller will inherit the requested execution level of the main + # installer -- which we now have to set to 'user'. Thus, Windows will + # not automatically elevate the uninstaller for us -- we need to do it + # ourselves if we're not a 'Just Me' installation. + !insertmacro UAC_PageElevation_OnInit + ${IfNot} ${FileExists} "$INSTDIR\.nonadmin" + ${AndIfNot} ${UAC_IsAdmin} + !insertmacro DoElevation + ${EndIf} + + ${If} ${FileExists} "$INSTDIR\.nonadmin" + SetShellVarContext Current + ${Else} + SetShellVarContext All + ${EndIf} + + Pop $3 + Pop $2 + Pop $1 + Pop $0 +FunctionEnd + +# http://nsis.sourceforge.net/Check_for_spaces_in_a_directory_path +Function CheckForSpaces + ${LogSet} on + Exch $R0 + Push $R1 + Push $R2 + Push $R3 + StrCpy $R1 -1 + StrCpy $R3 $R0 + StrCpy $R0 0 + loop: + StrCpy $R2 $R3 1 $R1 + IntOp $R1 $R1 - 1 + StrCmp $R2 "" done + StrCmp $R2 " " 0 loop + IntOp $R0 $R0 + 1 + Goto loop + done: + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +# http://nsis.sourceforge.net/StrCSpn,_StrCSpnReverse:_Scan_strings_for_characters +Function StrCSpn + ${LogSet} on + Exch $R0 ; string to check + Exch + Exch $R1 ; string of chars + Push $R2 ; current char + Push $R3 ; current char + Push $R4 ; char loop + Push $R5 ; char loop + + StrCpy $R4 -1 + + NextChar: + StrCpy $R2 $R1 1 $R4 + IntOp $R4 $R4 - 1 + StrCmp $R2 "" StrOK + + StrCpy $R5 -1 + + NextCharCheck: + StrCpy $R3 $R0 1 $R5 + IntOp $R5 $R5 - 1 + StrCmp $R3 "" NextChar + StrCmp $R3 $R2 0 NextCharCheck + StrCpy $R0 $R2 + Goto Done + + StrOK: + StrCpy $R0 "" + + Done: + + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + +# http://stackoverflow.com/a/29569614/1170370 +!macro _IsNonEmptyDirectory _a _b _t _f +!insertmacro _LOGICLIB_TEMP +!insertmacro _IncreaseCounter +Push $0 +FindFirst $0 $_LOGICLIB_TEMP "${_b}\*" +_IsNonEmptyDirectory_loop${LOGICLIB_COUNTER}: + StrCmp "" $_LOGICLIB_TEMP _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} + StrCmp "." $_LOGICLIB_TEMP +2 + StrCmp ".." $_LOGICLIB_TEMP 0 _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} + FindNext $0 $_LOGICLIB_TEMP + Goto _IsNonEmptyDirectory_loop${LOGICLIB_COUNTER} +_IsNonEmptyDirectory_done${LOGICLIB_COUNTER}: +FindClose $0 +Pop $0 +!insertmacro _!= "" $_LOGICLIB_TEMP `${_t}` `${_f}` +!macroend +!define IsNonEmptyDirectory `"" IsNonEmptyDirectory` + + +Function OnDirectoryLeave + ${LogSet} on + ${If} ${IsNonEmptyDirectory} "$InstDir" + DetailPrint "::error:: Directory '$INSTDIR' is not empty, please choose a different location." + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Directory '$INSTDIR' is not empty,$\n\ + please choose a different location." \ + /SD IDOK + Abort + ${EndIf} + + ReadRegStr $LongPathsEnabled HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" + StrLen $InstDirLen "$InstDir" + + ${If} $CheckPathLength == "1" + ${AndIf} $LongPathsEnabled == "0" + ${AndIf} $InstDirLen > 46 + ; With windows 10, we can enable support for long path, for earlier + ; version, suggest user to use shorter installation path + ${If} ${AtLeastWin10} + ${AndIfNot} $ARGV_NoRegistry = "1" + ; If we have admin right, we enable long path on windows + ${If} ${UAC_IsAdmin} + WriteRegDWORD HKLM "SYSTEM\CurrentControlSet\Control\FileSystem" "LongPathsEnabled" 1 + ; If we don't have admin right, we suggest a shorter path or suggest to run with admin right + ${Else} + DetailPrint "::error:: The installation path should be shorter than 46 characters or \ + the installation requires administrator rights to enable long \ + path on Windows." + MessageBox MB_OK|MB_ICONSTOP "The installation path should be shorter than 46 characters or \ + the installation requires administrator rights to enable long \ + path on Windows." \ + /SD IDOK + Abort + ${EndIf} + ; If we don't have admin right, we suggest a shorter path or suggest to run with admin right + ${Else} + DetailPrint "::error:: The installation path should be shorter than 46 characters. \ + Please choose another location." + MessageBox MB_OK|MB_ICONSTOP "The installation path should be shorter than 46 characters. \ + Please choose another location." \ + /SD IDOK + Abort + ${EndIf} + ${EndIf} + + # Call the CheckForSpaces function. + Push $INSTDIR # Input string (install path). + Call CheckForSpaces + Pop $R0 # The function returns the number of spaces found in the input string. + + Push $R7 + Push $R8 + Push $R9 + # Check if any spaces exist in $INSTDIR. + StrCmp $R0 0 NoSpaces + + # Plural if more than 1 space in $INSTDIR. + StrCmp $R0 1 0 +3 + StrCpy $R1 "" + Goto +2 + StrCpy $R1 "s" + + ${If} ${Silent} + StrCpy $R7 " " + ${Else} + StrCpy $R7 "$\n" + ${EndIf} + StrCpy $R8 "'Destination Folder' contains $R0 space$R1.$R7This can cause problems with several conda packages.$R7" +#if check_path_spaces is True + StrCpy $R8 "$R8Please remove the space$R1 from the destination folder." + StrCpy $R9 "Error" +#else + StrCpy $R8 "$R8Please consider removing the space$R1." + StrCpy $R9 "Warning" +#endif + # Show message box then take the user back to the Directory page. + ${If} ${Silent} + DetailPrint "::$R9:: $R8" + ${Else} + MessageBox MB_OK|MB_ICONINFORMATION "$R9: $R8" /SD IDOK + ${EndIf} +#if check_path_spaces is True + abort +#endif + NoSpaces: + Pop $R7 + Pop $R8 + Pop $R9 + + # List of characters not allowed anywhere in $INSTDIR + Push "^%!=," + Push $INSTDIR + Call StrCSpn + Pop $R0 + + StrCmp $R0 "" NoInvalidCharaceters + DetailPrint "::error:: 'Destination Folder' contains the following invalid character: $R0" + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: 'Destination Folder' contains the following invalid character: $R0" \ + /SD IDOK + abort + NoInvalidCharaceters: + + UnicodePathTest::SpecialCharPathTest $INSTDIR + Pop $R1 + StrCmp $R1 "nothingspecial" nothing_special_path + DetailPrint "::error:: 'Destination Folder' contains the following invalid character$R1" + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: 'Destination Folder' contains the following invalid character$R1" \ + /SD IDOK + abort + nothing_special_path: + + ; test if path contains unicode characters + UnicodePathTest::UnicodePathTest $INSTDIR + Pop $R1 + + # Python 3 can be installed in a CP_ACP path until MKL is Unicode capable. + # (mkl_rt.dll calls LoadLibraryA() to load mkl_intel_thread.dll) + # Python 2 can only be installed to an ASCII path. + StrCmp $R1 "ascii" valid_path + StrCmp ${PY_VER} "2.7" not_cp_acp_capable + StrCmp $R1 "ascii_cp_acp" valid_path + not_cp_acp_capable: + DetailPrint "::error:: Due to incompatibility with several \ + Python libraries, 'Destination Folder' cannot contain non-ascii characters \ + (special characters or diacritics). Please choose another location." + MessageBox MB_OK|MB_ICONEXCLAMATION "Error: Due to incompatibility with several \ + Python libraries, 'Destination Folder' cannot contain non-ascii characters \ + (special characters or diacritics). Please choose another location." \ + /SD IDOK + abort + + valid_path: + + Push $R1 + ${IsWritable} $INSTDIR $R1 + IntCmp $R1 0 pathgood + Pop $R1 + DetailPrint "::error: Path $INSTDIR is not writable. Please check permissions or \ + try respawning the installer with elevated privileges." + MessageBox MB_OK|MB_ICONEXCLAMATION \ + "Error: Path $INSTDIR is not writable. Please check permissions or \ + try respawning the installer with elevated privileges." \ + /SD IDOK + Abort + + pathgood: + Pop $R1 + +FunctionEnd + +Function .onVerifyInstDir + ${LogSet} on + StrLen $0 $Desktop + StrCpy $0 $INSTDIR $0 + StrCmp $0 $Desktop 0 PathGood + Abort + PathGood: +FunctionEnd + +Function un.OnDirectoryLeave + MessageBox MB_YESNO \ + "Are you sure you want to remove '$INSTDIR' and all of its contents?" \ + /SD IDYES \ + IDYES confirmed_yes IDNO confirmed_no + confirmed_no: + MessageBox MB_OK|MB_ICONSTOP "Uninstallation aborted by user." /SD IDOK + Quit + confirmed_yes: +FunctionEnd + +# Make function available for both installer and uninstaller +# Uninstaller functions need an `un.` prefix, so we use a macro to do both +# see https://nsis.sourceforge.io/Sharing_functions_between_Installer_and_Uninstaller +!macro AbortRetryNSExecWaitMacro un + Function ${un}AbortRetryNSExecWait + # This function expects three arguments in the stack + # $1: 'WithLog' or 'NoLog': Use ExecToLog or just Exec, respectively + # $2: The message to show if an error occurred + # $3: The command to run, quoted + # Note that the args need to be pushed to the stack in reverse order! + # Search 'AbortRetryNSExecWait' in this script to see examples + ${LogSet} on + Pop $1 + Pop $2 + Pop $3 + ${Do} + ${If} $1 == "WithLog" + nsExec::ExecToLog $3 + ${ElseIf} $1 == "NoLog" + nsExec::Exec $3 + ${Else} + DetailPrint "::error:: AbortRetryNSExecWait: 1st argument must be 'WithLog' or 'NoLog'. You used: $1" + Abort + ${EndIf} + pop $0 + ${If} $0 != "0" + DetailPrint "::error:: $2" + MessageBox MB_ABORTRETRYIGNORE|MB_ICONEXCLAMATION|MB_DEFBUTTON3 \ + $2 /SD IDIGNORE IDABORT abort IDRETRY retry + ; IDIGNORE: Continue anyway + StrCpy $0 "0" + goto retry + abort: + ; Abort installation + Abort + retry: + ; Retry the nsExec command + ${EndIf} + ${LoopWhile} $0 != "0" + FunctionEnd +!macroend +!insertmacro AbortRetryNSExecWaitMacro "" +!insertmacro AbortRetryNSExecWaitMacro "un." + +# Installer sections +Section "Install" + ${LogSet} on + + ${If} ${Silent} + call OnDirectoryLeave + ${EndIf} + + SetOutPath "$INSTDIR\Lib" + File "@NSIS_DIR@\_nsis.py" + File "@NSIS_DIR@\_system_path.py" + + # Resolve INSTDIR so that paths and registry keys do not contain '..' or similar strings. + # $0 is empty if the directory doesn't exist, but the File commands should have created it already. + GetFullPathName $0 $INSTDIR + ${If} $0 == "" + MessageBox MB_ICONSTOP "Error resolving installation directory." /SD IDABORT + Quit + ${EndIf} + StrCpy $INSTDIR $0 + + ReadEnvStr $0 SystemRoot + # set PATH for the installer process, so that MSVC runtimes get found OK + # This is also isolating PATH to be just us and Windows core stuff, which hopefully avoids + # clashes with other stuff on PATH + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PATH", \ + "$INSTDIR;$INSTDIR\Library\mingw-w64\bin;$INSTDIR\Library\usr\bin;$INSTDIR\Library\bin;$INSTDIR\Scripts;$INSTDIR\bin;$0;$0\system32;$0\system32\Wbem").r0' + + # A conda-meta\history file is required for a valid conda prefix + SetOutPath "$INSTDIR\conda-meta" + File __CONDA_HISTORY__ + + SetOutPath "$INSTDIR" + File __CONDA_EXE__ + File __PRE_UNINSTALL__ + + # Copy extra files (code generated on winexe.py) + @EXTRA_FILES@ + + ${If} $InstMode = ${JUST_ME} + SetOutPath "$INSTDIR" + FileOpen $0 ".nonadmin" w + FileClose $0 + ${EndIf} + + SetOutPath "$INSTDIR\pkgs" + File __URLS_FILE__ + File __URLS_TXT_FILE__ +#if pre_install_exists is True + File __PRE_INSTALL__ +#endif + File __POST_INSTALL__ + File /nonfatal /r __INDEX_CACHE__ + File /r __REPODATA_RECORD__ + + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_SAFETY_CHECKS", "disabled").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_EXTRA_SAFETY_CHECKS", "no").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_PKGS_DIRS", "$INSTDIR\pkgs")".r0' + # Extra info for pre and post install scripts + # NOTE: If more vars are added, make sure to update the examples/scripts tests too + # There's a similar block for the pre_uninstall script, further down this file. + # Update that one as well! + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "${VERSION}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' + + @PKG_COMMANDS@ + + SetDetailsPrint TextOnly + DetailPrint "Setting up the package cache..." + push '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --extract-conda-pkgs' + push 'Failed to extract packages' + push 'NoLog' + # We use NoLog here because TQDM progress bars are parsed as a single line in NSIS 3.08 + # These can crash the installer if they get too long (a few packages is enough!) + call AbortRetryNSExecWait + SetDetailsPrint both + + IfFileExists "$INSTDIR\pkgs\pre_install.bat" 0 NoPreInstall + DetailPrint "Running pre_install scripts..." + ReadEnvStr $5 SystemRoot + ReadEnvStr $6 windir + # This 'FileExists' also returns True for directories + ${If} ${FileExists} "$5" + push '"$5\System32\cmd.exe" /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${ElseIf} ${FileExists} "$6" + push '"$6\System32\cmd.exe" /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${Else} + # Cross our fingers CMD is in PATH + push 'cmd.exe /D /C "$INSTDIR\pkgs\pre_install.bat"' + ${EndIf} + push "Failed to run pre_install" + push 'WithLog' + call AbortRetryNSExecWait + NoPreInstall: + + @SETUP_ENVS@ + + @WRITE_CONDARC@ + + AddSize @SIZE@ + + ${If} $Ana_CreateShortcuts_State = ${BST_CHECKED} + DetailPrint "Creating @NAME@ menus..." + push '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --make-menus @MENU_PKGS@' + push 'Failed to create menus' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + +#if has_conda is True + DetailPrint "Initializing conda directories..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" mkdirs' + push 'Failed to initialize conda directories' + push 'WithLog' + call AbortRetryNSExecWait +#endif + + ${If} $Ana_PostInstall_State = ${BST_CHECKED} + DetailPrint "Running post install..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" post_install' + push 'Failed to run post install script' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + ${If} $Ana_ClearPkgCache_State = ${BST_CHECKED} + DetailPrint "Clearing package cache..." + push '"$INSTDIR\_conda.exe" clean --all --yes' + push 'Failed to clear package cache' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + ${If} $Ana_AddToPath_State = ${BST_CHECKED} + DetailPrint "Adding to PATH..." + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" addpath ${PYVERSION} ${NAME} ${VERSION} ${ARCH}' + push 'Failed to add @NAME@ to the system PATH' + push 'WithLog' + call AbortRetryNSExecWait + ${EndIf} + + # Create registry entries saying this is the system Python + # (for this version) + !define PYREG "Software\Python\PythonCore\${PY_VER}" + ${If} $Ana_RegisterSystemPython_State == ${BST_CHECKED} + WriteRegStr SHCTX "${PYREG}\Help\Main Python Documentation" \ + "Main Python Documentation" \ + "$INSTDIR\Doc\python${PYVERSION_JUSTDIGITS}.chm" + + WriteRegStr SHCTX "${PYREG}\InstallPath" "" "$INSTDIR" + + WriteRegStr SHCTX "${PYREG}\InstallPath\InstallGroup" \ + "" "Python ${PY_VER}" + + WriteRegStr SHCTX "${PYREG}\Modules" "" "" + WriteRegStr SHCTX "${PYREG}\PythonPath" \ + "" "$INSTDIR\Lib;$INSTDIR\DLLs" + ${EndIf} + + ${If} $ARGV_NoRegistry == "0" + # Delete registry entries for environment variables set by PothosSDR + # With admin rights, we can delete them + ${If} ${UAC_IsAdmin} + DetailPrint "Deleting PothosSDR registry environment variables..." + !define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' + DeleteRegValue ${env_hklm} "GR_PREFIX" + DeleteRegValue ${env_hklm} "GRC_BLOCKS_PATH" + DeleteRegValue ${env_hklm} "UHD_PKG_PATH" + DeleteRegValue ${env_hklm} "VOLK_PREFIX" + # Without admin rights, we have to shadow them with empty values set for the user + ${Else} + DetailPrint "Overriding PothosSDR registry environment variables for user..." + !define env_hkcu 'HKCU "Environment"' + WriteRegExpandStr ${env_hkcu} "GR_PREFIX" "" + WriteRegExpandStr ${env_hkcu} "GRC_BLOCKS_PATH" "" + WriteRegExpandStr ${env_hkcu} "UHD_PKG_PATH" "" + WriteRegExpandStr ${env_hkcu} "VOLK_PREFIX" "" + ${EndIf} + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + + # Registry uninstall info + WriteRegStr SHCTX "${UNINSTREG}" "DisplayName" "${UNINSTALL_NAME}" + WriteRegStr SHCTX "${UNINSTREG}" "DisplayVersion" "${VERSION}" + WriteRegStr SHCTX "${UNINSTREG}" "Publisher" "${COMPANY}" + WriteRegStr SHCTX "${UNINSTREG}" "UninstallString" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\"" + WriteRegStr SHCTX "${UNINSTREG}" "QuietUninstallString" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\" /S" + WriteRegStr SHCTX "${UNINSTREG}" "DisplayIcon" \ + "$\"$INSTDIR\Uninstall-${NAME}.exe$\"" + + WriteRegDWORD SHCTX "${UNINSTREG}" "NoModify" 1 + WriteRegDWORD SHCTX "${UNINSTREG}" "NoRepair" 1 + ${EndIf} + + WriteUninstaller "$INSTDIR\Uninstall-${NAME}.exe" + + # To address CVE-2022-26526. + # Revoke the write permission on directory "$INSTDIR" for Users if this is + # being run with administrative privileges. Users are: + # AU - authenticated users + # BU - built-in (local) users + # DU - domain users + ${If} ${UAC_IsAdmin} + DetailPrint "Setting installation directory permissions..." + AccessControl::DisableFileInheritance "$INSTDIR" + AccessControl::RevokeOnFile "$INSTDIR" "(AU)" "GenericWrite" + AccessControl::RevokeOnFile "$INSTDIR" "(DU)" "GenericWrite" + AccessControl::RevokeOnFile "$INSTDIR" "(BU)" "GenericWrite" + AccessControl::SetOnFile "$INSTDIR" "(BU)" "GenericRead + GenericExecute" + AccessControl::SetOnFile "$INSTDIR" "(DU)" "GenericRead + GenericExecute" + ${EndIf} +SectionEnd + +!macro AbortRetryNSExecWaitLibNsisCmd cmd + SetDetailsPrint both + DetailPrint "Running ${cmd} scripts..." + SetDetailsPrint listonly + ${If} ${Silent} + push '"$INSTDIR\pythonw.exe" -E -s "$INSTDIR\Lib\_nsis.py" ${cmd}' + ${Else} + push '"$INSTDIR\python.exe" -E -s "$INSTDIR\Lib\_nsis.py" ${cmd}' + ${EndIf} + push "Failed to run ${cmd}" + push 'WithLog' + call un.AbortRetryNSExecWait + SetDetailsPrint both +!macroend + +Section "Uninstall" + # Remove menu items, path entries + + DetailPrint "Deleting @NAME@ menus..." + nsExec::ExecToLog '"$INSTDIR\_conda.exe" constructor --prefix "$INSTDIR" --rm-menus' + + # ensure that MSVC runtime DLLs are on PATH during uninstallation + ReadEnvStr $0 PATH + # set PATH for the installer process, so that MSVC runtimes get found OK + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PATH", \ + "$INSTDIR;$INSTDIR\Library\mingw-w64\bin;$INSTDIR\Library\usr\bin;$INSTDIR\Library\bin;$INSTDIR\Scripts;$INSTDIR\bin;$0;$0\system32;$0\system32\Wbem").r0' + + # our newest Python builds have a patch that allows us to control the PATH search stuff much more + # carefully. More info at https://docs.conda.io/projects/conda/en/latest/user-guide/troubleshooting.html#solution + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("CONDA_DLL_SEARCH_MODIFICATION_ENABLE", "1").r0' + + # Read variables the uninstaller needs from the registry + StrCpy $R0 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + StrLen $R1 "Uninstall-${NAME}.exe" + IntOp $R1 $R1 + 3 + StrCpy $0 0 + loop_path: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_path + StrCpy $2 "$R0\$1" + ReadRegStr $4 SHCTX $2 "UninstallString" + StrLen $5 $4 + IntOp $5 $5 - $R1 + StrCpy $4 $4 $5 1 + ${If} $4 == $INSTDIR + StrCpy $INSTALLER_NAME_FULL $1 + ReadRegStr $INSTALLER_VERSION SHCTX $2 "DisplayVersion" + goto endloop_path + ${EndIf} + IntOp $0 $0 + 1 + goto loop_path + endloop_path: + + # Extra info for pre_uninstall scripts + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("PREFIX", "$INSTDIR").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_NAME", "${NAME}").r0' + StrCpy $0 ${VERSION} + ${If} $INSTALLER_VERSION != "" + StrCpy $0 $INSTALLER_VERSION + ${EndIf} + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_VER", "$0").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_PLAT", "${PLATFORM}").r0' + System::Call 'kernel32::SetEnvironmentVariable(t,t)i("INSTALLER_TYPE", "EXE").r0' + + !insertmacro AbortRetryNSExecWaitLibNsisCmd "pre_uninstall" + !insertmacro AbortRetryNSExecWaitLibNsisCmd "rmpath" + !insertmacro AbortRetryNSExecWaitLibNsisCmd "rmreg" + + DetailPrint "Removing files and folders..." + nsExec::Exec 'cmd.exe /D /C RMDIR /Q /S "$INSTDIR"' + + # In case the last command fails, run the slow method to remove leftover + RMDir /r /REBOOTOK "$INSTDIR" + + # Delete user environment variables that we set during installation + ${IfNot} ${UAC_IsAdmin} + DeleteRegValue ${env_hkcu} "GR_PREFIX" + DeleteRegValue ${env_hkcu} "GRC_BLOCKS_PATH" + DeleteRegValue ${env_hkcu} "UHD_PKG_PATH" + DeleteRegValue ${env_hkcu} "VOLK_PREFIX" + SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 + ${EndIf} + + ${If} $INSTALLER_NAME_FULL != "" + DeleteRegKey SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTALLER_NAME_FULL" + ${EndIf} + + # If Anaconda was registered as the official Python for this version, + # remove it from the registry + StrCpy $R0 "SOFTWARE\Python\PythonCore" + StrCpy $0 0 + loop_py: + EnumRegKey $1 SHCTX $R0 $0 + StrCmp $1 "" endloop_py + ReadRegStr $2 SHCTX "$R0\$1\InstallPath" "" + ${If} $2 == $INSTDIR + StrCpy $R1 $1 + DeleteRegKey SHCTX "$R0\$1" + goto endloop_py + ${EndIf} + IntOp $0 $0 + 1 + goto loop_py + endloop_py: +SectionEnd + +!if '@SIGNTOOL_COMMAND@' != '' + # Signing for installer and uninstaller; nsis 3.08 required for uninstfinalize! + # "= 0" comparison required to prevent both tasks running in parallel, which would cause signtool to fail + # %1 is replaced by the installer and uninstaller paths, respectively + !finalize '@SIGNTOOL_COMMAND@ "%1"' = 0 + !uninstfinalize '@SIGNTOOL_COMMAND@ "%1"' = 0 +!endif diff --git a/rerender.py b/rerender.py index 8286902..3e37c2f 100755 --- a/rerender.py +++ b/rerender.py @@ -1,9 +1,13 @@ #!/usr/bin/env python3 +import contextlib import pathlib import shutil from typing import Any, Dict, Optional import conda_lock +from conda_package_streaming.package_streaming import stream_conda_component +from conda_package_streaming.url import conda_reader_for_url +import diff_match_patch import yaml @@ -93,10 +97,20 @@ def render_constructors( company: str, license_file: pathlib.Path, output_dir: pathlib.Path, + builder_lockfile_path: pathlib.Path, ) -> None: lock_content = conda_lock.conda_lock.parse_conda_lock_file(lockfile_path) lock_work_dir = lockfile_path.parent + builder_lock_content = conda_lock.conda_lock.parse_conda_lock_file( + builder_lockfile_path + ) + constructor_lockdeps = [ + lockdep + for lockdep in builder_lock_content.package + if lockdep.name == "constructor" + ] + # render main + installer env specs into environment file for creating installer conda_lock.conda_lock.do_render( lockfile=lock_content, @@ -185,10 +199,65 @@ def render_constructors( with construct_yaml_path.open("w") as f: yaml.safe_dump(construct_dict, stream=f) + if platform.startswith("win"): + # patch constructor's nsis template + constructor_platform_lockdeps = [ + lockdep + for lockdep in constructor_lockdeps + if lockdep.platform == platform + ] + if constructor_platform_lockdeps: + lockdep = constructor_platform_lockdeps[0] + + # get the NSIS template that comes with the locked constructor package + constructor_filename, constructor_pkg = conda_reader_for_url( + lockdep.url + ) + with contextlib.closing(constructor_pkg): + for tar, member in stream_conda_component( + constructor_filename, constructor_pkg, component="pkg" + ): + if ( + member.name + == "site-packages/constructor/nsis/main.nsi.tmpl" + ): + locked_nsi_tmpl = tar.extractfile(member).read().decode() + break + # read the original and custom NSIS templates + local_constructor_nsis = pathlib.Path("constructor") / "nsis" + with (local_constructor_nsis / "main.nsi.tmpl.orig").open("r") as f: + orig_nsi_tmpl = f.read() + with (local_constructor_nsis / "main.nsi.tmpl").open("r") as f: + custom_nsi_tmpl = f.read() + + # get patch from original NSIS template to locked version we will be + # building with and apply it to the custom template + dmp = diff_match_patch.diff_match_patch() + line_orig, line_locked, line_array = dmp.diff_linesToChars( + orig_nsi_tmpl, locked_nsi_tmpl + ) + diffs = dmp.diff_main(line_orig, line_locked, checklines=False) + dmp.diff_charsToLines(diffs, line_array) + patches = dmp.patch_make(orig_nsi_tmpl, diffs) + patched_nsi_tmpl, results = dmp.patch_apply(patches, custom_nsi_tmpl) + if not all(results): + raise RuntimeError("Conflicts found when patching NSIS template") + + # write patched template to constructor dir + with (constructor_dir / "main.nsi.tmpl").open("w") as f: + f.write(patched_nsi_tmpl) + + # update orig and custom with locked and patched + with (local_constructor_nsis / "main.nsi.tmpl.orig").open("w") as f: + f.write(locked_nsi_tmpl) + with (local_constructor_nsis / "main.nsi.tmpl").open("w") as f: + f.write(patched_nsi_tmpl) + def render( environment_file: pathlib.Path, installer_environment_file: pathlib.Path, + builder_environment_file: pathlib.Path, version: str, company: str, license_file: pathlib.Path, @@ -219,6 +288,17 @@ def render( lock_work_dir = output_dir / "lockwork" lock_work_dir.mkdir(parents=True, exist_ok=True) + # create the locked build environment specification + builder_lockfile_path = output_dir / "buildenv.conda-lock.yml" + conda_lock.conda_lock.run_lock( + environment_files=[builder_environment_file], + conda_exe=conda_exe, + mamba=True, + micromamba=True, + kinds=("lock",), + lockfile_path=builder_lockfile_path, + ) + # read environment files and create the lock file lockfile_path = lock_work_dir / f"{env_name}.conda-lock.yml" conda_lock.conda_lock.run_lock( @@ -256,6 +336,7 @@ def render( company=company, license_file=license_file, output_dir=output_dir, + builder_lockfile_path=builder_lockfile_path, ) # clean up conda-lock work dir @@ -309,6 +390,18 @@ if __name__ == "__main__": " (default: %(default)s)" ), ) + parser.add_argument( + "builder_environment_file", + type=pathlib.Path, + nargs="?", + default=here / "buildenv.yaml", + help=( + "YAML file defining the builder environment for running conda-constructor," + " with a 'name' string and 'channels', 'platforms', and 'dependencies'" + " lists." + " (default: %(default)s)" + ), + ) parser.add_argument( "-v", "--version", @@ -378,6 +471,7 @@ if __name__ == "__main__": render( environment_file=args.environment_file, installer_environment_file=args.installer_environment_file, + builder_environment_file=args.builder_environment_file, version=args.version, company=args.company, license_file=args.license_file, diff --git a/static/0001-Customize-Windows-NSIS-installer-script.patch b/static/0001-Customize-Windows-NSIS-installer-script.patch deleted file mode 100644 index 4002b6f..0000000 --- a/static/0001-Customize-Windows-NSIS-installer-script.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ryan Volz -Date: Wed, 23 Feb 2022 18:11:22 -0500 -Subject: [PATCH] Customize Windows NSIS installer script. - -1. Never clear the full pkg dir -2. Delete environment variables set in registry by PothosSDR -3. Do not show "advanced" installation options ---- - constructor/nsis/main.nsi.tmpl | 33 +++++++++++++++++++++++++++++++-- - 1 file changed, 31 insertions(+), 2 deletions(-) - -diff --git a/constructor/nsis/main.nsi.tmpl b/constructor/nsis/main.nsi.tmpl -index 865ebb3..2e84269 100644 ---- a/constructor/nsis/main.nsi.tmpl -+++ b/constructor/nsis/main.nsi.tmpl -@@ -153,7 +153,7 @@ Page Custom InstModePage_Create InstModePage_Leave - !define MUI_PAGE_CUSTOMFUNCTION_LEAVE OnDirectoryLeave - !insertmacro MUI_PAGE_DIRECTORY - # Custom options now differ depending on installation mode. --Page Custom mui_AnaCustomOptions_Show -+#Page Custom mui_AnaCustomOptions_Show - !insertmacro MUI_PAGE_INSTFILES - #if with_conclusion_text is True - !define MUI_FINISHPAGE_TITLE __CONCLUSION_TITLE__ -@@ -1185,7 +1185,7 @@ Section "Install" - - ${If} $Ana_ClearPkgCache_State = ${BST_CHECKED} - DetailPrint "Clearing package cache..." -- push '"$INSTDIR\_conda.exe" clean --all --force-pkgs-dirs --yes' -+ push '"$INSTDIR\_conda.exe" clean --all --yes' - push 'Failed to clear package cache' - push 'WithLog' - call AbortRetryNSExecWait -@@ -1218,6 +1218,26 @@ Section "Install" - ${EndIf} - - ${If} $ARGV_NoRegistry == "0" -+ # Delete registry entries for environment variables set by PothosSDR -+ # With admin rights, we can delete them -+ ${If} ${UAC_IsAdmin} -+ DetailPrint "Deleting PothosSDR registry environment variables..." -+ !define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' -+ DeleteRegValue ${env_hklm} "GR_PREFIX" -+ DeleteRegValue ${env_hklm} "GRC_BLOCKS_PATH" -+ DeleteRegValue ${env_hklm} "UHD_PKG_PATH" -+ DeleteRegValue ${env_hklm} "VOLK_PREFIX" -+ # Without admin rights, we have to shadow them with empty values set for the user -+ ${Else} -+ DetailPrint "Overriding PothosSDR registry environment variables for user..." -+ !define env_hkcu 'HKCU "Environment"' -+ WriteRegExpandStr ${env_hkcu} "GR_PREFIX" "" -+ WriteRegExpandStr ${env_hkcu} "GRC_BLOCKS_PATH" "" -+ WriteRegExpandStr ${env_hkcu} "UHD_PKG_PATH" "" -+ WriteRegExpandStr ${env_hkcu} "VOLK_PREFIX" "" -+ ${EndIf} -+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 -+ - # Registry uninstall info - WriteRegStr SHCTX "${UNINSTREG}" "DisplayName" "${UNINSTALL_NAME}" - WriteRegStr SHCTX "${UNINSTREG}" "DisplayVersion" "${VERSION}" -@@ -1326,6 +1346,15 @@ Section "Uninstall" - # In case the last command fails, run the slow method to remove leftover - RMDir /r /REBOOTOK "$INSTDIR" - -+ # Delete user environment variables that we set during installation -+ ${IfNot} ${UAC_IsAdmin} -+ DeleteRegValue ${env_hkcu} "GR_PREFIX" -+ DeleteRegValue ${env_hkcu} "GRC_BLOCKS_PATH" -+ DeleteRegValue ${env_hkcu} "UHD_PKG_PATH" -+ DeleteRegValue ${env_hkcu} "VOLK_PREFIX" -+ SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 -+ ${EndIf} -+ - ${If} $INSTALLER_NAME_FULL != "" - DeleteRegKey SHCTX "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTALLER_NAME_FULL" - ${EndIf} --- -2.40.0 -