From e11d42aaa465d0adbdd18631cb5ae5e27d2981f9 Mon Sep 17 00:00:00 2001 From: Michael Maltsev <4129781+m417z@users.noreply.github.com> Date: Sun, 5 Nov 2023 01:53:01 +0200 Subject: [PATCH] v1.4 --- .../src/app/panel/About.tsx | 3 +- .../src/app/panel/ModDetailsAdvanced.tsx | 31 +- .../src/app/panel/ModDetailsSettings.tsx | 8 +- .../src/app/panel/Settings.tsx | 204 +- .../src/app/panel/mockData.ts | 5 +- .../src/app/webviewIPCMessages.ts | 5 +- .../src/locales/de/translation.json | 19 +- .../src/locales/en/translation.json | 19 +- .../src/locales/es/translation.json | 19 +- .../src/locales/fr/translation.json | 19 +- .../src/locales/it/translation.json | 19 +- .../src/locales/{jp => ja}/translation.json | 48 +- .../src/locales/ko/translation.json | 289 + .../src/locales/pl/translation.json | 289 + .../src/locales/pt-BR/translation.json | 289 + .../src/locales/ro/translation.json | 289 + .../src/locales/ru/translation.json | 289 + .../src/locales/tr/translation.json | 19 +- .../src/locales/ua/translation.json | 289 + .../src/locales/zh-CN/translation.json | 19 +- .../src/locales/zh-TW/translation.json | 19 +- src/vscode-windhawk-ui/package-lock.json | 4 +- src/vscode-windhawk-ui/package.json | 2 +- src/vscode-windhawk/files/mod_template.wh.cpp | 2 +- src/vscode-windhawk/package-lock.json | 6179 ++++------------- src/vscode-windhawk/package.json | 74 +- src/vscode-windhawk/src/extension.ts | 71 +- .../src/utils/appSettingsUtils.ts | 42 +- .../src/utils/compilerUtils.ts | 176 +- .../src/utils/editorWorkspaceUtils.ts | 5 + .../src/utils/modConfigUtils.ts | 11 + .../src/utils/modSourceUtils.ts | 2 +- .../src/utils/userProfileUtils.ts | 10 +- src/vscode-windhawk/src/webviewIPCMessages.ts | 5 +- src/windhawk/app/engine_control.cpp | 4 +- src/windhawk/app/engine_control.h | 4 +- src/windhawk/app/functions.cpp | 151 + src/windhawk/app/functions.h | 11 + src/windhawk/app/main_window.cpp | 42 +- src/windhawk/app/resource.h | 5 +- src/windhawk/app/rsrc.rc | Bin 55714 -> 91134 bytes src/windhawk/app/service.cpp | 5 +- src/windhawk/app/stdafx.h | 5 +- src/windhawk/app/task_manager_dlg.cpp | 246 +- src/windhawk/app/task_manager_dlg.h | 22 +- src/windhawk/app/toolkit_dlg.cpp | 39 +- src/windhawk/app/toolkit_dlg.h | 7 +- src/windhawk/app/tray_icon.cpp | 57 +- src/windhawk/app/tray_icon.h | 5 + src/windhawk/app/ui_control.cpp | 4 + src/windhawk/app/userprofile.cpp | 17 +- src/windhawk/engine/_exports.def | 3 +- .../engine/all_processes_injector.cpp | 90 +- src/windhawk/engine/all_processes_injector.h | 5 +- src/windhawk/engine/critical_processes.h | 50 + src/windhawk/engine/dll_inject.cpp | 331 +- src/windhawk/engine/engine.vcxproj | 1 + src/windhawk/engine/engine.vcxproj.filters | 3 + src/windhawk/engine/functions.cpp | 77 +- src/windhawk/engine/functions.h | 8 +- .../inject_shellcode/InjectShellcode.vcxproj | 5 + .../engine/inject_shellcode/_find-api-hash.py | 37 - src/windhawk/engine/inject_shellcode/main.cpp | 310 +- .../libraries/MinHook/libMinHook.d.x64.lib | Bin 49790 -> 49790 bytes .../libraries/MinHook/libMinHook.d.x86.lib | Bin 34032 -> 34032 bytes .../libraries/MinHook/libMinHook.x64.lib | Bin 524054 -> 540360 bytes .../libraries/MinHook/libMinHook.x86.lib | Bin 504188 -> 520584 bytes src/windhawk/engine/main.cpp | 5 +- src/windhawk/engine/mod.cpp | 88 +- src/windhawk/engine/mod.h | 8 +- src/windhawk/engine/mods_api.cpp | 12 +- src/windhawk/engine/mods_api.h | 91 +- src/windhawk/engine/mods_api_internal.h | 9 +- src/windhawk/engine/new_process_injector.cpp | 27 +- src/windhawk/engine/new_process_injector.h | 4 +- src/windhawk/engine/symbol_enum.cpp | 22 +- src/windhawk/engine/symbol_enum.h | 11 +- .../shared/libraries/wil/Tracelogging.h | 1532 ++-- .../shared/libraries/wil/_version.txt | 2 +- src/windhawk/shared/libraries/wil/com.h | 6 +- src/windhawk/shared/libraries/wil/coroutine.h | 810 +++ src/windhawk/shared/libraries/wil/cppwinrt.h | 83 + .../shared/libraries/wil/cppwinrt_authoring.h | 290 + .../shared/libraries/wil/cppwinrt_helpers.h | 6 +- .../shared/libraries/wil/filesystem.h | 24 +- src/windhawk/shared/libraries/wil/registry.h | 3041 +++++++- .../shared/libraries/wil/registry_helpers.h | 1860 +++++ src/windhawk/shared/libraries/wil/resource.h | 22 +- src/windhawk/shared/libraries/wil/result.h | 8 +- .../shared/libraries/wil/result_macros.h | 133 +- .../shared/libraries/wil/result_originate.h | 7 +- .../shared/libraries/wil/token_helpers.h | 1 + .../shared/libraries/wil/win32_helpers.h | 59 +- src/windhawk/shared/libraries/wil/winrt.h | 12 +- src/windhawk/shared/version.h | 4 +- 95 files changed, 12100 insertions(+), 6394 deletions(-) rename src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/{jp => ja}/translation.json (81%) create mode 100644 src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ko/translation.json create mode 100644 src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pl/translation.json create mode 100644 src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pt-BR/translation.json create mode 100644 src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ro/translation.json create mode 100644 src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ru/translation.json create mode 100644 src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ua/translation.json create mode 100644 src/windhawk/engine/critical_processes.h delete mode 100644 src/windhawk/engine/inject_shellcode/_find-api-hash.py create mode 100644 src/windhawk/shared/libraries/wil/coroutine.h create mode 100644 src/windhawk/shared/libraries/wil/cppwinrt_authoring.h create mode 100644 src/windhawk/shared/libraries/wil/registry_helpers.h diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/About.tsx b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/About.tsx index a20860d..70867a7 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/About.tsx +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/About.tsx @@ -52,7 +52,8 @@ function About() {

{t('about.title', { - version: currentVersion + ' ' + t('about.beta'), + // version: currentVersion + ' ' + t('about.beta'), + version: currentVersion, })}

{t('about.subtitle')}

diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsAdvanced.tsx b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsAdvanced.tsx index eb030af..c638f0f 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsAdvanced.tsx +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsAdvanced.tsx @@ -1,4 +1,4 @@ -import { Button, Dropdown, List, message, Select, Space } from 'antd'; +import { Button, Dropdown, List, message, Select, Space, Switch } from 'antd'; import { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import styled from 'styled-components'; @@ -44,6 +44,8 @@ function ModDetailsAdvanced({ modId }: Props) { const [customIncludeModified, setCustomIncludeModified] = useState(false); const [customExclude, setCustomExclude] = useState(); const [customExcludeModified, setCustomExcludeModified] = useState(false); + const [includeExcludeCustomOnly, setIncludeExcludeCustomOnly] = + useState(); const { getModConfig } = useGetModConfig( useCallback((data) => { @@ -58,6 +60,10 @@ function ModDetailsAdvanced({ modId }: Props) { setCustomInclude(data.config?.includeCustom?.join('\n') ?? ''); setCustomExclude(data.config?.excludeCustom?.join('\n') ?? ''); + + setIncludeExcludeCustomOnly( + data.config?.includeExcludeCustomOnly ?? false + ); }, []) ); @@ -96,7 +102,8 @@ function ModDetailsAdvanced({ modId }: Props) { modSettingsUI === undefined || debugLogging === undefined || customInclude === undefined || - customExclude === undefined + customExclude === undefined || + includeExcludeCustomOnly === undefined ) { return null; } @@ -302,6 +309,26 @@ function ModDetailsAdvanced({ modId }: Props) { + + + { + setIncludeExcludeCustomOnly(checked); + updateModConfig({ + modId, + config: { + includeExcludeCustomOnly: checked, + }, + }); + }} + /> + ); diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSettings.tsx b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSettings.tsx index 694a323..0cde32c 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSettings.tsx +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/ModDetailsSettings.tsx @@ -24,7 +24,7 @@ const SettingInputNumber = styled(InputWithContextMenu.InputNumber)` } `; -const SettingSelect = styled(Select)` +const SettingSelect = styled(InputWithContextMenu.Select)` width: 100%; `; @@ -104,7 +104,11 @@ function StringSetting({ value, sampleValue, onChange }: StringSettingProps) { return ( onChange(e.target.value)} /> diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/Settings.tsx b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/Settings.tsx index 8ed326d..80eea33 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/Settings.tsx +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/Settings.tsx @@ -51,8 +51,14 @@ const appLanguages = [ es: 'Español', fr: 'Français', it: 'Italiano', - jp: '日本語', + ja: '日本語', + ko: '한국어', + pl: 'Polski', + 'pt-BR': 'Português', + ro: 'Română', + ru: 'Русский', tr: 'Türkçe', + ua: 'Українська', 'zh-CN': '简体中文', 'zh-TW': '繁體中文', }).sort((a, b) => a[1].localeCompare(b[1])), @@ -63,6 +69,46 @@ function parseIntLax(value?: string | number | null) { return Number.isNaN(result) ? 0 : result; } +function engineIncludeFromEngineAppSettings( + engineAppSettings: AppSettings['engine'] +) { + return engineAppSettings.include.join('\n'); +} + +function engineExcludeFromEngineAppSettings( + engineAppSettings: AppSettings['engine'] +) { + return [ + ...(engineAppSettings.injectIntoCriticalProcesses + ? [] + : ['']), + ...engineAppSettings.exclude, + ].join('\n'); +} + +function engineIncludeToEngineAppSettings(include: string) { + const includeArray = include + .split('\n') + .map((x) => x.trim()) + .filter((x) => x); + return { + include: includeArray, + }; +} + +function engineExcludeToEngineAppSettings(exclude: string) { + const excludeArray = exclude + .split('\n') + .map((x) => x.trim()) + .filter((x) => x); + return { + exclude: excludeArray.filter((x) => x !== ''), + injectIntoCriticalProcesses: !excludeArray.includes( + '' + ), + }; +} + function Settings() { const { t, i18n } = useTranslation(); const appLanguage = i18n.resolvedLanguage; @@ -76,20 +122,20 @@ function Settings() { const [engineLoggingVerbosity, setEngineLoggingVerbosity] = useState(0); const [engineInclude, setEngineInclude] = useState(''); const [engineExclude, setEngineExclude] = useState(''); - const [engineThreadAttachExempt, setEngineThreadAttachExempt] = useState(''); - const [injectIntoCriticalProcesses, setInjectIntoCriticalProcesses] = - useState(false); + const [ + engineLoadModsInCriticalSystemProcesses, + setEngineLoadModsInCriticalSystemProcesses, + ] = useState(0); const resetMoreAdvancedSettings = useCallback(() => { if (appSettings) { setAppLoggingVerbosity(appSettings.loggingVerbosity); setEngineLoggingVerbosity(appSettings.engine.loggingVerbosity); - setEngineInclude(appSettings.engine.include.join('\n')); - setEngineExclude(appSettings.engine.exclude.join('\n')); - setEngineThreadAttachExempt( - appSettings.engine.threadAttachExempt.join('\n') + setEngineInclude(engineIncludeFromEngineAppSettings(appSettings.engine)); + setEngineExclude(engineExcludeFromEngineAppSettings(appSettings.engine)); + setEngineLoadModsInCriticalSystemProcesses( + appSettings.engine.loadModsInCriticalSystemProcesses ); - setInjectIntoCriticalProcesses(appSettings.injectIntoCriticalProcesses); } }, [appSettings]); @@ -120,6 +166,14 @@ function Settings() { const [isMoreAdvancedSettingsModalOpen, setIsMoreAdvancedSettingsModalOpen] = useState(false); + const excludeListHasCriticalSystemProcesses = !!engineExclude.match( + /^[ \t]*[ \t]*$/m + ); + const includeListEmpty = engineInclude.trim() === ''; + const excludeListEmpty = engineExclude.trim() === ''; + const excludeListHasWildcard = + !excludeListEmpty && !!engineExclude.match(/^[ \t]*\*[ \t]*$/m); + if (!appSettings) { return null; } @@ -305,22 +359,13 @@ function Settings() { onOk={() => { updateAppSettings({ appSettings: { - injectIntoCriticalProcesses, loggingVerbosity: appLoggingVerbosity, engine: { loggingVerbosity: engineLoggingVerbosity, - include: engineInclude - .split('\n') - .map((x) => x.trim()) - .filter((x) => x), - exclude: engineExclude - .split('\n') - .map((x) => x.trim()) - .filter((x) => x), - threadAttachExempt: engineThreadAttachExempt - .split('\n') - .map((x) => x.trim()) - .filter((x) => x), + ...engineIncludeToEngineAppSettings(engineInclude), + ...engineExcludeToEngineAppSettings(engineExclude), + loadModsInCriticalSystemProcesses: + engineLoadModsInCriticalSystemProcesses, }, }, }); @@ -405,6 +450,29 @@ function Settings() { setEngineExclude(e.target.value); }} /> + {!excludeListHasCriticalSystemProcesses && ( + ]} + values={{ + critical_system_processes: '', + }} + // A workaround to make a value with `<` work properly. + shouldUnescape + tOptions={{ + interpolation: { + escapeValue: true, + }, + }} + /> + } + type="info" + showIcon + /> + )} - {engineExclude.replace(/\n+$/g, '').length === 0 && - engineInclude.replace(/\n+$/g, '').length > 0 && ( - - )} + {!includeListEmpty && excludeListEmpty && ( + + )} + {!includeListEmpty && !excludeListHasWildcard && ( + + )} - website - , - ]} - /> - } + title={t('settings.loadModsInCriticalSystemProcesses.title')} + description={t( + 'settings.loadModsInCriticalSystemProcesses.description' + )} /> - { - setEngineThreadAttachExempt(e.target.value); + { + setEngineLoadModsInCriticalSystemProcesses( + typeof value === 'number' ? value : 0 + ); }} - /> - - {injectIntoCriticalProcesses !== null && ( - - + + {t('settings.loadModsInCriticalSystemProcesses.never')} + + + {t( + 'settings.loadModsInCriticalSystemProcesses.onlyExplicitMatch' )} - /> - { - setInjectIntoCriticalProcesses(checked); - }} - /> - - )} + + + {t('settings.loadModsInCriticalSystemProcesses.always')} + + + diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/mockData.ts b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/mockData.ts index 150f7a5..7801893 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/mockData.ts +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/panel/mockData.ts @@ -13,14 +13,14 @@ export const mockSettings = !useMockData hideTrayIcon: false, dontAutoShowToolkit: false, modTasksDialogDelay: 2000, - injectIntoCriticalProcesses: false, safeMode: false, loggingVerbosity: 0, engine: { loggingVerbosity: 0, include: ['a.exe', 'b.exe'], exclude: ['c.exe', 'd.exe'], - threadAttachExempt: ['e.exe', 'f.exe'], + injectIntoCriticalProcesses: false, + loadModsInCriticalSystemProcesses: 1, }, }; @@ -52,6 +52,7 @@ const mockModConfig = { exclude: ['explorer.exe'], includeCustom: [], excludeCustom: [], + includeExcludeCustomOnly: false, architecture: ['x86-64'], version: '1.0', }; diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/webviewIPCMessages.ts b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/webviewIPCMessages.ts index 50c7383..8aa937d 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/webviewIPCMessages.ts +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/app/webviewIPCMessages.ts @@ -61,6 +61,7 @@ export type ModConfig = { exclude: string[]; includeCustom: string[]; excludeCustom: string[]; + includeExcludeCustomOnly: boolean; architecture: string[]; version: string; }; @@ -74,14 +75,14 @@ export type AppSettings = { hideTrayIcon: boolean; dontAutoShowToolkit: boolean; modTasksDialogDelay: number; - injectIntoCriticalProcesses: boolean | null; safeMode: boolean; loggingVerbosity: number; engine: { loggingVerbosity: number; include: string[]; exclude: string[]; - threadAttachExempt: string[]; + injectIntoCriticalProcesses: boolean; + loadModsInCriticalSystemProcesses: number; }; }; diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/de/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/de/translation.json index 98bed80..04dd55f 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/de/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/de/translation.json @@ -109,6 +109,10 @@ "descriptionExclusion": "Eine benutzerdefinierte Liste zusätzlicher ausführbarer Dateinamen/Pfade, die die Mod vom Targeting ausschließt. Die Liste wird der Ausschlussliste hinzugefügt, die der Mod-Autor definiert hat, um zu bestimmen, auf welche Prozesse abgezielt werden soll. Für jeden Prozess wird die Mod geladen, wenn der Pfad der ausführbaren Datei mit einem der Include-Einträge übereinstimmt und mit keinem Exclude-Eintrag übereinstimmt.", "processListPlaceholder": "Prozessnamen/-pfade, einer pro Zeile, z.B.:", "saveButton": "Speichern" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -188,16 +192,19 @@ "processList": { "titleExclusion": "Liste der ausgeschlossenen Prozesse", "descriptionExclusion": "Eine Liste von Prozessnamen/-pfaden, in die Windhawk nicht einfügt. Kann nützlich sein, wenn Windhawk nicht mit einem bestimmten Programm kompatibel ist. Beachten Sie, dass das Hinzufügen eines Prozesses zu dieser Liste Windhawk nicht nur daran hindert, ihn anzupassen, sondern auch daran hindert, untergeordnete Prozesse abzufangen, die dieser Prozess erstellt. Dies führt dazu, dass Windhawk Mods in solchen Fällen mit einer leichten Verzögerung lädt.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "Liste der eingeschlossenen Prozesse", "descriptionInclusion": "Eine Liste von Prozessnamen/-pfaden, in die Windhawk einfügt, selbst wenn sie in der Ausschlussliste stehen.", - "inclusionWithoutExclusionNotice": "Bei einer leeren Prozessausschlussliste hat die Prozessaufnahmeliste keine Wirkung. Wenn Sie alle Prozesse außer diesen ausschließen wollten, können Sie \"*\" in der Prozessausschlussliste setzen.", - "titleThreadAttachExempt": "Prozessliste für die Injektionsmethode \"light threads\"", - "descriptionThreadAttachExempt": "Überspringt einen Teil der Initialisierung von Windhawk-Threads (TLS-Initialisierung, TLS- und DllMain-Callbacks und mehr). Dies kann die Inkompatibilität mit einigen Programmen beheben, aber die Kompatibilität mit anderen beeinträchtigen. <0>Mehr Informationen.", + "inclusionWithoutExclusionNotice": "Bei einer leeren Prozessausschlussliste hat die Prozessaufnahmeliste keine Wirkung.", + "inclusionWithoutTotalExclusionNotice": "Wenn Sie alle Prozesse außer diesen ausschließen wollten, können Sie \"*\" in der Prozessausschlussliste setzen.", "processListPlaceholder": "Prozessnamen/-pfade, einer pro Zeile, z.B.:" }, - "injectIntoCriticalProcesses": { - "title": "Code in kritische Systemprozesse injizieren", - "description": "Standardmäßig fügt Windhawk keinen Code in kritische Systemprozesse ein. Verwenden Sie diese Option mit Vorsicht, da das Abstürzen eines dieser Prozesse zu einem BSOD führen kann." + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/en/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/en/translation.json index 5dce8eb..06cf0a9 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/en/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/en/translation.json @@ -113,6 +113,10 @@ "descriptionExclusion": "A custom list of additional executable file names/paths that the mod will excluded from targeting. The list is added to the exclusion list that the mod author defined to determine which processes to target. For each process, the mod is loaded if the executable file path matches one of the include entries and doesn't match any exclude entry.", "processListPlaceholder": "Process names/paths, one per line, for example:", "saveButton": "Save" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -196,16 +200,19 @@ "processList": { "titleExclusion": "Process exclusion list", "descriptionExclusion": "A list of process names/paths that Windhawk won't inject into. Can be useful for cases when Windhawk isn't compatible with a specific program. Note that adding a process to this list will not only prevent Windhawk from customizing it, but will also prevent Windhawk from intercepting child processes that this process creates. This will cause Windhawk to load mods with a slight delay in such cases.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "Process inclusion list", "descriptionInclusion": "A list of process names/paths that Windhawk will inject into, even if they're in the exclusion list.", - "inclusionWithoutExclusionNotice": "The process inclusion list has no effect with an empty process exclusion list. If you meant to exclude all processes but these, you can set \"*\" in the process exclusion list.", - "titleThreadAttachExempt": "Process list for the \"light threads\" injection method", - "descriptionThreadAttachExempt": "Skip some of the initialization of Windhawk threads (skips TLS initialization, TLS and DllMain callbacks, and more). This might fix compatibility with some programs, but might break compatibility with others. <0>More information.", + "inclusionWithoutExclusionNotice": "The process inclusion list has no effect with an empty process exclusion list.", + "inclusionWithoutTotalExclusionNotice": "If you meant to exclude all processes but these, you can set \"*\" in the process exclusion list.", "processListPlaceholder": "Process names/paths, one per line, for example:" }, - "injectIntoCriticalProcesses": { - "title": "Inject into critical system processes", - "description": "By default, Windhawk doesn't inject code into critical system processes. Use this option with care, as crashing one of these processes might lead to a BSOD." + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/es/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/es/translation.json index 83b8465..08ec262 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/es/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/es/translation.json @@ -113,6 +113,10 @@ "descriptionExclusion": "Una lista personalizada de nombres/rutas de archivos ejecutables adicionales que el mod excluirá de la orientación. La lista se agrega a la lista de exclusión que el autor del mod definió para determinar a qué procesos apuntar. Para cada proceso, el mod se carga si la ruta del archivo ejecutable coincide con una de las entradas de inclusión y no coincide con ninguna entrada de exclusión.", "processListPlaceholder": "Nombres/rutas de procesos, uno por línea, por ejemplo:", "saveButton": "Guardar" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -196,16 +200,19 @@ "processList": { "titleExclusion": "Lista de exclusión de procesos", "descriptionExclusion": "Una lista de nombres de procesos/rutas en las que Windhawk no inyectará. Puede ser útil para casos en los que Windhawk no es compatible con un programa específico. Tenga en cuenta que agregar un proceso a esta lista no solo evitará que Windhawk lo personalice, sino que también evitará que Windhawk intercepte los procesos secundarios que crea este proceso. Esto hará que Windhawk cargue mods con un ligero retraso en tales casos.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "Lista de inclusión de procesos", "descriptionInclusion": "Una lista de nombres de procesos/rutas en las que se inyectará Windhawk, incluso si están en la lista de exclusión.", - "inclusionWithoutExclusionNotice": "La lista de inclusión de procesos no tiene efecto con una lista de exclusión de procesos vacía. Si pretendía excluir todos los procesos menos estos, puede establecer \"*\" en la lista de exclusión de procesos.", - "titleThreadAttachExempt": "Lista de procesos para el método de inyección \"hilos ligeros\".", - "descriptionThreadAttachExempt": "Omita parte de la inicialización de subprocesos de Windhawk (omite la inicialización de TLS, las devoluciones de llamada de TLS y DllMain, y más). Esto podría solucionar la compatibilidad con algunos programas, pero podría romper la compatibilidad con otros. <0>Más información.", + "inclusionWithoutExclusionNotice": "La lista de inclusión de procesos no tiene efecto con una lista de exclusión de procesos vacía.", + "inclusionWithoutTotalExclusionNotice": "Si pretendía excluir todos los procesos menos estos, puede establecer \"*\" en la lista de exclusión de procesos.", "processListPlaceholder": "Nombres/rutas de procesos, uno por línea, por ejemplo:" }, - "injectIntoCriticalProcesses": { - "title": "Inyectar código en procesos críticos del sistema", - "description": "De forma predeterminada, Windhawk no inyecta código en los procesos críticos del sistema. Use esta opción con cuidado, ya que bloquear uno de estos procesos podría provocar un BSOD." + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/fr/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/fr/translation.json index aab8091..eaf33b4 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/fr/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/fr/translation.json @@ -109,6 +109,10 @@ "descriptionExclusion": "Une liste personnalisée de noms/chemins de processus supplémentaires que le mod va exclure du ciblage. Cete liste est ajoutée à la liste d'exclusion que l'auteur du mod a défini pour déterminer quel processus cibler. Pour chaque processus, le mod est chargé si le chemin du processus correspond à l'un de ceux inclus et ne correspond à aucune de ceux exclus.", "processListPlaceholder": "Noms/chemins des processus, un par ligne, par exemple :", "saveButton": "Sauvegarder" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -188,16 +192,19 @@ "processList": { "titleExclusion": "Liste d'exclusion de processus", "descriptionExclusion": "Une liste personnalisée de noms/chemins de processus dans lesquels Windhawk ne pourra rien injecter. Cela peut être utile dans les cas où Windhawk n'est pas compatible avec un programme spécifique. Notez qu'ajouter un processus à cette liste Note that adding a process to this list empêchera non seulement Windhawk de le personnaliser, mais empêchera également Windhawk d'intercepter les processus enfants créés par ce processus. Cela forcera Windhawk à charger les mods avec un léger retardement dans de tels cas.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "Liste d'exclusion de processus", "descriptionInclusion": "Une liste de noms/chemins de processus dans lesquels Windhawk vas pouvoir injecter du code, même s'ils sont dans la liste d'exclusion.", - "inclusionWithoutExclusionNotice": "La liste d'inclusion de processus n'a aucun effet avec une liste d'exclusion de processus vide. Si vous vouliez exclure tous les processus sauf ceux-ci, vous pouvez définir \"*\" dans la liste des processus exclus.", - "titleThreadAttachExempt": "Liste de processus pour la méthode d'injection \"threads légés\"", - "descriptionThreadAttachExempt": "Ignore une partie de l'initialisation des threads Windhawk (ignore l'initialisation TLS, les routs TLS et DllMain, etc.). Cela peut corriger la compatibilité avec certains programmes, mais peut rompre la compatibilité avec d'autres. <0>Plus d'information.", + "inclusionWithoutExclusionNotice": "La liste d'inclusion de processus n'a aucun effet avec une liste d'exclusion de processus vide.", + "inclusionWithoutTotalExclusionNotice": "Si vous vouliez exclure tous les processus sauf ceux-ci, vous pouvez définir \"*\" dans la liste des processus exclus.", "processListPlaceholder": "Noms/chemins des processus, un par ligne, par exemple :" }, - "injectIntoCriticalProcesses": { - "title": "Injecter du code dans des processus critiques du système", - "description": "Par défault, Windhawk n'injecte pas de code dans des processus critiques du système. Utilisez cette option avec soin, Use this option with care, car planter l'un de ces processus pourrait conduire à un blue screen (BSOD)." + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/it/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/it/translation.json index 616a87a..2e8eee8 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/it/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/it/translation.json @@ -109,6 +109,10 @@ "descriptionExclusion": "Un elenco personalizzato di nomi/percorsi di file eseguibili aggiuntivi che la mod escluderà dal targeting. L'elenco viene aggiunto all'elenco di esclusione definito dall'autore della mod per determinare quali processi includere nel targeting. Per ogni processo, la mod viene caricata se il percorso del file eseguibile corrisponde a una delle voci di inclusione e non corrisponde a nessuna voce di esclusione.", "processListPlaceholder": "Nomi/percorsi dei processi, uno per riga, ad esempio:", "saveButton": "Salva" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -188,16 +192,19 @@ "processList": { "titleExclusion": "Elenco di processi esclusi", "descriptionExclusion": "Un elenco di nomi/percorsi di processo in cui Windhawk non verrà eseguito. Può essere utile nei casi in cui Windhawk non è compatibile con un programma specifico. Tieni presente che l'aggiunta di un processo a questo elenco non solo impedirà a Windhawk di personalizzarlo, ma impedirà anche a Windhawk di intercettare i processi figlio creati da questo processo. Ciò farà sì che Windhawk carichi le mod con un leggero ritardo in questi casi.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "Elenco di inclusione del processo", "descriptionInclusion": "Un elenco di nomi/percorsi di processo in cui Windhawk verrà eseguito, anche se sono nell'elenco di esclusione.", - "inclusionWithoutExclusionNotice": "L'elenco di inclusione processi non ha effetto con un elenco di esclusione processi vuoto. Se intendevi escludere tutti i processi tranne questi, puoi impostare \"*\" nell'elenco di esclusione dei processi.", - "titleThreadAttachExempt": "Elenco dei processi per il metodo di iniezione \"thread leggeri\".", - "descriptionThreadAttachExempt": "Salta parte dell'inizializzazione dei thread Windhawk (salta l'inizializzazione TLS, le richiamate TLS e DllMain e altro). Ciò potrebbe correggere la compatibilità con alcuni programmi, ma potrebbe interrompere la compatibilità con altri. <0>Maggiori informazioni.", + "inclusionWithoutExclusionNotice": "L'elenco di inclusione processi non ha effetto con un elenco di esclusione processi vuoto.", + "inclusionWithoutTotalExclusionNotice": "Se intendevi escludere tutti i processi tranne questi, puoi impostare \"*\" nell'elenco di esclusione dei processi.", "processListPlaceholder": "Nomi/percorsi dei processi, uno per riga, ad esempio:" }, - "injectIntoCriticalProcesses": { - "title": "Inietta nei processi critici di sistema", - "description": "Per impostazione predefinita, Windhawk non inserisce codice nei processi critici di sistema. Usa questa opzione con cautela, poiché l'arresto anomalo di uno di questi processi potrebbe portare a un BSOD." + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/jp/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ja/translation.json similarity index 81% rename from src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/jp/translation.json rename to src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ja/translation.json index f22d7dd..11e2aea 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/jp/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ja/translation.json @@ -7,7 +7,11 @@ "tryAgain": "再試行", "updating": "アップデート中...", "installing": "インストール中...", - "compiling": "コンパイル中..." + "compiling": "コンパイル中...", + "cut": "切り取り", + "copy": "コピー", + "paste": "貼り付け", + "selectAll": "すべて選択" }, "appHeader": { "home": "ホーム", @@ -109,6 +113,10 @@ "descriptionExclusion": "modがターゲットから除外する追加の実行ファイル名/パスのカスタムリストです。このリストは、どのプロセスをターゲットにするかを決定するために、 modの作者が定義した除外リストに追加されます。各プロセスについて、実行可能ファイルパスがインクルードエントリの一つにマッチし、除外エントリにマッチしない場合に、modがロードされます。", "processListPlaceholder": "プロセス名/パス、1行に1つずつ、 例:", "saveButton": "保存" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -134,9 +142,9 @@ "explore": { "search": { "placeholder": "mod検索中...", - "popularAndTopRated": "人気で評価が高い", + "popularAndTopRated": "人気かつ高評価", "popular": "人気", - "topRated": "評価が高い", + "topRated": "高評価", "newest": "最新", "lastUpdated": "最終更新日", "alphabeticalOrder": "アルファベット順" @@ -145,14 +153,14 @@ "settings": { "language": { "title": "言語", - "description": "Windhawk表示言語を選択してください。", - "contribute": "<0>新しい翻訳に貢献する.", + "description": "Windhawkの表示言語を選択できます", + "contribute": "<0>新しい翻訳に貢献する", "credits": "lmncaj と <0>Keita Kunishiによって日本語翻訳されました。", "creditsLink": "https://github.com/Keitan924111" }, "updates": { "title": "アップデートを確認", - "description": "定期的に新バージョンのWindhawkとインストールされているmodを確認する。" + "description": "定期的に新しいバージョンのWindhawkとインストールされているmodを確認する。" }, "devMode": { "title": "開発者モード", @@ -164,9 +172,13 @@ "description": "Windhawkを終了するには、このオプションを無効にする必要があります。" }, "requireElevation": { - "title": "Windhawkの実行にはUACの昇格が必要です", + "title": "Windhawkの実行にUACの昇格を必要とする", "description": "シングルユーザーのコンピュータでのUACプロンプトの煩わしさを回避します。このオプションを有効にすると、Windhawkの実行にUACの昇格が必要になります。" }, + "dontAutoShowToolkit": { + "title": "ツールキットダイアログを自動表示しない", + "description": "デフォルトの状態では、Windhawkがシステムの不安定化やその他の理由でタスクバーにアクセスできないことを検出すると、自動的にツールキットダイアログを表示します。ツールキットダイアログでは、Windhawkの終了、セーフモードへの切り替え、その他の操作を行うことができます。ツールキットダイアログは、Ctrl+Win+Wのキーボードショートカットでも表示することができます。" + }, "modInitDialogDelay": { "title": "Mod初期化ダイアログの遅延", "description": "modの初期化時にプログレスダイアログを表示するまでの待ち時間(ミリ秒)を指定します。" @@ -188,16 +200,19 @@ "processList": { "titleExclusion": "プロセス除外リスト", "descriptionExclusion": "Windhawkがインジェクトしないプロセス名/パスのリストです。Windhawkが特定のプログラムと互換性がない場合に便利です。このリストにプロセスを追加すると、Windhawkがそれをカスタマイズするのを防ぐだけでなく、このプロセスが作成する子プロセスをWindhawkが傍受するのを防ぐことに注意してください。このため、このような場合、Windhawkはmodの読み込みに若干の遅れを生じます。", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "プロセス包含リスト", "descriptionInclusion": "除外リストにある場合でも、Windhawkがインジェクトするプロセス名/パスのリストです。", - "inclusionWithoutExclusionNotice": "プロセス包含リストは、プロセス除外リストが空である場合には、何の効果もありません。これらのプロセス以外を除外したい場合は、プロセス除外リストに \"*\"を設定します。", - "titleThreadAttachExempt": "\"light threads\"インジェクションメソッドのプロセスリストです", - "descriptionThreadAttachExempt": "Windhawkスレッドの初期化の一部をスキップします(TLSの初期化、TLSおよびDllMainコールバックなどをスキップします)。これにより、一部のプログラムとの互換性が修正されるかもしれませんが、他のプログラムとの互換性が壊れるかもしれません。 <0>さらなる情報.", + "inclusionWithoutExclusionNotice": "プロセス包含リストは、プロセス除外リストが空である場合には、何の効果もありません。", + "inclusionWithoutTotalExclusionNotice": "これらのプロセス以外を除外したい場合は、プロセス除外リストに \"*\"を設定します。", "processListPlaceholder": "プロセス名/パス、1行に1つずつ、例:" }, - "injectIntoCriticalProcesses": { - "title": "重要なシステムプロセスにインジェクトする", - "description": "デフォルトでは、Windhawkは重要なシステムプロセスにはコードをインジェクトしません。これらのプロセスの1つをクラッシュさせるとBSODにつながる可能性があるため、このオプションは注意して使用してください。" + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { @@ -246,6 +261,13 @@ "beginCodingButton": "コーディング開始", "cancelButton": "キャンセル" }, + "safeMode": { + "alert": "Windhawkがセーフモードで動作中です。すべてのコードインジェクション機能はオフになっています。", + "offButton": "セーフモードを終了", + "offConfirm": "設定を適用するため、Windhawkを再起動します。", + "offConfirmOk": "Windhawkを再起動", + "offConfirmCancel": "キャンセル" + }, "modPreview": { "actionUnavailable": "プレビューモードでは使用できません", "notCompiled": "プレビューする前にModをコンパイルする必要があります" diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ko/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ko/translation.json new file mode 100644 index 0000000..3a35f70 --- /dev/null +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ko/translation.json @@ -0,0 +1,289 @@ +{ + "general": { + "loading": "불러오는 중...", + "loadingFailed": "불러오는 데 실패했습니다, 인터넷 연결을 확인해주세요", + "loadingFailedTitle": "불러오기 실패", + "loadingFailedSubtitle": "인터넷 연결을 확인하고 다시 시도해주세요", + "tryAgain": "다시 시도", + "updating": "업데이트 중...", + "installing": "설치 중...", + "compiling": "컴파일 중...", + "cut": "잘라내기", + "copy": "복사", + "paste": "붙여넣기", + "selectAll": "모두 선택" + }, + "appHeader": { + "home": "홈", + "explore": "탐색", + "settings": "설정", + "about": "정보" + }, + "mod": { + "updateAvailable": "업데이트 사용 가능", + "installed": "설치됨", + "details": "세부 정보", + "remove": "삭제", + "removeConfirm": "이 모드를 삭제할까요?", + "removeConfirmOk": "모드 삭제", + "removeConfirmCancel": "취소", + "notCompiled": "모드 컴파일이 필요합니다", + "editedLocally": "모드가 로컬로 편집되었습니다", + "noDescription": "(설명 없음)", + "users_one": "사용자 {{formattedCount}}명", + "users_other": "사용자 {{formattedCount}}명" + }, + "modDetails": { + "header": { + "installedVersion": "설치된 버전", + "latestVersion": "최신 버전", + "loading": "불러오는 중...", + "loadingFailed": "불러오기 실패", + "modId": "모드 식별자", + "modVersion": "모드 버전", + "modAuthor": { + "title": "모드 작성자", + "homepage": "홈페이지", + "github": "GitHub", + "twitter": "Twitter" + }, + "processes": { + "all": "모든 프로세스", + "allBut": "{{list}} 외의 모든 프로세스", + "except": "{{excluded}} 외의 {{included}}", + "tooltip": { + "target": "대상 프로세스", + "targets": "대상 프로세스:", + "excluded": "제외 프로세스:" + } + }, + "update": "업데이트", + "updateNotNeeded": "설치되어 있는 버전이 최신 버전입니다", + "install": "설치", + "compile": "컴파일", + "disable": "비활성화", + "enable": "활성화", + "edit": "편집", + "fork": "끌어오기(포크)", + "remove": "삭제" + }, + "details": { + "title": "세부 정보", + "noData": "모드 세부 정보가 없습니다." + }, + "settings": { + "title": "설정", + "noData": "사용 가능한 모드 설정이 없습니다.", + "saveButton": "설정 저장", + "sampleValue": "샘플 값", + "arrayItemAdd": "새 항목 추가", + "arrayItemRemove": "항목 삭제" + }, + "code": { + "title": "소스 코드", + "noData": "모드 소스가 없습니다.", + "collapseExtra": "Readme와 설정 펼치기" + }, + "changelog": { + "title": "체인지로그", + "loadingFailed": "체인지로그를 불러오는 데 실패했습니다. GitHub에서 보려면 <0>여기를 누르세요." + }, + "advanced": { + "title": "고급", + "debugLogging": { + "title": "디버그 로깅", + "description": "모드의 문제 해결에 유용할 수 있습니다.", + "none": "없음", + "modLogs": "모드 로그", + "detailedLogs": "자세한 디버그 로그", + "showLogButton": "로그 출력 표시" + }, + "modSettings": { + "title": "모드 설정", + "description": "모드 설정을 손쉽게 내보내거나 공유합니다.", + "loadButton": "불러오기", + "loadFormattedButton": "형식 불러오기", + "saveButton": "저장", + "invalidData": "올바르지 않은 JSON 데이터" + }, + "customList": { + "titleInclusion": "사용자 지정 프로세스 포함 목록", + "descriptionInclusion": "모드가 대상으로 할 추가 실행 파일 이름 / 경로의 사용자 지정 목록입니다. 이 목록은 모드 작성자가 대상 프로세스를 결정하기 위해 정의한 포함 목록에 추가됩니다. 각 프로세스에 대해 실행 파일 경로가 포함 항목 중 하나와 일치하고 제외 항목과 일치하지 않으면 모드가 로드됩니다.", + "titleExclusion": "사용자 지정 프로세스 제외 목록", + "descriptionExclusion": "모드가 대상에서 제외할 추가 실행 파일 이름 / 경로의 사용자 지정 목록입니다. 이 목록은 모드 작성자가 대상 프로세스를 결정하기 위해 정의한 제외 목록에 추가됩니다. 각 프로세스에 대해 실행 파일 경로가 포함 항목 중 하나와 일치하고 제외 항목과 일치하지 않으면 모드가 로드됩니다.", + "processListPlaceholder": "한 줄당 프로세스 이름 / 경로 1개, 예:", + "saveButton": "저장" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." + } + }, + "changes": { + "title": "최근 버전 변경", + "noData": "설치되어 있는 버전이 최신 버전입니다.", + "splitView": "분할 보기", + "expandLines_one": "숨겨진 줄 1개 확장", + "expandLines_other": "숨겨진 줄 {{count}}개 확장" + } + }, + "home": { + "browse": "모드 탐색", + "installedMods": { + "title": "설치된 모드", + "noMods": "설치된 모드가 없습니다" + }, + "featuredMods": { + "title": "추천 모드", + "noMods": "아직 설치하지 않은 추천 모드가 없습니다", + "explore": "다른 모드 탐색" + } + }, + "explore": { + "search": { + "placeholder": "모드 검색...", + "popularAndTopRated": "인기와 평점", + "popular": "인기", + "topRated": "평점", + "newest": "최신", + "lastUpdated": "최근 업데이트", + "alphabeticalOrder": "알파벳순" + } + }, + "settings": { + "language": { + "title": "언어", + "description": "Windhawk의 기본 표시 언어를 선택하세요.", + "contribute": "<0>새 번역 기여하기.", + "credits": "한국어 번역 by <0>근육질푸키.", + "creditsLink": "mailto:muscular.puky@gmail.com" + }, + "updates": { + "title": "업데이트 확인", + "description": "Windhawk와 설치된 모드의 새로운 버전을 주기적으로 확인합니다." + }, + "devMode": { + "title": "개발자 모드", + "description": "모드 만들기와 수정하기와 같은 개발자들을 위한 기능을 표시합니다." + }, + "advancedSettings": "고급 설정", + "hideTrayIcon": { + "title": "트레이 아이콘 숨기기", + "description": "이 옵션을 비활성화하려면 Windhawk를 종료해야 합니다." + }, + "requireElevation": { + "title": "Windhawk를 실행하려면 UAC 권한 상승 필요", + "description": "Windhawk가 관리자 권한을 요구하지만 단일 사용자 컴퓨터에서는 매번 UAC 프롬프트가 표시돼 성가실 수 있습니다. 그래서 Windhawk는 이것을 우회합니다. 이 옵션을 활성화하면 Windhawk를 실행하는 데 UAC 권한 상승을 요구하게 됩니다." + }, + "dontAutoShowToolkit": { + "title": "툴킷 대화 상자 자동으로 표시 안 함", + "description": "기본값으로는 시스템 불안정 또는 다른 이유로 인해 작업 표시줄에 액세스할 수 없음을 감지했을 때 Windhawk가 자동으로 툴킷 대화 상자를 표시합니다. 툴킷 대화 상자는 Windhawk를 종료하고, 안전 모드로 전환하고, 기타 작업을 할 수 있도록 합니다. Ctrl+Win+W 키보드 단축키로 툴킷 대화 상자를 표시할 수도 있습니다." + }, + "modInitDialogDelay": { + "title": "모드 초기화 대화 상자 지연 시간", + "description": "모드 초기화를 위한 진행률 대화 상자를 표시하기 전에 기다릴 시간(밀리초)입니다." + }, + "moreAdvancedSettings": { + "title": "더 많은 설정", + "restartNotice": "이 설정을 적용하면 Windhawk가 다시 시작됩니다.", + "saveButton": "저장하고 Windhawk 다시 시작", + "cancelButton": "취소" + }, + "loggingVerbosity": { + "appLoggingTitle": "Windhawk 로깅 수준", + "engineLoggingTitle": "Windhawk 엔진 로깅 수준", + "description": "로그는 DebugView 같은 도구로 볼 수 있습니다.", + "none": "없음", + "error": "오류", + "verbose": "자세히" + }, + "processList": { + "titleExclusion": "프로세스 제외 목록", + "descriptionExclusion": "Windhawk가 인젝션하지 않는 프로세스 이름 / 경로 목록입니다. Windhawk가 특정 프로그램과 호환되지 않는 경우에 유용할 수 있습니다. 이 목록에 프로세스를 추가하면 Windhawk가 해당 프로세스를 사용자 지정하지 못할 뿐만 아니라 Windhawk가 이 프로세스가 생성하는 자식 프로세스를 가로채는 것도 방지됩니다. 이렇게 하면 Windhawk가 모드를 불러오는 데 약간의 지연이 생깁니다.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", + "titleInclusion": "프로세스 포함 목록", + "descriptionInclusion": "제외 목록에 있어도 Windhawk가 인젝션할 프로세스 이름 / 경로 목록입니다.", + "inclusionWithoutExclusionNotice": "프로세스 포함 목록은 빈 프로세스 제외 목록에 영향을 주지 않습니다.", + "inclusionWithoutTotalExclusionNotice": "여기 프로세스들 외의 모든 프로세스를 제외하려면 프로세스 제외 목록에서 \"*\"를 설정할 수 있습니다.", + "processListPlaceholder": "1줄당 프로세스 이름 / 경로 1개, 예:" + }, + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" + } + }, + "about": { + "title": "Windhawk v{{version}}", + "beta": "베타", + "subtitle": "Windows 프로그램용 사용자 정의 마켓플레이스", + "credit": "By <0>{{author}}", + "update": { + "title": "업데이트를 사용할 수 있음", + "subtitle": "최신 기능 및 버그 수정을 받으려면 Windhawk를 업데이트하세요.", + "button": "자세한 정보" + }, + "links": { + "title": "링크", + "homepage": "홈페이지", + "documentation": "문서" + }, + "builtWith": { + "title": "다음으로 개발됨", + "vscodium": "Microsoft의 VSCode 편집기의 커뮤니티 기반 배포", + "llvmMingw": "LLVM/Clang/LLD 기반 mingw-w64 툴체인", + "minHook": "Windows용 최소한의 API 후킹 라이브러리", + "others": "기타 툴과 라이브러리, 그리고 약간의 코드" + } + }, + "installModal": { + "title": "{{mod}} 설치", + "warningTitle": "신중히 진행하세요", + "warningDescription": "악성 모드는 컴퓨터를 손상시키거나 개인 정보를 침해할 수 있습니다. 신뢰할 수 있는 작성자의 모드만 설치하세요.", + "modAuthor": "모드 작성자", + "homepage": "홈페이지", + "github": "GitHub", + "twitter": "Twitter", + "verified": "인증됨", + "verifiedTooltip": "이 프로필이 모드 작성자의 것임을 확인했지만 <0>인증됨은 <0>신뢰할 수 있음과 다릅니다. 모드 작성자를 신뢰하는지 확인하거나 설치하기 전에 소스 코드를 신중히 검사하세요.", + "acceptButton": "위험을 감수하고 설치", + "cancelButton": "취소" + }, + "createNewModButton": { + "title": "새 모드 만들기" + }, + "devModeAction": { + "message": "모드를 만들고 수정하려면 약간의 Windows용 C / C++ 개발 지식이 필요합니다. 무슨 뜻인지 모르겠다면 이러한 옵션들은 맞지 않을지도 모릅니다.", + "hideOptionsCheckbox": "모든 개발 관련 옵션 숨기기", + "hideOptionsButton": "옵션 숨기기", + "beginCodingButton": "코딩 시작", + "cancelButton": "취소" + }, + "safeMode": { + "alert": "Windhawk가 안전 모드로 실행 중입니다. 모든 코드 인젝션 기능이 꺼졌습니다.", + "offButton": "안전 모드 끄기", + "offConfirm": "이 설정을 적용하려면 Windhawk가 다시 시작됩니다.", + "offConfirmOk": "Windhawk 다시 시작", + "offConfirmCancel": "취소" + }, + "modPreview": { + "actionUnavailable": "미리 보기 모드에서는 사용할 수 없는 작업입니다.", + "notCompiled": "모드를 미리 보려면 컴파일해야 합니다." + }, + "sidebar": { + "modId": "모드 식별자", + "enableMod": "모드 활성화", + "enableLogging": "로깅 활성화", + "notCompiled": "모드를 컴파일해야 합니다", + "compile": "모드 컴파일", + "compilationFailed": "컴파일 실패", + "preview": "모드 미리 보기", + "showLogOutput": "로그 출력 표시", + "exit": "편집 모드 나가기", + "exitConfirmation": "마지막 컴파일 성공 후의 변경이 사라집니다", + "exitButtonOk": "나가기", + "exitButtonCancel": "남아 있기" + } +} \ No newline at end of file diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pl/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pl/translation.json new file mode 100644 index 0000000..8596410 --- /dev/null +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pl/translation.json @@ -0,0 +1,289 @@ +{ + "general": { + "loading": "Ładowanie...", + "loadingFailed": "Ładowanie zakończyło się niepowodzeniem, sprawdź swoje połączenie internetowe", + "loadingFailedTitle": "Ładowanie zakończyło się niepowodzeniem", + "loadingFailedSubtitle": "Sprawdź swoje połączenie internetowe i spróbuj ponownie", + "tryAgain": "Spróbuj ponownie", + "updating": "Aktualizowanie...", + "installing": "Instalowanie...", + "compiling": "Kompilowanie...", + "cut": "Wytnij", + "copy": "Kopiuj", + "paste": "Wklej", + "selectAll": "Zaznacz Wszystko" + }, + "appHeader": { + "home": "Strona Główna", + "explore": "Eksploruj", + "settings": "Ustawienia", + "about": "O aplikacji" + }, + "mod": { + "updateAvailable": "Aktualizacja dostępna", + "installed": "Zainstalowane", + "details": "Informacje", + "remove": "Usuń", + "removeConfirm": "Czy jesteś pewny że chcesz usunąć tego moda?", + "removeConfirmOk": "Usuń moda", + "removeConfirmCancel": "Anuluj", + "notCompiled": "Mod musi być skompilowany", + "editedLocally": "Mod był edytowany lokalnie", + "noDescription": "(brak opisu)", + "users_one": "{{formattedCount}} użytkownik", + "users_other": "{{formattedCount}} użytkowników" + }, + "modDetails": { + "header": { + "installedVersion": "Zainstalowana wersja", + "latestVersion": "Najnowsza wersja", + "loading": "Ładowanie...", + "loadingFailed": "Ładowanie zakończone niepowodzeniem", + "modId": "Identyfikacja moda", + "modVersion": "Wersja moda", + "modAuthor": { + "title": "Autor moda", + "homepage": "Strona główna", + "github": "GitHub", + "twitter": "Twitter" + }, + "processes": { + "all": "Wszystkie procesy", + "allBut": "Wszystkie ale {{list}}", + "except": "{{included}} oprócz {{excluded}}", + "tooltip": { + "target": "Proces docelowy", + "targets": "Procesy docelowe:", + "excluded": "Wyjątki:" + } + }, + "update": "Zaktualizuj", + "updateNotNeeded": "Zainstalowana wersja jest identyczna z najnowszą wersją", + "install": "ZaInstaluj", + "compile": "Kompiluj", + "disable": "Deaktywuj", + "enable": "Aktywuj", + "edit": "Edytuj", + "fork": "Forkuj", + "remove": "Usuń" + }, + "details": { + "title": "Informacje", + "noData": "Informacje o modzie są niedostępne." + }, + "settings": { + "title": "Ustawienia", + "noData": "Brak dostępnych ustawień moda.", + "saveButton": "Zapisz Ustawienia", + "sampleValue": "Przykładowa Wartość", + "arrayItemAdd": "Dodaj element", + "arrayItemRemove": "Usuń element" + }, + "code": { + "title": "Kod źródłowy", + "noData": "Kod źródłowy moda jest niedostępny.", + "collapseExtra": "Zwiń ustawienia i Readme" + }, + "changelog": { + "title": "Dziennik zmian", + "loadingFailed": "Ładowanie dziennika zmian zakończone niepowodzeniem. <0>Kliknij tutaj aby zobaczyć na GitHubie." + }, + "advanced": { + "title": "Zaawansowane", + "debugLogging": { + "title": "Logi debugowania", + "description": "Przydatne do rozwiązywania problemów z modami.", + "none": "Nic", + "modLogs": "Logi moda", + "detailedLogs": "Szczegółowe logi debugowania", + "showLogButton": "Pokaż wyjście logów" + }, + "modSettings": { + "title": "Ustawienia modu", + "description": "Łatwo wyeksportuj i udostępnij ustawienia moda", + "loadButton": "Wczytaj", + "loadFormattedButton": "Wczytaj sformatowane", + "saveButton": "Zapisz", + "invalidData": "Niepoprawne informacje JSON" + }, + "customList": { + "titleInclusion": "Niestandardowa lista uwzględniania procesów", + "descriptionInclusion": "Niestandardowa lista dodatkowych nazw/ścieżek plików wykonywalnych, na które mod będzie ukierunkowany. Lista ta jest dodawana do listy dołączania zdefiniowanej przez autora moda w celu określenia, które procesy mają być celem. Dla każdego procesu mod jest ładowany, jeśli ścieżka pliku wykonywalnego pasuje do jednego z wpisów include i nie pasuje do żadnego wpisu exclude.", + "titleExclusion": "Niestandardowa lista wykluczonych procesów", + "descriptionExclusion": "Niestandardowa lista dodatkowych nazw/ścieżek plików wykonywalnych, które mod wykluczy z namierzania. Lista ta jest dodawana do listy wykluczeń zdefiniowanej przez autora moda w celu określenia, które procesy mają być docelowe. Dla każdego procesu mod jest ładowany, jeśli ścieżka pliku wykonywalnego pasuje do jednego z wpisów include i nie pasuje do żadnego wpisu exclude.", + "processListPlaceholder": "Nazwy/ścieżki procesów, po jednej w wierszu, na przykład:", + "saveButton": "Zapisz" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." + } + }, + "changes": { + "title": "Zmiany w Najnowszej Wersji", + "noData": "Zainstalowana wersja jest identyczna z najnowszą wersją", + "splitView": "Widok podzielony", + "expandLines_one": "Rozwiń jedną ukrytą linię", + "expandLines_other": "Rozwiń {{count}} ukrytych lin" + } + }, + "home": { + "browse": "Przeglądaj w poszukiwaniu modów", + "installedMods": { + "title": "Zainstalowane mody", + "noMods": "Nie zainstalowano żadnych modów" + }, + "featuredMods": { + "title": "Wyróżnione mody", + "noMods": "Nie ma żadnych polecanych modów, które nie zostały jeszcze zainstalowane", + "explore": "Eksploruj inne mody" + } + }, + "explore": { + "search": { + "placeholder": "Szukaj modów..", + "popularAndTopRated": "Popularne i najbardziej ocenianie", + "popular": "Popularne", + "topRated": "Najbardziej oceniane", + "newest": "Najnowsze", + "lastUpdated": "Ostatnio aktualizowane", + "alphabeticalOrder": "Kolejność alfabetyczna" + } + }, + "settings": { + "language": { + "title": "Język", + "description": "Wybierz preferowany język wyświetlania dla aplikacji Windhawk.", + "contribute": "<0>Współtwórz nowe tłumaczenie.", + "credits": "Polskie tłumaczenie stworzył <0>Inkatail.", + "creditsLink": "https://github.com/Inkatail" + }, + "updates": { + "title": "Sprawdź aktualizacje", + "description": "Okresowo sprawdzaj dostępność nowych wersji Windhawk i zainstalowanych modów." + }, + "devMode": { + "title": "Tryb dewelopera", + "description": "Pokaż akcje dla deweloperów, takie jak tworzenie i modyfikowanie modów." + }, + "advancedSettings": "Ustawienia zaawansowane", + "hideTrayIcon": { + "title": "Ukryj ikonę zasobnika", + "description": "Będziesz musiał wyłączyć tę opcję, aby wyjść z Windhawk." + }, + "requireElevation": { + "title": "Wymagaj uprawnień UAC do uruchomienia Windhawk", + "description": "Windhawk wymaga uprawnień administratora, ale dla komputera z jednym użytkownikiem wyświetlanie komunikatu UAC za każdym razem może być irytujące, więc Windhawk go omija. Włącz tę opcję, aby wymagać uprawnień UAC do uruchamiania Windhawk." + }, + "dontAutoShowToolkit": { + "title": "Nie wyświetlaj automatycznie okna dialogowego narzędzi", + "description": "Domyślnie Windhawk automatycznie wyświetla okno dialogowe narzędzi, gdy wykryje, że pasek zadań nie jest dostępny z powodu niestabilności systemu lub z innego powodu. Okno dialogowe narzędzi pozwala wyjść z Windhawk, przełączyć się do trybu bezpiecznego i wykonać inne operacje. Okno dialogowe narzędzi można również wyświetlić za pomocą skrótu klawiaturowego Ctrl+Win+W." + }, + "modInitDialogDelay": { + "title": "Opóźnienie okna dialogowego inicjalizacji modów", + "description": "Ilość milisekund do odczekania przed wyświetleniem okna dialogowego postępu inicjalizacji modów." + }, + "moreAdvancedSettings": { + "title": "Więcej ustawień zaawansowanych", + "restartNotice": "Windhawk musi zostać uruchomiony ponownie, aby zastosować ustawienia.", + "saveButton": "Zapisz i uruchom ponownie Windhawk", + "cancelButton": "Anuluj" + }, + "loggingVerbosity": { + "appLoggingTitle": "Szczegółowe logi Windhawk", + "engineLoggingTitle": "Szczegółowe logi silnika Windhawk", + "description": "Logi mogą zostać wyswietlone używając narzędzia DebugView", + "none": "Nic", + "error": "Błąd", + "verbose": "Szczegóły" + }, + "processList": { + "titleExclusion": "Lista wykluczonych procesów", + "descriptionExclusion": "Lista nazw procesów/ścieżek, do których Windhawk nie będzie wstrzykiwał. Może być przydatna w przypadkach, gdy Windhawk nie jest kompatybilny z określonym programem. Należy pamiętać, że dodanie procesu do tej listy nie tylko uniemożliwi Windhawk dostosowanie go, ale także uniemożliwi Windhawk przechwytywanie procesów potomnych tworzonych przez ten proces. Spowoduje to, że w takich przypadkach Windhawk będzie ładował mody z niewielkim opóźnieniem.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", + "titleInclusion": "Lista uwzględnionych procesów", + "descriptionInclusion": "Lista nazw/ścieżek procesów, do których Windhawk będzie wstrzykiwał dane, nawet jeśli znajdują się one na liście wykluczeń.", + "inclusionWithoutExclusionNotice": "Lista uwzględnionych procesów nie ma wpływu na pustą listę wykluczania procesów.", + "inclusionWithoutTotalExclusionNotice": "Jeśli chcesz wykluczyć wszystkie procesy oprócz tych, możesz ustawić \"*\" na liście wykluczeń procesów.", + "processListPlaceholder": "Nazwy/ścieżki procesów, po jednej w wierszu, na przykład:" + }, + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" + } + }, + "about": { + "title": "Windhawk v{{version}}", + "beta": "beta", + "subtitle": "Rynek personalizacji dla programów Windows", + "credit": "Stworzył <0>{{author}}", + "update": { + "title": "Aktualizacja jest dostępna", + "subtitle": "Rozważ aktualizację Windhawk, aby uzyskać najnowsze funkcje i poprawki błędów", + "button": "Więcej informacji" + }, + "links": { + "title": "Linki", + "homepage": "Strona główna", + "documentation": "Dokumentacja" + }, + "builtWith": { + "title": "Zrobione używając", + "vscodium": "Społecznościowa dystrybucja edytora VSCode firmy Microsoft", + "llvmMingw": "Oparty na toolchainie LLVM/Clang/LLD dla mingw-w64", + "minHook": "Minimalistyczna biblioteka hakowania API dla Windowsas", + "others": "Inne narzędzia i biblioteki oraz trochę kodu" + } + }, + "installModal": { + "title": "Zainstaluj {{mod}}", + "warningTitle": "Postępuj ostrożnie", + "warningDescription": "Złośliwe mody mogą uszkodzić komputer lub naruszyć prywatność użytkownika. Instaluj mody tylko od zaufanych autorów.", + "modAuthor": "Autor moda", + "homepage": "Strona główna", + "github": "GitHub", + "twitter": "Twitter", + "verified": "zweryfikowany", + "verifiedTooltip": "Zweryfikowaliśmy, że ten profil należy do autora moda, ale należy pamiętać, że <0>zweryfikowany to nie to samo, co <0>zaufany. Upewnij się, że ufasz autorowi moda lub dokładnie sprawdź kod źródłowy przed instalacją.", + "acceptButton": "Zaakceptuj ryzyko i zainstaluj", + "cancelButton": "Anuluj" + }, + "createNewModButton": { + "title": "Utwórz nowego moda" + }, + "devModeAction": { + "message": "Tworzenie i modyfikowanie modów wymaga pewnej wiedzy na temat programowania w języku C/C++. Jeśli nie jesteś pewien, co to oznacza, być może te opcje nie są dla Ciebie.", + "hideOptionsCheckbox": "Ukryj wszystkie opcje związane z programowaniem", + "hideOptionsButton": "Ukryj opcje", + "beginCodingButton": "Rozpocznij kodowanie", + "cancelButton": "Anuluj" + }, + "safeMode": { + "alert": "Windhawk działa w trybie bezpiecznym, wszystkie funkcje wstrzykiwania kodu są wyłączone.", + "offButton": "Wyłącz tryb bezpieczny", + "offConfirm": "Windhawk zostanie uruchomiony ponownie, aby zastosować ustawienia.", + "offConfirmOk": "Restartuj Windhawk", + "offConfirmCancel": "Anuluj" + }, + "modPreview": { + "actionUnavailable": "Opcja nie jest dostępna w trybie podglądowym", + "notCompiled": "Mod musi zostać skompilowany przed podglądem" + }, + "sidebar": { + "modId": "Identyfikator moda", + "enableMod": "Włącz moda", + "enableLogging": "Włącz dziennik zdarzeń", + "notCompiled": "Mod musi być skompilowany", + "compile": "Kompiluj moda", + "compilationFailed": "Kompilacja zakończyła się sukcesem", + "preview": "Podgląd modu", + "showLogOutput": "Pokaż dane dziennika", + "exit": "Wyjdź z trybu edycji", + "exitConfirmation": "Zmiany wprowadzone od ostatniej udanej kompilacji zostaną utracone", + "exitButtonOk": "Wyjdź", + "exitButtonCancel": "Pozostań" + } +} \ No newline at end of file diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pt-BR/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pt-BR/translation.json new file mode 100644 index 0000000..2608dbf --- /dev/null +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/pt-BR/translation.json @@ -0,0 +1,289 @@ +{ + "general": { + "loading": "Carregando...", + "loadingFailed": "Falha ao carregar, verifique sua conexão com a internet", + "loadingFailedTitle": "Falha no carregamento", + "loadingFailedSubtitle": "Por favor verifique sua conexão com a internet e tente novamente", + "tryAgain": "Tente novamente", + "updating": "Atualizando...", + "installing": "Instalando...", + "compiling": "Compilando...", + "cut": "Cortar", + "copy": "Copiar", + "paste": "Colar", + "selectAll": "Selecionar tudo" + }, + "appHeader": { + "home": "HMenu", + "explore": "Explorar", + "settings": "Configurações", + "about": "Sobre" + }, + "mod": { + "updateAvailable": "Atualização disponivel", + "installed": "Instalado", + "details": "Detalhes", + "remove": "Remover", + "removeConfirm": "Tem certeza de que deseja remover este Mod?", + "removeConfirmOk": "Remover mod", + "removeConfirmCancel": "Cancelar", + "notCompiled": "Mod precisa ser compilado", + "editedLocally": "Mod foi editado localmente", + "noDescription": "(sem descrição)", + "users_one": "{{formattedCount}} usuário", + "users_other": "{{formattedCount}} usuários" + }, + "modDetails": { + "header": { + "installedVersion": "Versão instalada", + "latestVersion": "Última versão", + "loading": "carregando...", + "loadingFailed": "falha ao carregar", + "modId": "identificador de Mod", + "modVersion": "Versão do Mod", + "modAuthor": { + "title": "Autor do Mod", + "homepage": "Homepage", + "github": "GitHub", + "twitter": "Twitter" + }, + "processes": { + "all": "Todos os Processos", + "allBut": "Todos exceto {{list}}", + "except": "{{included}} exeto {{excluded}}", + "tooltip": { + "target": "Processo alvo", + "targets": "Processos alvo:", + "excluded": "Excluído:" + } + }, + "update": "Atualizar", + "updateNotNeeded": "A versão instalada é idêntica à versão mais recente", + "install": "Instalar", + "compile": "Compilar", + "disable": "Disabilitar", + "enable": "Habilitar", + "edit": "Editar", + "fork": "Parar", + "remove": "Remover" + }, + "details": { + "title": "Detalhes", + "noData": "Faltam detalhes do Mod." + }, + "settings": { + "title": "Consfigurações", + "noData": "Nenhuma configuração de Mod está disponível.", + "saveButton": "Salvar configurações", + "sampleValue": "Valor da amostra", + "arrayItemAdd": "Adicionar novo item", + "arrayItemRemove": "Remover item" + }, + "code": { + "title": "Códgo fonte", + "noData": "A fonte do mod está ausente.", + "collapseExtra": "Recolher Leia-me e configurações" + }, + "changelog": { + "title": "Log de alterações", + "loadingFailed": "Falha ao carregar o Log de Alterações. <0>Clique aqui para visualizá-lo no GitHub." + }, + "advanced": { + "title": "Avançado", + "debugLogging": { + "title": "Registro de depuração", + "description": "Pode ser útil para solucionar problemas com o Mod.", + "none": "Nada", + "modLogs": "Registros de modificação", + "detailedLogs": "Logs de depuração detalhados", + "showLogButton": "Mostrar saída de registro" + }, + "modSettings": { + "title": "Mod settings", + "description": "Exporte ou compartilhe facilmente suas configurações de Mod.", + "loadButton": "Carregar", + "loadFormattedButton": "Carregar formatado", + "saveButton": "Salvar", + "invalidData": "Dados JSON inválidos" + }, + "customList": { + "titleInclusion": "Lista de inclusão de processo personalizado", + "descriptionInclusion": "Uma lista personalizada de nomes/caminhos de arquivos executáveis ​​adicionais que o mod terá como alvo. A lista é adicionada à lista de inclusão que o autor do Mod definiu para determinar quais processos devem ser direcionados. Para cada processo, o Mod é carregado se o caminho do arquivo executável corresponder a uma das entradas de inclusão e não corresponder a nenhuma entrada de exclusão.", + "titleExclusion": "Lista de exclusão de processo personalizada", + "descriptionExclusion": "Uma lista personalizada de nomes/caminhos de arquivos executáveis ​​adicionais que o mod excluirá do direcionamento. A lista é adicionada à lista de exclusão que o autor do Mod definiu para determinar quais processos visar. Para cada processo, o Mod é carregado se o caminho do arquivo executável corresponder a uma das entradas de inclusão e não corresponder a nenhuma entrada de exclusão.", + "processListPlaceholder": "Nomes/caminhos de processo, um por linha, por exemplo:", + "saveButton": "Salvar" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." + } + }, + "changes": { + "title": "Últimas alterações da versão", + "noData": "A versão instalada é idêntica à versão mais recente.", + "splitView": "Vista dividida", + "expandLines_one": "Expandir uma linha oculta", + "expandLines_other": "Expandir {{count}} linhas ocultas" + } + }, + "home": { + "browse": "Procurar Mods", + "installedMods": { + "title": "Mods Instalados", + "noMods": "No mods estão instalados" + }, + "featuredMods": { + "title": "Featured Modss", + "noMods": "Não há Mods em destaque que ainda não foram instalados", + "explore": "Explorar outros Mods" + } + }, + "explore": { + "search": { + "placeholder": "Procurar Mods...", + "popularAndTopRated": "Popular e melhor avaliado", + "popular": "Popular", + "topRated": "Melhor avaliado", + "newest": "Recente", + "lastUpdated": "Recem atualizados", + "alphabeticalOrder": "Ordem alfabetica" + } + }, + "settings": { + "language": { + "title": "Ingueagem", + "description": "Selecione seu idioma de exibição preferido para Windhawk.", + "contribute": "<0>Contribua com uma nova tradução.", + "credits": "Tradução para o Portugues Brasileiro por: <0>Cauaã Vinicius Moraes.", + "creditsLink": "mailto:cauaaviniciusmoraes@aol.com" + }, + "updates": { + "title": "Checar por atualização", + "description": "Verifique periodicamente se há novas versões do Windhawk e dos mods instalados." + }, + "devMode": { + "title": "Modo desenvolvedor", + "description": "Mostrar ações para desenvolvedores, como criar e modificar mods." + }, + "advancedSettings": "Configurações avançadas", + "hideTrayIcon": { + "title": "Ocultar ícone da bandeja", + "description": "Você terá que desabilitar esta opção para sair do Windhawk." + }, + "requireElevation": { + "title": "Exigir elevação UAC para executar Windhawk", + "description": "O Windhawk requer direitos de administrador, mas para um computador de usuário único, obter o prompt do UAC toda vez pode ser irritante, então o Windhawk o ignora. Ative esta opção para exigir a elevação do UAC para executar o Windhawk." + }, + "dontAutoShowToolkit": { + "title": "Não mostrar automaticamente a caixa de diálogo do kit de ferramentas", + "description": "Por padrão, o Windhawk mostra automaticamente a caixa de diálogo do kit de ferramentas quando detecta que a barra de tarefas não está acessível, devido à instabilidade do sistema ou por outro motivo. A caixa de diálogo do kit de ferramentas permite sair do Windhawk, alternar para o modo de segurança e fazer outras operações. A caixa de diálogo do kit de ferramentas também pode ser exibida com o atalho de teclado Ctrl+Win+W." + }, + "modInitDialogDelay": { + "title": "Atraso da caixa de diálogo de inicialização do mod", + "description": "Quantidade de milissegundos para esperar antes de mostrar a caixa de diálogo de progresso para inicialização do mod." + }, + "moreAdvancedSettings": { + "title": "Mais Configurações avançadas", + "restartNotice": "Windhawk será reiniciado para aplicar as configurações.", + "saveButton": "Salve e reinicie o Windhawk", + "cancelButton": "Cancelar" + }, + "loggingVerbosity": { + "appLoggingTitle": "Verbosidade de registro Windhawk", + "engineLoggingTitle": "Verbosidade de registro do mecanismo Windhawk", + "description": "Os logs podem ser visualizados com uma ferramenta como DebugView.", + "none": "Nada", + "error": "Erro", + "verbose": "Verbosidade" + }, + "processList": { + "titleExclusion": "Lista de exclusão de processo", + "descriptionExclusion": "Uma lista de nomes/caminhos de processos nos quais o Windhawk não injetará. Pode ser útil para casos em que o Windhawk não é compatível com um programa específico. Observe que adicionar um processo a esta lista não apenas impedirá Windhawk de personalizá-lo, mas também impedirá Windhawk de interceptar processos filho criados por esse processo. Isso fará com que o Windhawk carregue os mods com um pequeno atraso nesses casos.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", + "titleInclusion": "Lista de inclusão de processos", + "descriptionInclusion": "Uma lista de nomes/caminhos de processos nos quais o Windhawk injetará, mesmo que estejam na lista de exclusão.", + "inclusionWithoutExclusionNotice": "A lista de inclusão de processo não tem efeito com uma lista de exclusão de processo vazia.", + "inclusionWithoutTotalExclusionNotice": "Se você pretende excluir todos os processos exceto estes, você pode definir \"*\" na lista de exclusão de processos.", + "processListPlaceholder": "Nomes/caminhos de processo, um por linha, por exemplo:" + }, + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" + } + }, + "about": { + "title": "Windhawk v{{version}}", + "beta": "beta", + "subtitle": "O mercado de personalização para programas do Windows", + "credit": "Por: <0>{{author}}", + "update": { + "title": "Uma atualização está disponível", + "subtitle": "Considere atualizar o Windhawk para obter os recursos e correções de bugs mais recentes", + "button": "mais detalhes" + }, + "links": { + "title": "Links", + "homepage": "Homepage", + "documentation": "Documentação" + }, + "builtWith": { + "title": "Construído com", + "vscodium": "Adistribuição voltada para a comunidade do editor VSCode da Microsoft", + "llvmMingw": "Uma cadeia de ferramentas mingw-w64 baseada em LLVM/Clang/LLD", + "minHook": "A biblioteca de conexão de API minimalista para Windows", + "others": "Outras ferramentas e bibliotecas e um pouco de código" + } + }, + "installModal": { + "title": "Instalar {{mod}}", + "warningTitle": "Prossiga com cuidado", + "warningDescription": "Mods maliciosos podem danificar seu computador ou violar sua privacidade. Instale mods apenas de autores em quem você confia.", + "modAuthor": "Autor do mod", + "homepage": "Homepage", + "github": "GitHub", + "twitter": "Twitter", + "verified": "Verificado", + "verifiedTooltip": "Verificamos que este perfil pertence ao autor do mod, mas observe que <0>verified não é o mesmo que <0>trusted. Certifique-se de confiar no autor do mod ou inspecione cuidadosamente o código-fonte antes de instalar.", + "acceptButton": "Aceitar os riscos e instalar", + "cancelButton": "Cancelar" + }, + "createNewModButton": { + "title": "Criar um novo Mod" + }, + "devModeAction": { + "message": "CCriar e modificar mods requer algum conhecimento de desenvolvimento C/C++ para Windows. Se você não tem certeza do que isso significa, talvez essas opções não sejam para você.", + "hideOptionsCheckbox": "Ocultar todas as opções relacionadas ao desenvolvimento", + "hideOptionsButton": "Esconder opções", + "beginCodingButton": "Começar a codificar", + "cancelButton": "Cancelar" + }, + "safeMode": { + "alert": "O Windhawk está sendo executado no modo de segurança, todas as funcionalidades de injeção de código estão desativadas.", + "offButton": "Desligar o modo de segurança", + "offConfirm": "Windhawk será redefinido para aplicar as configurações.", + "offConfirmOk": "Reiniciar Windhawk", + "offConfirmCancel": "Cancelar" + }, + "modPreview": { + "actionUnavailable": "A ação não está disponível no modo de visualização", + "notCompiled": "Mod precisa ser compilado antes de poder ser visualizado" + }, + "sidebar": { + "modId": "Identificador de Mod", + "enableMod": "Habilitar Mod", + "enableLogging": "Habilitar carregamento", + "notCompiled": "Mod precisa ser compilado", + "compile": "Compilar Mod", + "compilationFailed": "Falha na compilação", + "preview": "Vizualizar Mod", + "showLogOutput": "Mostrar saída de registro", + "exit": "Sair do modo de edição", + "exitConfirmation": "As alterações desde a última compilação bem-sucedida serão perdidas", + "exitButtonOk": "Sair", + "exitButtonCancel": "Cancelar" + } +} \ No newline at end of file diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ro/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ro/translation.json new file mode 100644 index 0000000..2bca69a --- /dev/null +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ro/translation.json @@ -0,0 +1,289 @@ +{ + "general": { + "loading": "Se încarcă...", + "loadingFailed": "Nu s-a putut încărca, verifică-ți conexiunea la internet", + "loadingFailedTitle": "Nu s-a putut încărca", + "loadingFailedSubtitle": "Verifică-ți conexiunea la rețea și încearcă din nou", + "tryAgain": "Încearcă din nou", + "updating": "Se actualizează...", + "installing": "Se instalează...", + "compiling": "Se compilează...", + "cut": "Decupare", + "copy": "Copiere", + "paste": "Lipire", + "selectAll": "Selectează tot" + }, + "appHeader": { + "home": "Acasă", + "explore": "Explorează", + "settings": "Setări", + "about": "Despre" + }, + "mod": { + "updateAvailable": "Actualizare disponibilă", + "installed": "Instalat", + "details": "Detalii", + "remove": "Elimină", + "removeConfirm": "Sigur elimini acest mod?", + "removeConfirmOk": "Elimină modul", + "removeConfirmCancel": "Anulează", + "notCompiled": "Modul trebuie să fie compilat", + "editedLocally": "Modul a fost editat local", + "noDescription": "(fără descriere)", + "users_one": "{{formattedCount}} utilizator", + "users_other": "{{formattedCount}} (de) utilizatori" + }, + "modDetails": { + "header": { + "installedVersion": "Versiune instalată", + "latestVersion": "Cea mai recentă versiune", + "loading": "Se încarcă...", + "loadingFailed": "Nu s-a putut încărca", + "modId": "Identificator mod", + "modVersion": "Versiune mod", + "modAuthor": { + "title": "Autorul modului", + "homepage": "Pagina de pornire", + "github": "GitHub", + "twitter": "Twitter" + }, + "processes": { + "all": "Toate procesele", + "allBut": "Toate, cu excepția {{list}}", + "except": "{{included}} exceptând {{excluded}}", + "tooltip": { + "target": "Proces țintă", + "targets": "Procese țintă:", + "excluded": "Excluse:" + } + }, + "update": "Actualizare", + "updateNotNeeded": "Versiunea instalată este identică cu cea recentă", + "install": "Instalează", + "compile": "Compilează", + "disable": "Dezactivează", + "enable": "Activează", + "edit": "Editează", + "fork": "Remixează", + "remove": "Elimină" + }, + "details": { + "title": "Detalii", + "noData": "Detaliile modului lipsesc." + }, + "settings": { + "title": "Setări", + "noData": "Nu sunt disponibile setări pentru acest mod.", + "saveButton": "Salvează setările", + "sampleValue": "Valoarea eșantionului", + "arrayItemAdd": "Adaugă un nou element", + "arrayItemRemove": "Elimină element" + }, + "code": { + "title": "Cod sursă", + "noData": "Codul sursă lipsește.", + "collapseExtra": "Restrânge Readme și Setări" + }, + "changelog": { + "title": "Jurnal de modificări", + "loadingFailed": "Nu s-a putut încărca jurnalul de modificări. <0>Clic aici pentru a-l vedea pe GitHub." + }, + "advanced": { + "title": "Avansat", + "debugLogging": { + "title": "Jurnal de depanare", + "description": "Poate fi folositor pentru a depana modul.", + "none": "Nimic", + "modLogs": "Jurnalul modului", + "detailedLogs": "Jurnal detaliat de depanare", + "showLogButton": "Arată ieșirea în jurnal" + }, + "modSettings": { + "title": "Setări mod", + "description": "Exportă sau distribuie cu ușurință setările tale ale acestui mod", + "loadButton": "Încarcă", + "loadFormattedButton": "Încarcă formatat", + "saveButton": "Salvează", + "invalidData": "Date JSON invalide" + }, + "customList": { + "titleInclusion": "Listă personalizată de includere a proceselor", + "descriptionInclusion": "A custom list of additional executable file names/paths that the mod will target. The list is added to the inclusion list that the mod author defined to determine which processes to target. For each process, the mod is loaded if the executable file path matches one of the include entries and doesn't match any exclude entry.", + "titleExclusion": "Listă personalizată de excludere a proceselor", + "descriptionExclusion": "A custom list of additional executable file names/paths that the mod will excluded from targeting. The list is added to the exclusion list that the mod author defined to determine which processes to target. For each process, the mod is loaded if the executable file path matches one of the include entries and doesn't match any exclude entry.", + "processListPlaceholder": "Numele/calea procesului, câte unul/una pe o singură linie, de exemplu:", + "saveButton": "Salvează" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." + } + }, + "changes": { + "title": "Modificări în cea mai recentă versiune", + "noData": "Versiunea instalată este identică cu cea mai recentă.", + "splitView": "Vizualizare divizată", + "expandLines_one": "Extinde o linie ascunsă", + "expandLines_other": "Extinde {{count}} linii ascunse" + } + }, + "home": { + "browse": "Răsfoiește moduri", + "installedMods": { + "title": "Moduri instalate", + "noMods": "Niciun mod instalat" + }, + "featuredMods": { + "title": "Moduri promovate", + "noMods": "Nu sunt moduri promovate care n-au fost încă instalate", + "explore": "Explorează alte moduri" + } + }, + "explore": { + "search": { + "placeholder": "Caută moduri...", + "popularAndTopRated": "Populare și top evaluate", + "popular": "Populare", + "topRated": "Top evaluate", + "newest": "Cele mai noi", + "lastUpdated": "Actualizate recent", + "alphabeticalOrder": "Ordine alfabetică" + } + }, + "settings": { + "language": { + "title": "Limbă", + "description": "Selectează limba ta preferată de afișare pentru Windhawk.", + "contribute": "<0>Contribuie pentru o nouă traducere.", + "credits": "Tradus în limba română de <0>Valer100.", + "creditsLink": "https://github.com/Valer100" + }, + "updates": { + "title": "Verifică pentru actualizări", + "description": "Verifică periodic pentru noi versiuni de Windhawk și pentru modurile instalate." + }, + "devMode": { + "title": "Mod dezvoltator", + "description": "Arată acțiuni pentru dezvoltatori, cum ar fi crearea și modificarea modurilor." + }, + "advancedSettings": "Setări avansate", + "hideTrayIcon": { + "title": "Ascunde pictograma Windhawk din bara de activități", + "description": "Va trebui să dezactivezi această opțiune pentru a închide Windhawk." + }, + "requireElevation": { + "title": "Cere elevare UAC pentru a rula Windhawk", + "description": "Windhawk necesită drepturi de administrator, dar pentru un calculator folosit de o singură persoană, afișarea ecranului UAC de fiecare dată poate fi enervantă, așa că Windhawk ocolește acest lucru. Activează această opțiune pentru a cere elevare UAC pentru a rula Windhawk." + }, + "dontAutoShowToolkit": { + "title": "Nu arăta automat dialogul cu trusa de unelte", + "description": "În mod normal, Windhawk arată automat dialogul cu trusa de unelte când detectează că bara de activități nu este accesibilă, fie din motive de instabilitate a sistemului sau din alt motiv. Dialogul cu trusa de unelte îți permite să închizi Windhawk, să activezi modul de siguranță și să faci alte operațiuni. Dialogul cu trusa de unelte poate fi de asemenea afișat folosind combinația de taste Ctrl+Win+W." + }, + "modInitDialogDelay": { + "title": "Întârzierea dialogului de inițializare a modului", + "description": "Numărul de millisecunde de așteptat înainte de a arăta dialogul de progres pentru inițializarea modului." + }, + "moreAdvancedSettings": { + "title": "Mai multe setări avansate", + "restartNotice": "Windhawk va fi repornit pentru a aplica setările.", + "saveButton": "Salvează și repornește Windhawk", + "cancelButton": "Anulare" + }, + "loggingVerbosity": { + "appLoggingTitle": "Verbozitatea scrierii în jurnal pentru Windhawk", + "engineLoggingTitle": "Verbozitatea engine-ului de scriere în jurnal Windhawk", + "description": "Jurnalurile pot fi văzute cu o unealtă, cum ar fi DebugView.", + "none": "Nimic", + "error": "Eroare", + "verbose": "Verbose" + }, + "processList": { + "titleExclusion": "Lista de excludere a proceselor", + "descriptionExclusion": "O listă de nume/căi de procese pe care Windhawk nu le va putea injecta. Poate fi utilă pentru cazurile în care Windhawk nu este compatibil cu un anumit program. Ține minte că adăugând un proces în această listă nu va doar preveni Windhawk de a-l personaliza, dar va preveni de asemenea Windhawk din a intercepta procesele pe care acesta le creează. Acest lucru va cauza ca Windhawk să încarce modurile cu o mică întârziere în astfel de cazuri.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", + "titleInclusion": "Lista de includere a proceselor", + "descriptionInclusion": "O listă de nume/căi de procese pe care Windhawk le va putea injecta, chiar dacă ele sunt în lista de excludere.", + "inclusionWithoutExclusionNotice": "Lista proceselor incluse nu are niciun efect dacă lista de procese excluse este goală.", + "inclusionWithoutTotalExclusionNotice": "Dacă te refereai la excluderea tuturor proceselor, dar nu astea, poți adăuga \"*\" în lista de excludere a proceselor.", + "processListPlaceholder": "Numele/căile proceselor, câte unul/una pe un singur rând, de exemplu:" + }, + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" + } + }, + "about": { + "title": "Windhawk v{{version}}", + "beta": "beta", + "subtitle": "Piața de personalizare pentru programele Windows", + "credit": "De <0>{{author}}", + "update": { + "title": "O actualizare este disponibilă", + "subtitle": "Ia în considerare să actualizezi Windhawk pentru a obține cele mai noi funcții și remedieri de bug-uri", + "button": "Mai multe detalii" + }, + "links": { + "title": "Link-uri", + "homepage": "Pagina de pornire", + "documentation": "Documentație" + }, + "builtWith": { + "title": "Construit cu", + "vscodium": "O distribuție a editorului VSCode de la Microsoft, condusă de comunitate", + "llvmMingw": "Un lanț de instrumente mingw-w64 bazat pe LLVM/Clang/LLD", + "minHook": "Biblioteca minimalistă de API hooking pentru Windows", + "others": "Alte moduri și biblioteci și puțin cod" + } + }, + "installModal": { + "title": "Instalează {{mod}}", + "warningTitle": "Continuă cu prudență", + "warningDescription": "Modurile malițioase pot provoca daune calculatorului tău sau pot să-ți încalce confidențialitatea. Instalează moduri numai de la autorii de încredere.", + "modAuthor": "Autorul modului", + "homepage": "Pagina de pornire", + "github": "GitHub", + "twitter": "Twitter", + "verified": "verificat", + "verifiedTooltip": "Am verificat că acest profil îi aparține autorului modului, dar <0>să fii verificat nu este același lucru ca și <0>să fii de încredere. Asigură-te că autorul acestui mod este de încredere sau inspectează cu atenție codul sursă înainte de instalare.", + "acceptButton": "Acceptă riscul și instalează", + "cancelButton": "Anulare" + }, + "createNewModButton": { + "title": "Creează un mod" + }, + "devModeAction": { + "message": "Crearea și modificarea modurilor necesită niște cunoștințe de dezvoltare Windows C/C++. Dacă nu știi ce înseamnă asta, se pare că aceste opțiuni nu sunt pentru tine.", + "hideOptionsCheckbox": "Ascunde toate opțiunile relevante dezvoltării", + "hideOptionsButton": "Ascunde opțiunile", + "beginCodingButton": "Începe să programezi", + "cancelButton": "Anulare" + }, + "safeMode": { + "alert": "Windhawk rulează în modul de siguranță. Toate funcțiile de injectat cod sunt dezactivate.", + "offButton": "Oprește modul de siguranță", + "offConfirm": "Windhawk va fi repornit pentru a aplica setările.", + "offConfirmOk": "Repornește Windhawk", + "offConfirmCancel": "Anulare" + }, + "modPreview": { + "actionUnavailable": "Acțiunea nu este disponibilă în modul de previzualizare", + "notCompiled": "Modul trebuie să fie compilat pentru a-l putea previzualiza" + }, + "sidebar": { + "modId": "Identificator mod", + "enableMod": "Activează modul", + "enableLogging": "Activează scrierea în jurnal", + "notCompiled": "Modul trebuie să fie compilat", + "compile": "Compilează modul", + "compilationFailed": "Compilare eșuată", + "preview": "Previzualizează modul", + "showLogOutput": "Arată ieșirea în jurnal", + "exit": "Ieșire din modul de editare", + "exitConfirmation": "Modificările de la ultima compilare reușită vor fi pierdute", + "exitButtonOk": "Ieșire", + "exitButtonCancel": "Stai" + } +} \ No newline at end of file diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ru/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ru/translation.json new file mode 100644 index 0000000..fdd2f26 --- /dev/null +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ru/translation.json @@ -0,0 +1,289 @@ +{ + "general": { + "loading": "Загрузка...", + "loadingFailed": "Загрузка не удалась, пожалуйста проверьте Ваше интернет соединение", + "loadingFailedTitle": "Загрузка не удалась", + "loadingFailedSubtitle": "Пожалуйста проверьте Ваше интернет соединение и попытайтесь снова", + "tryAgain": "Попробовать еще раз", + "updating": "Обновление...", + "installing": "Установка...", + "compiling": "Компиляция...", + "cut": "Вырезать", + "copy": "Копировать", + "paste": "Вставить", + "selectAll": "Выбрать все" + }, + "appHeader": { + "home": "Главное", + "explore": "Искать", + "settings": "Настройки", + "about": "О программе" + }, + "mod": { + "updateAvailable": "Доступно обновление", + "installed": "Установлено", + "details": "Детали", + "remove": "Удалить", + "removeConfirm": "Вы уверены, что хотите удалить эту модификацию?", + "removeConfirmOk": "Удалить модификацию", + "removeConfirmCancel": "Отмена", + "notCompiled": "Модификация должна быть скомпилирована", + "editedLocally": "Модификация отредактирована локально", + "noDescription": "(нет описания)", + "users_one": "{{formattedCount}} пользователь", + "users_other": "{{formattedCount}} пользователей(я)" + }, + "modDetails": { + "header": { + "installedVersion": "Установленная версия", + "latestVersion": "Последняя версия", + "loading": "загрузка...", + "loadingFailed": "загрузка не удалась", + "modId": "ID модификации", + "modVersion": "Версия модификации", + "modAuthor": { + "title": "Автор модификации", + "homepage": "Домашняя страница", + "github": "GitHub", + "twitter": "Twitter" + }, + "processes": { + "all": "Все процессы", + "allBut": "Все кроме {{list}}", + "except": "{{included}} кроме {{excluded}}", + "tooltip": { + "target": "Целевой процесс", + "targets": "Целевые процессы:", + "excluded": "Исключенные:" + } + }, + "update": "Обновить", + "updateNotNeeded": "Установлена самая последняя версия", + "install": "Установить", + "compile": "Скомпилировать", + "disable": "Отключить", + "enable": "Включить", + "edit": "Редактировать", + "fork": "Fork", + "remove": "Удалить" + }, + "details": { + "title": "Детали", + "noData": "Детали модификации отсутствуют." + }, + "settings": { + "title": "Настройки", + "noData": "Нет доступных настроек модификации.", + "saveButton": "Сохранить настройки", + "sampleValue": "Стандартное значение", + "arrayItemAdd": "Добавить новый элемент", + "arrayItemRemove": "Удалить элемент" + }, + "code": { + "title": "Исходный код", + "noData": "Исходный код отсутствует.", + "collapseExtra": "Скрыть настройки и Readme" + }, + "changelog": { + "title": "Список изменений", + "loadingFailed": "не удалось загрузить список изменений. Нажмите <0>сюда чтобы просмотреть на GitHub." + }, + "advanced": { + "title": "Продвинутые", + "debugLogging": { + "title": "Логирование отладки", + "description": "Может быть использовано для решения проблем с модификацией.", + "none": "Нет", + "modLogs": "Логи модификаций", + "detailedLogs": "Подробные логи отладки", + "showLogButton": "Показать логи" + }, + "modSettings": { + "title": "Настройки модификации", + "description": "Легко экспортируйте или делитесь Вашими настройками модификаций.", + "loadButton": "Загрузить", + "loadFormattedButton": "Загрузить отформатированные", + "saveButton": "Сохранить", + "invalidData": "Некорректные JSON данные" + }, + "customList": { + "titleInclusion": "Пользовательский список целевых процессов", + "descriptionInclusion": "Пользовательский список с дополнительными файлами exe или путями к ним, которые затронет модификация. Этот список будет добавлен к списку затронутых процессов, который определил сам автор модификации. То есть, модификация загружается для каждого процесса, только если путь совпадает с одним из списка целевых и не совпадает с любым из списка исключенных.", + "titleExclusion": "Пользовательский список исключенных", + "descriptionExclusion": "Пользовательский список с дополнительными файлами exe или путями к ним, которые модификация НЕ затронет. Этот список будет добавлен к списку исключения от автора модификации. F То есть, модификация загружается для каждого процесса, только если путь совпадает с одним из списка целевых и не совпадает с любым из списка исключенных.", + "processListPlaceholder": "Имя процесса (exe)/пути, по одному в строке, например:", + "saveButton": "Сохранить" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." + } + }, + "changes": { + "title": "Изменения в последней версии", + "noData": "Установлена самая последняя версия.", + "splitView": "Раздельный просмотр", + "expandLines_one": "Раскрыть одну скрытую линию", + "expandLines_other": "Раскрыть скрытых линий: {{count}}" + } + }, + "home": { + "browse": "Поиск модификаций", + "installedMods": { + "title": "Установленные модификации", + "noMods": "Модификации не установлены" + }, + "featuredMods": { + "title": "Рекомендованные модификации", + "noMods": "Нет рекомендованных модификаций, которые еще не установлены", + "explore": "Искать другие модификации" + } + }, + "explore": { + "search": { + "placeholder": "Искать модификации...", + "popularAndTopRated": "Популярные и с наивысшим рейтингом", + "popular": "Популярные", + "topRated": "С наивысшим рейтингом", + "newest": "Новые", + "lastUpdated": "Последние обновления", + "alphabeticalOrder": "Алфавитный порядок" + } + }, + "settings": { + "language": { + "title": "Язык", + "description": "Выберите желаемый язык интерфейса для Windhawk.", + "contribute": "<0>Добавить новый перевод.", + "credits": "Русский перевод от <0>Сергея Крылова.", + "creditsLink": "mailto:krylov.sn@nxt.ru" + }, + "updates": { + "title": "Проверить обновления", + "description": "Периодически проверять наличие обновлений для Windhawk и установленных модификаций." + }, + "devMode": { + "title": "Режим разработчика", + "description": "Показать действия для разработчиков, например создание и редактирование модификаций." + }, + "advancedSettings": "Продвинутые настройки", + "hideTrayIcon": { + "title": "Скрыть иконку в трее", + "description": "Вам нужно отключить эту опция для выхода из Windhawk." + }, + "requireElevation": { + "title": "Требовать UAC для запуска Windhawk", + "description": "Windhawk нуждается в правах администратора, но для компьютеров с одним пользователем постоянные запросы от UAC надоедают, поэтому Windhawk их обходит. Включите этот параметр, чтобы вернуть UAC запросы на запуск Windhawk." + }, + "dontAutoShowToolkit": { + "title": "Не показывать автоматически диалог меню", + "description": "По умолчанию Windhawk автоматически вызывает диалог меню когда обнаруживает, что панель задач не работает из-за нестабильности системы или другой причины. Диалог меню позволяет закрыть Windhawk, перейти в безопасный режим и совершать другие действия. Диалог меню можно также вызвать комбинацией клавиш Ctrl+Win+W." + }, + "modInitDialogDelay": { + "title": "Задержка диалога инициализации модификации", + "description": "Количество миллисекунд ожидания перед показом диалогового окна прогресса инициализации модификации." + }, + "moreAdvancedSettings": { + "title": "Более продвинутые настройки", + "restartNotice": "Windhawk будет перезапущен для применения настроек.", + "saveButton": "Сохранить и перезапустить Windhawk", + "cancelButton": "Отмена" + }, + "loggingVerbosity": { + "appLoggingTitle": "Подробное логирование Windhawk", + "engineLoggingTitle": "Подробное логирование движка Windhawk", + "description": "логи могут быть просмотрены, например утилитой DebugView.", + "none": "Нет", + "error": "Ошибка", + "verbose": "Подробно" + }, + "processList": { + "titleExclusion": "Список исключенных процессов", + "descriptionExclusion": "Список процессов/пути, в которые Windhawk не будет внедрять код. Может быть полезно в случаях, когда Windhawk несовместим с определенной программой. Обратите внимание, что добавление процесса в этот список не только не даст Windhawk его изменять, но и предотвратит Windhawk от перехвата дочерних процессов, созданных исключенным. Это вызовет задержку при загрузке модификаций в Windhawk.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", + "titleInclusion": "Список целевых процессов", + "descriptionInclusion": "Список целевых процессов/путей , в которые Windhawk будет внедрять код, даже если они в списке исключенных.", + "inclusionWithoutExclusionNotice": "Список целевых процессов ничего не делает, если список исключенных процессов пуст.", + "inclusionWithoutTotalExclusionNotice": "Если вы хотите исключить все процессы, кроме этих, вы можете задать \"*\" в списке исключенных процессов.", + "processListPlaceholder": "Имя процесса (exe)/пути, по одному в строке, например:" + }, + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" + } + }, + "about": { + "title": "Windhawk v{{version}}", + "beta": "beta", + "subtitle": "Маркетплейс для кастомизации программ Windows", + "credit": "От <0>{{author}}", + "update": { + "title": "Доступно обновление", + "subtitle": "Обновите Windhawk для получения доступа к новейшим функциям и исправления ошибок", + "button": "Подробнее" + }, + "links": { + "title": "Ссылки", + "homepage": "Домашняя страница", + "documentation": "Документация" + }, + "builtWith": { + "title": "Скомпилировано с", + "vscodium": "Community версия редактора VSCode от Microsoft", + "llvmMingw": "LLVM/Clang/LLD на базе среды mingw-w64", + "minHook": "Минималистичная API hooking библиотека для Windows", + "others": "Другие инструменты и библиотеки, а также немного кодинга" + } + }, + "installModal": { + "title": "Установить {{mod}}", + "warningTitle": "Продолжайте осторожно", + "warningDescription": "Вредоносные модификации могут повредить Ваш компьютер и нарушить Вашу приватность. Устанавливайте модификации только от авторов, которым доверяете.", + "modAuthor": "Автор модификации", + "homepage": "Домашняя страница", + "github": "GitHub", + "twitter": "Twitter", + "verified": "подтвержден", + "verifiedTooltip": "Мы подтверждаем, что этот профиль принадлежит автору модификации, но обратите внимание, что <0>подтвержденный не значит <0>доверенный. Убедитесь, что вы доверяете автору модификации или тщательно проверьте исходный код перед установкой.", + "acceptButton": "Принять риск и продолжить", + "cancelButton": "Отмена" + }, + "createNewModButton": { + "title": "Создать новую модификацию" + }, + "devModeAction": { + "message": "Создание и изменение модификаций требует некоторых знаний C/C++ в Windows. Если Вы не понимаете о чём речь, возможно эти опции не для Вас.", + "hideOptionsCheckbox": "Спрятать все опции для разработчиков", + "hideOptionsButton": "Спрятать опции", + "beginCodingButton": "Начать кодинг", + "cancelButton": "Отмена" + }, + "safeMode": { + "alert": "Windhawk работает в безопасном режиме, весь функционал внедрения кода отключен.", + "offButton": "Выключить безопасный режим", + "offConfirm": "Windhawk будет перезапущен для применения настроек.", + "offConfirmOk": "Перезапустить Windhawk", + "offConfirmCancel": "Отмена" + }, + "modPreview": { + "actionUnavailable": "Действие недоступно в режиме просмотра", + "notCompiled": "Необходимо скомпилировать модификацию для просмотра" + }, + "sidebar": { + "modId": "ID модификации", + "enableMod": "Включить модификацию", + "enableLogging": "Включить логирование", + "notCompiled": "необходимо скомпилировать модификацию", + "compile": "Скомпилировать модификацию", + "compilationFailed": "Компиляция не удалась", + "preview": "Просмотр модификации", + "showLogOutput": "Показать логи", + "exit": "Выйти из режима редактирования", + "exitConfirmation": "Изменения после последней успешной компиляции будут потеряны", + "exitButtonOk": "Выйти", + "exitButtonCancel": "Остаться" + } +} \ No newline at end of file diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/tr/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/tr/translation.json index e97ba51..bb18ba3 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/tr/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/tr/translation.json @@ -109,6 +109,10 @@ "descriptionExclusion": "Modun hedefleme dışında bırakacağı ek yürütülebilir dosya adlarının/yollarının özel bir listesi. Liste, hangi işlemlerin hedefleneceğini belirlemek için mod yazarının tanımladığı dışlama listesine eklenir. Her işlem için, yürütülebilir dosya yolu dahil etme girişlerinden biriyle eşleşirse ve herhangi bir hariç tutma girişiyle eşleşmezse mod yüklenir.", "processListPlaceholder": "İşlem adları/yolları, örneğin her satıra bir tane:", "saveButton": "Kaydet" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -188,16 +192,19 @@ "processList": { "titleExclusion": "İşlem hariç etme listesi", "descriptionExclusion": "Windhawk'ın enjekte etmeyeceği işlem adlarının/yollarının bir listesi. Windhawk'ın belirli bir programla uyumlu olmadığı durumlarda yararlı olabilir. Bu listeye bir süreç eklemenin Windhawk'ın onu özelleştirmesini engellemenin yanı sıra Windhawk'ın bu sürecin oluşturduğu alt süreçleri yakalamasını da engelleyeceğini unutmayın. Bu, Windhawk'ın bu gibi durumlarda modları hafif bir gecikmeyle yüklemesine neden olacaktır.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "İşlem dahil etme listesi", "descriptionInclusion": "Dışlama listesinde olsalar bile Windhawk'ın enjekte edeceği işlem adlarının/yollarının bir listesi.", - "inclusionWithoutExclusionNotice": "İşlem dahil etme listesinin, boş bir işlem hariç tutma listesi ile hiçbir etkisi yoktur. Bunlar dışındaki tüm işlemleri hariç tutmak istiyorsanız, işlem dışlama listesinde \"*\" ayarını yapabilirsiniz.", - "titleThreadAttachExempt": "\"Hafif parçacıklar\" enjeksiyon yöntemi için işlem listesi", - "descriptionThreadAttachExempt": "Windhawk iş parçacıklarının başlatılmasının bir kısmını atlayın (TLS başlatmayı, TLS ve DllMain geri aramalarını ve daha fazlasını atlar). Bu, bazı programlarla uyumluluğu düzeltebilir, ancak diğerleriyle uyumluluğu bozabilir. <0>Daha fazla bilgi.", + "inclusionWithoutExclusionNotice": "İşlem dahil etme listesinin, boş bir işlem hariç tutma listesi ile hiçbir etkisi yoktur.", + "inclusionWithoutTotalExclusionNotice": "Bunlar dışındaki tüm işlemleri hariç tutmak istiyorsanız, işlem dışlama listesinde \"*\" ayarını yapabilirsiniz.", "processListPlaceholder": "İşlem adları/yolları, örneğin her satıra bir tane:" }, - "injectIntoCriticalProcesses": { - "title": "Kritik sistem işlemlerine enjekte et", - "description": "Windhawk varsayılan olarak kritik sistem işlemlerine kod eklemez. Bu işlemlerden birinin çökmesi bir BSOD'ye yol açabileceğinden, bu seçeneği dikkatli kullanın." + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ua/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ua/translation.json new file mode 100644 index 0000000..75b3ffb --- /dev/null +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/ua/translation.json @@ -0,0 +1,289 @@ +{ + "general": { + "loading": "Завантаження...", + "loadingFailed": "Помилка завантаження, будь ласка, перевірте своє інтернет-з'єднання", + "loadingFailedTitle": "Не вдалося завантажити", + "loadingFailedSubtitle": "Будь ласка, перевірте своє інтернет-з'єднання та спробуйте ще раз", + "tryAgain": "Спробуйте ще раз", + "updating": "Оновлення...", + "installing": "Встановлення...", + "compiling": "Компіляція...", + "cut": "Вирізати", + "copy": "Копіювати", + "paste": "Вставити", + "selectAll": "Вибрати все" + }, + "appHeader": { + "home": "Домашня", + "explore": "Шукати", + "settings": "Налаштування", + "about": "Довідка" + }, + "mod": { + "updateAvailable": "Доступне оновлення", + "installed": "Встановлено", + "details": "Деталі", + "remove": "Видалити", + "removeConfirm": "Ви дійсно бажаєте видалити цей мод?", + "removeConfirmOk": "Видалити мод", + "removeConfirmCancel": "Скасувати", + "notCompiled": "Мод повинен бути скомпільованим", + "editedLocally": "Мод відредаговано локально", + "noDescription": "(Опис порожній)", + "users_one": "{{formattedCount}} користувач", + "users_other": "{{formattedCount}} користувачів" + }, + "modDetails": { + "header": { + "installedVersion": "Встановлена версія", + "latestVersion": "Остання версія", + "loading": "завантаження...", + "loadingFailed": "Помилка завантаження", + "modId": "Ідентифікатор моду", + "modVersion": "Версія моду", + "modAuthor": { + "title": "Автори моду", + "homepage": "Домашня сторінка", + "github": "GitHub", + "twitter": "Twitter" + }, + "processes": { + "all": "Всі процеси", + "allBut": "Всі крім {{list}}", + "except": "{{included}} крім {{excluded}}", + "tooltip": { + "target": "Цільовий процес", + "targets": "Цільові процеси:", + "excluded": "Винятки:" + } + }, + "update": "Оновити", + "updateNotNeeded": "Встановлена версія ідентична останній", + "install": "Встановити", + "compile": "Компілювати", + "disable": "Вимкнути", + "enable": "Увімкнути", + "edit": "Редагувати", + "fork": "Форкнути", + "remove": "Видалити" + }, + "details": { + "title": "Деталі", + "noData": "Деталі відсутні." + }, + "settings": { + "title": "Налаштування", + "noData": "Налаштування моду відсутні.", + "saveButton": "Зберегти зміни", + "sampleValue": "Стандартне значення", + "arrayItemAdd": "Додати", + "arrayItemRemove": "Видалити" + }, + "code": { + "title": "Вихідний код", + "noData": "Вихідний код моду відсутній.", + "collapseExtra": "Приховати Readme та Налаштування" + }, + "changelog": { + "title": "Журнал змін", + "loadingFailed": "Не вдалося завантажити журнал змін. <0>Натисніть тут щоб переглянути його на GitHub." + }, + "advanced": { + "title": "Просунуті", + "debugLogging": { + "title": "Логування налагодження", + "description": "Може бути корисним для усунення проблем з цим модом.", + "none": "Ні", + "modLogs": "Логи модів", + "detailedLogs": "Детальні логи налагодження", + "showLogButton": "Показати вивід логу" + }, + "modSettings": { + "title": "Налаштування моду", + "description": "Легко експортуй або поділися своїми налаштуваннями моду Easily export or share your mod settings.", + "loadButton": "Завантажити", + "loadFormattedButton": "Завантаження відформатовано", + "saveButton": "Зберегти", + "invalidData": "Пошкодженні JSON дані" + }, + "customList": { + "titleInclusion": "Користувальницький список цільових процесів", + "descriptionInclusion": "Користувацький список додаткових імен/шляхів до виконуваних файлів, на які буде спрямовано мод. Цей список додається до списку цілей, який автор моду визначив для визначення процесів, на які вона буде націлена. Мод буде увімкнено для кожного процесу, якщо шлях до виконуваного файлу збігається зі списком цілей і не збігається з жодним зі списків винятків.", + "titleExclusion": "Користувальницький список виняткових процесів", + "descriptionExclusion": "Користувацький список додаткових імен/шляхів до виконуваних файлів, на які НЕ буде спрямовано мод. Цей список додається до списку винятків, який автор моду визначив для визначення процесів, на які вона буде націлена. Мод буде увімкнено для кожного процесу, якщо шлях до виконуваного файлу збігається зі списком цілей і не збігається з жодним зі списків винятків.", + "processListPlaceholder": "Назви/шляхи процесів, по одному в рядку, наприклад:", + "saveButton": "Зберегти" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." + } + }, + "changes": { + "title": "Зміни в останній версії:", + "noData": "Встановлена версія ідентична останній", + "splitView": "Розділити вид", + "expandLines_one": "Розгорнути один прихований рядок", + "expandLines_other": "Розгорнути {{count}} прихованих рядків" + } + }, + "home": { + "browse": "Шукати моди:", + "installedMods": { + "title": "Встановлені моди:", + "noMods": "Не встановлено жодного моду" + }, + "featuredMods": { + "title": "Рекомендовані моди", + "noMods": "Всі рекомендовані моди вже встановлені", + "explore": "Шукати інші моди" + } + }, + "explore": { + "search": { + "placeholder": "Шукати моди...", + "popularAndTopRated": "Популярні та з найкращим рейтингом", + "popular": "Популярні", + "topRated": "З найкращим рейтингом", + "newest": "Найновіші", + "lastUpdated": "Останні оновленні", + "alphabeticalOrder": "Алфавітний порядок" + } + }, + "settings": { + "language": { + "title": "Мова", + "description": "Оберіть бажану мову інтерфейсу Windhawk.", + "contribute": "<0>Надіслати свій переклад.", + "credits": "Український переклад від <0>Fileak.", + "creditsLink": "https://t.me/Fileak" + }, + "updates": { + "title": "Перевірити наявність оновлення", + "description": "Періодично перевіряти наявність оновлень для Windhawk та встановлених модів." + }, + "devMode": { + "title": "Режим розробника", + "description": "Відображати дії для розробників, такі як створення та редагування модів." + }, + "advancedSettings": "Просунуті налаштування", + "hideTrayIcon": { + "title": "Сховати іконку у системному треї", + "description": "Вам доведеться вимкнути цю опцію, щоб вийти з Windhawk." + }, + "requireElevation": { + "title": "Запрошувати UAC дозвіл для запуску Windhawk", + "description": "Windhawk потребує права адміністратора, але для комп'ютерів з одним користувачем постійні запити від UAC набридають, тому Windhawk обходить їх. Увімкніть цей параметр щоб повернути UAC запити на запуск Windhawk." + }, + "dontAutoShowToolkit": { + "title": "Не викликати діалог меню автоматично", + "description": "За замовчуванням, Windhawk автоматично кличе діалог меню коли виявляє, що панель завдань не працює через нестабільність системи чи іншу причину. Діалог меню дозволяє закрити Windhawk, перейти у безпечний режим, та інші дії. Діалог меню також можна викликати комбінацією клавіш Ctrl+Win+W." + }, + "modInitDialogDelay": { + "title": "Затримка діалогу ініціалізації моду", + "description": "Кількість мілісекунд очікування перед показом діалогового вікна прогресу ініціалізації моду." + }, + "moreAdvancedSettings": { + "title": "Більше просунутих налаштувань", + "restartNotice": "Windhawk перезавантажиться для застосування налаштувань.", + "saveButton": "Зберегти зміни та перезавантажити Windhawk", + "cancelButton": "Скасувати" + }, + "loggingVerbosity": { + "appLoggingTitle": "Докладне логування Windhawk", + "engineLoggingTitle": "Докладне логування движку Windhawk", + "description": "Логи можуть бути переглянуть такими утилітами, DebugView.", + "none": "Ні", + "error": "Помилка", + "verbose": "Докладно" + }, + "processList": { + "titleExclusion": "Список виняткових процесів", + "descriptionExclusion": "Список додаткових імен/шляхів до виконуваних файлів, які Windhawk буде ігнорувати. Може бути корисно, коли Windhawk не сумісний з окремим застосунком. Зауважте, що додавання процесу до цього списку не тільки забезпечить цей процес не тільки від модифікації його Windhawk'ом, а й всіх його дочірніх процесів. Це призведе до невеликої затримки у ініціалізації модів у деяких випадках.", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", + "titleInclusion": "Список цільових процесів", + "descriptionInclusion": "Список додаткових імен/шляхів до виконуваних файлів, у які Windhawk буде вживлятися, навіть якщо вони в списку виключень.", + "inclusionWithoutExclusionNotice": "Список цільових процесів нічого не робить, якщо список виняткових процесів порожній.", + "inclusionWithoutTotalExclusionNotice": "Якщо ви хочете виключити всі процеси, окрім цих, ви можете задати \"*\" у списку виняткових процесів.", + "processListPlaceholder": "Назви/шляхи процесів, по одному в рядку, наприклад:" + }, + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" + } + }, + "about": { + "title": "Windhawk v{{version}}", + "beta": "beta", + "subtitle": "Маркетплейс для кастомізації застосунків Windows", + "credit": "Від <0>{{author}}", + "update": { + "title": "Доступне оновлення", + "subtitle": "Поміркуйте про оновлення Windhawk для отримання найновіших функцій та усунення багів", + "button": "Більше деталей" + }, + "links": { + "title": "Посилання", + "homepage": "Домашня сторінка", + "documentation": "Документація" + }, + "builtWith": { + "title": "Побудовано з", + "vscodium": "Community версія редактору VSCode від Microsoft", + "llvmMingw": "LLVM/Clang/LLD базоване середовище mingw-w64", + "minHook": "Minimalistic API hooking library для Windows", + "others": "Інші інструменті та бібліотеки, та трішечки кодингу." + } + }, + "installModal": { + "title": "Встановити {{mod}}", + "warningTitle": "Дійте з обережністю", + "warningDescription": "Зловмисні моди можуть mods пошкодити Ваш комп'ютер, або порушити Вашу приватність. Встановлюйте моди тільки від тих авторів, яким ви довіряєте.", + "modAuthor": "Автор моду", + "homepage": "Домашня сторінка", + "github": "GitHub", + "twitter": "Twitter", + "verified": "верифіковано", + "verifiedTooltip": "Ми верифікуємо тільки те, що цей профіль належить автору моду, але зауважте, що <0>верифіковано не те ж саме, що <0>надійно. Переконайтеся, що ви довіряєте автору моду, або уважно перевірте вихідний код перед встановленням.", + "acceptButton": "Прийняти ризики та встановити", + "cancelButton": "Скасувати" + }, + "createNewModButton": { + "title": "Створити новий мод" + }, + "devModeAction": { + "message": "Створення модів потребує деяких знань з C/C++ розробки для Windows. Якщо ви не впевнені, що це значить, мабуть, ця опції не для Вас.", + "hideOptionsCheckbox": "Приховати всі опції для розробників", + "hideOptionsButton": "Приховати опції", + "beginCodingButton": "Почати кодити", + "cancelButton": "Скасувати" + }, + "safeMode": { + "alert": "Windhawk працює в безпечному режимі, без можливості ін'єкцій коду.", + "offButton": "Вимкнути безпечний режим", + "offConfirm": "Windhawk перезавантажиться для застосування налаштувань.", + "offConfirmOk": "Перезавантажити Windhawk", + "offConfirmCancel": "Скасувати" + }, + "modPreview": { + "actionUnavailable": "Опція недоступна у режимі перегляду", + "notCompiled": "Мод потрібен бути скомпільованим перед переглядом" + }, + "sidebar": { + "modId": "Ідентифікатор моду", + "enableMod": "Увімкнути мод", + "enableLogging": "Увімкнути логування", + "notCompiled": "Мод повинен бути скомпільованим", + "compile": "Компілювати мод", + "compilationFailed": "Помилка компіляції", + "preview": "Переглянуті Мод", + "showLogOutput": "Показати вивід логу", + "exit": "Вийти з режиму редагування", + "exitConfirmation": "Зміни з часу останньої успішної компіляції буде втрачено", + "exitButtonOk": "Вийти", + "exitButtonCancel": "Залишитися" + } +} \ No newline at end of file diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-CN/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-CN/translation.json index 0c02a92..e7db4ec 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-CN/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-CN/translation.json @@ -113,6 +113,10 @@ "descriptionExclusion": "Mod将作用于不在此自定义列表中的可执行文件/路径。该列表被添加到Mod作者定义的包含列表中,以确定目标进程。对于每个进程,如果可执行文件/路径匹配一个包含项,而不匹配任何排除项,则加载Mod。", "processListPlaceholder": "进程名称/路径,每行一条内容,例如:", "saveButton": "保存" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -196,16 +200,19 @@ "processList": { "titleExclusion": "排除的进程列表", "descriptionExclusion": "Windhawk不会注入的进程名/路径列表。在Windhawk与特定程序不兼容的情况下十分有用。请您注意,向这个列表中添加一个进程不仅会阻止Windhawk对它进行定制化处理,还会阻止Windhawk拦截该进程创建的子进程。这将导致Windhawk加载Mod的时候有轻微延迟。", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "包含的进程列表", "descriptionInclusion": "Windhawk将注入的进程名/路径列表,即使它们在排除列表中。", - "inclusionWithoutExclusionNotice": "进程包含列表对于空进程排除列表无效。如果您打算排除除这些之外的所有进程,您可以用“*”在进程排除列表中设置。", - "titleThreadAttachExempt": "进程列表 \"light threads\" 方法注入", - "descriptionThreadAttachExempt": "跳过一些Windhawk线程的初始化(跳过TLS初始化,TLS和DllMain回调等等)。这可能会修复与某些程序的兼容性,但可能会破坏与其他程序的兼容性。<0>更多信息。", + "inclusionWithoutExclusionNotice": "进程包含列表对于空进程排除列表无效。", + "inclusionWithoutTotalExclusionNotice": "如果您打算排除除这些之外的所有进程,您可以用“*”在进程排除列表中设置。", "processListPlaceholder": "进程名/路径,每行一个,例如:" }, - "injectIntoCriticalProcesses": { - "title": "注入到重要的系统进程中", - "description": "默认情况下,Windhawk不会向重要的系统进程注入代码。请谨慎选择此选项,因为其中一个进程崩溃可能会导致蓝屏。" + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-TW/translation.json b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-TW/translation.json index 64d3c4a..7bab7ce 100644 --- a/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-TW/translation.json +++ b/src/vscode-windhawk-ui/apps/vscode-windhawk-ui/src/locales/zh-TW/translation.json @@ -113,6 +113,10 @@ "descriptionExclusion": "模組將作用於不在此自定義列表中的可執行文件/路徑。此列表被新增到模組作者定義的包含列表中,以確定目標進程。對於每個進程,如果可執行文件/路徑匹配一個包含項,而不匹配任何排除項,則載入模組。", "processListPlaceholder": "進程名稱/路徑,每行一條內容,例如:", "saveButton": "儲存" + }, + "includeExcludeCustomOnly": { + "title": "Ignore mod inclusion/exclusion lists", + "description": "Ignore the mod's process inclusion/exclusion lists and use only the custom lists above." } }, "changes": { @@ -196,16 +200,19 @@ "processList": { "titleExclusion": "排除的進程列表", "descriptionExclusion": "Windhawk 不會注入的進程名稱/路徑列表。在 Windhawk 與特定程式不相容的情況下十分有用。請您注意,向這個列表中新增一個進程不僅會阻止 Windhawk 對它進行定制化處理,還會阻止 Windhawk 攔截此進程建立的子進程。這將導致 Windhawk 載入模組的時候有輕微延遲。", + "exclusionCriticalProcessesNotice": "The special <0>{{critical_system_processes}} value can be added to the list to exclude critical system processes. Beware of removing it, as crashing one of these processes might lead to a BSOD.", "titleInclusion": "包含的進程列表", "descriptionInclusion": "Windhawk 將注入的進程名稱/路徑列表,即使它們在排除列表中。", - "inclusionWithoutExclusionNotice": "進程包含列表對於空進程排除列表無效。如果您打算排除除這些之外的所有進程,您可以用 \"*\" 在進程排除列表中設定。", - "titleThreadAttachExempt": "進程列表「light threads」方法注入", - "descriptionThreadAttachExempt": "跳過一些 Windhawk 線程的初始化(跳過 TLS 初始化, TLS 和 DllMain 回調等)。這可能會修復與某些程式的相容性,但也可能會破壞與其他程式的相容性。<0>更多資訊。", + "inclusionWithoutExclusionNotice": "進程包含列表對於空進程排除列表無效。", + "inclusionWithoutTotalExclusionNotice": "如果您打算排除除這些之外的所有進程,您可以用 \"*\" 在進程排除列表中設定。", "processListPlaceholder": "進程名稱/路徑,每行一個,例如:" }, - "injectIntoCriticalProcesses": { - "title": "注入到重要的系統進程中", - "description": "預設情況下,Windhawk 不會向重要的系統進程注入代碼。請謹慎選擇此選項,因為其中一個進程崩潰可能會導致藍白當機畫面。" + "loadModsInCriticalSystemProcesses": { + "title": "Load mods in critical system processes", + "description": "By default, Windhawk only loads mods in critical system processes if the process is targeted explicitly, i.e. is listed without wildcards in the mod's process inclusion list.", + "never": "Never", + "onlyExplicitMatch": "Only if targeted explicitly", + "always": "If targeted" } }, "about": { diff --git a/src/vscode-windhawk-ui/package-lock.json b/src/vscode-windhawk-ui/package-lock.json index e2a3232..58cf3ef 100644 --- a/src/vscode-windhawk-ui/package-lock.json +++ b/src/vscode-windhawk-ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-windhawk-ui-nx", - "version": "1.3.1", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vscode-windhawk-ui-nx", - "version": "1.3.1", + "version": "1.4.0", "dependencies": { "@fortawesome/fontawesome-svg-core": "^1.2.36", "@fortawesome/free-brands-svg-icons": "^5.15.4", diff --git a/src/vscode-windhawk-ui/package.json b/src/vscode-windhawk-ui/package.json index 742a93e..be10034 100644 --- a/src/vscode-windhawk-ui/package.json +++ b/src/vscode-windhawk-ui/package.json @@ -1,6 +1,6 @@ { "name": "vscode-windhawk-ui-nx", - "version": "1.3.1", + "version": "1.4.0", "scripts": { "start": "nx serve", "watch": "nx build --configuration=development --watch", diff --git a/src/vscode-windhawk/files/mod_template.wh.cpp b/src/vscode-windhawk/files/mod_template.wh.cpp index e60a016..43130b5 100644 --- a/src/vscode-windhawk/files/mod_template.wh.cpp +++ b/src/vscode-windhawk/files/mod_template.wh.cpp @@ -106,7 +106,7 @@ void LoadSettings() { // The mod is being initialized, load settings, hook functions, and do other // initialization stuff if required. BOOL Wh_ModInit() { - Wh_Log(L"Init " WH_MOD_ID L" version " WH_MOD_VERSION); + Wh_Log(L"Init"); LoadSettings(); diff --git a/src/vscode-windhawk/package-lock.json b/src/vscode-windhawk/package-lock.json index 5e7e526..bb03093 100644 --- a/src/vscode-windhawk/package-lock.json +++ b/src/vscode-windhawk/package-lock.json @@ -1,59 +1,91 @@ { "name": "windhawk", - "version": "1.3.1", - "lockfileVersion": 2, + "version": "1.4.0", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windhawk", - "version": "1.3.1", + "version": "1.4.0", "dependencies": { "fs-ext": "^2.0.0", "ini-win": "^3.0.3", "js-yaml": "^4.1.0", "jsonschema": "^1.4.1", "native-reg": "^1.1.1", - "node-fetch": "^2.6.9", - "semver": "^7.3.8", + "node-fetch": "^2.6.13", + "semver": "^7.5.4", "vscode-nls-i18n": "^0.2.4" }, "devDependencies": { - "@types/fs-ext": "^2.0.0", - "@types/js-yaml": "^4.0.5", - "@types/node": "^18.15.7", - "@types/node-fetch": "^2.6.2", - "@types/semver": "^7.3.13", + "@electron/rebuild": "^3.3.0", + "@types/fs-ext": "^2.0.1", + "@types/js-yaml": "^4.0.6", + "@types/node": "^20.6.3", + "@types/node-fetch": "^2.6.5", + "@types/semver": "^7.5.2", "@types/vscode": "^1.74.2", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", "copy-webpack-plugin": "^11.0.0", - "electron-rebuild": "^3.2.7", - "eslint": "^8.36.0", + "eslint": "^8.49.0", "node-loader": "^2.0.0", - "rimraf": "^4.4.1", - "ts-loader": "^9.4.2", - "typescript": "^5.0.2", - "webpack": "^5.76.3", - "webpack-cli": "^5.0.1" + "rimraf": "^5.0.1", + "ts-loader": "^9.4.4", + "typescript": "^5.2.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" }, "engines": { "vscode": "^1.74.2" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@electron/rebuild": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.1.4", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -65,23 +97,21 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", - "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "version": "4.8.1", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.1.2", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -97,25 +127,17 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.49.0", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.11", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -127,9 +149,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -140,15 +161,102 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -159,53 +267,46 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.4.15", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.19", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@malept/cross-spawn-promise": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", "dev": true, "funding": [ { @@ -217,6 +318,7 @@ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" } ], + "license": "Apache-2.0", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -226,9 +328,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -239,18 +340,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -260,48 +359,29 @@ } }, "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "version": "3.1.0", "dev": true, + "license": "ISC", "dependencies": { - "@gar/promisify": "^1.0.1", "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" } }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -311,9 +391,8 @@ }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -322,31 +401,28 @@ } }, "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "version": "2.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 10" } }, "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "version": "6.0.3", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", - "@types/keyv": "*", + "@types/keyv": "^3.1.4", "@types/node": "*", - "@types/responselike": "*" + "@types/responselike": "^1.0.0" } }, "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "version": "8.44.2", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -354,126 +430,110 @@ }, "node_modules/@types/eslint-scope": { "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "version": "1.0.1", + "dev": true, + "license": "MIT" }, "node_modules/@types/fs-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-ext/-/fs-ext-2.0.0.tgz", - "integrity": "sha512-v+rZ57B796XFBS4gbkYnmsmGdh8zDdcyFFtA+GqNdeD75MlS97m+hknE/JixwlxbpvPwUqoYraf3ePC6r+ByXw==", + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true + "version": "4.0.2", + "dev": true, + "license": "MIT" }, "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true - }, - "node_modules/@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true + "version": "4.0.6", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "version": "7.0.13", + "dev": true, + "license": "MIT" }, "node_modules/@types/keyv": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "18.15.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz", - "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==", + "version": "20.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz", + "integrity": "sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==", "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "version": "2.6.5", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" } }, "node_modules/@types/responselike": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true + "version": "7.5.2", + "dev": true, + "license": "MIT" }, "node_modules/@types/vscode": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", - "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", - "dev": true + "version": "1.82.0", + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -482,25 +542,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -509,16 +570,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -526,25 +587,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -553,12 +614,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -566,21 +627,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -593,42 +654,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -636,156 +696,140 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "version": "1.11.6", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "version": "1.11.6", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "version": "1.11.6", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "version": "1.11.6", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "version": "1.11.6", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", + "version": "2.1.1", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -795,10 +839,9 @@ } }, "node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "version": "2.0.2", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -808,10 +851,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", + "version": "2.0.5", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -827,27 +869,23 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.10.0", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -856,28 +894,25 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "4" }, @@ -886,13 +921,10 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.5.0", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { @@ -901,9 +933,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -914,9 +945,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -930,9 +960,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -946,10 +975,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "version": "8.12.0", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -963,33 +991,29 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, + "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1002,27 +1026,24 @@ }, "node_modules/aproba": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "version": "3.0.1", "dev": true, + "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", @@ -1035,20 +1056,16 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -1063,22 +1080,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -1087,9 +1103,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1097,9 +1112,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -1108,9 +1122,7 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.11", "dev": true, "funding": [ { @@ -1120,13 +1132,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001538", + "electron-to-chromium": "^1.4.526", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1137,8 +1154,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -1154,6 +1169,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -1161,68 +1177,94 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "version": "17.1.4", "dev": true, + "license": "ISC", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", + "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { - "rimraf": "bin.js" + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.0.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", "dev": true, + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -1238,17 +1280,14 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", + "version": "1.0.30001538", "dev": true, "funding": [ { @@ -1258,14 +1297,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1279,36 +1322,32 @@ }, "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/chrome-trace-event": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -1317,10 +1356,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.1", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -1329,30 +1367,30 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -1363,19 +1401,20 @@ } }, "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -1385,30 +1424,26 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, + "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "version": "2.0.20", + "dev": true, + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1418,40 +1453,23 @@ }, "node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "node_modules/concat-map": { + "version": "0.0.1", "dev": true, - "dependencies": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "license": "MIT" }, "node_modules/console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.2.11", "glob-parent": "^6.0.1", @@ -1471,43 +1489,14 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.2.2", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -1518,36 +1507,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/copy-webpack-plugin/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1557,9 +1520,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1571,9 +1533,8 @@ }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -1588,9 +1549,8 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -1603,9 +1563,8 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1615,69 +1574,53 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "version": "2.0.2", "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "license": "Apache-2.0", "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1687,9 +1630,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1697,59 +1639,32 @@ "node": ">=6.0.0" } }, - "node_modules/electron-rebuild": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-3.2.7.tgz", - "integrity": "sha512-WvaW1EgRinDQ61khHFZfx30rkPQG5ItaOT0wrI7iJv9A3SbghriQGfZQfHZs25fWLBe6/vkv05LOqg6aDw6Wzw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^1.0.3", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "lzma-native": "^8.0.5", - "node-abi": "^3.0.0", - "node-api-version": "^0.1.4", - "node-gyp": "^8.4.0", - "ora": "^5.1.0", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/src/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true + "version": "1.4.527", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encoding": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -1757,18 +1672,16 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.15.0", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -1779,18 +1692,16 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -1800,30 +1711,26 @@ }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "version": "1.3.1", + "dev": true, + "license": "MIT" }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1832,27 +1739,26 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.49.0", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1860,22 +1766,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -1890,9 +1793,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -1902,45 +1804,47 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.6.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1951,9 +1855,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1963,18 +1866,16 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1984,51 +1885,50 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2042,9 +1942,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2054,39 +1953,34 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -2096,9 +1990,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2108,9 +2001,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2123,23 +2015,22 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2151,16 +2042,40 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2172,8 +2087,6 @@ }, "node_modules/fs-ext": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-ext/-/fs-ext-2.0.0.tgz", - "integrity": "sha512-aK8NlpSO5LUdSoWeshpnkgtptbua1rGo58Wc+mHQ2+JnoBlubMTsnV56Swl4bA0msrgAhG8TDu1aGS8deJwzBQ==", "hasInstallScript": true, "dependencies": { "nan": "^2.14.0" @@ -2184,9 +2097,8 @@ }, "node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2197,34 +2109,38 @@ } }, "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.0.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gauge": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, + "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -2241,18 +2157,16 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -2264,15 +2178,14 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -2285,9 +2198,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2297,15 +2209,13 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.22.0", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2337,10 +2247,9 @@ } }, "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", + "version": "11.8.6", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -2362,22 +2271,19 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "version": "4.2.11", + "dev": true, + "license": "ISC" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -2387,32 +2293,28 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "5.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "1", + "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, @@ -2422,9 +2324,8 @@ }, "node_modules/http2-wrapper": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -2435,9 +2336,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -2448,17 +2348,15 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -2469,8 +2367,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { @@ -2485,22 +2381,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2514,9 +2409,8 @@ }, "node_modules/import-local": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -2533,33 +2427,24 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2567,38 +2452,33 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ini-win": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ini-win/-/ini-win-3.0.3.tgz", - "integrity": "sha512-KeJ1TFx63JUNiAmJP/vcMG41mcOLs2g7mF5inWM9IxAwQuez/UNBBm2BOXwRL83eVM959s2ciOCAhCSezZf5Dw==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/interpret": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "version": "2.0.0", + "dev": true, + "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -2608,27 +2488,24 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2638,42 +2515,37 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-lambda": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -2683,9 +2555,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2695,24 +2566,38 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "2.3.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -2724,9 +2609,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2737,20 +2621,9 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2760,33 +2633,28 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -2796,9 +2664,8 @@ }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -2808,36 +2675,31 @@ }, "node_modules/jsonschema": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/keyv": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", - "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", + "version": "4.5.3", "dev": true, + "license": "MIT", "dependencies": { - "compress-brotli": "^1.3.6", "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2848,18 +2710,16 @@ }, "node_modules/loader-runner": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -2871,9 +2731,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -2886,15 +2745,13 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -2908,89 +2765,62 @@ }, "node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lzma-native": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz", - "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", + "version": "7.18.3", "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.1.0", - "node-gyp-build": "^4.2.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "lzmajs": "bin/lzmajs" - }, + "license": "ISC", "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "version": "11.1.1", "dev": true, + "license": "ISC", "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", + "negotiator": "^0.6.3", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -3001,18 +2831,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3022,27 +2850,24 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3051,22 +2876,17 @@ } }, "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "version": "5.0.0", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/minipass-collect": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3074,40 +2894,67 @@ "node": ">= 8" } }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/minipass-fetch": { + "version": "3.0.4", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.0.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/minipass-pipeline": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3115,11 +2962,21 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-sized": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -3127,11 +2984,21 @@ "node": ">=8" } }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -3140,11 +3007,21 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -3154,56 +3031,43 @@ }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "version": "2.18.0", + "license": "MIT" }, "node_modules/native-reg": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/native-reg/-/native-reg-1.1.1.tgz", - "integrity": "sha512-DmqwT6XC8MLwo8HaZey3bASf0aa/gHC7FAuKMjuf7fXa7FLXwz/khXGouKcmD1rXAfJME1XveKSM4+86wLkb1w==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-gyp-build": "4" } }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-abi": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz", - "integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==", + "version": "3.47.0", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -3211,25 +3075,17 @@ "node": ">=10" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, "node_modules/node-api-version": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -3246,16 +3102,16 @@ } }, "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "version": "9.4.0", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -3266,13 +3122,12 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": ">= 10.12.0" + "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "version": "4.6.1", + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -3281,9 +3136,8 @@ }, "node_modules/node-gyp/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -3296,9 +3150,8 @@ }, "node_modules/node-loader": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", - "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0" }, @@ -3314,40 +3167,36 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true + "version": "2.0.13", + "dev": true, + "license": "MIT" }, "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "6.0.0", "dev": true, + "license": "ISC", "dependencies": { - "abbrev": "1" + "abbrev": "^1.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3357,9 +3206,8 @@ }, "node_modules/npmlog": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, + "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -3372,18 +3220,16 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -3395,17 +3241,16 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", "dev": true, + "license": "MIT", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3413,9 +3258,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -3436,18 +3280,16 @@ }, "node_modules/p-cancelable": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3460,9 +3302,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -3475,9 +3316,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -3490,18 +3330,16 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -3511,45 +3349,40 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.3.tgz", - "integrity": "sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==", + "version": "1.10.1", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -3559,43 +3392,30 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "version": "10.0.1", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": "14 || >=16.14" } }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3605,9 +3425,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -3617,9 +3436,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3630,9 +3448,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3642,9 +3459,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3657,9 +3473,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3669,24 +3484,16 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, + "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -3697,27 +3504,23 @@ }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -3732,13 +3535,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3748,18 +3551,16 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3771,9 +3572,8 @@ }, "node_modules/rechoir": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -3783,29 +3583,26 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.6", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3818,15 +3615,13 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -3836,36 +3631,35 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -3876,30 +3670,28 @@ }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", "dev": true, "dependencies": { - "glob": "^9.2.0" + "glob": "^10.2.5" }, "bin": { "rimraf": "dist/cjs/src/bin.js" @@ -3921,15 +3713,19 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", - "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.5.tgz", + "integrity": "sha512-bYUpUD7XDEHI4Q2O5a7PXGvyw4deKR70kHiDxzQbe925wbZknhOzUt2xBgTkYL6RBcVeXYuD9iNYeqoWbBZQnA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -3939,33 +3735,22 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -3981,14 +3766,13 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -4003,36 +3787,66 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT", "optional": true }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4043,26 +3857,33 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { + "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -4072,9 +3893,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4084,18 +3904,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/slash": { "version": "3.0.0", @@ -4108,21 +3926,19 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.1", "dev": true, + "license": "MIT", "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -4131,10 +3947,9 @@ } }, "node_modules/socks-proxy-agent": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", - "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", + "version": "7.0.0", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -4146,49 +3961,66 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "version": "10.0.5", "dev": true, + "license": "ISC", "dependencies": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.0.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4200,9 +4032,20 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4212,9 +4055,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -4224,9 +4066,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4236,9 +4077,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4248,38 +4088,57 @@ }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "version": "6.2.0", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/terser": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.0.tgz", - "integrity": "sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg==", + "version": "5.20.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -4291,16 +4150,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.9", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -4324,17 +4182,32 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4344,14 +4217,24 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.4.4", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -4366,32 +4249,10 @@ "webpack": "^5.0.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4401,9 +4262,8 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4412,49 +4272,49 @@ } }, "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.2.2", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "version": "3.0.0", "dev": true, + "license": "ISC", "dependencies": { - "unique-slug": "^2.0.0" + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "version": "4.0.0", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", "dev": true, "funding": [ { @@ -4464,14 +4324,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -4479,29 +4344,25 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vscode-nls-i18n": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vscode-nls-i18n/-/vscode-nls-i18n-0.2.4.tgz", - "integrity": "sha512-1gf+s5qznJ6d5e5FavJ/sjzx/VdRMtZcVc8bjKo32mQPqAx+Bzgm0ur46/el1vAO4UGmCMQjlH8sHQdjEln7zQ==" + "license": "Apache 2.0" }, "node_modules/watchpack": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -4512,35 +4373,32 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.76.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", - "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", + "version": "5.88.2", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -4549,9 +4407,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -4572,17 +4430,16 @@ } }, "node_modules/webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", + "version": "5.1.4", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^9.4.1", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", @@ -4617,19 +4474,17 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "version": "10.0.1", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14" } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -4640,17 +4495,32 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -4658,9 +4528,8 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4673,33 +4542,38 @@ }, "node_modules/wide-align": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "version": "2.0.1", + "dev": true, + "license": "MIT" }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/wrap-ansi": { + "version": "7.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4714,56 +4588,50 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" }, "node_modules/yargs": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", - "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "version": "17.7.2", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "21.1.1", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4771,3454 +4639,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", - "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", - "dev": true - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/fs-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-ext/-/fs-ext-2.0.0.tgz", - "integrity": "sha512-v+rZ57B796XFBS4gbkYnmsmGdh8zDdcyFFtA+GqNdeD75MlS97m+hknE/JixwlxbpvPwUqoYraf3ePC6r+ByXw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true - }, - "@types/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "18.15.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.7.tgz", - "integrity": "sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/vscode": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.76.0.tgz", - "integrity": "sha512-CQcY3+Fe5hNewHnOEAVYj4dd1do/QHliXaknAEYSXx2KEHUzFibDZSKptCon+HPgK55xx20pR+PBJjf0MomnBA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.56.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "requires": {} - }, - "@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001434", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz", - "integrity": "sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "compress-brotli": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", - "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", - "dev": true, - "requires": { - "@types/json-buffer": "~3.0.0", - "json-buffer": "~3.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-rebuild": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-3.2.7.tgz", - "integrity": "sha512-WvaW1EgRinDQ61khHFZfx30rkPQG5ItaOT0wrI7iJv9A3SbghriQGfZQfHZs25fWLBe6/vkv05LOqg6aDw6Wzw==", - "dev": true, - "requires": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^1.0.3", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "lzma-native": "^8.0.5", - "node-abi": "^3.0.0", - "node-api-version": "^0.1.4", - "node-gyp": "^8.4.0", - "ora": "^5.1.0", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-ext/-/fs-ext-2.0.0.tgz", - "integrity": "sha512-aK8NlpSO5LUdSoWeshpnkgtptbua1rGo58Wc+mHQ2+JnoBlubMTsnV56Swl4bA0msrgAhG8TDu1aGS8deJwzBQ==", - "requires": { - "nan": "^2.14.0" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini-win": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ini-win/-/ini-win-3.0.3.tgz", - "integrity": "sha512-KeJ1TFx63JUNiAmJP/vcMG41mcOLs2g7mF5inWM9IxAwQuez/UNBBm2BOXwRL83eVM959s2ciOCAhCSezZf5Dw==" - }, - "interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==" - }, - "keyv": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.2.tgz", - "integrity": "sha512-uYS0vKTlBIjNCAUqrjlxmruxOEiZxZIHXyp32sdcGmP+ukFrmWUnE//RcPXJH3Vxrni1H2gsQbjHE0bH7MtMQQ==", - "dev": true, - "requires": { - "compress-brotli": "^1.3.6", - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lzma-native": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz", - "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", - "dev": true, - "requires": { - "node-addon-api": "^3.1.0", - "node-gyp-build": "^4.2.1", - "readable-stream": "^3.6.0" - } - }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" - }, - "native-reg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/native-reg/-/native-reg-1.1.1.tgz", - "integrity": "sha512-DmqwT6XC8MLwo8HaZey3bASf0aa/gHC7FAuKMjuf7fXa7FLXwz/khXGouKcmD1rXAfJME1XveKSM4+86wLkb1w==", - "requires": { - "node-gyp-build": "4" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-abi": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz", - "integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node-api-version": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==" - }, - "node-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", - "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-scurry": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.3.tgz", - "integrity": "sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g==", - "dev": true, - "requires": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - } - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "requires": { - "resolve": "^1.20.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "requires": { - "glob": "^9.2.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", - "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - } - }, - "minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", - "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "terser": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.0.tgz", - "integrity": "sha512-KjTV81QKStSfwbNiwlBXfcgMcOloyuRdb62/iLFPGBcVNF4EXjhdYBhYHmbJpiBrVxZhDvltE11j+LBQUxEEJg==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "vscode-nls-i18n": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vscode-nls-i18n/-/vscode-nls-i18n-0.2.4.tgz", - "integrity": "sha512-1gf+s5qznJ6d5e5FavJ/sjzx/VdRMtZcVc8bjKo32mQPqAx+Bzgm0ur46/el1vAO4UGmCMQjlH8sHQdjEln7zQ==" - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "webpack": { - "version": "5.76.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", - "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", - "colorette": "^2.0.14", - "commander": "^9.4.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", - "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/src/vscode-windhawk/package.json b/src/vscode-windhawk/package.json index c7d0d4e..7d7626a 100644 --- a/src/vscode-windhawk/package.json +++ b/src/vscode-windhawk/package.json @@ -2,7 +2,7 @@ "name": "windhawk", "displayName": "Windhawk", "description": "Part of the Windhawk Windows customization tool", - "version": "1.3.1", + "version": "1.4.0", "icon": "assets/main-icon.png", "publisher": "m417z", "engines": { @@ -396,6 +396,11 @@ "command": "", "when": "!config.windhawk.editedModId" }, + { + "key": "ctrl+k e", + "command": "", + "when": "!config.windhawk.editedModId" + }, { "key": "ctrl+k enter", "command": "", @@ -546,16 +551,36 @@ "command": "", "when": "!config.windhawk.editedModId" }, + { + "key": "ctrl+shift+d", + "command": "", + "when": "!config.windhawk.editedModId" + }, + { + "key": "ctrl+shift+e", + "command": "", + "when": "!config.windhawk.editedModId" + }, { "key": "ctrl+shift+f", "command": "", "when": "!config.windhawk.editedModId" }, + { + "key": "ctrl+shift+g", + "command": "", + "when": "!config.windhawk.editedModId" + }, { "key": "ctrl+shift+h", "command": "", "when": "!config.windhawk.editedModId" }, + { + "key": "ctrl+shift+m", + "command": "", + "when": "!config.windhawk.editedModId" + }, { "key": "ctrl+shift+n", "command": "", @@ -596,11 +621,26 @@ "command": "", "when": "!config.windhawk.editedModId" }, + { + "key": "ctrl+shift+u", + "command": "", + "when": "!config.windhawk.editedModId" + }, { "key": "ctrl+shift+w", "command": "", "when": "!config.windhawk.editedModId" }, + { + "key": "ctrl+shift+x", + "command": "", + "when": "!config.windhawk.editedModId" + }, + { + "key": "ctrl+shift+y", + "command": "", + "when": "!config.windhawk.editedModId" + }, { "key": "ctrl+shift+z", "command": "", @@ -723,27 +763,27 @@ "js-yaml": "^4.1.0", "jsonschema": "^1.4.1", "native-reg": "^1.1.1", - "node-fetch": "^2.6.9", - "semver": "^7.3.8", + "node-fetch": "^2.6.13", + "semver": "^7.5.4", "vscode-nls-i18n": "^0.2.4" }, "devDependencies": { - "@types/fs-ext": "^2.0.0", - "@types/js-yaml": "^4.0.5", - "@types/node": "^18.15.7", - "@types/node-fetch": "^2.6.2", - "@types/semver": "^7.3.13", + "@types/fs-ext": "^2.0.1", + "@types/js-yaml": "^4.0.6", + "@types/node": "^20.6.3", + "@types/node-fetch": "^2.6.5", + "@types/semver": "^7.5.2", "@types/vscode": "^1.74.2", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", "copy-webpack-plugin": "^11.0.0", - "electron-rebuild": "^3.2.7", - "eslint": "^8.36.0", + "@electron/rebuild": "^3.3.0", + "eslint": "^8.49.0", "node-loader": "^2.0.0", - "rimraf": "^4.4.1", - "ts-loader": "^9.4.2", - "typescript": "^5.0.2", - "webpack": "^5.76.3", - "webpack-cli": "^5.0.1" + "rimraf": "^5.0.1", + "ts-loader": "^9.4.4", + "typescript": "^5.2.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" } } diff --git a/src/vscode-windhawk/src/extension.ts b/src/vscode-windhawk/src/extension.ts index a6494f6..bd55572 100644 --- a/src/vscode-windhawk/src/extension.ts +++ b/src/vscode-windhawk/src/extension.ts @@ -52,6 +52,7 @@ type AppUtils = { const baseDebugReactUiPath: string | null = config.debug.reactProjectBuildPath; let windhawkLogOutput: WindhawkLogOutput | null = null; +let windhawkCompilerOutput: vscode.OutputChannel | null = null; export function activate(context: vscode.ExtensionContext) { if (!config.debug.disableEnvVarCheck && !process.env.WINDHAWK_UI_PATH) { @@ -63,6 +64,7 @@ export function activate(context: vscode.ExtensionContext) { i18n.init(context.extensionPath); windhawkLogOutput = new WindhawkLogOutput(path.join(context.extensionPath, 'files', 'DebugViewConsole.exe')); + windhawkCompilerOutput = vscode.window.createOutputChannel('Windhawk Compiler'); const paths = storagePaths.getStoragePaths(); const { appRootPath, appDataPath, enginePath, compilerPath } = paths.fsPaths; @@ -752,6 +754,9 @@ class WindhawkPanel { } | null = null; try { + windhawkCompilerOutput?.clear(); + windhawkCompilerOutput?.hide(); + const modId = data.modId; const modSource = data.modSource; const disabled = !!data.disabled; @@ -784,6 +789,7 @@ class WindhawkPanel { exclude: metadata.exclude || [], // includeCustom: [], // excludeCustom: [], + // includeExcludeCustomOnly: false, architecture: metadata.architecture || [], version: metadata.version || '' }, initialSettingsForEngine || {}); @@ -806,7 +812,7 @@ class WindhawkPanel { config }; } catch (e) { - reportException(e); + reportCompilerException(e, true); } this._panel.webview.postMessage({ @@ -828,6 +834,9 @@ class WindhawkPanel { } | null = null; try { + windhawkCompilerOutput?.clear(); + windhawkCompilerOutput?.hide(); + const modId = data.modId; const modSource = this._utils.modSource.getSource(modId); const disabled = !!data.disabled; @@ -835,7 +844,7 @@ class WindhawkPanel { const metadata = this._utils.modSource.extractMetadata(modSource, this._language); if (!metadata.id) { throw new Error('Mod id must be specified in the source code'); - } else if (metadata.id !== modId) { + } else if (metadata.id !== modId.replace(/^local@/, '')) { throw new Error('Mod id specified in the source code doesn\'t match'); } @@ -860,6 +869,7 @@ class WindhawkPanel { exclude: metadata.exclude || [], // includeCustom: [], // excludeCustom: [], + // includeExcludeCustomOnly: false, architecture: metadata.architecture || [], version: metadata.version || '' }, initialSettingsForEngine || {}); @@ -876,7 +886,7 @@ class WindhawkPanel { config }; } catch (e) { - reportException(e); + reportCompilerException(e, true); } this._panel.webview.postMessage({ @@ -996,7 +1006,7 @@ class WindhawkPanel { const metadata = this._utils.modSource.extractMetadata(modSource, this._language); if (!metadata.id) { throw new Error('Mod id must be specified in the source code'); - } else if (metadata.id !== data.modId) { + } else if (metadata.id !== data.modId.replace(/^local@/, '')) { throw new Error('Mod id specified in the source code doesn\'t match'); } @@ -1177,7 +1187,6 @@ class WindhawkViewProvider implements vscode.WebviewViewProvider { private readonly _extensionUri: vscode.Uri; private readonly _extensionPath: string; private readonly _utils: AppUtils; - private readonly _compilerOutputChannel: vscode.OutputChannel; private _language = 'en'; private _editedModId?: string; private _editedModWasModified = false; @@ -1192,7 +1201,6 @@ class WindhawkViewProvider implements vscode.WebviewViewProvider { this._extensionUri = extensionUri; this._extensionPath = extensionPath; this._utils = utils; - this._compilerOutputChannel = vscode.window.createOutputChannel('Windhawk Compiler'); } public resolveWebviewView( @@ -1414,7 +1422,7 @@ class WindhawkViewProvider implements vscode.WebviewViewProvider { let succeeded = false; try { - this._compilerOutputChannel.clear(); + windhawkCompilerOutput?.clear(); if (!this._editedModId) { throw new Error('No mod is being edited'); @@ -1465,6 +1473,7 @@ class WindhawkViewProvider implements vscode.WebviewViewProvider { exclude: metadata.exclude || [], // includeCustom: [], // excludeCustom: [], + // includeExcludeCustomOnly: false, architecture: metadata.architecture || [], version: metadata.version || '' }, initialSettingsForEngine || {}); @@ -1491,7 +1500,7 @@ class WindhawkViewProvider implements vscode.WebviewViewProvider { if (data.loggingEnabled) { windhawkLogOutput?.createOrShow(true); } else { - this._compilerOutputChannel.hide(); + windhawkCompilerOutput?.hide(); } WindhawkPanel.refreshIfExists('Preview', { @@ -1503,25 +1512,7 @@ class WindhawkViewProvider implements vscode.WebviewViewProvider { this._utils.editorWorkspace.markEditorModeModAsModified(false); succeeded = true; } catch (e) { - if (e instanceof CompilerError) { - try { - const stdout = fs.readFileSync(e.stdoutPath, 'utf8').trim(); - const stderr = fs.readFileSync(e.stderrPath, 'utf8').trim(); - let log = stdout; - if (stdout !== '') { - log += '\n\n'; - } - log += stderr + '\n'; - - this._compilerOutputChannel.append(log); - this._compilerOutputChannel.show(); - } catch (e) { - reportException(e); - } - } else { - reportException(e); - } - + reportCompilerException(e); this._editedModCompilationFailed = true; } @@ -1612,6 +1603,32 @@ function reportException(e: any) { vscode.window.showErrorMessage(e.message); } +function reportCompilerException(e: any, treatCompilationErrorAsException = false) { + if (!(e instanceof CompilerError)) { + reportException(e); + return; + } + + try { + const stdout = fs.readFileSync(e.stdoutPath, 'utf8').trim(); + const stderr = fs.readFileSync(e.stderrPath, 'utf8').trim(); + let log = stdout; + if (stdout !== '') { + log += '\n\n'; + } + log += stderr + '\n'; + + windhawkCompilerOutput?.append(log); + windhawkCompilerOutput?.show(); + + if (treatCompilationErrorAsException) { + reportException(e); + } + } catch (e) { + reportException(e); + } +} + // https://stackoverflow.com/a/6234804 function escapeHtml(unsafe: string) { return unsafe diff --git a/src/vscode-windhawk/src/utils/appSettingsUtils.ts b/src/vscode-windhawk/src/utils/appSettingsUtils.ts index 7387a6a..86b2248 100644 --- a/src/vscode-windhawk/src/utils/appSettingsUtils.ts +++ b/src/vscode-windhawk/src/utils/appSettingsUtils.ts @@ -13,14 +13,14 @@ export type AppSettings = { hideTrayIcon: boolean, dontAutoShowToolkit: boolean, modTasksDialogDelay: number, - injectIntoCriticalProcesses: boolean | null, safeMode: boolean, loggingVerbosity: number, engine: { loggingVerbosity: number, include: string[], exclude: string[], - threadAttachExempt: string[] + injectIntoCriticalProcesses: boolean, + loadModsInCriticalSystemProcesses: number } }; @@ -53,14 +53,14 @@ export class AppSettingsUtilsPortable implements AppSettingsUtils { hideTrayIcon: !!parseInt(iniFileParsed.Settings?.HideTrayIcon ?? '0', 10), dontAutoShowToolkit: !!parseInt(iniFileParsed.Settings?.DontAutoShowToolkit ?? '0', 10), modTasksDialogDelay: parseInt(iniFileParsed.Settings?.ModTasksDialogDelay ?? '2000', 10), - injectIntoCriticalProcesses: null, safeMode: !!parseInt(iniFileParsed.Settings?.SafeMode ?? '0', 10), loggingVerbosity: parseInt(iniFileParsed.Settings?.LoggingVerbosity ?? '0', 10), engine: { loggingVerbosity: parseInt(engineIniFileParsed.Settings?.LoggingVerbosity ?? '0', 10), include: (engineIniFileParsed.Settings?.Include || '').split('|'), exclude: (engineIniFileParsed.Settings?.Exclude || '').split('|'), - threadAttachExempt: (engineIniFileParsed.Settings?.ThreadAttachExempt || '').split('|') + injectIntoCriticalProcesses: !!parseInt(engineIniFileParsed.Settings?.InjectIntoCriticalProcesses ?? '0', 10), + loadModsInCriticalSystemProcesses: parseInt(engineIniFileParsed.Settings?.LoadModsInCriticalSystemProcesses ?? '1', 10) } }; } @@ -94,9 +94,6 @@ export class AppSettingsUtilsPortable implements AppSettingsUtils { if (appSettings.modTasksDialogDelay !== undefined) { iniFileParsed.Settings.ModTasksDialogDelay = appSettings.modTasksDialogDelay.toString(); } - if (appSettings.injectIntoCriticalProcesses !== undefined && appSettings.injectIntoCriticalProcesses !== null) { - throw new Error('Cannot set injectIntoCriticalProcesses in portable mode'); - } if (appSettings.safeMode !== undefined) { iniFileParsed.Settings.SafeMode = appSettings.safeMode ? '1' : '0'; } @@ -120,8 +117,11 @@ export class AppSettingsUtilsPortable implements AppSettingsUtils { if (appSettings.engine.exclude !== undefined) { engineIniFileParsed.Settings.Exclude = appSettings.engine.exclude.join('|'); } - if (appSettings.engine.threadAttachExempt !== undefined) { - engineIniFileParsed.Settings.ThreadAttachExempt = appSettings.engine.threadAttachExempt.join('|'); + if (appSettings.engine.injectIntoCriticalProcesses !== undefined) { + engineIniFileParsed.Settings.InjectIntoCriticalProcesses = appSettings.engine.injectIntoCriticalProcesses ? '1' : '0'; + } + if (appSettings.engine.loadModsInCriticalSystemProcesses !== undefined) { + engineIniFileParsed.Settings.LoadModsInCriticalSystemProcesses = appSettings.engine.loadModsInCriticalSystemProcesses.toString(); } ini.toFile(this.engineSettingsIniPath, engineIniFileParsed); @@ -129,10 +129,9 @@ export class AppSettingsUtilsPortable implements AppSettingsUtils { } public shouldRestartApp(appSettings: Partial) { - return appSettings.injectIntoCriticalProcesses !== undefined || - appSettings.safeMode !== undefined || + return appSettings.safeMode !== undefined || appSettings.loggingVerbosity !== undefined || - appSettings.engine !== undefined; + (appSettings.engine !== undefined && Object.keys(appSettings.engine).length > 0); } public shouldNotifyTrayProgram(appSettings: Partial) { @@ -170,14 +169,14 @@ export class AppSettingsUtilsNonPortable implements AppSettingsUtils { hideTrayIcon: !!reg.getValue(key, null, 'HideTrayIcon', reg.GetValueFlags.RT_REG_DWORD), dontAutoShowToolkit: !!reg.getValue(key, null, 'DontAutoShowToolkit', reg.GetValueFlags.RT_REG_DWORD), modTasksDialogDelay: (reg.getValue(key, null, 'ModTasksDialogDelay', reg.GetValueFlags.RT_REG_DWORD) ?? 2000) as number, - injectIntoCriticalProcesses: !!reg.getValue(key, null, 'InjectIntoCriticalProcesses', reg.GetValueFlags.RT_REG_DWORD), safeMode: !!reg.getValue(key, null, 'SafeMode', reg.GetValueFlags.RT_REG_DWORD), loggingVerbosity: (reg.getValue(key, null, 'LoggingVerbosity', reg.GetValueFlags.RT_REG_DWORD) ?? 0) as number, engine: { loggingVerbosity: (reg.getValue(engineKey, null, 'LoggingVerbosity', reg.GetValueFlags.RT_REG_DWORD) ?? 0) as number, include: ((reg.getValue(engineKey, null, 'Include', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), exclude: ((reg.getValue(engineKey, null, 'Exclude', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), - threadAttachExempt: ((reg.getValue(engineKey, null, 'ThreadAttachExempt', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|') + injectIntoCriticalProcesses: !!reg.getValue(engineKey, null, 'InjectIntoCriticalProcesses', reg.GetValueFlags.RT_REG_DWORD), + loadModsInCriticalSystemProcesses: (reg.getValue(engineKey, null, 'LoadModsInCriticalSystemProcesses', reg.GetValueFlags.RT_REG_DWORD) ?? 1) as number, } }; } finally { @@ -221,9 +220,6 @@ export class AppSettingsUtilsNonPortable implements AppSettingsUtils { if (appSettings.modTasksDialogDelay !== undefined) { reg.setValueDWORD(key, 'ModTasksDialogDelay', appSettings.modTasksDialogDelay); } - if (appSettings.injectIntoCriticalProcesses !== undefined) { - reg.setValueDWORD(key, 'InjectIntoCriticalProcesses', appSettings.injectIntoCriticalProcesses ? 1 : 0); - } if (appSettings.safeMode !== undefined) { reg.setValueDWORD(key, 'SafeMode', appSettings.safeMode ? 1 : 0); } @@ -247,8 +243,11 @@ export class AppSettingsUtilsNonPortable implements AppSettingsUtils { if (appSettings.engine.exclude !== undefined) { reg.setValueSZ(engineKey, 'Exclude', appSettings.engine.exclude.join('|')); } - if (appSettings.engine.threadAttachExempt !== undefined) { - reg.setValueSZ(engineKey, 'ThreadAttachExempt', appSettings.engine.threadAttachExempt.join('|')); + if (appSettings.engine.injectIntoCriticalProcesses !== undefined) { + reg.setValueDWORD(engineKey, 'InjectIntoCriticalProcesses', appSettings.engine.injectIntoCriticalProcesses ? 1 : 0); + } + if (appSettings.engine.loadModsInCriticalSystemProcesses !== undefined) { + reg.setValueDWORD(engineKey, 'LoadModsInCriticalSystemProcesses', appSettings.engine.loadModsInCriticalSystemProcesses); } } finally { reg.closeKey(engineKey); @@ -257,10 +256,9 @@ export class AppSettingsUtilsNonPortable implements AppSettingsUtils { } public shouldRestartApp(appSettings: Partial) { - return appSettings.injectIntoCriticalProcesses !== undefined || - appSettings.safeMode !== undefined || + return appSettings.safeMode !== undefined || appSettings.loggingVerbosity !== undefined || - appSettings.engine !== undefined; + (appSettings.engine !== undefined && Object.keys(appSettings.engine).length > 0); } public shouldNotifyTrayProgram(appSettings: Partial) { diff --git a/src/vscode-windhawk/src/utils/compilerUtils.ts b/src/vscode-windhawk/src/utils/compilerUtils.ts index b94bfce..83d14f2 100644 --- a/src/vscode-windhawk/src/utils/compilerUtils.ts +++ b/src/vscode-windhawk/src/utils/compilerUtils.ts @@ -35,6 +35,62 @@ export default class CompilerUtils { return fs.existsSync(compiledModPath); } + private async makePrecompiledHeaders( + pchHeaderPath: string, + targetPchPath: string, + bits: number, + stdoutOutputPath: string, + stderrOutputPath: string, + modId: string, + modVersion: string, + extraArgs: string[], + ) : Promise { + const gppPath = path.join(this.compilerPath, 'bin', 'g++.exe'); + + const args = [ + '-std=c++20', + '-O2', + '-DUNICODE', + '-D_UNICODE', + '-D__USE_MINGW_ANSI_STDIO=0', + '-DWH_MOD', + '-DWH_MOD_ID=L"' + modId.replace(/"/g, '\\"') + '"', + '-DWH_MOD_VERSION=L"' + modVersion.replace(/"/g, '\\"') + '"', + '-x', + 'c++-header', + pchHeaderPath, + '-target', + bits === 64 ? 'x86_64-w64-mingw32' : 'i686-w64-mingw32', + '-o', + targetPchPath, + ...extraArgs.filter(arg => arg.startsWith('-D')) + ]; + const ps = child_process.spawn(gppPath, args, { + cwd: this.compilerPath + }); + + fs.writeFileSync(stdoutOutputPath, ''); + fs.writeFileSync(stderrOutputPath, ''); + + ps.stdout.on('data', data => { + fs.appendFileSync(stdoutOutputPath, data); + }); + + ps.stderr.on('data', data => { + fs.appendFileSync(stderrOutputPath, data); + }); + + return new Promise((resolve, reject) => { + ps.on('error', err => { + reject(err); + }); + + ps.on('close', code => { + resolve(code); + }); + }); + } + private async compileModInternal( modSourcePath: string, targetDllName: string, @@ -43,7 +99,8 @@ export default class CompilerUtils { stderrOutputPath: string, modId: string, modVersion: string, - extraArgs: string[] + extraArgs: string[], + pchPath?: string ) : Promise { const gppPath = path.join(this.compilerPath, 'bin', 'g++.exe'); const engineLibPath = path.join(this.enginePath, bits.toString(), 'windhawk.lib'); @@ -57,6 +114,7 @@ export default class CompilerUtils { '-shared', '-DUNICODE', '-D_UNICODE', + '-D__USE_MINGW_ANSI_STDIO=0', '-DWH_MOD', '-DWH_MOD_ID=L"' + modId.replace(/"/g, '\\"') + '"', '-DWH_MOD_VERSION=L"' + modVersion.replace(/"/g, '\\"') + '"', @@ -68,6 +126,7 @@ export default class CompilerUtils { bits === 64 ? 'x86_64-w64-mingw32' : 'i686-w64-mingw32', '-o', compiledModPath, + ...(pchPath ? ['-include-pch', pchPath] : []), ...extraArgs ]; const ps = child_process.spawn(gppPath, args, { @@ -78,23 +137,19 @@ export default class CompilerUtils { fs.writeFileSync(stderrOutputPath, ''); ps.stdout.on('data', data => { - //console.log(`ps stdout: ${data}`); fs.appendFileSync(stdoutOutputPath, data); }); ps.stderr.on('data', data => { - //console.log(`ps stderr: ${data}`); fs.appendFileSync(stderrOutputPath, data); }); return new Promise((resolve, reject) => { ps.on('error', err => { - //console.log('Oh no, the error: ' + err); reject(err); }); ps.on('close', code => { - //console.log(`ps process exited with code ${code}`); resolve(code); }); }); @@ -230,45 +285,55 @@ export default class CompilerUtils { let compilerOptionsArray: string[] = []; if (compilerOptions && compilerOptions.trim() !== '') { - if (compilerOptions.includes('"')) { - // Support can be added later, for now reject such input. - throw new Error('Compiler options can\'t contain quotes'); - } - - compilerOptionsArray = compilerOptions.trim().split(/\s+/); + compilerOptionsArray = splitargs(compilerOptions); } - if (!architecture || architecture.includes('x86')) { - const result = await this.compileModInternal( - workspacePaths.modSourcePath, - targetDllName, - 32, - workspacePaths.stdoutOutputPath, - workspacePaths.stderrOutputPath, - modId, - modVersion, - compilerOptionsArray - ); - if (result !== 0) { - throw new CompilerError( - workspacePaths.stdoutOutputPath, - workspacePaths.stderrOutputPath - ); + const allArchitectures: {[key: string]: number} = { + 'x86': 32, + 'x86-64': 64 + }; + + for (const arch of architecture || Object.keys(allArchitectures)) { + const bits = allArchitectures[arch]; + if (!bits) { + throw new Error('Unknown architecture: ' + arch); } - this.copyCompilerLibs(32); - } + let pchPath: string | undefined = undefined; + const pchHeaderPath = path.join(path.dirname(workspacePaths.modSourcePath), 'pch.h'); + if (fs.existsSync(pchHeaderPath)) { + pchPath = path.join(path.dirname(workspacePaths.modSourcePath), arch + '.pch'); + if (!fs.existsSync(pchPath) || + fs.statSync(pchPath).mtimeMs < fs.statSync(pchHeaderPath).mtimeMs) { + const result = await this.makePrecompiledHeaders( + pchHeaderPath, + pchPath, + bits, + workspacePaths.stdoutOutputPath, + workspacePaths.stderrOutputPath, + modId, + modVersion, + compilerOptionsArray + ); + if (result !== 0) { + throw new CompilerError( + workspacePaths.stdoutOutputPath, + workspacePaths.stderrOutputPath + ); + } + } + } - if (!architecture || architecture.includes('x86-64')) { const result = await this.compileModInternal( workspacePaths.modSourcePath, targetDllName, - 64, + bits, workspacePaths.stdoutOutputPath, workspacePaths.stderrOutputPath, modId, modVersion, - compilerOptionsArray + compilerOptionsArray, + pchPath ); if (result !== 0) { throw new CompilerError( @@ -277,7 +342,7 @@ export default class CompilerUtils { ); } - this.copyCompilerLibs(64); + this.copyCompilerLibs(bits); } return { @@ -296,3 +361,48 @@ export default class CompilerUtils { function randomIntFromInterval(min: number, max: number) { return Math.floor(Math.random() * (max - min + 1) + min); } + +// https://github.com/elgs/splitargs +function splitargs(input: string, sep?: RegExp, keepQuotes?: boolean) { + const separator = sep || /\s/g; + let singleQuoteOpen = false; + let doubleQuoteOpen = false; + let tokenBuffer = []; + const ret = []; + + const arr = input.split(''); + for (let i = 0; i < arr.length; ++i) { + const element = arr[i]; + const matches = element.match(separator); + if (element === "'" && !doubleQuoteOpen) { + if (keepQuotes === true) { + tokenBuffer.push(element); + } + singleQuoteOpen = !singleQuoteOpen; + continue; + } else if (element === '"' && !singleQuoteOpen) { + if (keepQuotes === true) { + tokenBuffer.push(element); + } + doubleQuoteOpen = !doubleQuoteOpen; + continue; + } + + if (!singleQuoteOpen && !doubleQuoteOpen && matches) { + if (tokenBuffer.length > 0) { + ret.push(tokenBuffer.join('')); + tokenBuffer = []; + } else if (sep) { + ret.push(element); + } + } else { + tokenBuffer.push(element); + } + } + if (tokenBuffer.length > 0) { + ret.push(tokenBuffer.join('')); + } else if (sep) { + ret.push(''); + } + return ret; +} diff --git a/src/vscode-windhawk/src/utils/editorWorkspaceUtils.ts b/src/vscode-windhawk/src/utils/editorWorkspaceUtils.ts index a1e498e..82e6a3f 100644 --- a/src/vscode-windhawk/src/utils/editorWorkspaceUtils.ts +++ b/src/vscode-windhawk/src/utils/editorWorkspaceUtils.ts @@ -46,10 +46,15 @@ export default class EditorWorkspaceUtils { 'i686-w64-mingw32', '-DUNICODE', '-D_UNICODE', + '-D__USE_MINGW_ANSI_STDIO=0', '-DWH_MOD', '-DWH_EDITING', '-include', 'windhawk_api.h', + '-Wall', + '-Wextra', + '-Wno-unused-parameter', + '-Wno-missing-field-initializers', ]; fs.writeFileSync(this.getFilePath('compile_flags.txt'), compileFlags.join('\n') + '\n'); diff --git a/src/vscode-windhawk/src/utils/modConfigUtils.ts b/src/vscode-windhawk/src/utils/modConfigUtils.ts index 442afdf..28c7fb7 100644 --- a/src/vscode-windhawk/src/utils/modConfigUtils.ts +++ b/src/vscode-windhawk/src/utils/modConfigUtils.ts @@ -17,6 +17,7 @@ type ModConfig = { exclude: string[], includeCustom: string[], excludeCustom: string[], + includeExcludeCustomOnly: boolean, architecture: string[], version: string }; @@ -109,6 +110,7 @@ export class ModConfigUtilsPortable implements ModConfigUtils { exclude: (modConfig.Mod.Exclude ?? '').split('|'), includeCustom: (modConfig.Mod.IncludeCustom ?? '').split('|'), excludeCustom: (modConfig.Mod.ExcludeCustom ?? '').split('|'), + includeExcludeCustomOnly: !!parseInt(modConfig.Mod.IncludeExcludeCustomOnly ?? '0', 10), architecture: (modConfig.Mod.Architecture ?? '').split('|'), version: modConfig.Mod.Version ?? '' }; @@ -145,6 +147,7 @@ export class ModConfigUtilsPortable implements ModConfigUtils { exclude: (modConfig.Mod.Exclude ?? '').split('|'), includeCustom: (modConfig.Mod.IncludeCustom ?? '').split('|'), excludeCustom: (modConfig.Mod.ExcludeCustom ?? '').split('|'), + includeExcludeCustomOnly: !!parseInt(modConfig.Mod.IncludeExcludeCustomOnly ?? '0', 10), architecture: (modConfig.Mod.Architecture ?? '').split('|'), version: modConfig.Mod.Version ?? '' }; @@ -192,6 +195,9 @@ export class ModConfigUtilsPortable implements ModConfigUtils { if (config.excludeCustom !== undefined) { modConfig.Mod.ExcludeCustom = config.excludeCustom.join('|'); } + if (config.includeExcludeCustomOnly !== undefined) { + modConfig.Mod.IncludeExcludeCustomOnly = config.includeExcludeCustomOnly ? '1' : '0'; + } if (config.architecture !== undefined) { modConfig.Mod.Architecture = config.architecture.join('|'); } @@ -343,6 +349,7 @@ export class ModConfigUtilsNonPortable implements ModConfigUtils { exclude: ((reg.getValue(key, modId, 'Exclude', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), includeCustom: ((reg.getValue(key, modId, 'IncludeCustom', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), excludeCustom: ((reg.getValue(key, modId, 'ExcludeCustom', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), + includeExcludeCustomOnly: !!reg.getValue(key, modId, 'IncludeExcludeCustomOnly', reg.GetValueFlags.RT_REG_DWORD), architecture: ((reg.getValue(key, modId, 'Architecture', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), version: (reg.getValue(key, modId, 'Version', reg.GetValueFlags.RT_REG_SZ) ?? '') as string }; @@ -391,6 +398,7 @@ export class ModConfigUtilsNonPortable implements ModConfigUtils { exclude: ((reg.getValue(key, null, 'Exclude', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), includeCustom: ((reg.getValue(key, null, 'IncludeCustom', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), excludeCustom: ((reg.getValue(key, null, 'ExcludeCustom', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), + includeExcludeCustomOnly: !!reg.getValue(key, null, 'IncludeExcludeCustomOnly', reg.GetValueFlags.RT_REG_DWORD), architecture: ((reg.getValue(key, null, 'Architecture', reg.GetValueFlags.RT_REG_SZ) ?? '') as string).split('|'), version: (reg.getValue(key, null, 'Version', reg.GetValueFlags.RT_REG_SZ) ?? '') as string }; @@ -434,6 +442,9 @@ export class ModConfigUtilsNonPortable implements ModConfigUtils { if (config.excludeCustom !== undefined) { reg.setValueSZ(key, 'ExcludeCustom', config.excludeCustom.join('|')); } + if (config.includeExcludeCustomOnly !== undefined) { + reg.setValueDWORD(key, 'IncludeExcludeCustomOnly', config.includeExcludeCustomOnly ? 1 : 0); + } if (config.architecture !== undefined) { reg.setValueSZ(key, 'Architecture', config.architecture.join('|')); } diff --git a/src/vscode-windhawk/src/utils/modSourceUtils.ts b/src/vscode-windhawk/src/utils/modSourceUtils.ts index 097d330..cbd327a 100644 --- a/src/vscode-windhawk/src/utils/modSourceUtils.ts +++ b/src/vscode-windhawk/src/utils/modSourceUtils.ts @@ -317,7 +317,7 @@ export default class ModSourceUtils { "minProperties": 1, "additionalProperties": false, "patternProperties": { - "^[0-9A-Za-z-]+$": { + "^[0-9A-Za-z_-]+$": { "anyOf": [ { "type": "boolean" }, { "type": "number" }, diff --git a/src/vscode-windhawk/src/utils/userProfileUtils.ts b/src/vscode-windhawk/src/utils/userProfileUtils.ts index 2f7cadc..2f0cc19 100644 --- a/src/vscode-windhawk/src/utils/userProfileUtils.ts +++ b/src/vscode-windhawk/src/utils/userProfileUtils.ts @@ -37,7 +37,15 @@ export class UserProfile { } } - const userProfile = userProfileText ? JSON.parse(userProfileText) : {}; + let userProfile: any = {}; + if (userProfileText) { + try { + userProfile = JSON.parse(userProfileText); + } catch (e) { + // Ignore if file is invalid. + } + } + userProfile.app = userProfile.app || {}; userProfile.mods = userProfile.mods || {}; diff --git a/src/vscode-windhawk/src/webviewIPCMessages.ts b/src/vscode-windhawk/src/webviewIPCMessages.ts index 50c7383..8aa937d 100644 --- a/src/vscode-windhawk/src/webviewIPCMessages.ts +++ b/src/vscode-windhawk/src/webviewIPCMessages.ts @@ -61,6 +61,7 @@ export type ModConfig = { exclude: string[]; includeCustom: string[]; excludeCustom: string[]; + includeExcludeCustomOnly: boolean; architecture: string[]; version: string; }; @@ -74,14 +75,14 @@ export type AppSettings = { hideTrayIcon: boolean; dontAutoShowToolkit: boolean; modTasksDialogDelay: number; - injectIntoCriticalProcesses: boolean | null; safeMode: boolean; loggingVerbosity: number; engine: { loggingVerbosity: number; include: string[]; exclude: string[]; - threadAttachExempt: string[]; + injectIntoCriticalProcesses: boolean; + loadModsInCriticalSystemProcesses: number; }; }; diff --git a/src/windhawk/app/engine_control.cpp b/src/windhawk/app/engine_control.cpp index 681a49c..6773d81 100644 --- a/src/windhawk/app/engine_control.cpp +++ b/src/windhawk/app/engine_control.cpp @@ -4,7 +4,7 @@ #include "storage_manager.h" -EngineControl::EngineControl(bool skipCriticalProcesses) { +EngineControl::EngineControl() { auto engineLibraryPath = StorageManager::GetInstance().GetEnginePath() / L"windhawk.dll"; @@ -25,7 +25,7 @@ EngineControl::EngineControl(bool skipCriticalProcesses) { GetProcAddress(engineModule.get(), "GlobalHookSessionEnd")); THROW_LAST_ERROR_IF_NULL(pGlobalHookSessionEnd); - hGlobalHookSession = pGlobalHookSessionStart(skipCriticalProcesses); + hGlobalHookSession = pGlobalHookSessionStart(); if (!hGlobalHookSession) { throw std::runtime_error("Failed to start the global hooking session"); } diff --git a/src/windhawk/app/engine_control.h b/src/windhawk/app/engine_control.h index 53fef99..7e52d46 100644 --- a/src/windhawk/app/engine_control.h +++ b/src/windhawk/app/engine_control.h @@ -2,7 +2,7 @@ class EngineControl { public: - EngineControl(bool skipCriticalProcesses); + EngineControl(); ~EngineControl(); EngineControl(const EngineControl&) = delete; @@ -13,7 +13,7 @@ class EngineControl { BOOL HandleNewProcesses(); private: - using GLOBAL_HOOK_SESSION_START = HANDLE (*)(bool skipCriticalProcesses); + using GLOBAL_HOOK_SESSION_START = HANDLE (*)(); using GLOBAL_HOOK_SESSION_HANDLE_NEW_PROCESSES = BOOL (*)(HANDLE hSession); using GLOBAL_HOOK_SESSION_END = BOOL (*)(HANDLE hSession); diff --git a/src/windhawk/app/functions.cpp b/src/windhawk/app/functions.cpp index cf40544..9eee937 100644 --- a/src/windhawk/app/functions.cpp +++ b/src/windhawk/app/functions.cpp @@ -115,4 +115,155 @@ std::vector SplitString(std::wstring_view s, WCHAR delim) { return std::vector(view.begin(), view.end()); } +UINT GetDpiForWindowWithFallback(HWND hWnd) { + using GetDpiForWindow_t = UINT(WINAPI*)(HWND hwnd); + static GetDpiForWindow_t pGetDpiForWindow = []() { + HMODULE hUser32 = GetModuleHandle(L"user32.dll"); + if (hUser32) { + return (GetDpiForWindow_t)GetProcAddress(hUser32, + "GetDpiForWindow"); + } + + return (GetDpiForWindow_t) nullptr; + }(); + + int iDpi = 96; + if (pGetDpiForWindow) { + iDpi = pGetDpiForWindow(hWnd); + } else { + CDC hdc = ::GetDC(NULL); + if (hdc) { + iDpi = hdc.GetDeviceCaps(LOGPIXELSX); + } + } + + return iDpi; +} + +int GetSystemMetricsForDpiWithFallback(int nIndex, UINT dpi) { + using GetSystemMetricsForDpi_t = int(WINAPI*)(int nIndex, UINT dpi); + static GetSystemMetricsForDpi_t pGetSystemMetricsForDpi = []() { + HMODULE hUser32 = GetModuleHandle(L"user32.dll"); + if (hUser32) { + return (GetSystemMetricsForDpi_t)GetProcAddress( + hUser32, "GetSystemMetricsForDpi"); + } + + return (GetSystemMetricsForDpi_t) nullptr; + }(); + + if (pGetSystemMetricsForDpi) { + return pGetSystemMetricsForDpi(nIndex, dpi); + } else { + return GetSystemMetrics(nIndex); + } +} + +int GetSystemMetricsForWindow(HWND hWnd, int nIndex) { + return GetSystemMetricsForDpiWithFallback( + nIndex, GetDpiForWindowWithFallback(hWnd)); +} + +bool IsProcessFrozen(HANDLE hProcess) { + // https://github.com/winsiderss/systeminformer/blob/044957137e1d7200431926130ea7cd6bf9d8a11f/phnt/include/ntpsapi.h#L303-L334 + typedef struct _PROCESS_BASIC_INFORMATION { + NTSTATUS ExitStatus; + /*PPEB*/ LPVOID PebBaseAddress; + ULONG_PTR AffinityMask; + /*KPRIORITY*/ LONG BasePriority; + HANDLE UniqueProcessId; + HANDLE InheritedFromUniqueProcessId; + } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; + + typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION { + SIZE_T Size; // set to sizeof structure on input + PROCESS_BASIC_INFORMATION BasicInfo; + union { + ULONG Flags; + struct { + ULONG IsProtectedProcess : 1; + ULONG IsWow64Process : 1; + ULONG IsProcessDeleting : 1; + ULONG IsCrossSessionCreate : 1; + ULONG IsFrozen : 1; + ULONG IsBackground : 1; + ULONG IsStronglyNamed : 1; + ULONG IsSecureProcess : 1; + ULONG IsSubsystemProcess : 1; + ULONG SpareBits : 23; + }; + }; + } PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION; + + using NtQueryInformationProcess_t = NTSTATUS(WINAPI*)( + _In_ HANDLE ProcessHandle, + _In_ /*PROCESSINFOCLASS*/ DWORD ProcessInformationClass, + _Out_writes_bytes_(ProcessInformationLength) PVOID ProcessInformation, + _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength); + static NtQueryInformationProcess_t pNtQueryInformationProcess = []() { + HMODULE hNtdll = LoadLibrary(L"ntdll.dll"); + if (hNtdll) { + return (NtQueryInformationProcess_t)GetProcAddress( + hNtdll, "NtQueryInformationProcess"); + } + + return (NtQueryInformationProcess_t) nullptr; + }(); + + if (!pNtQueryInformationProcess) { + return false; + } + + PROCESS_EXTENDED_BASIC_INFORMATION pebi; + if (0 <= pNtQueryInformationProcess(hProcess, /*ProcessBasicInformation*/ 0, + &pebi, sizeof(pebi), 0) && + pebi.Size >= sizeof(pebi)) { + return pebi.IsFrozen != 0; + } + + return false; +} + +void GetNtVersionNumbers(ULONG* pNtMajorVersion, + ULONG* pNtMinorVersion, + ULONG* pNtBuildNumber) { + using RtlGetNtVersionNumbers_t = + void(WINAPI*)(ULONG * pNtMajorVersion, ULONG * pNtMinorVersion, + ULONG * pNtBuildNumber); + static RtlGetNtVersionNumbers_t pRtlGetNtVersionNumbers = []() { + HMODULE hNtdll = GetModuleHandle(L"ntdll.dll"); + if (hNtdll) { + return (RtlGetNtVersionNumbers_t)GetProcAddress( + hNtdll, "RtlGetNtVersionNumbers"); + } + + return (RtlGetNtVersionNumbers_t) nullptr; + }(); + + if (pRtlGetNtVersionNumbers) { + pRtlGetNtVersionNumbers(pNtMajorVersion, pNtMinorVersion, + pNtBuildNumber); + // The upper 4 bits are reserved for the type of the OS build. + // https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is-running-on + *pNtBuildNumber &= ~0xF0000000; + return; + } + + // Use GetVersionEx as a fallback. +#pragma warning(push) +#pragma warning(disable : 4996) // disable deprecation message + OSVERSIONINFO versionInfo = {sizeof(OSVERSIONINFO)}; + if (GetVersionEx(&versionInfo)) { + *pNtMajorVersion = versionInfo.dwMajorVersion; + *pNtMinorVersion = versionInfo.dwMinorVersion; + *pNtBuildNumber = versionInfo.dwBuildNumber; + return; + } +#pragma warning(pop) + + *pNtMajorVersion = 0; + *pNtMinorVersion = 0; + *pNtBuildNumber = 0; +} + } // namespace Functions diff --git a/src/windhawk/app/functions.h b/src/windhawk/app/functions.h index 9758538..95ff6db 100644 --- a/src/windhawk/app/functions.h +++ b/src/windhawk/app/functions.h @@ -9,5 +9,16 @@ HANDLE CreateEventForMediumIntegrity(PCWSTR eventName, BOOL IsRunAsAdmin(); PCWSTR LoadStrFromRsrc(UINT uStrId); std::vector SplitString(std::wstring_view s, WCHAR delim); +UINT GetDpiForWindowWithFallback(HWND hWnd); +int GetSystemMetricsForDpiWithFallback(int nIndex, UINT dpi); +int GetSystemMetricsForWindow(HWND hWnd, int nIndex); + +// Returns true for suspended UWP processes. +// https://stackoverflow.com/a/50173965 +bool IsProcessFrozen(HANDLE hProcess); + +void GetNtVersionNumbers(ULONG* pNtMajorVersion, + ULONG* pNtMinorVersion, + ULONG* pNtBuildNumber); } // namespace Functions diff --git a/src/windhawk/app/main_window.cpp b/src/windhawk/app/main_window.cpp index 5e36bfc..02074f7 100644 --- a/src/windhawk/app/main_window.cpp +++ b/src/windhawk/app/main_window.cpp @@ -15,32 +15,6 @@ constexpr auto kUpdateInitialDelay = 1000 * 10; // 10sec constexpr auto kUpdateInterval = 1000 * 60 * 60 * 24; // 24h constexpr auto kUpdateRetryTime = 1000 * 60 * 60; // 1h -// Temporary, pending to be merged to WIL. -// https://github.com/microsoft/wil/pull/313 -template -HRESULT GetWindowsDirectoryW(string_type& result) WI_NOEXCEPT { - return wil::AdaptFixedSizeToAllocatedResult( - result, - [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, - _Out_ size_t* valueLengthNeededWithNul) -> HRESULT { - *valueLengthNeededWithNul = - ::GetWindowsDirectoryW(value, static_cast(valueLength)); - RETURN_LAST_ERROR_IF(*valueLengthNeededWithNul == 0); - if (*valueLengthNeededWithNul < valueLength) { - (*valueLengthNeededWithNul)++; // it fit, account for the null - } - return S_OK; - }); -} -template -string_type GetWindowsDirectoryW() { - string_type result; - THROW_IF_FAILED( - (GetWindowsDirectoryW(result))); - return result; -} - } // namespace CMainWindow::CMainWindow(bool trayOnly, bool portable) @@ -473,8 +447,16 @@ LRESULT CMainWindow::OnTaskbarCreated(UINT uMsg, WPARAM wParam, LPARAM lParam) { // m_toolkitDlg->Close(); // } + // Reload icons since the DPI might have changed. From the documentation: + // "On Windows 10, the taskbar also broadcasts this message when the DPI of + // the primary display changes." + m_trayIcon->UpdateIcons(m_hWnd); + m_trayIcon->Create(); + // Necessary to apply the newly loaded icon in Windows 11 22H2. + m_trayIcon->Modify(); + return 0; } @@ -494,7 +476,7 @@ void CMainWindow::InitForPortableVersion() { StorageManager::GetInstance().GetAppConfig(L"Settings", false); if (!settings->GetInt(L"SafeMode").value_or(0)) { - m_engineControl.emplace(/*skipCriticalProcesses=*/false); + m_engineControl.emplace(); m_engineControl->HandleNewProcesses(); } @@ -655,10 +637,8 @@ void CMainWindow::LoadSettings() { if (dontAutoShowToolkit != m_dontAutoShowToolkit) { if (!dontAutoShowToolkit) { try { - std::wstring explorerPath; - THROW_IF_FAILED( - GetWindowsDirectoryW(explorerPath)); - explorerPath += L"\\explorer.exe"; + auto explorerPath = wil::GetWindowsDirectory() + + L"\\explorer.exe"; m_explorerCrashMonitor.emplace(explorerPath); } catch (const std::exception& e) { diff --git a/src/windhawk/app/resource.h b/src/windhawk/app/resource.h index 245a255..7f2e000 100644 --- a/src/windhawk/app/resource.h +++ b/src/windhawk/app/resource.h @@ -42,6 +42,7 @@ #define IDI_NOTIFICATION 201 #define IDD_TASK_MANAGER 202 #define IDD_TOOLKIT 203 +#define IDS_TASKDLG_PROCESS_SUSPENDED 208 #define IDC_TASK_LIST 1001 #define IDC_TOOLKIT_LOADED_MODS 1002 #define IDC_TOOLKIT_EXIT 1003 @@ -49,10 +50,10 @@ #define IDC_TOOLKIT_CLOSE 1005 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 204 +#define _APS_NEXT_RESOURCE_VALUE 209 #define _APS_NEXT_COMMAND_VALUE 32775 #define _APS_NEXT_CONTROL_VALUE 1006 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/windhawk/app/rsrc.rc b/src/windhawk/app/rsrc.rc index 488ee2491f005bb517f134498d3166bf162b609e..e79331cf52ad5ce3bac39eac3b9943708a904d26 100644 GIT binary patch delta 10757 zcmcIqdr+0s9e0@C&7q-go6-K2@o%661#GQV{%k3f;XH@Bs=Zc z)U;8abSKR^jb>9*GpS94sx@gUc)`q=#<=6|?2J33yP3)Eq}_Fz{WIIy-|v0T$2nXj z+37Hc^L_8-x!>OBJ#TeK{H1@w`!^=Y$BFiotIjvhSI)1TE6xq^z6SGyOs!=&|e8mj;X2KjjZtqS`;rNp(N7?F6fcS|M)qL1#cAiu%s!^WW zy;|?92=2QTHCygw&g<$<5GNrj+EyQ8%N^(6xKTVn<}^8}1h`5A3?tF$a$f%F7Uw8d zB}!HHg2b?$&U4O>pE~g4JL{hg&Y#FGEbDT*H92oPUpp6_cbs247o0Eg-0W=I`M;fA z&eKkZv%`58*mpUboo&wfwsk%i&SvLD%y;E%k=Et;-QP^;^vJEK$nL+L`26g|bzrPb z`IS#KgXL@$e3xx;M<%R;fY!@badRi?CsiSfA4}>!Va@XdrJHHx-@b55?#(QuNacEV z+?4;h=A3m!`$2q>K%_H%_`5$|$i8l?UtYS~6BI8+$@S5%zpvgiJ1A7_fG}e#uUR)j z%Qu(_nVmf?miTP-)j6{TVwF<~-dUmbTQAz`i*tAT@W1cnJMti*cDZ`bRvSON+hePP z{i!#$^xDcf`-^jX`)&2n*{h$}s{CeX)7`$~{W(21&V6w%SMDF(tPP7ON%ck`<5=r* zTb#rgXxrs=GiF|z<@0-yf~}p z9-e-A=^n_Y*uLl?!56P>y?D1LNFdZze(m)Owpw<5OK&-5?cRUAwdKxbu(bACasS>+ zw%V)$P-~-l9_l@ycB$9SQ94yvd$;fHzOA40`?!9y)v^A6=`N1xr!2yyuykRLRM*dQ zGREFGu+LVN*KGCt9jSk-bOZ&*rc_w}@#!nQ5;M76-YARD-U9SDE^ocq1N->?N7fB8 z^4{e$*X!@tY8KS^!~Wm&Q6KW)*eeuS^}{z5_qT%grE0d8;N6}Verv01*IK*x_Fud` z3~bEgTG`oELeRD21w9`k9T#vrw{jxs0AM*DKf|Ub$D*doUp-;`tEKauHFL)!I%i4M z)Nmh^(y3eGNsFzH_g{m$u72_|#2x#I*taX?=Vc);re%NdcV3H&<(TtAlyzt8#e&|q z`y^)RkF4IycW+7k^n9teVNx#)z|fccH+`}cU(JYf&K6*hn+BkCUd>M$C0Hq6_vc6a9?6Z1>;7hLeQZiC zg4%A_emg9mLCw4~#5Ia9?gtUIs!BZl^YL9H_bXGwLt1=nHJqhQ9a2f2M*I&bpPbtL zB;s4lq`h#WuQ{hj5ZRKR!P+v95BAW4IU;BQ!c5g9pL^4EN_mhxEqb%+P&={akjK`0 z{iz!Pr9*AU+A_r6L#h>c{Hg&@&8mY@5Wy}cjnJFmw#}H`iM2y0lh}VqV(wVI3DEXo z_w&Hsgmta>CM5^-PCrHt;IlV~lbCGa9*+0^KPJhE?Bc_Ru(uuS$&Xn*9OAw~I0G7E z2jCvk*g7DU2_Eu8N+y8s9iXroyflClz8}ySDCZ8027=Oqw3Qu&0c2aXPtr3I#V#mg z7@m=WBKx|Mo%9c|%XCNibl9NZX^wimy=x*~A|iH{~< zALO_faGHR9FYp?hakXURX+zRJO;M7k70(^oDuzPzV zXfH)Tcmqs?^B}&P6;r~U&ga|Qb;)9esDhD7%4)f(_uq6^)v7*H+B85%hL2GLex2J9Yv0K72En z(U(k&L4^3|)zK-~_HYWA!Cc&51FCs`PJ8A<@yqcKy>jn#Br2c`wbtcD{$5fS)AGm9 z#i`S4q%<{3oYx{FK!v&?wa88I(5pPHnXTaU#IL`D+k01-B(4-xBe zhc@f9g1P>C6JPhqQtgV^B+EoPXo}NKJY1W>{@h0sndm)bF&$$P?_>|#$ zm|^_zmA&%8xf*2bX;aGa-mZgLK)e?qYxFt@1&@tjVT(yY8m zf6!ykBR7~`JmO`TZ7zYC031-yfxI>?fs{ugJW`raxtM!14bC7h%)I1|#$vb&QOewd z94Ab5W5yrTX{k1;k+6JLRk>8t&+gaU_On1Qco_I`?X{!0j?#_VLXZN zWZGe>DkMLyp+PdSwrDx-*0LtdCYTQWm_;Lx(c$}yA~{B-F&vo;%On&C=2>dRuMR?@ z)EISv_4RmV8a4UKwNk3VpfSmpi;X1_g;5>dk?VJYB#OhNWvY8S#&=+LF9^;Rp6g!x zNu!VG|Ei42Q*Y)->!R6%6u1&2)8xUc@j4@eC*+jX>C7iJpvMTAv0y*wXJ!uaDW7$v zd;H>kJCV+Y6JhE&mrsh&1siNb?jN5KO>Mb85RhO0Zl?5=&l0EW;CSIJ9DoOM!;`78 zG9yy@4J=HFX9P1s3~Q1-3hP8+kE{o*%Z)D6d+VNmAbG1`O$9ifrGddrtf{m&An4{};P?&iJ7 zSmQ=+-XodFdJ9KFU|iG9djmm&`7b>zm4Vb@=`DEdOj!>ZwQC~{Eeeh>14gV@o8&*^ z=1;=6+JHYd`&D_S&#}s^LaWqThwmzD(9y+7v>fYE%&oE>vzA#a@wX1&JY5!BC04#w zV3p%jh*eMEyTI!D&B3VIdS$gG^$QM8j>Couy;N=$W%6`0jW9#_#9r9Abtw?!V_O+O zFAtlxRRKowEU!j7GD>t=^zK!9cOLMC6THrnV=EF4J60a1ORQo5F9V&c0niI72%ZQZ z2MDj8DZ_USMjr>)ob_5oSeuXeYHJOiRs?q#B+CJV^6+9U_b&s6brx%E!Y|SgfVTjT zRajbrr7QJ@JiHYF9tW3e_G6UCb3 zGQcPeVjs)^8fRrORNV?pQwjyvatLx!-BcP&F=$zdz3iVYVZ4k7W8{7nSl|SiEP=!w zEy+AAFU5QT-(=6MECjj7cz#(h{(W-x7YVgAI0K&K*dv-C)k8a>xzd`Jf(aw15^E`T zlPoGUNWbp8JvN+$?d3>~#SYqcsA%Fa|Bx}z2m}Dz2 zdwjqhtIJ=>{$kRo#LDr~#0BFO9Ek0Fr}En<5Ai>jULWq5ZX_9rrUHxI!3A@mu~KZK zG8m$0SR*Z80qNbY95s%0p2<#_4G=@4RShiKd0|=_aFoFF=&)Yc^wJ+qO$R!<7h{6k zTa1|ln<@Yh2ewmy)q);lOo%H+0=NWHMOpx)L=3(rx@l;OQl&$=hb9XzlFhjk@!h&Ag0sh=tdxpBg4ex&Y_j~ zt;4;(bwPJAc4(|{Q5M><5Y=+f_c++{f>p*8Ta{vz;w*-y6DpH471;|V1?rhTiX`$N zVUheHA-*gP1KdUNghy*+EF=gz`d~ba_2GD+Fmpl)&oz$^0m=Zs65G7^7@IROnxiD0 zAj@GED?uwYR)QyL%^=Ie8&d_zG&aKZjQX@1oKIA={B+&I)G=~(FrClcgd;hRbfy?` zQ+oKQpH1Wmn{ZdAZ^xqb6Ard(!j85BcVwg30@PLq+9-EsAq4sXOMx}arcNkoBb7Sv z5=#57=BK-g8w{Xuj?p^>yjlxmOsxkuk6-J|NvrTNT6eKf4IB+wSDn_n->nfC&ck)i z6tz-2yX&bgNH-YLBk5vHZ};EbF4--efioFDjS? zLsb#YK9uoYxrd+?YCVJ(6$QE~q7Y3fL=D!Ig61_Ea2~BMSR1W^#7S`>WX&uds*dWy zsw0+g537#|^RK}Q>!X1>HmC(uM{(((nSvn)rqE=Kl*Sq<6>O5NO05XDCaTjl5psD< ze$dF=8j2^&Wn*koLpRtMDRRNhW&&djW5ra0v_s{Y+_{Q%o34AlJNN_xK2+l5gEM3x z+%;BxCz?m0w9CKtiSGt)7-=Y37JVB~f}$mv!EJB^bn6cmD9Pca15M3L8cE!)9K-QZ zl0=%4geAz-a5yYLqD%p@GE{t|YIV}&OOXK))lhuQB6UL}*h*Lcix6Fzgh)3fNJ5;B zWHZD7vSb3?sTc^-kG=9t28;-_JED&!5veh^(zhtG%A2g!LsZiSh zVLcMS0%Gkf!)wD?- zbjQqR@5*hLgrHCWL!q3=Uf`*b-j9Z1{N4`!swKj!woB8|@1=w!XZnrd za@%wMu>ARadqK!1^{iZ+9c25`5lvKb!PxjNSWI=HP@Sj%7zprJaC;k!|)JJS=;}Uu9~+t&>F*}>+?0pxl3#3XTUWK zZ?rJe{&u^gt}I)`_u;~bKdJrld*2%OrV?>rT>FZ!4_xz}fg0qki)+WG8ELG_XpdGH zb~7nU`%=+aIFvpvOcjGMg)GA)4mLiCi}**xrnS%l4^EO}jd`);FGMLV5_h<1E|gJV zXo_{)wX||ZjgAt=^BFIKFtS`252r-mMXq?5q>W9{M|hpku3Nm#%IGU4cq^F_B4fDo z>0ayQ!Xmcu4WU$(5g?oUGp$%+N?=PPZguJ;ld{f9k!x2xJB wEpIFzPg3Z9=~w?fEBcE12+qbIQ*;15j#}M+x!yT_$nfV!db=zC`I$%l4_SuK>;M1& delta 82 zcmex&oORJ=<_#xUH(%h~!pP{exs^LtW^KWa%MF4iJE%!*p76^-eY=$GetInt(L"SafeMode").value_or(0)) { - bool injectIntoCriticalProcesses = - settings->GetInt(L"InjectIntoCriticalProcesses").value_or(0); - - m_engineControl.emplace(!injectIntoCriticalProcesses); + m_engineControl.emplace(); m_engineControl->HandleNewProcesses(); } } diff --git a/src/windhawk/app/stdafx.h b/src/windhawk/app/stdafx.h index c6163d6..0f420ab 100644 --- a/src/windhawk/app/stdafx.h +++ b/src/windhawk/app/stdafx.h @@ -69,8 +69,9 @@ extern CAppModule _Module; ////////////////////////////////////////////////////////////////////////// // Libraries -#define JSON_USE_IMPLICIT_CONVERSIONS \ - 0 // https://github.com/nlohmann/json#implicit-conversions +// https://github.com/nlohmann/json#implicit-conversions +#define JSON_USE_IMPLICIT_CONVERSIONS 0 + #include #include diff --git a/src/windhawk/app/task_manager_dlg.cpp b/src/windhawk/app/task_manager_dlg.cpp index 0c1f0f4..5eeccbf 100644 --- a/src/windhawk/app/task_manager_dlg.cpp +++ b/src/windhawk/app/task_manager_dlg.cpp @@ -9,7 +9,9 @@ namespace { // Wait for a bit before refreshing the list, in case more changes will follow. -constexpr auto kRefreshListDelay = 200; +constexpr auto kRefreshListOnDataChangeDelay = 200; + +constexpr auto kUpdateProcessesStatusInterval = 1000; std::wstring GetMetadataContent(PCWSTR filePath, FILETIME* pCreationTime) { wil::unique_hfile file( @@ -73,6 +75,16 @@ std::wstring LocalizeStatus(PCWSTR status) { return status; } +bool IsProcessFrozen(DWORD processId) { + wil::unique_process_handle process( + OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processId)); + if (!process) { + return false; + } + + return Functions::IsProcessFrozen(process.get()); +} + } // namespace CTaskManagerDlg::CTaskManagerDlg(DialogOptions dialogOptions) @@ -115,23 +127,16 @@ void CTaskManagerDlg::LoadLanguageStrings() { } void CTaskManagerDlg::DataChanged() { - if (m_refreshListPending) { + if (m_refreshListOnDataChangePending) { return; } - SetTimer(Timer::kRefreshList, kRefreshListDelay); - m_refreshListPending = true; + SetTimer(Timer::kRefreshList, kRefreshListOnDataChangeDelay); + m_refreshListOnDataChangePending = true; } BOOL CTaskManagerDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { - m_icon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, - ::GetSystemMetrics(SM_CXICON), - ::GetSystemMetrics(SM_CYICON)); - SetIcon(m_icon, TRUE); - m_smallIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, - ::GetSystemMetrics(SM_CXSMICON), - ::GetSystemMetrics(SM_CYSMICON)); - SetIcon(m_smallIcon, FALSE); + ReloadMainIcon(); DlgResize_Init(); m_ptMinTrackSize.x /= 2; @@ -158,6 +163,8 @@ BOOL CTaskManagerDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { LoadLanguageStrings(); + SetTimer(Timer::kUpdateProcessesStatus, kUpdateProcessesStatusInterval); + if (!m_dialogOptions.autonomousMode) { try { LoadTaskList(); @@ -165,43 +172,68 @@ BOOL CTaskManagerDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { ::MessageBoxA(m_hWnd, e.what(), "Failed to initialize data", MB_ICONERROR); DestroyWindow(); + return FALSE; } return TRUE; } else { - SetTimer(Timer::kRefreshList, kRefreshListDelay); - m_refreshListPending = true; + SetTimer(Timer::kRefreshList, kRefreshListOnDataChangeDelay); + m_refreshListOnDataChangePending = true; SetTimer(Timer::kShowDlg, std::max(m_dialogOptions.autonomousModeShowDelay, kAutonomousModeShowDelayMin)); + m_showDlgPending = true; return FALSE; } } void CTaskManagerDlg::OnDestroy() { + KillTimer(Timer::kUpdateProcessesStatus); + + if (m_refreshListOnDataChangePending) { + KillTimer(Timer::kRefreshList); + } + + if (m_showDlgPending) { + KillTimer(Timer::kShowDlg); + } + int count = m_taskListSort.GetItemCount(); for (int i = 0; i < count; i++) { delete reinterpret_cast(m_taskListSort.GetItemData(i)); } + + // From GDI handle checks, not all icons are freed automatically. + ::DestroyIcon(SetIcon(nullptr, TRUE)); + ::DestroyIcon(SetIcon(nullptr, FALSE)); } void CTaskManagerDlg::OnTimer(UINT_PTR nIDEvent) { switch ((Timer)nIDEvent) { + case Timer::kUpdateProcessesStatus: + UpdateTaskListProcessesStatus(); + break; + case Timer::kRefreshList: KillTimer(Timer::kRefreshList); - m_refreshListPending = false; + m_refreshListOnDataChangePending = false; RefreshTaskList(); break; case Timer::kShowDlg: KillTimer(Timer::kShowDlg); + m_showDlgPending = false; ShowWindow(SW_SHOWNA); break; } } +void CTaskManagerDlg::OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect) { + ReloadMainIcon(); +} + void CTaskManagerDlg::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl) { if (m_dialogOptions.runButtonCallback) { m_dialogOptions.runButtonCallback(m_hWnd); @@ -243,6 +275,24 @@ BOOL CTaskManagerDlg::KillTimer(Timer nIDEvent) { return CDialogImpl::KillTimer(static_cast(nIDEvent)); } +void CTaskManagerDlg::ReloadMainIcon() { + UINT dpi = Functions::GetDpiForWindowWithFallback(m_hWnd); + + CIconHandle mainIcon; + mainIcon.LoadIconWithScaleDown( + IDR_MAINFRAME, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYICON, dpi)); + CIcon prevMainIcon = SetIcon(mainIcon, TRUE); + + CIconHandle mainIconSmall; + mainIconSmall.LoadIconWithScaleDown( + IDR_MAINFRAME, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi)); + CIcon prevMainIconSmall = SetIcon(mainIconSmall, FALSE); +} + void CTaskManagerDlg::PlaceWindowAtTrayArea() { CRect windowRect; GetWindowRect(&windowRect); @@ -268,15 +318,7 @@ void CTaskManagerDlg::InitTaskList() { LVS_EX_LABELTIP | LVS_EX_DOUBLEBUFFER); ::SetWindowTheme(list, L"Explorer", nullptr); - using GetDpiForWindow_t = UINT(WINAPI*)(HWND hwnd); - static GetDpiForWindow_t pGetDpiForWindow = []() { - HMODULE hUser32 = GetModuleHandle(L"user32.dll"); - return (GetDpiForWindow_t)(hUser32 ? GetProcAddress(hUser32, - "GetDpiForWindow") - : nullptr); - }(); - - UINT windowDpi = pGetDpiForWindow ? pGetDpiForWindow(m_hWnd) : 96; + UINT windowDpi = Functions::GetDpiForWindowWithFallback(m_hWnd); // Sort PIDs as decimals, signed 128-bit (16-byte) values representing // 96-bit (12-byte) integer numbers: @@ -308,7 +350,8 @@ void CTaskManagerDlg::InitTaskList() { // Reduce the width of the last column so that a horizontal scrollbar won't // appear when the vertical scrollbar is visible. int lastColumn = ARRAYSIZE(columns) - 1; - int scrollbarWidth = ::GetSystemMetrics(SM_CXVSCROLL); + int scrollbarWidth = + Functions::GetSystemMetricsForDpiWithFallback(SM_CXVSCROLL, windowDpi); list.SetColumnWidth( lastColumn, std::max(list.GetColumnWidth(lastColumn) - scrollbarWidth, scrollbarWidth)); @@ -442,27 +485,39 @@ bool CTaskManagerDlg::LoadTaskItemFromMetadataFile( PCWSTR processName = metadata.data(); std::wstring status = LocalizeStatus(metadata.data() + separator + 1); + bool isFrozen = IsProcessFrozen(targetProcessId); + AddItemToList(itemIndex, filePath.c_str(), modName.c_str(), processName, - std::to_wstring(targetProcessId).c_str(), status.c_str(), - creationTime); + targetProcessId, status.c_str(), creationTime, isFrozen); return true; } void CTaskManagerDlg::AddItemToList(int itemIndex, PCWSTR filePath, PCWSTR mod, - PCWSTR process, - PCWSTR pid, + PCWSTR processName, + DWORD processId, PCWSTR status, - FILETIME creationTime) { + FILETIME creationTime, + bool isFrozen) { + std::wstring processNameFormatted = processName; + if (isFrozen) { + processNameFormatted += L' '; + processNameFormatted += + Functions::LoadStrFromRsrc(IDS_TASKDLG_PROCESS_SUSPENDED); + } + m_taskListSort.AddItem(itemIndex, 0, mod); - m_taskListSort.AddItem(itemIndex, 1, process); - m_taskListSort.AddItem(itemIndex, 2, pid); + m_taskListSort.AddItem(itemIndex, 1, processNameFormatted.c_str()); + m_taskListSort.AddItem(itemIndex, 2, std::to_wstring(processId).c_str()); m_taskListSort.AddItem(itemIndex, 3, status); auto* itemData = new ListItemData{ .filePath = filePath, + .processName = processName, + .processId = processId, .creationTime = wil::filetime::to_int64(creationTime), + .isFrozen = isFrozen, }; m_taskListSort.SetItemData(itemIndex, reinterpret_cast(itemData)); @@ -482,48 +537,107 @@ void CTaskManagerDlg::RefreshTaskList() { return; } - if (m_dialogOptions.autonomousMode) { - int itemCount = m_taskListSort.GetItemCount(); - if (itemCount == 0) { - DestroyWindow(); - return; + UpdateDialogAfterListUpdate(); +} + +void CTaskManagerDlg::UpdateTaskListProcessesStatus() { + bool updated = false; + + int itemCount = m_taskListSort.GetItemCount(); + for (int i = 0; i < itemCount; i++) { + auto* itemData = + reinterpret_cast(m_taskListSort.GetItemData(i)); + + bool isFrozen = IsProcessFrozen(itemData->processId); + if (isFrozen == itemData->isFrozen) { + continue; } - if (!IsWindowVisible()) { - // Set timer to show the dialog. The delay is the defined amount of - // delay in autonomousModeShowDelay, minus the earliest item age. - // This is to avoid showing the dialog when items come and go - the - // delay will always be updated and the dialog will never be shown. - - ULONGLONG earliestCreationTime = ULONGLONG_MAX; - for (int i = 0; i < itemCount; i++) { - auto* itemData = reinterpret_cast( - m_taskListSort.GetItemData(i)); - ULONGLONG creationTime = itemData->creationTime; - if (creationTime < earliestCreationTime) { - earliestCreationTime = creationTime; - } - } + itemData->isFrozen = isFrozen; - ULONGLONG currentTime = - wil::filetime::to_int64(wil::filetime::get_system_time()); + std::wstring processNameFormatted = itemData->processName; + if (isFrozen) { + processNameFormatted += L' '; + processNameFormatted += + Functions::LoadStrFromRsrc(IDS_TASKDLG_PROCESS_SUSPENDED); + } - UINT delay = std::max(m_dialogOptions.autonomousModeShowDelay, - kAutonomousModeShowDelayMin); + m_taskListSort.SetItemText(i, 1, processNameFormatted.c_str()); - if (earliestCreationTime <= currentTime) { - ULONGLONG msSinceEarliestCreationTime = - wil::filetime::convert_100ns_to_msec(currentTime - - earliestCreationTime); + updated = true; + } - if (msSinceEarliestCreationTime >= delay) { - delay = 0; - } else { - delay -= static_cast(msSinceEarliestCreationTime); - } + if (updated) { + UpdateDialogAfterListUpdate(); + } +} + +void CTaskManagerDlg::UpdateDialogAfterListUpdate() { + if (!m_dialogOptions.autonomousMode) { + return; + } + + int itemCount = m_taskListSort.GetItemCount(); + if (itemCount == 0) { + DestroyWindow(); + return; + } + + bool allProcessesAreFrozen = true; + for (int i = 0; i < itemCount; i++) { + auto* itemData = + reinterpret_cast(m_taskListSort.GetItemData(i)); + if (!itemData->isFrozen) { + allProcessesAreFrozen = false; + break; + } + } + + if (allProcessesAreFrozen) { + if (m_showDlgPending) { + KillTimer(Timer::kShowDlg); + m_showDlgPending = false; + } + + ShowWindow(SW_HIDE); + return; + } + + if (!IsWindowVisible()) { + // Set timer to show the dialog. The delay is the defined amount of + // delay in autonomousModeShowDelay, minus the earliest item age. This + // is to avoid showing the dialog when items come and go - the delay + // will always be updated and the dialog will never be shown. + + ULONGLONG earliestCreationTime = ULONGLONG_MAX; + for (int i = 0; i < itemCount; i++) { + auto* itemData = + reinterpret_cast(m_taskListSort.GetItemData(i)); + ULONGLONG creationTime = itemData->creationTime; + if (creationTime < earliestCreationTime) { + earliestCreationTime = creationTime; } + } + + ULONGLONG currentTime = + wil::filetime::to_int64(wil::filetime::get_system_time()); + + UINT delay = std::max(m_dialogOptions.autonomousModeShowDelay, + kAutonomousModeShowDelayMin); - SetTimer(Timer::kShowDlg, delay); + if (earliestCreationTime <= currentTime) { + ULONGLONG msSinceEarliestCreationTime = + wil::filetime::convert_100ns_to_msec(currentTime - + earliestCreationTime); + + if (msSinceEarliestCreationTime >= delay) { + delay = 0; + } else { + delay -= static_cast(msSinceEarliestCreationTime); + } } + + SetTimer(Timer::kShowDlg, delay); + m_showDlgPending = true; } } diff --git a/src/windhawk/app/task_manager_dlg.h b/src/windhawk/app/task_manager_dlg.h index e02c40b..db06ad2 100644 --- a/src/windhawk/app/task_manager_dlg.h +++ b/src/windhawk/app/task_manager_dlg.h @@ -41,7 +41,8 @@ class CTaskManagerDlg : public CDialogImpl, private: enum class Timer { - kRefreshList = 1, + kUpdateProcessesStatus = 1, + kRefreshList, kShowDlg, }; @@ -50,6 +51,7 @@ class CTaskManagerDlg : public CDialogImpl, MSG_WM_INITDIALOG(OnInitDialog) MSG_WM_DESTROY(OnDestroy) MSG_WM_TIMER(OnTimer) + MSG_WM_DPICHANGED(OnDpiChanged) COMMAND_ID_HANDLER_EX(IDOK, OnOK) COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel) NOTIFY_HANDLER_EX(IDC_TASK_LIST, NM_RCLICK, OnListRightClick) @@ -57,12 +59,16 @@ class CTaskManagerDlg : public CDialogImpl, struct ListItemData { std::wstring filePath; + std::wstring processName; + DWORD processId = 0; ULONGLONG creationTime; + bool isFrozen = false; }; BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam); void OnDestroy(); void OnTimer(UINT_PTR nIDEvent); + void OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect); void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl); void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl); LRESULT OnListRightClick(LPNMHDR pnmh); @@ -72,6 +78,7 @@ class CTaskManagerDlg : public CDialogImpl, UINT nElapse, TIMERPROC lpfnTimer = nullptr); BOOL KillTimer(Timer nIDEvent); + void ReloadMainIcon(); void PlaceWindowAtTrayArea(); void InitTaskList(); void LoadTaskList(); @@ -80,14 +87,17 @@ class CTaskManagerDlg : public CDialogImpl, void AddItemToList(int itemIndex, PCWSTR filePath, PCWSTR mod, - PCWSTR process, - PCWSTR pid, + PCWSTR processName, + DWORD processId, PCWSTR status, - FILETIME creationTime); + FILETIME creationTime, + bool isFrozen); void RefreshTaskList(); + void UpdateTaskListProcessesStatus(); + void UpdateDialogAfterListUpdate(); const DialogOptions m_dialogOptions; - CIcon m_icon, m_smallIcon; CSortListViewCtrl m_taskListSort; - bool m_refreshListPending = false; + bool m_refreshListOnDataChangePending = false; + bool m_showDlgPending = false; }; diff --git a/src/windhawk/app/toolkit_dlg.cpp b/src/windhawk/app/toolkit_dlg.cpp index bebd4d0..bb4fdc6 100644 --- a/src/windhawk/app/toolkit_dlg.cpp +++ b/src/windhawk/app/toolkit_dlg.cpp @@ -32,19 +32,12 @@ void CToolkitDlg::Close() { } BOOL CToolkitDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { - m_icon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, - ::GetSystemMetrics(SM_CXICON), - ::GetSystemMetrics(SM_CYICON)); - SetIcon(m_icon, TRUE); - m_smallIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, - ::GetSystemMetrics(SM_CXSMICON), - ::GetSystemMetrics(SM_CYSMICON)); - SetIcon(m_smallIcon, FALSE); + ReloadMainIcon(); SetWindowPos(HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); - //PlaceWindowAtTrayArea(); + // PlaceWindowAtTrayArea(); CenterWindow(); LoadLanguageStrings(); @@ -52,6 +45,12 @@ BOOL CToolkitDlg::OnInitDialog(CWindow wndFocus, LPARAM lInitParam) { return !m_dialogOptions.createInactive; } +void CToolkitDlg::OnDestroy() { + // From GDI handle checks, not all icons are freed automatically. + ::DestroyIcon(SetIcon(nullptr, TRUE)); + ::DestroyIcon(SetIcon(nullptr, FALSE)); +} + void CToolkitDlg::OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther) { switch (nState) { case WA_ACTIVE: @@ -61,6 +60,10 @@ void CToolkitDlg::OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther) { } } +void CToolkitDlg::OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect) { + ReloadMainIcon(); +} + void CToolkitDlg::OnOK(UINT uNotifyCode, int nID, CWindow wndCtl) { if (m_dialogOptions.runButtonCallback) { m_dialogOptions.runButtonCallback(m_hWnd); @@ -95,6 +98,24 @@ void CToolkitDlg::OnFinalMessage(HWND hWnd) { } } +void CToolkitDlg::ReloadMainIcon() { + UINT dpi = Functions::GetDpiForWindowWithFallback(m_hWnd); + + CIconHandle mainIcon; + mainIcon.LoadIconWithScaleDown( + IDR_MAINFRAME, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYICON, dpi)); + CIcon prevMainIcon = SetIcon(mainIcon, TRUE); + + CIconHandle mainIconSmall; + mainIconSmall.LoadIconWithScaleDown( + IDR_MAINFRAME, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi)); + CIcon prevMainIconSmall = SetIcon(mainIconSmall, FALSE); +} + void CToolkitDlg::PlaceWindowAtTrayArea() { CRect windowRect; GetWindowRect(&windowRect); diff --git a/src/windhawk/app/toolkit_dlg.h b/src/windhawk/app/toolkit_dlg.h index 9949e1b..3b23cad 100644 --- a/src/windhawk/app/toolkit_dlg.h +++ b/src/windhawk/app/toolkit_dlg.h @@ -27,7 +27,9 @@ class CToolkitDlg : public CDialogImpl { private: BEGIN_MSG_MAP_EX(CToolkitDlg) MSG_WM_INITDIALOG(OnInitDialog) + MSG_WM_DESTROY(OnDestroy) MSG_WM_ACTIVATE(OnActivate) + MSG_WM_DPICHANGED(OnDpiChanged) COMMAND_ID_HANDLER_EX(IDOK, OnOK) COMMAND_ID_HANDLER_EX(IDC_TOOLKIT_LOADED_MODS, OnLoadedMods) COMMAND_ID_HANDLER_EX(IDC_TOOLKIT_EXIT, OnExit) @@ -36,8 +38,9 @@ class CToolkitDlg : public CDialogImpl { END_MSG_MAP() BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam); + void OnDestroy(); void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther); - + void OnDpiChanged(UINT nDpiX, UINT nDpiY, PRECT pRect); void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl); void OnLoadedMods(UINT uNotifyCode, int nID, CWindow wndCtl); void OnExit(UINT uNotifyCode, int nID, CWindow wndCtl); @@ -45,9 +48,9 @@ class CToolkitDlg : public CDialogImpl { void OnClose(UINT uNotifyCode, int nID, CWindow wndCtl); void OnFinalMessage(HWND hWnd) override; + void ReloadMainIcon(); void PlaceWindowAtTrayArea(); const DialogOptions m_dialogOptions; - CIcon m_icon, m_smallIcon; bool m_wasActive = false; }; diff --git a/src/windhawk/app/tray_icon.cpp b/src/windhawk/app/tray_icon.cpp index a13c2b1..fd46a3a 100644 --- a/src/windhawk/app/tray_icon.cpp +++ b/src/windhawk/app/tray_icon.cpp @@ -2,14 +2,13 @@ #include "tray_icon.h" +#include "functions.h" #include "resource.h" AppTrayIcon::AppTrayIcon(HWND hWnd, UINT uCallbackMsg, bool hidden /*= false*/) { - m_trayIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR, - ::GetSystemMetrics(SM_CXSMICON), - ::GetSystemMetrics(SM_CYSMICON)); + ReloadIcons(hWnd); m_nid.cbSize = sizeof(NOTIFYICONDATA); m_nid.hWnd = hWnd; @@ -21,6 +20,7 @@ AppTrayIcon::AppTrayIcon(HWND hWnd, wcscpy_s(m_nid.szTip, L"Windhawk"); m_nid.dwState = hidden ? NIS_HIDDEN : 0; m_nid.dwStateMask = NIS_HIDDEN; + m_nid.hBalloonIcon = m_balloonIcon; } void AppTrayIcon::Create() { @@ -28,6 +28,24 @@ void AppTrayIcon::Create() { Shell_NotifyIcon(NIM_SETVERSION, &m_nid); } +void AppTrayIcon::Modify() { + Shell_NotifyIcon(NIM_MODIFY, &m_nid); +} + +void AppTrayIcon::UpdateIcons(HWND hWnd) { + bool usingNotificationIcon = m_nid.hIcon == m_trayIconWithNotification; + + ReloadIcons(hWnd); + + if (usingNotificationIcon) { + m_nid.hIcon = m_trayIconWithNotification; + } else { + m_nid.hIcon = m_trayIcon; + } + + m_nid.hBalloonIcon = m_balloonIcon; +} + void AppTrayIcon::Hide(bool hidden) { if (hidden) { m_nid.dwState |= NIS_HIDDEN; @@ -40,13 +58,6 @@ void AppTrayIcon::Hide(bool hidden) { void AppTrayIcon::SetNotificationIconAndTooltip(PCWSTR pText) { if (pText) { - if (!m_trayIconWithNotification) { - m_trayIconWithNotification = - AtlLoadIconImage(IDI_NOTIFICATION, LR_DEFAULTCOLOR, - ::GetSystemMetrics(SM_CXSMICON), - ::GetSystemMetrics(SM_CYSMICON)); - } - m_nid.hIcon = m_trayIconWithNotification; _snwprintf_s(m_nid.szTip, _TRUNCATE, L"%s - Windhawk", pText); } else { @@ -61,7 +72,7 @@ void AppTrayIcon::ShowNotificationMessage(PCWSTR pText) { m_nid.uFlags |= NIF_INFO; wcsncpy_s(m_nid.szInfo, pText, _TRUNCATE); wcscpy_s(m_nid.szInfoTitle, L"Windhawk"); - m_nid.dwInfoFlags = NIIF_USER; + m_nid.dwInfoFlags = NIIF_USER | NIIF_LARGE_ICON; Shell_NotifyIcon(NIM_MODIFY, &m_nid); @@ -96,3 +107,27 @@ AppTrayIcon::TrayAction AppTrayIcon::HandleMsg(WPARAM wParam, LPARAM lParam) { return TrayAction::kNone; } + +void AppTrayIcon::ReloadIcons(HWND hWnd) { + HWND hTaskbarWnd = FindWindow(L"Shell_TrayWnd", nullptr); + UINT dpi = Functions::GetDpiForWindowWithFallback(hTaskbarWnd ? hTaskbarWnd + : hWnd); + + m_trayIcon = nullptr; + m_trayIcon.LoadIconWithScaleDown( + IDR_MAINFRAME, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi)); + + m_balloonIcon = nullptr; + m_balloonIcon.LoadIconWithScaleDown( + IDR_MAINFRAME, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYICON, dpi)); + + m_trayIconWithNotification = nullptr; + m_trayIconWithNotification.LoadIconWithScaleDown( + IDI_NOTIFICATION, + Functions::GetSystemMetricsForDpiWithFallback(SM_CXSMICON, dpi), + Functions::GetSystemMetricsForDpiWithFallback(SM_CYSMICON, dpi)); +} diff --git a/src/windhawk/app/tray_icon.h b/src/windhawk/app/tray_icon.h index 681f03f..3487b1a 100644 --- a/src/windhawk/app/tray_icon.h +++ b/src/windhawk/app/tray_icon.h @@ -15,6 +15,8 @@ class AppTrayIcon { AppTrayIcon(HWND hWnd, UINT uCallbackMsg, bool hidden = false); void Create(); + void Modify(); + void UpdateIcons(HWND hWnd); void Hide(bool hidden); void SetNotificationIconAndTooltip(PCWSTR pText); void ShowNotificationMessage(PCWSTR pText); @@ -22,7 +24,10 @@ class AppTrayIcon { TrayAction HandleMsg(WPARAM wParam, LPARAM lParam); private: + void ReloadIcons(HWND hWnd); + CIcon m_trayIcon; + CIcon m_balloonIcon; CIcon m_trayIconWithNotification; NOTIFYICONDATA m_nid{}; DWORD m_lastClickTickCount = 0; diff --git a/src/windhawk/app/ui_control.cpp b/src/windhawk/app/ui_control.cpp index 21e4dc5..2922507 100644 --- a/src/windhawk/app/ui_control.cpp +++ b/src/windhawk/app/ui_control.cpp @@ -13,8 +13,12 @@ const json uiSettings = { {"telemetry.telemetryLevel", "off"}, {"update.mode", "none"}, {"update.showReleaseNotes", false}, + {"extensions.autoCheckUpdates", false}, + {"extensions.autoUpdate", false}, {"files.autoSave", "afterDelay"}, {"window.title", "${dirty}${activeEditorShort}${separator}${appName}"}, + {"workbench.enableExperiments", false}, + {"workbench.settings.enableNaturalLanguageSearch", false}, {"workbench.editor.restoreViewState", false}, {"workbench.tips.enabled", false}, {"workbench.startupEditor", "none"}, diff --git a/src/windhawk/app/userprofile.cpp b/src/windhawk/app/userprofile.cpp index f1ccfb7..9f1412a 100644 --- a/src/windhawk/app/userprofile.cpp +++ b/src/windhawk/app/userprofile.cpp @@ -2,6 +2,7 @@ #include "userprofile.h" +#include "functions.h" #include "logger.h" #include "storage_manager.h" #include "version.h" @@ -31,17 +32,13 @@ std::string GenerateUserId() { } std::string GetCurrentOSVersion() { -#pragma warning(push) -#pragma warning(disable : 4996) // disable deprecation message - OSVERSIONINFO versionInfo = {sizeof(OSVERSIONINFO)}; - if (!GetVersionEx(&versionInfo)) { - return {}; - } -#pragma warning(pop) + ULONG majorVersion = 0; + ULONG minorVersion = 0; + ULONG buildNumber = 0; + Functions::GetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber); - return std::to_string(versionInfo.dwMajorVersion) + "." + - std::to_string(versionInfo.dwMinorVersion) + "." + - std::to_string(versionInfo.dwBuildNumber); + return std::to_string(majorVersion) + "." + std::to_string(minorVersion) + + "." + std::to_string(buildNumber); } json ReadUserProfileJsonFromFile( diff --git a/src/windhawk/engine/_exports.def b/src/windhawk/engine/_exports.def index 4537fae..cdcd7b3 100644 --- a/src/windhawk/engine/_exports.def +++ b/src/windhawk/engine/_exports.def @@ -19,8 +19,9 @@ EXPORTS InternalWh_RemoveFunctionHook InternalWh_ApplyHookOperations InternalWh_FindFirstSymbol - InternalWh_FindNextSymbol InternalWh_FindFirstSymbol2 + InternalWh_FindFirstSymbol3 + InternalWh_FindNextSymbol InternalWh_FindNextSymbol2 InternalWh_FindCloseSymbol InternalWh_Disasm diff --git a/src/windhawk/engine/all_processes_injector.cpp b/src/windhawk/engine/all_processes_injector.cpp index cdc905c..46b5c55 100644 --- a/src/windhawk/engine/all_processes_injector.cpp +++ b/src/windhawk/engine/all_processes_injector.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "all_processes_injector.h" +#include "critical_processes.h" #include "dll_inject.h" #include "functions.h" #include "logger.h" @@ -55,8 +56,7 @@ HANDLE OpenProcessInitAPCMutex(DWORD processId, DWORD desiredAccess) { } // namespace -AllProcessesInjector::AllProcessesInjector(bool skipCriticalProcesses) - : m_skipCriticalProcesses(skipCriticalProcesses) { +AllProcessesInjector::AllProcessesInjector() { HMODULE hNtdll = GetModuleHandle(L"ntdll.dll"); THROW_LAST_ERROR_IF_NULL(hNtdll); @@ -99,20 +99,12 @@ AllProcessesInjector::AllProcessesInjector(bool skipCriticalProcesses) m_threadAttachExemptPattern = settings->GetString(L"ThreadAttachExempt").value_or(L""); - if (skipCriticalProcesses) { - auto systemDirectory = wil::GetSystemDirectory(); - - // BSOD if killed. - m_criticalProcessesPattern = systemDirectory + L"\\lsass.exe|"; + if (!settings->GetInt(L"InjectIntoCriticalProcesses").value_or(0)) { + if (!m_excludePattern.empty()) { + m_excludePattern += L"|"; + } - // Minimal set of processes to stay alive to be able to Ctr+Alt+Del and - // launch Task Manager. launchtm.exe, taskmgr.exe can be added too but I - // didn't add them for now, perhaps the user wants to customize Task - // Manager. - m_criticalProcessesPattern += systemDirectory + L"\\winlogon.exe|"; - m_criticalProcessesPattern += systemDirectory + L"\\dwm.exe|"; - m_criticalProcessesPattern += systemDirectory + L"\\logonui.exe|"; - m_criticalProcessesPattern += systemDirectory + L"\\consent.exe"; + m_excludePattern += kCriticalProcesses; } } @@ -167,30 +159,12 @@ int AllProcessesInjector::InjectIntoNewProcesses() noexcept { bool AllProcessesInjector::ShouldSkipNewProcess(HANDLE hProcess, DWORD dwProcessId, bool* threadAttachExempt) { - if (m_skipCriticalProcesses) { - try { - if (ShouldSkipCriticalProcess(dwProcessId)) { - VERBOSE(L"Skipping critical system process %u", dwProcessId); - return true; - } - } catch (const std::exception& e) { - LOG(L"ShouldSkipCriticalProcess failed for %u: %S", dwProcessId, - e.what()); - } - } - auto processImageName = wil::QueryFullProcessImageName(hProcess); - if (m_skipCriticalProcesses && - Functions::DoesPathMatchPattern(processImageName, - m_criticalProcessesPattern)) { - VERBOSE(L"Skipping critical system process %u", dwProcessId); - return true; - } - if (Functions::DoesPathMatchPattern(processImageName, m_excludePattern) && !Functions::DoesPathMatchPattern(processImageName, m_includePattern)) { + VERBOSE(L"Skipping excluded process %u", dwProcessId); return true; } @@ -200,54 +174,6 @@ bool AllProcessesInjector::ShouldSkipNewProcess(HANDLE hProcess, return false; } -bool AllProcessesInjector::ShouldSkipCriticalProcess(DWORD dwProcessId) { - DWORD dwSessionId; - if (ProcessIdToSessionId(dwProcessId, &dwSessionId)) { - // Don't skip non-session-0 processes, otherwise processes such as store - // apps (e.g. Settings) are skipped. - if (dwSessionId != 0) { - return false; - } - } else { - LOG(L"ProcessIdToSessionId failed for %u: %u", dwProcessId, - GetLastError()); - } - - // Temporarily unset debug privilege and check whether we can still open the - // process. If not, treat it as critical. - wil::unique_handle token; - if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES, FALSE, - &token)) { - THROW_LAST_ERROR_IF(GetLastError() != ERROR_NO_TOKEN); - THROW_IF_WIN32_BOOL_FALSE(ImpersonateSelf(SecurityImpersonation)); - THROW_IF_WIN32_BOOL_FALSE(OpenThreadToken( - GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES, FALSE, &token)); - } - - LUID luid; - THROW_IF_WIN32_BOOL_FALSE( - LookupPrivilegeValue(nullptr, SE_DEBUG_NAME, &luid)); - - TOKEN_PRIVILEGES tp; - tp.PrivilegeCount = 1; - tp.Privileges[0].Luid = luid; - tp.Privileges[0].Attributes = 0; - - THROW_IF_WIN32_BOOL_FALSE( - AdjustTokenPrivileges(token.get(), FALSE, &tp, 0, nullptr, nullptr)); - - auto scopeAdjustTokenPrivileges = wil::scope_exit([&token, &tp]() { - tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; - AdjustTokenPrivileges(token.get(), FALSE, &tp, 0, nullptr, nullptr); - }); - - wil::unique_process_handle process( - OpenProcess(DllInject::kProcessAccess, FALSE, dwProcessId)); - THROW_LAST_ERROR_IF(!process && GetLastError() != ERROR_ACCESS_DENIED); - - return !process; -} - void AllProcessesInjector::InjectIntoNewProcess(HANDLE hProcess, DWORD dwProcessId, bool threadAttachExempt) { diff --git a/src/windhawk/engine/all_processes_injector.h b/src/windhawk/engine/all_processes_injector.h index c61f2fd..222c24f 100644 --- a/src/windhawk/engine/all_processes_injector.h +++ b/src/windhawk/engine/all_processes_injector.h @@ -2,7 +2,7 @@ class AllProcessesInjector { public: - AllProcessesInjector(bool skipCriticalProcesses); + AllProcessesInjector(); int InjectIntoNewProcesses() noexcept; @@ -10,7 +10,6 @@ class AllProcessesInjector { bool ShouldSkipNewProcess(HANDLE hProcess, DWORD dwProcessId, bool* threadAttachExempt); - bool ShouldSkipCriticalProcess(DWORD dwProcessId); void InjectIntoNewProcess(HANDLE hProcess, DWORD dwProcessId, bool threadAttachExempt); @@ -28,7 +27,6 @@ class AllProcessesInjector { _In_ ULONG Flags, _Out_ PHANDLE NewThreadHandle); - bool m_skipCriticalProcesses = false; NtGetNextProcess_t m_NtGetNextProcess; NtGetNextThread_t m_NtGetNextThread; DWORD64 m_pRtlUserThreadStart; @@ -36,6 +34,5 @@ class AllProcessesInjector { std::wstring m_includePattern; std::wstring m_excludePattern; std::wstring m_threadAttachExemptPattern; - std::wstring m_criticalProcessesPattern; wil::unique_process_handle m_lastEnumeratedProcess; }; diff --git a/src/windhawk/engine/critical_processes.h b/src/windhawk/engine/critical_processes.h new file mode 100644 index 0000000..5dd4beb --- /dev/null +++ b/src/windhawk/engine/critical_processes.h @@ -0,0 +1,50 @@ +#pragma once + +// Based on: +// https://www.elastic.co/guide/en/security/current/unusual-parent-child-relationship.html +// https://github.com/elastic/security-docs/blob/9e98d789cb7b8d8fe98a3c3dec5012c4e1f22e99/docs/detections/prebuilt-rules/rule-details/unusual-parent-child-relationship.asciidoc +inline constexpr WCHAR kCriticalProcesses[] = + LR"(%systemroot%\system32\autochk.exe|)" + LR"(%systemroot%\syswow64\autochk.exe|)" + LR"(%systemroot%\system32\chkdsk.exe|)" + LR"(%systemroot%\syswow64\chkdsk.exe|)" + LR"(%systemroot%\system32\conhost.exe|)" + LR"(%systemroot%\system32\consent.exe|)" + LR"(%systemroot%\system32\csrss.exe|)" + LR"(%systemroot%\system32\dllhost.exe|)" + LR"(%systemroot%\syswow64\dllhost.exe|)" + LR"(%systemroot%\system32\doskey.exe|)" + LR"(%systemroot%\syswow64\doskey.exe|)" + LR"(%systemroot%\system32\dwm.exe|)" + LR"(%systemroot%\system32\fontdrvhost.exe|)" + LR"(%systemroot%\system32\logonui.exe|)" + LR"(%systemroot%\system32\lsaiso.exe|)" + LR"(%systemroot%\system32\lsass.exe|)" + LR"(%systemroot%\system32\runtimebroker.exe|)" + LR"(%systemroot%\system32\searchindexer.exe|)" + LR"(%systemroot%\syswow64\searchindexer.exe|)" + LR"(%systemroot%\system32\searchprotocolhost.exe|)" + LR"(%systemroot%\syswow64\searchprotocolhost.exe|)" + LR"(%systemroot%\system32\services.exe|)" + LR"(%systemroot%\system32\setupcl.exe|)" + LR"(%systemroot%\system32\smss.exe|)" + LR"(%systemroot%\system32\spoolsv.exe|)" + LR"(%systemroot%\system32\svchost.exe|)" + LR"(%systemroot%\syswow64\svchost.exe|)" + LR"(%systemroot%\system32\taskhostw.exe|)" + LR"(%systemroot%\system32\userinit.exe|)" + LR"(%systemroot%\syswow64\userinit.exe|)" + LR"(%systemroot%\system32\werfault.exe|)" + LR"(%systemroot%\syswow64\werfault.exe|)" + LR"(%systemroot%\system32\werfaultsecure.exe|)" + LR"(%systemroot%\syswow64\werfaultsecure.exe|)" + LR"(%systemroot%\system32\wermgr.exe|)" + LR"(%systemroot%\syswow64\wermgr.exe|)" + LR"(%systemroot%\system32\wininit.exe|)" + LR"(%systemroot%\system32\winlogon.exe|)" + LR"(%systemroot%\system32\winrshost.exe|)" + LR"(%systemroot%\syswow64\winrshost.exe|)" + LR"(%systemroot%\system32\wbem\wmiprvse.exe|)" + LR"(%systemroot%\syswow64\wbem\wmiprvse.exe|)" + LR"(%systemroot%\system32\wsmprovhost.exe|)" + LR"(%systemroot%\syswow64\wsmprovhost.exe)"; diff --git a/src/windhawk/engine/dll_inject.cpp b/src/windhawk/engine/dll_inject.cpp index 169e986..67bcd93 100644 --- a/src/windhawk/engine/dll_inject.cpp +++ b/src/windhawk/engine/dll_inject.cpp @@ -36,63 +36,116 @@ namespace { // subfolder. const BYTE x32APCShellcode[] = PRE_X32SHELLCODE_ARGS_3_TO_1 PRE_X32SHELLCODE_VIRTUAL_FREE - "\x55\x8B\xEC\x81\xEC\x88\x00\x00\x00\x64\xA1\x30\x00\x00\x00\xC7\x45\xB8" - "\x49\x6E\x6A\x65\xC7\x45\xBC\x63\x74\x49\x6E\x66\xC7\x45\xC0\x69\x74\xC6" - "\x45\xC2\x00\x8B\x48\x0C\x8B\x41\x14\x83\xC1\x14\xC7\x45\x90\x00\x00\x00" - "\x00\xC7\x45\x8C\x00\x00\x00\x00\xC7\x45\x88\x00\x00\x00\x00\xC7\x45\xF4" - "\x00\x00\x00\x00\xC7\x45\xEC\x00\x00\x00\x00\xC7\x45\xFC\x00\x00\x00\x00" - "\xC7\x45\xE8\x00\x00\x00\x00\xC7\x45\x84\x00\x00\x00\x00\x89\x4D\x80\x89" - "\x45\xF8\x53\x56\x57\x3B\xC1\x0F\x84\x7A\x03\x00\x00\x8B\x5D\xF4\x8D\x64" - "\x24\x00\x8B\x70\x28\x33\xC9\x0F\xB7\x50\x24\x8D\xA4\x24\x00\x00\x00\x00" - "\x0F\xB6\x3E\xC1\xC9\x0D\x80\x3E\x61\x72\x03\x83\xC1\xE0\x81\xC2\xFF\xFF" - "\x00\x00\x03\xCF\x46\x66\x85\xD2\x75\xE4\x81\xF9\x5B\xBC\x4A\x6A\x0F\x85" - "\xEB\x00\x00\x00\x8B\x5D\xF8\xC7\x45\x94\x08\x00\x00\x00\x8B\x5B\x10\x8B" - "\x43\x3C\x8B\x44\x18\x78\x03\xC3\x89\x85\x7C\xFF\xFF\xFF\x8B\x70\x20\x8B" - "\x78\x24\x03\xF3\x8B\x40\x18\x03\xFB\x89\x45\xF0\x85\xC0\x0F\x84\xB4\x00" - "\x00\x00\x8B\x16\x03\xD3\x33\xC0\x8A\x0A\xC1\xC8\x0D\x8D\x52\x01\x0F\xBE" - "\xC9\x03\xC1\x8A\x0A\x84\xC9\x75\xEF\x3D\xA4\x4E\x0E\xEC\x75\x05\x8D\x55" - "\x90\xEB\x52\x3D\xAA\xFC\x0D\x7C\x75\x05\x8D\x55\x8C\xEB\x46\x3D\xA0\xD5" - "\xC9\x4D\x75\x05\x8D\x55\x88\xEB\x3A\x3D\xAC\x33\x06\x03\x75\x05\x8D\x55" - "\xF4\xEB\x2E\x3D\x66\x19\xDA\x75\x75\x05\x8D\x55\xEC\xEB\x22\x3D\xBC\x22" - "\x0D\x47\x75\x05\x8D\x55\xFC\xEB\x16\x3D\xFB\x97\xFD\x0F\x75\x05\x8D\x55" - "\xE8\xEB\x0A\x3D\x7C\xC4\x22\x59\x75\x27\x8D\x55\x84\x8B\x85\x7C\xFF\xFF" - "\xFF\x0F\xB7\x0F\x8B\x40\x1C\x8D\x04\x88\x8B\x4D\x94\x8B\x04\x18\x03\xC3" - "\x81\xC1\xFF\xFF\x00\x00\x89\x02\x89\x4D\x94\xEB\x03\x8B\x4D\x94\x8B\x45" - "\xF0\x83\xC6\x04\x48\x83\xC7\x02\x89\x45\xF0\x66\x85\xC9\x0F\x85\x44\xFF" - "\xFF\xFF\x8B\x5D\xF4\x83\x7D\x90\x00\x74\x29\x83\x7D\x8C\x00\x74\x23\x83" - "\x7D\x88\x00\x74\x1D\x85\xDB\x74\x19\x83\x7D\xEC\x00\x74\x13\x83\x7D\xFC" - "\x00\x74\x0D\x83\x7D\xE8\x00\x74\x07\x8B\x45\x84\x85\xC0\x75\x1D\x8B\x45" - "\xF8\x8B\x00\x89\x45\xF8\x3B\x45\x80\x0F\x85\x9D\xFE\xFF\xFF\x8B\x45\xF4" - "\x5F\x5E\x5B\x8B\xE5\x5D\xC2\x04\x00\x8B\x4D\x08\x33\xFF\xC7\x45\xF8\x00" - "\x00\x00\x00\x33\xDB\x8B\x31\x8D\x8D\x78\xFF\xFF\xFF\x51\x6A\x01\xFF\xD0" - "\x83\xFE\x02\x7C\x18\x8D\x45\xDC\xC7\x45\xDC\x5B\x57\x48\x5D\x50\xC7\x45" - "\xE0\x20\x4C\x4C\x0A\x88\x5D\xE4\xFF\x55\xFC\x8B\x45\x08\x83\xC0\x20\x50" - "\xFF\x55\x90\x89\x45\xF0\x85\xC0\x0F\x84\xB5\x00\x00\x00\x83\xFE\x02\x7C" - "\x1E\x8D\x45\xC4\xC7\x45\xC4\x5B\x57\x48\x5D\x50\xC7\x45\xC8\x20\x47\x50" - "\x41\x66\xC7\x45\xCC\x0A\x00\xFF\x55\xFC\x8B\x45\xF0\x8D\x4D\xB8\x51\x50" - "\xFF\x55\x8C\x89\x45\x80\x85\xC0\x74\x6E\x83\xFE\x02\x7C\x55\x8D\x45\xD0" - "\xC7\x45\xD0\x5B\x57\x48\x5D\x50\xC7\x45\xD4\x20\x49\x49\x0A\x88\x5D\xD8" - "\xFF\x55\xFC\xFF\x75\x08\xC7\x45\xF8\x01\x00\x00\x00\xFF\x55\x80\x8B\xF8" - "\xC7\x45\xAC\x5B\x57\x48\x5D\x83\xC4\x04\xC7\x45\xB0\x20\x49\x49\x3A\x85" - "\xFF\xC6\x45\xB4\x20\x66\xC7\x45\xB6\x0A\x00\x0F\x95\xC0\x04\x30\x88\x45" - "\xB5\x8D\x45\xAC\x50\xFF\x55\xFC\xEB\x19\x8B\x4D\x08\x51\xC7\x45\xF8\x01" - "\x00\x00\x00\xFF\xD0\x83\xC4\x04\x8B\xF8\xEB\x05\xFF\x55\xEC\x8B\xD8\xFF" - "\x75\xF0\xFF\x55\x88\x85\xFF\x0F\x85\xF9\x00\x00\x00\xEB\x05\xFF\x55\xEC" - "\x8B\xD8\x8B\x7D\x08\x8B\x47\x18\x85\xC0\x74\x04\x50\xFF\x55\xE8\xFF\x77" - "\x10\xFF\x55\xE8\x83\x7D\xF8\x00\x0F\x85\xD4\x00\x00\x00\x83\xFE\x01\x0F" - "\x8C\xCB\x00\x00\x00\x8B\xCB\xC7\x45\x98\x5B\x57\x48\x5D\x83\xE1\x0F\xC7" - "\x45\x9C\x20\x45\x52\x52\x83\xF9\x0A\x66\xC7\x45\xA0\x3A\x20\x66\xC7\x45" - "\xAA\x0A\x00\x1A\xC0\x80\xC1\x37\x24\xF9\xC1\xEB\x04\x02\xC1\x8B\xCB\x88" - "\x45\xA9\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24\xF9\x04\x37\x02" - "\xC1\x8B\xCB\x88\x45\xA8\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24" - "\xF9\x04\x37\x02\xC1\x8B\xCB\x88\x45\xA7\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0" - "\xC1\xEB\x04\x24\xF9\x04\x37\x02\xC1\x8B\xCB\x88\x45\xA6\x83\xE1\x0F\x83" - "\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24\xF9\x04\x37\x02\xC1\x8B\xCB\x88\x45\xA5" - "\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24\xF9\x04\x37\x02\xC1\x8B" - "\xCB\x88\x45\xA4\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\x80\xC1\x37\x24\xF9\xC1" - "\xEB\x04\x02\xC1\x83\xFB\x0A\x88\x45\xA3\x1A\xC0\x24\xF9\x04\x37\x02\xC3" - "\x88\x45\xA2\x8D\x45\x98\x50\xFF\x55\xFC\x6A\x00\xFF\xB5\x78\xFF\xFF\xFF" - "\xFF\x55\x84\x8B\x45\xF4\x5F\x5E\x5B\x8B\xE5\x5D\xC2\x04\x00"; + "\x55\x8B\xEC\x81\xEC\x6C\x01\x00\x00\x53\x56\x57\xC7\x85\x7C\xFF\xFF\xFF" + "\x4B\x45\x52\x4E\x8D\x85\x6C\xFF\xFF\xFF\xC7\x45\x80\x45\x4C\x33\x32\xC7" + "\x45\x84\x2E\x44\x4C\x4C\xC7\x85\x6C\xFF\xFF\xFF\x4C\x6F\x61\x64\xC7\x85" + "\x70\xFF\xFF\xFF\x4C\x69\x62\x72\xC7\x85\x74\xFF\xFF\xFF\x61\x72\x79\x57" + "\xC6\x85\x78\xFF\xFF\xFF\x00\xC7\x85\x4C\xFF\xFF\xFF\x47\x65\x74\x50\xC7" + "\x85\x50\xFF\xFF\xFF\x72\x6F\x63\x41\xC7\x85\x54\xFF\xFF\xFF\x64\x64\x72" + "\x65\x66\xC7\x85\x58\xFF\xFF\xFF\x73\x73\xC6\x85\x5A\xFF\xFF\xFF\x00\xC7" + "\x45\xA0\x46\x72\x65\x65\xC7\x45\xA4\x4C\x69\x62\x72\xC7\x45\xA8\x61\x72" + "\x79\x00\xC7\x45\x94\x56\x69\x72\x74\xC7\x45\x98\x75\x61\x6C\x46\xC7\x45" + "\x9C\x72\x65\x65\x00\xC7\x85\x5C\xFF\xFF\xFF\x47\x65\x74\x4C\xC7\x85\x60" + "\xFF\xFF\xFF\x61\x73\x74\x45\xC7\x85\x64\xFF\xFF\xFF\x72\x72\x6F\x72\xC6" + "\x85\x68\xFF\xFF\xFF\x00\xC6\x85\x38\xFF\xFF\xFF\x4F\xC6\x85\x39\xFF\xFF" + "\xFF\x75\xC6\x85\x3A\xFF\xFF\xFF\x74\xC6\x85\x3B\xFF\xFF\xFF\x70\xC6\x85" + "\x3C\xFF\xFF\xFF\x75\xC6\x85\x3D\xFF\xFF\xFF\x74\xC6\x85\x3E\xFF\xFF\xFF" + "\x44\xC6\x85\x3F\xFF\xFF\xFF\x65\xC6\x85\x40\xFF\xFF\xFF\x62\xC6\x85\x41" + "\xFF\xFF\xFF\x75\xC6\x85\x42\xFF\xFF\xFF\x67\xC6\x85\x43\xFF\xFF\xFF\x53" + "\xC6\x85\x44\xFF\xFF\xFF\x74\xC6\x85\x45\xFF\xFF\xFF\x72\xC6\x85\x46\xFF" + "\xFF\xFF\x69\xC6\x85\x47\xFF\xFF\xFF\x6E\xC6\x85\x48\xFF\xFF\xFF\x67\xC6" + "\x85\x49\xFF\xFF\xFF\x41\xC6\x85\x4A\xFF\xFF\xFF\x00\xC7\x45\x88\x43\x6C" + "\x6F\x73\xC7\x45\x8C\x65\x48\x61\x6E\xC7\x45\x90\x64\x6C\x65\x00\xC6\x85" + "\x24\xFF\xFF\xFF\x53\xC6\x85\x25\xFF\xFF\xFF\x65\xC6\x85\x26\xFF\xFF\xFF" + "\x74\xC6\x85\x27\xFF\xFF\xFF\x54\xC6\x85\x28\xFF\xFF\xFF\x68\xC6\x85\x29" + "\xFF\xFF\xFF\x72\x89\x85\xB4\xFE\xFF\xFF\x8D\x85\x4C\xFF\xFF\xFF\xC6\x85" + "\x2A\xFF\xFF\xFF\x65\xC6\x85\x2B\xFF\xFF\xFF\x61\x89\x85\xB8\xFE\xFF\xFF" + "\x8D\x45\xA0\xC6\x85\x2C\xFF\xFF\xFF\x64\xC6\x85\x2D\xFF\xFF\xFF\x45\x89" + "\x85\xBC\xFE\xFF\xFF\x8D\x45\x94\xC6\x85\x2E\xFF\xFF\xFF\x72\xC6\x85\x2F" + "\xFF\xFF\xFF\x72\x89\x85\xC0\xFE\xFF\xFF\x8D\x85\x5C\xFF\xFF\xFF\xC6\x85" + "\x30\xFF\xFF\xFF\x6F\xC6\x85\x31\xFF\xFF\xFF\x72\x89\x85\xC4\xFE\xFF\xFF" + "\x8D\x85\x38\xFF\xFF\xFF\xC6\x85\x32\xFF\xFF\xFF\x4D\xC6\x85\x33\xFF\xFF" + "\xFF\x6F\x89\x85\xC8\xFE\xFF\xFF\x8D\x45\x88\xC6\x85\x34\xFF\xFF\xFF\x64" + "\xC6\x85\x35\xFF\xFF\xFF\x65\x89\x85\xCC\xFE\xFF\xFF\x8D\x85\x24\xFF\xFF" + "\xFF\xC6\x85\x36\xFF\xFF\xFF\x00\x89\x85\xD0\xFE\xFF\xFF\x32\xC9\x8D\x85" + "\xFC\xFE\xFF\xFF\xC7\x85\xFC\xFE\xFF\xFF\x00\x00\x00\x00\x89\x85\x94\xFE" + "\xFF\xFF\x8D\x85\xF8\xFE\xFF\xFF\x89\x85\x98\xFE\xFF\xFF\x8D\x85\xF4\xFE" + "\xFF\xFF\x89\x85\x9C\xFE\xFF\xFF\x8D\x85\x0C\xFF\xFF\xFF\x89\x85\xA0\xFE" + "\xFF\xFF\x8D\x85\x18\xFF\xFF\xFF\x89\x85\xA4\xFE\xFF\xFF\x8D\x45\xEC\x89" + "\x85\xA8\xFE\xFF\xFF\x8D\x85\x14\xFF\xFF\xFF\x89\x85\xAC\xFE\xFF\xFF\x8D" + "\x85\x10\xFF\xFF\xFF\x89\x85\xB0\xFE\xFF\xFF\x8D\x85\x7C\xFF\xFF\xFF\x89" + "\x85\xD4\xFE\xFF\xFF\x8D\x85\xB4\xFE\xFF\xFF\x89\x85\xDC\xFE\xFF\xFF\x8D" + "\x85\x94\xFE\xFF\xFF\x89\x85\xE0\xFE\xFF\xFF\x64\xA1\x30\x00\x00\x00\xC7" + "\x85\xF8\xFE\xFF\xFF\x00\x00\x00\x00\xC7\x85\xF4\xFE\xFF\xFF\x00\x00\x00" + "\x00\xC7\x85\x0C\xFF\xFF\xFF\x00\x00\x00\x00\xC7\x85\x18\xFF\xFF\xFF\x00" + "\x00\x00\x00\xC7\x45\xEC\x00\x00\x00\x00\xC7\x85\x14\xFF\xFF\xFF\x00\x00" + "\x00\x00\xC7\x85\x10\xFF\xFF\xFF\x00\x00\x00\x00\x8B\x40\x0C\x83\xC0\x14" + "\xC7\x85\xD8\xFE\xFF\xFF\x0C\x00\x00\x00\xC7\x85\xE4\xFE\xFF\xFF\x08\x00" + "\x00\x00\x89\x85\x08\xFF\xFF\xFF\x8B\x10\x3B\xD0\x0F\x84\xA9\x00\x00\x00" + "\x8D\x64\x24\x00\x8B\xC2\x8D\x9D\xD4\xFE\xFF\xFF\x8B\x12\x89\x45\xE8\x89" + "\x95\xE8\xFE\xFF\xFF\x8B\x50\x28\x66\x8B\x40\x24\x66\xD1\xE8\x89\x55\xFC" + "\x0F\xB7\xF8\x89\x9D\x20\xFF\xFF\xFF\x8D\xA4\x24\x00\x00\x00\x00\x83\x7B" + "\x10\x00\x74\x48\x3B\x7B\x04\x75\x43\x33\xC0\x33\xF6\x66\x3B\xC7\x73\x35" + "\x8B\x1B\x0F\xB7\xCE\x0F\xB7\x14\x4A\x8D\x42\x9F\x66\x83\xF8\x19\x77\x06" + "\x81\xC2\xE0\xFF\x00\x00\x0F\xBE\x0C\x0B\x0F\xB7\xC2\x3B\xC1\x75\x09\x8B" + "\x55\xFC\x46\x66\x3B\xF7\x72\xD6\x8B\x9D\x20\xFF\xFF\xFF\x8B\x55\xFC\x66" + "\x3B\xF7\x74\x71\x83\xC3\x14\x8D\x85\xE8\xFE\xFF\xFF\x89\x9D\x20\xFF\xFF" + "\xFF\x3B\xD8\x75\x9F\x32\xC9\x8B\x95\xE8\xFE\xFF\xFF\x3B\x95\x08\xFF\xFF" + "\xFF\x0F\x85\x5B\xFF\xFF\xFF\x8B\x55\x08\x8B\x32\x84\xC9\x0F\x85\x75\x01" + "\x00\x00\x8B\x45\xEC\x85\xC0\x0F\x84\xA3\x03\x00\x00\x83\xFE\x01\x0F\x8C" + "\x9A\x03\x00\x00\x8D\x4D\xF0\xC7\x45\xF0\x5B\x57\x48\x5D\x51\xC7\x45\xF4" + "\x20\x45\x58\x50\x66\xC7\x45\xF8\x0A\x00\xFF\xD0\x8B\x85\x0C\xFF\xFF\xFF" + "\x5F\x5E\x5B\x8B\xE5\x5D\xC2\x04\x00\x32\xC9\x85\xDB\x74\x9E\x8B\x45\xE8" + "\x8B\x78\x10\x89\x7D\xD0\x8B\x47\x3C\x8B\x54\x38\x78\x8B\x44\x3A\x20\x03" + "\xD7\x03\xC7\x89\x95\xEC\xFE\xFF\xFF\x89\x85\x00\xFF\xFF\xFF\x8B\x4A\x24" + "\x8B\x72\x18\x03\xCF\x89\x8D\x1C\xFF\xFF\xFF\x8B\x4B\x10\x89\x75\xE8\x89" + "\x4D\xFC\x85\xC9\x74\x6D\x85\xF6\x74\x69\x8B\x30\x8B\xD1\x03\xF7\x33\xFF" + "\x85\xC9\x74\x34\x8B\x43\x08\x8A\x2E\x8D\xA4\x24\x00\x00\x00\x00\x8B\x14" + "\xB8\x8A\x0A\x3A\xCD\x75\x17\x8B\xC6\x2B\xD6\x8D\x49\x00\x84\xC9\x74\x68" + "\x8A\x4C\x02\x01\x40\x3A\x08\x74\xF3\x8B\x43\x08\x8B\x53\x10\x47\x3B\xFA" + "\x72\xD8\x8B\x7D\xD0\x8B\x85\x00\xFF\xFF\xFF\x8B\xCA\x8B\x75\xE8\x83\xC0" + "\x04\x83\x85\x1C\xFF\xFF\xFF\x02\x4E\x89\x85\x00\xFF\xFF\xFF\x89\x75\xE8" + "\x89\x55\xFC\x85\xD2\x75\x93\xB1\x01\x8D\x85\xD4\xFE\xFF\xFF\x8D\xA4\x24" + "\x00\x00\x00\x00\x83\x78\x10\x00\x0F\x87\xD7\xFE\xFF\xFF\x83\xC0\x14\x8D" + "\x95\xE8\xFE\xFF\xFF\x3B\xC2\x75\xE9\xE9\xD9\xFE\xFF\xFF\x8B\x4B\x0C\x8B" + "\x43\x10\x8B\x55\xFC\x48\x8B\x34\xB9\x3B\xF8\x73\x1A\x8B\x43\x08\x8B\x5B" + "\x08\x8B\x44\x90\xFC\x89\x04\xBB\x8B\x44\x91\xFC\x8B\x9D\x20\xFF\xFF\xFF" + "\x89\x04\xB9\x8B\x7D\xD0\x4A\x89\x53\x10\x85\xF6\x0F\x84\x75\xFF\xFF\xFF" + "\x8B\x85\x1C\xFF\xFF\xFF\x0F\xB7\x08\x8B\x85\xEC\xFE\xFF\xFF\x8B\x40\x1C" + "\x8D\x04\x88\x8B\x04\x38\x03\xC7\x89\x06\xE9\x54\xFF\xFF\xFF\x8D\x85\xF0" + "\xFE\xFF\xFF\xC7\x45\xAC\x49\x6E\x6A\x65\x50\x6A\x01\xC7\x45\xB0\x63\x74" + "\x49\x6E\x33\xFF\x66\xC7\x45\xB4\x69\x74\x33\xDB\xC6\x45\xB6\x00\xC7\x45" + "\xFC\x00\x00\x00\x00\xFF\x95\x10\xFF\xFF\xFF\x83\xFE\x02\x7C\x18\x8D\x45" + "\xC4\xC7\x45\xC4\x5B\x57\x48\x5D\x50\xC7\x45\xC8\x20\x4C\x4C\x0A\x88\x5D" + "\xCC\xFF\x55\xEC\x8B\x45\x08\x83\xC0\x20\x50\xFF\x95\xFC\xFE\xFF\xFF\x89" + "\x45\xE8\x85\xC0\x0F\x84\xC4\x00\x00\x00\x83\xFE\x02\x7C\x1E\x8D\x45\xB8" + "\xC7\x45\xB8\x5B\x57\x48\x5D\x50\xC7\x45\xBC\x20\x47\x50\x41\x66\xC7\x45" + "\xC0\x0A\x00\xFF\x55\xEC\x8B\x45\xE8\x8D\x4D\xAC\x51\x50\xFF\x95\xF8\xFE" + "\xFF\xFF\x89\x85\x08\xFF\xFF\xFF\x85\xC0\x74\x71\x83\xFE\x02\x7C\x58\x8D" + "\x45\xF0\xC7\x45\xF0\x5B\x57\x48\x5D\x50\xC7\x45\xF4\x20\x49\x49\x0A\x88" + "\x5D\xF8\xFF\x55\xEC\xFF\x75\x08\xC7\x45\xFC\x01\x00\x00\x00\xFF\x95\x08" + "\xFF\xFF\xFF\x8B\xF8\xC7\x45\xDC\x5B\x57\x48\x5D\x83\xC4\x04\xC7\x45\xE0" + "\x20\x49\x49\x3A\x85\xFF\xC6\x45\xE4\x20\x66\xC7\x45\xE6\x0A\x00\x0F\x95" + "\xC0\x04\x30\x88\x45\xE5\x8D\x45\xDC\x50\xFF\x55\xEC\xEB\x1C\x8B\x55\x08" + "\x52\xC7\x45\xFC\x01\x00\x00\x00\xFF\xD0\x83\xC4\x04\x8B\xF8\xEB\x08\xFF" + "\x95\x18\xFF\xFF\xFF\x8B\xD8\xFF\x75\xE8\xFF\x95\xF4\xFE\xFF\xFF\x85\xFF" + "\x0F\x85\x02\x01\x00\x00\xEB\x08\xFF\x95\x18\xFF\xFF\xFF\x8B\xD8\x8B\x7D" + "\x08\x8B\x47\x18\x85\xC0\x74\x07\x50\xFF\x95\x14\xFF\xFF\xFF\xFF\x77\x10" + "\xFF\x95\x14\xFF\xFF\xFF\x83\x7D\xFC\x00\x0F\x85\xD4\x00\x00\x00\x83\xFE" + "\x01\x0F\x8C\xCB\x00\x00\x00\x8B\xCB\xC7\x45\xD4\x5B\x57\x48\x5D\x83\xE1" + "\x0F\xC7\x45\xD8\x20\x45\x52\x52\x83\xF9\x0A\x66\xC7\x45\xDC\x3A\x20\x66" + "\xC7\x45\xE6\x0A\x00\x1A\xC0\x80\xC1\x37\x24\xF9\xC1\xEB\x04\x02\xC1\x8B" + "\xCB\x88\x45\xE5\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24\xF9\x04" + "\x37\x02\xC1\x8B\xCB\x88\x45\xE4\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB" + "\x04\x24\xF9\x04\x37\x02\xC1\x8B\xCB\x88\x45\xE3\x83\xE1\x0F\x83\xF9\x0A" + "\x1A\xC0\xC1\xEB\x04\x24\xF9\x04\x37\x02\xC1\x8B\xCB\x88\x45\xE2\x83\xE1" + "\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24\xF9\x04\x37\x02\xC1\x8B\xCB\x88" + "\x45\xE1\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\xC1\xEB\x04\x24\xF9\x04\x37\x02" + "\xC1\x8B\xCB\x88\x45\xE0\x83\xE1\x0F\x83\xF9\x0A\x1A\xC0\x80\xC1\x37\x24" + "\xF9\xC1\xEB\x04\x02\xC1\x83\xFB\x0A\x88\x45\xDF\x1A\xC0\x24\xF9\x04\x37" + "\x02\xC3\x88\x45\xDE\x8D\x45\xD4\x50\xFF\x55\xEC\x6A\x00\xFF\xB5\xF0\xFE" + "\xFF\xFF\xFF\x95\x10\xFF\xFF\xFF\x8B\x85\x0C\xFF\xFF\xFF\x5F\x5E\x5B\x8B" + "\xE5\x5D\xC2\x04\x00"; constexpr SIZE_T x32APCShellcodeSize = sizeof(x32APCShellcode) - 1; @@ -118,69 +171,107 @@ constexpr SIZE_T x32ShellcodeSize = // subfolder. const BYTE x64Shellcode[] = PRE_X64SHELLCODE_VIRTUAL_FREE "\x48\x89\x4C\x24\x08\x55\x53\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48" - "\x8D\x6C\x24\xE1\x48\x81\xEC\xD8\x00\x00\x00\x45\x33\xF6\xC7\x45\x97\x49" - "\x6E\x6A\x65\xC7\x45\x9B\x63\x74\x49\x6E\x66\xC7\x45\x9F\x69\x74\xC6\x45" - "\xA1\x00\x65\x48\x8B\x04\x25\x60\x00\x00\x00\x4C\x89\x75\xD7\x4C\x8B\x65" - "\xD7\x4C\x89\x75\xF7\x48\x8B\x70\x18\x48\x83\xC6\x20\x4C\x89\x75\xDF\x4C" - "\x89\x75\x7F\x4C\x89\x75\xCF\x4C\x89\x75\xEF\x48\x8B\x3E\x4C\x89\x75\xE7" - "\x4C\x89\x75\x77\x4C\x89\x75\xFF\x48\x89\x75\x07\x48\x89\x7D\x0F\x48\x3B" - "\xFE\x0F\x84\xDA\x03\x00\x00\x4C\x8B\x7D\xDF\x4C\x8B\x6D\xE7\x4C\x8B\x55" - "\x77\x4C\x8B\x5D\x7F\x48\x8B\x5D\xCF\x0F\x1F\x80\x00\x00\x00\x00\x4C\x8B" - "\x47\x50\x49\x8B\xC6\x44\x0F\xB7\x4F\x48\xBE\xFF\xFF\x00\x00\x0F\x1F\x40" - "\x00\x66\x66\x66\x0F\x1F\x84\x00\x00\x00\x00\x00\x41\x0F\xB6\x08\x4D\x8D" - "\x40\x01\xC1\xC8\x0D\x8B\xD0\x48\x03\xD1\x80\xF9\x61\x48\x8D\x42\xE0\x48" - "\x0F\x42\xC2\x66\x44\x03\xCE\x75\xDF\x48\x8B\x75\x07\x3D\x5B\xBC\x4A\x6A" - "\x0F\x85\x17\x01\x00\x00\x4C\x8B\x4F\x20\xBF\x08\x00\x00\x00\x49\x63\x41" - "\x3C\x42\x8B\xB4\x08\x88\x00\x00\x00\x49\x03\xF1\x44\x8B\x56\x20\x44\x8B" - "\x5E\x24\x4D\x03\xD1\x8B\x5E\x18\x4D\x03\xD9\x0F\x1F\x80\x00\x00\x00\x00" - "\x85\xDB\x0F\x84\xBF\x00\x00\x00\x41\x8B\x12\x41\x8B\xC6\x49\x03\xD1\x0F" - "\xB6\x0A\x0F\x1F\x40\x00\x0F\x1F\x84\x00\x00\x00\x00\x00\xC1\xC8\x0D\x48" - "\x8D\x52\x01\x0F\xBE\xC9\x03\xC1\x0F\xB6\x0A\x84\xC9\x75\xED\x3D\xA4\x4E" - "\x0E\xEC\x75\x06\x4C\x8D\x45\xDF\xEB\x59\x3D\xAA\xFC\x0D\x7C\x75\x06\x4C" - "\x8D\x45\x7F\xEB\x4C\x3D\xA0\xD5\xC9\x4D\x75\x06\x4C\x8D\x45\xCF\xEB\x3F" - "\x3D\xAC\x33\x06\x03\x75\x06\x4C\x8D\x45\xD7\xEB\x32\x3D\x66\x19\xDA\x75" - "\x75\x06\x4C\x8D\x45\xEF\xEB\x25\x3D\xBC\x22\x0D\x47\x75\x06\x4C\x8D\x45" - "\xE7\xEB\x18\x3D\xFB\x97\xFD\x0F\x75\x06\x4C\x8D\x45\x77\xEB\x0B\x3D\x7C" - "\xC4\x22\x59\x75\x1F\x4C\x8D\x45\xFF\x8B\x4E\x1C\x41\x0F\xB7\x13\x49\x03" - "\xC9\x8B\x04\x91\x49\x03\xC1\x49\x89\x00\xB8\xFF\xFF\x00\x00\x66\x03\xF8" - "\x49\x83\xC2\x04\x49\x83\xC3\x02\xFF\xCB\x66\x85\xFF\x0F\x85\x39\xFF\xFF" - "\xFF\x4C\x8B\x7D\xDF\x4C\x8B\x65\xD7\x4C\x8B\x6D\xE7\x4C\x8B\x55\x77\x4C" - "\x8B\x5D\x7F\x48\x8B\x5D\xCF\x48\x8B\x7D\x0F\x48\x8B\x75\x07\x4D\x85\xFF" - "\x74\x2E\x4D\x85\xDB\x74\x29\x48\x85\xDB\x74\x24\x4D\x85\xE4\x74\x1F\x4C" - "\x8B\x75\xEF\x4D\x85\xF6\x74\x13\x4D\x85\xED\x74\x0E\x4D\x85\xD2\x74\x09" - "\x48\x8B\x45\xFF\x48\x85\xC0\x75\x18\x45\x33\xF6\x48\x8B\x3F\x48\x89\x7D" - "\x0F\x48\x3B\xFE\x0F\x85\x56\xFE\xFF\xFF\xE9\x10\x02\x00\x00\x48\x8B\x4D" - "\x67\x48\x8D\x55\x6F\x8B\x39\x33\xC9\x8B\xF1\x8B\xD9\xB9\x01\x00\x00\x00" - "\xFF\xD0\x83\xFF\x02\x7C\x1C\x48\x8D\x4C\x24\x20\xC7\x44\x24\x20\x5B\x57" - "\x48\x5D\xC7\x44\x24\x24\x20\x4C\x4C\x0A\x88\x5C\x24\x28\x41\xFF\xD5\x48" - "\x8B\x4D\x67\x48\x83\xC1\x20\x41\xFF\xD7\x4C\x8B\xF8\x48\x85\xC0\x0F\x84" - "\xB5\x00\x00\x00\x83\xFF\x02\x7C\x1B\x48\x8D\x4D\x87\xC7\x45\x87\x5B\x57" - "\x48\x5D\xC7\x45\x8B\x20\x47\x50\x41\x66\xC7\x45\x8F\x0A\x00\x41\xFF\xD5" - "\x48\x8D\x55\x97\x49\x8B\xCF\xFF\x55\x7F\x4C\x8B\xF0\x48\x85\xC0\x74\x6E" - "\x83\xFF\x02\x7C\x57\x48\x8D\x4C\x24\x30\xC7\x44\x24\x30\x5B\x57\x48\x5D" - "\xC7\x44\x24\x34\x20\x49\x49\x0A\x88\x5C\x24\x38\x41\xFF\xD5\x48\x8B\x4D" - "\x67\xC7\x45\xF7\x01\x00\x00\x00\x41\xFF\xD6\x85\xC0\xC7\x45\xA7\x5B\x57" - "\x48\x5D\x8B\xF0\xC7\x45\xAB\x20\x49\x49\x3A\x0F\x95\xC0\xC6\x45\xAF\x20" - "\x04\x30\x66\xC7\x45\xB1\x0A\x00\x48\x8D\x4D\xA7\x88\x45\xB0\x41\xFF\xD5" - "\xEB\x17\x48\x8B\x4D\x67\xC7\x45\xF7\x01\x00\x00\x00\x41\xFF\xD6\x8B\xF0" - "\xEB\x05\xFF\x55\xEF\x8B\xD8\x49\x8B\xCF\xFF\x55\xCF\x85\xF6\x0F\x85\x06" - "\x01\x00\x00\xEB\x05\x41\xFF\xD6\x8B\xD8\x48\x8B\x75\x67\x48\x8B\x4E\x18" - "\x48\x85\xC9\x74\x03\xFF\x55\x77\x48\x8B\x4E\x10\xFF\x55\x77\x83\x7D\xF7" - "\x00\x0F\x85\xDE\x00\x00\x00\x83\xFF\x01\x0F\x8C\xD5\x00\x00\x00\x8B\xCB" - "\xC7\x45\xB7\x5B\x57\x48\x5D\x83\xE1\x0F\xC7\x45\xBB\x20\x45\x52\x52\x83" - "\xF9\x0A\x66\xC7\x45\xBF\x3A\x20\xBA\x30\x00\x00\x00\x66\xC7\x45\xC9\x0A" - "\x00\x41\xB8\x37\x00\x00\x00\x8B\xC2\x41\x0F\x43\xC0\xC1\xEB\x04\x02\xC1" - "\x8B\xCB\x83\xE1\x0F\x88\x45\xC8\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1" - "\xEB\x04\x02\xC1\x8B\xCB\x83\xE1\x0F\x88\x45\xC7\x83\xF9\x0A\x8B\xC2\x41" - "\x0F\x43\xC0\xC1\xEB\x04\x02\xC1\x8B\xCB\x83\xE1\x0F\x88\x45\xC6\x83\xF9" - "\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1\xEB\x04\x02\xC1\x8B\xCB\x83\xE1\x0F\x88" - "\x45\xC5\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1\xEB\x04\x02\xC1\x8B\xCB" - "\x83\xE1\x0F\x88\x45\xC4\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1\xEB\x04" - "\x02\xC1\x8B\xCB\x83\xE1\x0F\x88\x45\xC3\x83\xF9\x0A\x8B\xC2\x41\x0F\x43" - "\xC0\xC1\xEB\x04\x02\xC1\x83\xE3\x0F\x83\xFB\x0A\x88\x45\xC2\x48\x8D\x4D" - "\xB7\x41\x0F\x43\xD0\x02\xD3\x88\x55\xC1\x41\xFF\xD5\x8B\x4D\x6F\x33\xD2" - "\xFF\x55\xFF\x49\x8B\xC4\x48\x81\xC4\xD8\x00\x00\x00\x41\x5F\x41\x5E\x41" - "\x5D\x41\x5C\x5F\x5E\x5B\x5D\xC3"; + "\x8D\xAC\x24\xE8\xFE\xFF\xFF\x48\x81\xEC\x18\x02\x00\x00\xC7\x45\xA8\x4B" + "\x45\x52\x4E\x48\x8D\x45\xB8\xC7\x45\xAC\x45\x4C\x33\x32\x4C\x8B\xE9\xC7" + "\x45\xB0\x2E\x44\x4C\x4C\x33\xD2\xC7\x45\xB8\x4C\x6F\x61\x64\xC7\x45\xBC" + "\x4C\x69\x62\x72\xC7\x45\xC0\x61\x72\x79\x57\xC6\x45\xC4\x00\xC7\x45\xD8" + "\x47\x65\x74\x50\xC7\x45\xDC\x72\x6F\x63\x41\xC7\x45\xE0\x64\x64\x72\x65" + "\x66\xC7\x45\xE4\x73\x73\xC6\x45\xE6\x00\xC7\x44\x24\x78\x46\x72\x65\x65" + "\xC7\x44\x24\x7C\x4C\x69\x62\x72\xC7\x45\x80\x61\x72\x79\x00\xC7\x45\x88" + "\x56\x69\x72\x74\xC7\x45\x8C\x75\x61\x6C\x46\xC7\x45\x90\x72\x65\x65\x00" + "\xC7\x45\xC8\x47\x65\x74\x4C\xC7\x45\xCC\x61\x73\x74\x45\xC7\x45\xD0\x72" + "\x72\x6F\x72\xC6\x45\xD4\x00\xC6\x45\xE8\x4F\xC6\x45\xE9\x75\xC6\x45\xEA" + "\x74\xC6\x45\xEB\x70\xC6\x45\xEC\x75\xC6\x45\xED\x74\xC6\x45\xEE\x44\xC6" + "\x45\xEF\x65\xC6\x45\xF0\x62\xC6\x45\xF1\x75\xC6\x45\xF2\x67\xC6\x45\xF3" + "\x53\xC6\x45\xF4\x74\xC6\x45\xF5\x72\xC6\x45\xF6\x69\xC6\x45\xF7\x6E\xC6" + "\x45\xF8\x67\xC6\x45\xF9\x41\xC6\x45\xFA\x00\xC7\x45\x98\x43\x6C\x6F\x73" + "\xC7\x45\x9C\x65\x48\x61\x6E\xC7\x45\xA0\x64\x6C\x65\x00\xC6\x45\x00\x53" + "\xC6\x45\x01\x65\xC6\x45\x02\x74\xC6\x45\x03\x54\xC6\x45\x04\x68\xC6\x45" + "\x05\x72\xC6\x45\x06\x65\xC6\x45\x07\x61\xC6\x45\x08\x64\xC6\x45\x09\x45" + "\xC6\x45\x0A\x72\x48\x89\x85\x90\x00\x00\x00\x48\x8D\x45\xD8\xC6\x45\x0B" + "\x72\x48\x89\x85\x98\x00\x00\x00\x48\x8D\x44\x24\x78\xC6\x45\x0C\x6F\x48" + "\x89\x85\xA0\x00\x00\x00\x48\x8D\x45\x88\xC6\x45\x0D\x72\x48\x89\x85\xA8" + "\x00\x00\x00\x48\x8D\x45\xC8\xC6\x45\x0E\x4D\x48\x89\x85\xB0\x00\x00\x00" + "\x48\x8D\x45\xE8\xC6\x45\x0F\x6F\x48\x89\x85\xB8\x00\x00\x00\x48\x8D\x45" + "\x98\xC6\x45\x10\x64\x48\x89\x85\xC0\x00\x00\x00\x48\x8D\x45\x00\xC6\x45" + "\x11\x65\xC6\x45\x12\x00\x48\x89\x85\xC8\x00\x00\x00\x48\x8D\x45\x30\x48" + "\x89\x55\x30\x48\x89\x85\xD0\x00\x00\x00\x32\xC9\x48\x89\x55\x38\x48\x8D" + "\x45\x38\x48\x89\x85\xD8\x00\x00\x00\x48\x8D\x45\x40\x48\x89\x85\xE0\x00" + "\x00\x00\x48\x8D\x45\x28\x48\x89\x85\xE8\x00\x00\x00\x48\x8D\x85\x78\x01" + "\x00\x00\x48\x89\x85\xF0\x00\x00\x00\x48\x8D\x85\x70\x01\x00\x00\x48\x89" + "\x85\xF8\x00\x00\x00\x48\x8D\x45\x18\x48\x89\x85\x00\x01\x00\x00\x48\x8D" + "\x45\x20\x48\x89\x85\x08\x01\x00\x00\x48\x8D\x45\xA8\x48\x89\x45\x60\x48" + "\x8D\x85\x90\x00\x00\x00\x48\x89\x45\x70\x48\x8D\x85\xD0\x00\x00\x00\x48" + "\x89\x55\x40\x48\x89\x55\x28\x48\x89\x95\x78\x01\x00\x00\x48\x89\x95\x70" + "\x01\x00\x00\x48\x89\x55\x18\x48\x89\x55\x20\x48\x89\x45\x78\x65\x48\x8B" + "\x04\x25\x60\x00\x00\x00\x48\xC7\x45\x68\x0C\x00\x00\x00\x48\xC7\x85\x80" + "\x00\x00\x00\x08\x00\x00\x00\x4C\x8B\x40\x18\x49\x8B\x40\x20\x49\x83\xC0" + "\x20\x4C\x89\x45\x58\x49\x3B\xC0\x0F\x84\xA6\x00\x00\x00\x66\x66\x0F\x1F" + "\x84\x00\x00\x00\x00\x00\x44\x0F\xB7\x58\x48\x48\x8D\x30\x48\x8B\x00\x4C" + "\x8D\x55\x60\x48\x8B\x7E\x50\x66\x41\xD1\xEB\x48\x89\x45\x50\x0F\x1F\x44" + "\x00\x00\x49\x83\x7A\x20\x00\x74\x4E\x41\x0F\xB7\xC3\x49\x3B\x42\x08\x75" + "\x44\x44\x0F\xB7\xCA\x66\x41\x3B\xD3\x73\x34\x49\x8B\x1A\x66\x90\x45\x0F" + "\xB7\xC1\x42\x0F\xB7\x14\x47\x8D\x42\x9F\x66\x83\xF8\x19\x8D\x4A\xE0\x42" + "\x0F\xBE\x04\x03\x66\x0F\x47\xCA\x0F\xB7\xC9\x3B\xC8\x75\x0A\x66\x41\xFF" + "\xC1\x66\x45\x3B\xCB\x72\xD3\x33\xD2\x66\x45\x3B\xCB\x74\x6F\x49\x83\xC2" + "\x28\x48\x8D\x85\x88\x00\x00\x00\x4C\x3B\xD0\x75\x9B\x32\xC9\x48\x8B\x45" + "\x50\x48\x3B\x45\x58\x0F\x85\x6B\xFF\xFF\xFF\x4C\x8B\xAD\x60\x01\x00\x00" + "\x41\x8B\x5D\x00\x84\xC9\x0F\x85\x68\x01\x00\x00\x48\x8B\x85\x70\x01\x00" + "\x00\x48\x85\xC0\x0F\x84\xAC\x03\x00\x00\x83\xFB\x01\x0F\x8C\xA3\x03\x00" + "\x00\x48\x8D\x4C\x24\x20\xC7\x44\x24\x20\x5B\x57\x48\x5D\xC7\x44\x24\x24" + "\x20\x45\x58\x50\x66\xC7\x44\x24\x28\x0A\x00\xFF\xD0\xE9\x80\x03\x00\x00" + "\x32\xC9\x4D\x85\xD2\x74\x9C\x4C\x8B\x76\x20\x49\x8B\x7A\x20\x49\x63\x46" + "\x3C\x42\x8B\x84\x30\x88\x00\x00\x00\x49\x03\xC6\x48\x89\x45\x48\x44\x8B" + "\x78\x20\x44\x8B\x60\x24\x4D\x03\xFE\x44\x8B\x68\x18\x4D\x03\xE6\x48\x85" + "\xFF\x0F\x84\xC3\x00\x00\x00\x45\x85\xED\x0F\x84\xBA\x00\x00\x00\x45\x8B" + "\x1F\x4C\x8B\xCA\x4D\x03\xDE\x4C\x8B\xC7\x48\x85\xFF\x0F\x84\x8E\x00\x00" + "\x00\x49\x8B\x5A\x10\x41\x0F\xB6\x33\x66\x0F\x1F\x84\x00\x00\x00\x00\x00" + "\x4A\x8B\x14\xCB\x0F\xB6\x0A\x40\x3A\xCE\x75\x16\x49\x8B\xC3\x49\x2B\xD3" + "\x84\xC9\x74\x1A\x0F\xB6\x4C\x02\x01\x48\xFF\xC0\x3A\x08\x74\xF0\x4D\x8B" + "\x42\x20\x49\xFF\xC1\x4D\x3B\xC8\x72\xD2\xEB\x4B\x49\x8B\x4A\x18\x49\x8B" + "\x42\x20\x48\xFF\xC8\x4E\x8B\x1C\xC9\x4C\x3B\xC8\x73\x12\x48\x8B\x44\xFB" + "\xF8\x4A\x89\x04\xCB\x48\x8B\x44\xF9\xF8\x4A\x89\x04\xC9\x4C\x8D\x47\xFF" + "\x4D\x89\x42\x20\x4D\x85\xDB\x74\x18\x48\x8B\x45\x48\x41\x0F\xB7\x14\x24" + "\x8B\x48\x1C\x49\x03\xCE\x8B\x04\x91\x49\x03\xC6\x49\x89\x03\x33\xD2\x49" + "\x83\xC7\x04\x49\x83\xC4\x02\x41\xFF\xCD\x49\x8B\xF8\x4D\x85\xC0\x0F\x85" + "\x3D\xFF\xFF\xFF\xB1\x01\x48\x8D\x45\x60\x66\x0F\x1F\x44\x00\x00\x48\x83" + "\x78\x20\x00\x0F\x87\x8A\xFE\xFF\xFF\x48\x83\xC0\x28\x4C\x8D\x85\x88\x00" + "\x00\x00\x49\x3B\xC0\x75\xE5\xE9\x85\xFE\xFF\xFF\x8B\xF2\xC7\x44\x24\x68" + "\x49\x6E\x6A\x65\x8B\xFA\xC7\x44\x24\x6C\x63\x74\x49\x6E\x48\x8D\x95\x68" + "\x01\x00\x00\x66\xC7\x44\x24\x70\x69\x74\xB9\x01\x00\x00\x00\xC6\x44\x24" + "\x72\x00\xFF\x55\x20\x83\xFB\x02\x7C\x20\x48\x8D\x4C\x24\x48\xC7\x44\x24" + "\x48\x5B\x57\x48\x5D\xC7\x44\x24\x4C\x20\x4C\x4C\x0A\xC6\x44\x24\x50\x00" + "\xFF\x95\x70\x01\x00\x00\x49\x8D\x4D\x20\xFF\x55\x30\x4C\x8B\xF0\x48\x85" + "\xC0\x0F\x84\xCC\x00\x00\x00\x83\xFB\x02\x7C\x22\x48\x8D\x4C\x24\x58\xC7" + "\x44\x24\x58\x5B\x57\x48\x5D\xC7\x44\x24\x5C\x20\x47\x50\x41\x66\xC7\x44" + "\x24\x60\x0A\x00\xFF\x95\x70\x01\x00\x00\x48\x8D\x54\x24\x68\x49\x8B\xCE" + "\xFF\x55\x38\x4C\x8B\xF8\x48\x85\xC0\x74\x77\x83\xFB\x02\x7C\x62\x48\x8D" + "\x4C\x24\x20\xC7\x44\x24\x20\x5B\x57\x48\x5D\xC7\x44\x24\x24\x20\x49\x49" + "\x0A\xC6\x44\x24\x28\x00\xFF\x95\x70\x01\x00\x00\x49\x8B\xCD\x41\xBC\x01" + "\x00\x00\x00\x41\xFF\xD7\x85\xC0\xC7\x44\x24\x30\x5B\x57\x48\x5D\x8B\xF0" + "\xC7\x44\x24\x34\x20\x49\x49\x3A\x0F\x95\xC0\xC6\x44\x24\x38\x20\x04\x30" + "\x66\xC7\x44\x24\x3A\x0A\x00\x48\x8D\x4C\x24\x30\x88\x44\x24\x39\xFF\x95" + "\x70\x01\x00\x00\xEB\x1B\x49\x8B\xCD\x41\xBC\x01\x00\x00\x00\x41\xFF\xD7" + "\x8B\xF0\xEB\x0B\xFF\x95\x78\x01\x00\x00\x8B\xF8\x45\x33\xE4\x49\x8B\xCE" + "\xFF\x55\x40\x85\xF6\x0F\x85\x18\x01\x00\x00\xEB\x0B\xFF\x95\x78\x01\x00" + "\x00\x8B\xF8\x45\x33\xE4\x49\x8B\x4D\x18\x48\x85\xC9\x74\x03\xFF\x55\x18" + "\x49\x8B\x4D\x10\xFF\x55\x18\x45\x85\xE4\x0F\x85\xEF\x00\x00\x00\x83\xFB" + "\x01\x0F\x8C\xE6\x00\x00\x00\x8B\xCF\xC7\x44\x24\x30\x5B\x57\x48\x5D\x83" + "\xE1\x0F\xC7\x44\x24\x34\x20\x45\x52\x52\x83\xF9\x0A\x66\xC7\x44\x24\x38" + "\x3A\x20\xBA\x30\x00\x00\x00\x66\xC7\x44\x24\x42\x0A\x00\x41\xB8\x37\x00" + "\x00\x00\x8B\xC2\x41\x0F\x43\xC0\xC1\xEF\x04\x02\xC1\x8B\xCF\x83\xE1\x0F" + "\x88\x44\x24\x41\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1\xEF\x04\x02\xC1" + "\x8B\xCF\x83\xE1\x0F\x88\x44\x24\x40\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0" + "\xC1\xEF\x04\x02\xC1\x8B\xCF\x83\xE1\x0F\x88\x44\x24\x3F\x83\xF9\x0A\x8B" + "\xC2\x41\x0F\x43\xC0\xC1\xEF\x04\x02\xC1\x8B\xCF\x83\xE1\x0F\x88\x44\x24" + "\x3E\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1\xEF\x04\x02\xC1\x8B\xCF\x83" + "\xE1\x0F\x88\x44\x24\x3D\x83\xF9\x0A\x8B\xC2\x41\x0F\x43\xC0\xC1\xEF\x04" + "\x02\xC1\x8B\xCF\x83\xE1\x0F\x88\x44\x24\x3C\x83\xF9\x0A\x8B\xC2\x41\x0F" + "\x43\xC0\xC1\xEF\x04\x02\xC1\x83\xE7\x0F\x83\xFF\x0A\x88\x44\x24\x3B\x48" + "\x8D\x4C\x24\x30\x41\x0F\x43\xD0\x40\x02\xD7\x88\x54\x24\x3A\xFF\x95\x70" + "\x01\x00\x00\x8B\x8D\x68\x01\x00\x00\x33\xD2\xFF\x55\x20\x48\x8B\x45\x28" + "\x48\x81\xC4\x18\x02\x00\x00\x41\x5F\x41\x5E\x41\x5D\x41\x5C\x5F\x5E\x5B" + "\x5D\xC3"; constexpr SIZE_T x64ShellcodeSize = sizeof(x64Shellcode) - 1; diff --git a/src/windhawk/engine/engine.vcxproj b/src/windhawk/engine/engine.vcxproj index b8d6255..fa0c6a3 100644 --- a/src/windhawk/engine/engine.vcxproj +++ b/src/windhawk/engine/engine.vcxproj @@ -231,6 +231,7 @@ + diff --git a/src/windhawk/engine/engine.vcxproj.filters b/src/windhawk/engine/engine.vcxproj.filters index 7059f0b..63dfdd5 100644 --- a/src/windhawk/engine/engine.vcxproj.filters +++ b/src/windhawk/engine/engine.vcxproj.filters @@ -137,6 +137,9 @@ Header Files + + Header Files + diff --git a/src/windhawk/engine/functions.cpp b/src/windhawk/engine/functions.cpp index e1b12aa..f23b537 100644 --- a/src/windhawk/engine/functions.cpp +++ b/src/windhawk/engine/functions.cpp @@ -61,7 +61,9 @@ std::vector SplitString(std::wstring_view s, WCHAR delim) { return std::vector(view.begin(), view.end()); } -bool DoesPathMatchPattern(std::wstring_view path, std::wstring_view pattern) { +bool DoesPathMatchPattern(std::wstring_view path, + std::wstring_view pattern, + bool explicitOnly) { if (pattern.empty()) { return false; } @@ -84,28 +86,39 @@ bool DoesPathMatchPattern(std::wstring_view path, std::wstring_view pattern) { } for (const auto& patternPart : SplitString(pattern, L'|')) { - auto patternPartExpanded = + if (explicitOnly) { + bool patternIsWildcard = + patternPart.find_first_of(L"*?") != std::wstring::npos; + if (patternIsWildcard) { + // If the pattern contains wildcards, it's not an explicit + // match. + continue; + } + } + + auto patternPartNormalized = wil::ExpandEnvironmentStrings(patternPart.c_str()); - // CharUpperBuff(&patternPartExpanded[0], - // wil::safe_cast(patternPartExpanded.length())); + // CharUpperBuff(&patternPartNormalized[0], + // wil::safe_cast(patternPartNormalized.length())); LCMapStringEx(LOCALE_NAME_USER_DEFAULT, LCMAP_UPPERCASE, - &patternPartExpanded[0], - wil::safe_cast(patternPartExpanded.length()), - &patternPartExpanded[0], - wil::safe_cast(patternPartExpanded.length()), + &patternPartNormalized[0], + wil::safe_cast(patternPartNormalized.length()), + &patternPartNormalized[0], + wil::safe_cast(patternPartNormalized.length()), nullptr, nullptr, 0); std::wstring_view match = pathUpper; // If there's no backslash in the pattern part, match only against the // file name, not the full path. - if (patternPartExpanded.find(L'\\') == std::wstring::npos) { + if (patternPartNormalized.find(L'\\') == std::wstring::npos) { match = pathFileNameUpper; } - if (wcsmatch(patternPartExpanded.data(), patternPartExpanded.length(), - match.data(), match.length())) { + if (wcsmatch(patternPartNormalized.data(), + patternPartNormalized.length(), match.data(), + match.length())) { return true; } } @@ -247,4 +260,46 @@ HANDLE MyCreateRemoteThread(HANDLE hProcess, return hThread; } +void GetNtVersionNumbers(ULONG* pNtMajorVersion, + ULONG* pNtMinorVersion, + ULONG* pNtBuildNumber) { + using RtlGetNtVersionNumbers_t = + void(WINAPI*)(ULONG * pNtMajorVersion, ULONG * pNtMinorVersion, + ULONG * pNtBuildNumber); + static RtlGetNtVersionNumbers_t pRtlGetNtVersionNumbers = []() { + HMODULE hNtdll = GetModuleHandle(L"ntdll.dll"); + if (hNtdll) { + return (RtlGetNtVersionNumbers_t)GetProcAddress( + hNtdll, "RtlGetNtVersionNumbers"); + } + + return (RtlGetNtVersionNumbers_t) nullptr; + }(); + + if (pRtlGetNtVersionNumbers) { + pRtlGetNtVersionNumbers(pNtMajorVersion, pNtMinorVersion, + pNtBuildNumber); + // The upper 4 bits are reserved for the type of the OS build. + // https://dennisbabkin.com/blog/?t=how-to-tell-the-real-version-of-windows-your-app-is-running-on + *pNtBuildNumber &= ~0xF0000000; + return; + } + + // Use GetVersionEx as a fallback. +#pragma warning(push) +#pragma warning(disable : 4996) // disable deprecation message + OSVERSIONINFO versionInfo = {sizeof(OSVERSIONINFO)}; + if (GetVersionEx(&versionInfo)) { + *pNtMajorVersion = versionInfo.dwMajorVersion; + *pNtMinorVersion = versionInfo.dwMinorVersion; + *pNtBuildNumber = versionInfo.dwBuildNumber; + return; + } +#pragma warning(pop) + + *pNtMajorVersion = 0; + *pNtMinorVersion = 0; + *pNtBuildNumber = 0; +} + } // namespace Functions diff --git a/src/windhawk/engine/functions.h b/src/windhawk/engine/functions.h index ee542e7..a3fe083 100644 --- a/src/windhawk/engine/functions.h +++ b/src/windhawk/engine/functions.h @@ -6,7 +6,9 @@ bool wcsmatch(PCWSTR pat, size_t plen, PCWSTR str, size_t slen); std::vector SplitString(std::wstring_view s, WCHAR delim); -bool DoesPathMatchPattern(std::wstring_view path, std::wstring_view pattern); +bool DoesPathMatchPattern(std::wstring_view path, + std::wstring_view pattern, + bool explicitOnly = false); void** FindImportPtr(HMODULE hFindInModule, PCSTR pModuleName, @@ -35,4 +37,8 @@ HANDLE MyCreateRemoteThread(HANDLE hProcess, LPVOID lpParameter, ULONG createFlags); +void GetNtVersionNumbers(ULONG* pNtMajorVersion, + ULONG* pNtMinorVersion, + ULONG* pNtBuildNumber); + } // namespace Functions diff --git a/src/windhawk/engine/inject_shellcode/InjectShellcode.vcxproj b/src/windhawk/engine/inject_shellcode/InjectShellcode.vcxproj index 3b13a8c..83f79bc 100644 --- a/src/windhawk/engine/inject_shellcode/InjectShellcode.vcxproj +++ b/src/windhawk/engine/inject_shellcode/InjectShellcode.vcxproj @@ -22,6 +22,7 @@ {EDF9A877-A2A8-43AF-8BCC-897F5B28E104} Win32Proj InjectShellcode + 10.0 @@ -86,6 +87,7 @@ Disabled WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) false + stdcpp20 Windows @@ -101,6 +103,7 @@ WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) false NoExtensions + stdcpp20 Windows @@ -117,6 +120,7 @@ true WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) false + stdcpp20 Windows @@ -136,6 +140,7 @@ WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) false NoExtensions + stdcpp20 Windows diff --git a/src/windhawk/engine/inject_shellcode/_find-api-hash.py b/src/windhawk/engine/inject_shellcode/_find-api-hash.py deleted file mode 100644 index dea0587..0000000 --- a/src/windhawk/engine/inject_shellcode/_find-api-hash.py +++ /dev/null @@ -1,37 +0,0 @@ -# Script file from https://simonuvarov.com/msfvenom-reverse-tcp-waitforsingleobject/ -# use to find the hash of Windows API calls. These hashes are used in Metasploit shellcode. - -def ror(dword, bits): - return (dword >> bits | dword << (32 - bits)) & 0xFFFFFFFF - - -def unicode(string, uppercase=True): - result = "" - if uppercase: - string = string.upper() - for c in string: - result += c + "\x00" - return result - - -def hash(function, bits=13, print_hash=True): - function_hash = 0 - for c in function: - function_hash = ror(function_hash, bits) - function_hash += ord(c) - function_hash &= 0xFFFFFFFF - if print_hash: - print("[+] 0x%08X = %s" % (function_hash, function)) - return function_hash - - -def module_hash(module, bits=13, print_hash=True): - return hash(unicode(module), bits, print_hash) - - -if __name__ == '__main__': - module_hash('kernel32.dll') - hash('LoadLibraryW') - module_hash('ntdll.dll') - hash('LdrRegisterDllNotification') - hash('LdrUnregisterDllNotification') diff --git a/src/windhawk/engine/inject_shellcode/main.cpp b/src/windhawk/engine/inject_shellcode/main.cpp index 698fdd3..a08b26d 100644 --- a/src/windhawk/engine/inject_shellcode/main.cpp +++ b/src/windhawk/engine/inject_shellcode/main.cpp @@ -32,6 +32,8 @@ #include +#include + #include "../dll_inject.h" #define DEREF(name) *(UINT_PTR*)(name) @@ -40,39 +42,6 @@ #define DEREF_16(name) *(WORD*)(name) #define DEREF_8(name) *(BYTE*)(name) -// NOTE: module hashes are computed using all-caps unicode strings -#define KERNEL32DLL_HASH 0x6A4ABC5B -#define KERNEL32DLL_HASH_COUNT 8 - -#define LOADLIBRARYW_HASH 0xEC0E4EA4 -#define GETPROCADDRESS_HASH 0x7C0DFCAA -#define FREELIBRARY_HASH 0x4DC9D5A0 -#define VIRTUALFREE_HASH 0x030633AC -#define GETLASTERROR_HASH 0x75DA1966 -#define OUTPUTDEBUGSTRINGA_HASH 0x470D22BC -#define CLOSEHANDLE_HASH 0x0FFD97FB -#define SETTHREADERRORMODE_HASH 0x5922C47C - -#define HASH_KEY 13 -//===============================================================================================// -#pragma intrinsic(_rotr) - -__forceinline DWORD ror(DWORD d) -{ - return _rotr(d, HASH_KEY); -} - -__forceinline DWORD hash(const char* c) -{ - register DWORD h = 0; - do - { - h = ror(h); - h += *c; - } while (*++c); - - return h; -} //===============================================================================================// typedef struct _UNICODE_STR { @@ -190,17 +159,41 @@ typedef struct __PEB // 65 elements, 0x210 bytes DWORD dwMinimumStackCommit; } _PEB, *_PPEB; +struct ModuleExportLookupData +{ + const char* moduleName; + size_t moduleNameLength; + const char** functionNames; + void*** functionTargets; + size_t functionsLeft; +}; + __declspec(dllexport) void* __stdcall InjectShellcode(void* pParameter) { const DllInject::LOAD_LIBRARY_REMOTE_DATA* pInjData = (const DllInject::LOAD_LIBRARY_REMOTE_DATA*)pParameter; - HMODULE hModule; - char szInjectInit[] = {'I', 'n', 'j', 'e', 'c', 't', 'I', 'n', 'i', 't', '\0'}; - void* pInjectInit; - ////////////////////////////////////////////////////////////////////////// - // Based on code from ImprovedReflectiveDLLInjection + const char szKernel32Dll[] = {'K', 'E', 'R', 'N', 'E', 'L', '3', '2', '.', 'D', 'L', 'L'}; + + // Add volatile to long strings to prevent the compiler from using XMM registers and storing their values in the + // data section. + const char szLoadLibraryW[] = {'L', 'o', 'a', 'd', 'L', 'i', 'b', 'r', 'a', 'r', 'y', 'W', '\0'}; + const char szGetProcAddress[] = {'G', 'e', 't', 'P', 'r', 'o', 'c', 'A', 'd', 'd', 'r', 'e', 's', 's', '\0'}; + const char szFreeLibrary[] = {'F', 'r', 'e', 'e', 'L', 'i', 'b', 'r', 'a', 'r', 'y', '\0'}; + const char szVirtualFree[] = {'V', 'i', 'r', 't', 'u', 'a', 'l', 'F', 'r', 'e', 'e', '\0'}; + const char szGetLastError[] = {'G', 'e', 't', 'L', 'a', 's', 't', 'E', 'r', 'r', 'o', 'r', '\0'}; + volatile const char szOutputDebugStringA[] = {'O', 'u', 't', 'p', 'u', 't', 'D', 'e', 'b', 'u', + 'g', 'S', 't', 'r', 'i', 'n', 'g', 'A', '\0'}; + const char szCloseHandle[] = {'C', 'l', 'o', 's', 'e', 'H', 'a', 'n', 'd', 'l', 'e', '\0'}; + volatile const char szSetThreadErrorMode[] = {'S', 'e', 't', 'T', 'h', 'r', 'e', 'a', 'd', 'E', + 'r', 'r', 'o', 'r', 'M', 'o', 'd', 'e', '\0'}; + + const char* kernel32FunctionNames[] = { + szLoadLibraryW, szGetProcAddress, + szFreeLibrary, szVirtualFree, + szGetLastError, (const char*)szOutputDebugStringA, + szCloseHandle, (const char*)szSetThreadErrorMode, + }; - // the functions we need decltype(&LoadLibraryW) pLoadLibraryW = nullptr; decltype(&GetProcAddress) pGetProcAddress = nullptr; decltype(&FreeLibrary) pFreeLibrary = nullptr; @@ -210,6 +203,23 @@ __declspec(dllexport) void* __stdcall InjectShellcode(void* pParameter) decltype(&CloseHandle) pCloseHandle = nullptr; decltype(&SetThreadErrorMode) pSetThreadErrorMode = nullptr; + void** kernel32FunctionTargets[] = { + (void**)&pLoadLibraryW, (void**)&pGetProcAddress, (void**)&pFreeLibrary, (void**)&pVirtualFree, + (void**)&pGetLastError, (void**)&pOutputDebugStringA, (void**)&pCloseHandle, (void**)&pSetThreadErrorMode, + }; + + static_assert(std::size(kernel32FunctionNames) == std::size(kernel32FunctionTargets)); + + ModuleExportLookupData lookupData[] = { + { + szKernel32Dll, + std::size(szKernel32Dll), + kernel32FunctionNames, + kernel32FunctionTargets, + std::size(kernel32FunctionNames), + }, + }; + // the kernels base address and later this images newly loaded base address ULONG_PTR uiBaseAddress; @@ -228,144 +238,174 @@ __declspec(dllexport) void* __stdcall InjectShellcode(void* pParameter) // variables for loading this image PLIST_ENTRY pleInLoadHead; PLIST_ENTRY pleInLoadIter; - ULONG_PTR uiValueA; - ULONG_PTR uiValueB; - ULONG_PTR uiValueC; - BOOL bFoundAll = FALSE; + bool foundAll = false; // get the first entry of the InMemoryOrder module list pleInLoadHead = &((PPEB_LDR_DATA)uiBaseAddress)->InMemoryOrderModuleList; pleInLoadIter = pleInLoadHead->Flink; while (pleInLoadIter != pleInLoadHead) { - USHORT usCounter; + PLIST_ENTRY pleInLoadCurrent = pleInLoadIter; - uiValueA = (ULONG_PTR)pleInLoadIter; + // get the next entry + pleInLoadIter = pleInLoadIter->Flink; - // get pointer to current modules name (unicode string) - uiValueB = (ULONG_PTR)((PLDR_DATA_TABLE_ENTRY)uiValueA)->BaseDllName.pBuffer; - // set bCounter to the length for the loop - usCounter = ((PLDR_DATA_TABLE_ENTRY)uiValueA)->BaseDllName.Length; - // clear uiValueC which will store the hash of the module name - uiValueC = 0; + PCWSTR BaseDllNameBuffer = ((PLDR_DATA_TABLE_ENTRY)pleInLoadCurrent)->BaseDllName.pBuffer; + USHORT BaseDllNameLength = ((PLDR_DATA_TABLE_ENTRY)pleInLoadCurrent)->BaseDllName.Length / sizeof(WCHAR); + ModuleExportLookupData* lookupItem = nullptr; - // compute the hash of the module name... - do + for (auto& item : lookupData) { - uiValueC = ror((DWORD)uiValueC); - // normalize to uppercase if the module name is in lowercase - if (*((BYTE*)uiValueB) >= 'a') - uiValueC += *((BYTE*)uiValueB) - 0x20; - else - uiValueC += *((BYTE*)uiValueB); - uiValueB++; - } while (--usCounter); - - if ((DWORD)uiValueC == KERNEL32DLL_HASH) - { - // variables for processing the kernels export table - ULONG_PTR uiAddressArray; - ULONG_PTR uiNameArray; - ULONG_PTR uiExportDir; - ULONG_PTR uiNameOrdinals; - DWORD dwHashValue; - DWORD dwNumberOfNames; + if (item.functionsLeft == 0) + continue; + + if (BaseDllNameLength != item.moduleNameLength) + continue; + + USHORT i; + for (i = 0; i < BaseDllNameLength; i++) + { + WCHAR c = BaseDllNameBuffer[i]; + if (c >= 'a' && c <= 'z') + c -= 'a' - 'A'; + + if (c != item.moduleName[i]) + break; + } + + if (i == BaseDllNameLength) + { + lookupItem = &item; + break; + } + } + + if (!lookupItem) + continue; - // get this modules base address - uiBaseAddress = (ULONG_PTR)((PLDR_DATA_TABLE_ENTRY)uiValueA)->DllBase; + // variables for processing the kernels export table + ULONG_PTR uiAddressArray; + ULONG_PTR uiNameArray; + ULONG_PTR uiExportDir; + ULONG_PTR uiNameOrdinals; + DWORD dwNumberOfNames; - // get the VA of the modules NT Header - uiExportDir = uiBaseAddress + ((PIMAGE_DOS_HEADER)uiBaseAddress)->e_lfanew; + // get this modules base address + uiBaseAddress = (ULONG_PTR)((PLDR_DATA_TABLE_ENTRY)pleInLoadCurrent)->DllBase; - // uiNameArray = the address of the modules export directory entry - uiNameArray = (ULONG_PTR) & - ((PIMAGE_NT_HEADERS)uiExportDir)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; + // get the VA of the modules NT Header + uiExportDir = uiBaseAddress + ((PIMAGE_DOS_HEADER)uiBaseAddress)->e_lfanew; - // get the VA of the export directory - uiExportDir = (uiBaseAddress + ((PIMAGE_DATA_DIRECTORY)uiNameArray)->VirtualAddress); + // uiNameArray = the address of the modules export directory entry + uiNameArray = + (ULONG_PTR) & ((PIMAGE_NT_HEADERS)uiExportDir)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]; - // get the VA for the array of name pointers - uiNameArray = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfNames); + // get the VA of the export directory + uiExportDir = (uiBaseAddress + ((PIMAGE_DATA_DIRECTORY)uiNameArray)->VirtualAddress); - // get the VA for the array of name ordinals - uiNameOrdinals = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfNameOrdinals); + // get the VA for the array of name pointers + uiNameArray = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfNames); - // get total number of named exports - dwNumberOfNames = ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->NumberOfNames; + // get the VA for the array of name ordinals + uiNameOrdinals = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfNameOrdinals); - usCounter = KERNEL32DLL_HASH_COUNT; + // get total number of named exports + dwNumberOfNames = ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->NumberOfNames; - // loop while we still have imports to find - while (usCounter > 0 && dwNumberOfNames > 0) + // loop while we still have imports to find + while (lookupItem->functionsLeft > 0 && dwNumberOfNames > 0) + { + PCSTR pFunctionName = (PCSTR)(uiBaseAddress + DEREF_32(uiNameArray)); + void** pTargetAddress = nullptr; + + for (size_t i = 0; i < lookupItem->functionsLeft; i++) { - // compute the hash values for this function name - dwHashValue = hash((char*)(uiBaseAddress + DEREF_32(uiNameArray))); - - void** pTargetAddress = nullptr; - - if (dwHashValue == LOADLIBRARYW_HASH) - pTargetAddress = (void**)&pLoadLibraryW; - else if (dwHashValue == GETPROCADDRESS_HASH) - pTargetAddress = (void**)&pGetProcAddress; - else if (dwHashValue == FREELIBRARY_HASH) - pTargetAddress = (void**)&pFreeLibrary; - else if (dwHashValue == VIRTUALFREE_HASH) - pTargetAddress = (void**)&pVirtualFree; - else if (dwHashValue == GETLASTERROR_HASH) - pTargetAddress = (void**)&pGetLastError; - else if (dwHashValue == OUTPUTDEBUGSTRINGA_HASH) - pTargetAddress = (void**)&pOutputDebugStringA; - else if (dwHashValue == CLOSEHANDLE_HASH) - pTargetAddress = (void**)&pCloseHandle; - else if (dwHashValue == SETTHREADERRORMODE_HASH) - pTargetAddress = (void**)&pSetThreadErrorMode; - - // if we have found a function we want we get its virtual address - if (pTargetAddress) + bool matched = false; + const char* lookupFunctionName = lookupItem->functionNames[i]; + for (size_t j = 0; lookupFunctionName[j] == pFunctionName[j]; j++) { - // get the VA for the array of addresses - uiAddressArray = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfFunctions); + if (lookupFunctionName[j] == '\0') + { + matched = true; + break; + } + } - // use this functions name ordinal as an index into the array of name pointers - uiAddressArray += (DEREF_16(uiNameOrdinals) * sizeof(DWORD)); + if (matched) + { + pTargetAddress = lookupItem->functionTargets[i]; - // store this functions VA - *pTargetAddress = (void*)(uiBaseAddress + DEREF_32(uiAddressArray)); + // compact the arrays if needed + if (i < lookupItem->functionsLeft - 1) + { + lookupItem->functionNames[i] = lookupItem->functionNames[lookupItem->functionsLeft - 1]; + lookupItem->functionTargets[i] = lookupItem->functionTargets[lookupItem->functionsLeft - 1]; + } // decrement our counter - usCounter--; + lookupItem->functionsLeft--; + + break; } + } - // get the next exported function name - uiNameArray += sizeof(DWORD); + // if we have found a function we want we get its virtual address + if (pTargetAddress) + { + // get the VA for the array of addresses + uiAddressArray = (uiBaseAddress + ((PIMAGE_EXPORT_DIRECTORY)uiExportDir)->AddressOfFunctions); - // get the next exported function name ordinal - uiNameOrdinals += sizeof(WORD); + // use this functions name ordinal as an index into the array of name pointers + uiAddressArray += (DEREF_16(uiNameOrdinals) * sizeof(DWORD)); - // decrement our # of names counter - dwNumberOfNames--; + // store this functions VA + *pTargetAddress = (void*)(uiBaseAddress + DEREF_32(uiAddressArray)); } + + // get the next exported function name + uiNameArray += sizeof(DWORD); + + // get the next exported function name ordinal + uiNameOrdinals += sizeof(WORD); + + // decrement our # of names counter + dwNumberOfNames--; } - // we stop searching when we have found everything we need. - if (pLoadLibraryW && pGetProcAddress && pFreeLibrary && pVirtualFree && pGetLastError && pOutputDebugStringA && - pCloseHandle && pSetThreadErrorMode) + // we stop searching when we have found everything we need + foundAll = true; + + for (auto& item : lookupData) { - bFoundAll = TRUE; - break; + if (item.functionsLeft > 0) + { + foundAll = false; + break; + } } - // get the next entry - pleInLoadIter = pleInLoadIter->Flink; + if (foundAll) + break; } - if (!bFoundAll) + INT32 nLogVerbosity = pInjData->nLogVerbosity; + + if (!foundAll) { + // If possible, at least log the error. + if (pOutputDebugStringA && nLogVerbosity >= 1) + { + char szExportResolutionErrorMessage[] = {'[', 'W', 'H', ']', ' ', 'E', 'X', 'P', '\n', '\0'}; + pOutputDebugStringA(szExportResolutionErrorMessage); + } + return pVirtualFree; } - INT32 nLogVerbosity = pInjData->nLogVerbosity; + HMODULE hModule; + const char szInjectInit[] = {'I', 'n', 'j', 'e', 'c', 't', 'I', 'n', 'i', 't', '\0'}; + void* pInjectInit; BOOL bInitAttempted = FALSE; BOOL bInitSucceeded = FALSE; DWORD dwLastErrorValue = 0; diff --git a/src/windhawk/engine/libraries/MinHook/libMinHook.d.x64.lib b/src/windhawk/engine/libraries/MinHook/libMinHook.d.x64.lib index af3d4803463694c88d8cbc920b09b6ff19456a54..82ebb96344b9d279a16053b657be50e45af0da9c 100644 GIT binary patch delta 700 zcmey@!u+p=d4d#&rGbH|k*T5aMkO0&IA?PjGaG_8xrA*STx#;Ym12`U*acV?s_#kJ z9K&AD#G}F>SA%mAV{-{+jd%aM3sW~PkCIi1PX;vP(r^^*-!k~XVL%w$6~<(`}X z7swPFR|W<}#>srEq&5r5FGMqMzaqaA$MN0lQ|1Lp)J(pX904?Mvq6fJP`#z0xgi4( zZ~`$igG#WwrKOR9sRp`;xdW<*iJ3(JnuxhU47!L>2D*qz2dYTDiMiPdR3Q^{ixX%f z76uQ{MT~x+i~O}@{mvUx>MzXZqAJ((6;d5)z` zwqFX3`qIt+mfk>0P4`x+ae|C9;Add)1R5v3S!0zps&Sj+*G%N$SZ15K>D%qSD<}Wh N;Q&iTb9O%B001mGoY4RP delta 700 zcmey@!u+p=d4d#&nT3(5xuLPiMkO0&IA?PjGaG_8xrA*STx#;Ym12`U*acYfrsgMa zj$ton;!$GQTf@L0%mAV{-{+jd%fVUS9=$J|srEq&5r5FGMqMzaqaA$DVCgS|_x`nI~UMjsTjs*&xM9sNUSz(trU7 zIDwd%K_%GT(%i(zL<3#K%mG!z%)&eXUBog5O~leL16{|7*V`oZeXf`E@JM1CgNpanSdr_Xjp+RVmt#~#B>L`h}q^{E&fG%S81YN}9 z2dapLfq?)cipMMrj1163ybMe{(1Z-k63|5~YS2Us4Q8N=7;au2+0TxMSEod1tmGvA zVMK{naIDNsJ}AVY_&LxZ{_^_WlatDzaa*#Pqa2Y`Oebemsd0i*$8KQ!C{GsTklwtd kYAc3u8k^_VG_i1e)UkMWIrqif$?A<7z)0R4*f^gV0LgKWvH$=8 delta 665 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
    e+6uA7L=+w{!I$}jMu{_%>1G7B!;18f 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 z zznicIzA%PgtZb*ngZ$&xK+Z*O2+6@itVbG{hz_BT*}>qh--*f z`BWb;iS>Tn8YqL18&LWS0t83{N@yZ}?#193j7WEL5)L%AYl=1-7(>7#FtR3Yg+J|x z+|WK$v?D+oFnR$-kBPcZ7=}o<$3)#HSS>@Gzw-CeGolfwfp#ab3!>buK{Nun0i;lX zAV3<3`TY_D`mh+8ay)Wyh_7Qia?=Fi8*~KpIen1IjRiqZ*O!FoVN)nNUiX znF4k}l)p8I;>ZmkwE_eI(m+%MLt#Y*KYTir-t1@7TUjA4+tBThNfqcn)(qazn@|0s;Zj zK-1u(`6FVwpefX7{3Z8vL31X!1r5oJ(X2ymfLJRa5FiaSvwSocAO`60^Fq*^cpUpb zw8;ZSIM0e0Z*n(Vpj-%6fkHA9D928P>Q6%gL`V28Lclp^?~ofpz7}l=kcQfIzS{2*BWgE!YX2l^e?YXTC7H3>Uy&QyHiu!X1Adrt5aoM0>(hx|e+{nBl&$G3zUO=x;O8j}3EaJ-(bA`@)4&csf$ zVr%>`e;g8?7Mop9`?yf7Tnc0+rR}p1avzj0r9BW2DJ^M~_O90I=!RBZwz-JJyjtzY zJ2yz3pPgrBKZm^N+=Cj5{tF)bA+2#^M*$AIaP*62g6(FY7H{5mn`i3-+B zg!M=(CwR^LavuV$^@O;-$bBFQB7QMgL415`ARdq0Kz58ELx40OJ_U$R7;q;b67wIc z?w&{jkpPF(-P2nG0zbn`5GRRl1V{tK3jpz4YxEg|1HYupS&zc;Dvk6UaA==@CJ7UM z5LaRP>(*d854i#5Y=MFRX<&L4m|kv;zGyI=k9f>E6s9+b>E%|=EU*f`tH^yZ3DY`o zi=AHE8cdfXH=tZ1P!J#uOn(EW*A1X65Q%Z#s;t+OK&%IcfcX2?fVdmEp?ibqMu0Rx z{1YJFG$8IlB&I(Wh&Pi!xZn^FZ)FH#yLnLRc2FtQ?l2Fty?N5fxI^cmd&Fi>u8iwW zkrknWGTd+8j9a7B!0+^Ou$rB;B7yyjL|@4%zwb*Cu^s0re0XNmB?`Xmi#&XVz?bjg z%O^gq?;T)Jn%^mKy%bE1Y;*&CfML zH^lrUgQboO@sJ*!G>qN%L9Us>yqX0>3HarTC5w z@!*by41ud6wgPTBBmiZZphSQ);BGH)x3l2xjRcnwgiCHJs<${%IC50bb80w804~T40Lw_6z_(>K4 z1admDvT#1uQ3h+H5#nJLZ)RD0W$`<=hkP5QO`4z41GQMml%w@GEB&Gb`e#wUCtX!& zG1VhwHW|51ts=IfLJx)n2s#iCF+FKi=yM!oMTPk8JYU@}?fS?XMq_#+-wyL3^IyxEO(MkN; zhhG!;wKuday})jL4tMKa%0ZEX8}^jTjz?A$GDANRB3vEq zZ-u+mh3vY`tx9Igk=E=IqxJ{KG;p1(GdY*)16&r=5`Hq-Xa>ZwIJk>s8YpF})kuu( zOA;151q2*IQbC>yQmmrk2Jm$4aBQ@GYL7IzjDMa^e723$7^s!%(w>pbHc;8fE170H zlWeSS4xHm^O+n8>yea6}AW%?AMM2ksl#0H|ek~(6oG@Blbz&n_s@d7fI#R1cy`Ner zW4^Z_{fv_ioe`=3EUNW=V;!_cwCOJ(yeVEiTu69q5-MUVn#9$RfP!6yhcpS&XcEm( zfK&VUj!x%SoL_bL(hcFy;0w<}ggA<}={1ar#~-nSBot8|Rg^B2l5e5xlVjNTLikfk0hJD#%-s<@h7KU@j<|XXMi z$2;Hf-VR<>a=ZWDK;=2H1!Rl(%y((#K#BahTOit3nxzeTkBE(kSd{5rBaWtrSDDT- z^=NrNvuDTJ1eIUh2aFio&i)iFfXX+ULG_S`jfhyFdIY3P4*?+81D0)&4J{7?T>+l$Ps3*k>^Ws;;v@t0W`-Q3LY^}UMNh;Bl!Qw&+q7S-RY z&ji87^#)R;r%@4G(bK#O2@v#8Jj4}9qo-L41=Z2T_>L~(*CF`Qoy>b+2`@v0)W5FO z_Zho9Iram_c9>WcfHm?FVqJ>tIykyir~4Q+jIy6DEISJE3gXAe9a}*XqW%p6-HW7x z{7}ZOPhytMb3TUL>zDB?pN2EeQ z{t7Yx##4g3PxO8#Hb;o7; z=-i%V2{DUs13(V|5d1w6FlOlm0%j3bF!cs$+0n^yOi1DGG*?T%d=n4vQ<)I;f4DCP%kAOfPg9SKoBUgu!3nYG1~1VXXjNoHZ*$G z;KH(#x`XB^^|&Buh*r0at!`VTPDFueD9P;D2?EsjsT~j<5hA7Z!w@i~---HjBEkx$;Uu#o0taLP$N&t#od=?Qbj4+-bODwolizZ)(g+)& zgaJqqfC%_v1Pu5Rg;q3zX=E~5A67ttkEgh7O&7FjGWkvzMC%J1p@ad*&Khm0jW(jt zibgQ)0@93TW~`1PHloL)-9We;@ZfxEtUjD@k$E&_aaEuqwqmR%5%|+$Z>v+$)cS0OcgJ|d(g=x%EYVqLQ7nZiKRw8ve5Xl010;EJsy2{kn!&>kce z(DlspV}i$yjjW5G-^EPdX7392@!4I{Xl3OYUA!a zmJcxZM~b+Nir5O5nFk3FbPyim;iTa*mqS5y^iq6BFUFU4nKq<`*CRrFO05I_hjoC| zpu9CEH$4Xnh>weEwRIOFpG#@9B=h50q8jTJpopLyEK(E|u@yyG1_=sXhHX$xDG?>E}3Qm6JvlgoJ3F-8qbO*Ni6Gu1c_91#uu1Q41-x!1K`p%O@u zI#Cf@Q75NE0?ctT9#SWyQ70RqpgMXxzN5GC>lS|9gfCq?XMit!7b3WFGkwUJh^1{3 zDfSmB2Sp9;FH$ahWPcCoY>04mv|5DnHGoT9$gUmsoMbj{e~}oqYjoXTT$`LrO^96< z)DnIk*=$KkPF7fU4>Bl&tpl$ZLL&@h?CLVMSUHS#`TB>cseaJ!NqsgSTCSwa`bdeX?b3%sh#b_=_kv9ym% z`&mBgA^{rir3Sm0{>;Xu0g zSi%d$k3z5%>oEjOu^tD3VhJmlo+OzadrETp)%rA|1EBm05|=L=_d+*_6ieCjB2*Zm z=^2O=IL{(r;58g-} zjZt2O{4+N?nF&8zz`v?P9L5uM`SGuKYkvfDLfZ$(hZJV4<}8+=EP#+SCqH%L`B zS%p}Y<6FdqN9~7`A-Dmx2TQL;Q<0>~%H(R!7gow>H%_NKmFa zmn9PB?GP6}z%x~U);x1~W?5IHT+1`dIm`u3yv+<|Igez-7qvY_?T<)hmO-{K7~+)T zBr!XPn23mh)E!CEag>^^FhngRK+se?q->;Nh>HNJI(h-VqwDactx<+t$!hjgMnj|mE$ENwI zFKwv)0SfPG?w}^WkC5KAOV)To@B%q+(N<25NTT~mFR$_ zw9tb@XheiU$6S)MluF+UOI-^I5OftDVky$F)GYv59lZ(P(HrokEp;7Im8EV+tjck# z7ni8T8SH)NSuXP>S;wUq`bN?a2WN@hN?8E$7f6D|?jRZQ72J;Ka2p~$i|s_;(kjGC zMmVT-Xolj0M(iCTHX>r7WdljtOsU-pn>_>x5Og0NVl&dP*}Z^>-)P5o^e%pFz?U}M z!(dT{dl0cI+arhz-A4(k~>k%`q9F~E=giu6EP7H1F5f*q#=}=tuO=*vJ&1~cu3hu!w}B_5`IY@-_fV= zrLFNEQk6AcM6Am3KH|dT3Y3G5WC57Xvxb^honGitN>ZFRkUdXHfbaq2z(OyPjQHX| zr1(P+X-yNf0_8bcv}Z4RYD^3LNQ6d2D0F;GlJ-*Rnb_;}Ve!y_c&Ij{6@90L??t4vBky{>LE-xl6TSss9>;@89D~CT zCB!bz%wbGcveuL}+U|uf=W>&P4HC+IB#_!IL*oFvK1M=|mpkw@O+yxG=OA zzNSSa$t6F?vPa1h4-F09iGY-m`vajpSu(ycqd58ffbu86KpSlz`C8@K!PQ74i|oX^ z6ys$BvK@_Wa&|y0Vur;YSGjkJe4_%xw=5>#h{^KA6lgJpk#CilqJWsJRA`Egm_koX zi54>=@*TxQzL)PGl*o~hABFs%eE*~(!vQ_nsr2k@^z7s5Db;!+kxfd>sDK#thBC=` zyBIOKo|s*=m}ul@CFXYlF+EbD+0BR<=!qGv#q1vWMTr>`dr}3);&_x-K|{l=@x9@e z!bJZJj~6R3_`C69DhBr&FZN<^!g#S5gY(9V*%)jaFScWF{&*=rgA2w>85m4_iN(x# zsYoHY1RO8!Atcv)h@k+2)z#>Jk$aj5Rwoq|oT&zuz zLwk=|HE9Lhu}mk8`&AiWoUv9&tQGO%%XQ_LAJY)f@`n`r6qIddZnloSQ>d3hpbYQ^ zQ93@r(<@MEM*IK~o!y5Gu*^9T;$8MYx?LJRSy8IL=eP$t3KVZVG(mMS$Q{}fU(+HY zBOaO}ge@RoDj-)_ABIdq7fA@zB%&y1W27)8$d+fP%6tt*9oDsjp<} z4z~woUl|VANA5d728?)U8pgwHij9bHjoq)*D^SpqvK*;)uS@k4uR>yxN@V$KlWIC1 zs?%O=@(j!?>p@}hP`z<*)vLsM3Jx!|!KD5$RJ=w~8R_pl~7 z`mvyXfE5IB22M_oq@TUfiEbCpo_HVaoy}9fkONlFurpn%(^7o ztyS>2I)%k$nRENtO!I(W(8NRY1Ey16FK21`XtWFb`3}82u{S1T{FkL>Kk?8)-xG{) zbgAh7n@fmm1>8QbEKk)@d!PWR>OSIe9)eO!sp6qUUFs;5SJqdT_^>o0F=j{)zc`TI z@3;08O9I*Yt8Dkv4U+qSp3=>FHM%sAO}&^2KaeV0FX?Z+Y=;N34N%%Prph)^yk3n( zUgqUy2HBrR(UhtN3enB7w=}Z^+##<_SmU9NfZ~)D;&C1k;PicO+yGIU>_dsaLrqCp zn#8w}Sfmo!Hyjy$fn`l8Bik$GQ7)~oi^7s*7nBXuUa&IB@445?e_1Xi+qrUc?8d5_ z#nB3ZX%e>CEPfnFW_wenWwmMolNgy(AJfz$Hi)1i2HLSn(0)<*>18}w(2okHQx<_nVv8kW^6hwz#w4BDXe_~CtT;Eg6wlmsKWp-A! ztPG{6=N2%EFB`!x&WVn z7GrA8h;c>C)g>WRP*xy9B^i3IME2MlV#`8FkYprW&4j-(AtDKg`ZJ;;#lls>Z$w># zsIHi^xKf`6*M9$bi(aSPz99)$hw1qM|l}Hq!Jt|7#C%F zDvi5{cu9t=JAJ*oN`fRK;cj2ABp{0GRT%j1o`G5PFiT4VOC;@=U>`PKiY+9&o$&&e zCZ&jo7T|(FLlKiA?LLsH#)IDxmss?EaDZ_m8ST9+t3{1A%nyJosW0WOBmeo`_k*Cq z|3Dc`-@`Lvi9y)<AoK!Q<6$ciBhSv z`6?e3l@U=18$1RQ9reFh7mOU5fcF_hHT8@LzL?k{qKo$| zlX|GO1J372=EQariQ-e~d}vQo*yoWa*t*|=?Zg*fKvLxQBCJfl$MG9_{>nVIA=nIh z=at30^cRt?N*B>lFEQ$EuU1~B;Bt@ol~lrd=9TU3rN8P6(^0S4!d|Da@gDOVh8Zyb z1_IX6T3OOC3&+MRk%ZkaUP>qpncgy9L|Lm2JL9HvWQv!UTh0cIIU>e`MuwlKg(6cue%6)Y&(aep+CGI*#?^Sa zezbFiwq3<-TAlVkq#0d5fq+|UsH~JQ>w%3+B56x!yi^8*q481>ah36ck?Xr1gS|bCeySOIHqiXBz`4CZdm(c0o%gn9|>$1eW|I=)6_3nimxe=K;7!<@1M*^ZR>H8-P306 zSFV!%%ESO$C%RiFQt#;;lq}2ANk`E-2PgAUCtm(oI=|z6@{?A0FMkp|3TDd5<6mfF zy4bXRnC501lSrxF@nUlZv&M^27|auPv1-?m%wk9_1XO~jj$qF4opj{O_OqN^5yz`|MJ zfGlF#Ctg}H({dtG7^Ibebomk<<|u14_(w3>UJCfWR;aO$Oy(hW{I$R3XIH_`Fz+9; zYE=n4nJ{t~?761WcSbZku8Gr9~quL9insO7854I1|XxAiKCyPF~q8Qw;! zRj{$iJX`dbJ&?m#-S?P15e=vU1-kd5+~jtVl~*>~K>dBPX5Z{M)u7OoCG!y76@88R z;DHMI#5e^*)PO8c1p|$5j)B3qDiQ6?%QQD^NDc4<`LY0Xq81RZE;os zfAO}$iQVCKVLXy6hn!S|f5<62v?#y8$;RJ$F3-<*LZR&J4)x4h;XRMwGb=miNJZxy zCC`4LP^dlMX=z-tVp(fjWBbu<&YCPIJ0};zYQh=lK-2=0?5xSwNx72LhNQ`D%RAZ^ z&+TYmvN&b-)*z21BLo@!vifEB1MI`VRdv+TWi3a{UF56|IiZ{!An53qgXEl04t_s2 zWpWQDE=!l#Gdr}(v&tG(>g-d!=V{*abYlhl!fSU{IL;(nB~VttFUM}t3M+#=mJHhp zo#0Aig;4g%-6fuqE)h2P7B&clSkqsDt8VU5l}lDE?(plmBoz7r3Caa5WO-6Q5Kvg4 z1q?4>Q5Urz*51*!%wioP?l26gjUCI{7ca1qw$W0)Db!NFEKCFAb0l;Tu$>n0QE`Ej z1rPtYI3G`z2RD49Jj)NI$7GAgBz6=e?;@dc;aqX26>VLT-$runlGeG4+FF*jcC1|5 z)-re5vbifQ)H{jNe%UDfm!8_Mj9Oge-BOt(l#UGM?>y%34fEIOnSTPas+b>AGC|(2 zhGkPamaGyj1vh7>zy&Ei4GZqnPR-KCu=E0pGET#i_Qj~@<(6HF#4e$%JTNuEaPzuy zhE(UVD>$KgTgYXlZCAo>iIs-?u08pdTylp(1Cf-nKKmmfjm7h!fc;*9D9Fw##FGk( zjKX2*74DEu;m|Y+*;}Dh^~PG$N}PpOIeLqIz|mwlrl;Z9&v48l$7*)F?DP_qTE;_B0&J49Ai*94igS5otJ1FdWCG;W*iF;4pMbq-Pk8 zQ%juoF3k%zU28aSN9_u*7?V|LgIr)(a8a#{B%V=?$u2V-7efeGj1Xh@s}0L~VqMKq zPim%GtGUr|TqiZtmE(59fqPq1miL5_y4@Z-(wRATk=;)X4uy^$=~T>{*S2_`RjX6A z{y&+#=jps_=p7ukhlE0FQ{>%O=baU%-t4T_u$m~$Q_rk6d9sBzg`LKQ?ejaFRkRHT zW2Z0_nh|#DRxIjhU%IHhbuLj^`WpN+4htrwUsfpVfUvV-Vf%uG4a=6yThS`Rj_M&w zLRkkQZPAh=Qzgv~J8egGESuZf(KgSdb6%i|n6+Qnv2$7}bHYwQpGqo%U9$EMJB!;E z%G&j$M%t7dp`x+fm+(9hV7H?*uFMwUv$Uzqhb3l1)C{?6VXH3FWOZ0 z{9{u(Qyr{P=NbV$B6{4jCNSBNG-HzyFwh9-mr6ihIsx-Eg6)lfZBq#tvPA)fM!@h? z0*0j%V2Thn0!kuX=LPK==&pt>(jD6v!?s&@Y%#<3dyV=e8lJ;$Q7E)$I@F6boJmH& z#8d*tZ&AR$M!=L*0;;wspuq^JOHtD08t6>J*4Q1}0fuc(cWmtVW7Mp_X*0 zkJ4}!83FC71T5I1fDR+z@KgepY*E0`M!=CNN_w;gnlNm~b;q{auyuCFcBWxF-JsTM zmXJpfouoZUWzAjEucW0vv&a?QQR-MoPJsRf(32MYV578byC1h?~xm5FiY4|^z;4~~*vdCh(T-5#d zH_7?Y$oUTZi`wQcUa@q_vL!2)R?c1A+O|j|an|H`J3@)8Mfx{EZcF=mN&o6MY5&z| z-!#FgXzge}Lf*B(OdZ%DvxHtFLjU)hgl0|Drri9S_;U?^kBPs<^!*Kg-b82eqD51& zW4H*f76T3w3ibX?!nQHO22FIT@vd=E`_ak!LzGPW@ z$4YD8`7V*Q?QfEmZ)6SoP5i}%zu-6V?+bo*7Sa%=+r(^}SX*PU{mCXSv5DFBx+iO{ zcN*p{Xu}R`M;m+#4ax7lLZQZbr()3}yeMM|U-tx3r`J0(+uM!|zV*d!XuRHGKZxDy zWo^stmq)70ufqka^XD&b3%-Gz1|Z9pv?4Kg7zpZRf<`4KS9=iAPtmj93lZMAzb)#M*YFZF37 z^@;RMe>F_cwK|6_u{%&@+-K6~ea+;3xi!7JznEUY-;IFR(=)wgnBGj!wBtPOe?#YC zNb+4yYOu(p=BG&Q_i@P4x%(jO)GS`Q!tMwEiDoNuhFF{fyXD-$;@qxV&SH-08=j?rjpSaf{9s3dNYztp%o%qpJnvMbk{ADI3UrKDG^7 zk)&)e&xG1^D0{vMEzqH?g(lSQg=n=#gdMNy?4`ZnU1t)L48a-S z942}m4*&FKeecmsS^G;`TgQrJi>()Kp)B4#)x|iWtl3J>yf*0(EN8|GI-Ubkuig&_ zm$Kdp@@wny2*6Q@P}Wvacipv2oMcP3_%>&$OsZ;Nx(gDuiCn|9oAKM-LtK2t)prk zt)p(Ovuf+sy8iFo_~sj+?eF&sfBgXWz4z|kxVv}j-5tI)fwL`pii^_m)fEApf6xv| zGXe*Rw3A-Hu)lp^WPape9qvXm4MG86slrU9r_fYT#&_1az)s>h5t(Fv!W=0rCY&h zsFYtI2G;=EdS8FG1)(mi9`-C~Rne0lc@I76IOG>P@??qTbydnMX z*;wa<$|@ulwnDK6VgJY?-d$fbi{Ai*viLpXa2;V=##_f}Ey3HvX=uL`I>1A!gHq@a z31J(>JE%zt)nOWfIJ^j&#^Jru5K>}Y+XLah7kifzT1f022>VB|ze9||?GP{3F4PXc zC6R^OA^Ike76|1z04~a-zEp!CL^XnUFk=X1aX?rov`E%~M@m`X-NrNvyq1_} zftMz;EaZz1-es|%@%Cf}l&?V`ka}?fk9b8dfU9Syu|R8FJN+z_t;3Mv>B?1zw$onuS2retN>2pYMk%9fLp zm1E7yPR>dpv0iwq1j*V9Z&)$}UE?meGImQY(6oPo*nR=SZuRIe^JPu8`@x&w1gd0yh6i&GD!1K67P>;(H zqGa)~Ar&4^E7CYT97W^sbQOtH63_hyTqhZx(9J>PM7B&WqSHGMctz zF&+;gi*iKPM^Xsy5u|ZXq|j3-^h^ppmqIV3&|gyMr4)K4gePg;Y|=L&EdqaVjq!QhM`{%7=%PC8SVE9#Z-8kP?rJQC{$@7YV6K zlMvJaRT&b3!uIgzP>-@wNaP_^IUe#TFNG@bkY`0HREdYYD)W$c6)9Aehg8+1P<0;i z#H%t$$#~-R7&L^Jf)JiP@h%V=3ZNmS$`fzYpm=zT1`Xkr9TcyQ6sk)@kfNT1hc{kO zJiO?FhVbGDnoA=o?j0%An1*1$fam#13KgCeCm|2Kmw|@x(gd0x-V;DVUU;VfDSa=z zN`SOecPvh{kJc(1`@oW<3fv3M| z2v2a+5T59!Av_UGQh4C0X&Q&8pGnA5%R?TKQYZ>SGzFd;rXf6&Oj4-uz$%f_15dKj z5T1yncrj84&qIRc&3bo@Yop*;b}7xQsTKS z8p5MfG=%4oXb8^((GZ>wq9HtNgCQIt;2|?1O}<1>k93cCudhJNu5+1%dUGq3c*Ix8 zu;PN7({WUx#G~vGos;1bi|70?*4D=*8V^kpi|-PP$IgW0RI)N5&l->X3SbVitqwes zBM0Fv0RrnGON9z=5)^WAs6>4&1ISDZj^^N#ctSl{|$@oHED31#NYzTASD{y?qS4H?P$X6wZL%u3=T#zkS z%0uBFAcd9w)ewi!RNxtI0Z;J|Jwq6&)?j(nl;wqTsaP4QdHP7t3WAW2s*?S)T9b2f zag0O`{P069!5uVlMM64uBzy;QTJ8Te&lFhb6$<5tu`I9JJgOq{3kdegWe1SeFM_HfXQWg0NMQWk2 zJlRZhD3jTa&|fIzh5AcE z{js)>N7=AFxwa{l&>Z4W$1UJ5w_Q|Lr|oLRVI^t1#N%JsE}Ot#Y?p2D8}eu?;VJzw z54r8(wBJEow4Im~TJC!+ZTkZF2*;nG0{9&nzJ}w2JqZLnYLgWHXqjpJ;$b8q;TsFYbNnu{c;uPqA1jMTet3MG zGoIK+J$$1cvjGRCjK^;%gKkbde>FgO`W}B1pTOgp4M$J!Y)FTBqiscvybp1hx0U09 z4%GxgZBXLh#3wuB3C||X2l7SzAkQ}ZhI~_==8eyS8t#}u5Gj|#-|{HOEyq$2HpcwDT- z7-Nm?9&6FYShZcX28-2V)G7LqD96FwmZvDfPkgfZzG> zGbNtZ9h8gM^G-$T-(s?cYxMdsO?YRk*3eaFHX5v5n^75xhA}-a;`s*uUA`uxQ7>hL zACQuk#m78t(PJ~DtJi7_aVBe&*%)V%GI5Dze0<9DVr>8&Dey<$29^L0){W0OZdj2# zYr-wMt{RIDQ~*`aqU~m(lnci*+RJ!;MUM;R`qLR=EgD0()+r0uI)|`4SMWTUJS*Y5 zpgdnd9Llqb7WANa2+Z-;bqAIH3iBM1(`H`oi?pVvnCE+T(RQTcCT`7goz^VbO~QHf(TL0%9h zv(9MNS-M-Jby3j*!WBis4MuZ}Mh`U>ag;^l=#B9Lfvbv!>kM5rdR@dn;)EOH3>MV3 zZY2R?&uf4+}Ld?cxDM2E=AF7X9?Cs|#=da4F@f@B*w4Kf<&*I2&@&qw5GHNZlO z_6a2XV0pF{@&v?1sos^G7bSl`f`_toWVYNF>|9CE;&#C2|Ds)W`JdZ4sIxmDAFQ(r zP@B-^P-n!RLKyYM!>A)3Mm_K_%Fn|nFAt+UBwV*hTV&COF;k%pgMy`Y^IM(<$9O;k z|0y93`TCy2>MBGZh(|d7U|-MwqMrBvMs3vrlb1U+{7HXaj6eeFDp-Mr9RB% zOP5IOr*}B!@-bi-Yy_X)*D>b z{BK=qF?zf^Ypoij^Z+}Z*(cpboX%Ju5lEzWbraO2+xui@;6TJ#0}Ix0c@4(A{e|d6 z2lHy;t)jf#8OfQcRO>6t;VeVcJl5!2GR-?{bcBlv{#84m`P)qMQ&IEG{-7%&u~Wnb zD}>+i8|>d*_)G1dkN;H&qiy1_`!X2nOb+{#!!nEPPyV$vT8(iQQyd%d{-@Yb{>bw~ zPCNgiOX>eFHq4j}yW3c4prPdEIb@~pFK7qB$TY>4qQz}?GAckVlou?CIel!o5w_e! zSjA*eXRWC$m~9SQ&H!5q%Ti`TtIJEDHA!A`)N&ZF8KB(~P%|Erk|9MP)Rx-h-}egt zvv#5OJONs0qjIqJuwL;de534GgJ?}q3eO-8OXE5GrK1eG>PL1D0FUk(D1^Tl-b*JQ znJIgqO@#EXo$+K<;tk?Mdi;wu?k#=;9xmxnI!b?OcFp)x0t|mJ9gb(=OHkoAr1Ox{ z(HXiYqw6KbEB&P~%MU#_@JF6s3H*lqN=oUdysmT=f*->xRR9m&ik$f=gfa{dm$~F4 z5MPkDKS+SMREJ7IWVq!xu8ZDeI+XFx^FU7-)JG+jM`fM|!$mlkmE%@rxYanWY-b4j z4&>1(i%O`$@N05>W_5VJmqDMC zg=e3IXNQr}N{cx$CdQr|ooLf1(3^K03C7$sTTX9BLX15#IxDMRLWVsv4gWfFk`tmM zv2L^$cfl_)O@=Yx>rY}Lh2TAafk|EnYXO-libAHqtx10eeb zE68453uuj2Yocr`6uLaC?D|8zdlN1p^Q}tpYf^kivfXaY&4SCez!|b=SY9@Cxq@#) znhy7Z7#$?Qwq5B~7C5}wvHW>H?GZOQ4G7y)lGFNGan8?S-2i5`C8lVS`{&tnY^_O+ zXS{KkAuG}bXE0r0R!A2QNBL}K8=Td20MMDI1d|dvVX3b4pxG6Mv1Bf=eg)_OP?AA{ zITJqctw{Bh?MhE57|)VOI?pRWN3IVE#uK4+V7eOZN(XFTVHiv10>kxwxgG&1$u2s0?hs$K~_S`gFDnpqWZ@5n3f+sC?IdQ0*GMchw zTUWl&VK^siFqe}bx0cl}TsMjWP2}a|z+@}Z4oBZ$ZIr^+q#GS3(Xm#*(%0lJYp@ z!3zAr@-)irD~B<;wT5tG1n7v%?kC4F8DlN5lVa?w({kOFDg-Bs6{tQ!qqH23T4Opd zBahd?iaLw;m&ZryHBnY98>_`=HHLN4hLd%5BsTLp)l?ub9nt<@iayS&4)(m?cv05wNf2bmd7vQg|92N`pE>>sJva+-4VOtjJ zuWzV#g{m-$!TDToXg#pi<7@~x;E!+a5(NW)^pbJk(j@?Z2N|^SVcjYHlCEKvOv7atkvsc_->7Bei3F( zq=l8XM}c%Y0~A*j7)sXaJPW|J5jv?RdKG|~VVM-zA$)olfI+UtNJbO(Xg`BZn9&lg#a8ay-ka=&V2P!G#$2&rYbuT`WX3ly0zgWycvfArbF#ASDY)ngtpQ8W z2E3%g&pMdG`R1=G>1uOH@qu_~S3sx6I5TXUvUa3o^_1X1^EE&l2Q*Te-0l*X8FX%D zK$e!BzoVOrtF7?aTe%~R@6 zxQ!;bWH(r^2a+;GYM;2hE=X5~NNN$c;RG)(7PHcXM{6U(ji&BgkKC3MoLCS7u*}*n zaoSjF>$x2#@NhkJIJyW;SB*}u3DfgFiQ965gBIM<-K2FQ5ni}Gr}-co+~_$GvGsEM zPVh+C#CC_S#iTWp{diKo+}0BuVA&Oe>WJHUXFhQzG}ZF5;dY+jP%tlH!ZWw^oQ^C9 z0_V1#z@dp+jL@qx9dZ3~d(ZNqog{0?+|CnNSFKqWsnbUMjsCdJC%BXbIuhvhdSf`% z43(SPeu5XFb)m=YK7pY!Kw2ahtuaLC!A_w5x&5bf(D}h&iO|JD4^FlKV0#P7j`3ej z-UgvKp`$TtO-8eY%fRre%kjeXP=mrX2I}o#(P=DFo30_p)5RG&8=!x6Ru7`{nsOZ4 zva#9~gM@$fNCpd3zzGqC4J_v}%3L9Xx^ z6Znf*O-8*gyt@@lkXF}KD~(rbyW--|$Qm1Gf{rIP7O;q{b&A4)PEBiNx?%dQ`?q*h z2woTK{VkqZD<31(|64pzT8v5R!5aK69ysm9QlE;3e~W|GGRh1CYEpKMej8rv>#MEXM__5~~A$GjKIy#VMg}9G93`98;RX@rky}rY`V8?TQ;iB2TCsmsDbyJec$vogqdS8>6v610?mMnHCsT8`VYd6*7b4If6K3@&iUf{(u1$kRc?L5?D7;V?lMZzLUp1LAoO+$E_?^HCrDTjA18cx>K zvEJy5hBxEsV~U11FA|RR4yq;k1>(2|=Rig_2TFqxtTf@ljjoJ&2KBsSq#Pqn4rnM#1sOF)9SS`*vF6-ucUF3lL_ZkMdOL5B1-N-zr%5~16>ph zjbZnm^@5%(UxNjm-@wFb%`kbVrR61uu~zR*Sf?gED};ifJaA;TV*GGZ`|ENeB8F@H0b!r8)!lzEN6OpVG#LcgA%H1B~=Z zomV*HBI697-F?1G<$pmX1tkgW6@EA=u z;4;{|0yr3uIeQk<7GqATt(@CpoUdmk()k|IQZ~@-4?pd|EzdXq6s!9%C)b!^bppnO zMuQG~kaazzIsx-?0*f^3V4Sa)W-Tff4^=yk_;AWrh+s}m(y+xBTKS~9PhnD}WbrT; zCuzVjHyW13h~{AqPU6VQ7PQS+7IToe%>~~--Xa3T^!@D6pw?sR1BN7mgaG=Xv5Q%VR6t9U<5&V2M;ik zpEP-3JeTF^xn5Z!tj!{W$#qbU#Yvihe6U@DhZCu34k&Fam_|Yky{D-Y5%{gTMsn+z z3;1XqtHAP-ubH?Ma$ z79(LMFOBcK<#4nbSenq!foCMq*kGzLr*M+eoKd_ahcK<7RrDnujZ|yhV)WRfp)IrW zu8nF%A;@8*DA%80A(Ph{H2PLJU15oXGGn!c#F^r70ZM=`D^+x?=iGyQB;^|uxm0u>!THSxJgn!fNIgHn_CMf~DJ_g&%v!dN z4rV$$8U_JeYYGY81G+dYQhIQL!$As`9_^WxEHz+qtPLtxSS-#GI1D6W>0qk~riw67 z!A%%qLU>#8bmC~kV42-yG{u>y>ymX}5 z%))?QE#m?0q&|j7uC?Nv2q&*Zh7uAE?~B4$n zoZ!RUOBY3E`p{>fuKXk%DKDHe@+C)tQ%b@Cg9K++WU3%Ft+WK^g1X95MuJCM;K%{r zbFlKw1uIh(FI#^JKUNc|B|9k=Bin94p36#btn{%On4KZd&|igj=6Q$`P84`gV}A%; z4%rYP{U&rQxUuA%XP1-kEt;?}nC^v{jqx}tWx6ac!O0|+=%s=b$IF_j7uN}3Ss7Lk z30}oQczSJ=1{QB{)CFqCbp_6MB?&ju2+Pt|&^T<7!AOtpI*|M-OE_R3P^FB=DpEY> z$D-96Kzv>-46mw$7pc`U9;-=lWNr>)aq!i|gs?8d+eLK=2PO_?WFHTffGv;ou26$n zv(eDfu@lze_7Ko!H64}^i03Emp^E@=YcU4WV^2N28rt_Cq_G^V90NsdHNXvT;m=E;PSbHCxgLk2Fi)9Jb6iRP<*gP z$XBbqc|ID0)XX>y9|nV}4;x2X3v8}RHMInT!9b8Mqq9;f>5OO1S{p(1&fvaII86uJ ziO@7nCaBc3WmCNnngoMdk5bNb#I$h!OUvS+*^xZTusD)OG?byy+&$8$hs|o5m%lR& z;{mH`95sB#$Vk{`Amc^s?_j%}^mpS}4I$haO|D}%StPF!<5`Vpjbpb!-rt2Aag#Gl z0|WdR@E*`vU{Md&{J=uu$O5`XLTe(Vh05qec8)Bh^n_0F>_a7IWuX67Vz!;_Bu)bQ zli{Z`nZFH?_Woh9I^5C?8yU=gVIqx7UR0wnhI4_**U({nMq#Ae;K^uD?ZaU%d4j_X z8-c^AE1K4VEPfwM?iv_!C?~|d*UMV?&!<| z2dy|F(HrSFLYWVbtx~OVgR0T68IeamdO*77k3f_MVNy8~w-z|-pg|uOVuRq+CmUS> zo>Zo!2gjbdTkDp*bXeJ8eueSi(lcDqWCh9TO7%d>uVwS1@TB^{bp!i0FpQJNUr19b zcQ7i*IZX4QnmT!x%3q=d8n9|&t-3f#4~6Oic)xL81zsPV>CG`9mb`8vA5#4wYvWKn z@vuM)D@CwyW`7{Ae34Cbpsd|qm%SZjn{51xnK6{<6f@By<3q*$HSfP4~5(A9l^ z0tZ|UX-i2Mh%ZMw&>%2tFcoNj2tS!<4Vb4H`l_dc3srJPc09IKSmlvM$X%hcg6_9F z)fmi6EmlJu$U{p2=A;&@j;=1ld=$cT#n=PGW*YV+VY;&Gh2ik-q-4A?OnOk7mk)l2 zfg)MnB?z2PZz)bmjDwvxzK-Eb(%=zn3ircrnC0p;&Yi1L7{@o2SZywiaj>|d!^5wV zb%Hn@T}3ZT(!d9UiS%1qeJw}7rPb8(_^qQdR-iEASBSNtB7r&isYKyq)PnHJ_}$eA z4lGoLD)`MD(m4I97zZ9b{JR={1yLQ>=mK!6@J6xy&xM5T4eO=Vq6@Lqu%soXmJ zhCUBRzK|W`ipuh~4CV(>lzG}i_!Ina7=IAn1vPxj^e=S8G~IDukKm)_h8W&oku=Ku zw{Ia%r^mrJn~;&AUb77VM_0A2-Dvn1Z2MYGHb6-Me{ zmzlQ`tUW>cPb9l78vYz+wsX-ccj-$9`sVLt#X zgbN@KoC^i{LaD>~pP5jCkmwLMh+(2bd}*-cl)^vY!OYSS zq0!?qOIM>F*0rfNJ^m>Tot(zO5S-Ts=$mOepZ_i$nJP!3^)%7+W&SBWS;(-WA13i` z^6lYVk6H|x`Ufd#8nUqVZ&=O}_!#oUv-xG4K?&q9aIVoBW1{q7P}R^k7iar)$js^q zw3C8xST-?2&jN~uacCs$p7CDuUvPQ*`p5htOc)* zacVW(3L9JDte(LLJKP!*8xE^TfJN&LiDMC1@4@l_j>ZKCtPM=LEZ{2yS+g+)SQ?;b zk|<(YuqJ@l9W$5kz-mB#rg+K*?XSREkT^LXU@4F;UFn83Q)s|sKDvyS3}y+IuB&tW z$s$M}0xf?z;NhBSJ+$}CpBzsiqFraBMXE8d3ewqFX8$=J*mOILDxu!4Q}S7JT#g;r zbiii87Of^M7MeR44A|--^-K_4;Lrubga8+wz%o+%?*iAvSzuEOHhZ}im9FWb^FXf< zl0E5FRR!R5Rzt1lJtdZM;r^4yI<58^NQ3?6a@KE3_awl%P%LA(m8*L!9yNg# z4qC6-Hyk~|ZzX|)*W*OvjOn1HJ2o&Oik zL&$&oZ<(-B3&;Q^?c3Gqxv&LF=U)<2Tm3Ic#C{jgi3GTFtxpPHN8AehZG)dOSflfo zOTDC}JC-{5zezJIxNC~W;cO5u7-JfS`=w~SCx8Nv%`iK>DgUoXMMTMXy1sb=IbcL7AuHdCGimkHqWB{FNxEcx;7`e zp?xloqxO#WwKOgQJU7tZ@?G6;ftLdIHq>>#!t8A*(-DkTzJoMqZ@*>s)(gU9o|436 zKv!xy_{B*zIJv@tBKqpnQ5!uACx=I9P2iUUJ2kSgMZrAi?vt;<8!b8+UHu^A9S-h= z!TD^HcP*$;_-6c=ol4S z*DVQ71|G;Y?e**NbTpoOec>Hw=)Z6Xv;{4jAxTY}eLJ=KBh%`rK+r1d`PkY6UB4K? zYl{iblE=Y~DkgX!6ffvuHC~E0WaV-Y)dl!-@ie+jc$ddMz{YC76c10E*)#IsoIc75 zeqK&|a=IK^0nDIyD>#ZZiHJ*5@wkMqXuVNO|9@Qu%? zWM%a)u;C<*Ed&yd!G4pt7-K{n9FSpB&^S{5kc~?d;1FA9;I)@keAt=5E3RJfuQ5kstRf-pCI@ttE75Z!FgpfMZCKOR}ZrX zTOG)wZzz=kJSSu0B<7_S265aM1-Y>r4d6J5yRA^9q%K@XKEV_~YHT(xK6yNf^Lm5v z+7x$n^BX#MMvX8)fw2W$+Sd>Y`vNnw1Fbj=AC)V27zIxFMn6g9)~dnQivSC%b^IxL~}& zkw+UAM-TNO?}%44|6o=k@pzN8k_wynd<`{5(+R)Wt}3Q403$6J)-L4nIyjd~;!##J zlp?wbf}=35uEJ^HDCtBog?9ya7hDi$>#qz0c?LgmDl|4_T+FbBhw+;HmgKF|!;!pb zBg_%O6Wj_XNc4Jwhu-0_=xxjFHZ4%(CPo)+rD@DvHB#+&g=?doFdxAc2K)WGaN?lC z^Cq$r8LXr}(0HaR8c$As(0HsLphFr@c4p%Y)SHRwU#=78Tg&0F6pS07ICNpotIVom zU6Jy{l^tsgPONcWhUc<~4%9L^!1b$>)e;S(IV({T>RRw1`i1!~xQEC_)ijsp^NZvmw zUls;wU{#o}h5imw$<})dQ7L*^xM(zPyY4bgJqQI&v70RRgXZAvaeVOHn2K**KtUuz z%l(_xJKE1c|8b*$O~$*ga7%|Q-C@ZT-tD0~HIP=inVR90g0#3gDD`8(yid}lq}yWC z@^azT4cHN)tvfO+CmC+6u|)ladYyWsdS<}9fJFg20?q|o47d{TTfmKg z+W`*)o&+op+z^<*9a8(070amu0)w*q=jM&^o9;KmZ>Ha;exLa*@%!BGPrnC#PyEKH z$Ehc&r>du`=cyN{7pfPjKUROHUZVb7y$pz~QLhC;>(v{8*cSCx^)~f(^-lFJ^=|c7 z>b>gy>I3S7>O<-u)rZwb)JN4nsgJ3Tt52v;s()7hqCTZQqrRlRq5fU{r}~L{bijlF z%I@NTPXay*SQ@ZAV0FM&V18G??tnc3Uj=*}@J+zpfbRqL2OJ7G5^yZwWWcF_vmn}e zBHUFX-c1njZovJ3KZ%&n16~H?2aXM#95^*_THwsUd4UT9KMwpXaB1N3z!ji^i-A`H zuLs@^yc_su;N!q&fqwUz6$y-XkXC&po2j_2K^LtGU#;BuR-U6E(To=x*BvX=tj`(pu0hT20aRT z8dL>N?N-cx0i{}|Be*tY2isGsjPy{veTx@+bxgG-<_3p^Oj9UeW0k}V$Vv~+NP&({ z5NJ$r3cTKu3uAHk2R;w*px_`3y8H`Hwx`!l?L*=)rApBQQCgns0L z03QSgUP#4%(D(sIPjB8OG4vO~fh)K0A67z@qWyaEA^Sye9D_*=9Bcs`O$!;A1PM+` z5(&cs2jIL-D~N+UG-(>rOfCD@v}K!+kQSjWLYm7WA=oq|q-D#N@HaFhq)lst^@iEi z+qViKW&FH)yHi@f+2ptE?CO{`3r}qgtQ-5S@)w0r&d*yw*x{23Tt6WHBf`3OMC(}FPB~BNFS6E20e-a+kJ%TW+UbAFK5R~wk{t;^U zSPvGDfX;{(2&s3gz&74j6AsTX>dZ<@B|B7-~_k$#X_)Y^WbJJgPVo6 zXcn4~WY0{9&T`~-YuP+u5d0*E2B)N_2deQokjCf*lwwa88mHoONdM*KfJu3&skWTp zWTA0NmP2S9FEkSx8~eZyd>E5Lg~r-w2*p^0#;_sUIBKxaIMSYLOzMkQ@AEL;i3H)S z|BiZ6o;^JUWNzAuh{P^SOGvjT@kw%EJqBk(*)}FGkHSTR zSvk3F;i8X>>|CL2WQ|%=n=1lGK~aZ-K`2){zsg8K2elLbRqk2}EK=o$ut@W^a=xd6 z{B1;jzeD4EXk30S`#XUB9mxI;Vt)s-zeCvHq3rK4_IEh@JA(WbPt_<`wf>v;uDIWa zJu^EoxnE)*TWVs4J$*2&8>&?wOJf8i3WS#>)M-its}d1v^^ePH}z8NkvrP$ zcf?nbN!C+AJ0yHm~m_A$aZC{YwR)VI{m9Y5Kk8eSw~90 zl$3t3u1iFHecs${&HAT{w$9zN-uppbT#0$@XSAq%`pX9!ZLAKc`|7^^<3zvxUj#4ytKHaPKZqM!U3#*=L5)wQ)o8PM+4W%Y?Efbp$vJtMx%Lcn zr&Oyd4!<4R@aOY?wVl)SSe-rJzf%2ppv7nB8fPCo9Fke$*1Ju`GyjjQ*ajtM|GBl}7hYMe>%6!;PRMsqL6pF99I&xFsVrs%i zuf$_p9fm*0yc6OTE!;X*t%G=CaqRtUwgY~u?*qU-! z^WgT$zpC8-&Ds+~o1^i$Aly9`!|ugmJYx_E3mk#Z4P|NTvm# z`?CJL&5eGFz5e`V-i>ordv$m@i9PwdUF%oPe$j5su)ykJt!`YKzw&+I&L?d|pW>igkm{mmx33)Bk}#}A z%?WRN%)6Gf_3gPX)ti-Az36ejqz%6w4HG?!gQ~2ciLAHHnnQh(#=ZIW`0D=8?|eOL z{iVZsQ;a|FtAEknb9A@vTg3)$Q7!P+qgr)g^Yf*fS8OU}e9*m(=E;n~z0(J5J=^Vf zeaPMY=Rd9SiMJSAZ1iBZjYBjd=GMTC`aLVdK6BV7Jo;eq@1_CQtNvLz*(dC?dSC6C z?%|y&)-MLK61BemxBoQtoRrZbV_rs|>N6LP+|XMs{+8U-`0VRrl^c$)CGM+L(02R} zZML5+C)1YhthToz_UELBIWnF_Xg4KyIj^|7@bLZN@psf84SZU4>9=1_7k?-Ys_6Qa z>qsG5J=xRoeB9|jhQF@&>e_&Js`yo(-7w%v$u`>En~sn7>(fpYO#$x6Nh%N7SRvGY zFid@sEW*fPj^J|X<@ z^7OIQ+rMd2dE`yir%#d&->@7SedB}XE$3~>{9)w6PuqxwVkMlFLr1HX51BnG#!nx! zyXB&iAI5bre=Z?!pm)!i-79tYVYjw>TyODa@sS-U({u6bVCqlU%)c&u0M6m#T9@l`^19oC7HS`{D3)`Vo#qqz;m zve%Za3H|b;byY{lY?yF<_`am$=G%u?FKjS!-JfFJ*2PD%DIt0B>d1QHj+^hSnA|bC zxg%C}yx+Ni1FPCzShM2Xp})^Gq6XcW3sdpW2Xx1n$>Tz(KfNnsMLpB&i6ht zr0zLeZPT*NF%kF6iuK&6VJvHu#2?RmJ{&}{X z!PMeR{^9hhoo{-!eZSkI&$Dwnp56NE)TQ2oc2AE#^ueb;`Rw%&OSnr9mdapL5Zq^| zMr+k<{nL=u_rrEQRDE^dchSW*f#E_*#GVuPqPk|Zu!KDqN4ZNd6;@Y4NK$@dDto66 ze7R)6Z?o=ww_w%YT6-4$P<_eCep{!UKYXJ1-P;4j{9>Y(3JZdX+1Z5XvHt!ypUqov z|JnW1!>!$n?QfKMc(mK@s;y$OD^#t#d3lQXb%dK`m|{!H>%(Pi`PyS=t5rXB)Nc=d zyW{im&9^A$XL&DB1gyK$W%`rHwO@)i+$EQnYfq;wgUGk?@>8Mupw4a2zS*o#Jln6^ zK1b^Jjxq17+<2$g?|EBTGI{`*(x z#@#$SH^k#{?j|9b@c!E_cR9E(_~@LyH$S>Lf7dJ3&5i0GC*7Jj zbl7L5A1w6{9qtlM#TN)1oZj_*jz89HT(zltQq8$5tB>AxssEGsb>Dxmc72;Smlryw z?GwkkOOHHTn{CgQ^m_Tl$JX#FVaataeBCL-5Y*tqdkcNM{?Oe^pS^bR-J7LGiyo0~ zmLs%%d29S><+Y@Yon_PJ&pq?%RL@>7AMgHS>gC0!f4enmz~boRwk4vky9CofIIhva ztzH|JmPndiuhF3!uUfootni87rGviKstfuzYVy{!rGq%YU266$pv4Cn!#dbLnYZad z?&PMOPiefmy{AZ-+3d1rVQNq#W6GxIJ^jSv?vis1&P-0@(tWVE{N4FIf1ljTSjLdr zAawla<5IJqe==_3q9&u}KUW=HBwC~0EIfN=t}O>2QnICRqMb{%+uQoi>Zu1Wbo~0u z5>MVN{qe-1^)pVj)juuy;rW-P+loWnCCYk>T=Gnb)Hn{*3+*`Xy}?5dH{KQeY(##P z{`?u^+Tz)R+}9axn)b{2B(n52<%T_e zt2+x-ULPo7YPxr*n4@=-Ak2?pn#$?z@4J0ja@ElG8@^n8zw@uh_dVLXsjytZ@%lczS-^M$<+x6I(RmU%? z*^BvN2cw$=X%XT}GwHTIiODD`Zz>b^CYStr`1kh)4|@3hxiya~Ki&O8za#SMz#nr= z1ATuE6U4mYBQ7I*yT4^XjCDs)vlw)IkWQLe0r^+ U?d^N?N1qwTMQ!mAqrMS^owCO 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 L<T~{e-dZr&fI&?@0@$?x#ymHXQy7< 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 diff --git a/src/windhawk/engine/libraries/MinHook/libMinHook.x86.lib b/src/windhawk/engine/libraries/MinHook/libMinHook.x86.lib index f802b30d3b1c41272020a43a40ec26ed6be22104..7a23300ffa2d2066071cbdc61f5dec36862d3f1a 100644 GIT binary patch literal 520584 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⋙$%ES1r6)R$h(p>ay}wyIY@?r|R|Uth_q0 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Ε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

    XbzHgoSbj{j;yn=dK+DsFrcCxm56Ll#Px2$Fpi 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 literal 504188 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'OjdN!7~I4` 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

    ?qpEoA6^~FeJTaI@9$+-_2;*9hJV-K2 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.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�p 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 - new AllProcessesInjector(skipCriticalProcesses)); + return static_cast(new AllProcessesInjector()); } catch (const std::exception& e) { LOG(L"%S", e.what()); } diff --git a/src/windhawk/engine/mod.cpp b/src/windhawk/engine/mod.cpp index de5edac..427abc5 100644 --- a/src/windhawk/engine/mod.cpp +++ b/src/windhawk/engine/mod.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" +#include "critical_processes.h" #include "customization_session.h" #include "functions.h" #include "logger.h" @@ -215,6 +216,12 @@ LoadedMod::LoadedMod(PCWSTR modName, m_compatDemangling(ShouldUseCompatDemangling(m_modName)) { auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE(); + ULONG majorVersion = 0; + ULONG minorVersion = 0; + ULONG buildNumber = 0; + Functions::GetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber); + + VERBOSE(L"Windows %u.%u.%u", majorVersion, minorVersion, buildNumber); VERBOSE(L"Windhawk v" VER_FILE_VERSION_WSTR); VERBOSE(L"Mod id: %s", m_modName.c_str()); VERBOSE(L"Mod version: %s", GetModVersion(m_modName.c_str()).c_str()); @@ -447,7 +454,7 @@ BOOL LoadedMod::SetStringValue(PCWSTR valueName, PCWSTR value) { } size_t LoadedMod::GetBinaryValue(PCWSTR valueName, - BYTE* buffer, + void* buffer, size_t bufferSize) { auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE(); VERBOSE(L"valueName: %s", valueName); @@ -469,7 +476,7 @@ size_t LoadedMod::GetBinaryValue(PCWSTR valueName, } BOOL LoadedMod::SetBinaryValue(PCWSTR valueName, - const BYTE* buffer, + const void* buffer, size_t bufferSize) { auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE(); VERBOSE(L"valueName: %s", valueName); @@ -477,7 +484,8 @@ BOOL LoadedMod::SetBinaryValue(PCWSTR valueName, try { auto settings = StorageManager::GetInstance().GetModWritableConfig( m_modName.c_str(), L"LocalStorage", true); - settings->SetBinary(valueName, buffer, bufferSize); + settings->SetBinary(valueName, reinterpret_cast(buffer), + bufferSize); return TRUE; } catch (const std::exception& e) { LogFunctionError(e); @@ -661,6 +669,13 @@ HANDLE LoadedMod::FindFirstSymbol(HMODULE hModule, HANDLE LoadedMod::FindFirstSymbol2(HMODULE hModule, PCWSTR symbolServer, WH_FIND_SYMBOL* findData) { + WH_FIND_SYMBOL_OPTIONS options = {symbolServer, FALSE}; + return FindFirstSymbol3(hModule, &options, findData); +} + +HANDLE LoadedMod::FindFirstSymbol3(HMODULE hModule, + const WH_FIND_SYMBOL_OPTIONS* options, + WH_FIND_SYMBOL* findData) { auto modDebugLoggingScope = MOD_DEBUG_LOGGING_SCOPE(); try { @@ -705,7 +720,7 @@ HANDLE LoadedMod::FindFirstSymbol2(HMODULE hModule, lastQueryCancelTick = tick; try { - if (settings->GetInt(L"Disabled").value_or(0) != 0) { + if (settings->GetInt(L"Disabled").value_or(0)) { canceled = true; return true; } @@ -732,8 +747,18 @@ HANDLE LoadedMod::FindFirstSymbol2(HMODULE hModule, } }; + SymbolEnum::UndecorateMode undecorateMode = + SymbolEnum::UndecorateMode::Default; + if (options && options->noUndecoratedSymbols) { + undecorateMode = SymbolEnum::UndecorateMode::None; + } else if (m_compatDemangling) { + undecorateMode = SymbolEnum::UndecorateMode::OldVersionCompatible; + } + auto symbolEnum = std::make_unique( - modulePath.c_str(), hModule, symbolServer, std::move(callbacks)); + modulePath.c_str(), hModule, + options ? options->symbolServer : nullptr, undecorateMode, + std::move(callbacks)); if (!FindNextSymbol2(symbolEnum.get(), findData)) { VERBOSE(L"No symbols found"); @@ -771,7 +796,7 @@ BOOL LoadedMod::FindNextSymbol2(HANDLE symSearch, WH_FIND_SYMBOL* findData) { try { auto symbolEnum = static_cast(symSearch); - auto symbol = symbolEnum->GetNextSymbol(m_compatDemangling); + auto symbol = symbolEnum->GetNextSymbol(); if (!symbol) { return FALSE; } @@ -857,9 +882,9 @@ void Mod::Load() { m_settingsChangeTime = settings->GetInt(L"SettingsChangeTime").value_or(0); - bool loggingEnabled = settings->GetInt(L"LoggingEnabled").value_or(0) != 0; + bool loggingEnabled = settings->GetInt(L"LoggingEnabled").value_or(0); bool debugLoggingEnabled = - settings->GetInt(L"DebugLoggingEnabled").value_or(0) != 0; + settings->GetInt(L"DebugLoggingEnabled").value_or(0); m_loadedMod = std::make_unique( m_modName.c_str(), m_modInstanceId.c_str(), libraryPath.c_str(), @@ -912,10 +937,10 @@ bool Mod::ApplyChangedSettings(bool* reload) { if (m_loadedMod) { m_loadedMod->EnableLogging( - settings->GetInt(L"LoggingEnabled").value_or(0) != 0); + settings->GetInt(L"LoggingEnabled").value_or(0)); m_loadedMod->EnableDebugLogging( - settings->GetInt(L"DebugLoggingEnabled").value_or(0) != 0); + settings->GetInt(L"DebugLoggingEnabled").value_or(0)); } return true; @@ -931,7 +956,7 @@ bool Mod::ShouldLoadInRunningProcess(PCWSTR modName) { auto settings = StorageManager::GetInstance().GetModConfig(modName, nullptr); - if (settings->GetInt(L"Disabled").value_or(0) != 0) { + if (settings->GetInt(L"Disabled").value_or(0)) { return false; } @@ -942,21 +967,52 @@ bool Mod::ShouldLoadInRunningProcess(PCWSTR modName) { return false; } + struct LoadModsInCriticalSystemProcesses { + enum { + Never, + OnlyExplicitMatch, + Always, + }; + }; + + auto appSettings = StorageManager::GetInstance().GetAppConfig(L"Settings"); + int loadModsInCriticalSystemProcesses = + appSettings->GetInt(L"LoadModsInCriticalSystemProcesses") + .value_or(LoadModsInCriticalSystemProcesses::OnlyExplicitMatch); + std::wstring processPath = wil::GetModuleFileName(); + if (loadModsInCriticalSystemProcesses == + LoadModsInCriticalSystemProcesses::Never && + Functions::DoesPathMatchPattern(processPath, kCriticalProcesses)) { + return false; + } + + bool includeExcludeCustomOnly = + settings->GetInt(L"IncludeExcludeCustomOnly").value_or(0); + + bool matchPatternExplicitOnly = + loadModsInCriticalSystemProcesses != + LoadModsInCriticalSystemProcesses::Always && + Functions::DoesPathMatchPattern(processPath, kCriticalProcesses); + bool include = + (!includeExcludeCustomOnly && + Functions::DoesPathMatchPattern( + processPath, settings->GetString(L"Include").value_or(L""), + matchPatternExplicitOnly)) || Functions::DoesPathMatchPattern( - processPath, settings->GetString(L"Include").value_or(L"")) || - Functions::DoesPathMatchPattern( - processPath, settings->GetString(L"IncludeCustom").value_or(L"")); + processPath, settings->GetString(L"IncludeCustom").value_or(L""), + matchPatternExplicitOnly); if (!include) { return false; } bool exclude = - Functions::DoesPathMatchPattern( - processPath, settings->GetString(L"Exclude").value_or(L"")) || + (!includeExcludeCustomOnly && + Functions::DoesPathMatchPattern( + processPath, settings->GetString(L"Exclude").value_or(L""))) || Functions::DoesPathMatchPattern( processPath, settings->GetString(L"ExcludeCustom").value_or(L"")); diff --git a/src/windhawk/engine/mod.h b/src/windhawk/engine/mod.h index 7c05e22..ac554b2 100644 --- a/src/windhawk/engine/mod.h +++ b/src/windhawk/engine/mod.h @@ -34,9 +34,9 @@ class LoadedMod { PWSTR stringBuffer, size_t bufferChars); BOOL SetStringValue(PCWSTR valueName, PCWSTR value); - size_t GetBinaryValue(PCWSTR valueName, BYTE* buffer, size_t bufferSize); + size_t GetBinaryValue(PCWSTR valueName, void* buffer, size_t bufferSize); BOOL SetBinaryValue(PCWSTR valueName, - const BYTE* buffer, + const void* buffer, size_t bufferSize); int GetIntSetting(PCWSTR valueName, va_list args); @@ -53,9 +53,13 @@ class LoadedMod { HANDLE FindFirstSymbol(HMODULE hModule, PCWSTR symbolServer, void* findData); + // For backwards compatibility, replaced with FindFirstSymbol3: HANDLE FindFirstSymbol2(HMODULE hModule, PCWSTR symbolServer, WH_FIND_SYMBOL* findData); + HANDLE FindFirstSymbol3(HMODULE hModule, + const WH_FIND_SYMBOL_OPTIONS* options, + WH_FIND_SYMBOL* findData); // For backwards compatibility, replaced with FindNextSymbol2: BOOL FindNextSymbol(HANDLE symSearch, void* findData); BOOL FindNextSymbol2(HANDLE symSearch, WH_FIND_SYMBOL* findData); diff --git a/src/windhawk/engine/mods_api.cpp b/src/windhawk/engine/mods_api.cpp index c9a03da..5c1d050 100644 --- a/src/windhawk/engine/mods_api.cpp +++ b/src/windhawk/engine/mods_api.cpp @@ -33,7 +33,7 @@ BOOL InternalWh_SetStringValue(void* mod, PCWSTR valueName, PCWSTR value) { size_t InternalWh_GetBinaryValue(void* mod, PCWSTR valueName, - BYTE* buffer, + void* buffer, size_t bufferSize) { return static_cast(mod)->GetBinaryValue(valueName, buffer, bufferSize); @@ -41,7 +41,7 @@ size_t InternalWh_GetBinaryValue(void* mod, BOOL InternalWh_SetBinaryValue(void* mod, PCWSTR valueName, - const BYTE* buffer, + const void* buffer, size_t bufferSize) { return static_cast(mod)->SetBinaryValue(valueName, buffer, bufferSize); @@ -91,6 +91,14 @@ HANDLE InternalWh_FindFirstSymbol2(void* mod, findData); } +HANDLE InternalWh_FindFirstSymbol3(void* mod, + HMODULE hModule, + const WH_FIND_SYMBOL_OPTIONS* options, + WH_FIND_SYMBOL* findData) { + return static_cast(mod)->FindFirstSymbol3(hModule, options, + findData); +} + BOOL InternalWh_FindNextSymbol(void* mod, HANDLE symSearch, void* findData) { return static_cast(mod)->FindNextSymbol(symSearch, findData); } diff --git a/src/windhawk/engine/mods_api.h b/src/windhawk/engine/mods_api.h index 3098573..6a62581 100644 --- a/src/windhawk/engine/mods_api.h +++ b/src/windhawk/engine/mods_api.h @@ -11,6 +11,16 @@ #define WH_INTERNAL_OR(x, y) (y) #endif +typedef struct tagWH_FIND_SYMBOL_OPTIONS { + // The symbol server to query. Set to NULL to query the Microsoft public + // symbol server. + PCWSTR symbolServer; + // Set to TRUE to only retrieve decorated symbols, making the enumeration + // faster. Can be especially useful for very large modules such as Chrome or + // Firefox. + BOOL noUndecoratedSymbols; +} WH_FIND_SYMBOL_OPTIONS; + typedef struct tagWH_FIND_SYMBOL { void* address; PCWSTR symbol; @@ -82,8 +92,8 @@ inline BOOL Wh_SetIntValue(PCWSTR valueName, int value) { * @param valueName The name of the value to retrieve. * @param stringBuffer The buffer that will receive the text, terminated with a * null character. - * @param bufferChars The length of stringBuffer, in characters. The buffer must - * be large enough to include the terminating null character. + * @param bufferChars The length of `stringBuffer`, in characters. The buffer + * must be large enough to include the terminating null character. * @return The number of characters copied to the buffer, not including the * terminating null character. If the value doesn't exist, if the buffer is * not large enough, or in case of an error, an empty string is returned. @@ -117,7 +127,7 @@ inline BOOL Wh_SetStringValue(PCWSTR valueName, PCWSTR value) { * copied and the return value is zero. */ inline size_t Wh_GetBinaryValue(PCWSTR valueName, - BYTE* buffer, + void* buffer, size_t bufferSize) { return WH_INTERNAL_OR(InternalWh_GetBinaryValue(InternalWhModPtr, valueName, buffer, bufferSize), @@ -132,7 +142,7 @@ inline size_t Wh_GetBinaryValue(PCWSTR valueName, * @return A boolean value indicating whether the function succeeded. */ inline BOOL Wh_SetBinaryValue(PCWSTR valueName, - const BYTE* buffer, + const void* buffer, size_t bufferSize) { return WH_INTERNAL_OR(InternalWh_SetBinaryValue(InternalWhModPtr, valueName, buffer, bufferSize), @@ -158,7 +168,7 @@ inline int Wh_GetIntSetting(PCWSTR valueName, ...) { /** * @brief Retrieves a string value from the mod's user settings. When no longer - * needed, free the memory with Wh_FreeStringSetting. + * needed, free the memory with `Wh_FreeStringSetting`. * @param valueName The name of the value to retrieve. It can optionally contain * embedded printf-style format specifiers that are replaced by the values * specified in subsequent additional arguments and formatted as requested. @@ -175,7 +185,7 @@ inline PCWSTR Wh_GetStringSetting(PCWSTR valueName, ...) { } /** - * @brief Frees a string returned by Wh_GetStringSetting. + * @brief Frees a string returned by `Wh_GetStringSetting`. * @param string The string to free. * @return None. */ @@ -185,8 +195,8 @@ inline void Wh_FreeStringSetting(PCWSTR string) { /** * @brief Registers a hook for the specified target function. Can't be called - * after Wh_ModBeforeUninit returns. Registered hook operations can be - * applied with Wh_ApplyHookOperations. + * after `Wh_ModBeforeUninit` returns. Registered hook operations can be + * applied with `Wh_ApplyHookOperations`. * @param targetFunction A pointer to the target function, which will be * overridden by the detour function. * @param hookFunction A pointer to the detour function, which will override the @@ -206,9 +216,9 @@ inline BOOL Wh_SetFunctionHook(void* targetFunction, /** * @brief Registers a hook to be removed for the specified target function. - * Can't be called before Wh_ModInit returns or after Wh_ModBeforeUninit + * Can't be called before `Wh_ModInit` returns or after `Wh_ModBeforeUninit` * returns. Registered hook operations can be applied with - * Wh_ApplyHookOperations. + * `Wh_ApplyHookOperations`. * @param targetFunction A pointer to the target function, for which the hook * will be removed. * @return A boolean value indicating whether the function succeeded. @@ -219,12 +229,12 @@ inline BOOL Wh_RemoveFunctionHook(void* targetFunction) { } /** - * @brief Applies hook operations registered by Wh_SetFunctionHook and - * Wh_RemoveFunctionHook. Called automatically by Windhawk after Wh_ModInit. - * Can't be called before Wh_ModInit returns or after Wh_ModBeforeUninit - * returns. Note: This function is very slow, avoid using it if possible. - * Ideally, all hooks should be set in Wh_ModInit and this function should - * never be used. + * @brief Applies hook operations registered by `Wh_SetFunctionHook` and + * `Wh_RemoveFunctionHook`. Called automatically by Windhawk after + * `Wh_ModInit`. Can't be called before `Wh_ModInit` returns or after + * `Wh_ModBeforeUninit` returns. Note: This function is very slow, avoid + * using it if possible. Ideally, all hooks should be set in `Wh_ModInit` + * and this function should never be used. * @return A boolean value indicating whether the function succeeded. */ inline BOOL Wh_ApplyHookOperations() { @@ -236,33 +246,56 @@ inline BOOL Wh_ApplyHookOperations() { * @brief Returns information about the first symbol for the specified module * handle. * @param hModule A handle to the loaded module whose information is being - * requested. If this parameter is NULL, the module of the current process + * requested. If this parameter is `NULL`, the module of the current process * (.exe file) is used. - * @param symbolServer The symbol server to query. Pass NULL to query the - * Microsoft public symbol server. + * @param options Can be used to customize the symbol enumeration. Pass `NULL` + * to use the default options. * @param findData A pointer to a structure to receive the symbol information. - * @return A search handle used in a subsequent call to Wh_FindNextSymbol or - * Wh_FindCloseSymbol. If no symbols are found or in case of an error, the - * return value is NULL. + * @return A search handle used in a subsequent call to `Wh_FindNextSymbol` or + * `Wh_FindCloseSymbol`. If no symbols are found or in case of an error, the + * return value is `NULL`. + */ +inline HANDLE Wh_FindFirstSymbol(HMODULE hModule, + const WH_FIND_SYMBOL_OPTIONS* options, + WH_FIND_SYMBOL* findData) { + return WH_INTERNAL_OR(InternalWh_FindFirstSymbol3(InternalWhModPtr, hModule, + options, findData), + NULL); +} + +/** + * @brief Deprecated, available for backwards compatibility. */ inline HANDLE Wh_FindFirstSymbol(HMODULE hModule, PCWSTR symbolServer, WH_FIND_SYMBOL* findData) { - return WH_INTERNAL_OR(InternalWh_FindFirstSymbol2(InternalWhModPtr, hModule, - symbolServer, findData), + WH_FIND_SYMBOL_OPTIONS options = {symbolServer, FALSE}; + return WH_INTERNAL_OR(InternalWh_FindFirstSymbol3(InternalWhModPtr, hModule, + &options, findData), + NULL); +} + +/** + * @brief Deprecated, available for backwards compatibility. + */ +inline HANDLE Wh_FindFirstSymbol(HMODULE hModule, + decltype(nullptr), + WH_FIND_SYMBOL* findData) { + return WH_INTERNAL_OR(InternalWh_FindFirstSymbol3(InternalWhModPtr, hModule, + nullptr, findData), NULL); } /** * @brief Returns information about the next symbol for the specified search * handle, continuing an enumeration from a previous call to - * Wh_FindFirstSymbol. + * `Wh_FindFirstSymbol`. * @param symSearch A search handle returned by a previous call to - * Wh_FindFirstSymbol. + * `Wh_FindFirstSymbol`. * @param findData A pointer to a structure to receive the symbol information. * @return A boolean value indicating whether symbol information was retrieved. * If no more symbols are found or in case of an error, the return value is - * FALSE. + * `FALSE`. */ inline BOOL Wh_FindNextSymbol(HANDLE symSearch, WH_FIND_SYMBOL* findData) { return WH_INTERNAL_OR( @@ -271,8 +304,8 @@ inline BOOL Wh_FindNextSymbol(HANDLE symSearch, WH_FIND_SYMBOL* findData) { } /** - * @brief Closes a file search handle opened by Wh_FindFirstSymbol. - * @param symSearch The search handle. If symSearch is NULL, the function does + * @brief Closes a file search handle opened by `Wh_FindFirstSymbol`. + * @param symSearch The search handle. If symSearch is `NULL`, the function does * nothing. * @return None. */ diff --git a/src/windhawk/engine/mods_api_internal.h b/src/windhawk/engine/mods_api_internal.h index cbec4d6..563a2fc 100644 --- a/src/windhawk/engine/mods_api_internal.h +++ b/src/windhawk/engine/mods_api_internal.h @@ -2,6 +2,7 @@ #include +typedef struct tagWH_FIND_SYMBOL_OPTIONS WH_FIND_SYMBOL_OPTIONS; typedef struct tagWH_FIND_SYMBOL WH_FIND_SYMBOL; typedef struct tagWH_DISASM_RESULT WH_DISASM_RESULT; @@ -22,11 +23,11 @@ size_t InternalWh_GetStringValue(void* mod, BOOL InternalWh_SetStringValue(void* mod, PCWSTR valueName, PCWSTR value); size_t InternalWh_GetBinaryValue(void* mod, PCWSTR valueName, - BYTE* buffer, + void* buffer, size_t bufferSize); BOOL InternalWh_SetBinaryValue(void* mod, PCWSTR valueName, - const BYTE* buffer, + const void* buffer, size_t bufferSize); int InternalWh_GetIntSetting(void* mod, PCWSTR valueName, va_list args); @@ -40,9 +41,9 @@ BOOL InternalWh_SetFunctionHook(void* mod, BOOL InternalWh_RemoveFunctionHook(void* mod, void* targetFunction); BOOL InternalWh_ApplyHookOperations(void* mod); -HANDLE InternalWh_FindFirstSymbol2(void* mod, +HANDLE InternalWh_FindFirstSymbol3(void* mod, HMODULE hModule, - PCWSTR symbolServer, + const WH_FIND_SYMBOL_OPTIONS* options, WH_FIND_SYMBOL* findData); BOOL InternalWh_FindNextSymbol2(void* mod, HANDLE symSearch, diff --git a/src/windhawk/engine/new_process_injector.cpp b/src/windhawk/engine/new_process_injector.cpp index 8bf4a64..bf7da83 100644 --- a/src/windhawk/engine/new_process_injector.cpp +++ b/src/windhawk/engine/new_process_injector.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" +#include "critical_processes.h" #include "dll_inject.h" #include "functions.h" #include "logger.h" @@ -107,6 +108,14 @@ NewProcessInjector::NewProcessInjector(HANDLE hSessionManagerProcess) m_excludePattern = settings->GetString(L"Exclude").value_or(L""); m_threadAttachExemptPattern = settings->GetString(L"ThreadAttachExempt").value_or(L""); + + if (!settings->GetInt(L"InjectIntoCriticalProcesses").value_or(0)) { + if (!m_excludePattern.empty()) { + m_excludePattern += L"|"; + } + + m_excludePattern += kCriticalProcesses; + } } NewProcessInjector::~NewProcessInjector() { @@ -178,6 +187,7 @@ void NewProcessInjector::HandleCreatedProcess( try { bool threadAttachExempt; if (ShouldSkipNewProcess(lpProcessInformation->hProcess, + lpProcessInformation->dwProcessId, &threadAttachExempt)) { return; } @@ -205,20 +215,19 @@ void NewProcessInjector::HandleCreatedProcess( } bool NewProcessInjector::ShouldSkipNewProcess(HANDLE hProcess, + DWORD dwProcessId, bool* threadAttachExempt) { auto processImageName = wil::QueryFullProcessImageName(hProcess); - *threadAttachExempt = Functions::DoesPathMatchPattern( - processImageName, m_threadAttachExemptPattern); - - if (!Functions::DoesPathMatchPattern(processImageName, m_excludePattern)) { - return false; + if (Functions::DoesPathMatchPattern(processImageName, m_excludePattern) && + !Functions::DoesPathMatchPattern(processImageName, m_includePattern)) { + VERBOSE(L"Skipping excluded process %u", dwProcessId); + return true; } - if (Functions::DoesPathMatchPattern(processImageName, m_includePattern)) { - return false; - } + *threadAttachExempt = Functions::DoesPathMatchPattern( + processImageName, m_threadAttachExemptPattern); - return true; + return false; } diff --git a/src/windhawk/engine/new_process_injector.h b/src/windhawk/engine/new_process_injector.h index b07c22c..12bf5bd 100644 --- a/src/windhawk/engine/new_process_injector.h +++ b/src/windhawk/engine/new_process_injector.h @@ -40,7 +40,9 @@ class NewProcessInjector { LPPROCESS_INFORMATION lpProcessInformation, DWORD_PTR unknown); void HandleCreatedProcess(LPPROCESS_INFORMATION lpProcessInformation); - bool ShouldSkipNewProcess(HANDLE hProcess, bool* threadAttachExempt); + bool ShouldSkipNewProcess(HANDLE hProcess, + DWORD dwProcessId, + bool* threadAttachExempt); // Limited to a single instance at a time. static std::atomic m_pThis; diff --git a/src/windhawk/engine/symbol_enum.cpp b/src/windhawk/engine/symbol_enum.cpp index c2b2413..b7b9a6f 100644 --- a/src/windhawk/engine/symbol_enum.cpp +++ b/src/windhawk/engine/symbol_enum.cpp @@ -85,7 +85,9 @@ int PercentFromSymbolServerEvent(PCSTR msg) { return percent; } -BOOL SymbolServerCallback(UINT_PTR action, ULONG64 data, ULONG64 context) { +BOOL CALLBACK SymbolServerCallback(UINT_PTR action, + ULONG64 data, + ULONG64 context) { SymbolEnum::Callbacks* callbacks = g_symbolServerCallbacks; if (!callbacks) { return FALSE; @@ -169,6 +171,7 @@ HMODULE WINAPI MsdiaLoadLibraryExWHook(LPCWSTR lpLibFileName, SymbolEnum::SymbolEnum(HMODULE moduleBase, PCWSTR symbolServer, + UndecorateMode undecorateMode, Callbacks callbacks) { if (!moduleBase) { moduleBase = GetModuleHandle(nullptr); @@ -176,15 +179,16 @@ SymbolEnum::SymbolEnum(HMODULE moduleBase, std::wstring modulePath = wil::GetModuleFileName(moduleBase); - SymbolEnum(modulePath.c_str(), moduleBase, symbolServer, + SymbolEnum(modulePath.c_str(), moduleBase, symbolServer, undecorateMode, std::move(callbacks)); } SymbolEnum::SymbolEnum(PCWSTR modulePath, HMODULE moduleBase, PCWSTR symbolServer, + UndecorateMode undecorateMode, Callbacks callbacks) - : m_moduleBase(moduleBase) { + : m_moduleBase(moduleBase), m_undecorateMode(undecorateMode) { wil::com_ptr diaSource = LoadMsdia(); std::wstring symSearchPath = GetSymbolsSearchPath(symbolServer); @@ -206,8 +210,7 @@ SymbolEnum::SymbolEnum(PCWSTR modulePath, diaGlobal->findChildren(SymTagNull, nullptr, nsNone, &m_diaSymbols)); } -std::optional SymbolEnum::GetNextSymbol( - bool compatDemangling) { +std::optional SymbolEnum::GetNextSymbol() { while (true) { wil::com_ptr diaSymbol; ULONG count = 0; @@ -226,18 +229,21 @@ std::optional SymbolEnum::GetNextSymbol( } // Temporary compatibility code. - if (compatDemangling) { + if (m_undecorateMode == UndecorateMode::OldVersionCompatible) { // get_undecoratedName uses 0x20800 as flags: // * UNDNAME_32_BIT_DECODE (0x800) // * UNDNAME_NO_PTR64 (0x20000) // For some reason, the old msdia version still included ptr64 in // the output. For compatibility, use get_undecoratedNameEx and // don't pass this flag. - const DWORD kUndname32BitDecode = 0x800; + constexpr DWORD kUndname32BitDecode = 0x800; hr = diaSymbol->get_undecoratedNameEx(kUndname32BitDecode, &m_currentSymbolName); - } else { + } else if (m_undecorateMode == UndecorateMode::Default) { hr = diaSymbol->get_undecoratedName(&m_currentSymbolName); + } else { + m_currentSymbolName.reset(); + hr = S_OK; } THROW_IF_FAILED(hr); if (hr == S_FALSE) { diff --git a/src/windhawk/engine/symbol_enum.h b/src/windhawk/engine/symbol_enum.h index 9fe16ff..8147dd5 100644 --- a/src/windhawk/engine/symbol_enum.h +++ b/src/windhawk/engine/symbol_enum.h @@ -2,6 +2,12 @@ class SymbolEnum { public: + enum class UndecorateMode { + Default = 0, + OldVersionCompatible, + None, + }; + struct Callbacks { std::function queryCancel; std::function notifyProgress; @@ -9,10 +15,12 @@ class SymbolEnum { SymbolEnum(HMODULE moduleBase, PCWSTR symbolServer, + UndecorateMode undecorateMode, Callbacks callbacks = {}); SymbolEnum(PCWSTR modulePath, HMODULE moduleBase, PCWSTR symbolServer, + UndecorateMode undecorateMode, Callbacks callbacks = {}); struct Symbol { @@ -21,12 +29,13 @@ class SymbolEnum { PCWSTR nameDecorated; }; - std::optional GetNextSymbol(bool compatDemangling); + std::optional GetNextSymbol(); private: wil::com_ptr LoadMsdia(); HMODULE m_moduleBase; + UndecorateMode m_undecorateMode; wil::unique_hmodule m_msdiaModule; wil::com_ptr m_diaSymbols; wil::unique_bstr m_currentSymbolName; diff --git a/src/windhawk/shared/libraries/wil/Tracelogging.h b/src/windhawk/shared/libraries/wil/Tracelogging.h index 02ca990..a1bde69 100644 --- a/src/windhawk/shared/libraries/wil/Tracelogging.h +++ b/src/windhawk/shared/libraries/wil/Tracelogging.h @@ -33,7 +33,6 @@ #ifndef TRACELOGGING_SUPPRESS_NEW #include #endif -#include #pragma warning(push) #pragma warning(disable: 26135) // Missing locking annotation, Caller failing to hold lock @@ -177,28 +176,60 @@ namespace wil public: void __cdecl cleanup() WI_NOEXCEPT { - if (wil::init_once_initialized(m_initOnce)) + void* pVoid; + BOOL pending; + + // If object is being constructed on another thread, wait until construction completes. + // Need a memory barrier here (see get() and ~Completer below) so use the result that we + // get from InitOnceBeginInitialize(..., &pVoid, ...) + if (::InitOnceBeginInitialize(&m_initOnce, INIT_ONCE_CHECK_ONLY, &pending, &pVoid) && !pending) { - reinterpret_cast(m_storage)->~T(); + static_cast(pVoid)->~T(); } } T* get(void(__cdecl *cleanupFunc)(void)) WI_NOEXCEPT { - wil::init_once_failfast(m_initOnce, [=]() -> HRESULT - { - ::new (m_storage) T(); - atexit(cleanupFunc); - reinterpret_cast(m_storage)->Create(); - return S_OK; - }); + void* pVoid{}; + BOOL pending; + if (::InitOnceBeginInitialize(&m_initOnce, 0, &pending, &pVoid) && pending) + { + // Don't do anything non-trivial from DllMain, fail fast. + // Some 3rd party code in IE calls shell functions this way, so we can only enforce + // this in DEBUG. +#ifdef DEBUG + FAIL_FAST_IMMEDIATE_IF_IN_LOADER_CALLOUT(); +#endif - return reinterpret_cast(m_storage); + Completer completer(this); + pVoid = &m_storage; + ::new(pVoid)T(); + atexit(cleanupFunc); // ignore failure (that's what the C runtime does, too) + completer.Succeed(); + } + return static_cast(pVoid); } private: - INIT_ONCE m_initOnce = INIT_ONCE_STATIC_INIT; + INIT_ONCE m_initOnce; alignas(T) BYTE m_storage[sizeof(T)]; + struct Completer + { + static_lazy *m_pSelf; + DWORD m_flags; + + explicit Completer(static_lazy *pSelf) WI_NOEXCEPT : m_pSelf(pSelf), m_flags(INIT_ONCE_INIT_FAILED) { } + void Succeed() WI_NOEXCEPT { m_flags = 0; } + + ~Completer() WI_NOEXCEPT + { + if (m_flags == 0) + { + reinterpret_cast(&m_pSelf->m_storage)->Create(); + } + ::InitOnceComplete(&m_pSelf->m_initOnce, m_flags, &m_pSelf->m_storage); + } + }; }; // This class serves as a simple RAII wrapper around CallContextInfo. It presumes that @@ -208,18 +239,18 @@ namespace wil class StoredCallContextInfo : public wil::CallContextInfo { public: - StoredCallContextInfo() + StoredCallContextInfo() WI_NOEXCEPT { ::ZeroMemory(this, sizeof(*this)); } - StoredCallContextInfo(StoredCallContextInfo &&other) : + StoredCallContextInfo(StoredCallContextInfo &&other) WI_NOEXCEPT : StoredCallContextInfo() { operator=(wistd::move(other)); } - StoredCallContextInfo& operator=(StoredCallContextInfo &&other) + StoredCallContextInfo& operator=(StoredCallContextInfo &&other) WI_NOEXCEPT { contextId = other.contextId; contextName = other.contextName; @@ -231,7 +262,7 @@ namespace wil return *this; } - StoredCallContextInfo(StoredCallContextInfo const &other) : + StoredCallContextInfo(StoredCallContextInfo const &other) WI_NOEXCEPT : m_ownsMessage(false) { contextId = other.contextId; @@ -246,7 +277,7 @@ namespace wil } } - StoredCallContextInfo(_In_opt_ PCSTR staticContextName) : + StoredCallContextInfo(_In_opt_ PCSTR staticContextName) WI_NOEXCEPT : m_ownsMessage(false) { contextId = 0; @@ -254,7 +285,7 @@ namespace wil contextMessage = nullptr; } - StoredCallContextInfo(PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) : + StoredCallContextInfo(PCSTR staticContextName, _Printf_format_string_ PCSTR formatString, va_list argList) WI_NOEXCEPT : StoredCallContextInfo(staticContextName) { SetMessage(formatString, argList); @@ -550,9 +581,9 @@ namespace wil Initialize(); } - TraceLoggingHProvider m_providerHandle; - bool m_ownsProviderHandle; - ErrorReportingType m_errorReportingType; + TraceLoggingHProvider m_providerHandle{}; + bool m_ownsProviderHandle{}; + ErrorReportingType m_errorReportingType{}; }; template< @@ -1358,10 +1389,10 @@ namespace wil #define __IMPLEMENT_CALLCONTEXT_CLASS(ActivityClassName) \ protected: \ - ActivityClassName(_In_ void **, PCSTR contextName, _In_opt_ _Printf_format_string_ PCSTR formatString, _In_opt_ va_list argList) : \ + ActivityClassName(_In_opt_ void **, PCSTR contextName, _In_opt_ _Printf_format_string_ PCSTR formatString, _In_opt_ va_list argList) : \ ActivityBase(contextName) \ { GetCallContext()->SetMessage(formatString, argList); StartActivity(); } \ - ActivityClassName(_In_ void **, PCSTR contextName) : \ + ActivityClassName(_In_opt_ void **, PCSTR contextName) : \ ActivityBase(contextName) \ { StartActivity(); } \ public: \ @@ -1377,236 +1408,479 @@ namespace wil }; #ifdef _GENERIC_PARTB_FIELDS_ENABLED -#define _TLGWRITE_GENERIC_PARTB_FIELDS _GENERIC_PARTB_FIELDS_ENABLED, + #define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \ + void EventId() \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, _GENERIC_PARTB_FIELDS_ENABLED, __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \ + void EventId() \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, __VA_ARGS__); \ + } #endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT(EventId, ...) \ - void EventId() \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, _TLGWRITE_GENERIC_PARTB_FIELDS __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \ + void EventId(PCSTR correlationVector) \ + { __WI_TraceLoggingWriteTagged(*this, #EventId, _GENERIC_PARTB_FIELDS_ENABLED, TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \ + void EventId(PCSTR correlationVector) \ + { __WI_TraceLoggingWriteTagged(*this, #EventId, TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_CV(EventId, ...) \ - void EventId(PCSTR correlationVector) \ - { __WI_TraceLoggingWriteTagged(*this, #EventId, _TLGWRITE_GENERIC_PARTB_FIELDS TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ + template void EventId(T1 &&varName1) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ + template void EventId(T1 &&varName1) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ - template void EventId(T1 &&varName1) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ + template void EventId(T1 &&varName1, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ + template void EventId(T1 &&varName1, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ - template void EventId(T1 &&varName1, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } - -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } - -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ - template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ - { \ - __WI_TraceLoggingWriteTagged(*this, #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ + { \ + __WI_TraceLoggingWriteTagged(*this, #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + __VA_ARGS__); \ + } +#endif #define DEFINE_TAGGED_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, __VA_ARGS__) #define DEFINE_TAGGED_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) DEFINE_TAGGED_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, __VA_ARGS__) @@ -1717,277 +1991,570 @@ namespace wil { Register(m_staticHandle.handle); } \ public: -#define DEFINE_TRACELOGGING_EVENT(EventId, ...) \ - static void EventId() { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT(EventId, ...) \ + static void EventId() { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT(EventId, ...) \ + static void EventId() { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \ - static void EventId(PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \ + static void EventId(PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_CV(EventId, ...) \ + static void EventId(PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ - template static void EventId(T1 &&varName1) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ + template static void EventId(T1 &&varName1) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, VarType1, varName1, ...) \ + template static void EventId(T1 &&varName1) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ - template static void EventId(T1 &&varName1, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ + template static void EventId(T1 &&varName1, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM1_CV(EventId, VarType1, varName1, ...) \ + template static void EventId(T1 &&varName1, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM2(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM2_CV(EventId, VarType1, varName1, VarType2, varName2, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM3(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM3_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM4(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM4_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM5(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM5_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM6(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM6_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM7(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM7_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM8(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM8_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM9(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, PCSTR correlationVector) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM9_CV(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, PCSTR correlationVector) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + TraceLoggingString(correlationVector, "__TlgCV__"), __VA_ARGS__); \ + } +#endif -#define DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, ...) \ - template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, T10 &&varName10) \ - { \ - TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ - TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ - TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ - TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ - TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ - TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ - TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ - TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ - TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ - TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ - TraceLoggingValue(static_cast(wistd::forward(varName10)), _wiltlg_STRINGIZE(varName10)), \ - _TLGWRITE_GENERIC_PARTB_FIELDS \ - __VA_ARGS__); \ - } +#ifdef _GENERIC_PARTB_FIELDS_ENABLED + #define DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, T10 &&varName10) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + TraceLoggingValue(static_cast(wistd::forward(varName10)), _wiltlg_STRINGIZE(varName10)), \ + _GENERIC_PARTB_FIELDS_ENABLED, \ + __VA_ARGS__); \ + } +#else + #define DEFINE_TRACELOGGING_EVENT_PARAM10(EventId, VarType1, varName1, VarType2, varName2, VarType3, varName3, VarType4, varName4, VarType5, varName5, VarType6, varName6, VarType7, varName7, VarType8, varName8, VarType9, varName9, VarType10, varName10, ...) \ + template static void EventId(T1 &&varName1, T2 &&varName2, T3 &&varName3, T4 &&varName4, T5 &&varName5, T6 &&varName6, T7 &&varName7, T8 &&varName8, T9 &&varName9, T10 &&varName10) \ + { \ + TraceLoggingWrite(TraceLoggingType::Provider(), #EventId, \ + TraceLoggingValue(static_cast(wistd::forward(varName1)), _wiltlg_STRINGIZE(varName1)), \ + TraceLoggingValue(static_cast(wistd::forward(varName2)), _wiltlg_STRINGIZE(varName2)), \ + TraceLoggingValue(static_cast(wistd::forward(varName3)), _wiltlg_STRINGIZE(varName3)), \ + TraceLoggingValue(static_cast(wistd::forward(varName4)), _wiltlg_STRINGIZE(varName4)), \ + TraceLoggingValue(static_cast(wistd::forward(varName5)), _wiltlg_STRINGIZE(varName5)), \ + TraceLoggingValue(static_cast(wistd::forward(varName6)), _wiltlg_STRINGIZE(varName6)), \ + TraceLoggingValue(static_cast(wistd::forward(varName7)), _wiltlg_STRINGIZE(varName7)), \ + TraceLoggingValue(static_cast(wistd::forward(varName8)), _wiltlg_STRINGIZE(varName8)), \ + TraceLoggingValue(static_cast(wistd::forward(varName9)), _wiltlg_STRINGIZE(varName9)), \ + TraceLoggingValue(static_cast(wistd::forward(varName10)), _wiltlg_STRINGIZE(varName10)), \ + __VA_ARGS__); \ + } +#endif #define DEFINE_TRACELOGGING_EVENT_UINT32(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, UINT32, varName, __VA_ARGS__) #define DEFINE_TRACELOGGING_EVENT_BOOL(EventId, varName, ...) DEFINE_TRACELOGGING_EVENT_PARAM1(EventId, bool, varName, __VA_ARGS__) @@ -2797,7 +3364,6 @@ WIL_WARN_DEPRECATED_1612_PRAGMA("IMPLEMENT_TRACELOGGING_CLASS") { \ Stop(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)); \ } \ - ActivityClassName(const ActivityClassName &) = default; \ ActivityClassName(ActivityClassName &&) = default; \ WI_NODISCARD TraceLoggingHProvider Provider() const \ { \ @@ -3282,8 +3848,8 @@ namespace wil if (m_fireEventThreadPoolTimer && !ProcessShutdownInProgress()) { // Note this will override any pending scheduled callback - FILETIME dueTime; - *reinterpret_cast(&dueTime) = -static_cast(m_fireEventDelay * 10000); + FILETIME dueTime{}; + *reinterpret_cast(&dueTime) = -static_cast(m_fireEventDelay) * 10000; SetThreadpoolTimer(m_fireEventThreadPoolTimer.get(), &dueTime, 0, 0); } } @@ -3292,7 +3858,7 @@ namespace wil wil::unique_threadpool_timer m_fireEventThreadPoolTimer; // The timer used to determine when to fire the next telemetry event (when it's fired based on a timer). - UINT m_fireEventDelay; + UINT m_fireEventDelay{}; DWORD const c_fireEventDelayLimit = 20 * 60 * 1000; // 20 minutes }; } // namespace details diff --git a/src/windhawk/shared/libraries/wil/_version.txt b/src/windhawk/shared/libraries/wil/_version.txt index d52ffed..267f58e 100644 --- a/src/windhawk/shared/libraries/wil/_version.txt +++ b/src/windhawk/shared/libraries/wil/_version.txt @@ -1 +1 @@ -https://github.com/microsoft/wil/tree/70155eb41d25b3d7b7504abb25487e2910d6a785 +https://github.com/microsoft/wil/tree/5e9be7b2d2fe3834a7107f430f7d4c0631f69833 diff --git a/src/windhawk/shared/libraries/wil/com.h b/src/windhawk/shared/libraries/wil/com.h index 693b3b6..3ee0ea0 100644 --- a/src/windhawk/shared/libraries/wil/com.h +++ b/src/windhawk/shared/libraries/wil/com.h @@ -2275,7 +2275,7 @@ namespace wil */ inline HRESULT stream_seek_nothrow(_In_ IStream* stream, long long offset, unsigned long from, _Out_opt_ unsigned long long* value = nullptr) { - LARGE_INTEGER amount; + LARGE_INTEGER amount{}; ULARGE_INTEGER landed{}; amount.QuadPart = offset; RETURN_IF_FAILED(stream->Seek(amount, from, value ? &landed : nullptr)); @@ -2360,8 +2360,8 @@ namespace wil */ inline HRESULT stream_copy_bytes_nothrow(_In_ IStream* source, _In_ IStream* target, unsigned long long amount, _Out_opt_ unsigned long long* pCopied = nullptr) { - ULARGE_INTEGER toCopy; - ULARGE_INTEGER copied; + ULARGE_INTEGER toCopy{}; + ULARGE_INTEGER copied{}; toCopy.QuadPart = amount; RETURN_IF_FAILED(source->CopyTo(target, toCopy, nullptr, &copied)); assign_to_opt_param(pCopied, copied.QuadPart); diff --git a/src/windhawk/shared/libraries/wil/coroutine.h b/src/windhawk/shared/libraries/wil/coroutine.h new file mode 100644 index 0000000..c115983 --- /dev/null +++ b/src/windhawk/shared/libraries/wil/coroutine.h @@ -0,0 +1,810 @@ +#ifndef __WIL_COROUTINE_INCLUDED +#define __WIL_COROUTINE_INCLUDED + + /* + * A wil::task / com_task is a coroutine with the following characteristics: + * + * - T must be a copyable object, movable object, reference, or void. + * - The coroutine may be awaited at most once. The second await will crash. + * - The coroutine may be abandoned (allowed to destruct without co_await), + * in which case unobserved exceptions are fatal. + * - By default, wil::task resumes on an arbitrary thread. + * - By default, wil::com_task resumes in the same COM apartment. + * - task.resume_any_thread() allows resumption on any thread. + * - task.resume_same_apartment() forces resumption in the same COM apartment. + * + * The wil::task and wil::com_task are intended to supplement PPL and C++/WinRT, + * not to replace them. It provides coroutine implementations for scenarios that PPL + * and C++/WinRT do not support, but it does not support everything that PPL and + * C++/WinRT do. + * + * The implementation is optimized on the assumption that the coroutine is + * awaited only once, and that the coroutine is discarded after completion. + * To ensure proper usage, the task object is move-only, and + * co_await takes ownership of the task. See further discussion below. + * + * Comparison with PPL and C++/WinRT: + * + * | | PPL | C++/WinRT | wil::*task | + * |-----------------------------------------------------|-----------|-----------|---------------| + * | T can be non-constructible | No | Yes | Yes | + * | T can be void | Yes | Yes | Yes | + * | T can be reference | No | No | Yes | + * | T can be WinRT object | Yes | Yes | Yes | + * | T can be non-WinRT object | Yes | No | Yes | + * | T can be move-only | No | No | Yes | + * | Coroutine can be cancelled | Yes | Yes | No | + * | Coroutine can throw arbitrary exceptions | Yes | No | Yes | + * | Can co_await more than once | Yes | No | No | + * | Can have multiple clients waiting for completion | Yes | No | No | + * | co_await resumes in same COM context | Sometimes | Yes | You choose [1]| + * | Can force co_await to resume in same context | Yes | N/A | Yes [1] | + * | Can force co_await to resume in any thread | Yes | No | Yes | + * | Can change coroutine's resumption model | No | No | Yes | + * | Can wait synchronously | Yes | Yes | Yes [2] | + * | Can be consumed by non-C++ languages | No | Yes | No | + * | Implementation is small and efficient | No | Yes | Yes | + * | Can abandon coroutine (fail to co_await) | Yes | Yes | Yes | + * | Exception in abandoned coroutine | Crash | Ignored | Crash | + * | Coroutine starts automatically | Yes | Yes | Yes | + * | Coroutine starts synchronously | No | Yes | Yes | + * | Integrates with C++/WinRT coroutine callouts | No | Yes | No | + * + * [1] Resumption in the same COM apartment requires that you include COM headers. + * [2] Synchronous waiting requires that you include (usually via ). + * + * You can include the COM headers and/or synchapi.h headers, and then + * re-include this header file to activate the features dependent upon + * those headers. + * + * Examples: + * + * Implement a coroutine that returns a move-only non-WinRT type + * and which resumes on an arbitrary thread. + * + * wil::task GetNameAsync() + * { + * co_await resume_background(); // do work on BG thread + * wil::unique_cotaskmem_string name; + * THROW_IF_FAILED(GetNameSlow(&name)); + * co_return name; // awaiter will resume on arbitrary thread + * } + * + * Consumers: + * + * winrt::IAsyncAction UpdateNameAsync() + * { + * // wil::task resumes on an arbitrary thread. + * auto name = co_await GetNameAsync(); + * // could be on any thread now + * co_await SendNameAsync(name.get()); + * } + * + * winrt::IAsyncAction UpdateNameAsync() + * { + * // override default behavior of wil::task and + * // force it to resume in the same COM apartment. + * auto name = co_await GetNameAsync().resume_same_apartment(); + * // so we are still on the UI thread + * NameElement().Text(winrt::hstring(name.get())); + * } + * + * Conversely, a coroutine that returns a + * wil::com_task defaults to resuming in the same + * COM apartment, but you can allow it to resume on any thread + * by doing co_await GetNameAsync().resume_any_thread(). + * + * There is no harm in doing resume_same_apartment() / resume_any_thread() for a + * task that already defaults to resuming in that manner. In fact, awaiting the + * task directly is just a shorthand for awaiting the corresponding + * resume_whatever() method. + * + * Alternatively, you can just convert between wil::task and wil::com_task + * to change the default resumption context. + * + * co_await wil::com_task(GetNameAsync()); // now defaults to resume_same_apartment(); + * + * You can store the task in a variable, but since it is a move-only + * object, you will have to use std::move in order to transfer ownership out of + * an lvalue. + * + * winrt::IAsyncAction SomethingAsync() + * { + * wil::com_task task; + * switch (source) + * { + * // Some of these might return wil::task, + * // but assigning to a wil::com_task will make + * // the task resume in the same COM apartment. + * case widget: task = GetValueFromWidgetAsync(); break; + * case gadget: task = GetValueFromGadgetAsync(); break; + * case doodad: task = GetValueFromDoodadAsync(); break; + * default: FAIL_FAST(); // unknown source + * } + * auto value = co_await std::move(task); // **** need std::move + * DoSomethingWith(value); + * } + * + * You can wait synchronously by calling get(). The usual caveats + * about synchronous waits on STA threads apply. + * + * auto value = GetValueFromWidgetAsync().get(); + * + * auto task = GetValueFromWidgetAsync(); + * auto value = std::move(task).get(); // **** need std::move + */ + +// Detect which version of the coroutine standard we have. +#if defined(_RESUMABLE_FUNCTIONS_SUPPORTED) +#include +#define __WI_COROUTINE_NAMESPACE ::std::experimental +#elif defined(__cpp_lib_coroutine) +#include +#define __WI_COROUTINE_NAMESPACE ::std +#else +#error You must compile with C++20 coroutine support to use coroutine.h. +#endif +#include +#include +#include +#include +#include + +namespace wil +{ + // There are three general categories of T that you can + // use with a task. We give them these names: + // + // T = void ("void category") + // T = some kind of reference ("reference category") + // T = non-void non-reference ("object category") + // + // Take care that the implementation supports all three categories. + // + // There is a sub-category of object category for move-only types. + // We designed our task to be co_awaitable only once, so that + // it can contain a move-only type. Any transfer of T as an + // object category must be done as an rvalue reference. + template + struct task; + + template + struct com_task; +} + +namespace wil::details::coro +{ + template + struct task_promise; + + // Unions may not contain references, C++/CX types, or void. + // To work around that, we put everything inside a result_wrapper + // struct, and put the struct in the union. For void, + // we create a special empty structure. + // + // get_value returns rvalue reference to T for object + // category, or just T itself for void and reference + // category. + // + // We take advantage of the reference collapsing rules + // so that T&& = T if T is reference category. + + template + struct result_wrapper + { + T value; + T get_value() { return wistd::forward(value); } + }; + + template<> + struct result_wrapper + { + void get_value() { } + }; + + + // The result_holder is basically a + // std::variant + // but with these extra quirks: + // * The only valid transition is monotype -> something-else. + // Consequently, it does not have valueless_by_exception. + + template + struct result_holder + { + // The content of the result_holder + // depends on the result_status: + // + // empty: No active member. + // value: Active member is wrap. + // error: Active member is error. + enum class result_status { empty, value, error }; + + result_status status{ result_status::empty }; + union variant + { + variant() {} + ~variant() {} + result_wrapper wrap; + std::exception_ptr error; + } result; + + // emplace_value will be called with + // + // * no parameters (void category) + // * The reference type T (reference category) + // * Some kind of reference to T (object category) + // + // Set the status after constructing the object. + // That way, if object construction throws an exception, + // the holder remains empty. + template + void emplace_value(Args&&... args) + { + WI_ASSERT(status == result_status::empty); + new (wistd::addressof(result.wrap)) result_wrapper{ wistd::forward(args)... }; + status = result_status::value; + } + + void unhandled_exception() noexcept + { + WI_ASSERT(status == result_status::empty); + new (wistd::addressof(result.error)) std::exception_ptr(std::current_exception()); + status = result_status::error; + } + + T get_value() + { + if (status == result_status::value) + { + return result.wrap.get_value(); + } + WI_ASSERT(status == result_status::error); + std::rethrow_exception(wistd::exchange(result.error, {})); + } + + result_holder() = default; + result_holder(result_holder const&) = delete; + void operator=(result_holder const&) = delete; + + ~result_holder() noexcept(false) + { + switch (status) + { + case result_status::value: + result.wrap.~result_wrapper(); + break; + case result_status::error: + // Rethrow unobserved exception. Delete this line to + // discard unobserved exceptions. + if (result.error) std::rethrow_exception(result.error); + result.error.~exception_ptr(); + } + } + }; + + // Most of the work is done in the promise_base, + // It is a CRTP-like base class for task_promise and + // task_promise because the language forbids + // a single promise from containing both return_value and + // return_void methods (even if one of them is deleted by SFINAE). + template + struct promise_base + { + // The coroutine state remains alive as long as the coroutine is + // still running (hasn't reached final_suspend) or the associated + // task has not yet abandoned the coroutine (either finished awaiting + // or destructed without awaiting). + // + // This saves an allocation, but does mean that the local + // frame of the coroutine will remain allocated (with the + // coroutine's imbound parameters still live) until all + // references are destroyed. To force the promise_base to be + // destroyed after co_await, we make the promise_base a + // move-only object and require co_await to be given an rvalue reference. + + // Special values for m_waiting. + static void* running_ptr() { return nullptr; } + static void* completed_ptr() { return reinterpret_cast(1); } + static void* abandoned_ptr() { return reinterpret_cast(2); } + + // The awaiting coroutine is resumed by calling the + // m_resumer with the m_waiting. If the resumer is null, + // then the m_waiting is assumed to be the address of a + // coroutine_handle<>, which is resumed synchronously. + // Externalizing the resumer allows unused awaiters to be + // removed by the linker and removes a hard dependency on COM. + // Using nullptr to represent the default resumer avoids a + // CFG check. + + void(__stdcall* m_resumer)(void*); + std::atomic m_waiting{ running_ptr() }; + result_holder m_holder; + + // Make it easier to access our CRTP derived class. + using Promise = task_promise; + auto as_promise() noexcept + { + return static_cast(this); + } + + // Make it easier to access the coroutine handle. + auto as_handle() noexcept + { + return __WI_COROUTINE_NAMESPACE::coroutine_handle::from_promise(*as_promise()); + } + + auto get_return_object() noexcept + { + // let the compiler construct the task / com_task from the promise. + return as_promise(); + } + + void destroy() + { + as_handle().destroy(); + } + + // The client lost interest in the coroutine, either because they are discarding + // the result without awaiting (risky!), or because they have finished awaiting. + // Discarding the result without awaiting is risky because any exception in the coroutine + // will be unobserved and result in a crash. If you want to disallow it, then + // raise an exception if waiting == running_ptr. + void abandon() + { + auto waiting = m_waiting.exchange(abandoned_ptr(), std::memory_order_acq_rel); + if (waiting != running_ptr()) destroy(); + } + + __WI_COROUTINE_NAMESPACE::suspend_never initial_suspend() noexcept + { + return {}; + } + + template + void emplace_value(Args&&... args) + { + m_holder.emplace_value(wistd::forward(args)...); + } + + void unhandled_exception() noexcept + { + m_holder.unhandled_exception(); + } + + void resume_waiting_coroutine(void* waiting) const + { + if (m_resumer) + { + m_resumer(waiting); + } + else + { + __WI_COROUTINE_NAMESPACE::coroutine_handle<>::from_address(waiting).resume(); + } + } + + auto final_suspend() noexcept + { + struct awaiter : __WI_COROUTINE_NAMESPACE::suspend_always + { + promise_base& self; + void await_suspend(__WI_COROUTINE_NAMESPACE::coroutine_handle<>) const noexcept + { + // Need acquire so we can read from m_resumer. + // Need release so that the results are published in the case that nobody + // is awaiting right now, so that the eventual awaiter (possibly on another thread) + // can read the results. + auto waiting = self.m_waiting.exchange(completed_ptr(), std::memory_order_acq_rel); + if (waiting == abandoned_ptr()) + { + self.destroy(); + } + else if (waiting != running_ptr()) + { + WI_ASSERT(waiting != completed_ptr()); + self.resume_waiting_coroutine(waiting); + } + }; + }; + return awaiter{ {}, *this }; + } + + // The remaining methods are used by the awaiters. + bool client_await_ready() + { + // Need acquire in case the coroutine has already completed, + // so we can read the results. This matches the release in + // the final_suspend's await_suspend. + auto waiting = m_waiting.load(std::memory_order_acquire); + WI_ASSERT((waiting == running_ptr()) || (waiting == completed_ptr())); + return waiting != running_ptr(); + } + + auto client_await_suspend(void* waiting, void(__stdcall* resumer)(void*)) + { + // "waiting" needs to be a pointer to an object. We reserve the first 16 + // pseudo-pointers as sentinels. + WI_ASSERT(reinterpret_cast(waiting) > 16); + + m_resumer = resumer; + + // Acquire to ensure that we can read the results of the return value, if the coroutine is completed. + // Release to ensure that our resumption state is published, if the coroutine is not completed. + auto previous = m_waiting.exchange(waiting, std::memory_order_acq_rel); + + // Suspend if the coroutine is still running. + // Otherwise, the coroutine is completed: Nobody will resume us, so we will have to resume ourselves. + WI_ASSERT((previous == running_ptr()) || (previous == completed_ptr())); + return previous == running_ptr(); + } + + T client_await_resume() + { + return m_holder.get_value(); + } + }; + + template + struct task_promise : promise_base + { + template + void return_value(U&& value) + { + this->emplace_value(wistd::forward(value)); + } + + template + wistd::enable_if_t, Dummy> + return_value(T const& value) + { + this->emplace_value(value); + } + }; + + template<> + struct task_promise : promise_base + { + void return_void() + { + this->emplace_value(); + } + }; + + template + struct promise_deleter + { + void operator()(promise_base* promise) const noexcept + { + promise->abandon(); + } + }; + + template + using promise_ptr = wistd::unique_ptr, promise_deleter>; + + template + struct agile_awaiter + { + agile_awaiter(promise_ptr&& initial) : promise(wistd::move(initial)) { } + + promise_ptr promise; + + bool await_ready() + { + return promise->client_await_ready(); + } + + auto await_suspend(__WI_COROUTINE_NAMESPACE::coroutine_handle<> handle) + { + // Use the default resumer. + return promise->client_await_suspend(handle.address(), nullptr); + } + + T await_resume() + { + return promise->client_await_resume(); + } + }; + + template + struct task_base + { + auto resume_any_thread() && noexcept + { + return agile_awaiter{ wistd::move(promise) }; + } + + // You must #include before to enable apartment-aware awaiting. + auto resume_same_apartment() && noexcept; + + // Compiler error message metaprogramming: Tell people that they + // need to use std::move() if they try to co_await an lvalue. + struct cannot_await_lvalue_use_std_move { void await_ready() {} }; + cannot_await_lvalue_use_std_move operator co_await() & = delete; + + // You must #include (usually via ) to enable synchronous waiting. + decltype(auto) get() &&; + + protected: + task_base(task_promise* initial = nullptr) noexcept : promise(initial) {} + + template + D& assign(D* self, task_base&& other) noexcept + { + static_cast(*this) = wistd::move(other); + return *self; + } + + private: + promise_ptr promise; + + static void __stdcall wake_by_address(void* completed); + }; +} + +namespace wil +{ + // Must write out both classes separately + // Cannot use deduction guides with alias template type prior to C++20. + template + struct task : details::coro::task_base + { + using base = details::coro::task_base; + // Constructing from task_promise* cannot be explicit because get_return_object relies on implicit conversion. + task(details::coro::task_promise* initial = nullptr) noexcept : base(initial) {} + explicit task(base&& other) noexcept : base(wistd::move(other)) {} + task& operator=(base&& other) noexcept + { + return base::assign(this, wistd::move(other)); + } + + using base::operator co_await; + + auto operator co_await() && noexcept + { + return wistd::move(*this).resume_any_thread(); + } + }; + + template + struct com_task : details::coro::task_base + { + using base = details::coro::task_base; + // Constructing from task_promise* cannot be explicit because get_return_object relies on implicit conversion. + com_task(details::coro::task_promise* initial = nullptr) noexcept : base(initial) {} + explicit com_task(base&& other) noexcept : base(wistd::move(other)) {} + com_task& operator=(base&& other) noexcept + { + return base::assign(this, wistd::move(other)); + } + + using base::operator co_await; + + auto operator co_await() && noexcept + { + // You must #include before to enable non-agile awaiting. + return wistd::move(*this).resume_same_apartment(); + } + }; + + template + task(com_task&&)->task; + template + com_task(task&&)->com_task; +} + +template +struct __WI_COROUTINE_NAMESPACE::coroutine_traits, Args...> +{ + using promise_type = wil::details::coro::task_promise; +}; + +template +struct __WI_COROUTINE_NAMESPACE::coroutine_traits, Args...> +{ + using promise_type = wil::details::coro::task_promise; +}; + +#endif // __WIL_COROUTINE_INCLUDED + +// Can re-include this header after including synchapi.h (usually via windows.h) to enable synchronous wait. +#if defined(_SYNCHAPI_H_) && !defined(__WIL_COROUTINE_SYNCHRONOUS_GET_INCLUDED) +#define __WIL_COROUTINE_SYNCHRONOUS_GET_INCLUDED + +namespace wil::details::coro +{ + template + decltype(auto) task_base::get() && + { + if (!promise->client_await_ready()) + { + bool completed = false; + if (promise->client_await_suspend(&completed, wake_by_address)) + { + bool pending = false; + while (!completed) + { + WaitOnAddress(&completed, &pending, sizeof(pending), INFINITE); + } + } + } + return std::exchange(promise, {})->client_await_resume(); + } + + template + void __stdcall task_base::wake_by_address(void* completed) + { + *reinterpret_cast(completed) = true; + WakeByAddressSingle(completed); + } +} +#endif // __WIL_COROUTINE_SYNCHRONOUS_GET_INCLUDED + +// Can re-include this header after including COM header files to enable non-agile tasks. +#if defined(_COMBASEAPI_H_) && defined(_THREADPOOLAPISET_H_) && !defined(__WIL_COROUTINE_NON_AGILE_INCLUDED) +#define __WIL_COROUTINE_NON_AGILE_INCLUDED +#include +#include + +namespace wil::details::coro +{ + struct apartment_info + { + APTTYPE aptType; + APTTYPEQUALIFIER aptTypeQualifier; + + void load() + { + if (FAILED(CoGetApartmentType(&aptType, &aptTypeQualifier))) + { + // If COM is not initialized, then act as if we are running + // on the implicit MTA. + aptType = APTTYPE_MTA; + aptTypeQualifier = APTTYPEQUALIFIER_IMPLICIT_MTA; + } + } + }; + + // apartment_resumer resumes a coroutine in a captured apartment. + struct apartment_resumer + { + static auto as_self(void* p) + { + return reinterpret_cast(p); + } + + static bool is_sta() + { + apartment_info info; + info.load(); + switch (info.aptType) + { + case APTTYPE_STA: + case APTTYPE_MAINSTA: + return true; + case APTTYPE_NA: + return info.aptTypeQualifier == APTTYPEQUALIFIER_NA_ON_STA || + info.aptTypeQualifier == APTTYPEQUALIFIER_NA_ON_MAINSTA; + default: + return false; + } + } + + static wil::com_ptr current_context() + { + wil::com_ptr context; + // This will fail if COM is not initialized. Treat as implicit MTA. + // Do not use IID_PPV_ARGS to avoid ambiguity between ::IUnknown and winrt::IUnknown. + CoGetObjectContext(__uuidof(IContextCallback), reinterpret_cast(&context)); + return context; + } + + __WI_COROUTINE_NAMESPACE::coroutine_handle<> waiter; + wil::com_ptr context{ nullptr }; + apartment_info info; + HRESULT resume_result = S_OK; + + void capture_context(__WI_COROUTINE_NAMESPACE::coroutine_handle<> handle) + { + waiter = handle; + info.load(); + context = current_context(); + if (context == nullptr) + { + __debugbreak(); + } + } + + static void __stdcall resume_in_context(void* parameter) + { + auto self = as_self(parameter); + if (self->context == nullptr || self->context == current_context()) + { + self->context = nullptr; // removes the context cleanup from the resume path + self->waiter(); + } + else if (is_sta()) + { + submit_threadpool_callback(resume_context, self); + } + else + { + self->resume_context_sync(); + } + } + + static void submit_threadpool_callback(PTP_SIMPLE_CALLBACK callback, void* context) + { + THROW_IF_WIN32_BOOL_FALSE(TrySubmitThreadpoolCallback(callback, context, nullptr)); + } + + static void CALLBACK resume_context(PTP_CALLBACK_INSTANCE /*instance*/, void* parameter) + { + as_self(parameter)->resume_context_sync(); + } + + void resume_context_sync() + { + ComCallData data{}; + data.pUserDefined = this; + // The call to resume_apartment_callback will destruct the context. + // Capture into a local so we don't destruct it while it's in use. + // This also removes the context cleanup from the resume path. + auto local_context = wistd::move(context); + auto result = local_context->ContextCallback(resume_apartment_callback, &data, IID_ICallbackWithNoReentrancyToApplicationSTA, 5, nullptr); + if (FAILED(result)) + { + // Unable to resume on the correct apartment. + // Resume on the wrong apartment, but tell the coroutine why. + resume_result = result; + waiter(); + } + } + + static HRESULT CALLBACK resume_apartment_callback(ComCallData* data) noexcept + { + as_self(data->pUserDefined)->waiter(); + return S_OK; + } + + void check() + { + THROW_IF_FAILED(resume_result); + } + }; + + // The COM awaiter captures the COM context when the co_await begins. + // When the co_await completes, it uses that COM context to resume execution. + // This follows the same algorithm employed by C++/WinRT, which has features like + // avoiding stack buildup and proper handling of the neutral apartment. + // It does, however, introduce fail-fast code paths if thread pool tasks cannot + // be submitted. (Those fail-fasts could be removed by preallocating the tasks, + // but that means paying an up-front cost for something that may never end up used, + // as well as introducing extra cleanup code in the fast-path.) + template + struct com_awaiter : agile_awaiter + { + com_awaiter(promise_ptr&& initial) : agile_awaiter(wistd::move(initial)) { } + apartment_resumer resumer; + + auto await_suspend(__WI_COROUTINE_NAMESPACE::coroutine_handle<> handle) + { + resumer.capture_context(handle); + return this->promise->client_await_suspend(wistd::addressof(resumer), apartment_resumer::resume_in_context); + } + + decltype(auto) await_resume() + { + resumer.check(); + return agile_awaiter::await_resume(); + } + }; + + template + auto task_base::resume_same_apartment() && noexcept + { + return com_awaiter{ wistd::move(promise) }; + } +} +#endif // __WIL_COROUTINE_NON_AGILE_INCLUDED diff --git a/src/windhawk/shared/libraries/wil/cppwinrt.h b/src/windhawk/shared/libraries/wil/cppwinrt.h index 313a603..c69a851 100644 --- a/src/windhawk/shared/libraries/wil/cppwinrt.h +++ b/src/windhawk/shared/libraries/wil/cppwinrt.h @@ -403,6 +403,89 @@ namespace wil --winrt::get_module_lock(); } }; + + /** Implements a C++/WinRT class where some interfaces are conditionally supported. + ~~~~ + // Assume the existence of a class "Version2" which says whether + // the IMyThing2 interface should be supported. + struct Version2 { static bool IsEnabled(); }; + + // Declare implementation class which conditionally supports IMyThing2. + struct MyThing : wil::winrt_conditionally_implements, + Version2, IMyThing2> + { + // implementation goes here + }; + + ~~~~ + + If `Version2::IsEnabled()` returns `false`, then the `QueryInterface` + for `IMyThing2` will fail. + + Any interface not listed as conditional is assumed to be enabled unconditionally. + + You can add additional Version / Interface pairs to the template parameter list. + Interfaces may be conditionalized on at most one Version class. If you need a + complex conditional, create a new helper class. + + ~~~~ + // Helper class for testing two Versions. + struct Version2_or_greater { + static bool IsEnabled() { return Version2::IsEnabled() || Version3::IsEnabled(); } + }; + + // This implementation supports IMyThing2 if either Version2 or Version3 is enabled, + // and supports IMyThing3 only if Version3 is enabled. + struct MyThing : wil::winrt_conditionally_implements, + Version2_or_greater, IMyThing2, Version3, IMyThing3> + { + // implementation goes here + }; + ~~~~ + */ + template + struct winrt_conditionally_implements : Implements + { + using Implements::Implements; + + void* find_interface(winrt::guid const& iid) const noexcept override + { + static_assert(sizeof...(Rest) % 2 == 0, "Extra template parameters should come in groups of two"); + if (is_enabled<0, std::tuple>(iid)) + { + return Implements::find_interface(iid); + } + return nullptr; + } + + private: + template + static bool is_enabled(winrt::guid const& iid) + { + if constexpr (index >= std::tuple_size_v) + { + return true; + } + else + { + check_no_duplicates<1, index + 1, Tuple>(); + return (iid == winrt::guid_of>()) ? + std::tuple_element_t::IsEnabled() : + is_enabled(iid); + } + } + + template + static constexpr void check_no_duplicates() + { + if constexpr (index < upto) + { + static_assert(!std::is_same_v, std::tuple_element_t>, + "Duplicate interfaces found in winrt_conditionally_implements"); + check_no_duplicates(); + } + } + }; } #endif // __WIL_CPPWINRT_INCLUDED diff --git a/src/windhawk/shared/libraries/wil/cppwinrt_authoring.h b/src/windhawk/shared/libraries/wil/cppwinrt_authoring.h new file mode 100644 index 0000000..0b524b2 --- /dev/null +++ b/src/windhawk/shared/libraries/wil/cppwinrt_authoring.h @@ -0,0 +1,290 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* + +namespace wil +{ +#ifndef __WIL_CPPWINRT_AUTHORING_PROPERTIES_INCLUDED +#define __WIL_CPPWINRT_AUTHORING_PROPERTIES_INCLUDED + namespace details + { + template + struct single_threaded_property_storage + { + T m_value{}; + single_threaded_property_storage() = default; + single_threaded_property_storage(const T& value) : m_value(value) {} + operator T& () { return m_value; } + operator T const& () const { return m_value; } + template auto operator=(Q&& q) + { + m_value = wistd::forward(q); + return *this; + } + }; + } + + template + struct single_threaded_property : std::conditional_t || std::is_final_v, wil::details::single_threaded_property_storage, T> + { + single_threaded_property() = default; + template single_threaded_property(TArgs&&... value) : base_type(std::forward(value)...) {} + + using base_type = std::conditional_t || std::is_final_v, wil::details::single_threaded_property_storage, T>; + + T operator()() const + { + return *this; + } + + // This is the only setter exposed. We don't expose `operator()(Q&& q)`, + // since that is what C++/WinRT uses to implement public setters. Since + // single_threaded_property is intended for readonly properties, we + // don't want to expose that. + // + // To set the value of this property *internally* (within your + // implementation), use this `operator=`: + // + // MyProperty = 42; + // // MyProperty(42); // won't work + // + // For settable properties, use single_threaded_rw_property instead. + template auto& operator=(Q&& q) + { + static_cast(*this) = std::forward(q); + return *this; + } + }; + + template + struct single_threaded_rw_property : single_threaded_property + { + using base_type = single_threaded_property; + template single_threaded_rw_property(TArgs&&... value) : base_type(std::forward(value)...) {} + + using base_type::operator(); + + // needed in lieu of deducing-this + template auto& operator()(Q&& q) + { + return *this = std::forward(q); + } + + // needed in lieu of deducing-this + template auto& operator=(Q&& q) + { + base_type::operator=(std::forward(q)); + return *this; + } + }; + +#endif // __WIL_CPPWINRT_AUTHORING_PROPERTIES_INCLUDED + +#if !defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_FOUNDATION) && defined(WINRT_Windows_Foundation_H) // WinRT / XAML helpers +#define __WIL_CPPWINRT_AUTHORING_INCLUDED_FOUNDATION + namespace details + { + template + struct event_base { + winrt::event_token operator()(const T& handler) + { + return m_handler.add(handler); + } + + auto operator()(const winrt::event_token& token) noexcept + { + return m_handler.remove(token); + } + + template + auto invoke(TArgs&&... args) + { + return m_handler(std::forward(args)...); + } + private: + winrt::event m_handler; + }; + } + + /** + * @brief A default event handler that maps to [Windows.Foundation.EventHandler](https://docs.microsoft.com/uwp/api/windows.foundation.eventhandler-1). + * @tparam T The event data type. + */ + template + struct untyped_event : wil::details::event_base> {}; + + /** + * @brief A default event handler that maps to [Windows.Foundation.TypedEventHandler](https://docs.microsoft.com/uwp/api/windows.foundation.typedeventhandler-2). + * @tparam T The event data type. + * @details Usage example: + * @code + * // In IDL, this corresponds to: + * // event Windows.Foundation.TypedEventHandler OkClicked; + * wil::typed_event OkClicked; + * @endcode + */ + template + struct typed_event : wil::details::event_base> {}; + +#endif // !defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_FOUNDATION) && defined(WINRT_Windows_Foundation_H) + +#if !defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_XAML_DATA) && (defined(WINRT_Microsoft_UI_Xaml_Data_H) || defined(WINRT_Windows_UI_Xaml_Data_H)) // INotifyPropertyChanged helpers +#define __WIL_CPPWINRT_AUTHORING_INCLUDED_XAML_DATA + namespace details + { +#ifdef WINRT_Microsoft_UI_Xaml_Data_H + using Xaml_Data_PropertyChangedEventHandler = winrt::Microsoft::UI::Xaml::Data::PropertyChangedEventHandler; + using Xaml_Data_PropertyChangedEventArgs = winrt::Microsoft::UI::Xaml::Data::PropertyChangedEventArgs; +#elif defined(WINRT_Windows_UI_Xaml_Data_H) + using Xaml_Data_PropertyChangedEventHandler = winrt::Windows::UI::Xaml::Data::PropertyChangedEventHandler; + using Xaml_Data_PropertyChangedEventArgs = winrt::Windows::UI::Xaml::Data::PropertyChangedEventArgs; +#endif + } + + /** + * @brief Helper base class to inherit from to have a simple implementation of [INotifyPropertyChanged](https://docs.microsoft.com/uwp/api/windows.ui.xaml.data.inotifypropertychanged). + * @tparam T CRTP type + * @details When you declare your class, make this class a base class and pass your class as a template parameter: + * @code + * struct MyPage : MyPageT, wil::notify_property_changed_base + * { + * wil::single_threaded_notifying_property MyInt; + * MyPage() : INIT_NOTIFYING_PROPERTY(MyInt, 42) { } + * // or + * WIL_NOTIFYING_PROPERTY(int, MyInt, 42); + * }; + * @endcode + */ + template + struct notify_property_changed_base + { + using Type = T; + auto PropertyChanged(Xaml_Data_PropertyChangedEventHandler const& value) + { + return m_propertyChanged.add(value); + } + + void PropertyChanged(winrt::event_token const& token) + { + m_propertyChanged.remove(token); + } + + Type& self() + { + return *static_cast(this); + } + + /** + * @brief Raises a property change notification event + * @param name The name of the property + * @return + * @details Usage example\n + * C++ + * @code + * void MyPage::DoSomething() + * { + * // modify MyInt + * // MyInt = ... + * + * // now send a notification to update the bound UI elements + * RaisePropertyChanged(L"MyInt"); + * } + * @endcode + */ + auto RaisePropertyChanged(std::wstring_view name) + { + return m_propertyChanged(self(), Xaml_Data_PropertyChangedEventArgs{ name }); + } + protected: + winrt::event m_propertyChanged; + }; + + /** + * @brief Implements a property type with notifications + * @tparam T the property type + * @details Use the #INIT_NOTIFY_PROPERTY macro to initialize this property in your class constructor. This will set up the right property name, and bind it to the `notify_property_changed_base` implementation. + */ + template + struct single_threaded_notifying_property : single_threaded_rw_property + { + using Type = T; + using base_type = single_threaded_rw_property; + using base_type::operator(); + + template auto& operator()(Q&& q) + { + return *this = std::forward(q); + } + + template auto& operator=(Q&& q) + { + if (q != this->operator()()) + { + static_cast(*this) = std::forward(q); + if (auto strong = m_sender.get(); (m_npc != nullptr) && (strong != nullptr)) + { + (*m_npc)(strong, Xaml_Data_PropertyChangedEventArgs{ m_name }); + } + } + return *this; + } + + template + single_threaded_notifying_property( + winrt::event* npc, + const winrt::Windows::Foundation::IInspectable& sender, + std::wstring_view name, + TArgs&&... args) : + single_threaded_rw_property(std::forward(args)...), + m_name(name), + m_npc(npc), + m_sender(sender) + {} + + single_threaded_notifying_property(const single_threaded_notifying_property&) = default; + single_threaded_notifying_property(single_threaded_notifying_property&&) = default; + std::wstring_view Name() const noexcept { return m_name; } + private: + std::wstring_view m_name; + winrt::event* m_npc; + winrt::weak_ref m_sender; + }; + + /** + * @def WIL_NOTIFYING_PROPERTY + * @brief use this to stamp out a property that calls RaisePropertyChanged upon changing its value. This is a zero-storage alternative to wil::single_threaded_notifying_property + * @details You can pass an initializer list for the initial property value in the variadic arguments to this macro. + */ +#define WIL_NOTIFYING_PROPERTY(type, name, ...) \ + type m_##name{__VA_ARGS__}; \ + auto name() const noexcept { return m_##name; } \ + auto& name(type value) \ + { \ + if (m_##name != value) \ + { \ + m_##name = std::move(value); \ + RaisePropertyChanged(L"" #name); \ + } \ + return *this; \ + } \ + + /** + * @def INIT_NOTIFYING_PROPERTY + * @brief use this to initialize a wil::single_threaded_notifying_property in your class constructor. + */ +#define INIT_NOTIFYING_PROPERTY(NAME, VALUE) \ + NAME(&m_propertyChanged, *this, L"" #NAME, VALUE) + +#endif // !defined(__WIL_CPPWINRT_AUTHORING_INCLUDED_XAML_DATA) && (defined(WINRT_Microsoft_UI_Xaml_Data_H) || defined(WINRT_Windows_UI_Xaml_Data_H)) +} // namespace wil diff --git a/src/windhawk/shared/libraries/wil/cppwinrt_helpers.h b/src/windhawk/shared/libraries/wil/cppwinrt_helpers.h index 4c03cc2..0e2c960 100644 --- a/src/windhawk/shared/libraries/wil/cppwinrt_helpers.h +++ b/src/windhawk/shared/libraries/wil/cppwinrt_helpers.h @@ -115,7 +115,7 @@ namespace wil m_priority(priority) { } - WI_NODISCARD bool await_ready() const noexcept { return false; } + bool await_ready() const noexcept { return false; } void await_suspend(details::coroutine_handle<> handle) { @@ -284,7 +284,7 @@ namespace wil { throw winrt::hresult_changed_state(); } - result.resize(actual); + result.resize(actual, details::empty()); } return result; } @@ -300,7 +300,7 @@ namespace wil auto fetched = src.GetMany({result.data() + lastSize, result.data() + lastSize + chunkSize }); if (fetched < chunkSize) { - result.resize(lastSize + fetched); + result.resize(lastSize + fetched, details::empty()); break; } } diff --git a/src/windhawk/shared/libraries/wil/filesystem.h b/src/windhawk/shared/libraries/wil/filesystem.h index 3b7983b..4434cbe 100644 --- a/src/windhawk/shared/libraries/wil/filesystem.h +++ b/src/windhawk/shared/libraries/wil/filesystem.h @@ -40,7 +40,7 @@ namespace wil // If there is a trailing slash ignore that in the search. auto const limitedLength = ((pathLength > 0) && (path[pathLength - 1] == L'\\')) ? (pathLength - 1) : pathLength; - PCWSTR result; + PCWSTR result = nullptr; auto const offset = FindStringOrdinal(FIND_FROMEND, path, static_cast(limitedLength), L"\\", 1, TRUE); if (offset == -1) { @@ -97,7 +97,7 @@ namespace wil { *parentPathLength = 0; bool hasParent = false; - PCWSTR rootEnd; + PCWSTR rootEnd = nullptr; if (SUCCEEDED(PathCchSkipRoot(path, &rootEnd)) && (*rootEnd != L'\0')) { auto const lastSegment = find_last_path_segment(path); @@ -116,7 +116,7 @@ namespace wil DWORD lastError = ::GetLastError(); if (lastError == ERROR_PATH_NOT_FOUND) { - size_t parentLength; + size_t parentLength{}; if (try_get_parent_path_range(path, &parentLength)) { wistd::unique_ptr parent(new (std::nothrow) wchar_t[parentLength + 1]); @@ -183,7 +183,7 @@ namespace wil template string_type GetFullPathNameW(PCWSTR file, _Outptr_opt_ PCWSTR* filePart = nullptr) { - string_type result; + string_type result{}; THROW_IF_FAILED((GetFullPathNameW(file, result, filePart))); return result; } @@ -216,7 +216,7 @@ namespace wil nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr)); if (result) { - FILE_ATTRIBUTE_TAG_INFO fati; + FILE_ATTRIBUTE_TAG_INFO fati{}; if (GetFileInformationByHandleEx(result.get(), FileAttributeTagInfo, &fati, sizeof(fati)) && details::CanRecurseIntoDirectory(fati)) { @@ -261,7 +261,7 @@ namespace wil wil::unique_hlocal_string searchPath; RETURN_IF_FAILED(::PathAllocCombine(path.get(), L"*", combineOptions, &searchPath)); - WIN32_FIND_DATAW fd; + WIN32_FIND_DATAW fd{}; wil::unique_hfind findHandle(::FindFirstFileW(searchPath.get(), &fd)); RETURN_LAST_ERROR_IF(!findHandle); @@ -622,6 +622,9 @@ namespace wil if (m_folderHandle) { CancelIoEx(m_folderHandle.get(), &m_overlapped); + + DWORD bytesTransferredIgnored = 0; + GetOverlappedResult(m_folderHandle.get(), &m_overlapped, &bytesTransferredIgnored, TRUE); } // Wait for callbacks to complete. @@ -665,7 +668,7 @@ namespace wil OVERLAPPED m_overlapped{}; TP_IO *m_tpIo = __nullptr; srwlock m_cancelLock; - unsigned char m_readBuffer[4096]; // Consider alternative buffer sizes. With 512 byte buffer i was not able to observe overflow. + unsigned char m_readBuffer[4096]{}; // Consider alternative buffer sizes. With 512 byte buffer i was not able to observe overflow. }; inline void delete_folder_change_reader_state(_In_opt_ folder_change_reader_state *storage) { delete storage; } @@ -827,7 +830,7 @@ namespace wil string_type GetFinalPathNameByHandleW(HANDLE fileHandle, wil::VolumePrefix volumePrefix = wil::VolumePrefix::Dos, wil::PathOptions options = wil::PathOptions::Normalized) { - string_type result; + string_type result{}; THROW_IF_FAILED((GetFinalPathNameByHandleW(fileHandle, result, volumePrefix, options))); return result; } @@ -858,7 +861,7 @@ namespace wil template string_type GetCurrentDirectoryW() { - string_type result; + string_type result{}; THROW_IF_FAILED((GetCurrentDirectoryW(result))); return result; } @@ -867,7 +870,6 @@ namespace wil // TODO: add support for these and other similar APIs. // GetShortPathNameW() // GetLongPathNameW() - // GetWindowsDirectory() // GetTempDirectory() /// @cond @@ -1024,7 +1026,7 @@ namespace wil template ::isFixed, int>::type = 0> typename details::MapInfoClassToInfoStruct::type GetFileInfo(HANDLE fileHandle) { - typename details::MapInfoClassToInfoStruct::type result; + typename details::MapInfoClassToInfoStruct::type result{}; THROW_IF_FAILED(GetFileInfoNoThrow(fileHandle, &result)); return result; } diff --git a/src/windhawk/shared/libraries/wil/registry.h b/src/windhawk/shared/libraries/wil/registry.h index e70dd54..aaff74f 100644 --- a/src/windhawk/shared/libraries/wil/registry.h +++ b/src/windhawk/shared/libraries/wil/registry.h @@ -17,16 +17,3009 @@ #include #include // new(std::nothrow) -#include "resource.h" // unique_hkey +#include "registry_helpers.h" +#include "resource.h" + +// wil registry does not require the use of the STL or C++ exceptions (see _nothrow functions) +// wil registry natively supports std::vector and std::wstring when preferring those types +// wil registry uses the __WIL_WINREG_STL define to enable support for wil::shared_* types (defined in resource.h) namespace wil { - //! The key name includes the absolute path of the key in the registry, always starting at a - //! base key, for example, HKEY_LOCAL_MACHINE. - size_t const max_registry_key_name_length = 255; + namespace reg + { +#if defined(WIL_ENABLE_EXCEPTIONS) + /** + * \brief Opens a new HKEY to the specified path - see RegOpenKeyExW + * \param key An open or well-known registry key + * \param subKey The name of the registry subkey to be opened. + * If `nullptr`, then `key` is used without modification. + * \param access The requested access desired for the opened key + * \return A wil::unique_hkey containing the resulting opened HKEY + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline ::wil::unique_hkey open_unique_key(HKEY key, _In_opt_ PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read) + { + const reg_view_details::reg_view regview{ key }; + ::wil::unique_hkey return_value; + regview.open_key(subKey, &return_value, access); + return return_value; + } + + /** + * \brief Creates a new HKEY to the specified path - see RegCreateKeyExW + * \param key An open or well-known registry key + * \param subKey The name of a subkey that this function opens or creates. + * Note: this cannot be null (see the above referenced API documentation) + * \param access The requested access desired for the opened key + * \return A wil::unique_hkey or wil::shared_hkey containing the resulting opened HKEY + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline ::wil::unique_hkey create_unique_key(HKEY key, PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read) + { + const reg_view_details::reg_view regview{ key }; + ::wil::unique_hkey return_value; + regview.create_key(subKey, &return_value, access); + return return_value; + } + +#if defined(__WIL_WINREG_STL) + /** + * \brief Opens a new HKEY to the specified path - see RegOpenKeyExW + * \param key An open or well-known registry key + * \param subKey The name of the registry subkey to be opened. + * If `nullptr`, then `key` is used without modification. + * \param access The requested access desired for the opened key + * \return A wil::shared_hkey containing the resulting opened HKEY + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline ::wil::shared_hkey open_shared_key(HKEY key, _In_opt_ PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read) + { + const reg_view_details::reg_view regview{ key }; + ::wil::shared_hkey return_value; + regview.open_key(subKey, &return_value, access); + return return_value; + } + + /** + * \brief Creates a new HKEY to the specified path - see RegCreateKeyExW + * \param key An open or well-known registry key + * \param subKey The name of a subkey that this function opens or creates. + * Note: this cannot be null (see the above referenced API documentation) + * \param access The requested access desired for the opened key + * \return A wil::shared_hkey or wil::shared_hkey containing the resulting opened HKEY + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline ::wil::shared_hkey create_shared_key(HKEY key, PCWSTR subKey, ::wil::reg::key_access access = ::wil::reg::key_access::read) + { + const reg_view_details::reg_view regview{ key }; + ::wil::shared_hkey return_value; + regview.create_key(subKey, &return_value, access); + return return_value; + } +#endif // #if defined(__WIL_WINREG_STL) +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) + + /** + * \brief Opens a new HKEY to the specified path - see RegOpenKeyExW + * \param key An open or well-known registry key + * \param subKey The name of the registry subkey to be opened. + * If `nullptr`, then `key` is used without modification. + * \param[out] hkey A reference to a wil::unique_hkey to receive the opened HKEY + * \param access The requested access desired for the opened key + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT open_unique_key_nothrow(HKEY key, _In_opt_ PCWSTR subKey, ::wil::unique_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.open_key(subKey, hkey.put(), access); + } + + /** + * \brief Creates a new HKEY to the specified path - see RegCreateKeyExW + * \param key An open or well-known registry key + * \param subKey The name of a subkey that this function opens or creates. + * Note: this cannot be null (see the above referenced API documentation) + * \param[out] hkey A reference to a wil::unique_hkey to receive the opened HKEY + * \param access The requested access desired for the opened key + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT create_unique_key_nothrow(HKEY key, PCWSTR subKey, ::wil::unique_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.create_key(subKey, hkey.put(), access); + } + +#if defined(__WIL_WINREG_STL) + /** + * \brief Opens a new HKEY to the specified path - see RegOpenKeyExW + * \param key An open or well-known registry key + * \param subKey The name of the registry subkey to be opened. + * If `nullptr`, then `key` is used without modification. + * \param[out] hkey A reference to a wil::shared_hkey to receive the opened HKEY + * \param access The requested access desired for the opened key + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT open_shared_key_nothrow(HKEY key, _In_opt_ PCWSTR subKey, ::wil::shared_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.open_key(subKey, hkey.put(), access); + } + + /** + * \brief Creates a new HKEY to the specified path - see RegCreateKeyExW + * \param key An open or well-known registry key + * \param subKey The name of a subkey that this function opens or creates. + * Note: this cannot be null (see the above referenced API documentation) + * \param[out] hkey A reference to a wil::shared_hkey to receive the opened HKEY + * \param access The requested access desired for the opened key + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT create_shared_key_nothrow(HKEY key, PCWSTR subKey, ::wil::shared_hkey& hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.create_key(subKey, hkey.put(), access); + } +#endif // #define __WIL_WINREG_STL + // + // wil::key_iterator and wil::value_iterator objects enable enumerating registry keys and values. + // + // Examples of usage when std::wstring is included: + // + // for (const auto& key_data : wil::make_range(wil::reg::key_iterator{hkey}, wil::reg::key_iterator{})) + // { + // key_data.name; // the std::wstring of the enumerated key + // } + // + // for (const auto& value_data : wil::make_range(wil::reg::value_iterator{hkey}, wil::reg::value_iterator{})) + // { + // value_data.name; // the std::wstring of the enumerated value + // value_data.type; // the REG_ type of the enumerated value + // } + // + // When std::wstring is not included, wil::unique_process_heap_string can be used instead: + // + // for (const auto& key_data : wil::make_range(wil::reg::key_heap_string_iterator{hkey}, wil::reg::key_heap_string_iterator{})) + // { + // key_data.name.get(); // the PCWSTR of the enumerated key + // } + // + // for (const auto& value_data : wil::make_range(wil::reg::value_heap_string_iterator{hkey}, wil::reg::value_heap_string_iterator{})) + // { + // value_data.name.get(); // the PCWSTR of the enumerated value + // value_data.type; // the REG_ type of the enumerated value + // } + // + // When not using exceptions, can manually walk the iterator using wil::unique_process_heap_string: + // + // auto iterate_keys = wil::reg::key_heap_string_nothrow_iterator{hkey}; + // for (const auto& key_data : wil::make_range(iterate_keys, wil::reg::key_heap_string_nothrow_iterator{})) + // { + // key_data.name.get(); // the PCWSTR of the enumerated key + // } + // if (FAILED(iterate_keys.last_error())) + // { + // // the HRESULT last_error() returns the registry error that prevented enumeration + // } + // + // auto iterate_values = wil::reg::value_heap_string_nothrow_iterator{hkey}; + // for (const auto& value_data : wil::make_range(iterate_values, wil::reg::value_heap_string_nothrow_iterator{})) + // { + // value_data.name.get(); // the PCWSTR of the enumerated value + // value_data.type; // the REG_ type of the enumerated value + // } + // if (FAILED(iterate_values.last_error())) + // { + // // the HRESULT last_error() returns the registry error that prevented enumeration + // } + // +#if defined(WIL_ENABLE_EXCEPTIONS) + +#if defined(_STRING_) + using key_iterator = ::wil::reg::iterator_t<::wil::reg::key_iterator_data<::std::wstring>>; + using value_iterator = ::wil::reg::iterator_t<::wil::reg::value_iterator_data<::std::wstring>>; +#endif + +#if defined(__WIL_OLEAUTO_H_) + using key_bstr_iterator = ::wil::reg::iterator_t<::wil::reg::key_iterator_data<::wil::unique_bstr>>; + using value_bstr_iterator = ::wil::reg::iterator_t<::wil::reg::value_iterator_data<::wil::unique_bstr>>; +#endif // #if defined(__WIL_OLEAUTO_H_) + + using key_heap_string_iterator = ::wil::reg::iterator_t<::wil::reg::key_iterator_data<::wil::unique_process_heap_string>>; + using value_heap_string_iterator = ::wil::reg::iterator_t<::wil::reg::value_iterator_data<::wil::unique_process_heap_string>>; +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) + + // no-throw versions of applicable registry iterators +#if defined(__WIL_OLEAUTO_H_) + using key_bstr_nothrow_iterator = ::wil::reg::iterator_nothrow_t<::wil::reg::key_iterator_data<::wil::unique_bstr>>; + using value_bstr_nothrow_iterator = ::wil::reg::iterator_nothrow_t<::wil::reg::value_iterator_data<::wil::unique_bstr>>; +#endif // #if defined(__WIL_OLEAUTO_H_) + using key_heap_string_nothrow_iterator = ::wil::reg::iterator_nothrow_t<::wil::reg::key_iterator_data<::wil::unique_process_heap_string>>; + using value_heap_string_nothrow_iterator = ::wil::reg::iterator_nothrow_t<::wil::reg::value_iterator_data<::wil::unique_process_heap_string>>; + + /** + * \brief Queries for number of sub-keys + * \param key The HKEY to query for number of sub-keys + * \param[out] numSubKeys A pointer to a DWORD to receive the returned count + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_child_key_count_nothrow(HKEY key, _Out_ DWORD* numSubKeys) WI_NOEXCEPT + { + RETURN_IF_WIN32_ERROR( + RegQueryInfoKeyW( + key, + nullptr, // null class + nullptr, // null class character count, + nullptr, // null reserved + numSubKeys, + nullptr, // null max subkey length + nullptr, // null max class length + nullptr, // null value count + nullptr, // null max value name length + nullptr, // null max value length + nullptr, // null security descriptor + nullptr)); // null last write filetime + return S_OK; + } + + inline HRESULT get_child_key_count_nothrow(HKEY key, _Out_ uint32_t* numSubKeys) WI_NOEXCEPT + { + DWORD subKeys{}; + RETURN_IF_FAILED(::wil::reg::get_child_key_count_nothrow(key, &subKeys)); + *numSubKeys = subKeys; + return S_OK; + } + + /** + * \brief Queries for number of values + * \param key The HKEY to query for number of values + * \param[out] numSubValues A pointer to a DWORD to receive the returned count + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_child_value_count_nothrow(HKEY key, _Out_ DWORD* numSubValues) WI_NOEXCEPT + { + RETURN_IF_WIN32_ERROR( + RegQueryInfoKeyW( + key, + nullptr, // null class + nullptr, // null class char count, + nullptr, // null reserved + nullptr, // null subkey count + nullptr, // null max subkey length + nullptr, // null max class length + numSubValues, + nullptr, // null max value name length + nullptr, // null max value length + nullptr, // null security descriptor + nullptr)); // null last write filetime + return S_OK; + } + + inline HRESULT get_child_value_count_nothrow(HKEY key, _Out_ uint32_t* numSubValues) WI_NOEXCEPT + { + DWORD subValues{}; + RETURN_IF_FAILED(::wil::reg::get_child_value_count_nothrow(key, &subValues)); + *numSubValues = subValues; + return S_OK; + } + + /** + * \brief Queries for the filetime when the registry key was last written + * \param key The HKEY to query for number of values + * \param[out] lastModified A pointer to a FILETIME to receive the last write time + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline HRESULT get_last_write_filetime_nothrow(HKEY key, _Out_ FILETIME* lastModified) WI_NOEXCEPT + { + RETURN_IF_WIN32_ERROR( + RegQueryInfoKeyW( + key, + nullptr, // null class + nullptr, // null class char count, + nullptr, // null reserved + nullptr, // null subkey count + nullptr, // null max subkey length + nullptr, // null max class length + nullptr, // null value count + nullptr, // null max value name length + nullptr, // null max value length + nullptr, // null security descriptor + lastModified)); + return S_OK; + } + +#if defined(WIL_ENABLE_EXCEPTIONS) + /** + * \brief Queries for number of sub-keys + * \param key The HKEY to query for number of sub-keys + * \return The queried number of sub-keys if succeeded + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline uint32_t get_child_key_count(HKEY key) + { + uint32_t numSubKeys{}; + THROW_IF_FAILED(::wil::reg::get_child_key_count_nothrow(key, &numSubKeys)); + return numSubKeys; + } + + /** + * \brief Queries for number of values + * \param key The HKEY to query for number of values + * \return The queried number of value if succeeded + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline uint32_t get_child_value_count(HKEY key) + { + uint32_t numSubValues{}; + THROW_IF_FAILED(::wil::reg::get_child_value_count_nothrow(key, &numSubValues)); + return numSubValues; + } + + /** + * \brief Queries for the filetime when the registry key was last written + * \param key The HKEY to query for number of values + * \return The queried filetime if succeeded + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline FILETIME get_last_write_filetime(HKEY key) + { + FILETIME lastModified{}; + THROW_IF_FAILED(::wil::reg::get_last_write_filetime_nothrow(key, &lastModified)); + return lastModified; + } +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) + +#if defined(WIL_ENABLE_EXCEPTIONS) + // + // template + // void set_value(...) + // + // - Writes a value to a specified key and subkey, deducing the type from the given data + // - Throws a std::exception on failure (including wil::ResultException) + // + // Examples of usage (the template type does not need to be explicitly specified) + // wil::reg::set_value(key, L"subkey", L"dword_value_name", 0); // writes a REG_DWORD + // wil::reg::set_value(key, L"subkey", L"qword_value_name", 0ull); // writes a REG_QWORD + // wil::reg::set_value(key, L"subkey", L"string_value_name", L"hello"); // writes a REG_SZ + // + // A subkey is not required if the key is opened where this should write the value: + // wil::reg::set_value(key, L"dword_value_name", 0); // writes a REG_DWORD + // wil::reg::set_value(key, L"qword_value_name", 0ull); // writes a REG_QWORD + // wil::reg::set_value(key, L"string_value_name", L"hello"); // writes a REG_SZ + // + // Example usage writing a vector of wstrings to a REG_MULTI_SZ + // std::vector data { L"string1", L"string2", L"string3" }; + // wil::reg::set_value(key, L"multi_string_value_name", data); + // wil::reg::set_value(key, L"multi_string_value_name", data); + // + // Example of usage writing directly to a registry value from a raw byte vector + // - notice the registry type is required, not implied + // std::vector data { 0x00, 0xff, 0xee, 0xdd, 0xcc }; + // wil::reg::set_value_binary(key, L"binary_value_name", REG_BINARY, data); + // wil::reg::set_value_binary(key, L"binary_value_name", REG_BINARY, data); + // + + /** + * \brief Writes a value to a specified key and subkey, deducing the type from the given data. + * \tparam T The type of the data being set (the registry value type is deduced from T). + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The data (of type T) to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + template + void set_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const T& data) + { + const reg_view_details::reg_view regview{ key }; + regview.set_value(subkey, value_name, data); + } + + /** + * \brief Writes a value under a specified key, the registry type based off the templated type passed as data + * \tparam T The type of the data being set (the registry value type is deduced from T). + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The data (of type T) to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + template + void set_value(HKEY key, _In_opt_ PCWSTR value_name, const T& data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } + + /** + * \brief Writes a null-terminated string value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) + { + const reg_view_details::reg_view regview{ key }; + regview.set_value(subkey, value_name, data); + } + + /** + * \brief Writes a null-terminated string value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } + + + /** + * \brief Writes a REG_DWORD value from a uint32_t + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 32-bit value to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_dword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t data) + { + ::wil::reg::set_value(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_DWORD value from a uint32_t + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 32-bit value to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_dword(HKEY key, _In_opt_ PCWSTR value_name, uint32_t data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_QWORD value from a uint64_t + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 64-bit value to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_qword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint64_t data) + { + ::wil::reg::set_value(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_QWORD value from a uint64_t + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 64-bit value to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_qword(HKEY key, _In_opt_ PCWSTR value_name, uint64_t data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string value to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) + { + ::wil::reg::set_value(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string value to write to the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_string(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_EXPAND_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated, unexpanded string value to write to the specified registry value. For example, `%PATH%`. + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_expanded_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) + { + const reg_view_details::reg_view regview{ key }; + regview.set_value(subkey, value_name, data, REG_EXPAND_SZ); + } + + /** + * \brief Writes a REG_EXPAND_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated, unexpanded string value to write to the specified registry value. For example, `%PATH%`. + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_expanded_string(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) + { + ::wil::reg::set_value_expanded_string(key, nullptr, value_name, data); + } + +#if defined(_VECTOR_) && defined(_STRING_) + /** + * \brief The generic set_value template function to write a REG_MULTI_SZ value from a std::vector + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data A std::vector to write to the specified registry value. + * Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data) + { + const auto multiStringWcharVector(reg_view_details::get_multistring_from_wstrings(::std::begin(data), ::std::end(data))); + const reg_view_details::reg_view regview{ key }; + regview.set_value(subkey, value_name, multiStringWcharVector, REG_MULTI_SZ); + } + + /** + * \brief The generic set_value template function to write a REG_MULTI_SZ value from a std::vector + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data A std::vector to write to the specified registry value. + * Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string. + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value(HKEY key, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_MULTI_SZ value from a std::vector + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data A std::vector to write to the specified registry value. + * Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_multistring(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data) + { + ::wil::reg::set_value(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_MULTI_SZ value from a std::vector + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data A std::vector to write to the specified registry value. + * Each string will be marshaled to a contiguous null-terminator-delimited multi-sz string. + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_multistring(HKEY key, _In_opt_ PCWSTR value_name, const ::std::vector<::std::wstring>& data) + { + ::wil::reg::set_value(key, nullptr, value_name, data); + } +#endif // #if defined(_VECTOR_) && defined(_STRING_) + +#if defined(_VECTOR_) + /** + * \brief Writes a registry value of the specified type from a std::vector/std::vector + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param type The registry type for the specified registry value - see RegSetKeyValueW + * \param data A std::vector/std::vector to write to the specified registry value. + * The vector contents will be directly marshaled to the specified value. + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_binary(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type, const ::std::vector& data) + { + const reg_view_details::reg_view regview{ key }; + regview.set_value(subkey, value_name, data, type); + } + + /** + * \brief Writes a registry value of the specified type from a std::vector/std::vector + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param type The registry type for the specified registry value - see RegSetKeyValueW + * \param data A std::vector/std::vector to write to the specified registry value. + * The vector contents will be directly marshaled to the specified value. + * \exception std::exception (including wil::ResultException) will be thrown on all failures + */ + inline void set_value_binary(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type, const ::std::vector& data) + { + ::wil::reg::set_value_binary(key, nullptr, value_name, type, data); + } +#endif // #if defined(_VECTOR_) +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) + + // + // template + // HRESULT set_value_nothrow(...) + // + // - Writes a value under a specified key + // - The type of registry value is determined by the template type T of data given + // - Returns an HRESULT error code indicating success or failure (does not throw C++ exceptions) + // + // Examples of usage (the template type does not need to be explicitly specified) + // hr = wil::reg::set_value_nothrow(key, L"subkey", L"dword_value_name", 0); // writes a REG_DWORD + // hr = wil::reg::set_value_nothrow(key, L"subkey", L"qword_value_name", 0ull); // writes a REG_QWORD + // hr = wil::reg::set_value_nothrow(key, L"subkey", L"string_value_name", L"hello"); // writes a REG_SZ + // + // A subkey is not required if the key is opened where this should write the value: + // hr = wil::reg::set_value_nothrow(key, L"dword_value_name", 0); // writes a REG_DWORD + // hr = wil::reg::set_value_nothrow(key, L"qword_value_name", 0ull); // writes a REG_QWORD + // hr = wil::reg::set_value_nothrow(key, L"string_value_name", L"hello"); // writes a REG_SZ + // + // Example of usage writing a REG_MULTI_SZ + // std::vector multisz_data { L"string1", L"string2", L"string3" }; + // hr = wil::reg::set_value_nothrow(key, L"multi_string_value_name", multisz_data); + // + // Values can be written directly from a vector of bytes - the registry type must be specified; e.g.: + // std::vector data { 0x00, 0xff, 0xee, 0xdd, 0xcc }; + // hr = wil::reg::set_value_binary_nothrow(key, L"binary_value_name", REG_BINARY, data); + // + /** + * \brief Writes a value to a specified key and subkey, deducing the type from the given data. + * \tparam T The type of the data being set (the registry value type is deduced from T). + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The data (of type T) to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const T& data) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.set_value(subkey, value_name, data); + } + + /** + * \brief Writes a value under a specified key, the registry type based off the templated type passed as data + * \tparam T The type of the data being set (the registry value type is deduced from T). + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The data (of type T) to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, const T& data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data); + } + + /** + * \brief Writes a null-terminated string value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.set_value(subkey, value_name, data); + } + + /** + * \brief Writes a null-terminated string value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_DWORD value from a uint32_t + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 32-bit value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_DWORD value from a uint32_t + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 32-bit value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, uint32_t data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_QWORD value from a uint64_t + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 64-bit value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint64_t data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_QWORD value from a uint64_t + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The 64-bit value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, uint64_t data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, subkey, value_name, data); + } + + /** + * \brief Writes a REG_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT + { + return ::wil::reg::set_value_nothrow(key, nullptr, value_name, data); + } + + /** + * \brief Writes a REG_EXPAND_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.set_value(subkey, value_name, data, REG_EXPAND_SZ); + } + + /** + * \brief Writes a REG_EXPAND_SZ value from a null-terminated string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param data The null-terminated string value to write to the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, PCWSTR data) WI_NOEXCEPT + { + return ::wil::reg::set_value_expanded_string_nothrow(key, nullptr, value_name, data); + } + +#if defined(__WIL_OBJBASE_H_) + /** + * \brief Writes raw bytes into a registry value under a specified key of the specified type + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param type The registry type for the specified registry value to write to - see RegSetValue + * \param value A ::wil::unique_cotaskmem_array_ptr holding the bytes to write into the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_binary_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type, const ::wil::unique_cotaskmem_array_ptr& value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + RETURN_IF_FAILED(regview.set_value<::wil::unique_cotaskmem_array_ptr>(subkey, value_name, value, type)); + return S_OK; + } + + /** + * \brief Writes raw bytes into a registry value under a specified key of the specified type + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to write to the unnamed default registry value. + * \param type The registry type for the specified registry value to write to - see RegSetValue + * \param value A ::wil::unique_cotaskmem_array_ptr holding the bytes to write into the specified registry value + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT set_value_binary_nothrow(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type, const ::wil::unique_cotaskmem_array_ptr& value) WI_NOEXCEPT + { + return ::wil::reg::set_value_binary_nothrow(key, nullptr, value_name, type, value); + } +#endif + +#if defined(WIL_ENABLE_EXCEPTIONS) + // + // template + // T get_value(...) + // + // - Reads a value under a specified key. + // - Requires a type T to be specified. + // - Throws a std::exception on failure (including wil::ResultException), including registry value not found. + // If you don't want an exception when the value does not exist, use try_get_value(...) + // + // Examples of usage (ensure the code handles a possible std::exception that will be thrown on all errors) + // uint32_t dword_value = wil::reg::get_value(key, L"subkey", L"dword_value_name"); + // uint64_t qword_value = wil::reg::get_value(key, L"subkey", L"qword_value_name); + // std::wstring string_value = wil::reg::get_value(key, L"subkey", L"string_value_name"); + // + // A subkey is not required if the key is opened where this should write the value: + // uint32_t dword_value = wil::reg::get_value(key, L"dword_value_name"); + // uint64_t qword_value = wil::reg::get_value(key, L"qword_value_name); + // std::wstring string_value = wil::reg::get_value(key, L"string_value_name"); + // + // The template type does not need to be specified if using functions written for a targeted type + // uint32_t dword_value = wil::reg::get_value_dword(key, L"dword_value_name"); + // uint64_t qword_value = wil::reg::get_value_qword(key, L"qword_value_name"); + // std::wstring string_value = wil::reg::get_value_string(key, L"string_value_name"); + // + // Values with REG_EXPAND_SZ can be read into each of the string types; e.g.: + // std::wstring expanded_string_value = wil::reg::get_value_expanded_string(key, L"string_value_name_with_environment_variables"); + // + // Values can be read directly into a vector of bytes - the registry type must be specified; e.g.: + // std::vector data = wil::reg::get_value_binary(key, L"binary_value_name", REG_BINARY); + // + // Multi-string values can be read into a vector; e.g.: + // std::vector multi_string_value = wil::reg::get_value_multistring(key, L"multi_string_value_name"); + // for (const auto& sub_string_value : multi_string_value) + // { + // // can read each string parsed from the multi-string + // PCWSTR string_value = sub_string_value.c_str(); + // } + // + // Reading REG_SZ and REG_EXPAND_SZ types are done through the below templated get_value_string and get_value_expanded_string functions + // Where the template type is the type to receive the string value + // The default template type is std::wstring, available if the caller has included the STL header + // + // Reading a bstr can be stored in a wil::shared_bstr or wil::unique_bstr - wil::shared_bstr has a c'tor taking a wil::unique_bstr + // wil::unique_bstr unique_value { wil::reg::get_value_string<::wil::unique_bstr>(key, L"string_value_name") }; + // wil::shared_bstr shared_value { wil::reg::get_value_string<::wil::shared_bstr>(key, L"string_value_name") }; + // + // Reading a cotaskmem string can be stored in a wil::unique_cotaskmem_string or wil::shared_cotaskmem_string + // wil::unique_cotaskmem_string unique_value { wil::reg::get_value_string(key, L"string_value_name") }; + // wil::shared_cotaskmem_string shared_value { wil::reg::get_value_string(key, L"string_value_name") }; + // + // Blocking get_value_string template types that are not already specialized - this gives a much friendlier compiler error message + template + T get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for get_value_string"); + } + + template + T get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for get_value_string"); + } + + template + T get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for get_value_expanded_string"); + } + + template + T get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for get_value_expanded_string"); + } + + /** + * \brief Reads a value from a specified key and subkey, deducing registry type from the type parameter T. + * \tparam T The type to read (the registry value type is deduced from T) + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type T + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template + T get_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + T return_value{}; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, return_value); + return return_value; + } + + /** + * \brief Reads a value under a specified key, deducing registry type from the type parameter T. + * \tparam T The type to read (the registry value type is deduced from T) + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type T + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template + T get_value(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_DWORD value, returning a uint32_t + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The uint32_t value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline uint32_t get_value_dword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value(key, subkey, value_name); + } + + /** + * \brief Reads a REG_DWORD value, returning a uint32_t + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The uint32_t value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline uint32_t get_value_dword(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_QWORD value, returning a uint64_t + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The uint64_t value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline uint64_t get_value_qword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value(key, subkey, value_name); + } + + /** + * \brief Reads a REG_QWORD value, returning a uint64_t + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The uint64_t value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline uint64_t get_value_qword(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value(key, nullptr, value_name); + } + +#if defined(_STRING_) + /** + * \brief Reads a REG_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline ::std::wstring get_value_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::wstring>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline ::std::wstring get_value_string(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::wstring>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::std::wstring get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::wstring>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::std::wstring get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::wstring>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline ::std::wstring get_value_expanded_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::std::wstring value; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, value, REG_EXPAND_SZ); + return value; + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline ::std::wstring get_value_expanded_string(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value_expanded_string(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::std::wstring get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value_expanded_string(key, subkey, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a std::wstring + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A std::wstring created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::std::wstring get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value_expanded_string(key, nullptr, value_name); + } +#endif // #if defined(_STRING_) + +#if defined(__WIL_OLEAUTO_H_) + /** + * \brief Reads a REG_SZ value, returning a wil::unique_bstr + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_bstr created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_bstr get_value_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::unique_bstr>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a wil::unique_bstr + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_bstr created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_bstr get_value_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::unique_bstr>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::unique_bstr + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_bstr created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_bstr get_value_expanded_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::wil::unique_bstr value; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, value, REG_EXPAND_SZ); + return value; + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::unique_bstr + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_bstr created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_bstr get_value_expanded_string<::wil::unique_bstr>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value_expanded_string<::wil::unique_bstr>(key, nullptr, value_name); + } +#if defined(__WIL_OLEAUTO_H_STL) + /** + * \brief Reads a REG_SZ value, returning a wil::shared_bstr + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_bstr created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_bstr get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::shared_bstr>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a wil::shared_bstr + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_bstr created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_bstr get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::shared_bstr>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::unique_bstr + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_bstr created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_bstr get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::wil::shared_bstr value; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, value, REG_EXPAND_SZ); + return value; + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::shared_bstr + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_bstr created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_bstr get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value_expanded_string<::wil::shared_bstr>(key, nullptr, value_name); + } +#endif // #if defined(__WIL_OLEAUTO_H_STL) +#endif // #if defined(__WIL_OLEAUTO_H_) + +#if defined(__WIL_OBJBASE_H_) + /** + * \brief Reads a REG_SZ value, returning a wil::unique_cotaskmem_string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_cotaskmem_string created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_cotaskmem_string get_value_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::unique_cotaskmem_string>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a wil::unique_cotaskmem_string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_cotaskmem_string created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_cotaskmem_string get_value_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::unique_cotaskmem_string>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::unique_cotaskmem_string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_cotaskmem_string created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_cotaskmem_string get_value_expanded_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::wil::unique_cotaskmem_string value; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, value, REG_EXPAND_SZ); + return value; + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::unique_cotaskmem_string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::unique_cotaskmem_string created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::unique_cotaskmem_string get_value_expanded_string<::wil::unique_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name) + { + return wil::reg::get_value_expanded_string<::wil::unique_cotaskmem_string>(key, nullptr, value_name); + } +#if defined(__WIL_OBJBASE_H_STL) + /** + * \brief Reads a REG_SZ value, returning a wil::shared_cotaskmem_string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_cotaskmem_string created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_cotaskmem_string get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::shared_cotaskmem_string>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_SZ value, returning a wil::shared_cotaskmem_string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_cotaskmem_string created from the string value read from the registry + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_cotaskmem_string get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::wil::shared_cotaskmem_string>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::shared_cotaskmem_string + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_cotaskmem_string created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_cotaskmem_string get_value_expanded_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::wil::shared_cotaskmem_string value; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, value, REG_EXPAND_SZ); + return value; + } - //! The maximum number of characters allowed in a registry value's name. - size_t const max_registry_value_name_length = 16383; + /** + * \brief Reads a REG_EXPAND_SZ value, returning a wil::shared_cotaskmem_string + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A wil::shared_cotaskmem_string created from the string value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + template <> + inline ::wil::shared_cotaskmem_string get_value_expanded_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name) + { + return wil::reg::get_value_expanded_string<::wil::shared_cotaskmem_string>(key, nullptr, value_name); + } +#endif // #if defined(__WIL_OBJBASE_H_STL) +#endif // defined(__WIL_OBJBASE_H_) + +#if defined(_VECTOR_) + /** + * \brief Reads a registry value of the specified type, returning a std::vector + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \param type The registry type for the specified registry value to read from - see RegGetValueW + * \return A std::vector containing the bytes of the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline ::std::vector get_value_binary(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type) + { + ::std::vector return_value{}; + const reg_view_details::reg_view regview{ key }; + regview.get_value(subkey, value_name, return_value, type); + return return_value; + } + + /** + * \brief Reads a registry value of the specified type, returning a std::vector + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \param type The registry type for the specified registry value to read from - see RegGetValueW + * \return A std::vector containing the bytes of the specified registry value + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + */ + inline ::std::vector get_value_binary(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type) + { + return ::wil::reg::get_value_binary(key, nullptr, value_name, type); + } +#endif // #if defined(_VECTOR_) + +#if defined(_VECTOR_) && defined(_STRING_) + /** + * \brief Reads a REG_MULTI_SZ value, returning a std::vector + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks. + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + * + * \remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character + * e.g. a REG_MULTI_SZ of L"string1\0\0string2\0\0string3\0\0" + * returns a vector of size 5: L"string1", empty-string, L"string2", empty-string, L"string3" + */ + template <> + inline ::std::vector<::std::wstring> get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::std::vector<::std::wstring> return_value; + ::std::vector rawData{ ::wil::reg::get_value_binary(key, subkey, value_name, REG_MULTI_SZ) }; + if (!rawData.empty()) + { + auto* const begin = reinterpret_cast(rawData.data()); + auto* const end = begin + rawData.size() / sizeof(wchar_t); + return_value = ::wil::reg::reg_view_details::get_wstring_vector_from_multistring(begin, end); + } + + return return_value; + } + + /** + * \brief Reads a REG_MULTI_SZ value, returning a std::vector + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks. + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + * + * \remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character + * e.g. a REG_MULTI_SZ of L"string1\0\0string2\0\0string3\0\0" + * returns a vector of size 5: L"string1", empty-string, L"string2", empty-string, L"string3" + */ + template <> + inline ::std::vector<::std::wstring> get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::vector<::std::wstring>>(key, nullptr, value_name); + } + + /** + * \brief Reads a REG_MULTI_SZ value, returning a std::vector + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks. + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + * + * \remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character + * e.g. a REG_MULTI_SZ of L"string1\0\0string2\0\0string3\0\0" + * returns a vector of size 5: L"string1", empty-string, L"string2", empty-string, L"string3" + */ + inline ::std::vector<::std::wstring> get_value_multistring(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::vector<::std::wstring>>(key, subkey, value_name); + } + + /** + * \brief Reads a REG_MULTI_SZ value, returning a std::vector + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return A vector of strings read from the REG_MULTI_SZ. Note: embedded nulls will be read as empty strings. See remarks. + * \exception std::exception (including wil::ResultException) will be thrown on all failures, including value not found + * + * \remark Note that will return empty strings for embedded nulls - it won't stop at the first double-null character + * e.g. a REG_MULTI_SZ of L"string1\0\0string2\0\0string3\0\0" + * returns a vector of size 5: L"string1", empty-string, L"string2", empty-string, L"string3" + */ + inline ::std::vector<::std::wstring> get_value_multistring(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::get_value<::std::vector<::std::wstring>>(key, nullptr, value_name); + } +#endif // #if defined(_VECTOR_) && defined(_STRING_) + +#if defined (_OPTIONAL_) && defined(__cpp_lib_optional) + // + // template + // void try_get_value(...) + // + // - Reads a value under a specified key and subkey, deducing registry type from the type parameter T. + // - throws a std::exception on failure (including wil::ResultException), except if the registry value was not found + // returns a std::nullopt if the registry value is not found + // + // Examples using the returned std::optional + // - Caller should ensure the code handles a possible std::exception that will be thrown on all errors except value not found + // + // std::optional opt_dword_value = wil::reg::try_get_value(key, L"dword_value_name"); + // if (opt_dword_value.has_value()) + // { + // // opt_dword_value.value() returns the uint32_t read from the registry + // } + // else + // { + // // the registry value did not exist + // } + // // if the caller wants to apply a default value of 0, they can call value_or() + // uint32_t opt_dword_value = wil::reg::try_get_value(key, L"dword_value_name").value_or(0); + // + // Examples using the returned std::optional + // std::optional opt_string_value = wil::reg::try_get_value_string(key, L"string_value_name"); + // if (opt_string_value.has_value()) + // { + // // opt_string_value.value() returns the std::wstring read from the registry + // // the below avoids copying the std::wstring as value() here returns a std::wstring& + // PCWSTR string_value = opt_string_value.value().c_str(); + // } + // else + // { + // // the registry value did not exist + // } + // + // // if the caller wants to apply a default value of L"default", they can call value_or() + // // note that std::optional only attempts to construct a std::wstring for L"default" if the std::optional is empty (std::nullopt) + // // thus only allocating a new std::wstring for the default value when it's needed + // std::optional opt_string_value = wil::reg::try_get_value_string(key, L"string_value_name").value_or(L"default"); + // + // Examples of usage: + // std::optional opt_dword_value = wil::reg::try_get_value(key, L"subkey", L"dword_value_name"); + // std::optional opt_qword_value = wil::reg::try_get_value(key, L"subkey", L"qword_value_name); + // std::optional opt_string_value = wil::reg::try_get_value(key, L"subkey", L"string_value_name"); + // + // A subkey is not required if the key is opened where this should write the value; e.g. + // std::optional opt_dword_value = wil::reg::try_get_value(key, L"dword_value_name"); + // std::optional opt_qword_value = wil::reg::try_get_value(key, L"qword_value_name); + // std::optional opt_string_value = wil::reg::try_get_value(key, L"string_value_name"); + // + // The template type does not need to be specified if using functions written for a targeted type; e.g. + // std::optional opt_dword_value = wil::reg::try_get_value_dword(key, L"dword_value_name"); + // std::optional opt_qword_value = wil::reg::try_get_value_qword(key, L"qword_value_name"); + // std::optional opt_string_value = wil::reg::try_get_value_string(key, L"string_value_name"); + // + // Values with REG_EXPAND_SZ can be read into each of the string types; e.g.: + // std::optional opt_expanded_string_value = wil::reg::try_get_value_expanded_string(key, L"string_value_name_with_environment_variables"); + // + // Values can be read directly into a vector of bytes - the registry type must be specified; e.g.: + // std::optional> opt_data = wil::reg::try_get_value_binary(key, L"binary_value_name", REG_BINARY); + // + // Multi-string values can be read into a std::vector; e.g.: + // std::optional<::std::vector<::std::wstring>> try_get_value_multistring(key, L"multi_string_value_name"); + // See the definition of try_get_value_multistring before for usage guidance + // + // Reading REG_SZ and REG_EXPAND_SZ types are done through the below templated try_get_value_string and try_get_value_expanded_string functions + // Where the template type is the type to receive the string value + // The default template type is std::wstring, available if the caller has included the STL header + // + // Reading a bstr is returned in a std::optional - because wil::unique_bstr cannot be copied and thus is difficult to work with a std::optional + // std::optional shared_value { wil::reg::try_get_value_string<::wil::shared_bstr>(key, L"string_value_name") }; + // + // Reading a cotaskmem string is returned in a std::optional - because wil::unique_cotaskmem_string cannot be copied and thus is difficult to work with a std::optional + // std::optional opt_shared_value { wil::reg::try_get_value_string(key, L"string_value_name") }; + // + // Blocking try_get_value_string template types that are not already specialized - this gives a much friendlier compiler error message + template + ::std::optional try_get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for try_get_value_string"); + } + + template + ::std::optional try_get_value_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for try_get_value_string"); + } + + template + ::std::optional try_get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*subkey*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for try_get_value_expanded_string"); + } + + template + ::std::optional try_get_value_expanded_string(HKEY /*key*/, _In_opt_ PCWSTR /*value_name*/) + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for try_get_value_expanded_string"); + } + + /** + * \brief Attempts to read a value under a specified key and subkey, returning in a std::optional, deducing registry type from the type parameter T. + * \tparam T The type to read, which will be placed into a std::optional (the registry value type is deduced from T) + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value (of type T) read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template + ::std::optional try_get_value(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { +#if defined(__WIL_OLEAUTO_H_) + // not allowing unique types with try_get_value: wil::unique_bstr cannot be copied and thus is difficult to work with a std::optional + static_assert(!wistd::is_same_v, "try_get with wil::unique_bstr is disabled"); +#endif // #if defined(__WIL_OLEAUTO_H_) +#if defined(__WIL_OBJBASE_H_) + // not allowing unique types with try_get_value: wil::unique_cotaskmem_string cannot be copied and thus is difficult to work with a std::optional + static_assert(!wistd::is_same_v, "try_get with wil::unique_cotaskmem_string is disabled"); +#endif // #if defined(__WIL_OBJBASE_H_) + + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value(subkey, value_name); + } + + /** + * \brief Attempts to read a value under a specified key, returning the value in a std::optional, deducing registry type from the type parameter T. + * \tparam T The type to read, which will be placed into a std::optional (the registry value type is deduced from T) + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value (of type T) read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template + ::std::optional try_get_value(HKEY key, _In_opt_ PCWSTR value_name) + { +#if defined(__WIL_OLEAUTO_H_) + // not allowing unique types with try_get_value: wil::unique_bstr cannot be copied and thus is difficult to work with a std::optional + static_assert(!wistd::is_same_v, "try_get with wil::unique_bstr is disabled"); +#endif // #if defined(__WIL_OLEAUTO_H_) +#if defined(__WIL_OBJBASE_H_) + // not allowing unique types with try_get_value: wil::unique_cotaskmem_string cannot be copied and thus is difficult to work with a std::optional + static_assert(!wistd::is_same_v, "try_get with wil::unique_cotaskmem_string is disabled"); +#endif // #if defined(__WIL_OBJBASE_H_) + + return ::wil::reg::try_get_value(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_DWORD value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional try_get_value_dword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value(key, subkey, value_name); + } + + /** + * \brief Attempts to read a REG_DWORD value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional try_get_value_dword(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_QWORD value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional try_get_value_qword(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value(key, subkey, value_name); + } + + /** + * \brief Attempts to read a REG_QWORD value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional try_get_value_qword(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value(key, nullptr, value_name); + } + +#if defined(_VECTOR_) + /** + * \brief Attempts to read a value under a specified key requiring the specified type, returning the raw bytes in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \param type The registry type for the specified registry value to read from - see RegGetValueW + * \return The raw bytes read from the registry value stored in a std::optional>. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::vector> try_get_value_binary(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::std::vector>(subkey, value_name, type); + } + + /** + * \brief Attempts to read a value under a specified key requiring the specified type, returning the raw bytes in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \param type The registry type for the specified registry value to read from - see RegGetValueW + * \return The raw bytes read from the registry value stored in a std::optional>. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::vector> try_get_value_binary(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type) + { + return ::wil::reg::try_get_value_binary(key, nullptr, value_name, type); + } +#endif // #if defined(_VECTOR_) + +#if defined(_STRING_) + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::wstring> try_get_value_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::std::wstring>(subkey, value_name); + } + + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::wstring> try_get_value_string(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_string(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::std::wstring> try_get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_string(key, subkey, value_name); + } + + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value, in a std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::std::wstring> try_get_value_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_string(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::wstring> try_get_value_expanded_string(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::std::wstring>(subkey, value_name, REG_EXPAND_SZ); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::wstring> try_get_value_expanded_string(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_expanded_string(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::std::wstring> try_get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_expanded_string(key, subkey, value_name); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::std::wstring> try_get_value_expanded_string<::std::wstring>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_expanded_string(key, nullptr, value_name); + } +#endif // #if defined(_STRING_) + +#if defined(__WIL_OLEAUTO_H_STL) + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_bstr> try_get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::wil::shared_bstr>(subkey, value_name); + } + + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_bstr> try_get_value_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_string<::wil::shared_bstr>(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_bstr> try_get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::wil::shared_bstr>(subkey, value_name, REG_EXPAND_SZ); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_bstr> try_get_value_expanded_string<::wil::shared_bstr>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_expanded_string<::wil::shared_bstr>(key, nullptr, value_name); + } +#endif // #if defined(__WIL_OLEAUTO_H_STL) + +#if defined(__WIL_OBJBASE_H_STL) + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::wil::shared_cotaskmem_string>(subkey, value_name); + } + + /** + * \brief Attempts to read a REG_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_string<::wil::shared_cotaskmem_string>(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional<:wil::shared_cotaskmem_string>, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_expanded_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + const reg_view_details::reg_view regview{ key }; + return regview.try_get_value<::wil::shared_cotaskmem_string>(subkey, value_name, REG_EXPAND_SZ); + } + + /** + * \brief Attempts to read a REG_EXPAND_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value of the template type std::optional, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::wil::shared_cotaskmem_string> try_get_value_expanded_string<::wil::shared_cotaskmem_string>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value_expanded_string<::wil::shared_cotaskmem_string>(key, nullptr, value_name); + } +#endif // defined(__WIL_OBJBASE_H_STL) + +#if defined (_VECTOR_) && defined (_STRING_) + /** + * \brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value marshaled to a std::optional>. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::std::vector<::std::wstring>> try_get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + ::std::vector<::std::wstring> value; + const auto hr = ::wil::ResultFromException([&] { + value = ::wil::reg::get_value_multistring(key, subkey, value_name); + }); + if (SUCCEEDED(hr)) + { + return { value }; + } + + if (::wil::reg::is_registry_not_found(hr)) + { + return { ::std::nullopt }; + } + + THROW_HR(HRESULT_FROM_WIN32(hr)); + } + + /** + * \brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value marshaled to a std::optional>. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + template <> + inline ::std::optional<::std::vector<::std::wstring>> try_get_value<::std::vector<::std::wstring>>(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value<::std::vector<::std::wstring>>(key, nullptr, value_name); + } + + /** + * \brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value marshaled to a std::optional>. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::vector<::std::wstring>> try_get_value_multistring(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value<::std::vector<::std::wstring>>(key, subkey, value_name); + } + + /** + * \brief Attempts to read a REG_MULTI_SZ value under a specified key, returning the value in a std::optional + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be updated. + * Can be nullptr to read from the unnamed default registry value. + * \return The value read from the registry value marshaled to a std::optional>. + * Returns std::nullopt if the value does not exist. + * \exception std::exception (including wil::ResultException) will be thrown on failures except value not found + */ + inline ::std::optional<::std::vector<::std::wstring>> try_get_value_multistring(HKEY key, _In_opt_ PCWSTR value_name) + { + return ::wil::reg::try_get_value<::std::vector<::std::wstring>>(key, nullptr, value_name); + } +#endif // #if defined (_VECTOR_) && defined (_STRING_) +#endif // #if defined (_OPTIONAL_) && defined(__cpp_lib_optional) +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) + + // + // template + // HRESULT get_value_nothrow(...) + // + // - Reads a value from under a specified key + // - The required type of registry value being read from is determined by the template type T + // - Returns an HRESULT error code indicating success or failure (does not throw C++ exceptions) + // + // Examples of usage (the template type does not need to be explicitly specified) + // uint32_t dword_value{}; + // hr = wil::reg::get_value_nothrow(key, L"subkey", L"dword_value_name", &dword_value); // reads a REG_DWORD + // uint64_t qword_value{}; + // hr = wil::reg::get_value_nothrow(key, L"subkey", L"qword_value_name", &qword_value); // reads a REG_QWORD + // wil::unique_bstr string_value{}; + // hr = wil::reg::get_value_nothrow(key, L"subkey", L"string_value_name", string_value); // reads a REG_SZ + // + // A subkey is not required if the key is opened where this should write the value: + // hr = wil::reg::get_value_nothrow(key, L"dword_value_name", &dword_value); // reads a REG_DWORD + // hr = wil::reg::get_value_nothrow(key, L"qword_value_name", &qword_value); // reads a REG_QWORD + // hr = wil::reg::get_value_nothrow(key, L"string_value_name", string_value); // reads a REG_SZ + // + // Can also specify the registry type in the function name: + // hr = wil::reg::get_value_dword_nothrow(key, L"dword_value_name", &dword_value); // reads a REG_DWORD + // hr = wil::reg::get_value_qword_nothrow(key, L"qword_value_name", &qword_value); // reads a REG_QWORD + // hr = wil::reg::get_value_string_nothrow(key, L"string_value_name", string_value); // reads a REG_SZ + // + // Example storing directly into a WCHAR array - note will return the required number of bytes if the supplied array is too small + // WCHAR string_value[100]{}; + // uint32_t requiredBytes{}; + // hr = wil::reg::get_value_string_nothrow(key, L"string_value_name", string_value, &requiredBytes); + // + // Example of usage writing a REG_MULTI_SZ + // wil::unique_cotaskmem_array_ptr string_values{}; + // hr = wil::reg::get_value_multistring_nothrow(key, L"multi_string_value_name", string_values); + // + // Values can be written directly from a vector of bytes - the registry type must be specified; e.g.: + // wil::unique_cotaskmem_array_ptr raw_value{}; + // hr = wil::reg::get_value_binary_nothrow(key, L"binary_value_name", REG_BINARY, raw_value); + // + // Reading REG_SZ and REG_EXPAND_SZ types are done through the below templated get_value_string_nothrow and get_value_expanded_string_nothrow functions + // Where the template type is the type to receive the string value + // The default template type is std::wstring, available if the caller has included the STL header + // + // Example storing a string in a wil::unique_bstr, wil::shared_bstr, wil::unique_cotaskmem_string, or wil::shared_cotaskmem_string + /// - These string types are passed by reference, not by pointer, because the wil types overload the & operator + // + // wil::unique_bstr bstr_value{}; + // hr = wil::reg::get_value_nothrow(key, L"string_value_name", bstr_value); + // // or can specify explicitly reading a string into a wil::unique_bstr type + // hr = wil::reg::get_value_string_nothrow(key, L"string_value_name", bstr_value); + // + // wil::shared_bstr shared_bstr_value{}; + // hr = wil::reg::get_value_nothrow(key, L"string_value_name", shared_bstr_value); + // // or can specify explicitly reading a string into a wil::shared_bstr type + // hr = wil::reg::get_value_string_nothrow(key, L"string_value_name", shared_bstr_value); + // + // wil::unique_cotaskmem_string string_value{}; + // hr = wil::reg::get_value_nothrow(key, L"string_value_name", string_value); + // // or can specify explicitly reading a string into a wil::unique_cotaskmem_string type + // hr = wil::reg::get_value_string_nothrow(key, L"string_value_name", string_value); + // + // wil::shared_cotaskmem_string shared_string_value{}; + // hr = wil::reg::get_value_nothrow(key, L"string_value_name", shared_string_value); + // // or can specify explicitly reading a string into a wil::shared_cotaskmem_string type + // hr = wil::reg::get_value_string_nothrow(key, L"string_value_name", shared_string_value); + // + + /** + * \brief Reads a value under a specified key, the registry type based off the templated type passed as data + * \tparam T The type of the data being set (the registry value type is deduced from T). + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A pointer-to-T receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template >* = nullptr> + HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, _Out_ T* return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value(subkey, value_name, *return_value); + } + + /** + * \brief Reads a value under a specified key, the registry type based off the templated type passed as data + * \tparam T The type of the data being set (the registry value type is deduced from T). + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A pointer-to-T receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template >* = nullptr> + HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, _Out_ T* return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \param[out] requiredBytes An optional pointer to a unsigned 32-bit value to receive the required bytes of the string in the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length], _Out_opt_ DwordType * requiredBytes) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value_char_array(subkey, value_name, return_value, REG_SZ, requiredBytes); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \param[out] requiredBytes An optional pointer to an unsigned 32-bit value to receive the required bytes of the string to be read + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length], _Out_opt_ DwordType * requiredBytes) WI_NOEXCEPT + { + return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value, requiredBytes); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length]) WI_NOEXCEPT + { + constexpr uint32_t* null_out_param = nullptr; + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value_char_array(subkey, value_name, return_value, REG_SZ, null_out_param); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length]) WI_NOEXCEPT + { + return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length]) WI_NOEXCEPT + { + return ::wil::reg::get_value_string_nothrow(key, subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length]) WI_NOEXCEPT + { + return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_DWORD value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A pointer to an unsigned 32-bit value receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, _Out_ DwordType * return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_DWORD value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A pointer to an unsigned 32-bit value receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_dword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, _Out_ DwordType * return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_QWORD value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A uint64_t receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, _Out_ QwordType * return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_QWORD value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A uint64_t receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_qword_nothrow(HKEY key, _In_opt_ PCWSTR value_name, _Out_ QwordType * return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + +#if defined(__WIL_OLEAUTO_H_) + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value(subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value.addressof()); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value); + } + +#if defined(__WIL_OLEAUTO_H_STL) + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value(subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value.addressof()); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_bstr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_string_nothrow(key, nullptr, value_name, return_value); + } +#endif // #if defined(__WIL_OLEAUTO_H_STL) +#endif // #if defined(__WIL_OLEAUTO_H_) + +#if defined(__WIL_OBJBASE_H_) + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT + { + return_value.reset(); + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value(subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + +#if defined(__WIL_OBJBASE_H_STL) + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT + { + return_value.reset(); + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value(subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } +#endif // #if defined(__WIL_OBJBASE_H_STL) +#endif // defined(__WIL_OBJBASE_H_) + +#if defined(__WIL_OBJBASE_H_) + /** + * \brief Reads the raw bytes from a registry value under a specified key of the specified type + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param type The registry type for the specified registry value to read from - see RegGetValueW + * \param[out] return_value A ::wil::unique_cotaskmem_array_ptr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_binary_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, uint32_t type, ::wil::unique_cotaskmem_array_ptr& return_value) WI_NOEXCEPT + { + // zero the vector if it already had a buffer + for (auto& byte_value : return_value) + { + byte_value = 0x00; + } + const reg_view_details::reg_view_nothrow regview{ key }; + RETURN_IF_FAILED(regview.get_value<::wil::unique_cotaskmem_array_ptr>(subkey, value_name, return_value, type)); + return S_OK; + } + + /** + * \brief Reads the raw bytes from a registry value under a specified key of the specified type + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param type The registry type for the specified registry value to read from - see RegGetValueW + * \param[out] return_value A ::wil::unique_cotaskmem_array_ptr receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_binary_nothrow(HKEY key, _In_opt_ PCWSTR value_name, uint32_t type, ::wil::unique_cotaskmem_array_ptr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_binary_nothrow(key, nullptr, value_name, type, return_value); + } +#endif// #if defined(__WIL_OBJBASE_H_) + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \param[out] requiredBytes An optional pointer to a uint32_t to receive the required bytes of the string to be read + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length], _Out_opt_ DwordType * requiredBytes) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value_char_array(subkey, value_name, return_value, REG_EXPAND_SZ, requiredBytes); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \param[out] requiredBytes An optional pointer to a uint32_t to receive the required bytes of the string to be read + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template || wistd::is_same_v>* = nullptr> + HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length], _Out_opt_ DwordType * requiredBytes) WI_NOEXCEPT + { + return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value, requiredBytes); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length]) WI_NOEXCEPT + { + constexpr uint32_t* null_out_param = nullptr; + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value_char_array(subkey, value_name, return_value, REG_EXPAND_SZ, null_out_param); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \tparam Length The length of the WCHAR array passed as an OUT parameter + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A WCHAR array receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * Will write to the WCHAR array the string value read from the registry, guaranteeing null-termination + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + template + HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length]) WI_NOEXCEPT + { + return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value); + } + + +#if defined(__WIL_OLEAUTO_H_) + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_bstr receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value<::wil::unique_bstr>(subkey, value_name, return_value, REG_EXPAND_SZ); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_bstr receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value); + } + +#if defined(__WIL_OLEAUTO_H_STL) + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_bstr receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value<::wil::shared_bstr>(subkey, value_name, return_value, REG_EXPAND_SZ); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_bstr receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_bstr& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value); + } +#endif // #if defined(__WIL_OLEAUTO_H_STL) +#endif // #if defined(__WIL_OLEAUTO_H_) + +#if defined(__WIL_OBJBASE_H_) + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value<::wil::unique_cotaskmem_string>(subkey, value_name, return_value, REG_EXPAND_SZ); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::unique_cotaskmem_string receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value); + } + +#if defined(__WIL_OBJBASE_H_STL) + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT + { + const reg_view_details::reg_view_nothrow regview{ key }; + return regview.get_value<::wil::shared_cotaskmem_string>(subkey, value_name, return_value, REG_EXPAND_SZ); + } + + /** + * \brief Reads a REG_EXPAND_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A wil::shared_cotaskmem_string receiving the value read from the registry, + * with environment variables expanded, as though passed through ExpandEnvironmentStringsW. + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_expanded_string_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::shared_cotaskmem_string& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_expanded_string_nothrow(key, nullptr, value_name, return_value); + } +#endif // #if defined(__WIL_OBJBASE_H_STL) +#endif // defined(__WIL_OBJBASE_H_) + +#if defined(__WIL_OBJBASE_H_) + /** + * \brief Reads a REG_MULTI_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT + { + ::wil::unique_cotaskmem_array_ptr rawData; + RETURN_IF_FAILED(::wil::reg::get_value_binary_nothrow(key, subkey, value_name, REG_MULTI_SZ, rawData)); + if (!rawData.empty()) + { + auto* const begin = reinterpret_cast(rawData.data()); + auto* const end = begin + rawData.size() / sizeof(wchar_t); + ::wil::reg::reg_view_details::get_cotaskmemstring_array_from_multistring_nothrow(begin, end, return_value); + } + return S_OK; + } + + /** + * \brief Reads a REG_MULTI_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } + + /** + * \brief Reads a REG_MULTI_SZ value under a specified key + * \param key An open or well-known registry key + * \param subkey The name of the subkey to append to `key`. + * If `nullptr`, then `key` is used without modification. + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_multistring_nothrow(HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, subkey, value_name, return_value); + } + + /** + * \brief Reads a REG_MULTI_SZ value under a specified key + * \param key An open or well-known registry key + * \param value_name The name of the registry value whose data is to be read. + * Can be nullptr to read from the unnamed default registry value. + * \param[out] return_value A ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string> receiving the value read from the registry + * \return HRESULT error code indicating success or failure (does not throw C++ exceptions) + */ + inline HRESULT get_value_multistring_nothrow(HKEY key, _In_opt_ PCWSTR value_name, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& return_value) WI_NOEXCEPT + { + return ::wil::reg::get_value_nothrow(key, nullptr, value_name, return_value); + } +#endif // #if defined(__WIL_OBJBASE_H_) + } // unique_registry_watcher/unique_registry_watcher_nothrow/unique_registry_watcher_failfast // These classes make it easy to execute a provided function when a @@ -62,7 +3055,7 @@ namespace wil { struct registry_watcher_state { - registry_watcher_state(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) + registry_watcher_state(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) : m_callback(wistd::move(callback)), m_keyToWatch(wistd::move(keyToWatch)), m_isRecursive(isRecursive) { } @@ -79,8 +3072,8 @@ namespace wil volatile long m_refCount = 1; srwlock m_lock; - // Returns true if the refcount can be increased from a non zero value, - // false it was zero impling that the object is in or on the way to the destructor. + // Returns true if the ref-count can be increased from a non zero value, + // false it was zero implying that the object is in or on the way to the destructor. // In this case ReleaseFromCallback() should not be called. bool TryAddRef() { @@ -116,9 +3109,9 @@ namespace wil } }; - inline void delete_registry_watcher_state(_In_opt_ registry_watcher_state *watcherStorage) { watcherStorage->Release(); } + inline void delete_registry_watcher_state(_In_opt_ registry_watcher_state* watcherStorage) { watcherStorage->Release(); } - typedef resource_policy registry_watcher_state_resource_policy; } /// @endcond @@ -135,20 +3128,20 @@ namespace wil typedef typename err_policy::result result; // Exception-based constructors - registry_watcher_t(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function &&callback) + registry_watcher_t(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function&& callback) { static_assert(wistd::is_same::value, "this constructor requires exceptions; use the create method"); create(rootKey, subKey, isRecursive, wistd::move(callback)); } - registry_watcher_t(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) + registry_watcher_t(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) { static_assert(wistd::is_same::value, "this constructor requires exceptions; use the create method"); create(wistd::move(keyToWatch), isRecursive, wistd::move(callback)); } // Pass a root key, sub key pair or use an empty string to use rootKey as the key to watch. - result create(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function &&callback) + result create(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function&& callback) { // Most use will want to create the key, consider adding an option for open as a future design change. unique_hkey keyToWatch; @@ -160,7 +3153,7 @@ namespace wil return err_policy::HResult(create_common(wistd::move(keyToWatch), isRecursive, wistd::move(callback))); } - result create(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) + result create(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) { return err_policy::HResult(create_common(wistd::move(keyToWatch), isRecursive, wistd::move(callback))); } @@ -168,13 +3161,13 @@ namespace wil private: // Factored into a standalone function to support Clang which does not support conversion of stateless lambdas // to __stdcall - static void __stdcall callback(PTP_CALLBACK_INSTANCE, void *context, TP_WAIT *, TP_WAIT_RESULT) + static void __stdcall callback(PTP_CALLBACK_INSTANCE, void* context, TP_WAIT*, TP_WAIT_RESULT) { #ifndef __WIL_REGISTRY_CHANGE_CALLBACK_TEST #define __WIL_REGISTRY_CHANGE_CALLBACK_TEST #endif __WIL_REGISTRY_CHANGE_CALLBACK_TEST - auto watcherState = static_cast(context); + const auto watcherState = static_cast(context); if (watcherState->TryAddRef()) { // using auto reset event so don't need to manually reset. @@ -214,7 +3207,7 @@ namespace wil } // This function exists to avoid template expansion of this code based on err_policy. - HRESULT create_common(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) + HRESULT create_common(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) { wistd::unique_ptr watcherState(new(std::nothrow) details::registry_watcher_state( wistd::move(keyToWatch), isRecursive, wistd::move(callback))); @@ -235,26 +3228,26 @@ namespace wil typedef unique_any_t, err_returncode_policy>> unique_registry_watcher_nothrow; typedef unique_any_t, err_failfast_policy>> unique_registry_watcher_failfast; - inline unique_registry_watcher_nothrow make_registry_watcher_nothrow(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function &&callback) WI_NOEXCEPT + inline unique_registry_watcher_nothrow make_registry_watcher_nothrow(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function&& callback) WI_NOEXCEPT { unique_registry_watcher_nothrow watcher; watcher.create(rootKey, subKey, isRecursive, wistd::move(callback)); return watcher; // caller must test for success using if (watcher) } - inline unique_registry_watcher_nothrow make_registry_watcher_nothrow(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) WI_NOEXCEPT + inline unique_registry_watcher_nothrow make_registry_watcher_nothrow(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) WI_NOEXCEPT { unique_registry_watcher_nothrow watcher; watcher.create(wistd::move(keyToWatch), isRecursive, wistd::move(callback)); return watcher; // caller must test for success using if (watcher) } - inline unique_registry_watcher_failfast make_registry_watcher_failfast(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function &&callback) + inline unique_registry_watcher_failfast make_registry_watcher_failfast(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function&& callback) { return unique_registry_watcher_failfast(rootKey, subKey, isRecursive, wistd::move(callback)); } - inline unique_registry_watcher_failfast make_registry_watcher_failfast(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) + inline unique_registry_watcher_failfast make_registry_watcher_failfast(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) { return unique_registry_watcher_failfast(wistd::move(keyToWatch), isRecursive, wistd::move(callback)); } @@ -262,12 +3255,12 @@ namespace wil #ifdef WIL_ENABLE_EXCEPTIONS typedef unique_any_t, err_exception_policy >> unique_registry_watcher; - inline unique_registry_watcher make_registry_watcher(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function &&callback) + inline unique_registry_watcher make_registry_watcher(HKEY rootKey, _In_ PCWSTR subKey, bool isRecursive, wistd::function&& callback) { return unique_registry_watcher(rootKey, subKey, isRecursive, wistd::move(callback)); } - inline unique_registry_watcher make_registry_watcher(unique_hkey &&keyToWatch, bool isRecursive, wistd::function &&callback) + inline unique_registry_watcher make_registry_watcher(unique_hkey&& keyToWatch, bool isRecursive, wistd::function&& callback) { return unique_registry_watcher(wistd::move(keyToWatch), isRecursive, wistd::move(callback)); } diff --git a/src/windhawk/shared/libraries/wil/registry_helpers.h b/src/windhawk/shared/libraries/wil/registry_helpers.h new file mode 100644 index 0000000..3cb344c --- /dev/null +++ b/src/windhawk/shared/libraries/wil/registry_helpers.h @@ -0,0 +1,1860 @@ +//********************************************************* +// +// Copyright (c) Microsoft. All rights reserved. +// This code is licensed under the MIT License. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. +// +//********************************************************* +#ifndef __WIL_REGISTRY_HELPERS_INCLUDED +#define __WIL_REGISTRY_HELPERS_INCLUDED + +#if defined(_STRING_) || defined (_VECTOR_) || (defined (__cpp_lib_optional) && defined (_OPTIONAL_)) +#include +#include +#endif + +#include +#include +#include "resource.h" + +#ifdef _KERNEL_MODE +#error This header is not supported in kernel-mode. +#endif + +namespace wil +{ + namespace reg + { + /** + * \brief Helper function to translate registry return values if the value was not found + * \param hr HRESULT to test from registry APIs + * \return boolean if the HRESULT indicates the registry value was not found + */ + constexpr bool is_registry_not_found(HRESULT hr) WI_NOEXCEPT + { + return (hr == __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) || + (hr == __HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)); + } + + /** + * \brief Helper function to translate registry return values if the buffer was too small + * \param hr HRESULT to test from registry APIs + * \return boolean if the HRESULT indicates the buffer was too small for the value being read + */ + constexpr bool is_registry_buffer_too_small(HRESULT hr) WI_NOEXCEPT + { + return hr == __HRESULT_FROM_WIN32(ERROR_MORE_DATA); + } + + // Access rights for opening registry keys. See https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights. + enum class key_access + { + // Open key for reading. + read, + + // Open key for reading and writing. Equivalent to KEY_ALL_ACCESS. + readwrite, + }; + + namespace reg_view_details + { + constexpr DWORD get_value_flags_from_value_type(DWORD type) WI_NOEXCEPT + { + switch (type) + { + case REG_DWORD: + return RRF_RT_REG_DWORD; + case REG_QWORD: + return RRF_RT_REG_QWORD; + case REG_SZ: + return RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ | RRF_NOEXPAND; + case REG_EXPAND_SZ: + return RRF_RT_REG_SZ | RRF_RT_REG_EXPAND_SZ; + case REG_MULTI_SZ: + return RRF_RT_REG_MULTI_SZ; + case REG_BINARY: + return RRF_RT_REG_BINARY; + // the caller can directly specify their own flags if they need to + default: + return type; + } + } + + constexpr DWORD get_access_flags(key_access access) WI_NOEXCEPT + { + switch (access) + { + case key_access::read: + return KEY_READ; + case key_access::readwrite: + return KEY_ALL_ACCESS; + } + FAIL_FAST(); + } + + /** + * \brief A utility function that walks a contiguous wchar_t container looking for strings within a multi-string + * \tparam InputIt An iterator type that reference a container that holds wchar_t characters to translate into individual strings + * \tparam Fn A callback function to be called each time a string is found - given the [begin, end] iterators referencing the found string + * \param first An iterator referencing to the beginning of the target container (like a std::begin iterator) + * \param last An iterator referencing one-past-the-end of the target container (like a std::end iterator) + * \param func A callback function to be called each time a string is found - given the [begin, end] iterators referencing the found string + */ + template + void walk_multistring(const InputIt& first, const InputIt& last, Fn func) + { + auto current = first; + const auto end_iterator = last; + const auto last_null = (end_iterator - 1); + while (current != end_iterator) + { + // hand rolling ::std::find(current, end_iterator, L'\0'); + // as this may be called when isn't available + auto next = current; + while (next != end_iterator && *next != L'\0') + { + ++next; + } + + if (next != end_iterator) + { + // don't add an empty string for the final 2nd-null-terminator + if (next != last_null) + { + // call the function provided with the [begin, end] pair referencing a string found + func(current, next); + } + current = next + 1; + } + else + { + current = next; + } + } + } + +#if defined(_VECTOR_) && defined(_STRING_) && defined(WIL_ENABLE_EXCEPTIONS) + /** + * \brief A translation function taking iterators referencing std::wstring objects and returns a corresponding std::vector to be written to a MULTI_SZ registry value + * The translation follows the rules for how MULTI_SZ registry values should be formatted, notably how null characters should be embedded within the returned vector + * \tparam InputIt An iterator type that references a container that holds std::wstring objects to translate into a wchar_t buffer + * \param first An iterator referencing to the beginning of the target container (like a std::begin iterator) + * \param last An iterator referencing one-past-the-end of the target container (like a std::end iterator) + * \return A std::vector with the raw wchar_t buffer of bytes prepared to write to a MULTI_SZ registry value + */ + template + ::std::vector get_multistring_from_wstrings(const InputIt& first, const InputIt& last) + { + ::std::vector multistring; + + if (first == last) + { + multistring.push_back(L'\0'); + multistring.push_back(L'\0'); + return multistring; + } + + for (const auto& wstr : ::wil::make_range(first, last)) + { + multistring.insert(multistring.end(), ::std::begin(wstr), ::std::end(wstr)); + multistring.push_back(L'\0'); + } + + // double-null-terminate the last string + multistring.push_back(L'\0'); + return multistring; + } + + /** + * \brief A translation function taking iterators referencing wchar_t characters and returns extracted individual std::wstring objects + * The translation follows the rules for how MULTI_SZ registry value can be formatted, notably with embedded null characters + * Note that this conversion avoids returning empty std::wstring objects even though the input may contain contiguous null wchar_t values + * \tparam InputIt An iterator type that reference a container that holds wchar_t characters to translate into individual strings + * \param first An iterator referencing to the beginning of the target container (like a std::begin iterator) + * \param last An iterator referencing one-past-the-end of the target container (like a std::end iterator) + * \return A std::vector of the extracted strings from the input container of wchar_t characters + */ + template + ::std::vector<::std::wstring> get_wstring_vector_from_multistring(const InputIt& first, const InputIt& last) + { + if (last - first < 3) + { + // it doesn't have the required 2 terminating null characters - return an empty string + return ::std::vector<::std::wstring>(1); + } + + ::std::vector<::std::wstring> strings; + walk_multistring(first, last, [&](const InputIt& string_first, const InputIt& string_last) + { + strings.emplace_back(string_first, string_last); + } + ); + return strings; + } +#endif // #if defined(_VECTOR_) && defined(_STRING_) && defined(WIL_ENABLE_EXCEPTIONS) + +#if defined(__WIL_OBJBASE_H_) + template + void get_multistring_bytearray_from_strings_nothrow(const PCWSTR data[C], ::wil::unique_cotaskmem_array_ptr& multistring) WI_NOEXCEPT + { + constexpr uint8_t nullTermination[2]{ 0x00, 0x00 }; + + size_t total_array_length_bytes = 0; + for (size_t i = 0; i < C; ++i) + { + total_array_length_bytes += wcslen(data[i]) * sizeof(wchar_t); + total_array_length_bytes += sizeof(wchar_t); // plus one for the null-terminator + } + total_array_length_bytes += sizeof(wchar_t); // plus one for the ending double-null-terminator + + *multistring.addressof() = static_cast(::CoTaskMemAlloc(total_array_length_bytes)); + if (!multistring.get()) + { + multistring.reset(); + return; + } + *multistring.size_address() = total_array_length_bytes; + + size_t array_offset = 0; + for (size_t i = 0; i < C; ++i) + { + const auto string_length_bytes = wcslen(data[i]) * sizeof(wchar_t); + memcpy(multistring.get() + array_offset, data[i], string_length_bytes); + array_offset += string_length_bytes; + + static_assert(sizeof(nullTermination) == sizeof(wchar_t), "null terminator must be a wchar"); + memcpy(multistring.get() + array_offset, nullTermination, sizeof(nullTermination)); + array_offset += sizeof(nullTermination); + } + + // double-null-terminate the last string + memcpy(multistring.get() + array_offset, nullTermination, sizeof(nullTermination)); + } + + /** + * \brief A translation function taking iterators referencing wchar_t characters and returns extracted individual wil::unique_cotaskmem_string objects + * The translation follows the rules for how MULTI_SZ registry value can be formatted, notably with embedded null characters + * Note that this conversion avoids returning empty wil::unique_cotaskmem_string objects even though the input may contain contiguous null wchar_t values + * \tparam InputIt An iterator type that reference a container that holds wchar_t characters to translate into individual strings + * \param first An iterator referencing to the beginning of the target container (like a std::begin iterator) + * \param last An iterator referencing one-past-the-end of the target container (like a std::end iterator) + * \param cotaskmem_array The [out] wil::unique_cotaskmem_array_ptr to contain the array of strings + * A wil::unique_cotaskmem_array_ptr of the extracted strings from the input container of wchar_t characters + * An empty wil::unique_cotaskmem_array_ptr should be translated as out-of-memory as there should always be at least one wil::unique_cotaskmem_string + */ + template + void get_cotaskmemstring_array_from_multistring_nothrow(const InputIt& first, const InputIt& last, ::wil::unique_cotaskmem_array_ptr<::wil::unique_cotaskmem_string>& cotaskmem_array) WI_NOEXCEPT + { + if (last - first < 3) + { + // it doesn't have the required 2 terminating null characters - return an empty string + *cotaskmem_array.addressof() = static_cast(::CoTaskMemAlloc(sizeof(PWSTR) * 1)); + if (cotaskmem_array) + { + auto new_string = ::wil::make_cotaskmem_string_nothrow(L""); + if (new_string) + { + *cotaskmem_array.size_address() = 1; + cotaskmem_array[0] = new_string.release(); + } + else + { + // oom will return an empty array + cotaskmem_array.reset(); + } + } + else + { + // oom will return an empty array + cotaskmem_array.reset(); + } + return; + } + + // we must first count the # of strings for the array + size_t arraySize = 0; + walk_multistring(first, last, [&](const InputIt&, const InputIt&) + { + ++arraySize; + } + ); + + // allocate the array size necessary to hold all the unique_cotaskmem_strings + *cotaskmem_array.addressof() = static_cast(::CoTaskMemAlloc(sizeof(PWSTR) * arraySize)); + if (!cotaskmem_array) + { + // oom will return an empty array + cotaskmem_array.reset(); + return; + } + + *cotaskmem_array.size_address() = arraySize; + ZeroMemory(cotaskmem_array.data(), sizeof(PWSTR) * arraySize); + + size_t arrayOffset = 0; + walk_multistring(first, last, [&](const InputIt& string_first, const InputIt& string_last) + { + FAIL_FAST_IF(arrayOffset >= arraySize); + const auto stringSize = string_last - string_first; + auto new_string = ::wil::make_cotaskmem_string_nothrow(&(*string_first), stringSize); + if (!new_string) + { + // oom will return an empty array + cotaskmem_array.reset(); + return; + } + cotaskmem_array[arrayOffset] = new_string.release(); + ++arrayOffset; + } + ); + } +#endif // #if defined(__WIL_OBJBASE_H_) + + namespace reg_value_type_info + { + // supports_prepare_buffer is used to determine if the input buffer to read a registry value should be prepared + // before the first call to the registry read API + template + constexpr bool supports_prepare_buffer() WI_NOEXCEPT + { + return false; + } + template + HRESULT prepare_buffer(T&) WI_NOEXCEPT + { + // no-op in the default case + return S_OK; + } + + // supports_resize_buffer is used to determine if the input buffer to read a registry value can be resized + // for those cases if the error from the registry read API indicates it needs a larger buffer + template + constexpr bool supports_resize_buffer() WI_NOEXCEPT + { + return false; + } + template + constexpr HRESULT resize_buffer(T&, DWORD) WI_NOEXCEPT + { + return E_NOTIMPL; + } + + // supports_trim_buffer is used to determine if the input buffer to read a registry value must be trimmed + // after the registry read API has successfully written into the supplied buffer + // note that currently only std::wstring requires this as it cannot have embedded nulls + template + constexpr bool supports_trim_buffer() WI_NOEXCEPT + { + return false; + } + template + constexpr void trim_buffer(T&) WI_NOEXCEPT + { + } + + constexpr void* get_buffer(const int32_t& value) WI_NOEXCEPT + { + return const_cast(&value); + } + + constexpr DWORD get_buffer_size_bytes(int32_t) WI_NOEXCEPT + { + return static_cast(sizeof(int32_t)); + } + + constexpr void* get_buffer(const uint32_t& value) WI_NOEXCEPT + { + return const_cast(&value); + } + + constexpr DWORD get_buffer_size_bytes(uint32_t) WI_NOEXCEPT + { + return static_cast(sizeof(uint32_t)); + } + + constexpr void* get_buffer(const long& value) WI_NOEXCEPT + { + return const_cast(&value); + } + + constexpr DWORD get_buffer_size_bytes(long) WI_NOEXCEPT + { + return static_cast(sizeof(long)); + } + + constexpr void* get_buffer(const unsigned long& value) WI_NOEXCEPT + { + return const_cast(&value); + } + + constexpr DWORD get_buffer_size_bytes(unsigned long) WI_NOEXCEPT + { + return static_cast(sizeof(unsigned long)); + } + + constexpr void* get_buffer(const int64_t& value) WI_NOEXCEPT + { + return const_cast(&value); + } + + constexpr DWORD get_buffer_size_bytes(int64_t) WI_NOEXCEPT + { + return static_cast(sizeof(int64_t)); + } + + constexpr void* get_buffer(const uint64_t& value) WI_NOEXCEPT + { + return const_cast(&value); + } + + constexpr DWORD get_buffer_size_bytes(uint64_t) WI_NOEXCEPT + { + return static_cast(sizeof(uint64_t)); + } + + constexpr void* get_buffer(PCWSTR value) WI_NOEXCEPT + { + return const_cast(value); + } + + inline DWORD get_buffer_size_bytes(PCWSTR value) WI_NOEXCEPT + { + if (!value) + { + return 0; + } + // including the last null buffer space in the returned buffer-size-bytes + // as the registry API we call guarantees null termination + return static_cast((::wcslen(value) + 1) * sizeof(wchar_t)); + } + +#if defined(_VECTOR_) && defined(WIL_ENABLE_EXCEPTIONS) + inline void* get_buffer(const ::std::vector& buffer) WI_NOEXCEPT + { + return const_cast(buffer.data()); + } + + inline DWORD get_buffer_size_bytes(const ::std::vector& value) WI_NOEXCEPT + { + return static_cast(value.size()); + } + + template <> + constexpr bool supports_prepare_buffer<::std::vector>() WI_NOEXCEPT + { + return true; + } + inline HRESULT prepare_buffer(::std::vector& value) WI_NOEXCEPT try + { + // resize the initial vector to at least 1 byte + // this is needed so we can detect when the registry value exists + // but the value has zero-bytes + if (value.empty()) + { + value.resize(1); + } + // zero out the buffer if pre-allocated + for (auto& string_char : value) + { + string_char = 0x00; + } + return S_OK; + } + CATCH_RETURN(); + + template <> + constexpr bool supports_resize_buffer<::std::vector>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::std::vector& buffer, DWORD byteSize) WI_NOEXCEPT try + { + buffer.resize(byteSize); + return S_OK; + } + CATCH_RETURN(); + + // std::vector does not implement resize_buffer + // because these support functions are only needed for set_value + // from the return of get_multistring_from_wstrings + inline void* get_buffer(const ::std::vector& value) WI_NOEXCEPT + { + return const_cast(value.data()); + } + + inline DWORD get_buffer_size_bytes(const ::std::vector& value) WI_NOEXCEPT + { + return static_cast(value.size()) * sizeof(wchar_t); + } + + template <> + constexpr bool supports_prepare_buffer<::std::vector>() WI_NOEXCEPT + { + return true; + } + inline HRESULT prepare_buffer(::std::vector& value) WI_NOEXCEPT + { + // zero out the buffer if pre-allocated + for (auto& string_char : value) + { + string_char = L'\0'; + } + return S_OK; + } +#endif // #if defined(_VECTOR_) && defined(WIL_ENABLE_EXCEPTIONS) + +#if defined(_STRING_) && defined(WIL_ENABLE_EXCEPTIONS) + inline void* get_buffer(const ::std::wstring& string) WI_NOEXCEPT + { + return const_cast(string.data()); + } + + inline DWORD get_buffer_size_bytes(const ::std::wstring& string) WI_NOEXCEPT + { + // including the last null buffer space in the returned buffer-size-bytes + // as the registry API we call guarantees null termination + return static_cast((string.size() + 1) * sizeof(wchar_t)); + } + + template <> + constexpr bool supports_prepare_buffer<::std::wstring>() WI_NOEXCEPT + { + return true; + } + inline HRESULT prepare_buffer(::std::wstring& string) WI_NOEXCEPT + { + // zero out the buffer if pre-allocated + for (auto& string_char : string) + { + string_char = L'\0'; + } + return S_OK; + } + + template <> + constexpr bool supports_resize_buffer<::std::wstring>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::std::wstring& string, DWORD byteSize) WI_NOEXCEPT try + { + string.resize(byteSize / sizeof(wchar_t)); + return S_OK; + } + CATCH_RETURN(); + + template <> + constexpr bool supports_trim_buffer<::std::wstring>() WI_NOEXCEPT + { + return true; + } + inline void trim_buffer(::std::wstring& buffer) WI_NOEXCEPT + { + // remove any embedded null characters + const auto offset = buffer.find_first_of(L'\0'); + if (offset != ::std::wstring::npos) + { + buffer.resize(offset); + } + } +#endif // #if defined(_STRING_) && defined(WIL_ENABLE_EXCEPTIONS) + +#if defined(__WIL_OLEAUTO_H_) + inline void* get_buffer(const BSTR& value) WI_NOEXCEPT + { + return value; + } + + inline DWORD get_buffer_size_bytes(const BSTR& value) WI_NOEXCEPT + { + auto length = ::SysStringLen(value); + if (length > 0) + { + // SysStringLen does not count the null-terminator + // including the last null buffer space in the returned buffer-size-bytes + // as the registry API we call guarantees null termination + length += 1; + } + return length * sizeof(wchar_t); + } + + template <> + constexpr bool supports_prepare_buffer() WI_NOEXCEPT + { + return true; + } + inline HRESULT prepare_buffer(const BSTR& value) WI_NOEXCEPT + { + if (value) + { + // zero out the buffer if pre-allocated + for (auto& string_char : ::wil::make_range(value, get_buffer_size_bytes(value) / sizeof(WCHAR))) + { + string_char = L'\0'; + } + } + return S_OK; + } + + template <> + constexpr bool supports_resize_buffer() WI_NOEXCEPT + { + return true; + } + // transferringOwnership is only set to false if this is a 'shallow' copy of the BSTR + // and the caller maintained ownership of the original BSTR. + inline HRESULT resize_buffer(BSTR& string, DWORD byteSize, bool transferringOwnership = true) WI_NOEXCEPT + { + // convert bytes to length (number of WCHAR's) + DWORD length = byteSize / sizeof(WCHAR); + // SysAllocStringLen adds a null, so subtract a wchar_t from the input length + length = length > 0 ? length - 1 : length; + const BSTR new_bstr{ ::SysAllocStringLen(string, length) }; + RETURN_IF_NULL_ALLOC(new_bstr); + + // if not transferring ownership, the caller will still own the original BSTR + if (transferringOwnership) + { + ::SysFreeString(string); + } + + string = new_bstr; + return S_OK; + } + + inline void* get_buffer(const ::wil::unique_bstr& value) WI_NOEXCEPT + { + return value.get(); + } + + inline DWORD get_buffer_size_bytes(const ::wil::unique_bstr& value) WI_NOEXCEPT + { + return get_buffer_size_bytes(value.get()); + } + + template <> + constexpr bool supports_prepare_buffer<::wil::unique_bstr>() WI_NOEXCEPT + { + return true; + } + inline HRESULT prepare_buffer(const ::wil::unique_bstr& value) WI_NOEXCEPT + { + if (value) + { + // zero out the buffer if pre-allocated + for (auto& string_char : ::wil::make_range(value.get(), get_buffer_size_bytes(value) / sizeof(WCHAR))) + { + string_char = L'\0'; + } + } + return S_OK; + } + + template<> + constexpr bool supports_resize_buffer<::wil::unique_bstr>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::wil::unique_bstr& string, DWORD byteSize) WI_NOEXCEPT + { + BSTR temp_bstr = string.get(); + + // not transferring ownership of the BSTR within 'string' to resize_buffer() + // resize_buffer() will overwrite temp_bstr with a newly-allocated BSTR + constexpr bool transferringOwnership = false; + RETURN_IF_FAILED(resize_buffer(temp_bstr, byteSize, transferringOwnership)); + + // if succeeded in creating a new BSTR, move ownership of the new BSTR into string + string.reset(temp_bstr); + return S_OK; + } +#endif // #if defined(__WIL_OLEAUTO_H_) + +#if defined(__WIL_OLEAUTO_H_STL) + inline void* get_buffer(const ::wil::shared_bstr& value) WI_NOEXCEPT + { + return value.get(); + } + + inline DWORD get_buffer_size_bytes(const ::wil::shared_bstr& value) WI_NOEXCEPT + { + return get_buffer_size_bytes(value.get()); + } + + template <> + constexpr bool supports_prepare_buffer<::wil::shared_bstr>() WI_NOEXCEPT + { + return true; + } + inline HRESULT prepare_buffer(const ::wil::shared_bstr& value) WI_NOEXCEPT + { + if (value) + { + // zero out the buffer if pre-allocated + for (auto& string_char : ::wil::make_range(value.get(), get_buffer_size_bytes(value) / sizeof(WCHAR))) + { + string_char = L'\0'; + } + } + return S_OK; + } + + template<> + constexpr bool supports_resize_buffer<::wil::shared_bstr>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::wil::shared_bstr& string, DWORD byteSize) WI_NOEXCEPT + { + BSTR temp_bstr = string.get(); + + // not transferring ownership of the BSTR within 'string' to resize_buffer() + // resize_buffer() will overwrite temp_bstr with a newly-allocated BSTR + constexpr bool transferringOwnership = false; + RETURN_IF_FAILED(resize_buffer(temp_bstr, byteSize, transferringOwnership)); + + // if succeeded in creating a new BSTR, move ownership of the new BSTR into string + string.reset(temp_bstr); + return S_OK; + } +#endif // #if defined(__WIL_OLEAUTO_H_STL) + +#if defined(__WIL_OBJBASE_H_) + inline void* get_buffer(const ::wil::unique_cotaskmem_string& value) WI_NOEXCEPT + { + return value.get(); + } + + constexpr DWORD get_buffer_size_bytes(const ::wil::unique_cotaskmem_string&) WI_NOEXCEPT + { + // wil::unique_cotaskmem_string does not intrinsically track its internal buffer size + // thus the caller must track the buffer size it requested to be allocated + return 0; + } + + template<> + constexpr bool supports_resize_buffer<::wil::unique_cotaskmem_string>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::wil::unique_cotaskmem_string& string, DWORD byteSize) WI_NOEXCEPT + { + // convert bytes to length (number of WCHAR's) + size_t length = byteSize / sizeof(wchar_t); + // ::wil::make_unique_string_nothrow adds one to the length when it allocates, so subtracting 1 from the input length + length = length > 0 ? length - 1 : length; + auto new_string = ::wil::make_unique_string_nothrow<::wil::unique_cotaskmem_string>(string.get(), length); + RETURN_IF_NULL_ALLOC(new_string.get()); + + string = ::wistd::move(new_string); + return S_OK; + } + + inline void* get_buffer(const ::wil::unique_cotaskmem_array_ptr& value) WI_NOEXCEPT + { + return value.get(); + } + + inline DWORD get_buffer_size_bytes(const ::wil::unique_cotaskmem_array_ptr& value) WI_NOEXCEPT + { + return static_cast(value.size()); + } + + template<> + constexpr bool supports_resize_buffer<::wil::unique_cotaskmem_array_ptr>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::wil::unique_cotaskmem_array_ptr& arrayValue, DWORD byteSize) WI_NOEXCEPT + { + ::wil::unique_cotaskmem_array_ptr tempValue; + *tempValue.addressof() = static_cast(::CoTaskMemAlloc(byteSize)); + RETURN_IF_NULL_ALLOC(tempValue.get()); + *tempValue.size_address() = byteSize; + + const auto bytesToCopy = arrayValue.size() < byteSize ? arrayValue.size() : byteSize; + CopyMemory(tempValue.get(), arrayValue.get(), bytesToCopy); + + arrayValue = ::wistd::move(tempValue); + return S_OK; + } +#endif // #if defined(__WIL_OBJBASE_H_) + +#if defined(__WIL_OBJBASE_H_STL) + inline void* get_buffer(const ::wil::shared_cotaskmem_string& value) WI_NOEXCEPT + { + return value.get(); + } + + constexpr DWORD get_buffer_size_bytes(const ::wil::shared_cotaskmem_string&) WI_NOEXCEPT + { + // wil::shared_cotaskmem_string does not intrinsically track its internal buffer size + // thus the caller must track the buffer size it requested to be allocated + return 0; + } + + template<> + constexpr bool supports_resize_buffer<::wil::shared_cotaskmem_string>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::wil::shared_cotaskmem_string& string, DWORD byteSize) WI_NOEXCEPT + { + // convert bytes to length (number of WCHAR's) + size_t length = byteSize / sizeof(wchar_t); + // ::wil::make_unique_string_nothrow adds one to the length when it allocates, so subtracting 1 from the input length + length = length > 0 ? length - 1 : length; + auto new_string = ::wil::make_unique_string_nothrow<::wil::unique_cotaskmem_string>(string.get(), length); + RETURN_IF_NULL_ALLOC(new_string.get()); + + string = ::wistd::move(new_string); + return S_OK; + } +#endif // #if defined(__WIL_OBJBASE_H_STL) + + inline void* get_buffer(const ::wil::unique_process_heap_string& value) WI_NOEXCEPT + { + return value.get(); + } + + constexpr DWORD get_buffer_size_bytes(const ::wil::unique_process_heap_string&) WI_NOEXCEPT + { + // wil::unique_process_heap_string does not intrinsically track its internal buffer size + // thus the caller must track the buffer size it requested to be allocated + return 0; + } + + template<> + constexpr bool supports_resize_buffer<::wil::unique_process_heap_string>() WI_NOEXCEPT + { + return true; + } + inline HRESULT resize_buffer(::wil::unique_process_heap_string& string, DWORD byteSize) WI_NOEXCEPT + { + // convert bytes to length (number of WCHAR's) + size_t length = byteSize / sizeof(wchar_t); + // ::wil::make_unique_string_nothrow adds one to the length when it allocates, so subtracting 1 from the input length + length = length > 0 ? length - 1 : length; + auto new_string = ::wil::make_unique_string_nothrow<::wil::unique_process_heap_string>(string.get(), length); + RETURN_IF_NULL_ALLOC(new_string.get()); + + string = ::wistd::move(new_string); + return S_OK; + } + + // constexpr expressions to determining the get* and set* registry value types + // for all supported types T to read/write values + template + DWORD get_value_type() WI_NOEXCEPT + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for get_value_type"); + } + + template + DWORD set_value_type() WI_NOEXCEPT + { + static_assert(sizeof(T) != sizeof(T), "Unsupported type for set_value_type"); + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_DWORD); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_DWORD; + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_DWORD); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_DWORD; + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_DWORD); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_DWORD; + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_DWORD); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_DWORD; + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_QWORD); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_QWORD; + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_QWORD); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_QWORD; + } + + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } + +#if defined(_STRING_) && defined(WIL_ENABLE_EXCEPTIONS) + template <> + constexpr DWORD get_value_type<::std::wstring>() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } +#endif // #if defined(_STRING_) && defined(WIL_ENABLE_EXCEPTIONS) + +#if defined(__WIL_OLEAUTO_H_) + template <> + constexpr DWORD get_value_type() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + template <> + constexpr DWORD get_value_type<::wil::unique_bstr>() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } + + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } +#endif // #if defined(__WIL_OLEAUTO_H_) + +#if defined(__WIL_OLEAUTO_H_STL) + + template <> + constexpr DWORD get_value_type<::wil::shared_bstr>() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } +#endif // #if defined(__WIL_OLEAUTO_H_STL) + +#if defined(__WIL_OBJBASE_H_) + template <> + constexpr DWORD get_value_type<::wil::unique_cotaskmem_string>() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } +#endif // defined(__WIL_OBJBASE_H_) + +#if defined(__WIL_OBJBASE_H_STL) + template <> + constexpr DWORD get_value_type<::wil::shared_cotaskmem_string>() WI_NOEXCEPT + { + return get_value_flags_from_value_type(REG_SZ); + } + + template <> + constexpr DWORD set_value_type() WI_NOEXCEPT + { + return REG_SZ; + } +#endif // #if defined(__WIL_OBJBASE_H_STL) + } + + template + class reg_view_t + { + public: + explicit reg_view_t(HKEY key) WI_NOEXCEPT : m_key(key) + { + } + ~reg_view_t() WI_NOEXCEPT = default; + reg_view_t(const reg_view_t&) = delete; + reg_view_t& operator=(const reg_view_t&) = delete; + reg_view_t(reg_view_t&&) = delete; + reg_view_t& operator=(reg_view_t&&) = delete; + + typename err_policy::result open_key(_In_opt_ _In_opt_ PCWSTR subKey, _Out_ HKEY* hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) const + { + constexpr DWORD zero_options{ 0 }; + return err_policy::HResult(HRESULT_FROM_WIN32(::RegOpenKeyExW(m_key, subKey, zero_options, get_access_flags(access), hkey))); + } + + typename err_policy::result create_key(PCWSTR subKey, _Out_ HKEY* hkey, ::wil::reg::key_access access = ::wil::reg::key_access::read) const + { + *hkey = nullptr; + + constexpr DWORD zero_reserved{ 0 }; + constexpr PWSTR null_class{ nullptr }; + constexpr DWORD zero_options{ 0 }; + constexpr SECURITY_ATTRIBUTES* null_security_attributes{ nullptr }; + DWORD disposition{ 0 }; + return err_policy::HResult(HRESULT_FROM_WIN32( + ::RegCreateKeyExW(m_key, subKey, zero_reserved, null_class, zero_options, get_access_flags(access), null_security_attributes, hkey, &disposition))); + } + + typename err_policy::result delete_tree(_In_opt_ PCWSTR sub_key) const + { + auto hr = HRESULT_FROM_WIN32(::RegDeleteTreeW(m_key, sub_key)); + if (::wil::reg::is_registry_not_found(hr)) + { + hr = S_OK; + } + return err_policy::HResult(hr); + } + + typename err_policy::result delete_value(_In_opt_ PCWSTR value_name) const + { + return err_policy::HResult(HRESULT_FROM_WIN32(::RegDeleteValueW(m_key, value_name))); + } + + template + typename err_policy::result get_value(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, R& return_value, DWORD type = reg_value_type_info::get_value_type()) const + { + return get_value_with_type(subkey, value_name, return_value, type); + } + + // typename D supports unsigned 32-bit values; i.e. allows the caller to pass a DWORD* as well as uint32_t* + template || wistd::is_same_v>* = nullptr> + typename err_policy::result get_value_char_array(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, WCHAR(&return_value)[Length], DWORD type, _Out_opt_ DwordType * requiredBytes) const + { + constexpr DwordType zero_value{ 0ul }; + ::wil::assign_to_opt_param(requiredBytes, zero_value); + DWORD data_size_bytes{ Length * sizeof(WCHAR) }; + const auto hr = HRESULT_FROM_WIN32( + ::RegGetValueW(m_key, subkey, value_name, ::wil::reg::reg_view_details::get_value_flags_from_value_type(type), nullptr, return_value, &data_size_bytes)); + if (SUCCEEDED(hr) || ::wil::reg::is_registry_buffer_too_small(hr)) + { + const DwordType updated_value{ data_size_bytes }; + ::wil::assign_to_opt_param(requiredBytes, updated_value); + } + return err_policy::HResult(hr); + } + +#if defined (_OPTIONAL_) && defined(__cpp_lib_optional) + // intended for err_exception_policy as err_returncode_policy will not get an error code + template + ::std::optional try_get_value(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, DWORD type = reg_value_type_info::get_value_type()) const + { + R value{}; + const auto hr = get_value_with_type(subkey, value_name, value, type); + if (SUCCEEDED(hr)) + { + return ::std::optional(::wistd::move(value)); + } + + if (::wil::reg::is_registry_not_found(hr)) + { + return ::std::nullopt; + } + + // throw if exception policy + err_policy::HResult(hr); + return ::std::nullopt; + } +#endif // #if defined (_OPTIONAL_) && defined(__cpp_lib_optional) + + template + typename err_policy::result set_value(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const R& value, DWORD type = reg_value_type_info::set_value_type()) const + { + return set_value_with_type(subkey, value_name, value, type); + } + + private: + const HKEY m_key{}; + + template + typename err_policy::result set_value_with_type(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, const R& value, DWORD type) const + { + return err_policy::HResult(HRESULT_FROM_WIN32( + ::RegSetKeyValueW( + m_key, + subkey, + value_name, + type, + static_cast(reg_value_type_info::get_buffer(value)), + reg_value_type_info::get_buffer_size_bytes(value)))); + } + + template + typename get_value_with_type_policy::result get_value_with_type(_In_opt_ PCWSTR subkey, _In_opt_ PCWSTR value_name, R& return_value, DWORD type = reg_value_type_info::get_value_type()) const + { + if +#if defined(__cpp_if_constexpr) + constexpr +#endif + (reg_value_type_info::supports_prepare_buffer()) + + { + const auto prepare_buffer_hr = reg_value_type_info::prepare_buffer(return_value); + if (FAILED(prepare_buffer_hr)) + { + return get_value_with_type_policy::HResult(prepare_buffer_hr); + } + } + + // get_buffer_size_bytes should include the null terminator when used for strings. + DWORD bytes_allocated{ reg_value_type_info::get_buffer_size_bytes(return_value) }; + HRESULT get_value_hresult = S_OK; + for (;;) + { + constexpr DWORD* null_type{ nullptr }; + DWORD data_size_bytes{ bytes_allocated }; + get_value_hresult = HRESULT_FROM_WIN32(::RegGetValueW( + m_key, + subkey, + value_name, + get_value_flags_from_value_type(type), + null_type, + reg_value_type_info::get_buffer(return_value), + &data_size_bytes)); + + // some return types we can grow as needed - e.g. when writing to a std::wstring + // only compile and resize_buffer for those types that support dynamically growing the buffer + if +#if defined(__cpp_if_constexpr) + constexpr +#endif + (reg_value_type_info::supports_resize_buffer()) + { + // Attempt to grow the buffer with the data_size_bytes returned from GetRegValueW + // GetRegValueW will indicate the caller allocate the returned number of bytes in one of two cases: + // 1. returns ERROR_MORE_DATA + // 2. returns ERROR_SUCCESS when we gave it a nullptr for the out buffer + const bool shouldReallocate = + (::wil::reg::is_registry_buffer_too_small(get_value_hresult)) || + (SUCCEEDED(get_value_hresult) && (reg_value_type_info::get_buffer(return_value) == nullptr) && (data_size_bytes > 0)); + if (shouldReallocate) + { + // verify if resize_buffer succeeded allocation + const auto resize_buffer_hr = reg_value_type_info::resize_buffer(return_value, data_size_bytes); + if (FAILED(resize_buffer_hr)) + { + // if resize fails, return this error back to the caller + return get_value_with_type_policy::HResult(resize_buffer_hr); + } + + // if it resize succeeds, continue the for loop to try again + bytes_allocated = data_size_bytes; + continue; + } + + // if the RegGetValueW call succeeded with a non-null [out] param, + // and the type supports resize_buffer + // and the bytes we allocated don't match data_size_bytes returned from RegGetValueW + // resize the buffer to match what RegGetValueW returned + if (SUCCEEDED(get_value_hresult)) + { + const auto current_byte_size = reg_value_type_info::get_buffer_size_bytes(return_value); + if (current_byte_size != data_size_bytes) + { + // verify if resize_buffer succeeded allocation + const auto resize_buffer_hr = reg_value_type_info::resize_buffer(return_value, data_size_bytes); + if (FAILED(resize_buffer_hr)) + { + // if resize fails, return this error back to the caller + return get_value_with_type_policy::HResult(resize_buffer_hr); + } + } + } + } + + // we don't need to reallocate and retry the call to RegGetValueW so breaking out of the loop + break; + } + + // some types (generally string types) require trimming its internal buffer after RegGetValueW successfully wrote into its buffer + if +#if defined(__cpp_if_constexpr) + constexpr +#endif + (reg_value_type_info::supports_trim_buffer()) + + { + if (SUCCEEDED(get_value_hresult)) + { + reg_value_type_info::trim_buffer(return_value); + } + } + + return get_value_with_type_policy::HResult(get_value_hresult); + } + }; + + using reg_view_nothrow = ::wil::reg::reg_view_details::reg_view_t<::wil::err_returncode_policy>; +#if defined(WIL_ENABLE_EXCEPTIONS) + using reg_view = ::wil::reg::reg_view_details::reg_view_t<::wil::err_exception_policy>; +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) + } // namespace reg_view_details + + namespace reg_iterator_details + { + constexpr uint32_t iterator_end_offset = 0xffffffff; + constexpr size_t iterator_default_buffer_length = 16; + + // function overloads to allow *_enumerator objects to be constructed from all 3 types of HKEY representatives + inline HKEY get_hkey(HKEY h) WI_NOEXCEPT + { + return h; + } + inline HKEY get_hkey(const ::wil::unique_hkey& h) WI_NOEXCEPT + { + return h.get(); + } +#if defined(__WIL_WINREG_STL) + inline HKEY get_hkey(const ::wil::shared_hkey& h) WI_NOEXCEPT + { + return h.get(); + } +#endif // #if defined(__WIL_WINREG_STL) + +#if defined(WIL_ENABLE_EXCEPTIONS) && defined(_STRING_) + // overloads for some of the below string functions - specific for std::wstring + // these overloads must be declared before the template functions below, as some of those template functions + // reference these overload functions + inline void clear_name(::std::wstring& name, size_t) WI_NOEXCEPT + { + name.assign(name.size(), L'\0'); + } + inline ::std::wstring copy_name(const ::std::wstring& str, size_t length) WI_NOEXCEPT + { + try + { + // guarantee that the copied string has the specified internal length + // i.e., the same length assumptions hold when the string is copied + ::std::wstring tempString(length, L'0'); + tempString.assign(str); + return tempString; + } + catch (...) + { + return {}; + } + } + inline bool is_valid(const ::std::wstring& name) WI_NOEXCEPT + { + return !name.empty(); + } +#endif // #if defined(WIL_ENABLE_EXCEPTIONS) && defined(_STRING_) + + // string manipulation functions needed for iterator functions + template + PWSTR address_of_name(const T& name) WI_NOEXCEPT + { + return static_cast(::wil::reg::reg_view_details::reg_value_type_info::get_buffer(name)); + } + + template + bool is_valid(const T& name) WI_NOEXCEPT + { + return static_cast(address_of_name(name)); + } + + template + bool compare_name(const T& name, PCWSTR comparand) WI_NOEXCEPT + { + if (!is_valid(name) || !comparand) + { + return false; + } + return 0 == wcscmp(address_of_name(name), comparand); + } + + template + void clear_name(const T& name, size_t length) WI_NOEXCEPT + { + if (is_valid(name) && length > 0) + { + memset(address_of_name(name), 0, length * sizeof(wchar_t)); + } + } + + // failure returns zero + template + size_t resize_name(T& name, size_t current_length, size_t new_length) WI_NOEXCEPT + { + if (new_length > current_length) + { + // resize_buffer takes size in bytes + if (FAILED(::wil::reg::reg_view_details::reg_value_type_info::resize_buffer(name, static_cast(new_length * sizeof(wchar_t))))) + { + return 0; + } + return new_length; + } + + // continue to use the existing buffer since the requested length is less than or equals to the current length + clear_name(name, current_length); + return current_length; + } + + template + T copy_name(const T& name, size_t length) WI_NOEXCEPT + { + if (!is_valid(name)) + { + return {}; + + } + return ::wil::make_unique_string_nothrow(address_of_name(name), length); + } + +#if defined(__WIL_OLEAUTO_H_) + // overloads for some of the above string functions - specific for wil::unique_bstr + // these should come after the template functions - as they reference some of those functions + inline size_t resize_name(::wil::unique_bstr& name, size_t current_length, size_t new_length) WI_NOEXCEPT + { + if (new_length > current_length) + { + // SysAllocStringLen adds a null, so subtract a wchar_t from the input length + new_length = new_length > 0 ? new_length - 1 : new_length; + const BSTR new_bstr{ ::SysAllocStringLen(nullptr, static_cast(new_length)) }; + if (!new_bstr) + { + return 0; + } + name.reset(new_bstr); + return new_length; + } + + // continue to use the existing buffer since the requested length is less than or equals to the current length + clear_name(name, current_length); + return current_length; + } + inline ::wil::unique_bstr copy_name(const ::wil::unique_bstr& name, size_t length) WI_NOEXCEPT + { + if (!is_valid(name)) + { + return {}; + } + + // SysAllocStringLen adds a null, so subtract a wchar_t from the input length + length = length > 0 ? length - 1 : length; + return ::wil::unique_bstr{ ::SysAllocStringLen(name.get(), static_cast(length)) }; + } +#endif // #if defined(__WIL_OLEAUTO_H_) + }; + + // forward declaration to allow friend-ing the template iterator class +#if defined(WIL_ENABLE_EXCEPTIONS) + template class iterator_t; +#endif + template + class iterator_nothrow_t; + + // all methods must be noexcept - to be usable with any iterator type (throwing or non-throwing) + template + class key_iterator_data + { + public: + T name{}; + + key_iterator_data(HKEY key = nullptr) WI_NOEXCEPT : m_hkey{ key } + { + } + ~key_iterator_data() WI_NOEXCEPT = default; + + key_iterator_data(const key_iterator_data& rhs) WI_NOEXCEPT + { + // might return null/empty string on failure + name = ::wil::reg::reg_iterator_details::copy_name(rhs.name, rhs.m_name_length); + m_hkey = rhs.m_hkey; + m_index = rhs.m_index; + m_name_length = ::wil::reg::reg_iterator_details::is_valid(name) ? rhs.m_name_length : 0; + } + key_iterator_data& operator=(const key_iterator_data& rhs) WI_NOEXCEPT + { + if (&rhs != this) + { + key_iterator_data temp(rhs); + *this = ::wistd::move(temp); + } + return *this; + } + + key_iterator_data(key_iterator_data&&) WI_NOEXCEPT = default; + key_iterator_data& operator=(key_iterator_data&& rhs) WI_NOEXCEPT = default; + + // Case-sensitive comparison + bool operator==(PCWSTR comparand) const WI_NOEXCEPT + { + return ::wil::reg::reg_iterator_details::compare_name(name, comparand); + } + + private: +#if defined(WIL_ENABLE_EXCEPTIONS) + friend class ::wil::reg::iterator_t; +#endif + friend class ::wil::reg::iterator_nothrow_t; + + bool at_end() const WI_NOEXCEPT + { + return m_index == ::wil::reg::reg_iterator_details::iterator_end_offset; + } + + void make_end_iterator() WI_NOEXCEPT + { + ::wil::reg::reg_iterator_details::clear_name(name, m_name_length); + m_index = ::wil::reg::reg_iterator_details::iterator_end_offset; + } + + bool resize(size_t new_length) WI_NOEXCEPT + { + m_name_length = ::wil::reg::reg_iterator_details::resize_name(name, m_name_length, new_length); + // if failed to resize_name, will return 0 + return m_name_length > 0; + } + + HRESULT enumerate_current_index() WI_NOEXCEPT + { + FAIL_FAST_IF(at_end()); + + for (auto string_length = static_cast(m_name_length);;) + { + if (!resize(string_length)) + { + return E_OUTOFMEMORY; + } + + const auto error = ::RegEnumKeyExW( + m_hkey, // hKey + m_index, // dwIndex + string_length == 0 ? nullptr : ::wil::reg::reg_iterator_details::address_of_name(name), // lpName + &string_length, // lpcchName + nullptr, // lpReserved + nullptr, // lpClass + nullptr, // lpcchClass + nullptr); // lpftLastWriteTime + + if (error == ERROR_SUCCESS) + { + // some types, like std::wstring, cannot have embedded nulls + ::wil::reg::reg_view_details::reg_value_type_info::trim_buffer(name); + break; + } + if (error == ERROR_NO_MORE_ITEMS) + { + make_end_iterator(); + break; + } + if (error == ERROR_MORE_DATA) + { + // resize to iterator_default_buffer_length and try again + string_length += ::wil::reg::reg_iterator_details::iterator_default_buffer_length; + continue; + } + // any other error will fail + RETURN_WIN32(error); + } + return S_OK; + } + + HKEY m_hkey{}; + uint32_t m_index = ::wil::reg::reg_iterator_details::iterator_end_offset; + size_t m_name_length{}; + }; + + // all methods must be noexcept - to be usable with any iterator type (throwing or non-throwing) + template + class value_iterator_data + { + public: + T name{}; + DWORD type = REG_NONE; + + value_iterator_data(HKEY key = nullptr) WI_NOEXCEPT : m_hkey{ key } + { + } + ~value_iterator_data() WI_NOEXCEPT = default; + + value_iterator_data(const value_iterator_data& rhs) WI_NOEXCEPT + { + // might return null/empty string on failure + name = ::wil::reg::reg_iterator_details::copy_name(rhs.name, rhs.m_name_length); + type = rhs.type; + m_hkey = rhs.m_hkey; + m_index = rhs.m_index; + m_name_length = ::wil::reg::reg_iterator_details::is_valid(name) ? rhs.m_name_length : 0; + } + value_iterator_data& operator=(const value_iterator_data& rhs) WI_NOEXCEPT + { + if (&rhs != this) + { + value_iterator_data temp(rhs); + *this = ::wistd::move(temp); + } + return *this; + } + + value_iterator_data(value_iterator_data&&) WI_NOEXCEPT = default; + value_iterator_data& operator=(value_iterator_data&& rhs) WI_NOEXCEPT = default; + + bool at_end() const WI_NOEXCEPT + { + return m_index == ::wil::reg::reg_iterator_details::iterator_end_offset; + } + + private: +#if defined(WIL_ENABLE_EXCEPTIONS) + friend class ::wil::reg::iterator_t; +#endif + friend class ::wil::reg::iterator_nothrow_t; + + void make_end_iterator() WI_NOEXCEPT + { + ::wil::reg::reg_iterator_details::clear_name(name, m_name_length); + m_index = ::wil::reg::reg_iterator_details::iterator_end_offset; + } + + bool resize(size_t new_length) + { + m_name_length = ::wil::reg::reg_iterator_details::resize_name(name, m_name_length, new_length); + // if failed to resize_name, will return 0 + return m_name_length > 0; + } + + HRESULT enumerate_current_index() WI_NOEXCEPT + { + FAIL_FAST_IF(at_end()); + + for (auto string_length = static_cast(m_name_length);;) + { + if (!resize(string_length)) + { + return E_OUTOFMEMORY; + } + + const auto error = ::RegEnumValueW( + m_hkey, // hKey + m_index, // dwIndex + string_length == 0 ? nullptr : ::wil::reg::reg_iterator_details::address_of_name(name), // lpValueName + &string_length, // lpcchValueName + nullptr, // lpReserved + &type, // lpType + nullptr, // lpData + nullptr); // lpcbData + + if (error == ERROR_SUCCESS) + { + // some types, like std::wstring, cannot have embedded nulls + ::wil::reg::reg_view_details::reg_value_type_info::trim_buffer(name); + break; + } + if (error == ERROR_NO_MORE_ITEMS) + { + make_end_iterator(); + break; + } + if (error == ERROR_MORE_DATA) + { + // resize to iterator_default_buffer_length and try again + string_length += ::wil::reg::reg_iterator_details::iterator_default_buffer_length; + continue; + } + + // any other error will fail + RETURN_WIN32(error); + } + return S_OK; + } + + HKEY m_hkey{}; + uint32_t m_index = ::wil::reg::reg_iterator_details::iterator_end_offset; + size_t m_name_length{}; + }; + +#if defined(WIL_ENABLE_EXCEPTIONS) + template + class iterator_t + { + public: + // defining iterator_traits allows STL functions to be used with this iterator class. + // Notice this is a forward_iterator + // - does not support random-access (e.g. vector::iterator) + // - does not support bi-directional access (e.g. list::iterator) +#if defined(_ITERATOR_) + using iterator_category = ::std::forward_iterator_tag; +#endif + using value_type = T; + using difference_type = size_t; + using distance_type = size_t; + using pointer = T*; + using reference = T&; + + iterator_t() WI_NOEXCEPT = default; + ~iterator_t() WI_NOEXCEPT = default; + + iterator_t(HKEY hkey) : m_data(hkey) + { + if (hkey != nullptr) + { + m_data.resize(::wil::reg::reg_iterator_details::iterator_default_buffer_length); + m_data.m_index = 0; + m_data.enumerate_current_index(); + } + } + + iterator_t(const iterator_t&) = default; + iterator_t& operator=(const iterator_t&) = default; + iterator_t(iterator_t&&) WI_NOEXCEPT = default; + iterator_t& operator=(iterator_t&&) WI_NOEXCEPT = default; + + // operator support + const T& operator*() const + { + FAIL_FAST_IF(m_data.at_end()); + return m_data; + } + const T& operator*() + { + FAIL_FAST_IF(m_data.at_end()); + return m_data; + } + const T* operator->() const + { + FAIL_FAST_IF(m_data.at_end()); + return &m_data; + } + const T* operator->() + { + FAIL_FAST_IF(m_data.at_end()); + return &m_data; + } + + bool operator==(const iterator_t& rhs) const WI_NOEXCEPT + { + if (m_data.at_end() || rhs.m_data.at_end()) + { + // if either is not initialized (or end), both must not be initialized (or end) to be equal + return m_data.m_index == rhs.m_data.m_index; + } + return m_data.m_hkey == rhs.m_data.m_hkey && m_data.m_index == rhs.m_data.m_index; + } + + bool operator!=(const iterator_t& rhs) const WI_NOEXCEPT + { + return !(*this == rhs); + } + + // pre-increment + iterator_t& operator++() + { + this->operator +=(1); + return *this; + } + const iterator_t& operator++() const + { + this->operator +=(1); + return *this; + } + + // increment by integer + iterator_t& operator+=(size_t offset) + { + uint32_t newIndex = m_data.m_index + static_cast(offset); + if (newIndex < m_data.m_index) + { + // fail on integer overflow + THROW_HR(E_INVALIDARG); + } + if (newIndex == ::wil::reg::reg_iterator_details::iterator_end_offset) + { + // fail if this creates an end iterator + THROW_HR(E_INVALIDARG); + } + + // iterate by the integer offset + for (size_t count = 0; count < offset; ++count) + { + ++m_data.m_index; + m_data.enumerate_current_index(); + } + return *this; + } + + // not supporting post-increment - which would require copy-construction + iterator_t operator++(int) = delete; + + private: + // container based on the class template type + T m_data{}; + }; +#endif + + template + class iterator_nothrow_t + { + public: + iterator_nothrow_t() WI_NOEXCEPT = default; + ~iterator_nothrow_t() WI_NOEXCEPT = default; + + iterator_nothrow_t(HKEY hkey) WI_NOEXCEPT : m_data(hkey) + { + if (hkey != nullptr) + { + m_data.m_index = 0; + if (!m_data.resize(::wil::reg::reg_iterator_details::iterator_default_buffer_length)) + { + m_last_error = E_OUTOFMEMORY; + } + else + { + m_last_error = m_data.enumerate_current_index(); + } + } + } + + iterator_nothrow_t(const iterator_nothrow_t&) WI_NOEXCEPT = default; + iterator_nothrow_t& operator=(const iterator_nothrow_t&) WI_NOEXCEPT = default; + iterator_nothrow_t(iterator_nothrow_t&&) WI_NOEXCEPT = default; + iterator_nothrow_t& operator=(iterator_nothrow_t&&) WI_NOEXCEPT = default; + + bool at_end() const WI_NOEXCEPT + { + return m_data.at_end(); + } + + HRESULT last_error() const WI_NOEXCEPT + { + return m_last_error; + } + + HRESULT move_next() WI_NOEXCEPT + { + const auto newIndex = m_data.m_index + 1; + if (newIndex < m_data.m_index) + { + // fail on integer overflow + m_last_error = E_INVALIDARG; + } + else if (newIndex == ::wil::reg::reg_iterator_details::iterator_end_offset) + { + // fail if this creates an end iterator + m_last_error = E_INVALIDARG; + } + else + { + m_data.m_index = newIndex; + m_last_error = m_data.enumerate_current_index(); + } + + if (FAILED(m_last_error)) + { + // on failure, set the iterator to an end iterator + m_data.make_end_iterator(); + } + + return m_last_error; + } + + // operator support + const T& operator*() const WI_NOEXCEPT + { + return m_data; + } + const T& operator*() WI_NOEXCEPT + { + return m_data; + } + const T* operator->() const WI_NOEXCEPT + { + return &m_data; + } + const T* operator->() WI_NOEXCEPT + { + return &m_data; + } + bool operator==(const iterator_nothrow_t& rhs) const WI_NOEXCEPT + { + if (m_data.at_end() || rhs.m_data.at_end()) + { + // if either is not initialized (or end), both must not be initialized (or end) to be equal + return m_data.m_index == rhs.m_data.m_index; + } + return m_data.m_hkey == rhs.m_data.m_hkey && m_data.m_index == rhs.m_data.m_index; + } + + bool operator!=(const iterator_nothrow_t& rhs) const WI_NOEXCEPT + { + return !(*this == rhs); + } + + iterator_nothrow_t& operator++() WI_NOEXCEPT + { + move_next(); + return *this; + } + const iterator_nothrow_t& operator++() const WI_NOEXCEPT + { + move_next(); + return *this; + } + + private: + // container based on the class template type + T m_data{}; + HRESULT m_last_error{}; + }; + + } // namespace reg +} // namespace wil +#endif // __WIL_REGISTRY_HELPERS_INCLUDED \ No newline at end of file diff --git a/src/windhawk/shared/libraries/wil/resource.h b/src/windhawk/shared/libraries/wil/resource.h index 5b6a0dd..b45dde4 100644 --- a/src/windhawk/shared/libraries/wil/resource.h +++ b/src/windhawk/shared/libraries/wil/resource.h @@ -1710,6 +1710,7 @@ namespace wil return str_raw_ptr(ua.get()); } +#if !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE) namespace details { // Forward declaration @@ -1760,13 +1761,14 @@ namespace wil static_assert(sizeof...(str) > 0, "attempting to concatenate no strings"); return details::str_build_nothrow(buffer, details::string_maker::get(buffer), str_raw_ptr(str)...); } +#endif // !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE) #ifdef WIL_ENABLE_EXCEPTIONS // Concatenate any number of strings together and store it in an automatically allocated string. template string_type str_concat(arguments&&... args) { - string_type result; + string_type result{}; THROW_IF_FAILED(str_concat_nothrow(result, wistd::forward(args)...)); return result; } @@ -1776,11 +1778,12 @@ namespace wil template string_type str_concat_failfast(arguments&&... args) { - string_type result; + string_type result{}; FAIL_FAST_IF_FAILED(str_concat_nothrow(result, wistd::forward(args)...)); return result; } +#if !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE) namespace details { // Wraps StringCchPrintFExW and stores it in an automatically allocated string. Takes a buffer followed by the same format arguments @@ -1819,7 +1822,7 @@ namespace wil template string_type str_printf(_Printf_format_string_ PCWSTR pszFormat, ...) { - string_type result; + string_type result{}; va_list argsVL; va_start(argsVL, pszFormat); auto hr = details::str_vprintf_nothrow(result, pszFormat, argsVL); @@ -1834,7 +1837,7 @@ namespace wil template string_type str_printf_failfast(_Printf_format_string_ PCWSTR pszFormat, ...) { - string_type result; + string_type result{}; va_list argsVL; va_start(argsVL, pszFormat); auto hr = details::str_vprintf_nothrow(result, pszFormat, argsVL); @@ -1842,6 +1845,7 @@ namespace wil FAIL_FAST_IF_FAILED(hr); return result; } +#endif // !defined(__WIL_MIN_KERNEL) && !defined(WIL_KERNEL_MODE) } // namespace wil #endif // __WIL_RESOURCE @@ -2810,7 +2814,7 @@ namespace wil return wait(); } - UINT64 startTime; + UINT64 startTime{}; QueryUnbiasedInterruptTime(&startTime); UINT64 elapsedTimeMilliseconds = 0; @@ -2832,7 +2836,7 @@ namespace wil UINT64 currTime; QueryUnbiasedInterruptTime(&currTime); - elapsedTimeMilliseconds = (currTime - startTime) / (10 * 1000); + elapsedTimeMilliseconds = (currTime - startTime) / static_cast(10 * 1000); } return true; @@ -4589,7 +4593,10 @@ namespace wil #if defined(__propidl_h__) && !defined(_WIL__propidl_h__) && !defined(WIL_KERNEL_MODE) #define _WIL__propidl_h__ + // if language extensions (/Za) disabled, PropVariantInit will not exist, PROPVARIANT has forward declaration only +#if defined(_MSC_EXTENSIONS) using unique_prop_variant = wil::unique_struct; +#endif #endif // _WIL__propidl_h__ #if defined(_OLEAUTO_H_) && !defined(__WIL_OLEAUTO_H_) && !defined(WIL_KERNEL_MODE) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM) @@ -6553,6 +6560,8 @@ namespace wil return{}; } +//! WDM version of EX_PUSH_LOCK is available starting with Windows 10 1809 +#if (NTDDI_VERSION >= NTDDI_WIN10_RS5) namespace details { _IRQL_requires_max_(APC_LEVEL) @@ -6629,6 +6638,7 @@ namespace wil private: EX_PUSH_LOCK m_pushLock; }; +#endif namespace details { diff --git a/src/windhawk/shared/libraries/wil/result.h b/src/windhawk/shared/libraries/wil/result.h index fd8c9f6..8d5f26c 100644 --- a/src/windhawk/shared/libraries/wil/result.h +++ b/src/windhawk/shared/libraries/wil/result.h @@ -385,7 +385,10 @@ namespace wil while (pNode != nullptr) { auto pCurrent = pNode; +#pragma warning(push) +#pragma warning(disable:6001) // https://github.com/microsoft/wil/issues/164 pNode = pNode->pNext; +#pragma warning(pop) pCurrent->~Node(); ::HeapFree(::GetProcessHeap(), 0, pCurrent); } @@ -677,8 +680,7 @@ namespace wil } // NOTE: FailureType::Log as it's only informative (no action) and SupportedExceptions::All as it's not a barrier, only recognition. - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; const HRESULT hr = details::ReportFailure_CaughtExceptionCommon(__R_DIAGNOSTICS_RA(source, returnAddress), message, ARRAYSIZE(message), SupportedExceptions::All).hr; // Now that the exception was logged, we should be able to fetch it. @@ -874,7 +876,7 @@ namespace wil class ThreadFailureCallbackHolder { public: - ThreadFailureCallbackHolder(_In_ IFailureCallback *pCallbackParam, _In_opt_ CallContextInfo *pCallContext = nullptr, bool watchNow = true) WI_NOEXCEPT : + ThreadFailureCallbackHolder(_In_opt_ IFailureCallback *pCallbackParam, _In_opt_ CallContextInfo *pCallContext = nullptr, bool watchNow = true) WI_NOEXCEPT : m_ppThreadList(nullptr), m_pCallback(pCallbackParam), m_pNext(nullptr), diff --git a/src/windhawk/shared/libraries/wil/result_macros.h b/src/windhawk/shared/libraries/wil/result_macros.h index 0030b25..566699f 100644 --- a/src/windhawk/shared/libraries/wil/result_macros.h +++ b/src/windhawk/shared/libraries/wil/result_macros.h @@ -802,6 +802,7 @@ WI_ODR_PRAGMA("WIL_FreeMemory", "0") #define THROW_IF_NULL_ALLOC(ptr) __R_FN(Throw_IfNullAlloc)(__R_INFO(#ptr) ptr) #define THROW_HR_IF(hr, condition) __R_FN(Throw_HrIf)(__R_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition)) #define THROW_HR_IF_NULL(hr, ptr) __R_FN(Throw_HrIfNull)(__R_INFO(#ptr) wil::verify_hresult(hr), ptr) +#define THROW_WIN32_IF(win32err, condition) __R_FN(Throw_Win32If)(__R_INFO(#condition) wil::verify_win32(win32err), wil::verify_bool(condition)) #define THROW_LAST_ERROR_IF(condition) __R_FN(Throw_GetLastErrorIf)(__R_INFO(#condition) wil::verify_bool(condition)) #define THROW_LAST_ERROR_IF_NULL(ptr) __R_FN(Throw_GetLastErrorIfNull)(__R_INFO(#ptr) ptr) #define THROW_IF_NTSTATUS_FAILED(status) __R_FN(Throw_IfNtStatusFailed)(__R_INFO(#status) status) @@ -820,6 +821,7 @@ WI_ODR_PRAGMA("WIL_FreeMemory", "0") #define THROW_IF_NULL_ALLOC_MSG(ptr, fmt, ...) __R_FN(Throw_IfNullAllocMsg)(__R_INFO(#ptr) ptr, fmt, ##__VA_ARGS__) #define THROW_HR_IF_MSG(hr, condition, fmt, ...) __R_FN(Throw_HrIfMsg)(__R_INFO(#condition) wil::verify_hresult(hr), wil::verify_bool(condition), fmt, ##__VA_ARGS__) #define THROW_HR_IF_NULL_MSG(hr, ptr, fmt, ...) __R_FN(Throw_HrIfNullMsg)(__R_INFO(#ptr) wil::verify_hresult(hr), ptr, fmt, ##__VA_ARGS__) +#define THROW_WIN32_IF_MSG(win32err, condition, fmt, ...) __R_FN(Throw_Win32IfMsg)(__R_INFO(#condition) wil::verify_win32(win32err), wil::verify_bool(condition), fmt, ##__VA_ARGS__) #define THROW_LAST_ERROR_IF_MSG(condition, fmt, ...) __R_FN(Throw_GetLastErrorIfMsg)(__R_INFO(#condition) wil::verify_bool(condition), fmt, ##__VA_ARGS__) #define THROW_LAST_ERROR_IF_NULL_MSG(ptr, fmt, ...) __R_FN(Throw_GetLastErrorIfNullMsg)(__R_INFO(#ptr) ptr, fmt, ##__VA_ARGS__) #define THROW_IF_NTSTATUS_FAILED_MSG(status, fmt, ...) __R_FN(Throw_IfNtStatusFailedMsg)(__R_INFO(#status) status, fmt, ##__VA_ARGS__) @@ -1128,8 +1130,7 @@ namespace wil break; } - wchar_t szErrorText[256]; - szErrorText[0] = L'\0'; + wchar_t szErrorText[256]{}; LONG errorCode = 0; if (WI_IsFlagSet(failure.flags, FailureFlags::NtStatus)) @@ -2118,7 +2119,7 @@ __WI_POP_WARNINGS _Must_inspect_result_ STRSAFEAPI StringCchLengthA(_In_reads_or_z_(cchMax) STRSAFE_PCNZCH psz, _In_ _In_range_(1, STRSAFE_MAX_CCH) size_t cchMax, _Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<= , _String_length_(psz)) size_t* pcchLength) { - HRESULT hr; + HRESULT hr = S_OK; if ((psz == nullptr) || (cchMax > STRSAFE_MAX_CCH)) { hr = STRSAFE_E_INVALID_PARAMETER; @@ -2145,76 +2146,6 @@ __WI_POP_WARNINGS return hr; } - static STRSAFEAPI WilStringVPrintfWorkerA(_Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest, _In_ _In_range_(1, STRSAFE_MAX_CCH) size_t cchDest, _Always_(_Out_opt_ _Deref_out_range_(<=, cchDest - 1)) size_t* pcchNewDestLength, _In_ _Printf_format_string_ STRSAFE_LPCSTR pszFormat, _In_ va_list argList) - { - HRESULT hr = S_OK; - int iRet; - - // leave the last space for the null terminator - size_t cchMax = cchDest - 1; - size_t cchNewDestLength = 0; -#undef STRSAFE_USE_SECURE_CRT -#define STRSAFE_USE_SECURE_CRT 1 - #if (STRSAFE_USE_SECURE_CRT == 1) && !defined(STRSAFE_LIB_IMPL) - iRet = _vsnprintf_s(pszDest, cchDest, cchMax, pszFormat, argList); - #else - #pragma warning(push) - #pragma warning(disable: __WARNING_BANNED_API_USAGE)// "STRSAFE not included" - iRet = _vsnprintf(pszDest, cchMax, pszFormat, argList); - #pragma warning(pop) - #endif - // ASSERT((iRet < 0) || (((size_t)iRet) <= cchMax)); - - if ((iRet < 0) || (((size_t)iRet) > cchMax)) - { - // need to null terminate the string - pszDest += cchMax; - *pszDest = '\0'; - - cchNewDestLength = cchMax; - - // we have truncated pszDest - hr = STRSAFE_E_INSUFFICIENT_BUFFER; - } - else if (((size_t)iRet) == cchMax) - { - // need to null terminate the string - pszDest += cchMax; - *pszDest = '\0'; - - cchNewDestLength = cchMax; - } - else - { - cchNewDestLength = (size_t)iRet; - } - - if (pcchNewDestLength) - { - *pcchNewDestLength = cchNewDestLength; - } - - return hr; - } - - __inline HRESULT StringCchPrintfA( _Out_writes_(cchDest) _Always_(_Post_z_) STRSAFE_LPSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ STRSAFE_LPCSTR pszFormat, ...) - { - HRESULT hr; - hr = wil::details::WilStringValidateDestA(pszDest, cchDest, STRSAFE_MAX_CCH); - if (SUCCEEDED(hr)) - { - va_list argList; - va_start(argList, pszFormat); - hr = wil::details::WilStringVPrintfWorkerA(pszDest, cchDest, nullptr, pszFormat, argList); - va_end(argList); - } - else if (cchDest > 0) - { - *pszDest = '\0'; - } - return hr; - } - _Ret_range_(sizeof(char), (psz == nullptr) ? sizeof(char) : (_String_length_(psz) + sizeof(char))) inline size_t ResultStringSize(_In_opt_ PCSTR psz) { return (psz == nullptr) ? sizeof(char) : (strlen(psz) + sizeof(char)); } @@ -2249,7 +2180,7 @@ __WI_POP_WARNINGS } memcpy_s(pStart, bufferSize, pszString, stringSize); - assign_to_opt_param(ppszBufferString, reinterpret_cast(pStart)); + assign_to_opt_param(ppszBufferString, reinterpret_cast(pStart));// lgtm[cpp/incorrect-string-type-conversion] False positive - The query is misinterpreting a buffer (char *) with a MBS string, the cast to TString is expected. return pStart + stringSize; } @@ -2643,9 +2574,14 @@ __WI_POP_WARNINGS wchar_t message[2048]; GetFailureLogString(message, ARRAYSIZE(message), m_failure.GetFailureInfo()); - char messageA[1024]; - wil::details::StringCchPrintfA(messageA, ARRAYSIZE(messageA), "%ws", message); - m_what.create(messageA, strlen(messageA) + sizeof(*messageA)); + int len = WideCharToMultiByte(CP_ACP, 0, message, -1, nullptr, 0, nullptr, nullptr); + if (!m_what.create(len)) + { + // Allocation failed, return placeholder string. + return "WIL Exception"; + } + + WideCharToMultiByte(CP_ACP, 0, message, -1, static_cast(m_what.get()), len, nullptr, nullptr); } return static_cast(m_what.get()); } @@ -2761,8 +2697,7 @@ __WI_POP_WARNINGS inline HRESULT ResultFromKnownException(const ResultException& exception, const DiagnosticsInfo& diagnostics, void* returnAddress) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); auto hr = exception.GetErrorCode(); wil::details::ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); @@ -2771,8 +2706,7 @@ __WI_POP_WARNINGS inline HRESULT ResultFromKnownException(const std::bad_alloc& exception, const DiagnosticsInfo& diagnostics, void* returnAddress) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); constexpr auto hr = E_OUTOFMEMORY; wil::details::ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); @@ -2781,8 +2715,7 @@ __WI_POP_WARNINGS inline HRESULT ResultFromKnownException(const std::exception& exception, const DiagnosticsInfo& diagnostics, void* returnAddress) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; MaybeGetExceptionString(exception, message, ARRAYSIZE(message)); constexpr auto hr = __HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION); ReportFailure_Base(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), ResultStatus::FromResult(hr), message); @@ -2793,8 +2726,7 @@ __WI_POP_WARNINGS { if (g_pfnResultFromCaughtException_CppWinRt) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; bool ignored; auto hr = g_pfnResultFromCaughtException_CppWinRt(message, ARRAYSIZE(message), &ignored); if (FAILED(hr)) @@ -4042,24 +3974,21 @@ __WI_SUPPRESS_4127_E template __declspec(noinline) inline HRESULT ReportFailure_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; return ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr; } template<> __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr); } template<> __declspec(noinline) inline RESULT_NORETURN HRESULT ReportFailure_CaughtException(__R_FN_PARAMS_FULL, SupportedExceptions supported) { - wchar_t message[2048]; - message[0] = L'\0'; + wchar_t message[2048]{}; RESULT_NORETURN_RESULT(ReportFailure_CaughtExceptionCommon(__R_FN_CALL_FULL, message, ARRAYSIZE(message), supported).hr); } @@ -5809,6 +5738,16 @@ __WI_SUPPRESS_4127_E } } + _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_) + __R_CONDITIONAL_METHOD(bool, Throw_Win32If)(__R_CONDITIONAL_FN_PARAMS DWORD err, bool condition) + { + if (condition) + { + __R_CALL_INTERNAL_METHOD(_Throw_Win32)(__R_CONDITIONAL_FN_CALL err); + } + return condition; + } + _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_) __R_CONDITIONAL_METHOD(bool, Throw_GetLastErrorIf)(__R_CONDITIONAL_FN_PARAMS bool condition) { @@ -6067,6 +6006,18 @@ __WI_SUPPRESS_4127_E } } + _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_) + __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_Win32IfMsg)(__R_CONDITIONAL_FN_PARAMS DWORD err, bool condition, _Printf_format_string_ PCSTR formatString, ...) + { + if (condition) + { + va_list argList; + va_start(argList, formatString); + __R_CALL_INTERNAL_NOINLINE_METHOD(_Throw_Win32Msg)(__R_CONDITIONAL_NOINLINE_FN_CALL err, formatString, argList); + } + return condition; + } + _Post_satisfies_(return == condition) _When_(condition, _Analysis_noreturn_) __R_CONDITIONAL_NOINLINE_METHOD(bool, Throw_GetLastErrorIfMsg)(__R_CONDITIONAL_FN_PARAMS bool condition, _Printf_format_string_ PCSTR formatString, ...) { diff --git a/src/windhawk/shared/libraries/wil/result_originate.h b/src/windhawk/shared/libraries/wil/result_originate.h index 2da74be..02badba 100644 --- a/src/windhawk/shared/libraries/wil/result_originate.h +++ b/src/windhawk/shared/libraries/wil/result_originate.h @@ -27,6 +27,7 @@ #include "result.h" #include // RestrictedErrorInfo uses BSTRs :( +#include #include "resource.h" #include "com.h" #include @@ -63,14 +64,14 @@ namespace wil wil::unique_hmodule errorModule; if (GetModuleHandleExW(0, L"api-ms-win-core-winrt-error-l1-1-1.dll", &errorModule)) { - auto pfn = reinterpret_cast(GetProcAddress(errorModule.get(), "RoOriginateError")); + auto pfn = reinterpret_cast(GetProcAddress(errorModule.get(), "RoOriginateErrorW")); if (pfn != nullptr) { - pfn(failure.hr, nullptr); + pfn(failure.hr, 0, failure.pszMessage); } } #else // DESKTOP | SYSTEM - ::RoOriginateError(failure.hr, nullptr); + ::RoOriginateErrorW(failure.hr, 0, failure.pszMessage); #endif // DESKTOP | SYSTEM } else if (restrictedErrorInformation) diff --git a/src/windhawk/shared/libraries/wil/token_helpers.h b/src/windhawk/shared/libraries/wil/token_helpers.h index 5a21e47..624f6ee 100644 --- a/src/windhawk/shared/libraries/wil/token_helpers.h +++ b/src/windhawk/shared/libraries/wil/token_helpers.h @@ -133,6 +133,7 @@ namespace wil #endif // WIL_ENABLE_EXCEPTIONS #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) + // Returns tokenHandle or the effective thread token if tokenHandle is null. // Note, this returns an token handle who's lifetime is managed independently // and it may be a pseudo token, don't free it! diff --git a/src/windhawk/shared/libraries/wil/win32_helpers.h b/src/windhawk/shared/libraries/wil/win32_helpers.h index 591b376..9eeb666 100644 --- a/src/windhawk/shared/libraries/wil/win32_helpers.h +++ b/src/windhawk/shared/libraries/wil/win32_helpers.h @@ -333,8 +333,7 @@ namespace wil { details::string_maker maker; - wchar_t value[stackBufferLength]; - value[0] = L'\0'; + wchar_t value[stackBufferLength]{}; size_t valueLengthNeededWithNull{}; // callback returns the number of characters needed including the null terminator. RETURN_IF_FAILED_EXPECTED(callback(value, ARRAYSIZE(value), &valueLengthNeededWithNull)); WI_ASSERT(valueLengthNeededWithNull > 0); @@ -422,7 +421,7 @@ namespace wil RETURN_LAST_ERROR_IF((success == FALSE) && (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)); // On success, return the amount used; on failure, try doubling - *valueLengthNeededWithNul = success ? (lengthToUse + 1) : (lengthToUse * 2); + *valueLengthNeededWithNul = success ? (static_cast(lengthToUse) + 1) : (static_cast(lengthToUse) * 2); return S_OK; }); } @@ -488,17 +487,17 @@ namespace wil { auto adapter = [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT { - DWORD copiedCount; - size_t valueUsedWithNul; - bool copyFailed; - bool copySucceededWithNoTruncation; + DWORD copiedCount{}; + size_t valueUsedWithNul{}; + bool copyFailed{}; + bool copySucceededWithNoTruncation{}; if (process != nullptr) { // GetModuleFileNameExW truncates and provides no error or other indication it has done so. // The only way to be sure it didn't truncate is if it didn't need the whole buffer. The // count copied to the buffer includes the nul-character as well. copiedCount = ::GetModuleFileNameExW(process, module, value, static_cast(valueLength)); - valueUsedWithNul = copiedCount + 1; + valueUsedWithNul = static_cast(copiedCount) + 1; copyFailed = (0 == copiedCount); copySucceededWithNoTruncation = !copyFailed && (copiedCount < valueLength - 1); } @@ -508,7 +507,7 @@ namespace wil // and set the last error to ERROR_INSUFFICIENT_BUFFER. The count returned does not include // the nul-character copiedCount = ::GetModuleFileNameW(module, value, static_cast(valueLength)); - valueUsedWithNul = copiedCount + 1; + valueUsedWithNul = static_cast(copiedCount) + 1; copyFailed = (0 == copiedCount); copySucceededWithNoTruncation = !copyFailed && (copiedCount < valueLength); } @@ -550,12 +549,30 @@ namespace wil }); } +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) + template + HRESULT GetWindowsDirectoryW(string_type& result) WI_NOEXCEPT + { + return wil::AdaptFixedSizeToAllocatedResult(result, + [&](_Out_writes_(valueLength) PWSTR value, size_t valueLength, _Out_ size_t* valueLengthNeededWithNul) -> HRESULT + { + *valueLengthNeededWithNul = ::GetWindowsDirectoryW(value, static_cast(valueLength)); + RETURN_LAST_ERROR_IF(*valueLengthNeededWithNul == 0); + if (*valueLengthNeededWithNul < valueLength) + { + (*valueLengthNeededWithNul)++; // it fit, account for the null + } + return S_OK; + }); + } +#endif + #ifdef WIL_ENABLE_EXCEPTIONS /** Expands the '%' quoted environment variables in 'input' using ExpandEnvironmentStringsW(); */ template string_type ExpandEnvironmentStringsW(_In_ PCWSTR input) { - string_type result; + string_type result{}; THROW_IF_FAILED((wil::ExpandEnvironmentStringsW(input, result))); return result; } @@ -565,7 +582,7 @@ namespace wil template string_type TrySearchPathW(_In_opt_ PCWSTR path, _In_ PCWSTR fileName, PCWSTR _In_opt_ extension) { - string_type result; + string_type result{}; HRESULT searchHR = wil::SearchPathW(path, fileName, extension, result); THROW_HR_IF(searchHR, FAILED(searchHR) && (searchHR != HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))); return result; @@ -576,7 +593,7 @@ namespace wil template string_type GetEnvironmentVariableW(_In_ PCWSTR key) { - string_type result; + string_type result{}; THROW_IF_FAILED((wil::GetEnvironmentVariableW(key, result))); return result; } @@ -585,7 +602,7 @@ namespace wil template string_type TryGetEnvironmentVariableW(_In_ PCWSTR key) { - string_type result; + string_type result{}; THROW_IF_FAILED((wil::TryGetEnvironmentVariableW(key, result))); return result; } @@ -593,7 +610,7 @@ namespace wil template string_type GetModuleFileNameW(HMODULE module = nullptr /* current process module */) { - string_type result; + string_type result{}; THROW_IF_FAILED((wil::GetModuleFileNameW(module, result))); return result; } @@ -601,11 +618,21 @@ namespace wil template string_type GetModuleFileNameExW(HANDLE process, HMODULE module) { - string_type result; + string_type result{}; THROW_IF_FAILED((wil::GetModuleFileNameExW(process, module, result))); return result; } +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) + template + string_type GetWindowsDirectoryW() + { + string_type result; + THROW_IF_FAILED((wil::GetWindowsDirectoryW(result))); + return result; + } +#endif + template string_type GetSystemDirectoryW() { @@ -617,7 +644,7 @@ namespace wil template string_type QueryFullProcessImageNameW(HANDLE processHandle = GetCurrentProcess(), DWORD flags = 0) { - string_type result; + string_type result{}; THROW_IF_FAILED((wil::QueryFullProcessImageNameW(processHandle, flags, result))); return result; } diff --git a/src/windhawk/shared/libraries/wil/winrt.h b/src/windhawk/shared/libraries/wil/winrt.h index abf5c99..3724989 100644 --- a/src/windhawk/shared/libraries/wil/winrt.h +++ b/src/windhawk/shared/libraries/wil/winrt.h @@ -163,12 +163,14 @@ namespace wil // on STL headers template static wistd::enable_if_t().c_str())>, - wistd::is_same().length())>>, + wistd::is_constructible, + wistd::is_convertible().data()), const wchar_t*>, + wistd::is_same().size())>>, const wchar_t*> get_buffer(const StringT& str, UINT32* length) WI_NOEXCEPT { - *length = static_cast(str.length()); - return str.c_str(); + *length = static_cast(str.size()); + const wchar_t* ret = str.data(); + return ret ? ret : L""; } template @@ -1779,7 +1781,7 @@ namespace details void OnCancel() override { } private: // needs to be MapToSmartType::type to hold non trial types - TResult m_result; + TResult m_result{}; }; extern const __declspec(selectany) wchar_t SyncAsyncActionName[] = L"SyncActionAction"; diff --git a/src/windhawk/shared/version.h b/src/windhawk/shared/version.h index 4153215..68dd0f5 100644 --- a/src/windhawk/shared/version.h +++ b/src/windhawk/shared/version.h @@ -2,8 +2,8 @@ // Version #define VERSION_MAJOR 1 -#define VERSION_MINOR 3 -#define VERSION_REVISION 1 +#define VERSION_MINOR 4 +#define VERSION_REVISION 0 #define VERSION_BUILD 0 // etc.